diff --git a/crypto/fipsmodule/aes/aes_test.cc b/crypto/fipsmodule/aes/aes_test.cc index a90ffb7b4ee..48d1e4ae080 100644 --- a/crypto/fipsmodule/aes/aes_test.cc +++ b/crypto/fipsmodule/aes/aes_test.cc @@ -428,7 +428,8 @@ TEST(AESTest, ABI) { block_counts = {0, 1, 8}; } - if (bsaes_capable()) { +#if defined(BSAES) + if (vpaes_capable()) { ASSERT_EQ(vpaes_set_encrypt_key(kKey, bits, &key), 0); CHECK_ABI(vpaes_encrypt_key_to_bsaes, &key, &key); for (size_t blocks : block_counts) { @@ -446,6 +447,7 @@ TEST(AESTest, ABI) { block, AES_DECRYPT); } } +#endif if (vpaes_capable()) { ASSERT_EQ(CHECK_ABI(vpaes_set_encrypt_key, kKey, bits, &key), 0); diff --git a/crypto/fipsmodule/aes/internal.h b/crypto/fipsmodule/aes/internal.h index 97d260f9bf2..4346dab87ad 100644 --- a/crypto/fipsmodule/aes/internal.h +++ b/crypto/fipsmodule/aes/internal.h @@ -29,51 +29,43 @@ extern "C" { #if !defined(OPENSSL_NO_ASM) -#if defined(OPENSSL_X86_64) -OPENSSL_INLINE int avx512_xts_available(void) { - return (CRYPTO_is_VAES_capable() && - CRYPTO_is_VBMI2_capable() && - CRYPTO_is_AVX512_capable() && - CRYPTO_is_VPCLMULQDQ_capable()); -} -#endif - #if defined(OPENSSL_X86) || defined(OPENSSL_X86_64) #define HWAES #define HWAES_ECB - +#define VPAES +#define VPAES_CBC OPENSSL_INLINE int hwaes_capable(void) { return CRYPTO_is_AESNI_capable(); } +OPENSSL_INLINE int vpaes_capable(void) { return CRYPTO_is_SSSE3_capable(); } -#define VPAES #if defined(OPENSSL_X86_64) #define VPAES_CTR32 #define HWAES_XTS OPENSSL_INLINE int hwaes_xts_available(void) { return CRYPTO_is_AESNI_capable(); } +OPENSSL_INLINE int avx512_xts_available(void) { + return (CRYPTO_is_VAES_capable() && + CRYPTO_is_VBMI2_capable() && + CRYPTO_is_AVX512_capable() && + CRYPTO_is_VPCLMULQDQ_capable()); +} #endif -#define VPAES_CBC -OPENSSL_INLINE int vpaes_capable(void) { return CRYPTO_is_SSSE3_capable(); } #elif defined(OPENSSL_ARM) || defined(OPENSSL_AARCH64) #define HWAES +#define VPAES +#define VPAES_CTR32 OPENSSL_INLINE int hwaes_capable(void) { return CRYPTO_is_ARMv8_AES_capable(); } +OPENSSL_INLINE int vpaes_capable(void) { return CRYPTO_is_NEON_capable(); } #if defined(OPENSSL_ARM) #define BSAES -#define VPAES -#define VPAES_CTR32 -OPENSSL_INLINE int bsaes_capable(void) { return CRYPTO_is_NEON_capable(); } -OPENSSL_INLINE int vpaes_capable(void) { return CRYPTO_is_NEON_capable(); } #endif #if defined(OPENSSL_AARCH64) -#define VPAES #define VPAES_CBC -#define VPAES_CTR32 #define HWAES_XTS -OPENSSL_INLINE int vpaes_capable(void) { return CRYPTO_is_NEON_capable(); } OPENSSL_INLINE int hwaes_xts_available(void) { // same as hwaes_capable() return CRYPTO_is_ARMv8_AES_capable(); @@ -81,6 +73,7 @@ OPENSSL_INLINE int hwaes_xts_available(void) { #endif #elif defined(OPENSSL_PPC64LE) + #define HWAES OPENSSL_INLINE int hwaes_capable(void) { diff --git a/crypto/fipsmodule/cipher/e_aes.c b/crypto/fipsmodule/cipher/e_aes.c index 54f40abdb7c..0c09c6eb587 100644 --- a/crypto/fipsmodule/cipher/e_aes.c +++ b/crypto/fipsmodule/cipher/e_aes.c @@ -160,8 +160,7 @@ static int aes_init_key(EVP_CIPHER_CTX *ctx, const uint8_t *key, if (mode == EVP_CIPH_CBC_MODE) { dat->stream.cbc = aes_hw_cbc_encrypt; } - } else if (bsaes_capable() && mode == EVP_CIPH_CBC_MODE) { - assert(vpaes_capable()); + } else if (vpaes_capable() && mode == EVP_CIPH_CBC_MODE) { ret = vpaes_set_decrypt_key(key, ctx->key_len * 8, &dat->ks.ks); if (ret == 0) { vpaes_decrypt_key_to_bsaes(&dat->ks.ks, &dat->ks.ks); @@ -206,7 +205,7 @@ static int aes_init_key(EVP_CIPHER_CTX *ctx, const uint8_t *key, #endif if (mode == EVP_CIPH_CTR_MODE) { #if defined(BSAES) - assert(bsaes_capable()); + assert(vpaes_capable()); dat->stream.ctr = vpaes_ctr32_encrypt_blocks_with_bsaes; #elif defined(VPAES_CTR32) dat->stream.ctr = vpaes_ctr32_encrypt_blocks; @@ -288,7 +287,8 @@ ctr128_f aes_ctr_set_key(AES_KEY *aes_key, GCM128_KEY *gcm_key, block128_f *out_block, const uint8_t *key, size_t key_bytes) { // This function assumes the key length was previously validated. - assert(key_bytes == 128 / 8 || key_bytes == 192 / 8 || key_bytes == 256 / 8); + assert(key_bytes == 16 || key_bytes == 24 || key_bytes == 32); + if (hwaes_capable()) { aes_hw_set_encrypt_key(key, (int)key_bytes * 8, aes_key); if (gcm_key != NULL) { @@ -300,7 +300,9 @@ ctr128_f aes_ctr_set_key(AES_KEY *aes_key, GCM128_KEY *gcm_key, return aes_hw_ctr32_encrypt_blocks_wrapper; } - if (vpaes_capable()) { + +#if defined(BSAES) + if (vpaes_capable()) { vpaes_set_encrypt_key(key, (int)key_bytes * 8, aes_key); if (out_block) { *out_block = vpaes_encrypt_wrapper; @@ -308,15 +310,22 @@ ctr128_f aes_ctr_set_key(AES_KEY *aes_key, GCM128_KEY *gcm_key, if (gcm_key != NULL) { CRYPTO_gcm128_init_key(gcm_key, aes_key, vpaes_encrypt_wrapper, 0); } -#if defined(BSAES) - assert(bsaes_capable()); return vpaes_ctr32_encrypt_blocks_with_bsaes; -#elif defined(VPAES_CTR32) - return vpaes_ctr32_encrypt_blocks_wrapper; -#else - return NULL; + } #endif + +#if defined(VPAES_CTR32) + if (vpaes_capable()) { + vpaes_set_encrypt_key(key, (int)key_bytes * 8, aes_key); + if (out_block) { + *out_block = vpaes_encrypt_wrapper; + } + if (gcm_key != NULL) { + CRYPTO_gcm128_init_key(gcm_key, aes_key, vpaes_encrypt_wrapper, 0); + } + return vpaes_ctr32_encrypt_blocks_wrapper; } +#endif aes_nohw_set_encrypt_key(key, (int)key_bytes * 8, aes_key); if (gcm_key != NULL) {