| 228 | } |
| 229 | |
| 230 | static int blake2s_compress( blake2s_state *S, const uint8_t block[BLAKE2S_BLOCKBYTES] ) |
| 231 | { |
| 232 | uint32_t m[16]; |
| 233 | uint32_t v[16]; |
| 234 | |
| 235 | for( size_t i = 0; i < 16; ++i ) |
| 236 | m[i] = load32( block + i * sizeof( m[i] ) ); |
| 237 | |
| 238 | for( size_t i = 0; i < 8; ++i ) |
| 239 | v[i] = S->h[i]; |
| 240 | |
| 241 | v[ 8] = blake2s_IV[0]; |
| 242 | v[ 9] = blake2s_IV[1]; |
| 243 | v[10] = blake2s_IV[2]; |
| 244 | v[11] = blake2s_IV[3]; |
| 245 | v[12] = S->t[0] ^ blake2s_IV[4]; |
| 246 | v[13] = S->t[1] ^ blake2s_IV[5]; |
| 247 | v[14] = S->f[0] ^ blake2s_IV[6]; |
| 248 | v[15] = S->f[1] ^ blake2s_IV[7]; |
| 249 | #define G(r,i,a,b,c,d) \ |
| 250 | do { \ |
| 251 | a = a + b + m[blake2s_sigma[r][2*i+0]]; \ |
| 252 | d = rotr32(d ^ a, 16); \ |
| 253 | c = c + d; \ |
| 254 | b = rotr32(b ^ c, 12); \ |
| 255 | a = a + b + m[blake2s_sigma[r][2*i+1]]; \ |
| 256 | d = rotr32(d ^ a, 8); \ |
| 257 | c = c + d; \ |
| 258 | b = rotr32(b ^ c, 7); \ |
| 259 | } while(0) |
| 260 | #define ROUND(r) \ |
| 261 | do { \ |
| 262 | G(r,0,v[ 0],v[ 4],v[ 8],v[12]); \ |
| 263 | G(r,1,v[ 1],v[ 5],v[ 9],v[13]); \ |
| 264 | G(r,2,v[ 2],v[ 6],v[10],v[14]); \ |
| 265 | G(r,3,v[ 3],v[ 7],v[11],v[15]); \ |
| 266 | G(r,4,v[ 0],v[ 5],v[10],v[15]); \ |
| 267 | G(r,5,v[ 1],v[ 6],v[11],v[12]); \ |
| 268 | G(r,6,v[ 2],v[ 7],v[ 8],v[13]); \ |
| 269 | G(r,7,v[ 3],v[ 4],v[ 9],v[14]); \ |
| 270 | } while(0) |
| 271 | ROUND( 0 ); |
| 272 | ROUND( 1 ); |
| 273 | ROUND( 2 ); |
| 274 | ROUND( 3 ); |
| 275 | ROUND( 4 ); |
| 276 | ROUND( 5 ); |
| 277 | ROUND( 6 ); |
| 278 | ROUND( 7 ); |
| 279 | ROUND( 8 ); |
| 280 | ROUND( 9 ); |
| 281 | |
| 282 | for( size_t i = 0; i < 8; ++i ) |
| 283 | S->h[i] = S->h[i] ^ v[i] ^ v[i + 8]; |
| 284 | |
| 285 | #undef G |
| 286 | #undef ROUND |
| 287 | return 0; |
no test coverage detected