wolfCrypt に、格子ベースの耐量子署名アルゴリズムである Falcon-512 および Falcon-1024 のネイティブ実装を追加しました。Falcon は、FN-DSA として米国国立標準技術研究所(NIST)による標準化が予定されているアルゴリズムです。
今回の実装により、liboqs を利用していた従来の Falcon 対応を置き換えました。Falcon を wolfCrypt に直接組み込むことで外部依存をなくし、デスクトップ、組み込み、カーネルのいずれの環境でも、移植性やハードウェアとの連携を高め、動作を制御しやすくしました。
ネイティブ実装を採用した理由
当初の Falcon 対応は liboqs のラッパーとして実装していました。いち早く Falcon を利用する手段としては有用でしたが、wolfCrypt との緊密な統合が難しく、外部依存も大きくなっていました。
ネイティブ実装には次の利点があります。
- liboqs への外部依存が不要
- 組み込み環境および Linux カーネル環境に対応
- wolfCrypt の暗号コールバックおよびハードウェアオフロードとの連携
- x86-64 および ARM 向けの高速化オプション
- 組み込み向けのより小さなビルドサイズ
- 検証のみの構成、メモリ使用量を抑えた構成
Falcon は、wolfCrypt に残っていた最後の liboqs 依存アルゴリズムでした。今回の更新で、wolfSSL がサポートする耐量子暗号アルゴリズムをすべて wolfCrypt 内に直接実装しました。
Falcon から FN-DSA へ
Falcon は、のちに ML-KEM、ML-DSA、SLH-DSA となったアルゴリズムとともに NIST に選定されました。
NIST は Falcon を FN-DSA(FFT over NTRU-Lattice-Based Digital Signature Algorithm)という名称で FIPS 206 として策定を進めており、2025 年 9 月に開催された第 6 回耐量子暗号標準化会議でその詳細を発表しました。本記事の執筆時点で FIPS 206 はまだ策定段階にあり、初期公開ドラフト(Initial Public Draft)も公開されていません。
FN-DSA の標準化が完了していないため、現時点の wolfCrypt API は暫定的なものです。当面は wc_falcon_* 関数と falcon_key 型を使用しますが、FN-DSA の最終規格が確定した際に、これらの名称は変更される可能性があります。
このため、Falcon を使用するには wolfSSL の実験的機能(experimental)を有効化する必要があります。
幅広いプラットフォームへの対応
Falcon は、署名と鍵生成に浮動小数点方式の演算を用いる一方、検証は主に整数演算に依存するアルゴリズムであり、実装にはあまり例のない難しさがあります。
wolfCrypt は複数のビルドオプションを提供しており、移植性、性能、メモリ使用量、サイドチャネル対策のバランスを考慮して、アプリケーションに適した構成を選択できます。
デフォルトの構成では、浮動小数点演算を整数演算でエミュレートするバックエンドを使用します。浮動小数点レジスタを使用しないため、Linux カーネル向けのビルドや、Cortex-M マイコンのような小規模なデバイスに適しています。倍精度 FPU を搭載するプロセッサでも、搭載しないプロセッサでも利用できます。
ネイティブの倍精度演算、x86-64 アセンブリ、AVX2、AArch64 NEON を用いた高速化構成も利用できます。DSP 命令に対応した Cortex-M プロセッサでは、これを利用して整数演算による検証処理を高速化できます。
Falcon は wolfCrypt 標準の WOLF_CRYPTO_CB インターフェースとも連携します。鍵生成、署名、検証をセキュアエレメント、ハードウェアアクセラレータ、アプリケーションが定義した暗号プロバイダに振り分けることができ、必要に応じてソフトウェア実装へフォールバックします。Falcon の処理をハードウェアデバイス内で完結させる必要があるアプリケーション向けに、コールバックのみのビルドにも対応しています。
性能と組み込み向けフットプリント
AMD Ryzen 9 7950X3D 上では、高速化構成の wolfCrypt が liboqs 0.15.0 と遜色のない性能を示しました。
Falcon-512
| 処理 | wolfCrypt(高速化構成) | liboqs |
|---|---|---|
| 鍵生成 | 4.32 ms | 4.31 ms |
| 署名 | 0.124 ms | 0.143 ms |
| 検証 | 0.020 ms | 0.025 ms |
Falcon-1024
| 処理 | wolfCrypt(高速化構成) | liboqs |
|---|---|---|
| 鍵生成 | 12.83 ms | 12.86 ms |
| 署名 | 0.270 ms | 0.290 ms |
| 検証 | 0.043 ms | 0.048 ms |
これらの測定では、高速化構成の wolfCrypt は署名が liboqs より約 7〜13 パーセント高速でした。検証についても、いずれのセキュリティレベルでも liboqs を上回っています。
デフォルトの整数演算エミュレーション構成は署名と鍵生成が遅くなりますが、定数時間での演算や、浮動小数点レジスタを使用しないことを重視するアプリケーション向けの選択肢として利用できます。
ネイティブ実装は組み込みターゲットでも良好に動作します。250 MHz で動作する STM32H563(Cortex-M33)では、wolfCrypt は Falcon-512 の鍵生成、署名、検証をリファレンスの liboqs 実装と同等の時間で完了しました。Falcon-1024 についても一連の処理を最後まで実行できています。一方、リファレンス実装では Falcon-1024 のテストが 32 ビット ARM 上で完走しませんでした。
Falcon の全機能を有効にした wolfCrypt ビルドのコードサイズは約 77.1 KB で、テストした liboqs 構成の 140.3 KB より約 45 パーセント小さくなっています。検証のみの wolfCrypt ビルドでは、コードサイズ約 17.3 KB、静的メモリ約 3.1 KB でした。
Falcon-1024 では、実際の動作にも違いが出ました。同じ 32 ビット ARM ターゲットでは、liboqs が使用する PQClean の clean 実装は鍵を生成できるものの、署名を実行しようとすると、生成した秘密鍵がいずれも内部の鍵検証を通りませんでした。そのため、このターゲットでは Falcon-1024 の署名を利用できませんでしたが、wolfCrypt のネイティブ実装は鍵生成から署名、検証までの一連の処理を完了しました。
ビルド方法
デフォルトのネイティブ実装は次のコマンドで有効にできます。
./configure --enable-experimental --enable-falcon
高速化構成やメモリ使用量を抑えた構成は、追加のオプションで選択できます。
# ネイティブの倍精度演算
./configure --enable-experimental --enable-falcon=double
# x86-64 AVX2 による高速化
./configure --enable-experimental --enable-falcon=avx2
# AArch64 NEON による高速化
./configure --enable-experimental --enable-falcon=neon
# メモリ使用量を抑えた署名
./configure --enable-experimental --enable-falcon=small-mem
互換性のあるオプションは組み合わせて指定できます。
./configure --enable-experimental --enable-falcon=avx2,small-mem
署名検証のみを必要とするアプリケーションでは、WOLFSSL_FALCON_VERIFY_ONLY を定義する(または --enable-falcon=verify-only を指定する)ことで、ネイティブの鍵生成と署名をビルドから除外できます。
API の使用例
#include <wolfssl/wolfcrypt/falcon.h>
falcon_key key;
byte sig[FALCON_LEVEL1_SIG_SIZE];
word32 sigLen = sizeof(sig);
int verified;
wc_falcon_init(&key);
wc_falcon_set_level(&key, FALCON_LEVEL1);
wc_falcon_make_key(&key, &rng);
wc_falcon_sign_msg(
msg, msgLen, sig, &sigLen, &key, &rng);
wc_falcon_verify_msg(
sig, sigLen, msg, msgLen, &verified, &key);
wc_falcon_free(&key);
Falcon-1024 を使用する場合は FALCON_LEVEL5 を選択します。API は共通です。実運用のアプリケーションでは、各戻り値を確認し、すべてのエラーパスでリソースを解放してください。
より多くの環境で使えるネイティブ耐量子署名
ネイティブの Falcon 実装により、wolfSSL をお使いの方は liboqs をアプリケーションに追加することなく、実際に Falcon を評価し、FN-DSA に備えられます。
デスクトップやサーバーのアプリケーションでは高速化した実装を選択でき、組み込みやカーネルのアプリケーションでは浮動小数点ハードウェアに依存せずに整数演算エミュレーションのバックエンドを使用できます。検証のみの構成、メモリ使用量を抑えた構成、ハードウェアを利用する構成により、リソースの限られた環境やセキュリティ要件の厳しい環境にも柔軟に対応します。
Falcon 対応は、NIST が FIPS 206 と FN-DSA 規格を完成させるまでは実験的な位置付けのままです。開発者の皆様は、今のうちからアルゴリズムを試し、確定後の FN-DSA の名称や形式への移行に備えることができます。ただし、FIPS 206 が公開された時点で最終的な FN-DSA 対応へ更新する予定であり、API も変更される可能性が高い点にご留意ください。
もし弊社製品についてご質問があれば、お問い合わせ窓口info@wolfssl.jpまでご連絡をお願い致します。
原文:https://www.wolfssl.com/wolfcrypt-now-supports-native-falcon-anticipating-fn-dsa-standardization/