/* * Function: neonIsEnabled * Purpose: Check if libcrypto is compiled with NEON support * Parameters: none * Returns: boolean: (true) if NEON is available, (false) otherwise * Exceptions: none */ static jboolean android_security_cts_EncryptionTest_neonIsEnabled(JNIEnv *, jobject) { #if defined(OPENSSL_ARM) || defined(OPENSSL_AARCH64) jboolean rc = CRYPTO_is_NEON_capable(); #else jboolean rc = false; #endif ALOGE("EncryptionTest::neonIsEnabled: %d", rc); return rc; }
void OPENSSL_cpuid_setup(void) { if (getauxval == NULL) { // On ARM, but not AArch64, try a NEON instruction and see whether it works // in order to probe for NEON support. // // Note that |CRYPTO_is_NEON_capable| can be true even if // |CRYPTO_set_NEON_capable| has never been called if the code was compiled // with NEON support enabled (e.g. -mfpu=neon). if (!g_set_neon_called && !CRYPTO_is_NEON_capable() && probe_for_NEON()) { OPENSSL_armcap_P |= ARMV7_NEON; } return; } static const unsigned long AT_HWCAP = 16; unsigned long hwcap = getauxval(AT_HWCAP); #if defined(OPENSSL_ARM) static const unsigned long kNEON = 1 << 12; if ((hwcap & kNEON) == 0) { return; } /* In 32-bit mode, the ARMv8 feature bits are in a different aux vector * value. */ static const unsigned long AT_HWCAP2 = 26; hwcap = getauxval(AT_HWCAP2); /* See /usr/include/asm/hwcap.h on an ARM installation for the source of * these values. */ static const unsigned long kAES = 1 << 0; static const unsigned long kPMULL = 1 << 1; static const unsigned long kSHA1 = 1 << 2; static const unsigned long kSHA256 = 1 << 3; #elif defined(OPENSSL_AARCH64) /* See /usr/include/asm/hwcap.h on an aarch64 installation for the source of * these values. */ static const unsigned long kNEON = 1 << 1; static const unsigned long kAES = 1 << 3; static const unsigned long kPMULL = 1 << 4; static const unsigned long kSHA1 = 1 << 5; static const unsigned long kSHA256 = 1 << 6; if ((hwcap & kNEON) == 0) { return; } #endif OPENSSL_armcap_P |= ARMV7_NEON; if (hwcap & kAES) { OPENSSL_armcap_P |= ARMV8_AES; } if (hwcap & kPMULL) { OPENSSL_armcap_P |= ARMV8_PMULL; } if (hwcap & kSHA1) { OPENSSL_armcap_P |= ARMV8_SHA1; } if (hwcap & kSHA256) { OPENSSL_armcap_P |= ARMV8_SHA256; } }
static char bsaes_capable() { return CRYPTO_is_NEON_capable(); }