static INLINE void stage3(gost2012_hash_ctx * CTX)
{
- ALIGN(16) union uint512_u buf;
-
- memset(&buf, 0x00, sizeof buf);
- memcpy(&buf, &(CTX->buffer), CTX->bufsize);
- memcpy(&(CTX->buffer), &buf, sizeof(uint512_u));
+ pad(CTX);
+ g(&(CTX->h), &(CTX->N), &(CTX->buffer));
+ add512(&(CTX->Sigma), &CTX->buffer);
- memset(&buf, 0x00, sizeof buf);
+ memset(&(CTX->buffer.B[0]), 0, sizeof(uint512_u));
#ifndef __GOST3411_BIG_ENDIAN__
- buf.QWORD[0] = CTX->bufsize << 3;
+ CTX->buffer.QWORD[0] = CTX->bufsize << 3;
#else
- buf.QWORD[0] = BSWAP64(CTX->bufsize << 3);
+ CTX->buffer.QWORD[0] = BSWAP64(CTX->bufsize << 3);
#endif
-
- pad(CTX);
-
- g(&(CTX->h), &(CTX->N), &(CTX->buffer));
-
- add512(&(CTX->N), &buf);
- add512(&(CTX->Sigma), &CTX->buffer);
+ add512(&(CTX->N), &(CTX->buffer));
g(&(CTX->h), &buffer0, &(CTX->N));
-
g(&(CTX->h), &buffer0, &(CTX->Sigma));
}