Unroll aesce_encrypt_block

Signed-off-by: Dave Rodgman <dave.rodgman@arm.com>
This commit is contained in:
Dave Rodgman 2023-06-15 16:21:31 +01:00
parent 7c5e567813
commit 96fdfb8e62
2 changed files with 53 additions and 8 deletions

View File

@ -105,22 +105,64 @@ static uint8x16_t aesce_encrypt_block(uint8x16_t block,
unsigned char *keys,
int rounds)
{
for (int i = 0; i < rounds - 1; i++) {
/* AES AddRoundKey, SubBytes, ShiftRows (in this order).
* AddRoundKey adds the round key for the previous round. */
block = vaeseq_u8(block, vld1q_u8(keys + i * 16));
/* AES mix columns */
block = vaesmcq_u8(block);
/* Assume either 10, 12 or 14 rounds */
if (rounds == 10) {
goto rounds_10;
}
if (rounds == 12) {
goto rounds_12;
}
block = vaeseq_u8(block, vld1q_u8(keys));
block = vaesmcq_u8(block);
keys += 16;
block = vaeseq_u8(block, vld1q_u8(keys));
block = vaesmcq_u8(block);
keys += 16;
rounds_12:
block = vaeseq_u8(block, vld1q_u8(keys));
block = vaesmcq_u8(block);
keys += 16;
block = vaeseq_u8(block, vld1q_u8(keys));
block = vaesmcq_u8(block);
keys += 16;
rounds_10:
block = vaeseq_u8(block, vld1q_u8(keys));
block = vaesmcq_u8(block);
keys += 16;
block = vaeseq_u8(block, vld1q_u8(keys));
block = vaesmcq_u8(block);
keys += 16;
block = vaeseq_u8(block, vld1q_u8(keys));
block = vaesmcq_u8(block);
keys += 16;
block = vaeseq_u8(block, vld1q_u8(keys));
block = vaesmcq_u8(block);
keys += 16;
block = vaeseq_u8(block, vld1q_u8(keys));
block = vaesmcq_u8(block);
keys += 16;
block = vaeseq_u8(block, vld1q_u8(keys));
block = vaesmcq_u8(block);
keys += 16;
block = vaeseq_u8(block, vld1q_u8(keys));
block = vaesmcq_u8(block);
keys += 16;
block = vaeseq_u8(block, vld1q_u8(keys));
block = vaesmcq_u8(block);
keys += 16;
block = vaeseq_u8(block, vld1q_u8(keys));
block = vaesmcq_u8(block);
keys += 16;
/* AES AddRoundKey for the previous round.
* SubBytes, ShiftRows for the final round. */
block = vaeseq_u8(block, vld1q_u8(keys + (rounds -1) * 16));
block = vaeseq_u8(block, vld1q_u8(keys));
keys += 16;
/* Final round: no MixColumns */
/* Final AddRoundKey */
block = veorq_u8(block, vld1q_u8(keys + rounds * 16));
block = veorq_u8(block, vld1q_u8(keys));
return block;
}

View File

@ -52,6 +52,9 @@ int mbedtls_aesce_has_support(void);
/**
* \brief Internal AES-ECB block encryption and decryption
*
* Note: this assumes that the context specifies either 10, 12 or 14 rounds
* and will behave incorrectly if this is not the case.
*
* \param ctx AES context
* \param mode MBEDTLS_AES_ENCRYPT or MBEDTLS_AES_DECRYPT
* \param input 16-byte input block