diff --git a/lib/freebl/blinit.c b/lib/freebl/blinit.c index 3bdccd8a5c..050b32113e 100644 --- a/lib/freebl/blinit.c +++ b/lib/freebl/blinit.c @@ -17,6 +17,10 @@ #include /* for _xgetbv() */ #endif +#if defined(_WIN64) && defined(__aarch64__) +#include +#endif + static PRCallOnceType coFreeblInit; /* State variables. */ @@ -149,6 +153,13 @@ CheckARMSupport() char *disable_arm_neon = PR_GetEnvSecure("NSS_DISABLE_ARM_NEON"); char *disable_hw_aes = PR_GetEnvSecure("NSS_DISABLE_HW_AES"); char *disable_pmull = PR_GetEnvSecure("NSS_DISABLE_PMULL"); +#if defined(_WIN64) + BOOL arm_crypto_support = IsProcessorFeaturePresent(PF_ARM_V8_CRYPTO_INSTRUCTIONS_AVAILABLE); + arm_aes_support_ = arm_crypto_support && disable_hw_aes == NULL; + arm_pmull_support_ = arm_crypto_support && disable_pmull == NULL; + arm_sha1_support_ = arm_crypto_support; + arm_sha2_support_ = arm_crypto_support; +#else if (getauxval) { long hwcaps = getauxval(AT_HWCAP); arm_aes_support_ = hwcaps & HWCAP_AES && disable_hw_aes == NULL; @@ -156,6 +167,7 @@ CheckARMSupport() arm_sha1_support_ = hwcaps & HWCAP_SHA1; arm_sha2_support_ = hwcaps & HWCAP_SHA2; } +#endif /* aarch64 must support NEON. */ arm_neon_support_ = disable_arm_neon == NULL; } diff --git a/lib/freebl/ctr.c b/lib/freebl/ctr.c index 67ee72c0ca..239a60da24 100644 --- a/lib/freebl/ctr.c +++ b/lib/freebl/ctr.c @@ -13,7 +13,9 @@ #include "secerr.h" #ifdef USE_HW_AES +#ifdef NSS_X86_OR_X64 #include "intel-aes.h" +#endif #include "rijndael.h" #endif @@ -207,7 +209,7 @@ CTR_Update(CTRContext *ctr, unsigned char *outbuf, return SECSuccess; } -#if defined(USE_HW_AES) && defined(_MSC_VER) +#if defined(USE_HW_AES) && defined(_MSC_VER) && defined(NSS_X86_OR_X64) SECStatus CTR_Update_HW_AES(CTRContext *ctr, unsigned char *outbuf, unsigned int *outlen, unsigned int maxout, diff --git a/lib/freebl/freebl.gyp b/lib/freebl/freebl.gyp index 9a59486d76..0b05a2b246 100644 --- a/lib/freebl/freebl.gyp +++ b/lib/freebl/freebl.gyp @@ -349,7 +349,7 @@ 'intel-gcm-wrap_c_lib', ], }], - [ 'OS=="win" and cc_is_clang==1', { + [ 'OS=="win" and (target_arch=="ia32" or target_arch=="x64") and cc_is_clang==1', { 'dependencies': [ 'intel-gcm-wrap_c_lib', ], @@ -482,6 +482,11 @@ }, }, }], + [ 'OS=="win" and (target_arch=="arm64" or target_arch=="aarch64") and disable_arm_hw_aes==0', { + 'defines': [ + 'USE_HW_AES', + ], + }], [ 'cc_use_gnu_ld==1 and OS=="win" and target_arch=="x64"', { # mingw x64 'defines': [ diff --git a/lib/freebl/rijndael.c b/lib/freebl/rijndael.c index fbf229aa5e..40364fce0f 100644 --- a/lib/freebl/rijndael.c +++ b/lib/freebl/rijndael.c @@ -989,7 +989,7 @@ AES_InitContext(AESContext *cx, const unsigned char *key, unsigned int keysize, break; case NSS_AES_CTR: cx->worker_cx = CTR_CreateContext(cx, cx->worker, iv); -#if defined(USE_HW_AES) && defined(_MSC_VER) +#if defined(USE_HW_AES) && defined(_MSC_VER) && defined(NSS_X86_OR_X64) if (aesni_support() && (keysize % 8) == 0) { cx->worker = (freeblCipherFunc)CTR_Update_HW_AES; } else