wolfSSLの新たな Multi-Precision 演算ライブラリ

wolfSSLはあらゆる点で改善された、マルチプレシジョン演算ライブラリを導入しました。この実装はsp_int.cにありWOLFSSL_SP_MATH_ALLの定義あるいはコンフィギュレーション時オプション”–enable-sp-math-all”の指定で利用可能になります。以前はinteger.cかもしくはtfm.cの実装のいずれかを選択していました。

従来のInteger実装

従来のsmallあるいはInteger実装と呼んでいる実装は、”–disable-fastmath”オプションを指定して有効にします。この実装は、単純でコードサイズを小さく使用メモリ量も少なくなるように記述されています。そしてそれは本当に素晴らしい仕事をしてくれます!シンプルで小さなアルゴリズムを使用し、数値を保持するメモリサイズを動的に変更することで組み込み機器用のコードとして完璧になります。特定の業界では、動的メモリアロケーションを持たないというコーディング標準のため、静的メモリアロケーションなしでは、この実装が適さない場合があることも事実です。また、この実装ではサイドチャネル攻撃への耐性が高くありませんが、外部から計測可能な暗号化操作を行わない組み込み機器では問題とはなりません。

従来のTFM実装

従来のfastあるいはTFM実装と呼んでいる実装は、”–enable-fastmath”オプションかUSE_FAST_MATHマクロ、”–enable-fasthugemath”オプションかUSE_FAST_MATH,TFM_SMALL_SET,TFM_HUGE_SETマクロによって有効にできます。この実装はTomsFastMathと呼ばれるパブリックドメインのラージインテジャ算術ライブラリを基にしています。この実装は高速ですが、複雑でコード量が多く、特定のケースに特化した実装になっています。コードはサイドチャネル攻撃耐性を強化し(TFM_TIMING_RESISTANTマクロで有効化)、より広い用途で使えます。この実装は比較的多くのメモリを搭載した組み込み機器アプリあるいはモバイルアプリ向けに最適です。半面、外部のコードを基にした実装であるため欠点もあります。我々のコードを更新する都度、オリジナルのコードから乖離し、それらの更新を取り込むのに長い時間がかかるといった点です。

 

既に、この様な2つの実装を備えているのに、なぜ新し実装が必要になるのでしょうか?新実装では両者の良いとこどり-小さくて速い-ができているのです。また、この実装はスクラッチから我々の手で記述しています。つまり、我々が必要としているもの全てが一ヶ所にあるのです。おっと、integer.cあるいはtfm.cより小さくかつ高速になるようにコンパイルできると言ってましたっけ?

新しいSP Math All 実装

この新たなSP Math All実装は”小さくて高速”か”非常に高速だが巨大”を選択してコンパイル可能です。TFM実装と同様に、数値を格納するためのデータサイズは固定で、動的メモリ(リ)アロケーションは使いません。小さいコードサイズ用にコンパイルすると基本的な操作用に単純なアルゴリズムのみが含まれますが犠牲になるスピードははるかに少なくなります。1024ビット以上のようなより大きな数のために特別にコードを含む巨大なオプションに含まれている高速な実装もあります。 コードをできるだけ速く実行するために、アセンブリコードのスニペットが使用されます。 x64、x86、Aarch64、ARM32、Cortex-M4、PPC64、PPC、MIPS64、MIPS、RISCV64、RISCV32、S390Xなどの幅広いプラットフォームがサポートされています。 SP Mathすべてのコードは、デフォルトでサイドチャネルに対して強化された実装を使用します。

各実装の差異を示します:

Integer 実装TFM実装SP Math All実装
数値データアロケーション動的固定固定
メモリ使用量スモールラージ/ヒュージスモール/ラージ/ヒュージ
スピードスローファスト/ベリーファストスロー/ファスト/ベリーファスト
アセンブリコード提供なし限定したプラットフォームのみ多くのプラットフォーム
攻撃への耐性なしありあり

次回のブログではSP Math All実装とInteger実装のパフォーマンス比較を行います。

 

ご質問は、info@wolfssl.jpまでお問い合わせください。テクニカルサポートについては、support@wolfssl.comにお問い合わせください。

原文:https://www.wolfssl.com/wolfssl-new-multi-precision-math-library/