wolfSSLのようなライブラリを自社の製品に組み込む上でまず気になることの一つは、処理性能やメモリー資源の消費量といった性能指標ではないでしょうか。また、wolfSSLはお客様のそれぞれ異なる組み込み要件を満みたせるように豊富なビルドオプションを用意しています。この連載では、こうした豊富なオプションを使いこなしてwolfの実力を最大限に発揮させる方法について紹介していきたいと思っています。
wolfSSLでは製品に付帯してベンチマークプログラムを提供していて、お客様の製品の実装条件にあわせて実機でのベンチマークテストができるようになっています。この連載で紹介する様々な性能指標やオプションの効果についても、そのほとんどは手元の実機で実際に確認することができるはずです。ぜひ、評価用に提供しているオープンソース版wolfSSLのメリットをいかして、実際に確かめながらスムーズな製品導入を実現してください。
さて、連載第一回はSingle Precision最適化をとりあげることにします。ご存知の通り公開鍵暗号技術はTLSセキュリティの基盤となる最重要技術ですが、一方でTLS処理のなかで一番時間やリソースを消費してしまうやっかいな代物でもあります。
その公開鍵暗号アルゴリズムの基本をささえているのが大きな整数を効率的に演算する整数演算ライブラリです。その整数演算ライブラリの処理方法を大幅に見直し最適化するのがSingle Precision(SP, 特定鍵長向け)最適化です。通常の整数演算ライブラリが任意の整数長、鍵長の演算(Multiple Precision)に対応できるようになっているのに対して、SPでは特定の鍵長のアルゴリズムだけに着目して最適化します。
RSAやECCなどの公開鍵長やフォーマットは標準化されていて、その中から求められる鍵の強度により自由に選択することができるようになっています。しかし現実には実用的な見地から、多くの場合、例えばRSAならば2048ビット、ECCならば256ビットなど特定の鍵長を利用することになります。また、処理時間はおおざっぱには鍵長の二乗に比例して長くなるので、長い鍵ほど最適化への要求が高まります。
現在wolfSSL(v4.3.0)のSP最適化は、RSA 2048, 3072, 4096ビット、ECC 256ビットに特化した最適化オプションです。この最適化によって、該当する鍵長の処理では大幅に処理時間を短縮することができます。また、スタックなどメモリー使用量も削減することができます。
ただし、最適化のためにループの排除などを行っているために、トレードオフとしてコードサイズが大きくなってしまうので、コード用のフラッシュメモリー領域には余裕が必要です。
図1は公開鍵暗号処理ごとの処理時間(相対値)を通常モードとSP最適化時で比較したものです。ご覧のように処理時間を大幅に短縮できます。
公開鍵暗号の処理はTLSハンドシェークの中で多数使用され、オーバーオールなハンドシェーク処理時間のなかでも大きなウエイトを占めています。SP最適化によってその部分の処理が大幅に短縮されるので、ハンドシェーク全体の処理時間から見ても大きく改善されます。図2は暗号スイート別に見たTLSハンドシェーク処理時間を通常モードとSP最適化時で比較したものです。
SP最適化オプションの利用方法:
現在のwolfSSLでは、SP最適化オプションはデフォルトでは無効化されています。最適化を有効化するには以下のオプションを指定します。
configureコマンドを利用する場合:
$ configure –enable-sp –enable-sp-asm –enable-sp-math
ヘッダーファイルを利用する場合:
#define WOLFSSL_HAVE_SP_RSA
#define WOLFSSL_HAVE_SP_DH
#define WOLFSSL_HAVE_SP_ECC
#define WOLFSSL_SP_ASM // gcc利用の場合
#define WOLFSSL_SP_ARM32_ASM // ARMアーキテクチャ向け、gcc利用の場合
#define WOLFSSL_SP_MATH
ベンチマーク方法:
今回紹介した性能改善効果について実機で具体的にデータ収集したい場合は、製品に同梱されている下記のツールを使ってください。
アルゴリズム毎のベンチマーク
wolfSSLルート/wolfcrypt/benchmark/benchmark
TLSハンドシェークのベンチマーク
wolfSSLルート/examples/benchmark/tls_bench
ご質問がありましたら info@wolfssl.jp までご連絡ください。