| 235 | } |
| 236 | |
| 237 | static int blake2b_compress( blake2b_state *S, const uint8_t block[BLAKE2B_BLOCKBYTES] ) |
| 238 | { |
| 239 | uint64_t m[16]; |
| 240 | uint64_t v[16]; |
| 241 | size_t i; |
| 242 | |
| 243 | for( i = 0; i < 16; ++i ) |
| 244 | m[i] = load64( block + i * sizeof( m[i] ) ); |
| 245 | |
| 246 | for( i = 0; i < 8; ++i ) |
| 247 | v[i] = S->h[i]; |
| 248 | |
| 249 | v[ 8] = blake2b_IV[0]; |
| 250 | v[ 9] = blake2b_IV[1]; |
| 251 | v[10] = blake2b_IV[2]; |
| 252 | v[11] = blake2b_IV[3]; |
| 253 | v[12] = S->t[0] ^ blake2b_IV[4]; |
| 254 | v[13] = S->t[1] ^ blake2b_IV[5]; |
| 255 | v[14] = S->f[0] ^ blake2b_IV[6]; |
| 256 | v[15] = S->f[1] ^ blake2b_IV[7]; |
| 257 | #define G(r,i,a,b,c,d) \ |
| 258 | do { \ |
| 259 | a = a + b + m[blake2b_sigma[r][2*i+0]]; \ |
| 260 | d = rotr64(d ^ a, 32); \ |
| 261 | c = c + d; \ |
| 262 | b = rotr64(b ^ c, 24); \ |
| 263 | a = a + b + m[blake2b_sigma[r][2*i+1]]; \ |
| 264 | d = rotr64(d ^ a, 16); \ |
| 265 | c = c + d; \ |
| 266 | b = rotr64(b ^ c, 63); \ |
| 267 | } while(0) |
| 268 | #define ROUND(r) \ |
| 269 | do { \ |
| 270 | G(r,0,v[ 0],v[ 4],v[ 8],v[12]); \ |
| 271 | G(r,1,v[ 1],v[ 5],v[ 9],v[13]); \ |
| 272 | G(r,2,v[ 2],v[ 6],v[10],v[14]); \ |
| 273 | G(r,3,v[ 3],v[ 7],v[11],v[15]); \ |
| 274 | G(r,4,v[ 0],v[ 5],v[10],v[15]); \ |
| 275 | G(r,5,v[ 1],v[ 6],v[11],v[12]); \ |
| 276 | G(r,6,v[ 2],v[ 7],v[ 8],v[13]); \ |
| 277 | G(r,7,v[ 3],v[ 4],v[ 9],v[14]); \ |
| 278 | } while(0) |
| 279 | ROUND( 0 ); |
| 280 | ROUND( 1 ); |
| 281 | ROUND( 2 ); |
| 282 | ROUND( 3 ); |
| 283 | ROUND( 4 ); |
| 284 | ROUND( 5 ); |
| 285 | ROUND( 6 ); |
| 286 | ROUND( 7 ); |
| 287 | ROUND( 8 ); |
| 288 | ROUND( 9 ); |
| 289 | ROUND( 10 ); |
| 290 | ROUND( 11 ); |
| 291 | |
| 292 | for( i = 0; i < 8; ++i ) |
| 293 | S->h[i] = S->h[i] ^ v[i] ^ v[i + 8]; |
| 294 |
no test coverage detected