先月はDTLSの動作について紹介したので、今月はいよいよその性能について見ていきたいと思いますが、その前に先月紹介した動作に関して若干の復習です。ご存じの通り、UDPはその名の通りコネクションの概念のない、単発の手軽なパケットの送受信プロトコルです。DTLSはそのUDPに安全性を提供するわけなのですが、例えば、その安全性の重要な要素、なりすましを防止しようと思ったらどうしても通信相手の認証は避けて通れません。そんなこんなを考えると、結局DTLSも安全なセッションを確立するためにTLSとにたようなハンドシェークがあったり、TCPで実現しているのに近いようなパケットロスや順序性の確保といった処理が必要になってしまう、というようなお話を前回しました。
そういうわけで、DTLSの性能を見ていくと残念ながらUDPのような軽量さは失われてしまっていることがわります。我々ベンダの立場からは、安全性を損なわない範囲でどこまで軽量さを追求できるかが勝負所になります。
さて、前置きはそのくらいにして本題の性能について、wolfSSLの提供するDTLS1.2について、その処理時間に関する基本性能を見てみましょう。処理時間は、通信の冒頭で安全なセッション確立のために行われるハンドシェーク部分と実際にアプリケーションのデータを転送するペイロード転送部分の二つにわかれます。
ハンドシェークは、ペイロードのデータサイズにかかわらずほぼ一定の時間がかかります。
上のグラフはハンドシェークの処理時間をARM Cortex A7で実際にベンチマークし相対値に示したものです。本来ハンドシェークの実行時間にはUDP/IP以下の層のネットワークプロトコルの処理時間も含まれますが、このベンチマークでは同一のプロセッサ上にクライアント、サーバを置き通信させています。そのため、UDP/IP以下の層の処理時間はほぼゼロに近い処理時間となり、実質的にDTLSレイヤーの処理時間だけが抽出された形になります。
ハンドシェーク処理時間としては鍵交換(鍵合意)と通信相手の認証(署名検証)の時間が大半を占めます。グラフでは、鍵交換アルゴリズムとして従来型の有限体DH(FFDH)と楕円曲線DH(ECDH)、署名検証アルゴリズムとしてRSAとECDSAの二組の要素を三通りの組み合わせで比較しています。
処理時間には鍵長が大きく影響してきますが、このベンチマークでは現在通常用途にはおおむね十分な強度が得られるとされている鍵長、DH、RSA鍵には2048ビット、ECCには256ビットを使用しています。これらの比較では、従来型より楕円曲線によるアルゴリズムのほうがかなり高速に処理できることがわかります。
wolfSSLでは、これらの公開鍵処理のベースとなる整数演算部分にSP(Single Precision)最適化と呼ばれる最適化技術を導入しています。DTLSやTLSに使用される鍵長には種類はありますがいくつかに標準化されています。この鍵処理は特定の鍵長に着目すると大幅に処理時間を短縮することができます。その点に着目して代表的長さの鍵について最適化するのがSP最適化です。wolfSSLでは、現在(Version 4.4.0)RSA2048,3072,4096ビット、ECC256ビットについてSP最適化を提供しています。グラフの各アルゴリズムの左側が従来の処理、右側がSP最適化有りの場合を示しています。ご覧のようにSP最適化によって大幅に処理時間が改善されていることがわかります。
さて、次はペイロードの転送時間です。こちらのベンチマークもハンドシェークと同様に同一プロセッサでの転送時間を相対値で示しています。UDP/IP以下の層の処理時間は実質ゼロで、実質的にDTLSでの処理時間となります。ペイロードの処理時間は、概ね伝送データのサイズに比例しますので、ここでは1Mバイトあたりの処理時間をミリ秒で表示しています。
この部分の共通鍵暗号アルゴリズムとしては従来AES-CBCが広く利用されてきました。しかし、最近はこの暗号アルゴリズムとレコード単位のMAC値によるチェックを組み合わせただけでは改ざんのリスクがある点が指摘されており、AEAD(authenticated encryption with associated data)アルゴリズムの利用が推奨されています。しかし、一般的にはAEAD型の方は処理時間が増加してしまう欠点があります。グラフの右側のChacha20-Poly1305の組み合わせはAEADでありながらご覧のように従来の一般的なアルゴリズムよりも短い時間で処理できることを示しています。
以上、今回はDTLSの処理性能について紹介しました。この記事で紹介したベンチマークはwolfSSL製品やオープンソース版の中にも含まれていて、お客さま自身のターゲット環境でベンチマークを実行することができるようになっています。wolfSSLの通常のビルドが完了したら、下記のように、./examples/benchmarkディレクトリーのtls_benchプログラムを” -u”(DTLS指定)で実行してみてください。
./examples/benchmark/tls_bench -u
この記事に関して、ご質問、あるいはご意見、ご希望などありましたら info@wolfssl.jp までお知らせください。
連載「WOLFの実力」を最新版から続けて読む
第一回:SP最適化でハンドシェイク所要時間を大幅削減
第二回:データ転送速度をさぐる
第三回:DTLSの実力(その1 DTLSの動作)