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