@@ -36,13 +36,13 @@ class ImplDispatchTest : public ::testing::Test {
36
36
public:
37
37
void SetUp () override {
38
38
#if defined(OPENSSL_X86) || defined(OPENSSL_X86_64)
39
- aesni_ = CRYPTO_is_AESNI_capable ();
39
+ aes_hw_ = CRYPTO_is_AESNI_capable ();
40
40
avx_movbe_ = CRYPTO_is_AVX_capable () && CRYPTO_is_MOVBE_capable ();
41
- ssse3_ = CRYPTO_is_SSSE3_capable ();
41
+ aes_vpaes_ = CRYPTO_is_SSSE3_capable ();
42
42
sha_ext_ = CRYPTO_is_SHAEXT_capable ();
43
- vaes_vpclmulqdq_ =
44
- (OPENSSL_ia32cap_P[ 2 ] & 0xC0030000 ) && // AVX512{F+DQ+BW+VL}
45
- (((OPENSSL_ia32cap_P[ 3 ] >> 9 ) & 0x3 ) == 0x3 ); // VAES + VPCLMULQDQ
43
+ vaes_vpclmulqdq_ = CRYPTO_is_AVX512_capable () &&
44
+ CRYPTO_is_VAES_capable () &&
45
+ CRYPTO_is_VPCLMULQDQ_capable ();
46
46
is_x86_64_ =
47
47
#if defined(OPENSSL_X86_64)
48
48
true ;
@@ -61,7 +61,14 @@ class ImplDispatchTest : public ::testing::Test {
61
61
#else
62
62
false ;
63
63
#endif // MY_ASSEMBLER_IS_TOO_OLD_FOR_512AVX
64
- #endif // X86 || X86_64
64
+ #elif defined(OPENSSL_AARCH64)
65
+ aes_hw_ = CRYPTO_is_ARMv8_AES_capable ();
66
+ aes_vpaes_ = CRYPTO_is_NEON_capable ();
67
+ aes_gcm_pmull_ = CRYPTO_is_ARMv8_PMULL_capable ();
68
+ aes_gcm_8x_ = CRYPTO_is_ARMv8_GCM_8x_capable ();
69
+ sha_ext_ = OPENSSL_armcap_P & ARMV8_SHA256;
70
+ sha_512_ext_ = OPENSSL_armcap_P & ARMV8_SHA512;
71
+ #endif
65
72
}
66
73
67
74
protected:
@@ -88,50 +95,70 @@ class ImplDispatchTest : public ::testing::Test {
88
95
}
89
96
}
90
97
98
+ bool aes_hw_ = false ;
99
+ bool aes_vpaes_ = false ;
100
+ bool sha_ext_ = false ;
91
101
#if defined(OPENSSL_X86) || defined(OPENSSL_X86_64)
92
102
bool vaes_vpclmulqdq_ = false ;
93
- bool aesni_ = false ;
94
103
bool avx_movbe_ = false ;
95
- bool ssse3_ = false ;
96
- bool sha_ext_ = false ;
97
104
bool is_x86_64_ = false ;
98
105
bool is_assembler_too_old = false ;
99
106
bool is_assembler_too_old_avx512 = false ;
107
+ #else // AARCH64
108
+ bool aes_gcm_pmull_ = false ;
109
+ bool aes_gcm_8x_ = false ;
110
+ bool sha_512_ext_ = false ;
100
111
#endif
112
+
101
113
};
102
114
103
- #if !defined(OPENSSL_NO_ASM) && \
104
- ( defined(OPENSSL_X86 ) || defined(OPENSSL_X86_64 ))
115
+ #if !defined(OPENSSL_NO_ASM) && (defined(OPENSSL_X86) || \
116
+ defined (OPENSSL_X86_64 ) || defined(OPENSSL_AARCH64 ))
105
117
106
118
constexpr size_t kFlag_aes_hw_ctr32_encrypt_blocks = 0;
107
119
constexpr size_t kFlag_aes_hw_encrypt = 1 ;
108
- constexpr size_t kFlag_aesni_gcm_encrypt = 2 ;
109
120
constexpr size_t kFlag_aes_hw_set_encrypt_key = 3 ;
110
121
constexpr size_t kFlag_vpaes_encrypt = 4 ;
111
122
constexpr size_t kFlag_vpaes_set_encrypt_key = 5 ;
112
- constexpr size_t kFlag_sha256_shaext = 6 ;
123
+ constexpr size_t kFlag_sha256_hw = 6 ;
124
+ #if defined(OPENSSL_X86) || defined(OPENSSL_X86_64)
125
+ constexpr size_t kFlag_aesni_gcm_encrypt = 2 ;
113
126
constexpr size_t kFlag_aes_gcm_encrypt_avx512 = 7 ;
127
+ #else // AARCH64
128
+ constexpr size_t kFlag_aes_gcm_enc_kernel = 2 ;
129
+ constexpr size_t kFlag_aesv8_gcm_8x_enc_128 = 7 ;
130
+ constexpr size_t kFlag_sha512_hw = 8 ;
131
+ #endif
114
132
115
133
TEST_F (ImplDispatchTest, AEAD_AES_GCM) {
116
134
AssertFunctionsHit (
117
135
{
118
- {kFlag_aes_hw_ctr32_encrypt_blocks , aesni_ &&
136
+ {kFlag_aes_hw_encrypt , aes_hw_},
137
+ {kFlag_aes_hw_set_encrypt_key , aes_hw_},
138
+ {kFlag_vpaes_encrypt , aes_vpaes_ && !aes_hw_},
139
+ {kFlag_vpaes_set_encrypt_key , aes_vpaes_ && !aes_hw_},
140
+ #if defined(OPENSSL_X86) || defined(OPENSSL_X86_64)
141
+ {kFlag_aes_hw_ctr32_encrypt_blocks , aes_hw_ &&
119
142
(is_assembler_too_old || !vaes_vpclmulqdq_)},
120
- {kFlag_aes_hw_encrypt , aesni_},
121
- {kFlag_aes_hw_set_encrypt_key , aesni_},
122
143
{kFlag_aesni_gcm_encrypt ,
123
- is_x86_64_ && aesni_ && avx_movbe_ &&
144
+ is_x86_64_ && aes_hw_ && avx_movbe_ &&
124
145
!is_assembler_too_old && !vaes_vpclmulqdq_},
125
- {kFlag_vpaes_encrypt , ssse3_ && !aesni_},
126
- {kFlag_vpaes_set_encrypt_key , ssse3_ && !aesni_},
127
146
{kFlag_aes_gcm_encrypt_avx512 ,
128
- is_x86_64_ && aesni_ &&
147
+ is_x86_64_ && aes_hw_ &&
129
148
!is_assembler_too_old_avx512 &&
130
149
vaes_vpclmulqdq_},
150
+ #else // AARCH64
151
+ {kFlag_aes_hw_ctr32_encrypt_blocks , aes_hw_ &&
152
+ !aes_gcm_pmull_ && !aes_gcm_8x_},
153
+ {kFlag_aes_gcm_enc_kernel , aes_hw_ &&
154
+ aes_gcm_pmull_ && !aes_gcm_8x_},
155
+ {kFlag_aesv8_gcm_8x_enc_128 , aes_hw_ &&
156
+ aes_gcm_pmull_ && aes_gcm_8x_}
157
+ #endif
131
158
},
132
159
[] {
133
160
const uint8_t kZeros [16 ] = {0 };
134
- const uint8_t kPlaintext [40 ] = {1 , 2 , 3 , 4 , 0 };
161
+ const uint8_t kPlaintext [256 ] = {1 , 2 , 3 , 4 , 0 };
135
162
uint8_t ciphertext[sizeof (kPlaintext ) + 16 ];
136
163
size_t ciphertext_len;
137
164
bssl::ScopedEVP_AEAD_CTX ctx;
@@ -148,8 +175,8 @@ TEST_F(ImplDispatchTest, AEAD_AES_GCM) {
148
175
TEST_F (ImplDispatchTest, AES_set_encrypt_key) {
149
176
AssertFunctionsHit (
150
177
{
151
- {kFlag_aes_hw_set_encrypt_key , aesni_ },
152
- {kFlag_vpaes_set_encrypt_key , ssse3_ && !aesni_ },
178
+ {kFlag_aes_hw_set_encrypt_key , aes_hw_ },
179
+ {kFlag_vpaes_set_encrypt_key , aes_vpaes_ && !aes_hw_ },
153
180
},
154
181
[] {
155
182
AES_KEY key;
@@ -165,8 +192,8 @@ TEST_F(ImplDispatchTest, AES_single_block) {
165
192
166
193
AssertFunctionsHit (
167
194
{
168
- {kFlag_aes_hw_encrypt , aesni_ },
169
- {kFlag_vpaes_encrypt , ssse3_ && !aesni_ },
195
+ {kFlag_aes_hw_encrypt , aes_hw_ },
196
+ {kFlag_vpaes_encrypt , aes_vpaes_ && !aes_hw_ },
170
197
},
171
198
[&key] {
172
199
uint8_t in[AES_BLOCK_SIZE] = {0 };
@@ -178,7 +205,7 @@ TEST_F(ImplDispatchTest, AES_single_block) {
178
205
TEST_F (ImplDispatchTest, SHA256) {
179
206
AssertFunctionsHit (
180
207
{
181
- {kFlag_sha256_shaext , sha_ext_},
208
+ {kFlag_sha256_hw , sha_ext_},
182
209
},
183
210
[] {
184
211
const uint8_t in[32 ] = {0 };
@@ -187,6 +214,20 @@ TEST_F(ImplDispatchTest, SHA256) {
187
214
});
188
215
}
189
216
190
- #endif // X86 || X86_64
217
+ #ifdef OPENSSL_AARCH64
218
+ TEST_F (ImplDispatchTest, SHA512) {
219
+ AssertFunctionsHit (
220
+ {
221
+ {kFlag_sha512_hw , sha_512_ext_},
222
+ },
223
+ [] {
224
+ const uint8_t in[32 ] = {0 };
225
+ uint8_t out[SHA512_DIGEST_LENGTH];
226
+ SHA512 (in, 32 , out);
227
+ });
228
+ }
229
+ #endif // OPENSSL_AARCH64
230
+
231
+ #endif // !OPENSSL_NO_ASM && (OPENSSL_X86 || OPENSSL_X86_64 || OPENSSL_AARCH64)
191
232
192
233
#endif // DISPATCH_TEST && !SHARED_LIBRARY
0 commit comments