From 0a31dd5a31ec8628846a2e06a185a11993d84e9a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Adrien=20Gallou=C3=ABt?= Date: Thu, 12 Sep 2019 21:11:07 +0000 Subject: [PATCH] aegis256: Support mac verification when m is NULL MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Adrien Gallouët --- .../aegis256/aesni/aead_aegis256_aesni.c | 14 +++++++++++--- test/default/aead_aegis256.c | 5 +++++ 2 files changed, 16 insertions(+), 3 deletions(-) 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 48a5915b..45a4b22a 100644 --- a/src/libsodium/crypto_aead/aegis256/aesni/aead_aegis256_aesni.c +++ b/src/libsodium/crypto_aead/aegis256/aesni/aead_aegis256_aesni.c @@ -221,14 +221,22 @@ crypto_aead_aegis256_decrypt_detached(unsigned char *m, unsigned char *nsec, con memcpy(src, ad + i, adlen & 0xf); crypto_aead_aegis256_enc(dst, src, state); } - for (i = 0ULL; i + 16ULL <= mlen; i += 16ULL) { - crypto_aead_aegis256_dec(m + i, c + i, state); + if (m != NULL) { + for (i = 0ULL; i + 16ULL <= mlen; i += 16ULL) { + crypto_aead_aegis256_dec(m + i, c + i, state); + } + } else { + for (i = 0ULL; i + 16ULL <= mlen; i += 16ULL) { + crypto_aead_aegis256_dec(dst, c + i, state); + } } if (mlen & 0xf) { memset(src, 0, 16); memcpy(src, c + i, mlen & 0xf); crypto_aead_aegis256_dec(dst, src, state); - memcpy(m + i, dst, mlen & 0xf); + if (m != NULL) { + memcpy(m + i, dst, mlen & 0xf); + } memset(dst, 0, mlen & 0xf); state[0] = _mm_xor_si128(state[0], _mm_loadu_si128((__m128i *) dst)); } diff --git a/test/default/aead_aegis256.c b/test/default/aead_aegis256.c index 582a2dc1..49ef1317 100644 --- a/test/default/aead_aegis256.c +++ b/test/default/aead_aegis256.c @@ -2144,6 +2144,11 @@ tv(void) printf("Verification of test vector #%u with a truncated tag failed\n", (unsigned int) i); } + if (i == 0 && crypto_aead_aegis256_decrypt(NULL, NULL, + NULL, ciphertext, ciphertext_len, + ad, ad_len, nonce, key) != 0) { + printf("Verification of test vector #%u's tag failed\n", (unsigned int) i); + } if (crypto_aead_aegis256_decrypt(decrypted, &found_message_len, NULL, ciphertext, ciphertext_len, ad, ad_len, nonce, key) != 0) { printf("Verification of test vector #%u failed\n", (unsigned int) i);