iPhone是否支持硬件加速的AES加密?

时间:2011-01-27 03:36:09

标签: ios aes hardware-acceleration cryptography

我可以在iPhone / iPad上找到对“硬件加速AES加密”的引用。但我可以找到进行AES加密的API(CCCrypt)根本不讨论硬件加速。

有没有人知道这些API是硬件加速的还是其他API?

3 个答案:

答案 0 :(得分:20)

从4.3开始,如果消息具有> 64个块(即1024个字节),则AES的CCCrypt函数将使用硬件加速实现。 (这是通过ioctl/dev/aes_0,BTW完成的。)

除了AES之外,当输入为>时,SHA-1也是硬件加速的。 4096字节。

答案 1 :(得分:3)

API的重点在于您无需关心支持它的实现细节。实现者(在本例中为Apple)将使用任何实现,在所使用的任何硬件上提供最佳性能和能量使用特性。这可能是硬件实现,也可能是软件实现,它可能取决于您调用函数的块大小。

答案 2 :(得分:2)

  

iPhone是否支持硬件加速的AES加密?

这取决于iPhone的版本和硬件,但2015年大部分都是YES。

Apple将其用于托管设备的快速“远程擦除”功能。这个想法是一切都是加密的,密钥存储在一个由 effaceable storage 支持的密钥包中(“effaçable”是法语中的“可擦除”)。有关更多信息,请参阅Jean-BaptisteBédrune和Jean Sigwald iPhone data protection in depth;和Dino Zavi的Apple iOS 4 Security Evaluation

电路位于存储和内存之间的DMA数据路径上,因此任何遍历路径的都会被加密或解密。

如果设备丢失或被盗,则可以向设备发送命令以擦除保存用于加密和解密的密钥的密钥包。因为钥匙包由可擦除的存储支撑,所以钥匙不会因磨损平衡而移动。

Apple似乎从iOS设备上的至少两个来源提供硬件加速AES。两者都由Apple的CommonCrypto框架包装。程序员似乎至少有一个可用,而不需要CommonCrypto。

第一个硬件加速源

第一个来源是ARMv8及更高版本中可用的标准ARM加密。在定义__ARM_FEATURE_CRYPTO时,指令既可用作C / C ++内部函数,也可用于汇编:

$ 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。

第二个硬件加速源

第二个来源似乎是自定义的,它存在于ARMv7及更低版本中。我不确定如何使用此加密(也许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.