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

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

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


person Bala    schedule 27.01.2011    source источник
comment
Насколько я понимаю, Apple не скажет вам, с аппаратным ускорением он или нет, но предоставит вам только материалы CommonCryptor ... Я полагаю, что он будет с аппаратным ускорением на устройствах, которые его поддерживают, если нет, то планируйте программное обеспечение.   -  person Romain    schedule 21.03.2011
comment
Примечательно, что в коде CryptoExercise (SecKeyWrapper.h: 60-62) появляются следующие комментарии: // Выбранный симметричный ключ и алгоритм дайджеста, выбранные для этого примера, - AES и SHA1. // Причина в том, что iPhone и iPod touch имеют // аппаратные ускорители для этих конкретных алгоритмов и поэтому являются энергоэффективными.   -  person Robert Travis Pierce    schedule 24.07.2012


Ответы (3)


Да.

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

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

person kennytm    schedule 22.03.2011
comment
У вас есть ссылка на документацию Apple, в которой это сказано? - person Bala; 24.03.2011
comment
@Bala: SHA-1: CC_SHA1_USE_HARDWARE_THRESHOLD = 4096 записано в opensource.apple.com/source/CommonCrypto/CommonCrypto-36064/; AES: К сожалению, это нигде не задокументировано, и исходный код не опубликован. Вам нужно дизассемблировать libSystem.B.dylib, чтобы получить это. - person kennytm; 24.03.2011
comment
Спасибо. Я озадачен, почему Apple выбрала 4096 в качестве порогового значения. Может быть, это предел аппаратного чипа SHA-1? - person Bala; 26.03.2011
comment
@Bala: Я думаю, что это просто проблема эффективности. Связь с внешним оборудованием платная. - person kennytm; 26.03.2011
comment
@KennyTM: Скорее всего. Я пытался использовать этот API, но безуспешно использовал AES с аппаратным ускорением (хотя блок, который я пытаюсь зашифровать, больше 1024). Когда я попытался пройти через aes_cc_encrypt, я увидел: (а) Код, который я вижу, не совпадает с тем, что я вижу на opensource.apple.com/source/CommonCrypto/CommonCrypto-36064/ и (b) не требует аппаратного пути. Вы пробовали это сами и заставили его работать? - person Bala; 29.03.2011
comment
Я разместил здесь следующий вопрос: stackoverflow.com/questions/5479335/ - person Bala; 30.03.2011
comment
Есть ли способ перевести аппаратный движок в режим CFB (шифрованная обратная связь)? Существует опция kCCOptionECBMode для использования ECB (вместо режима CBC по умолчанию) в соответствии с файлом заголовка. - person Martijn Thé; 28.04.2011
comment
@ MartijnThé - оборудование AES обычно работает в режиме ECB. Программист должен добавить логику уровня режима. Согласно вики Crypto ++, VIA Padlock обеспечивает ускорение ECB, CBC и OFB, но это не означает, что он выполняет все. Со времен x86 Padlock и других массовых ускорителей, таких как x86 AES-NI и ARM Crypto, ускоренная помощь стала более простой. - person jww; 15.06.2016

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

person Stephen Canon    schedule 07.07.2011
comment
Вам не нужно беспокоиться о деталях реализации ... - _ 1_ для победы! - person jww; 15.05.2016

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

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

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

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

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

Похоже, что Apple предоставляет аппаратное ускорение AES как минимум из двух источников на устройствах iOS. Оба упакованы в CommonCrypto от Apple. рамки. По крайней мере, один из них доступен программисту без необходимости использования 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_ARCHclang++ -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.
_ 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.
person jww    schedule 15.05.2016