wolfSSLとwolfCryptのベンチマーク
組込み向けSSL/TLSライブラリwolfSSL(旧CyaSSL)は、弊社が一から開発したライブラリで、移植性やパフォーマンス、メモリ使用量の最小化を考慮して設計しています。このドキュメントでは、wolfSSLとwolfCrypt暗号化ライブラリのこれまでに行ったベンチマークテストの結果とお客様の環境でベンチマークを行う方法を説明いたします。追加のベンチマークデータをご希望の場合や特定のプラットフォームに関するご質問はinfo@wolfssl.jpまでご連絡ください。
WolfCryptベンチマークアプリケーション
特定のハードウェアデバイスや特定の環境でのwolfSSLの動作について知りたいと思われている方は、多くいらっしゃると思います。しかし最近では組込み、エンタープライズ、クラウドベースなどのそれぞれの環境で、様々なプラットフォームやコンパイラが使用されているため、一般的なパフォーマンスの測定は困難な状況になっています。
そのようなご要望にお応えするため、wolfSSLにはベンチマークアプリケーションがバンドルされています。基礎となる暗号化機能はSSL/TLSの性能を左右する重要なコンポーネントですので、バンドルされたベンチマークアプリケーションはwolfCryptのアルゴリズムに関するパフォーマンステストを行います。
ベンチマークユーティリティは、wolfSSLパッケージの “./wolfcrypt/benchmark”ディレクトリにあります。wolfSSLとそれに関連するサンプルとアプリケーションをビルドした後、パッケージディレクトリルートから次のコマンドを送ることでベンチマークアプリケーションを実行できます。
./wolfcrypt/benchmark/benchmark
次のような出力結果が出ます。(MB / s単位のスループットと1バイトあたりのサイクル数を示します)
RNG 50 megs took 0.509 seconds, 98.327 MB/s Cycles per byte = 22.26
AES enc 50 megs took 0.265 seconds, 188.472 MB/s Cycles per byte = 11.61
AES dec 50 megs took 0.249 seconds, 201.130 MB/s Cycles per byte = 10.88
AES-GCM 50 megs took 0.813 seconds, 61.519 MB/s Cycles per byte = 35.57
CHACHA 50 megs took 0.135 seconds, 369.940 MB/s Cycles per byte = 5.92
CHA-POLY 50 megs took 0.176 seconds, 284.441 MB/s Cycles per byte = 7.69
MD5 50 megs took 0.111 seconds, 451.695 MB/s Cycles per byte = 4.84
POLY1305 50 megs took 0.039 seconds, 1294.834 MB/s Cycles per byte = 1.69
SHA 50 megs took 0.104 seconds, 479.340 MB/s Cycles per byte = 4.57
SHA-224 50 megs took 0.240 seconds, 208.321 MB/s Cycles per byte = 10.51
SHA-256 50 megs took 0.235 seconds, 213.188 MB/s Cycles per byte = 10.27
SHA-384 50 megs took 0.168 seconds, 298.319 MB/s Cycles per byte = 7.34
SHA-512 50 megs took 0.168 seconds, 297.612 MB/s Cycles per byte = 7.35
RSA 2048 public 0.358 milliseconds, avg over 100 iterations
RSA 2048 private 4.315 milliseconds, avg over 100 iterations
DH 2048 key generation 1.326 milliseconds, avg over 100 iterations
DH 2048 key agreement 1.341 milliseconds, avg over 100 iterations
ECC 256 key generation 0.851 milliseconds, avg over 100 iterations
EC-DHE key agreement 0.843 milliseconds, avg over 100 iterations
EC-DSA sign time 0.888 milliseconds, avg over 100 iterations
EC-DSA verify time 0.617 milliseconds, avg over 100 iterations
このアプリケーションは、数学ライブラリを変更する前後の公開鍵の速度を比較するのに特に便利です。 通常の数学ライブラリ(./configure)、高速ライブラリ(./configure –enable-fastmath)、およびfasthugemathライブラリ(./configure –enable-fasthugemath)を使用して結果をテストできます。
メモリー使用
実行時のメモリ使用量に関して、wolfSSLは一般にSSL/TLSセッションあたり1~36kBを消費します。 接続あたりのRAM使用量は、使用されている入出力バッファサイズ、公開鍵アルゴリズムおよび鍵サイズによって異なります。 wolfSSLのI/Oバッファはデフォルトで128バイトで、./wolfssl/internal.hのRECORD_SIZE定義で制御されます。 最大サイズは、SSL/TLS RFCで指定されているように、バッファあたり16kBです。 一例として、標準の16kBバッファでは、単一接続のwolfSSLのランタイムメモリの合計使用量は3kB(ライブラリ)+ 16kB(入力バッファ)+ 16kB(出力バッファ)= 約35kBになります。
TLSコンテキスト(WOLFSSL_CTX)は、クライアントまたはサーバーのすべてのTLS接続で共有されます。 ランタイムメモリ使用量は、ロードされる証明書の数と証明書ファイルのサイズによって異なります。 また、セッションキャッシュとセッション証明書の格納の有無(–enable-session-certs)によっても異なります。 セッションキャッシュサイズを減らしたい場合、SMALL_SESSION_CACHEを定義して(デフォルトセッションキャッシュを33セッションから6セッションに減らして)、約2.5 kBを節約できます。 NO_SESSION_CACHEを定義してセッションキャッシュを無効にし、メモリを3KB近く減らすことも可能です。
参考ベンチマーク
wolfSSLを様々なプラットフォームに移植する際、多くの場合、私たちはベンチマークを実行しています。 以下はいくつかのプラットフォーム上で行ったベンチマーク結果のデータです。この他に特定のプラットフォームでのwolfSSLのベンチマーク情報をお持ちでしたら、プラットフォームとライブラリの設定とともにぜひお知らせください。弊社のベンチマーク情報にぜひ追加させていただければと思います。
プラットフォーム | ベンチマーク |
Intel(R) Core(TM) i5-6300U @ 2.4GHz Intelコンパイラ |
インテルSGXエンクレーブで動作するwolfCryptのベンチマーク。 これらのベンチマークは、SGX内でのwolfCrypt暗号化の実行が暗号化操作に及ぼすパフォーマンスの影響を最小限に抑えることを示しています。 SGX以外のベンチマーク SHA-256 0.264s 189.078 MB/s インテルSGXエンクレーブでのベンチマーク SHA-256 0.263s 190.436 MB/s -0.38% difference 参考資料 Intel Software Guard Extensions (SGX) SDK(英語) |
DH895xCC Intel(R) Core(TM) i7-4790 CPU 3.60GHz 12GB RAM |
暗号ベンチマーク: wolfSSL非同期ベンチマークアプリケーションをユーザー領域でCPUアフィニティを使って複数スレッドで実行した時のベンチマーク結果 RSA 2048 public: 209,909 ops/sec 参考資料 wolfSSLBlog Post:wolfSSL Asynchronous Intel QuickAssist Support(英語) |
Kirin 620 SoC 8GB eMMC storage |
|
AVX1: 1.8GHz, Intel Core i5 |
暗号ベンチマーク:
参考資料 wolfSSL Blog Post:Intel’s Extended Instructions Accelerates Hash Algorithms(英語) |
Atmel SAMD21 |
TLS接続確立時間: ハードウェアアクセラレーション: ATECC508A:平均2.342 秒 TLS接続確立時間は ATECC508A利用で5.73倍速くなります。 ソフトウェアのみ (SAMD21 48Mhz Cortex-M0, Fast Math TFM-ASM): ECC 256鍵生成 5回繰り返し平均 3123.000ミリ秒 ATECC508A ハードウェアアクセラレーション: ECC 256鍵生成 5回繰り返し平均 144.400ミリ秒 RNG, AES, MD5, SHA, SHA256の参考ベンチマークデータ: RNG 25 kB 処理時間 0.784秒, 0.031 MB/s (ATECC508Aのデータから引用) 参考資料 |
STM32F221G-EVAL |
暗号ベンチマーク: ソフトウェア暗号: wolfCryptベンチマーク, 巨大整数数学ライブラリ使用 AES 1024 kB 処理時間 0.822秒, 1.22 MB/s MD5 1024 KB 処理時間 0.119秒, 8.40 MB/s RSA 2048 暗号処理 100回繰り返し平均 111.17ミリ秒 STM32F2 ハードウェア暗号: wolfCrypt ベンチマーク、巨大整数数学ライブラリ使用 AES 1024 kB 処理時間 0.105秒, 9.52 MB/s MD5 1024 KB 処理時間 0.045秒, 22.22 MB/s
RSA 2048 暗号処理 100回繰り返し平均 111.09ミリ秒 参考資料 |
Texas Instruments (www.ti.com) |
暗号ベンチマーク: AES 25 kB 処理時間 0.038秒, 0.642 MB/s MD5 25 kB 処理時間 0.003秒, 8.138 MB/s RSA 2048 暗号処理 88.000ミリ秒 ECC 256 鍵生成 5回繰り返し平均 130.400ミリ秒 参考資料 |
Freescale TWR-K70F120M (www.freescale.com) |
暗号ベンチマーク: AES 5120 kB 処理時間 9.059秒, 0.55 MB/s MD5 5120 kB 処理時間 1.396秒, 3.58 MB/s RSA 2048 暗号処理 100回繰り返し平均 73.99ミリ秒 ビルド詳細
参考資料 Freescale TWR-K70F120M: http://www.freescale.com/webapp/sps/site/prod_summary.jsp?code=TWR-K70F120M(英語) |
Apple TV 2 (www.apple.com) |
暗号ベンチマーク: AES 5メガ 処理時間 0.500秒, 9.99 MB/s MD5 5 メガ 処理時間 0.163秒, 30.73 MB/s RSA 1024 暗号処理 100回繰り返し平均 1.12ミリ秒 ビルド詳細 完全ビルド, fastmathオプションでコンパイル (–enable-fastmath) 参考資料 |
(www.mbed.org) |
メモリー使用: RAM Usage: 2.0 kB 暗号ベンチマーク: public RSA: 10ミリ秒 ビルド詳細 – 完全ビルド, SHA-512, DH, DSA, HC-128以外全て 参考資料 http://mbed.org/users/toddouska/libraries/CyaSSL/lm43pv(英語) |
相対的な暗号パフォーマンス
個々の暗号とアルゴリズムのパフォーマンスはホストプラットフォームによって異なりますが、次のグラフはwolfCryptのアルゴリズムの相対的なパフォーマンスを示しています。 これらのテストは、2.2GHzのIntel Core i7を搭載したMacBook Pro(OS X 10.6.8)で行いました。
wolfSSL_CTX_set_cipher_list(ctx, “AES128-SHA”);
ベンチマークの注意点
-
プロセッサ固有のレジスタサイズ(32または64ビット)は、1000ビット以上の公開鍵操作を行うときにパフォーマンスに大きな差が出ることがあります。
-
fastmath(–enable-fastmath)は、動的メモリ使用を減らし公開鍵操作を高速化します。 fastmathを使用して32ビットプラットフォームを構築することが難しい場合は、共有ライブラリを無効にしてPICがレジスタを読み飛ばさないようにしてください。(README参照)
./configure –enable-fastmath –disable-shared
make clean
make注: wolfSSLのconfigureオプションを変えるときは、make cleanを行ってからconfigureを実行してください。
-
デフォルトでは、fastmathは可能であればアセンブリ最適化を使用しようとします。 アセンブリの最適化がうまくいかない場合は、wolfSSLをビルドするときにCFLAGSにTFM_NO_ASMを追加することでfastmathを使用せずにそのまま使用することができます。
./configure –enable-fastmath CFLAGS=-DTFM_NO_ASM
-
fasthugemathを使用すると、組込みプラットフォーム以外のプラットフォームに対してfastmathをさらに高速化することができます。
./configure –enable-fasthugemath
-
デフォルトのwolfSSLビルドでは、メモリ使用量とパフォーマンスの間のバランスをとることようになっています。これら2つの割合を変えるめのwolfSSL設定オプションについては、wolfSSLユーザ・マニュアルの第二章を参照してください。
-
バルク転送:wolfSSLはデフォルトで128バイトのI/Oバッファを使用します。SSLトラフィックの約80%がこのサイズにおさまり、動的メモリの使用量を制限することができます。 バルク転送が必要な場合は、16Kバッファ(最大SSLサイズ)を使用するように設定するといいでしょう。