Поддерживает ли 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.