[PR] あなたが Kindle で読みたいその本、Kindle に対応したら Twitter でお知らせします。

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 のソースコードを探してみる

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 で確かに使われています。

まとめ

ソースコードの中身は正直さっぱり理解できませんが、疑問を抱いたらソースコードを追いかける姿勢はこれからも心がけたいものです。