diff --git a/wolfcrypt/src/aes.c b/wolfcrypt/src/aes.c index d3bbfdf93..ee838ab34 100644 --- a/wolfcrypt/src/aes.c +++ b/wolfcrypt/src/aes.c @@ -9457,16 +9457,24 @@ int wc_AesGcmDecryptFinal(Aes* aes, const byte* authTag, word32 authTagSz) * functions */ #ifndef WC_NO_RNG +static WC_INLINE int CheckAesGcmIvSize(int ivSz) { +#if defined(HAVE_FIPS) && defined(HAVE_FIPS_VERSION) && (HAVE_FIPS_VERSION >= 4) + return (ivSz == GCM_NONCE_MID_SZ || + ivSz == GCM_NONCE_MAX_SZ); +#else + return (ivSz == GCM_NONCE_MIN_SZ || + ivSz == GCM_NONCE_MID_SZ || + ivSz == GCM_NONCE_MAX_SZ); +#endif +} + + int wc_AesGcmSetExtIV(Aes* aes, const byte* iv, word32 ivSz) { int ret = 0; - if (aes == NULL || iv == NULL || - (ivSz != GCM_NONCE_MIN_SZ && ivSz != GCM_NONCE_MID_SZ && - ivSz != GCM_NONCE_MAX_SZ)) { - + if (aes == NULL || iv == NULL || !CheckAesGcmIvSize(ivSz)) { ret = BAD_FUNC_ARG; - } if (ret == 0) { XMEMCPY((byte*)aes->reg, iv, ivSz); @@ -9492,9 +9500,7 @@ int wc_AesGcmSetIV(Aes* aes, word32 ivSz, { int ret = 0; - if (aes == NULL || rng == NULL || - (ivSz != GCM_NONCE_MIN_SZ && ivSz != GCM_NONCE_MID_SZ && - ivSz != GCM_NONCE_MAX_SZ) || + if (aes == NULL || rng == NULL || !CheckAesGcmIvSize(ivSz) || (ivFixed == NULL && ivFixedSz != 0) || (ivFixed != NULL && ivFixedSz != AES_IV_FIXED_SZ)) { diff --git a/wolfssl/wolfcrypt/aes.h b/wolfssl/wolfcrypt/aes.h index f7619c1e9..3ba981062 100644 --- a/wolfssl/wolfcrypt/aes.h +++ b/wolfssl/wolfcrypt/aes.h @@ -139,7 +139,7 @@ enum { KEYWRAP_BLOCK_SIZE = 8, GCM_NONCE_MAX_SZ = 16, /* wolfCrypt's maximum nonce size allowed. */ - GCM_NONCE_MID_SZ = 12, /* The usual default nonce size for AES-GCM. */ + GCM_NONCE_MID_SZ = 12, /* The default nonce size for AES-GCM. */ GCM_NONCE_MIN_SZ = 8, /* wolfCrypt's minimum nonce size allowed. */ CCM_NONCE_MIN_SZ = 7, CCM_NONCE_MAX_SZ = 13,