diff --git a/wolfcrypt/src/chacha.c b/wolfcrypt/src/chacha.c index 9c0a770491..49c5dcefbe 100644 --- a/wolfcrypt/src/chacha.c +++ b/wolfcrypt/src/chacha.c @@ -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)) diff --git a/wolfcrypt/test/test.c b/wolfcrypt/test/test.c index 5af908fe9e..8a567eca37 100644 --- a/wolfcrypt/test/test.c +++ b/wolfcrypt/test/test.c @@ -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)