iPhone/iPad で「ハードウェア アクセラレーションによる AES 暗号化」への言及を見つけることができました。しかし、AES 暗号化 ( CCCrypt )を実行するために見つけた API は、ハードウェア アクセラレーションについてはまったく言及していません。
これらの API がハードウェア アクセラレーションされているものなのか、それとも他の API があるのか、誰にもわかりませんか?
iPhone/iPad で「ハードウェア アクセラレーションによる AES 暗号化」への言及を見つけることができました。しかし、AES 暗号化 ( CCCrypt )を実行するために見つけた API は、ハードウェア アクセラレーションについてはまったく言及していません。
これらの API がハードウェア アクセラレーションされているものなのか、それとも他の API があるのか、誰にもわかりませんか?
はい。
4.3 の時点で、メッセージが 64 ブロック (つまり 1024 バイト) を超える場合、AES の CCCrypt 関数はハードウェア アクセラレーションの実装を使用します。(これは、ところでioctl
ingによって行われます。)/dev/aes_0
AES に加えて、入力が 4096 バイトを超える場合、SHA-1 もハードウェア アクセラレーションされます。
API の要点は、それを支える実装の詳細を気にする必要がないということです。実装者 (この場合は Apple) は、使用中のハードウェアに関係なく、最高のパフォーマンスとエネルギー使用特性を提供する実装を使用します。それはハードウェアの実装である場合もあれば、ソフトウェアの実装である場合もあり、関数を呼び出すブロック サイズに依存する場合があります。
iPhone はハードウェア アクセラレーションによる AES 暗号化をサポートしていますか?
iPhone のバージョンとハードウェアにもよりますが、2015 年にはほぼ YES です。
Apple は、管理対象デバイスの迅速な「リモート ワイプ」機能にこれを使用しています。すべてが暗号化され、鍵は消去可能なストレージ(「effaçable」はフランス語で「消去可能」を意味する) に裏打ちされたキーバッグに格納されるという考え方です。詳細については、Jean-Baptiste Bédrune と Jean Sigwald iPhone データ保護の詳細を参照してください。および Dino Zavi のApple iOS 4 Security Evaluation .
この回路は、ストレージとメモリの間の DMA データパスに配置されるため、パスを通過するものはすべて暗号化または復号化されます。
デバイスが紛失または盗難にあった場合、コマンドをデバイスに送信して、暗号化と復号化に使用されるキーを保持するキーバッグを消去できます。キーバッグは取り外し可能なストレージで裏打ちされているため、ウェアレベリングによってキーが移動することはありません。
Apple は、iOS デバイス上の少なくとも 2 つのソースからハードウェア アクセラレーションされた AES を提供しているようです。どちらも Apple のCommonCryptoフレームワークによってラップされています。CommonCrypto を必要とせずに、少なくとも 1 つはプログラマーが利用できるようです。
最初のハードウェア アクセラレーション ソース
最初のソースは、ARMv8 以降で使用可能な標準の ARM 暗号です。__ARM_FEATURE_CRYPTO
が定義されている場合、命令は C/C++ の組み込み関数とアセンブリの両方として使用できます。
$ 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 にもアクセスできる必要があります。
2 番目のハードウェア アクセラレーション ソース
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 ストアで同じコードが使用されます。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.