iPhone có hỗ trợ mã hóa AES tăng tốc phần cứng không?
Nó phụ thuộc vào phiên bản và phần cứng iPhone, nhưng chủ yếu là YES trong năm 2015.
Apple sử dụng nó cho "xóa từ xa" tính năng nhanh chóng cho các thiết bị quản lý. Ý tưởng là mọi thứ được mã hóa và các khóa được lưu trữ trong một túi khóa được hỗ trợ bởi bộ nhớ có thể thay thế ("có thể thay thế" là tiếng Pháp cho "có thể xóa"). Để biết thêm thông tin, xem Jean-Baptiste Bédrune và Jean Sigwald iPhone data protection in depth; và Dino Zavi's Apple iOS 4 Security Evaluation.
Mạch được đặt trên đường dữ liệu DMA giữa bộ nhớ và bộ nhớ để bất cứ thứ gì đi qua đường dẫn được mã hóa hoặc giải mã.
Nếu thiết bị bị mất hoặc bị đánh cắp, sau đó lệnh có thể được gửi đến thiết bị để xóa khóa phím giữ các khóa được sử dụng để mã hóa và giải mã. Bởi vì các keybag được hỗ trợ bởi lưu trữ effaceable, các phím không di chuyển xung quanh do san lấp mặt bằng mặc.
Dường như Apple cung cấp phần cứng tăng tốc AES từ ít nhất hai nguồn trên thiết bị iOS. Cả hai đều được bao bọc bởi khung công tác CommonCrypto của Apple. Ít nhất một xuất hiện để có sẵn cho các lập trình viên mà không cần CommonCrypto.
phần cứng đầu tiên nguồn tăng tốc
Nguồn đầu tiên là tiêu chuẩn ARM crypto sẵn trong ARMv8 trở lên. Các hướng dẫn có sẵn như là cả C intinsics/C++ và lắp ráp khi __ARM_FEATURE_CRYPTO
được định nghĩa:
$ 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
Bằng cách này, khi __ARM_FEATURE_CRYPTO
được định nghĩa, bạn nên có quyền truy cập vào phần cứng tăng tốc SHA-1 và SHA-2, cũng có.
phần cứng Thứ hai nguồn tăng tốc
Nguồn thứ hai dường như là tùy chỉnh, và hiện tại của nó trong ARMv7s và dưới đây. Tôi không chắc chắn làm thế nào để có được để crypto này (có thể opensource.apple.com có câu trả lời):
$ 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
Và:
$ 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
Một câu hỏi liên quan là Which hardware chip/vendor does Apple use for its hardware-accelerated AES/SHA-1 encryption?
Dưới đây là một số mã we are using for iOS. Nó kiểm tra sự hỗ trợ thời gian chạy của các lệnh ARM Crypto. Bởi vì mã dựa trên nội tại, cùng một mã được sử dụng cho iOS, Linux, Windows Phone và Windows Store. Trong trường hợp của iOS, nó được sử dụng khi -arch arm64
được chỉ định.
#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
}
Và đây là những gì nó trông giống như từ dòng lệnh trong một biên dịch:
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.
hiểu biết của tôi là Apple sẽ không cho bạn biết cho dù đó là tăng tốc phần cứng hay không, nhưng sẽ chỉ cung cấp thứ CommonCryptor cho bạn ... Tôi cho rằng nó sẽ được tăng tốc phần cứng trên các thiết bị hỗ trợ nó, lập kế hoạch phần mềm nếu không. – Romain
Đáng chú ý là các nhận xét sau đây xuất hiện trong mã CryptoExercise (SecKeyWrapper.h: 60-62): __ // Khoá đối xứng được lựa chọn và thuật toán phân loại được chọn cho mẫu này là AES và SHA1. // Lý do đằng sau điều này là do iPhone và iPod touch có // bộ tăng tốc phần cứng cho các thuật toán cụ thể đó và do đó tiết kiệm năng lượng .__ –