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

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

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

Да.

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

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

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

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

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

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

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

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

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


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

Первым источником является стандартная кривая ARM, доступная в ARMv8 и выше. Инструкции доступны как для Cins и 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.


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

Второй источник кажется обычным, и его присутствует в 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. 
  • Как воспроизвести зашифрованное HLS-видео AES-128 в AVPlayer
  • Шифрование AES в быстром
  • AES Decryption имеет другое поведение в iOS 7, чем iOS 8/9
  • Почему увеличение количества раундов для CCKeyDerivationPBKDF повышает безопасность?
  • Можно ли использовать AES128 с режимом GCM на iOS?
  • AESCipher (android) и CCCrypt (ios)
  • Для AES128 с использованием CCCrypt () ключ может быть длиннее 128 бит?
  • Шифрование / расшифровка для изображения на IOS
  • Шифрование AES256 имеет разный результат между node.js и object-c
  • AES ECB iOS Шифрование
  • Расшифровка видеофайла в iOS
  • Interesting Posts

    Ошибка Xcode с ошибкой «Code Signing»

    Как вызвать статический метод, предоставляемый протоколом в Swift

    Как сделать липкие заголовки разделов (например, iOS) в Android?

    Как увеличить / уменьшить высоту ячейки TableView на клике

    Каков правильный способ очистки конфиденциальных данных из памяти в iOS?

    Swift – загрузка видео с удаленного URL и сохранение его в фотоальбоме

    Обнаружение отрезанного сегмента UISegmentedControl

    Получение правильных границ представления UIViewController

    Попытка представить GKGameCenterViewController на UIViewController, чей вид не находится в иерархии окон

    Связь между 2 ViewControllers в проекте панели бар-бар

    Как получить номер телефона для созданного приложения с расширением imessage

    Как прокрутить резервную копию с помощью uiscrollview?

    Swift CoreData: ошибка: серьезная ошибка приложения. Исключение было обнаружено во время обработки изменений Core Data.

    iOS 7 UINavigationBar находится выше содержимого при использовании автоматической компоновки

    Попытка представить vc, чей вид не находится в иерархии окон

    Давайте будем гением компьютера.