前回はSilicon Labs社のEFM32PG/JGの仕様についてご紹介しました。EFM32PG/JGは、EFM32に共通な「低消費電力」という特長をしっかりと受け継ぎつつ、暗号化ハードウェアを内蔵しているという非常にユニークな製品です。(前回の記事はこちら)
今回はその特徴的な機能である暗号化ハードウェア(CRYPTO)の性能を見ていきたいと思います。
どんなサンプルコードが用意されている?
EFM32PG/JGの開発環境として、Simplicity Studioというソフトウェアが提供されています。このSimplicityStudioには、コンパイル・デバッグ・プログラミングといった一般的な統合開発環境(IDE)が持つ機能に加え、消費電流測定ツール(Energy Profiler)、ペリフェラル設定ツール(Configurator)、製品ドキュメント、サンプルコード、などの機能・情報がまるごと搭載されています。
サンプルコードも豊富で、Lチカからインベーダゲーム(笑)まで色々と提供されているのですが、暗号化を取り扱ったものとしては次の2種類用意されています。
- AES(プロジェクト名:SLSTK3401A_aescrypt)
- ECDSA(プロジェクト名:SLSTK3401A_ecdsa)
サンプルコードのreadmeファイルを読んでみると、AESのサンプルコードではAESとSHAハッシュ関数を使っているようです。ECDSA(楕円曲線DSA)は、P-192、P-224、P-256を切り替えて評価できるようです。

まずはECDSAから…
readmeファイルの情報を頼りに、とりあえず動かしてみましょう。
このサンプルコードは、ECDSA用のAPIを使ってコーディングされていますが、その処理に要した時間をカウントしておき、結果を仮想COMポートから出力する、というシンプルなものになっています。
スターターキット(SLSTK3401A)をPCに接続して、Simplicity Studioを起動します。SLSTK3401AはPearl GeckoとJade Geckoの共通のスターターキットになっていて、マイコンはPearl Geckoが載っています。

EFM32 Pearl Gecko スターター・キット SLSTK3401A
これからECDSAのサンプルコード(SLSTK3401A_ecdsa)をロードし、ビルドし、できたバイナリをEFM32PGにダウンロードするわけですが、その前にビルド設定を“Release”にしておきます。“Debug”にすると論理合成の際に圧縮がかかりませんので、フェアな比較ができないからです。

また、ビルド時のパラメータ設定で、暗号化ハードウェア(CRYPTO)を有効にするか無効にするかを選択できるようになっています。以下の手順で暗号化ハードウェアを無効にします。
手順: プロジェクトを選択 → 右クリック → Property → C/C++ Build → Setting → GNU ARM C Compiler → Expert Settingに“-DNO_CRYPTO_ACCELERATION”を追加

設定が済んだらビルドおよびダウンロードを行います。
なお、サンプルコードのmainを見るとECC P-256を使用する設定になっていますので、この宣言を変更すればP-192もしくはP-224を使用して評価することもできます。

PC側の設定
結果(処理時間)は仮想COMポート経由で送られてきますので、ターミナルソフトを使ってデータを受信する必要があります。今回はTera Termを使います。JLink CDC UART Portを選択し、通信設定は115200-8-N-1(ボーレート115200、データ長8bit、パリティなし、ストップビット1bit)に設定します。

ソフト処理の結果(Cortex-M4F, 40MHz動作, 暗号化ハードウェア=無効)
スターターキットのリセットボタンを押すと、サンプルコードが動作して、結果がTeraTermに表示されます。

ハード処理の結果(Cortex-M4F, 40MHz動作, 暗号化ハードウェア=有効)
今度は暗号化ハードウェアを有効にして、同様に結果を見てみましょう。

結果を比較すると下表のとおりになりました。各処理時間の算出は、タイムスタンプ(カウンタ値)をリードし、API処理(鍵生成など)を行い、タイムスタンプ(カウンタ値)を再度リードして、タイムスタンプ間の差分を求めることで行っているようですので、暗号化以外の処理時間も多少含まれています。
ここで留意しておきたいのは、これはCortex-M4Fを使用しての結果という点です。非力なマイコンを使用すると、更に差は開くかもしれません。
ソフト処理(暗号化ハードウェア無効) | ハード処理(暗号化ハードウェア有効) | |
鍵生成 | 761 ms | 37 ms |
署名生成 | 804 ms | 76 ms |
署名検証 | 1580 ms | 103 ms |
次回はAESのサンプルコードを試してみたいと思います。