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
This commit is contained in:
Mark Johnston 2023-07-27 15:44:52 -04:00
parent 1be56e0bb1
commit 96c2538121

View File

@ -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