| Absolute File Name: | /home/opencoverage/opencoverage/guest-scripts/coreutils/src/src/blake2/blake2b-ref.c |
| Source code | Switch to Preprocessed file |
| Line | Source | Count | ||||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 1 | /* | - | ||||||||||||||||||
| 2 | BLAKE2 reference source code package - reference C implementations | - | ||||||||||||||||||
| 3 | - | |||||||||||||||||||
| 4 | Copyright 2012, Samuel Neves <sneves@dei.uc.pt>. You may use this under the | - | ||||||||||||||||||
| 5 | terms of the CC0, the OpenSSL Licence, or the Apache Public License 2.0, at | - | ||||||||||||||||||
| 6 | your option. The terms of these licenses can be found at: | - | ||||||||||||||||||
| 7 | - | |||||||||||||||||||
| 8 | - CC0 1.0 Universal : https://creativecommons.org/publicdomain/zero/1.0 | - | ||||||||||||||||||
| 9 | - OpenSSL license : https://www.openssl.org/source/license.html | - | ||||||||||||||||||
| 10 | - Apache 2.0 : https://www.apache.org/licenses/LICENSE-2.0 | - | ||||||||||||||||||
| 11 | - | |||||||||||||||||||
| 12 | More information about the BLAKE2 hash function can be found at | - | ||||||||||||||||||
| 13 | https://blake2.net. | - | ||||||||||||||||||
| 14 | */ | - | ||||||||||||||||||
| 15 | - | |||||||||||||||||||
| 16 | #include <stdint.h> | - | ||||||||||||||||||
| 17 | #include <string.h> | - | ||||||||||||||||||
| 18 | #include <stdio.h> | - | ||||||||||||||||||
| 19 | - | |||||||||||||||||||
| 20 | #include "blake2.h" | - | ||||||||||||||||||
| 21 | #include "blake2-impl.h" | - | ||||||||||||||||||
| 22 | - | |||||||||||||||||||
| 23 | static const uint64_t blake2b_IV[8] = | - | ||||||||||||||||||
| 24 | { | - | ||||||||||||||||||
| 25 | 0x6a09e667f3bcc908ULL, 0xbb67ae8584caa73bULL, | - | ||||||||||||||||||
| 26 | 0x3c6ef372fe94f82bULL, 0xa54ff53a5f1d36f1ULL, | - | ||||||||||||||||||
| 27 | 0x510e527fade682d1ULL, 0x9b05688c2b3e6c1fULL, | - | ||||||||||||||||||
| 28 | 0x1f83d9abfb41bd6bULL, 0x5be0cd19137e2179ULL | - | ||||||||||||||||||
| 29 | }; | - | ||||||||||||||||||
| 30 | - | |||||||||||||||||||
| 31 | static const uint8_t blake2b_sigma[12][16] = | - | ||||||||||||||||||
| 32 | { | - | ||||||||||||||||||
| 33 | { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15 } , | - | ||||||||||||||||||
| 34 | { 14, 10, 4, 8, 9, 15, 13, 6, 1, 12, 0, 2, 11, 7, 5, 3 } , | - | ||||||||||||||||||
| 35 | { 11, 8, 12, 0, 5, 2, 15, 13, 10, 14, 3, 6, 7, 1, 9, 4 } , | - | ||||||||||||||||||
| 36 | { 7, 9, 3, 1, 13, 12, 11, 14, 2, 6, 5, 10, 4, 0, 15, 8 } , | - | ||||||||||||||||||
| 37 | { 9, 0, 5, 7, 2, 4, 10, 15, 14, 1, 11, 12, 6, 8, 3, 13 } , | - | ||||||||||||||||||
| 38 | { 2, 12, 6, 10, 0, 11, 8, 3, 4, 13, 7, 5, 15, 14, 1, 9 } , | - | ||||||||||||||||||
| 39 | { 12, 5, 1, 15, 14, 13, 4, 10, 0, 7, 6, 3, 9, 2, 8, 11 } , | - | ||||||||||||||||||
| 40 | { 13, 11, 7, 14, 12, 1, 3, 9, 5, 0, 15, 4, 8, 6, 2, 10 } , | - | ||||||||||||||||||
| 41 | { 6, 15, 14, 9, 11, 3, 0, 8, 12, 2, 13, 7, 1, 4, 10, 5 } , | - | ||||||||||||||||||
| 42 | { 10, 2, 8, 4, 7, 6, 1, 5, 15, 11, 9, 14, 3, 12, 13 , 0 } , | - | ||||||||||||||||||
| 43 | { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15 } , | - | ||||||||||||||||||
| 44 | { 14, 10, 4, 8, 9, 15, 13, 6, 1, 12, 0, 2, 11, 7, 5, 3 } | - | ||||||||||||||||||
| 45 | }; | - | ||||||||||||||||||
| 46 | - | |||||||||||||||||||
| 47 | - | |||||||||||||||||||
| 48 | static void blake2b_set_lastnode( blake2b_state *S ) | - | ||||||||||||||||||
| 49 | { | - | ||||||||||||||||||
| 50 | S->f[1] = (uint64_t)-1; | - | ||||||||||||||||||
| 51 | } never executed: end of block | 0 | ||||||||||||||||||
| 52 | - | |||||||||||||||||||
| 53 | /* Some helper functions, not necessarily useful */ | - | ||||||||||||||||||
| 54 | static int blake2b_is_lastblock( const blake2b_state *S ) | - | ||||||||||||||||||
| 55 | { | - | ||||||||||||||||||
| 56 | return S->f[0] != 0; executed 38 times by 1 test: return S->f[0] != 0;Executed by:
| 38 | ||||||||||||||||||
| 57 | } | - | ||||||||||||||||||
| 58 | - | |||||||||||||||||||
| 59 | static void blake2b_set_lastblock( blake2b_state *S ) | - | ||||||||||||||||||
| 60 | { | - | ||||||||||||||||||
| 61 | if( S->last_node ) blake2b_set_lastnode( S ); never executed: blake2b_set_lastnode( S );
| 0-38 | ||||||||||||||||||
| 62 | - | |||||||||||||||||||
| 63 | S->f[0] = (uint64_t)-1; | - | ||||||||||||||||||
| 64 | } executed 38 times by 1 test: end of blockExecuted by:
| 38 | ||||||||||||||||||
| 65 | - | |||||||||||||||||||
| 66 | static void blake2b_increment_counter( blake2b_state *S, const uint64_t inc ) | - | ||||||||||||||||||
| 67 | { | - | ||||||||||||||||||
| 68 | S->t[0] += inc; | - | ||||||||||||||||||
| 69 | S->t[1] += ( S->t[0] < inc ); | - | ||||||||||||||||||
| 70 | } executed 39 times by 1 test: end of blockExecuted by:
| 39 | ||||||||||||||||||
| 71 | - | |||||||||||||||||||
| 72 | static void blake2b_init0( blake2b_state *S ) | - | ||||||||||||||||||
| 73 | { | - | ||||||||||||||||||
| 74 | size_t i; | - | ||||||||||||||||||
| 75 | memset( S, 0, sizeof( blake2b_state ) ); | - | ||||||||||||||||||
| 76 | - | |||||||||||||||||||
| 77 | for( i = 0; i < 8; ++i ) S->h[i] = blake2b_IV[i]; executed 304 times by 1 test: S->h[i] = blake2b_IV[i];Executed by:
| 38-304 | ||||||||||||||||||
| 78 | } executed 38 times by 1 test: end of blockExecuted by:
| 38 | ||||||||||||||||||
| 79 | - | |||||||||||||||||||
| 80 | /* init xors IV with input parameter block */ | - | ||||||||||||||||||
| 81 | int blake2b_init_param( blake2b_state *S, const blake2b_param *P ) | - | ||||||||||||||||||
| 82 | { | - | ||||||||||||||||||
| 83 | const uint8_t *p = ( const uint8_t * )( P ); | - | ||||||||||||||||||
| 84 | size_t i; | - | ||||||||||||||||||
| 85 | - | |||||||||||||||||||
| 86 | blake2b_init0( S ); | - | ||||||||||||||||||
| 87 | - | |||||||||||||||||||
| 88 | /* IV XOR ParamBlock */ | - | ||||||||||||||||||
| 89 | for( i = 0; i < 8; ++i )
| 38-304 | ||||||||||||||||||
| 90 | S->h[i] ^= load64( p + sizeof( S->h[i] ) * i ); executed 304 times by 1 test: S->h[i] ^= load64( p + sizeof( S->h[i] ) * i );Executed by:
| 304 | ||||||||||||||||||
| 91 | - | |||||||||||||||||||
| 92 | S->outlen = P->digest_length; | - | ||||||||||||||||||
| 93 | return 0; executed 38 times by 1 test: return 0;Executed by:
| 38 | ||||||||||||||||||
| 94 | } | - | ||||||||||||||||||
| 95 | - | |||||||||||||||||||
| 96 | - | |||||||||||||||||||
| 97 | - | |||||||||||||||||||
| 98 | int blake2b_init( blake2b_state *S, size_t outlen ) | - | ||||||||||||||||||
| 99 | { | - | ||||||||||||||||||
| 100 | blake2b_param P[1]; | - | ||||||||||||||||||
| 101 | - | |||||||||||||||||||
| 102 | if ( ( !outlen ) || ( outlen > BLAKE2B_OUTBYTES ) ) return -1; never executed: return -1;
| 0-38 | ||||||||||||||||||
| 103 | - | |||||||||||||||||||
| 104 | P->digest_length = (uint8_t)outlen; | - | ||||||||||||||||||
| 105 | P->key_length = 0; | - | ||||||||||||||||||
| 106 | P->fanout = 1; | - | ||||||||||||||||||
| 107 | P->depth = 1; | - | ||||||||||||||||||
| 108 | store32( &P->leaf_length, 0 ); | - | ||||||||||||||||||
| 109 | store32( &P->node_offset, 0 ); | - | ||||||||||||||||||
| 110 | store32( &P->xof_length, 0 ); | - | ||||||||||||||||||
| 111 | P->node_depth = 0; | - | ||||||||||||||||||
| 112 | P->inner_length = 0; | - | ||||||||||||||||||
| 113 | memset( P->reserved, 0, sizeof( P->reserved ) ); | - | ||||||||||||||||||
| 114 | memset( P->salt, 0, sizeof( P->salt ) ); | - | ||||||||||||||||||
| 115 | memset( P->personal, 0, sizeof( P->personal ) ); | - | ||||||||||||||||||
| 116 | return blake2b_init_param( S, P ); executed 38 times by 1 test: return blake2b_init_param( S, P );Executed by:
| 38 | ||||||||||||||||||
| 117 | } | - | ||||||||||||||||||
| 118 | - | |||||||||||||||||||
| 119 | - | |||||||||||||||||||
| 120 | int blake2b_init_key( blake2b_state *S, size_t outlen, const void *key, size_t keylen ) | - | ||||||||||||||||||
| 121 | { | - | ||||||||||||||||||
| 122 | blake2b_param P[1]; | - | ||||||||||||||||||
| 123 | - | |||||||||||||||||||
| 124 | if ( ( !outlen ) || ( outlen > BLAKE2B_OUTBYTES ) ) return -1; never executed: return -1;
| 0 | ||||||||||||||||||
| 125 | - | |||||||||||||||||||
| 126 | if ( !key || !keylen || keylen > BLAKE2B_KEYBYTES ) return -1; never executed: return -1;
| 0 | ||||||||||||||||||
| 127 | - | |||||||||||||||||||
| 128 | P->digest_length = (uint8_t)outlen; | - | ||||||||||||||||||
| 129 | P->key_length = (uint8_t)keylen; | - | ||||||||||||||||||
| 130 | P->fanout = 1; | - | ||||||||||||||||||
| 131 | P->depth = 1; | - | ||||||||||||||||||
| 132 | store32( &P->leaf_length, 0 ); | - | ||||||||||||||||||
| 133 | store32( &P->node_offset, 0 ); | - | ||||||||||||||||||
| 134 | store32( &P->xof_length, 0 ); | - | ||||||||||||||||||
| 135 | P->node_depth = 0; | - | ||||||||||||||||||
| 136 | P->inner_length = 0; | - | ||||||||||||||||||
| 137 | memset( P->reserved, 0, sizeof( P->reserved ) ); | - | ||||||||||||||||||
| 138 | memset( P->salt, 0, sizeof( P->salt ) ); | - | ||||||||||||||||||
| 139 | memset( P->personal, 0, sizeof( P->personal ) ); | - | ||||||||||||||||||
| 140 | - | |||||||||||||||||||
| 141 | if( blake2b_init_param( S, P ) < 0 ) return -1; never executed: return -1;
| 0 | ||||||||||||||||||
| 142 | - | |||||||||||||||||||
| 143 | { | - | ||||||||||||||||||
| 144 | uint8_t block[BLAKE2B_BLOCKBYTES]; | - | ||||||||||||||||||
| 145 | memset( block, 0, BLAKE2B_BLOCKBYTES ); | - | ||||||||||||||||||
| 146 | memcpy( block, key, keylen ); | - | ||||||||||||||||||
| 147 | blake2b_update( S, block, BLAKE2B_BLOCKBYTES ); | - | ||||||||||||||||||
| 148 | secure_zero_memory( block, BLAKE2B_BLOCKBYTES ); /* Burn the key from stack */ | - | ||||||||||||||||||
| 149 | } | - | ||||||||||||||||||
| 150 | return 0; never executed: return 0; | 0 | ||||||||||||||||||
| 151 | } | - | ||||||||||||||||||
| 152 | - | |||||||||||||||||||
| 153 | #define G(r,i,a,b,c,d) \ | - | ||||||||||||||||||
| 154 | do { \ | - | ||||||||||||||||||
| 155 | a = a + b + m[blake2b_sigma[r][2*i+0]]; \ | - | ||||||||||||||||||
| 156 | d = rotr64(d ^ a, 32); \ | - | ||||||||||||||||||
| 157 | c = c + d; \ | - | ||||||||||||||||||
| 158 | b = rotr64(b ^ c, 24); \ | - | ||||||||||||||||||
| 159 | a = a + b + m[blake2b_sigma[r][2*i+1]]; \ | - | ||||||||||||||||||
| 160 | d = rotr64(d ^ a, 16); \ | - | ||||||||||||||||||
| 161 | c = c + d; \ | - | ||||||||||||||||||
| 162 | b = rotr64(b ^ c, 63); \ | - | ||||||||||||||||||
| 163 | } while(0) | - | ||||||||||||||||||
| 164 | - | |||||||||||||||||||
| 165 | #define ROUND(r) \ | - | ||||||||||||||||||
| 166 | do { \ | - | ||||||||||||||||||
| 167 | G(r,0,v[ 0],v[ 4],v[ 8],v[12]); \ | - | ||||||||||||||||||
| 168 | G(r,1,v[ 1],v[ 5],v[ 9],v[13]); \ | - | ||||||||||||||||||
| 169 | G(r,2,v[ 2],v[ 6],v[10],v[14]); \ | - | ||||||||||||||||||
| 170 | G(r,3,v[ 3],v[ 7],v[11],v[15]); \ | - | ||||||||||||||||||
| 171 | G(r,4,v[ 0],v[ 5],v[10],v[15]); \ | - | ||||||||||||||||||
| 172 | G(r,5,v[ 1],v[ 6],v[11],v[12]); \ | - | ||||||||||||||||||
| 173 | G(r,6,v[ 2],v[ 7],v[ 8],v[13]); \ | - | ||||||||||||||||||
| 174 | G(r,7,v[ 3],v[ 4],v[ 9],v[14]); \ | - | ||||||||||||||||||
| 175 | } while(0) | - | ||||||||||||||||||
| 176 | - | |||||||||||||||||||
| 177 | static void blake2b_compress( blake2b_state *S, const uint8_t block[BLAKE2B_BLOCKBYTES] ) | - | ||||||||||||||||||
| 178 | { | - | ||||||||||||||||||
| 179 | uint64_t m[16]; | - | ||||||||||||||||||
| 180 | uint64_t v[16]; | - | ||||||||||||||||||
| 181 | size_t i; | - | ||||||||||||||||||
| 182 | - | |||||||||||||||||||
| 183 | for( i = 0; i < 16; ++i ) {
| 39-624 | ||||||||||||||||||
| 184 | m[i] = load64( block + i * sizeof( m[i] ) ); | - | ||||||||||||||||||
| 185 | } executed 624 times by 1 test: end of blockExecuted by:
| 624 | ||||||||||||||||||
| 186 | - | |||||||||||||||||||
| 187 | for( i = 0; i < 8; ++i ) {
| 39-312 | ||||||||||||||||||
| 188 | v[i] = S->h[i]; | - | ||||||||||||||||||
| 189 | } executed 312 times by 1 test: end of blockExecuted by:
| 312 | ||||||||||||||||||
| 190 | - | |||||||||||||||||||
| 191 | v[ 8] = blake2b_IV[0]; | - | ||||||||||||||||||
| 192 | v[ 9] = blake2b_IV[1]; | - | ||||||||||||||||||
| 193 | v[10] = blake2b_IV[2]; | - | ||||||||||||||||||
| 194 | v[11] = blake2b_IV[3]; | - | ||||||||||||||||||
| 195 | v[12] = blake2b_IV[4] ^ S->t[0]; | - | ||||||||||||||||||
| 196 | v[13] = blake2b_IV[5] ^ S->t[1]; | - | ||||||||||||||||||
| 197 | v[14] = blake2b_IV[6] ^ S->f[0]; | - | ||||||||||||||||||
| 198 | v[15] = blake2b_IV[7] ^ S->f[1]; | - | ||||||||||||||||||
| 199 | - | |||||||||||||||||||
| 200 | ROUND( 0 ); | - | ||||||||||||||||||
| 201 | ROUND( 1 ); | - | ||||||||||||||||||
| 202 | ROUND( 2 ); | - | ||||||||||||||||||
| 203 | ROUND( 3 ); | - | ||||||||||||||||||
| 204 | ROUND( 4 ); | - | ||||||||||||||||||
| 205 | ROUND( 5 ); | - | ||||||||||||||||||
| 206 | ROUND( 6 ); | - | ||||||||||||||||||
| 207 | ROUND( 7 ); | - | ||||||||||||||||||
| 208 | ROUND( 8 ); | - | ||||||||||||||||||
| 209 | ROUND( 9 ); | - | ||||||||||||||||||
| 210 | ROUND( 10 ); | - | ||||||||||||||||||
| 211 | ROUND( 11 ); | - | ||||||||||||||||||
| 212 | - | |||||||||||||||||||
| 213 | for( i = 0; i < 8; ++i ) {
| 39-312 | ||||||||||||||||||
| 214 | S->h[i] = S->h[i] ^ v[i] ^ v[i + 8]; | - | ||||||||||||||||||
| 215 | } executed 312 times by 1 test: end of blockExecuted by:
| 312 | ||||||||||||||||||
| 216 | } executed 39 times by 1 test: end of blockExecuted by:
| 39 | ||||||||||||||||||
| 217 | - | |||||||||||||||||||
| 218 | #undef G | - | ||||||||||||||||||
| 219 | #undef ROUND | - | ||||||||||||||||||
| 220 | - | |||||||||||||||||||
| 221 | int blake2b_update( blake2b_state *S, const void *pin, size_t inlen ) | - | ||||||||||||||||||
| 222 | { | - | ||||||||||||||||||
| 223 | const unsigned char * in = (const unsigned char *)pin; | - | ||||||||||||||||||
| 224 | if( inlen > 0 )
| 0-32 | ||||||||||||||||||
| 225 | { | - | ||||||||||||||||||
| 226 | size_t left = S->buflen; | - | ||||||||||||||||||
| 227 | size_t fill = BLAKE2B_BLOCKBYTES - left; | - | ||||||||||||||||||
| 228 | if( inlen > fill )
| 1-31 | ||||||||||||||||||
| 229 | { | - | ||||||||||||||||||
| 230 | S->buflen = 0; | - | ||||||||||||||||||
| 231 | memcpy( S->buf + left, in, fill ); /* Fill buffer */ | - | ||||||||||||||||||
| 232 | blake2b_increment_counter( S, BLAKE2B_BLOCKBYTES ); | - | ||||||||||||||||||
| 233 | blake2b_compress( S, S->buf ); /* Compress */ | - | ||||||||||||||||||
| 234 | in += fill; inlen -= fill; | - | ||||||||||||||||||
| 235 | while(inlen > BLAKE2B_BLOCKBYTES) {
| 0-1 | ||||||||||||||||||
| 236 | blake2b_increment_counter(S, BLAKE2B_BLOCKBYTES); | - | ||||||||||||||||||
| 237 | blake2b_compress( S, in ); | - | ||||||||||||||||||
| 238 | in += BLAKE2B_BLOCKBYTES; | - | ||||||||||||||||||
| 239 | inlen -= BLAKE2B_BLOCKBYTES; | - | ||||||||||||||||||
| 240 | } never executed: end of block | 0 | ||||||||||||||||||
| 241 | } executed 1 time by 1 test: end of blockExecuted by:
| 1 | ||||||||||||||||||
| 242 | memcpy( S->buf + S->buflen, in, inlen ); | - | ||||||||||||||||||
| 243 | S->buflen += inlen; | - | ||||||||||||||||||
| 244 | } executed 32 times by 1 test: end of blockExecuted by:
| 32 | ||||||||||||||||||
| 245 | return 0; executed 32 times by 1 test: return 0;Executed by:
| 32 | ||||||||||||||||||
| 246 | } | - | ||||||||||||||||||
| 247 | - | |||||||||||||||||||
| 248 | int blake2b_final( blake2b_state *S, void *out, size_t outlen ) | - | ||||||||||||||||||
| 249 | { | - | ||||||||||||||||||
| 250 | uint8_t buffer[BLAKE2B_OUTBYTES] = {0}; | - | ||||||||||||||||||
| 251 | size_t i; | - | ||||||||||||||||||
| 252 | - | |||||||||||||||||||
| 253 | if( out == NULL || outlen < S->outlen )
| 0-38 | ||||||||||||||||||
| 254 | return -1; never executed: return -1; | 0 | ||||||||||||||||||
| 255 | - | |||||||||||||||||||
| 256 | if( blake2b_is_lastblock( S ) )
| 0-38 | ||||||||||||||||||
| 257 | return -1; never executed: return -1; | 0 | ||||||||||||||||||
| 258 | - | |||||||||||||||||||
| 259 | blake2b_increment_counter( S, S->buflen ); | - | ||||||||||||||||||
| 260 | blake2b_set_lastblock( S ); | - | ||||||||||||||||||
| 261 | memset( S->buf + S->buflen, 0, BLAKE2B_BLOCKBYTES - S->buflen ); /* Padding */ | - | ||||||||||||||||||
| 262 | blake2b_compress( S, S->buf ); | - | ||||||||||||||||||
| 263 | - | |||||||||||||||||||
| 264 | for( i = 0; i < 8; ++i ) /* Output full hash to temp buffer */
| 38-304 | ||||||||||||||||||
| 265 | store64( buffer + sizeof( S->h[i] ) * i, S->h[i] ); executed 304 times by 1 test: store64( buffer + sizeof( S->h[i] ) * i, S->h[i] );Executed by:
| 304 | ||||||||||||||||||
| 266 | - | |||||||||||||||||||
| 267 | memcpy( out, buffer, S->outlen ); | - | ||||||||||||||||||
| 268 | secure_zero_memory(buffer, sizeof(buffer)); | - | ||||||||||||||||||
| 269 | return 0; executed 38 times by 1 test: return 0;Executed by:
| 38 | ||||||||||||||||||
| 270 | } | - | ||||||||||||||||||
| 271 | - | |||||||||||||||||||
| 272 | /* inlen, at least, should be uint64_t. Others can be size_t. */ | - | ||||||||||||||||||
| 273 | int blake2b( void *out, size_t outlen, const void *in, size_t inlen, const void *key, size_t keylen ) | - | ||||||||||||||||||
| 274 | { | - | ||||||||||||||||||
| 275 | blake2b_state S[1]; | - | ||||||||||||||||||
| 276 | - | |||||||||||||||||||
| 277 | /* Verify parameters */ | - | ||||||||||||||||||
| 278 | if ( NULL == in && inlen > 0 ) return -1; never executed: return -1;
| 0 | ||||||||||||||||||
| 279 | - | |||||||||||||||||||
| 280 | if ( NULL == out ) return -1; never executed: return -1;
| 0 | ||||||||||||||||||
| 281 | - | |||||||||||||||||||
| 282 | if( NULL == key && keylen > 0 ) return -1; never executed: return -1;
| 0 | ||||||||||||||||||
| 283 | - | |||||||||||||||||||
| 284 | if( !outlen || outlen > BLAKE2B_OUTBYTES ) return -1; never executed: return -1;
| 0 | ||||||||||||||||||
| 285 | - | |||||||||||||||||||
| 286 | if( keylen > BLAKE2B_KEYBYTES ) return -1; never executed: return -1;
| 0 | ||||||||||||||||||
| 287 | - | |||||||||||||||||||
| 288 | if( keylen > 0 )
| 0 | ||||||||||||||||||
| 289 | { | - | ||||||||||||||||||
| 290 | if( blake2b_init_key( S, outlen, key, keylen ) < 0 ) return -1; never executed: return -1;
| 0 | ||||||||||||||||||
| 291 | } never executed: end of block | 0 | ||||||||||||||||||
| 292 | else | - | ||||||||||||||||||
| 293 | { | - | ||||||||||||||||||
| 294 | if( blake2b_init( S, outlen ) < 0 ) return -1; never executed: return -1;
| 0 | ||||||||||||||||||
| 295 | } never executed: end of block | 0 | ||||||||||||||||||
| 296 | - | |||||||||||||||||||
| 297 | blake2b_update( S, ( const uint8_t * )in, inlen ); | - | ||||||||||||||||||
| 298 | blake2b_final( S, out, outlen ); | - | ||||||||||||||||||
| 299 | return 0; never executed: return 0; | 0 | ||||||||||||||||||
| 300 | } | - | ||||||||||||||||||
| 301 | - | |||||||||||||||||||
| 302 | int blake2( void *out, size_t outlen, const void *in, size_t inlen, const void *key, size_t keylen ) { | - | ||||||||||||||||||
| 303 | return blake2b(out, outlen, in, inlen, key, keylen); never executed: return blake2b(out, outlen, in, inlen, key, keylen); | 0 | ||||||||||||||||||
| 304 | } | - | ||||||||||||||||||
| 305 | - | |||||||||||||||||||
| 306 | #if defined(SUPERCOP) | - | ||||||||||||||||||
| 307 | int crypto_hash( unsigned char *out, unsigned char *in, unsigned long long inlen ) | - | ||||||||||||||||||
| 308 | { | - | ||||||||||||||||||
| 309 | return blake2b( out, BLAKE2B_OUTBYTES, in, inlen, NULL, 0 ); | - | ||||||||||||||||||
| 310 | } | - | ||||||||||||||||||
| 311 | #endif | - | ||||||||||||||||||
| 312 | - | |||||||||||||||||||
| 313 | #if defined(BLAKE2B_SELFTEST) | - | ||||||||||||||||||
| 314 | #include <string.h> | - | ||||||||||||||||||
| 315 | #include "blake2-kat.h" | - | ||||||||||||||||||
| 316 | int main( void ) | - | ||||||||||||||||||
| 317 | { | - | ||||||||||||||||||
| 318 | uint8_t key[BLAKE2B_KEYBYTES]; | - | ||||||||||||||||||
| 319 | uint8_t buf[BLAKE2_KAT_LENGTH]; | - | ||||||||||||||||||
| 320 | size_t i, step; | - | ||||||||||||||||||
| 321 | - | |||||||||||||||||||
| 322 | for( i = 0; i < BLAKE2B_KEYBYTES; ++i ) | - | ||||||||||||||||||
| 323 | key[i] = ( uint8_t )i; | - | ||||||||||||||||||
| 324 | - | |||||||||||||||||||
| 325 | for( i = 0; i < BLAKE2_KAT_LENGTH; ++i ) | - | ||||||||||||||||||
| 326 | buf[i] = ( uint8_t )i; | - | ||||||||||||||||||
| 327 | - | |||||||||||||||||||
| 328 | /* Test simple API */ | - | ||||||||||||||||||
| 329 | for( i = 0; i < BLAKE2_KAT_LENGTH; ++i ) | - | ||||||||||||||||||
| 330 | { | - | ||||||||||||||||||
| 331 | uint8_t hash[BLAKE2B_OUTBYTES]; | - | ||||||||||||||||||
| 332 | blake2b( hash, BLAKE2B_OUTBYTES, buf, i, key, BLAKE2B_KEYBYTES ); | - | ||||||||||||||||||
| 333 | - | |||||||||||||||||||
| 334 | if( 0 != memcmp( hash, blake2b_keyed_kat[i], BLAKE2B_OUTBYTES ) ) | - | ||||||||||||||||||
| 335 | { | - | ||||||||||||||||||
| 336 | goto fail; | - | ||||||||||||||||||
| 337 | } | - | ||||||||||||||||||
| 338 | } | - | ||||||||||||||||||
| 339 | - | |||||||||||||||||||
| 340 | /* Test streaming API */ | - | ||||||||||||||||||
| 341 | for(step = 1; step < BLAKE2B_BLOCKBYTES; ++step) { | - | ||||||||||||||||||
| 342 | for (i = 0; i < BLAKE2_KAT_LENGTH; ++i) { | - | ||||||||||||||||||
| 343 | uint8_t hash[BLAKE2B_OUTBYTES]; | - | ||||||||||||||||||
| 344 | blake2b_state S; | - | ||||||||||||||||||
| 345 | uint8_t * p = buf; | - | ||||||||||||||||||
| 346 | size_t mlen = i; | - | ||||||||||||||||||
| 347 | int err = 0; | - | ||||||||||||||||||
| 348 | - | |||||||||||||||||||
| 349 | if( (err = blake2b_init_key(&S, BLAKE2B_OUTBYTES, key, BLAKE2B_KEYBYTES)) < 0 ) { | - | ||||||||||||||||||
| 350 | goto fail; | - | ||||||||||||||||||
| 351 | } | - | ||||||||||||||||||
| 352 | - | |||||||||||||||||||
| 353 | while (mlen >= step) { | - | ||||||||||||||||||
| 354 | if ( (err = blake2b_update(&S, p, step)) < 0 ) { | - | ||||||||||||||||||
| 355 | goto fail; | - | ||||||||||||||||||
| 356 | } | - | ||||||||||||||||||
| 357 | mlen -= step; | - | ||||||||||||||||||
| 358 | p += step; | - | ||||||||||||||||||
| 359 | } | - | ||||||||||||||||||
| 360 | if ( (err = blake2b_update(&S, p, mlen)) < 0) { | - | ||||||||||||||||||
| 361 | goto fail; | - | ||||||||||||||||||
| 362 | } | - | ||||||||||||||||||
| 363 | if ( (err = blake2b_final(&S, hash, BLAKE2B_OUTBYTES)) < 0) { | - | ||||||||||||||||||
| 364 | goto fail; | - | ||||||||||||||||||
| 365 | } | - | ||||||||||||||||||
| 366 | - | |||||||||||||||||||
| 367 | if (0 != memcmp(hash, blake2b_keyed_kat[i], BLAKE2B_OUTBYTES)) { | - | ||||||||||||||||||
| 368 | goto fail; | - | ||||||||||||||||||
| 369 | } | - | ||||||||||||||||||
| 370 | } | - | ||||||||||||||||||
| 371 | } | - | ||||||||||||||||||
| 372 | - | |||||||||||||||||||
| 373 | puts( "ok" ); | - | ||||||||||||||||||
| 374 | return 0; | - | ||||||||||||||||||
| 375 | fail: | - | ||||||||||||||||||
| 376 | puts("error"); | - | ||||||||||||||||||
| 377 | return -1; | - | ||||||||||||||||||
| 378 | } | - | ||||||||||||||||||
| 379 | #endif | - | ||||||||||||||||||
| Source code | Switch to Preprocessed file |