Поддерживает ли iPhone аппаратное ускорение AES?

Я мог найти ссылки на "аппаратное ускорение AES-шифрования" на iPhone/iPad. Но API-интерфейсы, которые я мог бы найти для шифрования AES (CCCrypt), вообще не говорят об аппаратном ускорении.

Кто-нибудь есть идеи, являются ли эти API-интерфейсы аппаратными ускорениями или есть другие?

Ответы

Ответ 1

Да.

Начиная с версии 4.3, если сообщение имеет > 64 блока (то есть 1024 байта), функция CCCrypt для AES будет использовать аппаратную ускоренную реализацию. (Это делается с помощью ioctl ing с /dev/aes_0, BTW.)

Помимо AES, SHA-1 также аппаратно ускоряется, когда вход составляет > 4096 байтов.

Ответ 2

Вся суть API заключается в том, что вам не нужно заботиться о деталях реализации, которые его поддерживают. Разработчик (в данном случае Apple) будет использовать любую реализацию, обеспечивающую лучшие характеристики производительности и энергопотребления для любого используемого оборудования. Это может быть аппаратная реализация, или это может быть программная реализация, она может зависеть от размера блока, для которого вы вызываете функцию.

Ответ 3

Поддерживает ли iPhone аппаратное ускорение AES-шифрования?

Это зависит от версии iPhone и аппаратного обеспечения, но в основном ДА в 2015 году.

Apple использует его для быстрой "удаленной очистки" для управляемых устройств. Идея заключается в том, что все зашифровано, а ключи хранятся в keybag, поддерживаемом стираемым хранилищем ( "effaçable" является французским для "erasable" ). Для получения дополнительной информации см. Jean-Baptiste Bérrune и Jean Sigwald глубокая защита данных iPhone; и Dino Zavi Оценка безопасности Apple iOS 4.

Схема помещается в datapath DMA между хранилищем и памятью, поэтому все, что проходит по пути, зашифровывается или дешифруется.

Если устройство потеряно или украдено, на устройство может быть отправлена ​​команда для стирания клавиатуры, содержащей ключи, используемые для шифрования и дешифрования. Так как в багажном отделении поддерживается сбрасываемое хранилище, ключи не перемещаются из-за износа.

Похоже, Apple предоставляет аппаратное ускорение AES из по меньшей мере двух источников на устройствах iOS. Оба завернуты в Apple CommonCrypto. По крайней мере, один из них доступен для программиста без необходимости использования CommonCrypto.


Первый аппаратный ускоренный источник

Первым источником является стандартная кривая ARM, доступная в ARMv8 и выше. Инструкции доступны как для Cins и С++, так и для сборки, когда __ARM_FEATURE_CRYPTO определен:

$ 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

Связанный с этим вопрос Какой аппаратный чип/поставщик использует Apple для своего аппаратного ускорения AES/SHA-1?


Здесь некоторый код который мы используем для 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.