cleanup, resins with updated reference source

This commit is contained in:
Kelvin Sherlock 2017-04-10 10:22:50 -04:00
parent afc6e8d370
commit 6acdfe9a55
2 changed files with 36 additions and 38 deletions

View File

@ -128,16 +128,18 @@ static const unsigned char blake2s_sigma[10][16] = {
static void blake2s_set_lastnode(hash_state *md) static void blake2s_set_lastnode(hash_state *md)
{ {
md->blake2s.f[1] = ~0U; md->blake2s.f[1] = 0xffffffffUL;
} }
/* Some helper functions, not necessarily useful */ /* Some helper functions, not necessarily useful */
static int blake2s_is_lastblock(const hash_state *md) { return md->blake2s.f[0] != 0; }
static void blake2s_set_lastblock(hash_state *md) static void blake2s_set_lastblock(hash_state *md)
{ {
if (md->blake2s.last_node) if (md->blake2s.last_node)
blake2s_set_lastnode(md); blake2s_set_lastnode(md);
md->blake2s.f[0] = ~0U; md->blake2s.f[0] = 0xffffffffUL;
} }
static void blake2s_increment_counter(hash_state *md, const ulong32 inc) static void blake2s_increment_counter(hash_state *md, const ulong32 inc)
@ -148,9 +150,10 @@ static void blake2s_increment_counter(hash_state *md, const ulong32 inc)
static int blake2s_init0(hash_state *md) static int blake2s_init0(hash_state *md)
{ {
int i;
XMEMSET(&md->blake2s, 0, sizeof(struct blake2s_state)); XMEMSET(&md->blake2s, 0, sizeof(struct blake2s_state));
for (int i = 0; i < 8; ++i) for (i = 0; i < 8; ++i)
md->blake2s.h[i] = blake2s_IV[i]; md->blake2s.h[i] = blake2s_IV[i];
return CRYPT_OK; return CRYPT_OK;
@ -160,14 +163,14 @@ static int blake2s_init0(hash_state *md)
static int blake2s_init_param(hash_state *md, const struct blake2s_param *P) static int blake2s_init_param(hash_state *md, const struct blake2s_param *P)
{ {
unsigned long i; unsigned long i;
ulong32 *p = (ulong32 *)(P); unsigned char *p = (unsigned char *)(P);
blake2s_init0(md); blake2s_init0(md);
/* IV XOR ParamBlock */ /* IV XOR ParamBlock */
for (i = 0; i < 8; ++i) { for (i = 0; i < 8; ++i) {
ulong32 tmp; ulong32 tmp;
LOAD32L(tmp, &p[i]); LOAD32L(tmp, p + i * 4);
md->blake2s.h[i] ^= tmp; md->blake2s.h[i] ^= tmp;
} }
@ -226,9 +229,9 @@ int blake2s_256_init(hash_state *md) { return blake2s_init(md, 32); }
} while (0) } while (0)
#ifdef LTC_CLEAN_STACK #ifdef LTC_CLEAN_STACK
static int _blake2s_compress(hash_state *md, unsigned char *buf) static int _blake2s_compress(hash_state *md, const unsigned char *buf)
#else #else
static int blake2s_compress(hash_state *md, unsigned char *buf) static int blake2s_compress(hash_state *md, const unsigned char *buf)
#endif #endif
{ {
unsigned long i; unsigned long i;
@ -275,7 +278,7 @@ static int blake2s_compress(hash_state *md, unsigned char *buf)
{ {
int err; int err;
err = _blake2s_compress(md, buf); err = _blake2s_compress(md, buf);
burn_stack(sizeof(ulong32) * 32); burn_stack(sizeof(ulong32) * (32 + 2));
return err; return err;
} }
#endif #endif
@ -289,34 +292,32 @@ int blake2s_process(hash_state *md, const unsigned char *in, unsigned long inlen
return CRYPT_INVALID_ARG; return CRYPT_INVALID_ARG;
} }
while (inlen > 0) { if (inlen > 0) {
ulong32 left = md->blake2s.curlen; unsigned long left = md->blake2s.curlen;
ulong32 fill = 2 * BLAKE2S_BLOCKBYTES - left; unsigned long fill = BLAKE2S_BLOCKBYTES - left;
if (inlen > fill) { if (inlen > fill) {
XMEMCPY(md->blake2s.buf + left, in, fill); md->blake2s.curlen = 0;
md->blake2s.curlen += fill; XMEMCPY(md->blake2s.buf + left, in, fill); /* Fill buffer */
blake2s_increment_counter(md, BLAKE2S_BLOCKBYTES); blake2s_increment_counter(md, BLAKE2S_BLOCKBYTES);
blake2s_compress(md, md->blake2s.buf); blake2s_compress(md, md->blake2s.buf); /* Compress */
XMEMCPY(md->blake2s.buf, md->blake2s.buf + BLAKE2S_BLOCKBYTES, BLAKE2S_BLOCKBYTES);
md->blake2s.curlen -= BLAKE2S_BLOCKBYTES;
in += fill; in += fill;
inlen -= fill; inlen -= fill;
} else /* inlen <= fill */ while (inlen > BLAKE2S_BLOCKBYTES) {
{ blake2s_increment_counter(md, BLAKE2S_BLOCKBYTES);
XMEMCPY(md->blake2s.buf + left, in, inlen); blake2s_compress(md, in);
md->blake2s.curlen += (ulong32)inlen; /* Be lazy, do not compress */ in += BLAKE2S_BLOCKBYTES;
in += inlen; inlen -= BLAKE2S_BLOCKBYTES;
inlen -= inlen;
} }
} }
XMEMCPY(md->blake2s.buf + md->blake2s.curlen, in, inlen);
md->blake2s.curlen += inlen;
}
return CRYPT_OK; return CRYPT_OK;
} }
int blake2s_done(hash_state *md, unsigned char *out) int blake2s_done(hash_state *md, unsigned char *out)
{ {
unsigned char buffer[BLAKE2S_OUTBYTES]; unsigned char buffer[BLAKE2S_OUTBYTES] = { 0 };
unsigned long i; unsigned long i;
LTC_ARGCHK(md != NULL); LTC_ARGCHK(md != NULL);
@ -324,23 +325,20 @@ int blake2s_done(hash_state *md, unsigned char *out)
/* if(md->blake2s.outlen != outlen) return CRYPT_INVALID_ARG; */ /* if(md->blake2s.outlen != outlen) return CRYPT_INVALID_ARG; */
if (md->blake2s.curlen > BLAKE2S_BLOCKBYTES) { if (blake2s_is_lastblock(md))
blake2s_increment_counter(md, BLAKE2S_BLOCKBYTES); return CRYPT_ERROR;
blake2s_compress(md, md->blake2s.buf);
md->blake2s.curlen -= BLAKE2S_BLOCKBYTES;
XMEMCPY(md->blake2s.buf, md->blake2s.buf + BLAKE2S_BLOCKBYTES, md->blake2s.curlen);
}
blake2s_increment_counter(md, (ulong32)md->blake2s.curlen); blake2s_increment_counter(md, md->blake2s.curlen);
blake2s_set_lastblock(md); blake2s_set_lastblock(md);
XMEMSET(md->blake2s.buf + md->blake2s.curlen, 0, 2 * BLAKE2S_BLOCKBYTES - md->blake2s.curlen); /* Padding */ XMEMSET(md->blake2s.buf + md->blake2s.curlen, 0, BLAKE2S_BLOCKBYTES - md->blake2s.curlen); /* Padding */
blake2s_compress(md, md->blake2s.buf); blake2s_compress(md, md->blake2s.buf);
for (i = 0; i < 8; ++i) /* Output full hash to temp buffer */ for (i = 0; i < 8; ++i) /* Output full hash to temp buffer */
STORE32L(md->blake2s.h[i], buffer + sizeof(md->blake2s.h[i]) * i); STORE32L(md->blake2s.h[i], buffer + i * 4);
XMEMCPY(out, buffer, md->blake2s.outlen); XMEMCPY(out, buffer, md->blake2s.outlen);
#ifdef LTC_CLEAN_STACK #ifdef LTC_CLEAN_STACK
zeromem(buffer, sizeof(buffer));
zeromem(md, sizeof(hash_state)); zeromem(md, sizeof(hash_state));
#endif #endif
return CRYPT_OK; return CRYPT_OK;

View File

@ -118,9 +118,9 @@ struct blake2s_state {
ulong32 h[8]; ulong32 h[8];
ulong32 t[2]; ulong32 t[2];
ulong32 f[2]; ulong32 f[2];
unsigned char buf[2 * 64]; unsigned char buf[64];
ulong32 curlen; unsigned long curlen;
unsigned char outlen; unsigned long outlen;
unsigned char last_node; unsigned char last_node;
}; };
#endif #endif