2011-01-27 155 views
15

我可以在iPhone/iPad上找到對「硬件加速的AES加密」的參考。但是我可以找到的用於執行AES加密的API(CCCrypt)根本不談論硬件加速。iPhone是否支持硬件加速的AES加密?

有沒有人有任何想法,如果這些API是硬件加速或有其他的?

+2

我的理解是蘋果公司不會告訴你它是否是硬件加速與否,但將只提供CommonCryptor東西對你來說...我想它會在支持它的設備上進行硬件加速,如果沒有的話,計劃軟件。 – Romain 2011-03-21 09:29:36

+1

值得注意的是,以下注釋出現在CryptoExercise代碼(SecKeyWrapper.h:60-62)中: __ //爲此示例選擇的所選對稱密鑰和摘要算法是AES和SHA1。 //這背後的原因是因爲iPhone和iPod touch具有 //這些特定算法的硬件加速器,因此節能.__ – 2012-07-24 16:22:57

回答

19

是的。

從4.3開始,如果消息具有> 64個塊(即1024個字節),則AES的CCCrypt函數將使用硬件加速實現。 (這是通過ioctl/dev/aes_0,順便說一句來完成的)。

除了AES,當輸入大於4096字節時,SHA-1也是硬件加速的。

+2

您是否有任何指向Apple文檔的鏈接? – Bala 2011-03-24 14:55:38

3

API的重點在於您無需關心支持它的實現細節。實現者(在這種情況下,蘋果公司)將使用任何實現方式,在任何正在使用的硬件上提供最佳的性能和能量使用特性。這可能是一個硬件實現,或者它可能是一個軟件實現,它可能取決於您調用該函數的塊大小。

2

iPhone支持硬件加速的AES加密嗎?

這取決於iPhone版本和硬件,但大多是在2015年

蘋果使用它的快速「遠程擦除」功能爲管理的設備。這個想法是一切都加密,鑰匙存儲在一個鑰匙包,由可消除存儲(「effaçable」是法語爲「可擦除」)。欲瞭解更多信息,請參閱Jean-BaptisteBédrune和Jean Sigwald iPhone data protection in depth;和Dino Zavi的Apple iOS 4 Security Evaluation

該電路放置在存儲器和內存之間的DMA數據路徑上,因此任何遍歷該路徑的內容都將被加密或解密。

如果設備丟失或被盜,則可以向設備發送命令以擦除保存用於加密和解密的密鑰的密鑰包。由於鑰匙包由可擦除存儲支撐,鑰匙不會因損耗均衡而移動。

看起來蘋果提供了來自iOS設備上至少兩個來源的硬件加速AES。兩者都被Apple的CommonCrypto框架包裝。至少有一個似乎可供程序員使用,而不需要使用CommonCrypto。


第一硬件加速源

第一個來源是在ARMv8和上述可用標準的ARM加密。當被定義__ARM_FEATURE_CRYPTO所述指令可作爲兩個C/C++ intinsics和組件:

$ clang++ -arch arm64 -dM -E - < /dev/null | sort | egrep -i '(arm|aarch|neon)' 
#define __AARCH64EL__ 1 
#define __AARCH64_SIMD__ 1 
#define __ARM64_ARCH_8__ 1 
#define __ARM_64BIT_STATE 1 
#define __ARM_ACLE 200 
#define __ARM_ALIGN_MAX_STACK_PWR 4 
#define __ARM_ARCH 8 
#define __ARM_ARCH_ISA_A64 1 
#define __ARM_ARCH_PROFILE 'A' 
#define __ARM_FEATURE_CLZ 1 
#define __ARM_FEATURE_CRYPTO 1 
#define __ARM_FEATURE_DIV 1 
#define __ARM_FEATURE_FMA 1 
#define __ARM_FEATURE_UNALIGNED 1 
#define __ARM_FP 0xe 
#define __ARM_FP16_FORMAT_IEEE 1 
#define __ARM_FP_FENV_ROUNDING 1 
#define __ARM_NEON 1 
#define __ARM_NEON_FP 7 
#define __ARM_NEON__ 1 
#define __ARM_PCS_AAPCS64 1 
#define __ARM_SIZEOF_MINIMAL_ENUM 4 
#define __ARM_SIZEOF_WCHAR_T 4 
#define __aarch64__ 1 
#define __arm64 1 
#define __arm64__ 1 

