2011-01-27 156 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.