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