home > H8 + FPGA (AES)

H8 + FPGA (AES)

はじめに AESのIPコア 仕様 設計 テスト ビルド ソフトでのテスト 感想


履歴


はじめに

FPGAにAES (Rijndael) のIPコアを入れて、H8から使ってみます。 H8からはメモリマップされたI/Fレジスタを介して、使えるようにします。

H8とFPGAが接続されたボードとして、 ストロベリーリナックスの SPARTAN-COMPLETE を使います。

また、ツールは、XilinxのISE WebPack 9.1i を使います。

※ (H8とFPGAのバス接続の)簡単な例は、 こちらをご参照。


AESのIPコア

AESのIPコアとして、 OpenCores.org の systemcaes (http://www.opencores.org/projects.cgi/web/systemcaes/overview) を使わせていただきました。

このコアの概略仕様:

※ 当初、同じく、OpenCores.org の aes_core (http://www.opencores.org/projects.cgi/web/aes_core/overview) を使ってみましたが、H8バスI/Fなどのロジックも含めると、 XC2S200 (SPARTAN-COMPLETEのFPGA) には私の力では収めることができませんでした。 (暗号あるいは復号どちらか一方だけなら入りましたが。)

一方、systemcaes は小規模になるように作られていて、 XC2S200にも収めることができました。
その代わり、性能的には、 aes_core が暗号:11サイクル、復号:22サイクル(内鍵拡張11サイクル)に対して、 暗号、復号とも:約500サイクルかかってしまうようです。

なお、systemcaesの仕様は、aes_coreのものと同様になっていて、 テストベンチもaes_coreのものを改造して使っているようです。

AES IPコアの詳細仕様/動作

このAESのIPコアの詳細仕様を理解するために、 テストベンチ(test_bench_top.v)が付属しているので実行してみます。

なお、全部(284個のテストデータについて)実行するとすごーーく時間がかかるので、 最初の3データについて実行してみました。 そのため、テストベンチtest_bench_top.v中のループ箇所を以下のようにしたりしました。

//for(n=0;n<284;n=n+1)
for(n=0;n<3;n=n+1)
   begin

シミュレータとしては、WebPack ISE9.1i に付属する ISE Simulator を使いました。 実行して、最初のテストデータについて暗号化および復号化している箇所を表示してみました。

最初のテストデータ:

tv[0]= 384'h00000000000000000000000000000000f34481ec3cc627bacd5dc3fb08f273e60336763e966d92595a567cc9ce537f5e;

について少し詳しくみてみます。 これは、先頭から(bit位置から言うと上位から)順に128bitずつ というデータです。

暗号化/復号化の開始

まず、暗号化の開始部分を拡大してみました。 keyが鍵、text_inが平文です。
kld (load_i)をアサートすることで、暗号化を開始するようです。

暗号化/復号化の終了

暗号化の終了部分も拡大してみました。

done (ready_o)がアサートされて、 text_out(data_o)に暗号文(0336763e966d92595a567cc9ce537f5e)が出てきています。

doneは復号用にインスタンシエートしたu1のload_iにも接続されているので、 暗号化終了と同時に復号化を開始します。 (復号終了時にはdone2(ready_o)がアサートされます。)

詳細仕様

以上で、信号線とその機能が確認できました。

仕様

H8接続I/Fの仕様です。

機能としては以下の通りとします。

H8ソフトから見て、

にAESコアとのI/Fレジスタをマップします。

バスコントローラ設定としては、 エリア4について、

とします。

I/Fレジスタ仕様

ベースアドレスは 0x800000 です。
アドレスレジスタ名機能
0x00
:
0x0f
KEY 0
:
KEY 15
鍵(8bit×16個)
0x10
:
0x1f
DIN 0
:
DIN 15
入力データ(8bit×16個)
0x20
:
0x2f
IV 0
:
IV 15
IV(8bit×16個)
0x30
:
0x3f
DOUT 0
:
DOUT 15
出力データ(8bit×16個)
0x40CTRL暗号(bit0=0)/復号(bit0=1)選択、CBC(bit1=1)、処理開始(bit2=1)
0x41STATUSビジー(bit7=1)

設計

XilinxのWebPACK ISE (ISE 9.1i)を使用しました。

ISEのプロジェクト一式:
aes_h8.zip

aes_h8がトップレベルのモジュールです。 その直下のモジュールは以下の3つに分かれています。


テスト

テストベンチ

ソースは、aes_h8_tb.vです。

H8 CPUからバスを介してこのFPGAにアクセスするシーケンスを シミュレートしています。

なお、AES128-CBCのテストベクタは、 http://csrc.nist.gov/publications/nistpubs/800-38a/sp800-38a.pdf にあるものを使用しています。

実行例

以下は、暗号化開始後、 暗号化終了を待つためにステータスレジスタ (アドレス40h) を繰り返しリードして ビジービット(bit7)が落ちるのを待ち、

ビジービットが落ちた後 DOUTレジスタ (アドレス30h〜3fh) をリードする部分です。
DOUTレジスタからは暗号文 (128'h5086cb9b507219ee95db113a917678b2) を先頭から読み出しています。


ビルド

詳しく述べません(すみません)が、 インストール方法、ビルド方法については、 ググるといろいろ出てくると思います。

前述のプロジェクトに含まれる。 aes_h8.ise をクリックして、 ISEを起動して、ビルド(論理合成、配置配線、等)します。

FPGAに書き込む aes_h8.bit ができるとこまでやります。

デバイス使用率はこちら

接続

top.ucfは、以下の通りです:
#
NET "CLK"  LOC = "P185"  ;
NET "ADDR<0>"  LOC = "P181"  ;
NET "ADDR<1>"  LOC = "P180"  ;
NET "ADDR<2>"  LOC = "P179"  ;
NET "ADDR<3>"  LOC = "P178"  ;
NET "ADDR<4>"  LOC = "P176"  ;
NET "ADDR<5>"  LOC = "P175"  ;
NET "ADDR<6>"  LOC = "P174"  ;
NET "DATA<0>"  LOC = "P195"  ;
NET "DATA<1>"  LOC = "P194"  ;
NET "DATA<2>"  LOC = "P193"  ;
NET "DATA<3>"  LOC = "P192"  ;
NET "DATA<4>"  LOC = "P191"  ;
NET "DATA<5>"  LOC = "P189"  ;
NET "DATA<6>"  LOC = "P188"  ;
NET "DATA<7>"  LOC = "P187"  ;
NET "nWE"  LOC = "P147"  ;
NET "nOE"  LOC = "P150"  ;
NET "nCS"  LOC = "P149"  ;
NET "nRST"  LOC = "P138" | PULLUP ;
NET "nAS"  LOC = "P139"  ;

ソフトでのテスト

MONIXの変更

SPARTAN-COMPLETEのH8マイコンはH8/3069ですので、ROMモニタとして
MONIX を使います。

ただし、SPARTAN-COPLETEは25MHzクロックを使っているので、 以下の変更が必要です。 monix/sys.hの

# define CPU_HZ 20	/* MHz */
# define CPU_HZ 25	/* MHz */
に変えます。

また、AESのテストコマンドを追加します。

これでビルドしたものを使います。

ビルドしたmonix.motをH8の内蔵ROMに書きます。

実行例

SPARTAN-COMPLETEの電源を入れます。
MONIX Ver.0.1 (Mar 14 2007, 23:05:33)
BootMode: 0x00
1:

aes_h8.bitをISE(の書き込みツールIMPACT)を使ってFPGAに書き込みます。※

※ 私はコンフィグROMを搭載してないSPARTAN-COMPLETEを買ったので、 電源を入れ直すたびに書き込みをする必要があります。

ロジックを書けたら、aestestコマンドを実行します。

1:aestest ==== CBC encrypt ==== →CBC暗号化テスト key: →鍵 ffbf20 2b7e 1516 28ae d2a6 - abf7 1588 09cf 4f3c +~..(.........O< iv: →IV ffbf30 0001 0203 0405 0607 - 0809 0a0b 0c0d 0e0f ................ plain: →平文 ffbf40 6bc1 bee2 2e40 9f96 - e93d 7e11 7393 172a k....@...=~.s..* cipher: →暗号文(暗号化結果) ffc470 7649 abac - 8119 b246 cee9 8e9b vI.....F.... ffc480 12e9 197d - ...} OK Registers: →レジスタダンプ 800000 2b7e 1516 28ae d2a6 - abf7 1588 09cf 4f3c +~..(.........O< 800010 6bc1 bee2 2e40 9f96 - e93d 7e11 7393 172a k....@...=~.s..* 800020 0001 0203 0405 0607 - 0809 0a0b 0c0d 0e0f ................ 800030 7649 abac 8119 b246 - cee9 8e9b 12e9 197d vI.....F.......} 800040 0200 0000 0000 0000 - 0000 0000 0000 0000 ................ 800050 0000 0000 0000 0000 - 0000 0000 0000 0000 ................ 800060 0000 0000 0000 0000 - 0000 0000 0000 0000 ................ 800070 0000 0000 0000 0000 - 0000 0000 0000 0000 ................ ==== CBC decrypt ==== →CBC復号化テスト key: →鍵 ffbf20 2b7e 1516 28ae d2a6 - abf7 1588 09cf 4f3c +~..(.........O< iv: →IV ffbf30 0001 0203 0405 0607 - 0809 0a0b 0c0d 0e0f ................ cipher: →暗号文 ffbf80 7649 abac 8119 b246 - cee9 8e9b 12e9 197d vI.....F.......} plain: →平文(復号化結果) ffc470 6bc1 bee2 - 2e40 9f96 e93d 7e11 k....@...=~. ffc480 7393 172a - s..* OK Registers: →レジスタダンプ 800000 2b7e 1516 28ae d2a6 - abf7 1588 09cf 4f3c +~..(.........O< 800010 7649 abac 8119 b246 - cee9 8e9b 12e9 197d vI.....F.......} 800020 0001 0203 0405 0607 - 0809 0a0b 0c0d 0e0f ................ 800030 6bc1 bee2 2e40 9f96 - e93d 7e11 7393 172a k....@...=~.s..* 800040 0300 0000 0000 0000 - 0000 0000 0000 0000 ................ 800050 0000 0000 0000 0000 - 0000 0000 0000 0000 ................ 800060 0000 0000 0000 0000 - 0000 0000 0000 0000 ................ 800070 0000 0000 0000 0000 - 0000 0000 0000 0000 ................ ==== CBC encrypt (Multiple blocks) ==== →CBC暗号化(複数ブロック)テスト key: ffbf20 2b7e 1516 28ae d2a6 - abf7 1588 09cf 4f3c +~..(.........O< iv: ffbf30 0001 0203 0405 0607 - 0809 0a0b 0c0d 0e0f ................ plain: ffbf40 6bc1 bee2 2e40 9f96 - e93d 7e11 7393 172a k....@...=~.s..* ffbf50 ae2d 8a57 1e03 ac9c - 9eb7 6fac 45af 8e51 .-.W......o.E..Q ffbf60 30c8 1c46 a35c e411 - e5fb c119 1a0a 52ef 0..F.\........R. ffbf70 f69f 2445 df4f 9b17 - ad2b 417b e66c 3710 ..$E.O...+A{.l7. cipher: ffc470 7649 abac - 8119 b246 cee9 8e9b vI.....F.... ffc480 12e9 197d 5086 cb9b - 5072 19ee 95db 113a ...}P...Pr.....: ffc490 9176 78b2 73be d6b8 - e3c1 743b 7116 e69e .vx.s.....t;q... ffc4a0 2222 9516 3ff1 caa1 - 681f ac09 120e ca30 ""..?...h......0 ffc4b0 7586 e1a7 - u... OK Registers: 800000 2b7e 1516 28ae d2a6 - abf7 1588 09cf 4f3c +~..(.........O< 800010 f69f 2445 df4f 9b17 - ad2b 417b e66c 3710 ..$E.O...+A{.l7. 800020 73be d6b8 e3c1 743b - 7116 e69e 2222 9516 s.....t;q..."".. 800030 3ff1 caa1 681f ac09 - 120e ca30 7586 e1a7 ?...h......0u... 800040 0200 0000 0000 0000 - 0000 0000 0000 0000 ................ 800050 0000 0000 0000 0000 - 0000 0000 0000 0000 ................ 800060 0000 0000 0000 0000 - 0000 0000 0000 0000 ................ 800070 0000 0000 0000 0000 - 0000 0000 0000 0000 ................ ==== CBC decrypt (Multiple blocks) ==== →CBC復号化(複数ブロック)テスト key: ffbf20 2b7e 1516 28ae d2a6 - abf7 1588 09cf 4f3c +~..(.........O< iv: ffbf30 0001 0203 0405 0607 - 0809 0a0b 0c0d 0e0f ................ cipher: ffbf80 7649 abac 8119 b246 - cee9 8e9b 12e9 197d vI.....F.......} ffbf90 5086 cb9b 5072 19ee - 95db 113a 9176 78b2 P...Pr.....:.vx. ffbfa0 73be d6b8 e3c1 743b - 7116 e69e 2222 9516 s.....t;q..."".. ffbfb0 3ff1 caa1 681f ac09 - 120e ca30 7586 e1a7 ?...h......0u... plain: ffc470 6bc1 bee2 - 2e40 9f96 e93d 7e11 k....@...=~. ffc480 7393 172a ae2d 8a57 - 1e03 ac9c 9eb7 6fac s..*.-.W......o. ffc490 45af 8e51 30c8 1c46 - a35c e411 e5fb c119 E..Q0..F.\...... ffc4a0 1a0a 52ef f69f 2445 - df4f 9b17 ad2b 417b ..R...$E.O...+A{ ffc4b0 e66c 3710 - .l7. OK Registers: 800000 2b7e 1516 28ae d2a6 - abf7 1588 09cf 4f3c +~..(.........O< 800010 3ff1 caa1 681f ac09 - 120e ca30 7586 e1a7 ?...h......0u... 800020 73be d6b8 e3c1 743b - 7116 e69e 2222 9516 s.....t;q..."".. 800030 f69f 2445 df4f 9b17 - ad2b 417b e66c 3710 ..$E.O...+A{.l7. 800040 0300 0000 0000 0000 - 0000 0000 0000 0000 ................ 800050 0000 0000 0000 0000 - 0000 0000 0000 0000 ................ 800060 0000 0000 0000 0000 - 0000 0000 0000 0000 ................ 800070 0000 0000 0000 0000 - 0000 0000 0000 0000 ................ 1:

感想


Shuji KUWAHARA
$Id: index.html 245 2007-12-03 16:59:15Z kuwa $