wolfSSLとwolfCryptのベンチマーク

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のフットプリントサイズ(コンパイルされたバイナリサイズ)は、ビルドオプションと使用されているコンパイラによって20~100kBです。 通常、組込みシステムで最適化されたコンパイラを使用した場合、ビルドサイズは約60kBになります。 これにはフル機能のTLS 1.2クライアントとサーバーが含まれます。 構築オプションとwolfSSLをさらにカスタマイズする方法の詳細については、wolfSSLユーザ・マニュアルの第二章またはwolfSSLチューニング・ガイド(英語)を参照ください。

実行時のメモリ使用量に関して、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 SGX(英語)

Intel(R) Core(TM) i5-6300U @ 2.4GHz

Intelコンパイラ

 wolfSSL Benchmark

インテルSGXエンクレーブで動作するwolfCryptのベンチマーク。 これらのベンチマークは、SGX内でのwolfCrypt暗号化の実行が暗号化操作に及ぼすパフォーマンスの影響を最小限に抑えることを示しています。

SGX以外のベンチマーク

SHA-256        0.264s        189.078 MB/s
AES-GCM       3.142s        15.911 MB/s
RSA (2048)    Encrypt       0.238 ms
RSA (2048)    Decrypt       6.239 ms

インテルSGXエンクレーブでのベンチマーク

SHA-256        0.263s        190.436 MB/s        -0.38% difference
AES-GCM       3.128s        15.985 MB/s         -0.45% difference
RSA (2048)    Encrypt       0.245 ms               2.94% difference
RSA (2048)    Decrypt       6.242 ms              0.05% difference

参考資料

Intel Software Guard Extensions (SGX) SDK(英語)
wolfSSLブログ記事:wolfSSLのIDF展示はIntel® SGX対応

Intel(R) Core(TM) i7-4790 CPU 3.60GHz

12GB RAM

暗号ベンチマーク:

wolfSSL非同期ベンチマークアプリケーションをユーザー領域でCPUアフィニティを使って複数スレッドで実行した時のベンチマーク結果

RSA 2048 public: 209,909 ops/sec
RSA 2048 private: 41,999 ops/sec
DH  2048 key gen: 112,491 ops/sec
DH  2048 key agree: 95,129 ops/sec
ECDHE 256 agree: 55,117 ops/sec
ECDSA 256 sign: 46,798 ops/sec
ECDSA 256 verify: 28,917 ops/sec
AES-CBC Enc: 2,932 MB/s
AES-CBC Dec: 2,882 MB/s
AES-GCM: 2,903 MB/s
3DES: 1,511 MB/s
MD5: 2,309 MB/s
SHA: 5,068 MB/s
SHA-224: 2,392 MB/s
SHA-256: 1,275 MB/s
SHA-384: 2,020 MB/s
SHA-512: 1,908 MB/s

参考資料

wolfSSLBlog Post:wolfSSL Asynchronous Intel QuickAssist Support(英語)
Intel QuickAssist(英語)

HiKey LeMaker
(英語)

Kirin 620 SoC
ARM® CortexTM-A53 Octa-core
64-bit 1.2GHzまで (ARM v8 命令セット)

8GB eMMC storage
1GB RAM

wolfSSL ARMv8 on HiKey LeMaker Board

AVX1: 1.8GHz, Intel Core i5
AVX2: Intel Broadwell

暗号ベンチマーク:

  • AVX2:    SHA-256  50メガ  実行時間 0.320 seconds, 156.118 MB/s
    Cycles per byte =  9.75  = 47%
  • AVX1:   SHA-256  50メガ  実行時間 0.272 seconds, 184.068 MB/s
    Cycles per byte = 11.89  = 39%
  • Normal: SHA-256  50メガ  実行時間 0.376 seconds, 132.985 MB/s
    Cycles per byte = 16.46
  • AVX2:    SHA-384  50メガ  実行時間  0.226 seconds, 221.318 MB/s
    Cycles per byte =  6.88  = 42%
  • AVX1:    SHA-384  50 メガ  実行時間 0.192 seconds, 260.975 MB/s
    Cycles per byte =  8.39  = 9%
  • Normal: SHA-384  50メガ  実行時間 0.209 seconds, 239.743 MB/s
    Cycles per byte =  9.13
  • AVX2:    SHA-512  50メガ  実行時間 0.224 seconds, 223.120 MB/s
    Cycles per byte =  6.82  = 75%
  • AVX1:    SHA-512  50メガ  実行時間 0.188 seconds, 266.126 MB/s
    Cycles per byte =  8.22  = 50%
  • Normal: SHA-512  50メガ  実行時間 0.281 seconds, 177.997 MB/s
    Cycles per byte = 12.29

