2011-01-27 39 views
15

Tôi có thể tìm thấy các tham chiếu đến "mã hóa AES được tăng tốc phần cứng" trên iPhone/iPad. Nhưng các API mà tôi có thể tìm thấy để làm mã hóa AES (CCCrypt) không nói về tăng tốc phần cứng chút nào.iPhone có hỗ trợ Mã hóa AES tăng tốc phần cứng không?

Có ai có bất kỳ ý tưởng nào nếu các API này là các API được tăng tốc phần cứng hoặc có các ứng dụng khác không?

+2

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

+1

Đá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 .__ –

Trả lời

19

Có.

Kể từ 4.3, nếu thư có> 64 khối (tức là 1024 byte), hàm CCCrypt cho AES sẽ sử dụng triển khai tăng tốc phần cứng. (Điều này được thực hiện bởi ioctl ing với /dev/aes_0, BTW.)

Bên cạnh AES, SHA-1 cũng được tăng tốc phần cứng khi đầu vào> 4096 byte.

+2

Bạn có liên kết đến tài liệu của Apple nói như vậy không? – Bala

+1

@Bala: SHA-1: Có một 'CC_SHA1_USE_HARDWARE_THRESHOLD' = 4096 được viết trong http://opensource.apple.com/source/CommonCrypto/CommonCrypto-36064/Source/Digest/sha1.c; AES: Thật không may là nó không được ghi chép ở bất cứ đâu, cũng như không có bất kỳ mã nguồn nào được xuất bản. Bạn cần phải tháo rời libSystem.B.dylib để có được điều này. – kennytm

+0

Cảm ơn. Tôi bối rối là tại sao Apple chọn 4096 làm ngưỡng. Có lẽ đó là giới hạn của chip SHA-1 phần cứng? – Bala

3

Toàn bộ điểm của API là bạn không cần phải quan tâm đến các chi tiết triển khai sẽ trả về nó. Người triển khai (Apple, trong trường hợp này) sẽ sử dụng bất kỳ việc triển khai nào mang lại hiệu năng tốt nhất và đặc tính sử dụng năng lượng trên bất kỳ phần cứng nào đang được sử dụng. Đó có thể là một triển khai phần cứng, hoặc nó có thể là một phần mềm thực hiện, nó có thể phụ thuộc vào kích thước khối mà bạn đang gọi hàm.

+0

* "Bạn không cần quan tâm đến chi tiết triển khai ..." * - ['goto fail'] (http://nakedsecurity.sophos.com/2014/02/24/anatomy-of-a-goto -fail-apples-ssl-bug-giải thích-cộng-một-không chính thức-patch /) cho chiến thắng! – jww

2

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. 
Các vấn đề liên quan