ARMv8 AES-GCM streaming: check size of IV before storing

Only store IV in Init function if it will fit in reg field of Aes
object.
This commit is contained in:
Sean Parkinson
2023-11-23 08:01:20 +10:00
parent 0306d07c47
commit b242b44b2c

View File

@@ -14512,8 +14512,7 @@ int wc_AesGcmInit(Aes* aes, const byte* key, word32 len, const byte* iv,
/* Check validity of parameters. */ /* Check validity of parameters. */
if ((aes == NULL) || ((len > 0) && (key == NULL)) || if ((aes == NULL) || ((len > 0) && (key == NULL)) ||
((ivSz == 0) && (iv != NULL)) || ((ivSz == 0) && (iv != NULL)) || ((ivSz > 0) && (iv == NULL))) {
((ivSz > 0) && (iv == NULL))) {
ret = BAD_FUNC_ARG; ret = BAD_FUNC_ARG;
} }
@@ -14534,14 +14533,14 @@ int wc_AesGcmInit(Aes* aes, const byte* key, word32 len, const byte* iv,
} }
if (ret == 0) { if (ret == 0) {
/* Setup with IV if needed. */ /* Set the IV passed in if it is smaller than a block. */
if (iv != NULL) { if ((iv != NULL) && (ivSz <= AES_BLOCK_SIZE)) {
/* Cache the IV in AES GCM object. */ XMEMMOVE((byte*)aes->reg, iv, ivSz);
XMEMCPY((byte*)aes->reg, iv, ivSz);
aes->nonceSz = ivSz; aes->nonceSz = ivSz;
} }
else if (aes->nonceSz != 0) { /* No IV passed in, check for cached IV. */
/* Copy out the cached copy. */ if ((iv == NULL) && (aes->nonceSz != 0)) {
/* Use the cached copy. */
iv = (byte*)aes->reg; iv = (byte*)aes->reg;
ivSz = aes->nonceSz; ivSz = aes->nonceSz;
} }