blake2{b,s}.c: return and propagate meaningful error codes.

This commit is contained in:
Daniel Pouzzner
2020-09-21 18:55:24 -05:00
parent fda22f851a
commit 38cb4a2d69
2 changed files with 73 additions and 36 deletions

View File

@@ -43,6 +43,7 @@
#include <wolfssl/wolfcrypt/blake2.h> #include <wolfssl/wolfcrypt/blake2.h>
#include <wolfssl/wolfcrypt/blake2-impl.h> #include <wolfssl/wolfcrypt/blake2-impl.h>
#include <wolfssl/wolfcrypt/error-crypt.h>
static const word64 blake2b_IV[8] = static const word64 blake2b_IV[8] =
@@ -124,7 +125,7 @@ int blake2b_init( blake2b_state *S, const byte outlen )
{ {
blake2b_param P[1]; blake2b_param P[1];
if ( ( !outlen ) || ( outlen > BLAKE2B_OUTBYTES ) ) return -1; if ( ( !outlen ) || ( outlen > BLAKE2B_OUTBYTES ) ) return BAD_FUNC_ARG;
#ifdef WOLFSSL_BLAKE2B_INIT_EACH_FIELD #ifdef WOLFSSL_BLAKE2B_INIT_EACH_FIELD
P->digest_length = outlen; P->digest_length = outlen;
@@ -153,9 +154,9 @@ int blake2b_init_key( blake2b_state *S, const byte outlen, const void *key,
{ {
blake2b_param P[1]; blake2b_param P[1];
if ( ( !outlen ) || ( outlen > BLAKE2B_OUTBYTES ) ) return -1; if ( ( !outlen ) || ( outlen > BLAKE2B_OUTBYTES ) ) return BAD_FUNC_ARG;
if ( !key || !keylen || keylen > BLAKE2B_KEYBYTES ) return -1; if ( !key || !keylen || keylen > BLAKE2B_KEYBYTES ) return BAD_FUNC_ARG;
#ifdef WOLFSSL_BLAKE2B_INIT_EACH_FIELD #ifdef WOLFSSL_BLAKE2B_INIT_EACH_FIELD
P->digest_length = outlen; P->digest_length = outlen;
@@ -177,7 +178,10 @@ int blake2b_init_key( blake2b_state *S, const byte outlen, const void *key,
P->depth = 1; P->depth = 1;
#endif #endif
if( blake2b_init_param( S, P ) < 0 ) return -1; {
int ret = blake2b_init_param( S, P );
if ( ret < 0 ) return ret;
}
{ {
#ifdef WOLFSSL_SMALL_STACK #ifdef WOLFSSL_SMALL_STACK
@@ -185,7 +189,7 @@ int blake2b_init_key( blake2b_state *S, const byte outlen, const void *key,
block = (byte*)XMALLOC(BLAKE2B_BLOCKBYTES, NULL, DYNAMIC_TYPE_TMP_BUFFER); block = (byte*)XMALLOC(BLAKE2B_BLOCKBYTES, NULL, DYNAMIC_TYPE_TMP_BUFFER);
if ( block == NULL ) return -1; if ( block == NULL ) return MEMORY_E;
#else #else
byte block[BLAKE2B_BLOCKBYTES]; byte block[BLAKE2B_BLOCKBYTES];
#endif #endif
@@ -214,14 +218,14 @@ static int blake2b_compress( blake2b_state *S,
m = (word64*)XMALLOC(sizeof(word64) * 16, NULL, DYNAMIC_TYPE_TMP_BUFFER); m = (word64*)XMALLOC(sizeof(word64) * 16, NULL, DYNAMIC_TYPE_TMP_BUFFER);
if ( m == NULL ) return -1; if ( m == NULL ) return MEMORY_E;
v = (word64*)XMALLOC(sizeof(word64) * 16, NULL, DYNAMIC_TYPE_TMP_BUFFER); v = (word64*)XMALLOC(sizeof(word64) * 16, NULL, DYNAMIC_TYPE_TMP_BUFFER);
if ( v == NULL ) if ( v == NULL )
{ {
XFREE(m, NULL, DYNAMIC_TYPE_TMP_BUFFER); XFREE(m, NULL, DYNAMIC_TYPE_TMP_BUFFER);
return -1; return MEMORY_E;
} }
#else #else
word64 m[16]; word64 m[16];
@@ -305,7 +309,10 @@ int blake2b_update( blake2b_state *S, const byte *in, word64 inlen )
S->buflen += fill; S->buflen += fill;
blake2b_increment_counter( S, BLAKE2B_BLOCKBYTES ); blake2b_increment_counter( S, BLAKE2B_BLOCKBYTES );
if ( blake2b_compress( S, S->buf ) < 0 ) return -1; /* Compress */ {
int ret = blake2b_compress( S, S->buf );
if (ret < 0) return ret;
}
XMEMCPY( S->buf, S->buf + BLAKE2B_BLOCKBYTES, BLAKE2B_BLOCKBYTES ); XMEMCPY( S->buf, S->buf + BLAKE2B_BLOCKBYTES, BLAKE2B_BLOCKBYTES );
/* Shift buffer left */ /* Shift buffer left */
@@ -334,7 +341,10 @@ int blake2b_final( blake2b_state *S, byte *out, byte outlen )
{ {
blake2b_increment_counter( S, BLAKE2B_BLOCKBYTES ); blake2b_increment_counter( S, BLAKE2B_BLOCKBYTES );
if ( blake2b_compress( S, S->buf ) < 0 ) return -1; {
int ret = blake2b_compress( S, S->buf );
if (ret < 0) return ret;
}
S->buflen -= BLAKE2B_BLOCKBYTES; S->buflen -= BLAKE2B_BLOCKBYTES;
XMEMCPY( S->buf, S->buf + BLAKE2B_BLOCKBYTES, (wolfssl_word)S->buflen ); XMEMCPY( S->buf, S->buf + BLAKE2B_BLOCKBYTES, (wolfssl_word)S->buflen );
@@ -344,7 +354,10 @@ int blake2b_final( blake2b_state *S, byte *out, byte outlen )
blake2b_set_lastblock( S ); blake2b_set_lastblock( S );
XMEMSET( S->buf + S->buflen, 0, (wolfssl_word)(2 * BLAKE2B_BLOCKBYTES - S->buflen) ); XMEMSET( S->buf + S->buflen, 0, (wolfssl_word)(2 * BLAKE2B_BLOCKBYTES - S->buflen) );
/* Padding */ /* Padding */
if ( blake2b_compress( S, S->buf ) < 0 ) return -1; {
int ret = blake2b_compress( S, S->buf );
if (ret < 0) return ret;
}
for( i = 0; i < 8; ++i ) /* Output full hash to temp buffer */ for( i = 0; i < 8; ++i ) /* Output full hash to temp buffer */
store64( buffer + sizeof( S->h[i] ) * i, S->h[i] ); store64( buffer + sizeof( S->h[i] ) * i, S->h[i] );
@@ -360,22 +373,27 @@ int blake2b( byte *out, const void *in, const void *key, const byte outlen,
blake2b_state S[1]; blake2b_state S[1];
/* Verify parameters */ /* Verify parameters */
if ( NULL == in ) return -1; if ( NULL == in ) return BAD_FUNC_ARG;
if ( NULL == out ) return -1; if ( NULL == out ) return BAD_FUNC_ARG;
if( NULL == key ) keylen = 0; if( NULL == key ) keylen = 0;
if( keylen > 0 ) if( keylen > 0 )
{ {
if( blake2b_init_key( S, outlen, key, keylen ) < 0 ) return -1; int ret = blake2b_init_key( S, outlen, key, keylen );
if (ret < 0) return ret;
} }
else else
{ {
if( blake2b_init( S, outlen ) < 0 ) return -1; int ret = blake2b_init( S, outlen );
if (ret < 0) return ret;
} }
if ( blake2b_update( S, ( byte * )in, inlen ) < 0) return -1; {
int ret = blake2b_update( S, ( byte * )in, inlen );
if (ret < 0) return ret;
}
return blake2b_final( S, out, outlen ); return blake2b_final( S, out, outlen );
} }
@@ -422,7 +440,7 @@ int main( int argc, char **argv )
int wc_InitBlake2b(Blake2b* b2b, word32 digestSz) int wc_InitBlake2b(Blake2b* b2b, word32 digestSz)
{ {
if (b2b == NULL){ if (b2b == NULL){
return -1; return BAD_FUNC_ARG;
} }
b2b->digestSz = digestSz; b2b->digestSz = digestSz;
@@ -433,12 +451,12 @@ int wc_InitBlake2b(Blake2b* b2b, word32 digestSz)
int wc_InitBlake2b_WithKey(Blake2b* b2b, word32 digestSz, const byte *key, word32 keylen) int wc_InitBlake2b_WithKey(Blake2b* b2b, word32 digestSz, const byte *key, word32 keylen)
{ {
if (b2b == NULL){ if (b2b == NULL){
return -1; return BAD_FUNC_ARG;
} }
b2b->digestSz = digestSz; b2b->digestSz = digestSz;
if (keylen >= 256) if (keylen >= 256)
return -1; return BAD_FUNC_ARG;
if (key) if (key)
return blake2b_init_key(b2b->S, (byte)digestSz, key, (byte)keylen); return blake2b_init_key(b2b->S, (byte)digestSz, key, (byte)keylen);

View File

@@ -43,6 +43,7 @@
#include <wolfssl/wolfcrypt/blake2.h> #include <wolfssl/wolfcrypt/blake2.h>
#include <wolfssl/wolfcrypt/blake2-impl.h> #include <wolfssl/wolfcrypt/blake2-impl.h>
#include <wolfssl/wolfcrypt/error-crypt.h>
static const word32 blake2s_IV[8] = static const word32 blake2s_IV[8] =
@@ -120,7 +121,7 @@ int blake2s_init( blake2s_state *S, const byte outlen )
{ {
blake2s_param P[1]; blake2s_param P[1];
if ( ( !outlen ) || ( outlen > BLAKE2S_OUTBYTES ) ) return -1; if ( ( !outlen ) || ( outlen > BLAKE2S_OUTBYTES ) ) return BAD_FUNC_ARG;
#ifdef WOLFSSL_BLAKE2S_INIT_EACH_FIELD #ifdef WOLFSSL_BLAKE2S_INIT_EACH_FIELD
P->digest_length = outlen; P->digest_length = outlen;
@@ -149,9 +150,9 @@ int blake2s_init_key( blake2s_state *S, const byte outlen, const void *key,
{ {
blake2s_param P[1]; blake2s_param P[1];
if ( ( !outlen ) || ( outlen > BLAKE2S_OUTBYTES ) ) return -1; if ( ( !outlen ) || ( outlen > BLAKE2S_OUTBYTES ) ) return BAD_FUNC_ARG;
if ( !key || !keylen || keylen > BLAKE2S_KEYBYTES ) return -1; if ( !key || !keylen || keylen > BLAKE2S_KEYBYTES ) return BAD_FUNC_ARG;
#ifdef WOLFSSL_BLAKE2S_INIT_EACH_FIELD #ifdef WOLFSSL_BLAKE2S_INIT_EACH_FIELD
P->digest_length = outlen; P->digest_length = outlen;
@@ -173,7 +174,11 @@ int blake2s_init_key( blake2s_state *S, const byte outlen, const void *key,
P->depth = 1; P->depth = 1;
#endif #endif
if( blake2s_init_param( S, P ) < 0 ) return -1; {
int ret = blake2s_init_param( S, P );
if (ret < 0)
return ret;
}
{ {
#ifdef WOLFSSL_SMALL_STACK #ifdef WOLFSSL_SMALL_STACK
@@ -181,7 +186,7 @@ int blake2s_init_key( blake2s_state *S, const byte outlen, const void *key,
block = (byte*)XMALLOC(BLAKE2S_BLOCKBYTES, NULL, DYNAMIC_TYPE_TMP_BUFFER); block = (byte*)XMALLOC(BLAKE2S_BLOCKBYTES, NULL, DYNAMIC_TYPE_TMP_BUFFER);
if ( block == NULL ) return -1; if ( block == NULL ) return MEMORY_E;
#else #else
byte block[BLAKE2S_BLOCKBYTES]; byte block[BLAKE2S_BLOCKBYTES];
#endif #endif
@@ -210,14 +215,14 @@ static int blake2s_compress( blake2s_state *S,
m = (word32*)XMALLOC(sizeof(word32) * 16, NULL, DYNAMIC_TYPE_TMP_BUFFER); m = (word32*)XMALLOC(sizeof(word32) * 16, NULL, DYNAMIC_TYPE_TMP_BUFFER);
if ( m == NULL ) return -1; if ( m == NULL ) return MEMORY_E;
v = (word32*)XMALLOC(sizeof(word32) * 16, NULL, DYNAMIC_TYPE_TMP_BUFFER); v = (word32*)XMALLOC(sizeof(word32) * 16, NULL, DYNAMIC_TYPE_TMP_BUFFER);
if ( v == NULL ) if ( v == NULL )
{ {
XFREE(m, NULL, DYNAMIC_TYPE_TMP_BUFFER); XFREE(m, NULL, DYNAMIC_TYPE_TMP_BUFFER);
return -1; return MEMORY_E;
} }
#else #else
word32 m[16]; word32 m[16];
@@ -299,7 +304,10 @@ int blake2s_update( blake2s_state *S, const byte *in, word32 inlen )
S->buflen += fill; S->buflen += fill;
blake2s_increment_counter( S, BLAKE2S_BLOCKBYTES ); blake2s_increment_counter( S, BLAKE2S_BLOCKBYTES );
if ( blake2s_compress( S, S->buf ) < 0 ) return -1; /* Compress */ {
int ret= blake2s_compress( S, S->buf );
if (ret < 0) return ret;
}
XMEMCPY( S->buf, S->buf + BLAKE2S_BLOCKBYTES, BLAKE2S_BLOCKBYTES ); XMEMCPY( S->buf, S->buf + BLAKE2S_BLOCKBYTES, BLAKE2S_BLOCKBYTES );
/* Shift buffer left */ /* Shift buffer left */
@@ -328,7 +336,10 @@ int blake2s_final( blake2s_state *S, byte *out, byte outlen )
{ {
blake2s_increment_counter( S, BLAKE2S_BLOCKBYTES ); blake2s_increment_counter( S, BLAKE2S_BLOCKBYTES );
if ( blake2s_compress( S, S->buf ) < 0 ) return -1; {
int ret = blake2s_compress( S, S->buf );
if (ret < 0) return ret;
}
S->buflen -= BLAKE2S_BLOCKBYTES; S->buflen -= BLAKE2S_BLOCKBYTES;
XMEMCPY( S->buf, S->buf + BLAKE2S_BLOCKBYTES, (wolfssl_word)S->buflen ); XMEMCPY( S->buf, S->buf + BLAKE2S_BLOCKBYTES, (wolfssl_word)S->buflen );
@@ -338,7 +349,10 @@ int blake2s_final( blake2s_state *S, byte *out, byte outlen )
blake2s_set_lastblock( S ); blake2s_set_lastblock( S );
XMEMSET( S->buf + S->buflen, 0, (wolfssl_word)(2 * BLAKE2S_BLOCKBYTES - S->buflen) ); XMEMSET( S->buf + S->buflen, 0, (wolfssl_word)(2 * BLAKE2S_BLOCKBYTES - S->buflen) );
/* Padding */ /* Padding */
if ( blake2s_compress( S, S->buf ) < 0 ) return -1; {
int ret = blake2s_compress( S, S->buf );
if (ret < 0) return ret;
}
for( i = 0; i < 8; ++i ) /* Output full hash to temp buffer */ for( i = 0; i < 8; ++i ) /* Output full hash to temp buffer */
store64( buffer + sizeof( S->h[i] ) * i, S->h[i] ); store64( buffer + sizeof( S->h[i] ) * i, S->h[i] );
@@ -354,22 +368,27 @@ int blake2s( byte *out, const void *in, const void *key, const byte outlen,
blake2s_state S[1]; blake2s_state S[1];
/* Verify parameters */ /* Verify parameters */
if ( NULL == in ) return -1; if ( NULL == in ) return BAD_FUNC_ARG;
if ( NULL == out ) return -1; if ( NULL == out ) return BAD_FUNC_ARG;
if( NULL == key ) keylen = 0; if( NULL == key ) keylen = 0;
if( keylen > 0 ) if( keylen > 0 )
{ {
if( blake2s_init_key( S, outlen, key, keylen ) < 0 ) return -1; int ret = blake2s_init_key( S, outlen, key, keylen );
if (ret < 0) return ret;
} }
else else
{ {
if( blake2s_init( S, outlen ) < 0 ) return -1; int ret = blake2s_init( S, outlen );
if (ret < 0) return ret;
} }
if ( blake2s_update( S, ( byte * )in, inlen ) < 0) return -1; {
int ret = blake2s_update( S, ( byte * )in, inlen );
if (ret < 0) return ret;
}
return blake2s_final( S, out, outlen ); return blake2s_final( S, out, outlen );
} }
@@ -416,7 +435,7 @@ int main( int argc, char **argv )
int wc_InitBlake2s(Blake2s* b2s, word32 digestSz) int wc_InitBlake2s(Blake2s* b2s, word32 digestSz)
{ {
if (b2s == NULL){ if (b2s == NULL){
return -1; return BAD_FUNC_ARG;
} }
b2s->digestSz = digestSz; b2s->digestSz = digestSz;
@@ -428,12 +447,12 @@ int wc_InitBlake2s(Blake2s* b2s, word32 digestSz)
int wc_InitBlake2s_WithKey(Blake2s* b2s, word32 digestSz, const byte *key, word32 keylen) int wc_InitBlake2s_WithKey(Blake2s* b2s, word32 digestSz, const byte *key, word32 keylen)
{ {
if (b2s == NULL){ if (b2s == NULL){
return -1; return BAD_FUNC_ARG;
} }
b2s->digestSz = digestSz; b2s->digestSz = digestSz;
if (keylen >= 256) if (keylen >= 256)
return -1; return BAD_FUNC_ARG;
if (key) if (key)
return blake2s_init_key(b2s->S, (byte)digestSz, key, (byte)keylen); return blake2s_init_key(b2s->S, (byte)digestSz, key, (byte)keylen);