2022年5月11日水曜日

ESP32 SHA ハードウェアアクセラレータをArduinoIDEから使えるようにしてみた

ESP32の機能にCryptoモジュールがありますが、ArduinoIDEのスケッチ例がなかったので、使い方を調べました。

 マニュアルには、SHAモジュールに関するレジスタについては記述がありますが、罠が仕込まれています。(後述)

Cryptoモジュールを使うには、peripheral clock peripheral resetレジスタの設定が必要です。

CryptoモジュールにはSHA、RSA、AESのモジュールが含まれていますが、ここではSHAモジュールについてのみテストしてみました。


テスト用スケッチ



結果

ESP32 Hardware accelerator SHA256 test
BA7816BF 8F01CFEA 414140DE 5DAE2223 B00361A3 96177A9C B410FF61 F20015AD
BA7816BF 8F01CFEA 414140DE 5DAE2223 B00361A3 96177A9C B410FF61 F20015AD
exe time: 5uSec
ESP32 Hardware accelerator SHA256 test two block message
248D6A61 D20638B8 E5C02693 C3E6039 A33CE459 64FF2167 F6ECEDD4 19DB06C1
248D6A61 D20638B8 E5C02693 C3E6039 A33CE459 64FF2167 F6ECEDD4 19DB06C1
exe time: 6uSec

どうやらメッセージブロックの書き込みに時間がかかっているようですが、SHAの計算のみだと2uSec以下で計算できているようです。マニュアルによるとSHAの計算に60~100クロック、ダイジェストに8~20クロックほど必要らしいので、計算上1uSec前後で終了するはずなのですが、micros()の測定できる限界なのかもしれません。

どのくらい速くなるのか

ソフトウェアによるSHA256の計算結果
one block -> 24uSec
two block -> 47uSec
でした。
およそ5倍の速度アップになっています。
ただし、FIPS180-4のサンプルコードをほぼそのまま記述しただけのソースコードであり、ラウンドごとのレジスタシフトが無駄なため、もう少し速度アップできるかもしれません。
SHA2-256を1ブロックだけの比較なので微妙な結果でしたが、PBKDF2なんかで比較するときっと大差が出るはず。


マニュアルの罠

テクニカルリファレンスマニュアルの573ページにSHAアクセラレータについての記述がありますが、実はこれだけではアクセラレータを使うことができません。(注意書きがあればいいのに。)

Cryptoモジュールを使うには、

DPORT_PERI_CLK_EN_REG

DPORT_PERI_RST_EN_REG

の設定が必要になります。これについてはマニュアルの96ページに記述されていますが、DPORT_PERI_RST_EN_REGについてはさらに記述漏れがあるようです。

DPORT_PERI_RST_EN_REGの0~2bitがRSA,SHA、AESのリセットレジスタになっており、デフォルトでHigh(リセット状態)になっています。ここまではマニュアル通りですが、このレジスタには3bit目(DPORT_PERI_EN_SECUREBOOT)が存在し、ここもLowにしないとモジュールが起動しない模様。

AESについては5bit目(DPORT_PERI_EN_DIGITAL_SIGNATURE)が存在するっぽい



0 件のコメント:

コメントを投稿