Поддерживает ли iPhone аппаратно-ускоренное шифрование AES? - PullRequest
16 голосов
/ 27 января 2011

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

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

Ответы [ 3 ]

20 голосов
/ 22 марта 2011

Да.

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

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

3 голосов
/ 07 июля 2011

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

2 голосов
/ 15 мая 2016

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

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

Apple использует его дляБыстрая «удаленная очистка» для управляемых устройств.Идея состоит в том, что все зашифровано, а ключи хранятся в пакете для ключей, поддерживаемом стираемым хранилищем («effaçable» в переводе с французского означает «стираемое»).Для получения дополнительной информации см. Жан-Батист Бедрун и Жан Сигвальд Глубокая защита данных iPhone Оценка безопасности Apple iOS 4 от Dino Zavi .

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

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

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


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

Первый источникстандартное шифрование ARM, доступное в ARMv8 и выше.Инструкции доступны как для C / C ++, так и для сборки, когда определено __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, также.


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

Второй источник, по-видимому, пользовательский и присутствует в 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

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


Вот код , который мы используем для iOS .Тест для поддержки инструкций ARM Crypto.Поскольку этот код основан на собственных данных, этот же код используется для iOS, Linux, Windows Phone и Магазина Windows.В случае 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.
...