git: 96c253812139 - main - opencrypto: Respect alignment constraints in xor_and_encrypt()

From: Mark Johnston <markj_at_FreeBSD.org>
Date: Thu, 27 Jul 2023 20:12:56 UTC
The branch main has been updated by markj:

URL: https://cgit.FreeBSD.org/src/commit/?id=96c2538121390c872f68ac48f97b35fb973c11dc

commit 96c2538121390c872f68ac48f97b35fb973c11dc
Author:     Mark Johnston <markj@FreeBSD.org>
AuthorDate: 2023-07-27 19:44:52 +0000
Commit:     Mark Johnston <markj@FreeBSD.org>
CommitDate: 2023-07-27 19:44:52 +0000

    opencrypto: Respect alignment constraints in xor_and_encrypt()
    
    Copy operands to an aligned buffer before performing operations which
    require alignment.  Otherwise it's possible for this code to trigger an
    alignment fault on armv7.
    
    Reviewed by:    jhb
    MFC after:      2 weeks
    Sponsored by:   Klara, Inc.
    Sponsored by:   Stormshield
    Differential Revision:  https://reviews.freebsd.org/D41211
---
 sys/opencrypto/cbc_mac.c | 19 ++++++++-----------
 1 file changed, 8 insertions(+), 11 deletions(-)

diff --git a/sys/opencrypto/cbc_mac.c b/sys/opencrypto/cbc_mac.c
index 9a030cd54173..cfba24eeab31 100644
--- a/sys/opencrypto/cbc_mac.c
+++ b/sys/opencrypto/cbc_mac.c
@@ -40,19 +40,16 @@ static void
 xor_and_encrypt(struct aes_cbc_mac_ctx *ctx,
 		const uint8_t *src, uint8_t *dst)
 {
-	const uint64_t *b1;
-	uint64_t *b2;
-	uint64_t temp_block[CCM_CBC_BLOCK_LEN/sizeof(uint64_t)];
+#define	NWORDS	(CCM_CBC_BLOCK_LEN / sizeof(uint64_t))
+	uint64_t b1[NWORDS], b2[NWORDS], temp[NWORDS];
 
-	b1 = (const uint64_t*)src;
-	b2 = (uint64_t*)dst;
+	memcpy(b1, src, CCM_CBC_BLOCK_LEN);
+	memcpy(b2, dst, CCM_CBC_BLOCK_LEN);
 
-	for (size_t count = 0;
-	     count < CCM_CBC_BLOCK_LEN/sizeof(uint64_t);
-	     count++) {
-		temp_block[count] = b1[count] ^ b2[count];
-	}
-	rijndaelEncrypt(ctx->keysched, ctx->rounds, (void*)temp_block, dst);
+	for (size_t count = 0; count < NWORDS; count++)
+		temp[count] = b1[count] ^ b2[count];
+	rijndaelEncrypt(ctx->keysched, ctx->rounds, (void *)temp, dst);
+#undef NWORDS
 }
 
 void