Intel AES-NI について調べてみた
Posted on
最近の Intel プロセッサには AES 暗号化処理を高速化するための仕組み「AES-NI (AES New Instructions)」が実装されています(AMD プロセッサも対応しているようですが詳しくないので省略)。プロセッサの対応状況は Intel のサイトで確認できます。
第二世代 Core i シリーズも対応しているので、みなさんがお使いのマシンも対応しているかもしれません。確認方法は簡単で、/proc/cpuinfo の flags に "aes" があれば対応しています。 Intel Xeon E5645 だとこんな感じです。
$ cat /proc/cpuinfo | grep aes
flags : fpu de pse tsc msr pae mce cx8 apic mtrr pge mca cmov pat pse36 clflush mmx fxsr sse sse2 ht syscall nx lm constant_tsc unfair_spinlock pni ssse3 cx16 sse4_1 sse4_2 x2apic popcnt aes hypervisor
ベンチマークは以下のページが参考になります。
- AES-NI アリとナシとの差
- 見せてもらおうか、Intel の AES-NI の性能とやらを ~ OpenSSL でベンチしてみた~
- cloudpack night #7 に参加しました / EC2 における AES-NI の話
AES-NI のソースコードを探してみる
AES-NI を実装しているソースコードを探してみました。バージョンは 2/1 時点の安定版である Kernel 3.13.1 です。
AES-NI は x86 命令セットの拡張機能なので、探すのは arch/x86/ 以下です。
$ ls arch/x86/
Kbuild Kconfig.debug Makefile_32.cpu crypto kernel lib net platform syscalls vdso
Kconfig Makefile boot ia32 kvm math-emu oprofile power tools video
Kconfig.cpu Makefile.um configs include lguest mm pci realmode um xen
crypto ディレクトリにソースコードがありました。数千行のソースコードなのでとても全部は理解しきれませんが。
$ find arch/x86/ -type f -name '*aesni*' | sort
arch/x86/crypto/aesni-intel_asm.S
arch/x86/crypto/aesni-intel_glue.c
arch/x86/crypto/camellia-aesni-avx-asm_64.S
arch/x86/crypto/camellia-aesni-avx2-asm_64.S
arch/x86/crypto/camellia_aesni_avx2_glue.c
arch/x86/crypto/camellia_aesni_avx_glue.c
AES-NI のようなプロセッサごとの機能は arch/x86/include/asm/cpufeature.h に定数が定義されています。
$ grep -n AES arch/x86/include/asm/cpufeature.h
130:#define X86_FEATURE_AES (4*32+25) /* AES instructions */
294:#define cpu_has_aes boot_cpu_has(X86_FEATURE_AES)
X86_FEATURE_AES は arch/x86/crypto/aesni-intel_glue.c:1345 で確かに使われています。
まとめ
ソースコードの中身は正直さっぱり理解できませんが、疑問を抱いたらソースコードを追いかける姿勢はこれからも心がけたいものです。