順便提及,當被定義__ARM_FEATURE_CRYPTO,應該可以訪問硬件加速SHA-1和SHA-2,也。


第二硬件加速源

第二源似乎是自定義的,其在ARMv7s和下面存在。我不知道怎麼去這個加密(也許opensource.apple.com有答案):

$ clang++ -arch armv7s -dM -E - < /dev/null | sort | egrep -i '(arm|aarch|neon|crc|crypto)' 
#define __ARMEL__ 1 
#define __ARM_ARCH 7 
#define __ARM_ARCH_7S__ 1 
#define __ARM_ARCH_EXT_IDIV__ 1 
#define __ARM_NEON 1 
#define __ARM_NEON__ 1 
#define __ARM_SIZEOF_MINIMAL_ENUM 4 
#define __ARM_SIZEOF_WCHAR_T 4 
#define __ARM_VFPV4__ 1 
#define __arm 1 
#define __arm__ 1 

和:

$ clang++ -arch armv7 -dM -E - < /dev/null | sort | egrep -i '(arm|aarch|neon|crc|crypto)' 
#define __ARMEL__ 1 
#define __ARM_ARCH 7 
#define __ARM_ARCH_7A__ 1 
#define __ARM_ARCH_PROFILE A 
#define __ARM_NEON 1 
#define __ARM_NEON__ 1 
#define __ARM_SIZEOF_MINIMAL_ENUM 4 
#define __ARM_SIZEOF_WCHAR_T 4 
#define __ARM_VFPV3__ 1 
#define __arm 1 
#define __arm__ 1 

一個相關的問題是Which hardware chip/vendor does Apple use for its hardware-accelerated AES/SHA-1 encryption?


下面是一些代碼we are using for iOS。它測試ARM Crypto指令的運行時支持。因爲代碼是基於內部的,所以相同的代碼用於iOS,Linux,Windows Phone和Windows Store。在iOS的情況下,在指定-arch arm64時使用。

#if (BOOL_ARM32 || BOOL_ARM64) && (/* other support tests */) 
# define BOOL_ARM_CRYPTO_INTRINSICS_AVAILABLE 1 
#endif 
... 

static bool TryCrypto() 
{ 
#if (BOOL_ARM_CRYPTO_INTRINSICS_AVAILABLE) 
# if defined(_WIN32) || defined(_WIN64) 
    __try 
    { 
     // AES encrypt and decrypt 
     static const uint8x16_t data = vdupq_n_u8(0), key = vdupq_n_u8(0); 
     uint8x16_t r1 = vaeseq_u8(data, key); 
     uint8x16_t r2 = vaesdq_u8(data, key); 
    } 
    __except (EXCEPTION_EXECUTE_HANDLER) 
    { 
     return false; 
    } 
    return true; 
# else 
    // longjmp and clobber warnings. Volatile is required. 
    volatile bool result = true; 

    SigHandler oldHandler = signal(SIGILL, SigIllHandlerCrypto); 
    if (oldHandler == SIG_ERR) 
     result = false; 

    if (setjmp(s_jmpNoCrypto)) 
     result = false; 
    else 
    { 
     // AES encrypt and decrypt 
     static const uint8x16_t data = vdupq_n_u8(0), key = vdupq_n_u8(0); 
     uint8x16_t r1 = vaeseq_u8(data, key); 
     uint8x16_t r2 = vaesdq_u8(data, key); 
    } 

    signal(SIGILL, oldHandler); 
    return result; 
# endif 
#else 
    return false; 
#endif 
} 

這裏是它看起來像在命令行編譯期間:

clang++ -DNDEBUG -g2 -O3 -fPIC -pipe -Wall -miphoneos-version-min=7 -arch arm64 -stdlib=libc++ -isysroot 
/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS8.2.sdk 
-c cpu.cpp 
cpu.cpp:438:14: warning: unused variable 'r1' [-Wunused-variable] 
       uint8x16_t r1 = vaeseq_u8(data, key); 
         ^
cpu.cpp:439:14: warning: unused variable 'r2' [-Wunused-variable] 
       uint8x16_t r2 = vaesdq_u8(data, key); 
         ^
2 warnings generated.