aes.c: Use xorbufout when possible

This commit is contained in:
Juliusz Sosinowicz
2023-03-29 16:55:50 +02:00
parent 6079b92e26
commit 3c57228197

View File

@@ -3829,8 +3829,7 @@ int wc_AesSetIV(Aes* aes, const byte* iv)
XMEMCPY(temp_block, in + offset, AES_BLOCK_SIZE); XMEMCPY(temp_block, in + offset, AES_BLOCK_SIZE);
/* XOR block with IV for CBC */ /* XOR block with IV for CBC */
for (i = 0; i < AES_BLOCK_SIZE; i++) xorbuf(temp_block, iv, AES_BLOCK_SIZE);
temp_block[i] ^= iv[i];
ret = wc_AesEncrypt(aes, temp_block, out + offset); ret = wc_AesEncrypt(aes, temp_block, out + offset);
if (ret != 0) if (ret != 0)
@@ -3869,8 +3868,7 @@ int wc_AesSetIV(Aes* aes, const byte* iv)
wc_AesDecrypt(aes, in + offset, out + offset); wc_AesDecrypt(aes, in + offset, out + offset);
/* XOR block with IV for CBC */ /* XOR block with IV for CBC */
for (i = 0; i < AES_BLOCK_SIZE; i++) xorbuf(out + offset, iv, AES_BLOCK_SIZE);
(out + offset)[i] ^= iv[i];
/* store IV for next block */ /* store IV for next block */
XMEMCPY(iv, temp_block, AES_BLOCK_SIZE); XMEMCPY(iv, temp_block, AES_BLOCK_SIZE);
@@ -4455,9 +4453,9 @@ int wc_AesSetIV(Aes* aes, const byte* iv)
/* Software AES - CTR Encrypt */ /* Software AES - CTR Encrypt */
int wc_AesCtrEncrypt(Aes* aes, byte* out, const byte* in, word32 sz) int wc_AesCtrEncrypt(Aes* aes, byte* out, const byte* in, word32 sz)
{ {
byte* tmp;
byte scratch[AES_BLOCK_SIZE]; byte scratch[AES_BLOCK_SIZE];
int ret; int ret;
word32 processed;
if (aes == NULL || out == NULL || in == NULL) { if (aes == NULL || out == NULL || in == NULL) {
return BAD_FUNC_ARG; return BAD_FUNC_ARG;
@@ -4473,12 +4471,13 @@ int wc_AesSetIV(Aes* aes, const byte* iv)
#endif #endif
/* consume any unused bytes left in aes->tmp */ /* consume any unused bytes left in aes->tmp */
tmp = (byte*)aes->tmp + AES_BLOCK_SIZE - aes->left; processed = min(aes->left, sz);
while (aes->left && sz) { xorbufout(out, in, (byte*)aes->tmp + AES_BLOCK_SIZE - aes->left,
*(out++) = *(in++) ^ *(tmp++); processed);
aes->left--; out += processed;
sz--; in += processed;
} aes->left -= processed;
sz -= processed;
#if defined(HAVE_AES_ECB) && !defined(WOLFSSL_PIC32MZ_CRYPT) && \ #if defined(HAVE_AES_ECB) && !defined(WOLFSSL_PIC32MZ_CRYPT) && \
!defined(XTRANSFORM_AESCTRBLOCK) !defined(XTRANSFORM_AESCTRBLOCK)
@@ -4545,13 +4544,8 @@ int wc_AesSetIV(Aes* aes, const byte* iv)
} }
IncrementAesCounter((byte*)aes->reg); IncrementAesCounter((byte*)aes->reg);
aes->left = AES_BLOCK_SIZE; aes->left = AES_BLOCK_SIZE - sz;
tmp = (byte*)aes->tmp; xorbufout(out, in, aes->tmp, sz);
while (sz--) {
*(out++) = *(in++) ^ *(tmp++);
aes->left--;
}
} }
#ifdef WOLFSSL_CHECK_MEM_ZERO #ifdef WOLFSSL_CHECK_MEM_ZERO
@@ -9924,6 +9918,7 @@ static WARN_UNUSED_RESULT int wc_AesFeedbackEncrypt(
byte* reg = NULL; byte* reg = NULL;
#endif #endif
int ret = 0; int ret = 0;
word32 processed;
if (aes == NULL || out == NULL || in == NULL) { if (aes == NULL || out == NULL || in == NULL) {
return BAD_FUNC_ARG; return BAD_FUNC_ARG;
@@ -9936,18 +9931,17 @@ static WARN_UNUSED_RESULT int wc_AesFeedbackEncrypt(
#endif #endif
/* consume any unused bytes left in aes->tmp */ /* consume any unused bytes left in aes->tmp */
tmp = (byte*)aes->tmp + AES_BLOCK_SIZE - aes->left; processed = min(aes->left, sz);
while (aes->left && sz) { xorbufout(out, in, (byte*)aes->tmp + AES_BLOCK_SIZE - aes->left, processed);
*(out) = *(in++) ^ *(tmp++);
#ifdef WOLFSSL_AES_CFB #ifdef WOLFSSL_AES_CFB
if (mode == AES_CFB_MODE) { if (mode == AES_CFB_MODE) {
*(reg++) = *out; XMEMCPY((byte*)aes->reg + AES_BLOCK_SIZE - aes->left, out, processed);
} }
#endif #endif
out++; aes->left -= processed;
aes->left--; out += processed;
sz--; in += processed;
} sz -= processed;
SAVE_VECTOR_REGISTERS(return _svr_ret;); SAVE_VECTOR_REGISTERS(return _svr_ret;);
@@ -9990,16 +9984,13 @@ static WARN_UNUSED_RESULT int wc_AesFeedbackEncrypt(
reg = (byte*)aes->reg; reg = (byte*)aes->reg;
#endif #endif
while (sz--) { xorbufout(out, in, tmp, sz);
*(out) = *(in++) ^ *(tmp++);
#ifdef WOLFSSL_AES_CFB #ifdef WOLFSSL_AES_CFB
if (mode == AES_CFB_MODE) { if (mode == AES_CFB_MODE) {
*(reg++) = *out; XMEMCPY(reg, out, sz);
} }
#endif #endif
out++; aes->left -= sz;
aes->left--;
}
} }
RESTORE_VECTOR_REGISTERS(); RESTORE_VECTOR_REGISTERS();
@@ -10022,8 +10013,8 @@ static WARN_UNUSED_RESULT int wc_AesFeedbackEncrypt(
static WARN_UNUSED_RESULT int wc_AesFeedbackDecrypt( static WARN_UNUSED_RESULT int wc_AesFeedbackDecrypt(
Aes* aes, byte* out, const byte* in, word32 sz, byte mode) Aes* aes, byte* out, const byte* in, word32 sz, byte mode)
{ {
byte* tmp;
int ret = 0; int ret = 0;
word32 processed;
if (aes == NULL || out == NULL || in == NULL) { if (aes == NULL || out == NULL || in == NULL) {
return BAD_FUNC_ARG; return BAD_FUNC_ARG;
@@ -10038,12 +10029,12 @@ static WARN_UNUSED_RESULT int wc_AesFeedbackDecrypt(
#endif #endif
/* consume any unused bytes left in aes->tmp */ /* consume any unused bytes left in aes->tmp */
tmp = (byte*)aes->tmp + AES_BLOCK_SIZE - aes->left; processed = min(aes->left, sz);
while (aes->left && sz) { xorbufout(out, in, (byte*)aes->tmp + AES_BLOCK_SIZE - aes->left, processed);
*(out++) = *(in++) ^ *(tmp++); aes->left -= processed;
aes->left--; out += processed;
sz--; in += processed;
} sz -= processed;
SAVE_VECTOR_REGISTERS(return _svr_ret;); SAVE_VECTOR_REGISTERS(return _svr_ret;);
@@ -10086,13 +10077,8 @@ static WARN_UNUSED_RESULT int wc_AesFeedbackDecrypt(
} }
#endif #endif
aes->left = AES_BLOCK_SIZE; aes->left = AES_BLOCK_SIZE - sz;
tmp = (byte*)aes->tmp; xorbufout(out, in, aes->tmp, sz);
while (sz--) {
*(out++) = *(in++) ^ *(tmp++);
aes->left--;
}
} }
RESTORE_VECTOR_REGISTERS(); RESTORE_VECTOR_REGISTERS();