summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNikos Mavrogiannopoulos <nmav@redhat.com>2017-05-22 14:41:56 +0200
committerNikos Mavrogiannopoulos <nmav@gnutls.org>2017-05-23 08:49:46 +0200
commit864e8d4e3ba87f53df7bdef695661415ed60a018 (patch)
tree2829e7c3a79f9a3ac4aba2858db58abb3bd33790
parent214a2eae52b1518c6752e308c1e3e5f6cbd6e680 (diff)
downloadgnutls-864e8d4e3ba87f53df7bdef695661415ed60a018.tar.gz
aarch64: fix AES-GCM in-place encryption and decryption
Resolves #204 Signed-off-by: Nikos Mavrogiannopoulos <nmav@redhat.com>
-rw-r--r--lib/accelerated/aarch64/aes-gcm-aarch64.c24
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++) {