From ece8e60524700cdf2b2b45e8f80c0ff49881814e Mon Sep 17 00:00:00 2001 From: Frank Denis Date: Sun, 20 Nov 2022 18:16:13 +0100 Subject: [PATCH] AEGIS: add a specialized function to absorb the AD --- .../aegis128l/aesni/aead_aegis128l_aesni.c | 18 ++++++++++++++---- .../armcrypto/aead_aegis128l_armcrypto.c | 18 ++++++++++++++---- .../aegis256/aesni/aead_aegis256_aesni.c | 17 +++++++++++++---- .../armcrypto/aead_aegis256_armcrypto.c | 17 +++++++++++++---- 4 files changed, 54 insertions(+), 16 deletions(-) diff --git a/src/libsodium/crypto_aead/aegis128l/aesni/aead_aegis128l_aesni.c b/src/libsodium/crypto_aead/aegis128l/aesni/aead_aegis128l_aesni.c index 7118948e..635dfdef 100644 --- a/src/libsodium/crypto_aead/aegis128l/aesni/aead_aegis128l_aesni.c +++ b/src/libsodium/crypto_aead/aegis128l/aesni/aead_aegis128l_aesni.c @@ -110,6 +110,16 @@ crypto_aead_aegis128l_mac(unsigned char *mac, unsigned long long adlen, unsigned AES_BLOCK_STORE((aes_block_t *) (void *) mac, tmp); } +static inline void +crypto_aead_aegis128l_absorb(const unsigned char *const src, aes_block_t *const state) +{ + aes_block_t msg0, msg1; + + msg0 = AES_BLOCK_LOAD(src); + msg1 = AES_BLOCK_LOAD(src + 16); + crypto_aead_aegis128l_update(state, msg0, msg1); +} + static void crypto_aead_aegis128l_enc(unsigned char *const dst, const unsigned char *const src, aes_block_t *const state) @@ -167,12 +177,12 @@ crypto_aead_aegis128l_encrypt_detached(unsigned char *c, unsigned char *mac, crypto_aead_aegis128l_init(k, npub, state); for (i = 0ULL; i + 32ULL <= adlen; i += 32ULL) { - crypto_aead_aegis128l_enc(dst, ad + i, state); + crypto_aead_aegis128l_absorb(ad + i, state); } if (adlen & 0x1f) { memset(src, 0, 32); memcpy(src, ad + i, adlen & 0x1f); - crypto_aead_aegis128l_enc(dst, src, state); + crypto_aead_aegis128l_absorb(src, state); } for (i = 0ULL; i + 32ULL <= mlen; i += 32ULL) { crypto_aead_aegis128l_enc(c + i, m + i, state); @@ -238,12 +248,12 @@ crypto_aead_aegis128l_decrypt_detached(unsigned char *m, unsigned char *nsec, crypto_aead_aegis128l_init(k, npub, state); for (i = 0ULL; i + 32ULL <= adlen; i += 32ULL) { - crypto_aead_aegis128l_enc(dst, ad + i, state); + crypto_aead_aegis128l_absorb(ad + i, state); } if (adlen & 0x1f) { memset(src, 0, 32); memcpy(src, ad + i, adlen & 0x1f); - crypto_aead_aegis128l_enc(dst, src, state); + crypto_aead_aegis128l_absorb(src, state); } if (m != NULL) { for (i = 0ULL; i + 32ULL <= mlen; i += 32ULL) { diff --git a/src/libsodium/crypto_aead/aegis128l/armcrypto/aead_aegis128l_armcrypto.c b/src/libsodium/crypto_aead/aegis128l/armcrypto/aead_aegis128l_armcrypto.c index 3c081c24..e3468ac9 100644 --- a/src/libsodium/crypto_aead/aegis128l/armcrypto/aead_aegis128l_armcrypto.c +++ b/src/libsodium/crypto_aead/aegis128l/armcrypto/aead_aegis128l_armcrypto.c @@ -99,6 +99,16 @@ crypto_aead_aegis128l_mac(unsigned char *mac, unsigned long long adlen, unsigned AES_BLOCK_STORE(mac, tmp); } +static inline void +crypto_aead_aegis128l_absorb(const unsigned char *const src, aes_block_t *const state) +{ + aes_block_t msg0, msg1; + + msg0 = AES_BLOCK_LOAD(src); + msg1 = AES_BLOCK_LOAD(src + 16); + crypto_aead_aegis128l_update(state, msg0, msg1); +} + static void crypto_aead_aegis128l_enc(unsigned char *const dst, const unsigned char *const src, @@ -158,12 +168,12 @@ crypto_aead_aegis128l_encrypt_detached(unsigned char *c, unsigned char *mac, crypto_aead_aegis128l_init(k, npub, state); for (i = 0ULL; i + 32ULL <= adlen; i += 32ULL) { - crypto_aead_aegis128l_enc(dst, ad + i, state); + crypto_aead_aegis128l_absorb(ad + i, state); } if (adlen & 0x1f) { memset(src, 0, 32); memcpy(src, ad + i, adlen & 0x1f); - crypto_aead_aegis128l_enc(dst, src, state); + crypto_aead_aegis128l_absorb(src, state); } for (i = 0ULL; i + 32ULL <= mlen; i += 32ULL) { crypto_aead_aegis128l_enc(c + i, m + i, state); @@ -229,12 +239,12 @@ crypto_aead_aegis128l_decrypt_detached(unsigned char *m, unsigned char *nsec, crypto_aead_aegis128l_init(k, npub, state); for (i = 0ULL; i + 32ULL <= adlen; i += 32ULL) { - crypto_aead_aegis128l_enc(dst, ad + i, state); + crypto_aead_aegis128l_absorb(ad + i, state); } if (adlen & 0x1f) { memset(src, 0, 32); memcpy(src, ad + i, adlen & 0x1f); - crypto_aead_aegis128l_enc(dst, src, state); + crypto_aead_aegis128l_absorb(src, state); } if (m != NULL) { for (i = 0ULL; i + 32ULL <= mlen; i += 32ULL) { diff --git a/src/libsodium/crypto_aead/aegis256/aesni/aead_aegis256_aesni.c b/src/libsodium/crypto_aead/aegis256/aesni/aead_aegis256_aesni.c index b51eaed9..3501b66d 100644 --- a/src/libsodium/crypto_aead/aegis256/aesni/aead_aegis256_aesni.c +++ b/src/libsodium/crypto_aead/aegis256/aesni/aead_aegis256_aesni.c @@ -108,6 +108,15 @@ crypto_aead_aegis256_mac(unsigned char *mac, unsigned long long adlen, unsigned AES_BLOCK_STORE((aes_block_t *) (void *) mac, tmp); } +static inline void +crypto_aead_aegis256_absorb(const unsigned char *const src, aes_block_t *const state) +{ + aes_block_t msg; + + msg = AES_BLOCK_LOAD(src); + crypto_aead_aegis256_update(state, msg); +} + static void crypto_aead_aegis256_enc(unsigned char *const dst, const unsigned char *const src, aes_block_t *const state) @@ -157,12 +166,12 @@ crypto_aead_aegis256_encrypt_detached(unsigned char *c, unsigned char *mac, crypto_aead_aegis256_init(k, npub, state); for (i = 0ULL; i + 16ULL <= adlen; i += 16ULL) { - crypto_aead_aegis256_enc(dst, ad + i, state); + crypto_aead_aegis256_absorb(ad + i, state); } if (adlen & 0xf) { memset(src, 0, 16); memcpy(src, ad + i, adlen & 0xf); - crypto_aead_aegis256_enc(dst, src, state); + crypto_aead_aegis256_absorb(src, state); } for (i = 0ULL; i + 16ULL <= mlen; i += 16ULL) { crypto_aead_aegis256_enc(c + i, m + i, state); @@ -227,12 +236,12 @@ crypto_aead_aegis256_decrypt_detached(unsigned char *m, unsigned char *nsec, con crypto_aead_aegis256_init(k, npub, state); for (i = 0ULL; i + 16ULL <= adlen; i += 16ULL) { - crypto_aead_aegis256_enc(dst, ad + i, state); + crypto_aead_aegis256_absorb(ad + i, state); } if (adlen & 0xf) { memset(src, 0, 16); memcpy(src, ad + i, adlen & 0xf); - crypto_aead_aegis256_enc(dst, src, state); + crypto_aead_aegis256_absorb(src, state); } if (m != NULL) { for (i = 0ULL; i + 16ULL <= mlen; i += 16ULL) { diff --git a/src/libsodium/crypto_aead/aegis256/armcrypto/aead_aegis256_armcrypto.c b/src/libsodium/crypto_aead/aegis256/armcrypto/aead_aegis256_armcrypto.c index 476e8177..0eef75da 100644 --- a/src/libsodium/crypto_aead/aegis256/armcrypto/aead_aegis256_armcrypto.c +++ b/src/libsodium/crypto_aead/aegis256/armcrypto/aead_aegis256_armcrypto.c @@ -99,6 +99,15 @@ crypto_aead_aegis256_mac(unsigned char *mac, unsigned long long adlen, unsigned AES_BLOCK_STORE(mac, tmp); } +static inline void +crypto_aead_aegis256_absorb(const unsigned char *const src, aes_block_t *const state) +{ + aes_block_t msg; + + msg = AES_BLOCK_LOAD(src); + crypto_aead_aegis256_update(state, msg); +} + static void crypto_aead_aegis256_enc(unsigned char *const dst, const unsigned char *const src, @@ -150,12 +159,12 @@ crypto_aead_aegis256_encrypt_detached(unsigned char *c, unsigned char *mac, crypto_aead_aegis256_init(k, npub, state); for (i = 0ULL; i + 16ULL <= adlen; i += 16ULL) { - crypto_aead_aegis256_enc(dst, ad + i, state); + crypto_aead_aegis256_absorb(ad + i, state); } if (adlen & 0xf) { memset(src, 0, 16); memcpy(src, ad + i, adlen & 0xf); - crypto_aead_aegis256_enc(dst, src, state); + crypto_aead_aegis256_absorb(src, state); } for (i = 0ULL; i + 16ULL <= mlen; i += 16ULL) { crypto_aead_aegis256_enc(c + i, m + i, state); @@ -220,12 +229,12 @@ crypto_aead_aegis256_decrypt_detached(unsigned char *m, unsigned char *nsec, con crypto_aead_aegis256_init(k, npub, state); for (i = 0ULL; i + 16ULL <= adlen; i += 16ULL) { - crypto_aead_aegis256_enc(dst, ad + i, state); + crypto_aead_aegis256_absorb(ad + i, state); } if (adlen & 0xf) { memset(src, 0, 16); memcpy(src, ad + i, adlen & 0xf); - crypto_aead_aegis256_enc(dst, src, state); + crypto_aead_aegis256_absorb(src, state); } if (m != NULL) { for (i = 0ULL; i + 16ULL <= mlen; i += 16ULL) {