参考資料

wolfSSL Blog Post:Intel’s Extended Instructions Accelerates Hash Algorithms(英語)

Atmel SAMD21
ARM Cortex M0
48 MHz

TLS接続確立時間:

ハードウェアアクセラレーション: ATECC508A:平均2.342 秒
ソフトウェアのみ:平均13.422 秒

TLS接続確立時間は ATECC508A利用で5.73倍速くなります。

ソフトウェアのみ (SAMD21 48Mhz Cortex-M0, Fast Math TFM-ASM):

ECC 256鍵生成 5回繰り返し平均 3123.000ミリ秒
EC-DHE鍵合意 5回繰り返し平均 3117.000ミリ秒
EC-DSA署名 5回繰り返し平均 1997.000ミリ秒
EC-DSAベリファイ 5回繰り返し 平均 5057.000ミリ秒

ATECC508A ハードウェアアクセラレーション:

ECC 256鍵生成 5回繰り返し平均 144.400ミリ秒
EC-DHE鍵合意 5回繰り返し平均 134.200ミリ秒
EC-DSA署名 5回繰り返し平均 293.400ミリ秒
EC-DSAベリファイ 5回繰り返し 平均 208.400ミリ秒

RNG, AES, MD5, SHA, SHA256の参考ベンチマークデータ:

RNG 25 kB 処理時間 0.784秒, 0.031 MB/s (ATECC508Aのデータから引用)
AES 25 kB 処理時間 0.177秒, 0.138 MB/s
MD5 25 kB 処理時間  0.050秒, 0.488 MB/s
SHA 25 kB 処理時間  0.141秒, 0.173 MB/s
SHA-256 25 kB 処理時間 0.352秒, 0.069 MB/s

参考資料

Atmel ハードウェア-TLSプラットフォーム(英語)

wolfSSL Atmel概要とプラットフォーム(英語)

STM32F221G-EVAL
ARM Cortex M3
120MHz
1 MB FLASH
128 KB SRAM

暗号ベンチマーク:

ソフトウェア暗号: wolfCryptベンチマーク, 巨大整数数学ライブラリ使用

AES        1024 kB 処理時間 0.822秒,   1.22 MB/s
ARC4      1024 KB 処理時間 0.219秒,   4.57 MB/s
DES        1024 KB 処理時間 1.513秒,   0.66 MB/s
3DES      1024 KB 処理時間 3.986秒,   0.25 MB/s

MD5          1024 KB 処理時間 0.119秒,   8.40 MB/s
SHA          1024 KB 処理時間 0.279秒,   3.58 MB/s
SHA-256    1024 KB 処理時間 0.690秒,   1.45 MB/s

RSA 2048 暗号処理 100回繰り返し平均 111.17ミリ秒
RSA 2048 復号処理 100回繰り返し平均 1204.77ミリ秒
DH  2048 鍵生成 100回繰り返し平均 467.90ミリ秒
DH  2048 鍵合意 100回繰り返し平均 538.94ミリ秒

STM32F2 ハードウェア暗号: wolfCrypt ベンチマーク、巨大整数数学ライブラリ使用

AES        1024 kB 処理時間 0.105秒,   9.52 MB/s
ARC4      1024 KB 処理時間 0.219秒,   4.57 MB/s
DES        1024 KB 処理時間 0.125秒,   8.00 MB/s
3DES      1024 KB 処理時間 0.141秒,   7.09 MB/s

MD5           1024 KB 処理時間 0.045秒,  22.22 MB/s
SHA           1024 KB 処理時間 0.047秒,  21.28 MB/s
SHA-256    1024 KB 処理時間 0.690秒,   1.45 MB/s

 

