diff --git a/src/libsodium/crypto_aead/aes256gcm/aesni/aead_aes256gcm_aesni.c b/src/libsodium/crypto_aead/aes256gcm/aesni/aead_aes256gcm_aesni.c index c4d4c739..bfd6922d 100644 --- a/src/libsodium/crypto_aead/aes256gcm/aesni/aead_aes256gcm_aesni.c +++ b/src/libsodium/crypto_aead/aes256gcm/aesni/aead_aes256gcm_aesni.c @@ -9,6 +9,7 @@ #include "crypto_aead_aes256gcm_aesni.h" #include "export.h" +#include "runtime.h" #include "utils.h" #if defined(HAVE_WMMINTRIN_H) || \ @@ -798,6 +799,12 @@ crypto_aead_aes256gcm_aesni_decrypt(unsigned char *m, (m, mlen_p, nsec, c, clen, ad, adlen, npub, &ctx); } +int +crypto_aead_aes256gcm_aesni_is_available(void) +{ + return sodium_runtime_has_pclmul() & sodium_runtime_has_aesni(); +} + size_t crypto_aead_aes256gcm_keybytes(void) { @@ -828,4 +835,12 @@ crypto_aead_aes256gcm_statebytes(void) return sizeof(crypto_aead_aes256gcm_state); } +#else + +int +crypto_aead_aes256gcm_aesni_is_available(void) +{ + return 0; +} + #endif diff --git a/src/libsodium/include/sodium/crypto_aead_aes256gcm_aesni.h b/src/libsodium/include/sodium/crypto_aead_aes256gcm_aesni.h index ed37c8b3..990a4091 100644 --- a/src/libsodium/include/sodium/crypto_aead_aes256gcm_aesni.h +++ b/src/libsodium/include/sodium/crypto_aead_aes256gcm_aesni.h @@ -11,6 +11,9 @@ extern "C" { #endif +SODIUM_EXPORT +int crypto_aead_aes256gcm_aesni_is_available(void); + #define crypto_aead_aes256gcm_KEYBYTES 32U SODIUM_EXPORT size_t crypto_aead_aes256gcm_keybytes(void); diff --git a/test/default/aead_aes256gcm.c b/test/default/aead_aes256gcm.c index aa69666b..cb402a7d 100644 --- a/test/default/aead_aes256gcm.c +++ b/test/default/aead_aes256gcm.c @@ -3095,7 +3095,7 @@ tv(void) int main(void) { - if (sodium_runtime_has_aesni() && sodium_runtime_has_pclmul()) { + if (crypto_aead_aes256gcm_aesni_is_available()) { tv(); } printf("OK\n");