wolfcrypt polish: init, checks, corrections (#6249)

* wolfcrypt polish: init, checks, corrections
This commit is contained in:
gojimmypi 2023-04-18 18:41:42 +02:00 committed by GitHub
parent f7d7e4f30a
commit 98b718f91b
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
7 changed files with 67 additions and 12 deletions

View File

@ -2676,6 +2676,24 @@ static WARN_UNUSED_RESULT int wc_AesDecrypt(
return BAD_FUNC_ARG;
}
#if !defined(WOLFSSL_AES_128)
if (keylen == 16) {
return BAD_FUNC_ARG;
}
#endif
#if !defined(WOLFSSL_AES_192)
if (keylen == 24) {
return BAD_FUNC_ARG;
}
#endif
#if !defined(WOLFSSL_AES_256)
if (keylen == 32) {
return BAD_FUNC_ARG;
}
#endif
aes->keylen = keylen;
aes->rounds = keylen/4 + 6;

View File

@ -19063,7 +19063,7 @@ exit:
#endif
) {
ASNGetData dataASN[policyInfoASN_Length];
byte* data;
byte* data = NULL;
word32 length = 0;
/* Clear dynamic data and check OID is a cert policy type. */
@ -20186,7 +20186,7 @@ static int DecodeCertInternal(DecodedCert* cert, int verify, int* criticalExt,
/* Check parameters starting with a SEQUENCE. */
else if (dataASN[X509CERTASN_IDX_SIGALGO_PARAMS].tag != 0) {
word32 oid = dataASN[X509CERTASN_IDX_SIGALGO_OID].data.oid.sum;
word32 sigAlgParamsSz;
word32 sigAlgParamsSz = 0;
/* Parameters only with RSA PSS. */
if (oid != CTC_RSASSAPSS) {
@ -29291,9 +29291,9 @@ static int MakeCertReq(Cert* cert, byte* derBuffer, word32 derSz,
return ret;
#else
DECL_ASNSETDATA(dataASN, certReqBodyASN_Length);
word32 publicKeySz;
word32 publicKeySz = 0;
word32 subjectSz = 0;
word32 extSz;
word32 extSz = 0;
int sz = 0;
int ret = 0;
#if defined(WOLFSSL_CERT_EXT) || defined(OPENSSL_EXTRA)

View File

@ -216,6 +216,7 @@ int wc_CmacFinal(Cmac* cmac, byte* out, word32* outSz)
{
int ret;
const byte* subKey;
word32 remainder;
if (cmac == NULL || out == NULL || outSz == NULL) {
return BAD_FUNC_ARG;
@ -237,7 +238,11 @@ int wc_CmacFinal(Cmac* cmac, byte* out, word32* outSz)
subKey = cmac->k1;
}
else {
word32 remainder = AES_BLOCK_SIZE - cmac->bufferSz;
/* ensure we will have a valid remainder value */
if (cmac->bufferSz > AES_BLOCK_SIZE) {
return BAD_STATE_E;
}
remainder = AES_BLOCK_SIZE - cmac->bufferSz;
if (remainder == 0) {
remainder = AES_BLOCK_SIZE;
@ -245,6 +250,7 @@ int wc_CmacFinal(Cmac* cmac, byte* out, word32* outSz)
if (remainder > 1) {
XMEMSET(cmac->buffer + AES_BLOCK_SIZE - remainder, 0, remainder);
}
cmac->buffer[AES_BLOCK_SIZE - remainder] = 0x80;
subKey = cmac->k2;
}

View File

@ -53,17 +53,29 @@
#endif
#if defined(HAVE_ED25519_SIGN) || defined(HAVE_ED25519_VERIFY)
#define ED25519CTX_SIZE 32
/* Set a static message string for "Sig No Collisions Message SNC".
** Note this is a static string per spec, see:
** https://datatracker.ietf.org/doc/rfc8032/
*/
#define ED25519CTX_SNC_MESSAGE "SigEd25519 no Ed25519 collisions"
#define ED25519CTX_SIZE 32 /* 32 chars: fixed length of SNC Message. */
static const byte ed25519Ctx[ED25519CTX_SIZE+1] =
"SigEd25519 no Ed25519 collisions";
/* The 32 bytes of ED25519CTX_SIZE is used elsewhere, but we need one
** more char for saving the line ending in our ed25519Ctx[] here: */
static const byte ed25519Ctx[ED25519CTX_SIZE + 1] = ED25519CTX_SNC_MESSAGE;
#endif
static int ed25519_hash_init(ed25519_key* key, wc_Sha512 *sha)
{
int ret;
#ifndef WOLFSSL_ED25519_PERSISTENT_SHA
/* when not using persistent SHA, we'll zero the sha param */
XMEMSET(sha, 0, sizeof(wc_Sha512));
#endif
ret = wc_InitSha512_ex(sha, key->heap,
#if defined(WOLF_CRYPTO_CB)
key->devId
#else
@ -334,8 +346,9 @@ int wc_ed25519_sign_msg_ex(const byte* in, word32 inLen, byte* out,
#else
wc_Sha512 sha[1];
ret = ed25519_hash_init(key, sha);
if (ret < 0)
if (ret < 0) {
return ret;
}
#endif
if (type == Ed25519ctx || type == Ed25519ph) {
@ -386,6 +399,7 @@ int wc_ed25519_sign_msg_ex(const byte* in, word32 inLen, byte* out,
wc_Sha512 *sha = &key->sha;
#else
wc_Sha512 sha[1];
ret = ed25519_hash_init(key, sha);
if (ret < 0)
return ret;
@ -765,9 +779,10 @@ int wc_ed25519_verify_msg_ex(const byte* sig, word32 sigLen, const byte* msg,
sha = &key->sha;
#else
ret = ed25519_hash_init(key, sha);
if (ret < 0)
if (ret < 0) {
return ret;
#endif
}
#endif /* WOLFSSL_ED25519_PERSISTENT_SHA */
ret = ed25519_verify_msg_init_with_sha(sig, sigLen, key, sha, type, context,
contextLen);
@ -871,7 +886,9 @@ int wc_ed25519_init_ex(ed25519_key* key, void* heap, int devId)
if (key == NULL)
return BAD_FUNC_ARG;
/* for init, ensure the key is zeroed*/
XMEMSET(key, 0, sizeof(ed25519_key));
#ifdef WOLF_CRYPTO_CB
key->devId = devId;
#else

View File

@ -450,7 +450,12 @@ int wc_Md5Final(wc_Md5* md5, byte* hash)
}
#endif /* WOLFSSL_ASYNC_CRYPT */
local = (byte*)md5->buffer;
local = (byte*)md5->buffer; /* buffer allocated in word32 size */
/* ensure we have a valid buffer length; (-1 to append a byte to length) */
if (md5->buffLen > WC_MD5_BLOCK_SIZE - 1) {
return BUFFER_E;
}
local[md5->buffLen++] = 0x80; /* add 1 */

View File

@ -36,6 +36,9 @@ This library contains implementation for the random number generator.
http://h20293.www2.hp.com/portal/swdepot/displayProductInfo.do?productNumber=KRNG11I
*/
#if defined(ESP_IDF_VERSION_MAJOR) && ESP_IDF_VERSION_MAJOR >= 5
#include <esp_random.h>
#endif
#if defined(HAVE_FIPS) && \
defined(HAVE_FIPS_VERSION) && (HAVE_FIPS_VERSION >= 2)

View File

@ -324,6 +324,12 @@ int wc_RipeMdFinal(RipeMd* ripemd, byte* hash)
AddLength(ripemd, ripemd->buffLen); /* before adding pads */
/* ensure we have a valid buffer length; */
if (ripemd->buffLen > RIPEMD_BLOCK_SIZE) {
/* exit with error code if there's a bad buffer size in buffLen */
return BAD_STATE_E;
} /* buffLen check */
local[ripemd->buffLen++] = 0x80; /* add 1 */
/* pad with zeros */