diff --git a/gcm.cpp b/gcm.cpp index 5341f36e..c3e117bd 100644 --- a/gcm.cpp +++ b/gcm.cpp @@ -333,7 +333,7 @@ unsigned int GCM_Base::OptimalDataAlignment() const #if CRYPTOPP_BOOL_SSE2_ASM_AVAILABLE || defined(CRYPTOPP_X64_MASM_AVAILABLE) HasSSE2() ? 16 : #elif CRYPTOPP_ARM_NEON_AVAILABLE - HasNEON() ? 16 : + HasNEON() ? 4 : #endif GetBlockCipher().OptimalDataAlignment(); } diff --git a/rijndael-simd.cpp b/rijndael-simd.cpp index 17cb8a89..3a0a700f 100644 --- a/rijndael-simd.cpp +++ b/rijndael-simd.cpp @@ -52,6 +52,10 @@ # include #endif +#if defined(__APPLE__) && defined(__aarch64__) +# include +#endif + #ifndef EXCEPTION_EXECUTE_HANDLER # define EXCEPTION_EXECUTE_HANDLER 1 #endif @@ -110,6 +114,27 @@ bool CPU_TryAES_ARMV8() # elif defined(__linux__) && defined(__aarch32__) if (getauxval(AT_HWCAP2) & HWCAP2_AES) return true; +# elif defined(__APPLE__) + { + // https://stackoverflow.com/a/11197770/608639 + // https://gist.github.com/erkanyildiz/390a480f27e86f8cd6ba + struct utsname systemInfo; + systemInfo.machine[0] = '\0'; + uname(&systemInfo); + const char* machine = systemInfo.machine; + + if (0==strcmp(machine, "iPhone6,1") || 0==strcmp(machine, "iPhone6,2") || + 0==strcmp(machine, "iPhone7,1") || 0==strcmp(machine, "iPhone7,2") || + 0==strcmp(machine, "iPad4,1") || 0==strcmp(machine, "iPad4,2") || + 0==strcmp(machine, "iPad4,3") || 0==strcmp(machine, "iPad4,4") || + 0==strcmp(machine, "iPad4,5") || 0==strcmp(machine, "iPad4,6") || + 0==strcmp(machine, "iPad4,7") || 0==strcmp(machine, "iPad4,8") || + 0==strcmp(machine, "iPad4,9") || + 0==strcmp(machine, "iPad5,3") || 0==strcmp(machine, "iPad5,4") ) + { + return true; + } + } # endif // longjmp and clobber warnings. Volatile is required. diff --git a/rijndael.cpp b/rijndael.cpp index 256630c9..e04d323c 100644 --- a/rijndael.cpp +++ b/rijndael.cpp @@ -4,6 +4,10 @@ // use "cl /EP /P /DCRYPTOPP_GENERATE_X64_MASM rijndael.cpp" to generate MASM code +/* +July 2017: Added support for ARM AES instructions via compiler intrinsics. +*/ + /* July 2010: Added support for AES-NI instructions via compiler intrinsics. */