RSA 2048 暗号処理 100回繰り返し平均 111.09ミリ秒
RSA 2048 復号処理 100回繰り返し平均 1204.88ミリ秒
DH  2048 鍵生成 100回繰り返し平均 467.56ミリ秒
DH  2048 鍵合意  100回繰り返し平均 542.11ミリ秒

参考資料

wolfSSLとSTM32(英語)

Texas Instruments
Tiva C Series TM4C1294XL
Connected Launchpad

(www.ti.com)
ARM Cortex-M4
120 MHz
1 MB FLASH
256 KB SRAM
6 KB EEPROM

暗号ベンチマーク:

AES      25 kB 処理時間 0.038秒,   0.642 MB/s
Camellia 25 kB 処理時間 0.032秒,   0.763 MB/s
ARC4     25 kB 処理時間 0.006秒,   4.069 MB/s
RABBIT   25 kB 処理時間 0.005秒,   4.883 MB/s
CHACHA   25 kB 処理時間 0.007秒,   3.488 MB/s
3DES     25 kB 処理時間 0.164秒,   0.149 MB/s

MD5      25 kB 処理時間 0.003秒,   8.138 MB/s
POLY1305 25 kB 処理時間 0.004秒,   6.104 MB/s
SHA      25 kB 処理時間 0.006秒,   4.069 MB/s
SHA-256  25 kB 処理時間 0.014秒,   1.744 MB/s
SHA-512  25 kB 処理時間 0.042秒,   0.581 MB/s

RSA 2048 暗号処理 88.000ミリ秒
RSA 2048 復号処理 1456.000ミリ秒
DH  2048 鍵生成  661.000ミリ秒
DH  2048 鍵合意  665.000ミリ秒

ECC  256 鍵生成 5回繰り返し平均 130.400ミリ秒
EC-DHE   鍵合意 5回繰り返し平均 118.000ミリ秒
EC-DSA   署名処理5回繰り返し平均 136.800ミリ秒
EC-DSA   ベリファイ処理5回繰り返し平均 253.800ミリ秒

参考資料

wolfSSLとTI-RTOS(英語)

Freescale TWR-K70F120M

(www.freescale.com)
Freescale Kinetis K70
120 MHz
2 GB FLASH
1 GB RAM

暗号ベンチマーク:

AES        5120 kB 処理時間 9.059秒,   0.55 MB/s
ARC4      5120 kB 処理時間 2.190秒,   2.28 MB/s
DES        5120 kB 処理時間 18.453秒,   0.27 MB/s

MD5         5120 kB 処理時間 1.396秒,   3.58 MB/s
SHA         5120 kB 処理時間 3.635秒,   1.38 MB/s
SHA-256  5120 kB 処理時間 9.145秒,   0.55 MB/s

RSA 2048 暗号処理  100回繰り返し平均 73.99ミリ秒
RSA 2048 復号処理 100回繰り返し平均 1359.09ミリ秒
DH  2048 鍵生成  100回繰り返し平均 536.75ミリ秒
DH  2048 鍵合意  100回繰り返し平均 540.99ミリ秒

ビルド詳細

  • MQX RTOS TFM_TIMING_RESISTANT fastmathライブラリ使用
  • FREESCALE_MQX は <wolfssl_root>/wolfssl/wolfcryptcrypt/settings.hで定義
  • CodeWarrior 10.2 IDE  コンパイラでスピード最適化オプション使用

参考資料

Freescale TWR-K70F120M: http://www.freescale.com/webapp/sps/site/prod_summary.jsp?code=TWR-K70F120M(英語)

Apple TV 2

(www.apple.com)
Apple A4 (ARM Cortex-A8)
1 GHz
8 GB FLASH
256 MB RAM

暗号ベンチマーク:

AES         5メガ 処理時間 0.500秒,   9.99 MB/s
ARC4       5 メガ 処理時間 0.174秒,  28.66 MB/s
RABBIT    5 メガ 処理時間 0.126秒,  39.56 MB/s
3DES       5 メガ 処理時間 2.196秒,   2.28 MB/s

