組み込み環境では、動作速度・フットプリントサイズ・メモリ使用量のトレードオフについて熟考しなければならないケースがほとんどです。今回は、wolfSSLのメモリ使用量についてご紹介します。
これは、耐量子暗号アルゴリズムであるML-KEMやML-DSAを使用する場合に特に重要です。ECDSAやECDHなどの従来型アルゴリズムと比較して、概ね同等、あるいは高速に動作しますが、より多くのメモリを必要とします。
Raspberry Pi 5上でwolfSSLのtestwolfcryptをビルドして実行し、3つのパターンで統計情報を取得しました。結果を以下に示します。
描画に使用した元データは本稿末尾に掲載しています。
・スタックとヒープのトレードオフ
構成(c)のようにWOLFSSL_SMALL_STACKを有効にすることで、スタック使用量が約23〜42 KB → 2,112 Bと大幅に削減できています。
・ML-KEM メモリスケーリング
ML-KEMでは、メモリ使用量がセキュリティレベルと対応して増減することが確認できます。
例:構成(a) Small Code
- ML-KEM-512:約31KB
- ML-KEM-768:約44KB
- ML-KEM-1024:約59KB
・ML-DSAの高いヒープ使用量
ML-DSAは、ML-KEMと比較して非常に多くのヒープメモリを使用します。
例:構成(a) Small Code
- ML-KEM:7〜17 KB
- ML-DSA:50〜120 KB
・省メモリ最適化
構成(b)、構成(c)のように省メモリ設定フラグを追加することで、ML-KEMで10〜15%、ML-DSAで50〜65%のメモリ使用量を削減できています。
各構成で使用した設定とコマンドは以下のとおりです。
構成(a)
$ ./configure –enable-dilithium=all,44,small –enable-mlkem=all,512,small –enable-trackmemory=verbose –enable-stacksize=verbose
$ make
$ ./wolfcrypt/test/testwolfcrypt
構成(b)
$ ./configure –enable-dilithium=all,44,small –enable-mlkem=all,512,small CFLAGS=”-DWOLFSSL_DILITHIUM_VERIFY_SMALL_MEM -DWOLFSSL_DILITHIUM_SIGN_SMALL_MEM -DWOLFSSL_DILITHIUM_MAKE_KEY_SMALL_MEM -DWOLFSSL_MLKEM_ENCAPSULATE_SMALL_MEM -DWOLFSSL_MLKEM_MAKEKEY_SMALL_MEM” –enable-trackmemory=verbose –enable-stacksize=verbose
$ make
$ ./wolfcrypt/test/testwolfcrypt
構成(c)
$ ./configure –enable-dilithium=all,44,small –enable-mlkem=all,512,small CFLAGS=”-DWOLFSSL_DILITHIUM_VERIFY_SMALL_MEM -DWOLFSSL_DILITHIUM_SIGN_SMALL_MEM -DWOLFSSL_DILITHIUM_MAKE_KEY_SMALL_MEM -DWOLFSSL_MLKEM_ENCAPSULATE_SMALL_MEM -DWOLFSSL_MLKEM_MAKEKEY_SMALL_MEM” –enable-trackmemory=verbose –enable-stacksize=verbose –enable-smallstack
$ make
$ ./wolfcrypt/test/testwolfcrypt
メモリ使用量に関してさらに厳密な調整が必要でしたら、 info@wolfssl.jp までお問い合わせください。
ベンチマークデータ
構成 | アルゴリズム | Stack (bytes) | Heap (bytes) | Total (bytes) | Heap Allocs |
構成(a): Small code | MLKEM-512 | 23,568 | 7,552 | 31,120 | 3 |
MLKEM-768 | 32,672 | 11,968 | 44,640 | 3 | |
MLKEM-1024 | 42,400 | 17,568 | 59,968 | 3 | |
MLDSA-44 | 15,904 | 50,304 | 66,208 | 2 | |
MLDSA-65 | 17,440 | 77,952 | 95,392 | 2 | |
MLDSA-87 | 19,376 | 120,960 | 140,336 | 2 | |
構成(b): Small code with small mem | MLKEM-512 | 23,696 | 3,968 | 27,664 | 3 |
MLKEM-768 | 32,928 | 5,824 | 38,752 | 3 | |
MLKEM-1024 | 42,656 | 7,840 | 50,496 | 3 | |
MLDSA-44 | 15,856 | 15,656 | 31,512 | 2 | |
MLDSA-65 | 17,392 | 20,776 | 38,168 | 2 | |
MLDSA-87 | 19,328 | 26,920 | 46,248 | 2 | |
構成(c): Small code with small mem + stack | MLKEM-512 | 2,112 | 19,306 | 21,418 | 17 |
MLKEM-768 | 2,112 | 27,306 | 29,418 | 17 | |
MLKEM-1024 | 2,112 | 35,786 | 37,898 | 17 | |
MLDSA-44 | 2,112 | 28,211 | 30,323 | 7 | |
MLDSA-65 | 2,112 | 33,331 | 35,443 | 7 | |
MLDSA-87 | 2,160 | 39,475 | 41,635 | 7 |
原文:https://www.wolfssl.com/optimizing-post-quantum-algorithm-memory-usage-on-embedded-systems