handling unaligned ChaCha input key buffer

This commit is contained in:
JacobBarthelmeh
2026-05-11 16:55:53 -06:00
parent c19dec7449
commit bd178bff7c
2 changed files with 62 additions and 1 deletions
+1 -1
View File
@@ -52,7 +52,7 @@ Public domain.
#define U32C(v) (v##U)
#define U32V(v) ((word32)(v) & U32C(0xFFFFFFFF))
#define U8TO32_LITTLE(p) LITTLE32(((const word32*)(p))[0])
#define U8TO32_LITTLE(p) LITTLE32(readUnalignedWord32(p))
#define ROTATE(v,c) rotlFixed(v, c)
#define XOR(v,w) ((v) ^ (w))
+61
View File
@@ -4487,6 +4487,7 @@ WOLFSSL_TEST_SUBROUTINE wc_test_ret_t asn_test(void)
#ifdef WOLFSSL_MD2
static wc_test_ret_t md2_kat_test(void)
{
wc_test_ret_t ret = 0;
wc_Md2 md2;
byte hash[WC_MD2_DIGEST_SIZE];
@@ -10815,6 +10816,45 @@ static wc_test_ret_t chacha_vector_test(ChaCha* enc, ChaCha* dec)
if (XMEMCMP(plain + 64, sliver, 64))
ERROR_OUT(WC_TEST_RET_ENC_NC, out);
/* Test unaligned input buffer case */
{
ChaCha encAligned;
ChaCha encUnaligned;
byte keyBuf[32 + 1];
byte ivBuf[12 + 1];
byte pt[64];
byte ctAligned[64];
byte ctUnaligned[64];
XMEMCPY(keyBuf + 1, keys[0], 32);
XMEMCPY(ivBuf + 1, ivs[2], 12);
XMEMSET(pt, 0xa5, sizeof(pt));
ret = wc_Chacha_SetKey(&encAligned, keys[0], 32);
if (ret != 0)
ERROR_OUT(WC_TEST_RET_ENC_EC(ret), out);
ret = wc_Chacha_SetKey(&encUnaligned, keyBuf + 1, 32);
if (ret != 0)
ERROR_OUT(WC_TEST_RET_ENC_EC(ret), out);
ret = wc_Chacha_SetIV(&encAligned, ivs[2], 0);
if (ret != 0)
ERROR_OUT(WC_TEST_RET_ENC_EC(ret), out);
ret = wc_Chacha_SetIV(&encUnaligned, ivBuf + 1, 0);
if (ret != 0)
ERROR_OUT(WC_TEST_RET_ENC_EC(ret), out);
ret = wc_Chacha_Process(&encAligned, ctAligned, pt, sizeof(pt));
if (ret != 0)
ERROR_OUT(WC_TEST_RET_ENC_EC(ret), out);
ret = wc_Chacha_Process(&encUnaligned, ctUnaligned, pt, sizeof(pt));
if (ret != 0)
ERROR_OUT(WC_TEST_RET_ENC_EC(ret), out);
if (XMEMCMP(ctAligned, ctUnaligned, sizeof(ctAligned)))
ERROR_OUT(WC_TEST_RET_ENC_NC, out);
}
out:
return ret;
}
@@ -23345,6 +23385,27 @@ WOLFSSL_TEST_SUBROUTINE wc_test_ret_t XChaCha_test(void) {
if (XMEMCMP(buf2, Plaintext, sizeof Plaintext))
ERROR_OUT(WC_TEST_RET_ENC_NC, out);
/* Test unaligned input buffer case */
{
byte keyBuf[sizeof Key + 1];
byte ivBuf[sizeof IV + 1];
XMEMCPY(keyBuf + 1, Key, sizeof Key);
XMEMCPY(ivBuf + 1, IV, sizeof IV);
ret = wc_XChacha_SetKey(chacha, keyBuf + 1, sizeof Key,
ivBuf + 1, sizeof IV, 0);
if (ret < 0)
ERROR_OUT(WC_TEST_RET_ENC_EC(ret), out);
ret = wc_Chacha_Process(chacha, buf2, Plaintext, sizeof Plaintext);
if (ret < 0)
ERROR_OUT(WC_TEST_RET_ENC_EC(ret), out);
if (XMEMCMP(buf2, Ciphertext, sizeof Plaintext))
ERROR_OUT(WC_TEST_RET_ENC_NC, out);
}
out:
#if defined(WOLFSSL_SMALL_STACK) && !defined(WOLFSSL_NO_MALLOC)