diff options
-rw-r--r-- | lib/accelerated/aarch64/aes-gcm-aarch64.c | 24 |
1 files changed, 24 insertions, 0 deletions
diff --git a/lib/accelerated/aarch64/aes-gcm-aarch64.c b/lib/accelerated/aarch64/aes-gcm-aarch64.c index c571d0294f..8d2bc1dce2 100644 --- a/lib/accelerated/aarch64/aes-gcm-aarch64.c +++ b/lib/accelerated/aarch64/aes-gcm-aarch64.c @@ -153,6 +153,27 @@ gcm_ghash(struct aes_gcm_ctx *ctx, const uint8_t * src, size_t src_size) } static void +ctr32_encrypt_blocks_inplace(const unsigned char *in, unsigned char *out, + size_t blocks, const AES_KEY *key, + const unsigned char ivec[16]) +{ + unsigned i; + uint8_t ctr[16]; + uint8_t tmp[16]; + + memcpy(ctr, ivec, 16); + + for (i=0;i<blocks;i++) { + aes_v8_encrypt(ctr, tmp, key); + memxor3(out, tmp, in, 16); + + out += 16; + in += 16; + INCREMENT(16, ctr); + } +} + +static void ctr32_encrypt_blocks(const unsigned char *in, unsigned char *out, size_t blocks, const AES_KEY *key, const unsigned char ivec[16]) @@ -160,6 +181,9 @@ ctr32_encrypt_blocks(const unsigned char *in, unsigned char *out, unsigned i; uint8_t ctr[16]; + if (in == out) + return ctr32_encrypt_blocks_inplace(in, out, blocks, key, ivec); + memcpy(ctr, ivec, 16); for (i=0;i<blocks;i++) { |