forked from wolfSSL/wolfssl
blake2{b,s}.c: return and propagate meaningful error codes.
This commit is contained in:
@@ -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);
|
||||||
|
@@ -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);
|
||||||
|
Reference in New Issue
Block a user