MD5        5 メガ 処理時間 0.163秒,  30.73 MB/s
SHA         5 メガ 処理時間 0.137秒,  36.61 MB/s
SHA-256  5 メガ 処理時間 0.309秒,  16.20 MB/s

RSA 1024 暗号処理  100回繰り返し平均 1.12ミリ秒
RSA 1024 複合処理  100回繰り返し平均 17.81ミリ秒
DH  1024 鍵生成  100回繰り返し平均 11.90ミリ秒
DH  1024 鍵合意   100回繰り返し平均 11.22ミリ秒

ビルド詳細

完全ビルド, fastmathオプションでコンパイル (–enable-fastmath)

参考資料

ブログ記事 Running CyaSSL on the Apple TV 2(英語)

mbed Logo

(www.mbed.org)
ARM Cortex-M3
96 MHz
512 kB FLASH
32 kB RAM

メモリー使用:

RAM Usage:  2.0 kB
Flash Usage*: 64 kB
* テストドライバーコード(3kB)も含む

暗号ベンチマーク:

public RSA:  10ミリ秒
private RSA: 165ミリ秒

ビルド詳細

– 完全ビルド, SHA-512, DH, DSA, HC-128以外全て
– mbedクラウドコンパイラを使ってビルド

参考資料

http://mbed.org/users/toddouska/libraries/CyaSSL/lm43pv(英語)
http://mbed.org/users/toddouska/programs/cyassl-client/lm394s(英語)

相対的な暗号パフォーマンス

個々の暗号とアルゴリズムのパフォーマンスはホストプラットフォームによって異なりますが、次のグラフはwolfCryptのアルゴリズムの相対的なパフォーマンスを示しています。 これらのテストは、2.2GHzのIntel Core i7を搭載したMacBook Pro(OS X 10.6.8)で行いました。

Benchmark Algorithm Comparison
暗号機能のサブセットのみを使用する場合は、SSL/TLS接続を確立するときにwolfSSLが使用する特定の暗号スイートおよび暗号をカスタマイズできます。 例えば、128ビットAESを強制するにはwolfSSL_CTX_new(SSL_CTX_new)の呼び出しの後に次の行を追加します。

wolfSSL_CTX_set_cipher_list(ctx, “AES128-SHA”);

ベンチマークの注意点

  1. プロセッサ固有のレジスタサイズ(32または64ビット)は、1000ビット以上の公開鍵操作を行うときにパフォーマンスに大きな差が出ることがあります。

  2. fastmath–enable-fastmath)は、動的メモリ使用を減らし公開鍵操作を高速化します。 fastmathを使用して32ビットプラットフォームを構築することが難しい場合は、共有ライブラリを無効にしてPICがレジスタを読み飛ばさないようにしてください。(README参照)

    ./configure –enable-fastmath –disable-shared
    make clean
    make

    注: wolfSSLのconfigureオプションを変えるときは、make cleanを行ってからconfigureを実行してください。

  3. デフォルトでは、fastmathは可能であればアセンブリ最適化を使用しようとします。 アセンブリの最適化がうまくいかない場合は、wolfSSLをビルドするときにCFLAGSにTFM_NO_ASMを追加することでfastmathを使用せずにそのまま使用することができます。

    ./configure –enable-fastmath CFLAGS=-DTFM_NO_ASM

  4. fasthugemathを使用すると、組込みプラットフォーム以外のプラットフォームに対してfastmathをさらに高速化することができます。

    ./configure –enable-fasthugemath

  5.  デフォルトのwolfSSLビルドでは、メモリ使用量とパフォーマンスの間のバランスをとることようになっています。これら2つの割合を変えるめのwolfSSL設定オプションについては、wolfSSLユーザ・マニュアルの第二章を参照してください。

  6.  バルク転送:wolfSSLはデフォルトで128バイトのI/Oバッファを使用します。SSLトラフィックの約80%がこのサイズにおさまり、動的メモリの使用量を制限することができます。 バルク転送が必要な場合は、16Kバッファ(最大SSLサイズ)を使用するように設定するといいでしょう。