AES-NIについて(頓挫)
最近のIntel CPUにはAES-NIと呼ばれるAES暗号化を加速させるための専用命令群が実装されています。対応CPUは、32nmプロセスで製造されたi7, i5となっています。いろいろややこしいので、詳しくはIntelのサイトかwikipediaなどを参照してください。
最終的には動く物を作ろうと思っていたのですが、アクセス可能でAES-NI対応の環境がなかったので放置しています。環境を手に入れたら続きを書こうとは思いますが…。
AES-NIでは、以下の6命令が追加されています。x86系の命令にしては、ニーモニックが読みやすいです。なお、Intelのマニュアルでは用語の定義をfips-197から参照しています。
- AESENC
- AESENCLAST
- AESDEC
- AESDECLAST
- AESIMC
- AESKEYGENASSIST
コンパイラの対応状況についてはintrinsicのみ調べました。インラインアセンブラの対応状況は見ていません。
AES-NI命令のintrinsicが使えるコンパイラですが、clangが対応しています。ライセンスがないので試せませんが、Intelマニュアルには記述があるのでIntel C/C++ Compilerでも使えるようです。gcc4.5.1には後述するwmmintrin.hは含まれていないので、まだ対応していないと思われます。
clangでは、wmmintrin.hというヘッダに_mm_aesenc_si128の様に命令が宣言されています。その後コンパイルする時に-march=corei7や-maesというようにAES命令を使うように指定する必要があります。
clang -o aes aes.c -O2 -W -Wall -maes