aboutsummaryrefslogtreecommitdiff
path: root/gosthash2012.c
diff options
context:
space:
mode:
authordmitry dulesov <dmitry.dulesov@gmail.com>2020-01-30 05:49:50 +0300
committerDmitry Belyavskiy <beldmit@users.noreply.github.com>2020-02-02 21:05:29 +0300
commit31138d02d9c3698c039154b3078c16f205e25902 (patch)
treebf08bc47a34b7ce92b4e813644f1e35aeaf2d765 /gosthash2012.c
parent9ff7d05ba8018b679c2b40e12b2ecfe51dc4127c (diff)
downloadgost-engine-31138d02d9c3698c039154b3078c16f205e25902.zip
gost-engine-31138d02d9c3698c039154b3078c16f205e25902.tar.gz
gost-engine-31138d02d9c3698c039154b3078c16f205e25902.tar.bz2
gosthash2012: Optimize out temporary `buf' from `stage3'
On-stack `buf' is replaced by manipulation directly on `CTX->buffer'. Committed-by: Vitaly Chikunov <vt@altlinux.org>
Diffstat (limited to 'gosthash2012.c')
-rw-r--r--gosthash2012.c23
1 files changed, 7 insertions, 16 deletions
diff --git a/gosthash2012.c b/gosthash2012.c
index b844ab3..ddd35fa 100644
--- a/gosthash2012.c
+++ b/gosthash2012.c
@@ -158,28 +158,19 @@ static INLINE void stage2(gost2012_hash_ctx * CTX, const union uint512_u *data)
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));
}