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 d7b208a6..a9bd18db 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);