mirror of
https://github.com/Mbed-TLS/mbedtls.git
synced 2025-08-05 19:35:48 +03:00
Unroll aesce_encrypt_block
Signed-off-by: Dave Rodgman <dave.rodgman@arm.com>
This commit is contained in:
@@ -105,22 +105,64 @@ static uint8x16_t aesce_encrypt_block(uint8x16_t block,
|
|||||||
unsigned char *keys,
|
unsigned char *keys,
|
||||||
int rounds)
|
int rounds)
|
||||||
{
|
{
|
||||||
for (int i = 0; i < rounds - 1; i++) {
|
/* Assume either 10, 12 or 14 rounds */
|
||||||
/* AES AddRoundKey, SubBytes, ShiftRows (in this order).
|
if (rounds == 10) {
|
||||||
* AddRoundKey adds the round key for the previous round. */
|
goto rounds_10;
|
||||||
block = vaeseq_u8(block, vld1q_u8(keys + i * 16));
|
|
||||||
/* AES mix columns */
|
|
||||||
block = vaesmcq_u8(block);
|
|
||||||
}
|
}
|
||||||
|
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.
|
/* AES AddRoundKey for the previous round.
|
||||||
* SubBytes, ShiftRows for the final 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 round: no MixColumns */
|
||||||
|
|
||||||
/* Final AddRoundKey */
|
/* Final AddRoundKey */
|
||||||
block = veorq_u8(block, vld1q_u8(keys + rounds * 16));
|
block = veorq_u8(block, vld1q_u8(keys));
|
||||||
|
|
||||||
return block;
|
return block;
|
||||||
}
|
}
|
||||||
|
@@ -52,6 +52,9 @@ int mbedtls_aesce_has_support(void);
|
|||||||
/**
|
/**
|
||||||
* \brief Internal AES-ECB block encryption and decryption
|
* \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 ctx AES context
|
||||||
* \param mode MBEDTLS_AES_ENCRYPT or MBEDTLS_AES_DECRYPT
|
* \param mode MBEDTLS_AES_ENCRYPT or MBEDTLS_AES_DECRYPT
|
||||||
* \param input 16-byte input block
|
* \param input 16-byte input block
|
||||||
|
Reference in New Issue
Block a user