diff --git a/wolfSSL/mkdocs-ja.yml b/wolfSSL/mkdocs-ja.yml index 7f4b8037..0992028a 100644 --- a/wolfSSL/mkdocs-ja.yml +++ b/wolfSSL/mkdocs-ja.yml @@ -6,21 +6,21 @@ copyright: Copyright © 2025 wolfSSL Inc. nav: - "1. 序章": index.md - "2. wolfSSLのビルド": chapter02.md - - "3. wolfSSL入門": chapter03.md + - "3. 入門": chapter03.md - "4. 機能": chapter04.md - - "5. ポータビリティ": chapter05.md + - "5. 移植性": chapter05.md - "6. コールバック": chapter06.md - "7. 鍵と証明書": chapter07.md - "8. デバッグ": chapter08.md - - "9. ライブラリー設計方針": chapter09.md - - "10. wolfCrypt レファレンス": chapter10.md - - "11. SSLチュートリアル": chapter11.md - - "12. 組み込みシステムへの適用": chapter12.md - - "13. OpenSSL 互換": chapter13.md + - "9. ライブラリデザイン": chapter09.md + - "10. wolfCryptの使用法": chapter10.md + - "11. SSL/TLSチュートリアル": chapter11.md + - "12. 組み込みデバイスのベストプラクティス": chapter12.md + - "13. OpenSSL互換性": chapter13.md - "14. ライセンス": chapter14.md - "15. サポートとコンサルティング": chapter15.md - "16. wolfSSLのアップデート": chapter16.md - - "A. wolfSSL API レファレンス": + - "A. wolfSSL APIリファレンス": - "証明書管理 API": group__CertManager.md - "メモリー操作": group__Memory.md - "OpenSSL API": group__openSSL.md @@ -29,7 +29,7 @@ nav: - "wolfSSL コンテクストの設定": group__Setup.md - "wolfSSL エラーの扱いとレポート": group__Debug.md - "wolfSSL 初期化": group__TLS.md - - "B. wolfCrypt API レファレンス": + - "B. wolfCrypt APIリファレンス": - "ASN.1": group__ASN.md - "ベースエンコーディング": group__Base__Encoding.md - "圧縮": group__Compression.md @@ -57,11 +57,11 @@ nav: - "暗号アルゴリズム - ECC": group__ECC.md - "暗号アルゴリズム - ED25519": group__ED25519.md - "暗号アルゴリズム - ED448": group__ED448.md - - "ECCSI API レファレンス": + - "ECCSI API リファレンス": - "ECCSI概要": group__ECCSI__Overview.md - "ECCSI鍵の設定": group__ECCSI__Setup.md - "ECCSI鍵による署名、検証": group__ECCSI__Operations.md - - "SAKKE API レファレンス": + - "SAKKE API リファレンス": - "SAKKE鍵の概要": group__SAKKE__Overview.md - "SAKKE鍵の設定": group__SAKKE__Setup.md - "SAKKE RSK操作": group__SAKKE__RSK.md @@ -80,7 +80,7 @@ nav: - "暗号アルゴリズム - SHA 128/224/256/384/512": group__SHA.md - "暗号アルゴリズム - SipHash": group__SipHash.md - "暗号アルゴリズム - SRP": group__SRP.md - - "C. API ヘッダーファイル": + - "C. APIヘッダーファイル": - aes_8h.md - arc4_8h.md - asn_8h.md @@ -139,7 +139,7 @@ nav: - wc__port_8h.md - wolfio_8h.md - "D. SSL/TLS の概要": appendix04.md - - "E. RFC, 仕様および参照": appendix05.md + - "E. RFC・仕様・リファレンス": appendix05.md - "F. エラーコード": appendix06.md - "G. ポスト量子暗号の実験": appendix07.md - "H. wolfSSL 移植ガイド": appendix08.md diff --git a/wolfSSL/src-ja/CTX_structure.png b/wolfSSL/src-ja/CTX_structure.png new file mode 100644 index 00000000..704ee986 Binary files /dev/null and b/wolfSSL/src-ja/CTX_structure.png differ diff --git a/wolfSSL/src-ja/appendix06.md b/wolfSSL/src-ja/appendix06.md index 4c5de11b..79d05292 100644 --- a/wolfSSL/src-ja/appendix06.md +++ b/wolfSSL/src-ja/appendix06.md @@ -335,4 +335,4 @@ wolfCryptのエラーコードは、`wolfssl/wolfcrypt/error.h`に記載して I/Oコールバックからデータを受信する呼び出しが、現在受信可能なデータがないためブロックされる場合、I/Oコールバックは`WANT_READ`を返します。 呼び出し元は待機し、後で再度受信を試みてください。 これは通常、[`wolfSSL_read()`](group__IO.md#function-wolfssl_read)、[`wolfSSL_negotiate()`](group__IO.md#function-wolfssl_negotiate)、[`wolfSSL_accept()`](group__IO.md#function-wolfssl_accept)、および[`wolfSSL_connect()`](group__IO.md#function-wolfssl_connect)の呼び出しから見られます。 -サンプルクライアントとサーバーは、デバッグ出力が有効である場合に`WANT_READ`を出力します。 \ No newline at end of file +サンプルクライアントとサーバーは、デバッグ出力が有効である場合に`WANT_READ`を出力します。 diff --git a/wolfSSL/src-ja/appendix07.md b/wolfSSL/src-ja/appendix07.md index 364b942a..4da7cc8e 100644 --- a/wolfSSL/src-ja/appendix07.md +++ b/wolfSSL/src-ja/appendix07.md @@ -1,293 +1,147 @@ - - # ポスト量子暗号の実験 +wolfSSLチームは以前、実験的なポスト量子暗号アルゴリズムをwolfSSLライブラリに統合しました。 +これは、Open Quantum Safeチームのliboqsと統合することで実現されました。 +現在、wolfCryptはLMS、XMSS、ML-DSA、ML-KEMを実装しています。 +コードサイズの削減と保守の容易さのため、wolfSSLチームはliboqsとの統合を削除しました。 +この付録は、(D)TLS 1.3のコンテキストでポスト量子暗号について学び、実験したい人を対象としています。 +ポスト量子アルゴリズムが重要である理由、量子の脅威に対応して私たちが行ったこと、これらの新しいアルゴリズムの実験を開始する方法について説明します。 -wolfSSLチームは、実験的なポスト量子暗号アルゴリズムをwolfSSLライブラリに統合しました。これは、Open Quantum SafeチームのLiboqsと統合することで行われました。それらの詳細については、 を参照してください。 - - -この付録は、TLS 1.3のコンテキストで、ポスト量子暗号について学び、実験したい人を対象としています。そポスト量子アルゴリズムが重要である理由、量子の脅威に対応して私たちが行ったこと、これらの新しいアルゴリズムの実験を開始する方法について説明します。 - - -**NOTE**:liboq が提供するポスト量子アルゴリズムは標準化されておらず、実験的なものです。それらが生産環境では使用しないことを強くお勧めします。すべての OID、コードポイント、アーティファクト形式は一時的なものであり、将来変更される予定です。下位互換性がないことに注意してください。 - - -**注**:wolfsslが`--with-liboqs`フラグで構成されていない場合は、これらの実験的アルゴリズムは有効になっていません。 - - +**注意**: 一部のポスト量子アルゴリズムはまだ完全に標準化されていません。一部のOIDとコードポイントは一時的なものであり、将来変更される可能性があります。完全に標準化されるまでは、下位互換性を期待すべきではありません。 ## ポスト量子暗号をわかりやすく紹介 - - - ### なぜポスト量子暗号? +今日では、量子コンピューターの開発にますます多くのリソースが割かれるようになりました。 +そのため、クラウド量子コンピューティングリソースの商業化がすでに始まっています。 +現時点では未だ実用レベルの暗号が解かれた報告はありません。 +しかし、「あらかじめデータを収集、蓄積し、後に時間をかけて解読を進めていく」といった脅威モデルが存在します。 +すなわち、暗号の復号に特化した量子コンピューターが出現するよりも早いうちに準備が必要です。 - -今日では、量子コンピューターの開発にますます多くのリソースが割かれるようになりました。そのため、クラウド量子コンピューティングリソースの商業化がすでに始まっています。現時点では未だ実用レベルの暗号が解かれた報告はありません。しかし、「あらかじめデータを収集、蓄積し、後に時間をかけて解読を進めていく」といった脅威モデルが存在します。すなわち、暗号の復号に特化した量子コンピューターが出現するよりも早いうちに準備が必要です。 - - -NISTが、量子コンピューターに対して脆弱になる公開鍵暗号アルゴリズムを置き換えるように設計された新しいクラスのアルゴリズムの標準化を進めています。この章の執筆時点で、NISTはPQC標準化プロセスの第3ラウンドをほぼ完了させており、2022年初頭に標準化されるアルゴリズムを発表する予定です。その後、プロトコルとデータ形式を記述した標準文書を作成するプロセスにはさらに1年かかると予測されています。さらにその後には、FIPSのような規制の策定が開始される可能性があります。 - - +NISTが、量子コンピューターに対して脆弱になる公開鍵暗号アルゴリズムを置き換えるように設計された、新しいクラスのアルゴリズムの標準化を進めています。 +この章の執筆時点で、NISTはすでにML-DSA、ML-KEM、SLH-DSAを標準化しています。 +現在、標準化団体はOIDとコードポイントを記述する様々なドラフト文書を持っています。 +NISTはこれらのアルゴリズムをCMVP規制フレームワークの下に置き、これらのアルゴリズムの実装のFIPS-140-3検証を可能にする作業を進めています。 ### 私たちは自分自身をどのように守るのですか? - - -大まかに言えば、すべての TLS 1.3 接続において、認証と機密性は各接続を保護する重要な目標です。認証は、ECDSAなどの署名スキームによって維持されます。機密性は、ECDHEなどのキー確立アルゴリズムによって維持され、確立されたキーとAESなどの対称暗号化アルゴリズムを使用して通信ストリームを暗号化します。したがって、TLS 1.3 プロトコルのセキュリティは、次の3種類の暗号化アルゴリズムに分解できます。 - - +大まかに言えば、すべての TLS 1.3 接続において、認証・完全性・機密性は各接続を保護する重要な目標です。 +認証は、ECDSAなどの署名スキームによって維持されます。 +機密性と完全性は、ECDHEなどのキー確立アルゴリズムによって維持され、確立されたキーとAESなどの対称暗号化アルゴリズムを使用して通信ストリームを暗号化します。 +したがって、TLS 1.3 プロトコルのセキュリティは、次の3種類の暗号化アルゴリズムに分解できます。 * 認証アルゴリズム - - -* キー確立アルゴリズム - - +* 鍵確立アルゴリズム * 対称暗号アルゴリズム +量子コンピュータが従来の暗号に及ぼす脅威には、2つの形態があります。 +グローバーのアルゴリズムは、最新の対称暗号アルゴリズムのセキュリティを半分に低下させます。 +ショアのアルゴリズムは、最新の認証および鍵確立アルゴリズムのセキュリティを完全に破壊します。 +したがって、暗号処理に特化した量子コンピュータが存在する場合でも、十分に安全と考えられるAES-256対称暗号を使用して通信を保護し続けることができます。 +そして、従来の認証および鍵確立アルゴリズムをポスト量子アルゴリズムに置き換えることができます。 +TLS 1.3ハンドシェイク中、暗号スイートは接続の間使用される対称暗号を指定することに注意してください。 +CNSA(商用国家安全保障アルゴリズムスイート)1.0と2.0はともにAES_256_GCM_SHA384暗号スイートの使用を規定しています。 +鍵確立と認証については、ポスト量子KEM(鍵カプセル化メカニズム)と署名スキームがあります。 +これらは従来のアルゴリズムとは異なる種類の数学を使用します。 +量子コンピュータに対する耐性を特に考慮して設計されたものです。 +NISTがネットワークプロトコルでの使用のために標準化した認証アルゴリズムとKEMは、格子ベースのアルゴリズムです。 -量子コンピュータが従来の暗号に及ぼす脅威には2つの形態があります。グローバーのアルゴリズムは、最新の対称暗号アルゴリズムのセキュリティを半分に低下させ、ショアのアルゴリズムは、最新の認証および鍵確立アルゴリズムのセキュリティを完全に破壊します。その結果、対称暗号アルゴリズムの強度を2倍にし、従来の認証および鍵確立アルゴリズムをポスト量子アルゴリズムに置き換えることで、通信を保護し続けることができます。TLS 1.3 ハンドシェイク中、暗号スイートは接続中に使用される対称暗号を指定します。AES-128は一般的に十分であると認められているため、AES_256_GCM_SHA384暗号スイートを使用することで強度を2倍にすることができます。鍵確立と認証には、ポスト量子KEM (Key Encapsulation Mechanisms) と署名スキームがあります。 +* ML-DSA(Dilithium)署名スキーム +* ML-KEM(KYBER)KEM +**注意**: SABER KEMとNTRU KEMは標準化に進まなかったため、非推奨となり削除されました。 -これらは量子コンピュータへの耐性のため、従来のアルゴリズムとは異なる種類の数学を使用して特別に設計されます。私たちが統合することを選択した認証アルゴリズムとKEMはすべて格子ベースのアルゴリズムです。 +**注意**: KYBER KEM 90sバリアントはNISTが標準化を検討していないため、非推奨となり削除されました。 +**注意**: Dilithium署名スキームのAESバリアントはNISTが標準化を検討していないため、非推奨となり削除されました。 -* ダイリチウム署名スキーム - - -* ファルコン署名スキーム - - -* KYBER KEM - - -注: SABRE KEM と NTRU KEM は非推奨となり、標準化に移行しなかったため削除されました。 - - -注: KYBER KEM 90s の亜種は非推奨となり、NIST が標準化を検討していないため削除されました。 - - -注: ダイリチウム署名方式の AES バリアントは非推奨となり、NIST が標準化を検討していないため削除されました。 - - - -格子ベースの暗号化の説明はこのドキュメントの範囲外のため、これらのアルゴリズムに関する詳細は、NIST の公開文書 をご確認ください。 - - -残念ながら、この章を記している時点においてこれらのアルゴリズムが量子コンピューターからの攻撃に耐えられるかどうかは、まだ分かっていません。従来型コンピューターにおける攻撃耐性も同様です。可能性はますます低くなっていますが、誰かが格子ベースの暗号化を破る可能性があります。ただし、暗号化は常にこのような経緯で機能してきた歴史があります。アルゴリズムは使い始めたときは優れていますが、弱点や脆弱性が発見され、テクノロジーは順次改善されます。ポスト量子アルゴリズムは比較的新しいため、コミュニティからもう少し注目する必要があるかもしれません。 - - -解決策の1つは、これらの新しいアルゴリズムを完全には信頼しないことです。今のところ、ポスト量子KEMを、信頼している従来のアルゴリズムとハイブリッド化することで、このリスクを回避することができます。FIPS準拠を第一に考えると、NIST標準曲線を使用したECCは良い選択肢になります。このため、ポスト量子KEMを統合するだけでなく、NISTが承認した曲線上のECDSAとハイブリッド化しました。詳しくは以下のハイブリッドグループのリストを参照してください。 +**注意**: liboqs統合が削除された際、FALCONとSPHINCS+署名スキームも削除されました。今後、独自の実装を提供する予定です。 +格子ベースの暗号化の説明はこの文書の範囲を超えますが、これらのアルゴリズムに関する詳細情報はNIST提出物で確認できます。 + -## wolfSSLのLiboqs統合を始めましょう +残念ながら、この章を記している時点においてこれらのアルゴリズムが量子コンピューターからの攻撃に耐えられるかどうかは、まだ分かっていません。 +従来型コンピューターにおける攻撃耐性も同様です。 +可能性はますます低くなっていますが、誰かが格子ベースの暗号化を破る可能性があります。 +ただし、暗号化は常にこのような経緯で機能してきた歴史があります。 +アルゴリズムは使い始めたときは優れていますが、弱点や脆弱性が発見され、テクノロジーは順次改善されます。 +ポスト量子アルゴリズムは比較的新しいため、コミュニティからもう少し注目を集める必要があるかもしれません。 +解決策の1つは、これらの新しいアルゴリズムを完全には信頼しないことです。 +今のところ、ポスト量子KEMを、信頼している従来のアルゴリズムとハイブリッド化することで、このリスクを回避することができます。 +FIPS準拠を第一に考えると、NIST標準曲線を使用したECCは良い選択肢になります。 +このため、ポスト量子KEMを統合するだけでなく、NISTが承認した曲線上のECDSAとハイブリッド化しました。 +詳しくは以下のハイブリッドグループのリストを参照してください。 +## wolfSSLのでポスト量子暗号を始めましょう -ここでは、まっさらなLinux環境から安全なTLS 1.3接続を実行できるようにするまでの手順を示します。 +ここではまっさらなLinux環境をもとに、量子耐性を有する安全なTLS 1.3接続を実行できるようにするまでの手順を示します。 ### ビルド手順 -wolfSSLリポジトリのINSTALLファイル (https://github.com/wolfSSL/wolfssl/blob/master/INSTALL) を参照してください。 - -項目 15 (TLS 1.3 用の liboq を使用したビルド [実験的]) には、構成とビルドの方法に関する説明があります。 - - -* liboqs - - -* wolfssl - - -* OQS の OpenSSL フォークにパッチを適用 +wolfSSLリポジトリの[INSTALLファイル](https://github.com/wolfSSL/wolfssl/blob/master/INSTALL) をご参照ください。 +項目15には、構成とビルドの方法に関する説明があります。 -ポスト量子暗号鍵と署名を使用して X.509 証明書を生成するには、パッチを適用した OQS OpenSSL フォークが必要です。手順は https://github.com/wolfSSL/osp/tree/master/oqs/README.md にあります。ポスト量子署名スキームを使用したくない場合は、OpenSSL を構築するステップをスキップできます。 +ポスト量子暗号鍵と署名を使用して X.509 証明書を生成するには、パッチを適用した OQS OpenSSL Providerフォークが必要です。 +手順は にあります。 +事前に生成された証明書もそこで入手できます。 -### 量子安全な TLS 接続を確立する +### 量子安全なTLS接続を確立する 次のようにして、サーバーとクライアントを別々のターミナルで実行します。 ```sh -examples/server/server -v 4 -l TLS_AES_256_GCM_SHA384 \ - -A certs/falcon_level5_root_cert.pem \ - -c certs/falcon_level1_entity_cert.pem \ - -k certs/falcon_level1_entity_key.pem \ - --oqs P521_KYBER_LEVEL5 + $ examples/server/server -v 4 -l TLS_AES_256_GCM_SHA384 \ + -A certs/mldsa87_root_cert.pem \ + -c certs/mldsa44_entity_cert.pem \ + -k certs/mldsa44_entity_key.pem \ + --pqc P521_ML_KEM_1024 ``` ```sh -examples/client/client -v 4 -l TLS_AES_256_GCM_SHA384 \ - -A certs/falcon_level1_root_cert.pem \ - -c certs/falcon_level5_entity_cert.pem \ - -k certs/falcon_level5_entity_key.pem \ - --oqs P521_KYBER_LEVEL5 + $ examples/client/client -v 4 -l TLS_AES_256_GCM_SHA384 \ + -A certs/mldsa44_root_cert.pem \ + -c certs/mldsa87_entity_cert.pem \ + -k certs/mldsa87_entity_key.pem \ + --pqc P521_ML_KEM_1024 ``` -対称暗号化に AES-256、認証に FALCON 署名方式、キー確立に KYBER KEM とハイブリッド化された ECDHE を使用して、完全に量子安全な TLS 1.3 接続を実現しました。他のポスト量子の例についての詳細は、https://github.com/wolfSSL/wolfssl-examples/blob/master/pq/README.md で見つけることができます。 - - -## wolfSSLとOQSのフォークのOpenSSLの間の命名規則マッピング - - - -NIST PQCコンテストに応募したすべてのチームは、NISTが定義する複数のセキュリティレベルをサポートしていました。 - - - -そのため、各チームはバリアントを識別する方法を考え出す必要があり、各チームが独自のバリアント命名スキームを考え出しました。次の表からわかるように、この方法についてチーム間で調整はありませんでした。wolfSSL ライブラリは、バリアントのNISTレベルベースの命名規則を使用します。OQSチームは、各応募論文の命名規則に従うことを選択しました。次の表で、当社の命名規則と応募論文の命名規則をマッピングしています。 - - -ポスト量子署名方式の命名規則:: - -wolfSSLバリアント名|PQC提出バリアント名 --------------------- | --------------------------- -FALCON_LEVEL1 | FALCON512 -FALCON_LEVEL5 | FALCON1024 -DILITHIUM_LEVEL2 | DILITHIUM2 -DILITHIUM_LEVEL3 | DILITHIUM3 -DILITHIUM_LEVEL5 | DILITHIUM5 -SPHINCS_FAST_LEVEL1 | SPHINCS+-SHAKE256-128f-simple -SPHINCS_FAST_LEVEL3 | SPHINCS+-SHAKE256-192f-simple -SPHINCS_FAST_LEVEL5 | SPHINCS+-SHAKE256-256f-simple -SPHINCS_SMALL_LEVEL1 | SPHINCS+-SHAKE256-128s-simple -SPHINCS_SMALL_LEVEL3 | SPHINCS+-SHAKE256-192s-simple -SPHINCS_SMALL_LEVEL5 | SPHINCS+-SHAKE256-256s-simple - - - -ポスト量子KEM命名規則: - -wolfSSLバリアント名|PQC提出バリアント名 --------------------- | --------------------------- -KYBER_LEVEL1 | KYBER512 -KYBER_LEVEL3 | KYBER768 -KYBER_LEVEL5 | KYBER1024 - - -ポスト量子ハイブリッド KEM 命名規則: - -wolfSSLバリアント名|NIST ECC曲線とPQC提出バリアント名 --------------------- | ---------------------------------------------- -P256_KYBER_LEVEL1 | ECDSA P-256 and KYBER512 -P384_KYBER_LEVEL3 | ECDSA P-384 and KYBER768 -P521_KYBER_LEVEL5 | ECDSA P-521 and KYBER1024 - - - - -## コードポイントとOID - - - -当社がサポートする耐量子署名アルゴリズムとKEMは、OQSプロジェクトのOpenSSLフォークでもサポートされています。命名規則は当社のものとは異なりますが、同じ数値OIDとコードポイントを使用し、暗号化アーティファクトが同じライブラリ (liboqs) によって生成および処理されるという点で、完全な相互運用性があります。コードポイントは、TLS 1.3のsigalgsおよびサポートされるグループ拡張で使用されます。OIDは、公開鍵、秘密鍵、署名の識別子として証明書と秘密鍵で使用されます。 - - -TLS 1.3のための量子コードポイント - -wolfSSLバリアント名|コードポイント --------------------- | ---------- -FALCON_LEVEL1 | 65035 -FALCON_LEVEL5 | 65038 -DILITHIUM_LEVEL2 | 65184 -DILITHIUM_LEVEL3 | 65187 -DILITHIUM_LEVEL5 | 65189 -KYBER_LEVEL1 | 570 -KYBER_LEVEL3 | 572 -KYBER_LEVEL5 | 573 -P256_KYBER_LEVEL1 | 12090 -P384_KYBER_LEVEL3 | 12092 -P521_KYBER_LEVEL5 | 12093 - - -証明書の Post-Quantum OID: - -wolfSSLバリアント名|oid --------------------- | --- -FALCON_LEVEL1 | 1.3.9999.3.1 -FALCON_LEVEL5 | 1.3.9999.3.4 -DILITHIUM_LEVEL2 | 1.3.6.1.4.1.2.267.7.4.4 -DILITHIUM_LEVEL3 | 1.3.6.1.4.1.2.267.7.6.5 -DILITHIUM_LEVEL5 | 1.3.6.1.4.1.2.267.7.8.7 -SPHINCS_FAST_LEVEL1 | 1.3.9999.6.7.4 -SPHINCS_FAST_LEVEL3 | 1.3.9999.6.8.3 -SPHINCS_FAST_LEVEL5 | 1.3.9999.6.9.3 -SPHINCS_SMALL_LEVEL1 | 1.3.9999.6.7.10 -SPHINCS_SMALL_LEVEL3 | 1.3.9999.6.8.7 -SPHINCS_SMALL_LEVEL5 | 1.3.9999.6.9.7 - - -## 暗号化アーティファクトサイズ - - - -以下に示すサイズの単位はバイトです。 - - -量子署名方式のアーティファクトサイズ: - -wolfSSLバリアント名|公開鍵サイズ|秘密鍵サイズ|最大署名サイズ --------------------- | --------------- | ---------------- | ---------------------- -FALCON_LEVEL1 | 897 | 1281 | 690 -FALCON_LEVEL5 | 1793 | 2305 | 1330 -DILITHIUM_LEVEL2 | 1312 | 2528 | 2420 -DILITHIUM_LEVEL3 | 1952 | 4000 | 3293 -DILITHIUM_LEVEL5 | 2592 | 4864 | 4595 -SPHINCS_FAST_LEVEL1 | 32 | 64 | 17088 -SPHINCS_FAST_LEVEL3 | 48 | 96 | 35664 -SPHINCS_FAST_LEVEL5 | 64 | 128 | 49856 -SPHINCS_SMALL_LEVEL1 | 32 | 64 | 7856 -SPHINCS_SMALL_LEVEL3 | 48 | 96 | 16224 -SPHINCS_SMALL_LEVEL5 | 64 | 128 | 29792 - - - - -**注**:Falconには、いくつかの署名サイズがあります。 - - -耐量子 KEM アーティファクトのサイズ: - -wolfSSLバリアント名|公開鍵サイズ|秘密鍵サイズ|暗号文サイズ|共有秘密のサイズ --------------------- | --------------- | ---------------- | --------------- | ------------------ -KYBER_LEVEL1 | 800 | 1632 | 768 | 32 -KYBER_LEVEL3 | 1184 | 2400 | 1088 | 32 -KYBER_LEVEL5 | 1568 | 3168 | 1568 | 32 -KYBER_90S_LEVEL1 | 800 | 1632 | 768 | 32 -KYBER_90S_LEVEL3 | 1184 | 2400 | 1088 | 32 -KYBER_90S_LEVEL5 | 1568 | 3168 | 1568 | 32 - - - +これで、対称暗号化にAES-256、認証にML-DSA署名スキーム、鍵確立にECDHEとML-KEMをハイブリッド化した完全な量子安全なTLS 1.3接続を実現しました。 +その他のポスト量子の例に関する詳細情報は で確認できます。 -## 統計的データ +## 暗号アーティファクトのサイズ -以下の統計とベンチマークは、Ubuntu 21.10を実行している第11世代 Intel Core i7-1165G7@3-GHz(8コア) で取得しました。liboqs は、`0.7.0` の古いコードとのコンパイラの非互換性のため、メインブランチで `ba5b61a779a0db364f0e691a0a0bc8ac42e73f1b` を使用しています。特記のない限り、構成オプションは以下のとおりです。 +すべてのサイズはバイト単位です。 +### ポスト量子署名スキームのアーティファクトサイズ -liboqs: +PQCバリアント名 | 公開鍵サイズ | 秘密鍵サイズ | 最大署名サイズ +-------------- | ----------- | ------------ | -------------- +ML_DSA_44 | 1312 | 2560 | 2420 +ML_DSA_65 | 1952 | 4032 | 3309 +ML_DSA_87 | 2592 | 4896 | 4627 +### ポスト量子KEMのアーティファクトサイズ +PQCバリアント名 | 公開鍵サイズ | 秘密鍵サイズ | 暗号文サイズ | 共有秘密サイズ +-------------- | ----------- | ------------ | ----------- | -------------- +ML_KEM_512 | 800 | 1632 | 768 | 32 +ML_KEM_768 | 1184 | 2400 | 1088 | 32 +ML_KEM_1024 | 1568 | 3168 | 1568 | 32 -```text -CFLAGS="-Os" cmake -DOQS_USE_OPENSSL=0 -DOQS_MINIMAL_BUILD="OQS_ENABLE_KEM_saber_saber;OQS_ENABLE_KEM_saber_lightsaber;OQS_ENABLE_KEM_saber_firesaber;OQS_ENABLE_KEM_kyber_1024;OQS_ENABLE_KEM_kyber_1024_90s;OQS_ENABLE_KEM_kyber_768;OQS_ENABLE_KEM_kyber_768_90s;OQS_ENABLE_KEM_kyber_512;OQS_ENABLE_KEM_kyber_512_90s;OQS_ENABLE_KEM_ntru_hps2048509;OQS_ENABLE_KEM_ntru_hps2048677;OQS_ENABLE_KEM_ntru_hps4096821;OQS_ENABLE_KEM_ntru_hrss701;OQS_ENABLE_SIG_falcon_1024;OQS_ENABLE_SIG_falcon_512;OQS_ENABLE_SIG_dilithium_2;OQS_ENABLE_SIG_dilithium_3;OQS_ENABLE_SIG_dilithium_5;OQS_ENABLE_SIG_dilithium_2_aes;OQS_ENABLE_SIG_dilithium_3_aes;OQS_ENABLE_SIG_dilithium_5_aes" .. -``` - - - -wolfssl: - +## 統計データ +以下の統計とベンチマークは、8コアのUbuntu 22.04.5 LTSを実行している第11世代Intel Core i7-1185G7@3-GHzで取得されました。 ```text -./configure --with-liboqs \ +./configure --enable-kyber \ + --enable-dilithium \ --disable-psk \ --disable-shared \ --enable-intelasm \ @@ -297,64 +151,43 @@ wolfssl: CFLAGS="-Os" ``` +**注**:主に耐量子アルゴリズムをベンチマークしていますが、比較目的のために従来のアルゴリズムも残しています。 +### 実行時バイナリサイズ -**注**:主に耐量子アルゴリズムをベンチマークしていますが、比較目的のために従来のアルゴリズムを残しています。 - - - -### ランタイムバイナリサイズ - - - -`tls_bench` サンプルプログラムのバイナリファイルは約2.4MB、`--with-liboqs` を使用しない場合には559kBです。約1.9MBの違いがあります。 - - +`tls_bench`サンプルアプリケーションのバイナリファイルは、ビルド後にストリップすると2498432バイト(約2.4M)です。 +`--enable-kyber --enable-dilithium`なしでは、ビルド後にストリップすると2290912バイト(約2.2M)です。 +これは207520バイト(約200K)の差です。 ### TLS 1.3データ送信サイズ +サンプルサーバーとクライアントを実行し、送信されるすべての情報をWiresharkで記録することによって取得した値を以下に示します。 +これには、相互認証による TLS 1.3 ハンドシェイク、"hello wolfssl!"、"I hear you fa shizzle!" メッセージが含まれます。 +すべてのパケットの `tcp.len` を合計しました。 +暗号スイート | 認証 | 鍵確立 | 合計バイト +---------------------- | -------------------- | --------------------- | ----------- +TLS_AES_256_GCM_SHA384 | RSA 2048ビット | ECC SECP256R1 | 5455 +TLS_AES_256_GCM_SHA384 | RSA 2048ビット | ML_KEM_512 | 6633 +TLS_AES_256_GCM_SHA384 | RSA 2048ビット | ML_KEM_768 | 7337 +TLS_AES_256_GCM_SHA384 | RSA 2048ビット | ML_KEM_1024 | 8201 +TLS_AES_256_GCM_SHA384 | RSA 2048ビット | P256_ML_KEM_512 | 6763 +TLS_AES_256_GCM_SHA384 | RSA 2048ビット | P384_ML_KEM_768 | 7531 +TLS_AES_256_GCM_SHA384 | RSA 2048ビット | P521_ML_KEM_1024 | 8467 +TLS_AES_256_GCM_SHA384 | ML_DSA_44 | ECC SECP256R1 | 7918 +TLS_AES_256_GCM_SHA384 | ML_DSA_65 | ECC SECP256R1 | 10233 +TLS_AES_256_GCM_SHA384 | ML_DSA_87 | ECC SECP256R1 | 13477 -サンプルサーバーとクライアントを実行し、送信されるすべての情報をWiresharkで記録することによって取得した値を以下に示します。これには、相互認証による TLS 1.3 ハンドシェイク、"hello wolfssl!"、"I hear you fa shizzle!" メッセージが含まれます。すべてのパケットの `tcp.len` を合計しました。 - -ciphersuite |認証|キー施設|合計バイト ----------------------- | -------------- | --------------------- | ----------- -TLS_AES_256_GCM_SHA384 | RSA 2048 bit | ECC SECP256R1 | 5455 -TLS_AES_256_GCM_SHA384 | RSA 2048 bit | KYBER_LEVEL1 | 6633 -TLS_AES_256_GCM_SHA384 | RSA 2048 bit | KYBER_LEVEL3 | 7337 -TLS_AES_256_GCM_SHA384 | RSA 2048 bit | KYBER_LEVEL5 | 8201 -TLS_AES_256_GCM_SHA384 | RSA 2048 bit | KYBER_90S_LEVEL1 | 6633 -TLS_AES_256_GCM_SHA384 | RSA 2048 bit | KYBER_90S_LEVEL3 | 7337 -TLS_AES_256_GCM_SHA384 | RSA 2048 bit | KYBER_90S_LEVEL5 | 8201 -TLS_AES_256_GCM_SHA384 | RSA 2048 bit | P256_KYBER_LEVEL1 | 6763 -TLS_AES_256_GCM_SHA384 | RSA 2048 bit | P384_KYBER_LEVEL3 | 7531 -TLS_AES_256_GCM_SHA384 | RSA 2048 bit | P521_KYBER_LEVEL5 | 8467 -TLS_AES_256_GCM_SHA384 | RSA 2048 bit | P256_KYBER90S_LEVEL1 | 6763 -TLS_AES_256_GCM_SHA384 | RSA 2048 bit | P384_KYBER90S_LEVEL3 | 7531 -TLS_AES_256_GCM_SHA384 | RSA 2048 bit | P521_KYBER90S_LEVEL5 | 8467 -TLS_AES_256_GCM_SHA384 | FALCON_LEVEL1 | ECC SECP256R1 | 6997 -TLS_AES_256_GCM_SHA384 | FALCON_LEVEL5 | ECC SECP256R1 | 11248 -TLS_AES_256_GCM_SHA384 | FALCON_LEVEL1 | KYBER_LEVEL1 | 8180 -TLS_AES_256_GCM_SHA384 | FALCON_LEVEL1 | P256_KYBER_LEVEL1 | 8308 -TLS_AES_256_GCM_SHA384 | FALCON_LEVEL5 | KYBER_LEVEL5 | 14007 -TLS_AES_256_GCM_SHA384 | FALCON_LEVEL5 | P521_KYBER_LEVEL5 | 14257 -TLS_AES_256_GCM_SHA384 | DILITHIUM_LEVEL2 | ECC SECP256R1 | 7918 -TLS_AES_256_GCM_SHA384 | DILITHIUM_LEVEL3 | ECC SECP256R1 | 10233 -TLS_AES_256_GCM_SHA384 | DILITHIUM_LEVEL5 | ECC SECP256R1 | 13477 - - - -### ヒープとスタックの使用 - +### ヒープとスタックの使用量 +**注意**:これは古い情報です。これらはwolfSSLがこれらのアルゴリズムのliboqs実装を使用していた時に取得されたものです。歴史的な目的のために残されています。 これらの統計は、次の構成フラグを追加して取得しました。 + `--enable-trackmemory --enable-stacksize` クライアントのサーバー認証なしのサーバー署名とクライアント検証、鍵交換用の TLS13-AES256-GCM-SHA384 暗号スイートおよび ECC SECP256R1 におけるメモリ使用量を以下に示します。 - - ```text Server FALCON_LEVEL1 @@ -447,13 +280,8 @@ heap total = 202472 heap peak = 41760 ``` - - -KEMグループのメモリ使用。サーバーのクライアント認証には TLS13-AES256-GCM-SHA384 暗号スイートおよび RSA-2048 を使用し、クライアントのサーバー認証は使用しません。 - -KEM グループのメモリ使用量を示します。サーバーのクライアント認証には TLS13-AES256-GCM-SHA384とRSA-2048を使用し、クライアントのサーバー認証は行いません。 - - +KEM グループのメモリ使用量を示します。 +サーバーのクライアント認証には TLS13-AES256-GCM-SHA384とRSA-2048を使用し、クライアントのサーバー認証は行いません。 ```text Server KYBER_LEVEL1 @@ -639,54 +467,15 @@ heap total = 202472 heap peak = 41760 ``` - - - - -### LiboqsのKEMSのベンチマーク - - -操作|反復|トータルタイム(S)|時間(米国):平均|ポップ。stdev |CPUサイクル:平均|ポップ。st st ------------------ | ---------- | -------------- | --------------- | ---------- | ---------------- | ---------- -Kyber512 | | | | | | -keygen | 443212 | 3.000 | 6.769 | 3.282 | 20223 | 9715 -encaps | 339601 | 3.000 | 8.834 | 4.557 | 26411 | 13574 -decaps | 479954 | 3.000 | 6.251 | 3.594 | 18672 | 10669 -Kyber768 | | | | | | -keygen | 277967 | 3.000 | 10.793 | 5.490 | 32274 | 16375 -encaps | 225082 | 3.000 | 13.329 | 6.301 | 39871 | 18812 -decaps | 306782 | 3.000 | 9.779 | 5.063 | 29240 | 15097 -Kyber1024 | | | | | | -keygen | 216179 | 3.000 | 13.877 | 6.734 | 41513 | 20108 -encaps | 164469 | 3.000 | 18.241 | 8.353 | 54579 | 24968 -decaps | 217755 | 3.000 | 13.777 | 6.831 | 41210 | 20396 -Kyber512-90s | | | | | | -keygen | 526948 | 3.000 | 5.693 | 2.795 | 17001 | 8235 -encaps | 380383 | 3.000 | 7.887 | 4.225 | 23570 | 12569 -decaps | 638653 | 3.000 | 4.697 | 2.896 | 14020 | 8543 -Kyber768-90s | | | | | | -keygen | 394138 | 3.000 | 7.612 | 4.117 | 22746 | 12249 -encaps | 271196 | 3.000 | 11.062 | 5.881 | 33080 | 17557 -decaps | 424172 | 3.000 | 7.073 | 4.189 | 21132 | 12457 -Kyber1024-90s | | | | | | -keygen | 278748 | 3.000 | 10.762 | 5.507 | 32182 | 16420 -encaps | 202208 | 3.000 | 14.836 | 7.486 | 44385 | 22368 -decaps | 299571 | 3.000 | 10.014 | 5.489 | 29945 | 16383 - - - - ### ベンチマーク +#### wolfCryptによるベンチマーク - -次のベンチマークは、次の設定フラグを使用して取得しました。 - - +以下のベンチマークは次の設定フラグを使用して取得されました。 ```text -./configure --with-liboqs \ - --disable-psk \ +./configure --enable-kyber \ + --enable-dilithium \ --disable-shared \ --enable-intelasm \ --enable-aesni \ @@ -696,400 +485,406 @@ decaps | 299571 | 3.000 | 10.014 | 5.489 | CFLAGS="-Os -DECC_USER_CURVES -DHAVE_ECC256 -DHAVE_ECC384" ``` - - - -#### wolfCryptのベンチマーク - - - -**注**:シングルコアで測定したものです。 - - +**注意**: 1つのコアのみが使用されています。 ```text -ECC SECP256R1 key gen 95600 ops took 1.000 sec, avg 0.010 ms, 95555.939 ops/sec -ECDHE SECP256R1 agree 26100 ops took 1.002 sec, avg 0.038 ms, 26038.522 ops/sec -ECDSA SECP256R1 sign 63400 ops took 1.001 sec, avg 0.016 ms, 63320.787 ops/sec -ECDSA SECP256R1 verify 24000 ops took 1.000 sec, avg 0.042 ms, 23994.983 ops/sec -FALCON_level1 sign 5000 ops took 1.008 sec, avg 0.202 ms, 4961.637 ops/sec -FALCON_level1 verify 27400 ops took 1.001 sec, avg 0.037 ms, 27361.394 ops/sec -FALCON_level5 sign 2600 ops took 1.030 sec, avg 0.396 ms, 2523.187 ops/sec -FALCON_level5 verify 14400 ops took 1.002 sec, avg 0.070 ms, 14376.179 ops/sec -DILITHIUM_level2 sign 16200 ops took 1.003 sec, avg 0.062 ms, 16150.689 ops/sec -DILITHIUM_level2 verify 44500 ops took 1.000 sec, avg 0.022 ms, 44478.388 ops/sec -DILITHIUM_level3 sign 10200 ops took 1.002 sec, avg 0.098 ms, 10179.570 ops/sec -DILITHIUM_level3 verify 27100 ops took 1.003 sec, avg 0.037 ms, 27017.485 ops/sec -DILITHIUM_level5 sign 8400 ops took 1.009 sec, avg 0.120 ms, 8321.684 ops/sec -DILITHIUM_level5 verify 17000 ops took 1.004 sec, avg 0.059 ms, 16933.788 ops/sec -kyber_level1-kg 143608 ops took 1.000 sec, avg 0.007 ms, 143607.555 ops/sec -kyber_level1-ed 64800 ops took 1.001 sec, avg 0.015 ms, 64725.835 ops/sec -kyber_level3-kg 89790 ops took 1.000 sec, avg 0.011 ms, 89789.550 ops/sec -kyber_level3-ed 42200 ops took 1.000 sec, avg 0.024 ms, 42190.886 ops/sec -kyber_level5-kg 69362 ops took 1.000 sec, avg 0.014 ms, 69361.587 ops/sec -kyber_level5-ed 31700 ops took 1.003 sec, avg 0.032 ms, 31606.130 ops/sec -kyber90s_level1-kg 173655 ops took 1.000 sec, avg 0.006 ms, 173654.131 ops/sec -kyber90s_level1-ed 77500 ops took 1.001 sec, avg 0.013 ms, 77424.888 ops/sec -kyber90s_level3-kg 125138 ops took 1.000 sec, avg 0.008 ms, 125138.000 ops/sec -kyber90s_level3-ed 55200 ops took 1.001 sec, avg 0.018 ms, 55153.726 ops/sec -kyber90s_level5-kg 92773 ops took 1.000 sec, avg 0.011 ms, 92772.359 ops/sec -kyber90s_level5-ed 39300 ops took 1.000 sec, avg 0.025 ms, 39283.188 ops/sec +CPU: Intel x86_64 - avx1 avx2 rdrand rdseed bmi2 aesni adx movbe bmi1 sha +Math: Multi-Precision: Disabled + Single Precision: ecc 256 384 521 rsa/dh 2048 3072 4096 asm sp_x86_64.c + +ECC SECP256R1 key gen 95600 ops took 1.000 sec, avg 0.010 ms, 95587.830 ops/sec +ECDHE SECP256R1 agree 24800 ops took 1.003 sec, avg 0.040 ms, 24737.512 ops/sec +ECDSA SECP256R1 sign 61400 ops took 1.001 sec, avg 0.016 ms, 61337.775 ops/sec +ECDSA SECP256R1 verify 23000 ops took 1.001 sec, avg 0.044 ms, 22976.012 ops/sec +ML-KEM 512 key gen 284600 ops took 1.000 sec, avg 0.004 ms, 284565.467 ops/sec +ML-KEM 512 encap 270800 ops took 1.000 sec, avg 0.004 ms, 270749.585 ops/sec +ML-KEM 512 decap 172900 ops took 1.000 sec, avg 0.006 ms, 172896.249 ops/sec +ML-KEM 768 key gen 159800 ops took 1.000 sec, avg 0.006 ms, 159776.306 ops/sec +ML-KEM 768 encap 152800 ops took 1.000 sec, avg 0.007 ms, 152765.071 ops/sec +ML-KEM 768 decap 100100 ops took 1.000 sec, avg 0.010 ms, 100091.147 ops/sec +ML-KEM 1024 key gen 108300 ops took 1.000 sec, avg 0.009 ms, 108277.024 ops/sec +ML-KEM 1024 encap 104400 ops took 1.000 sec, avg 0.010 ms, 104388.900 ops/sec +ML-KEM 1024 decap 74100 ops took 1.001 sec, avg 0.014 ms, 74057.147 ops/sec +ML-DSA 44 key gen 20700 ops took 1.004 sec, avg 0.049 ms, 20617.041 ops/sec +ML-DSA 44 sign 5100 ops took 1.019 sec, avg 0.200 ms, 5003.233 ops/sec +ML-DSA 44 verify 18500 ops took 1.005 sec, avg 0.054 ms, 18403.134 ops/sec +ML-DSA 65 key gen 10200 ops took 1.007 sec, avg 0.099 ms, 10133.468 ops/sec +ML-DSA 65 sign 2900 ops took 1.004 sec, avg 0.346 ms, 2887.112 ops/sec +ML-DSA 65 verify 11600 ops took 1.005 sec, avg 0.087 ms, 11544.122 ops/sec +ML-DSA 87 key gen 7700 ops took 1.013 sec, avg 0.132 ms, 7598.278 ops/sec +ML-DSA 87 sign 2600 ops took 1.000 sec, avg 0.385 ms, 2599.634 ops/sec +ML-DSA 87 verify 7200 ops took 1.007 sec, avg 0.140 ms, 7152.274 ops/sec ``` +#### wolfSSLによるベンチマーク - - -#### wolfSSLのベンチマーク - - - -**注**:2コアで測定したものです。 - - +以下のベンチマークは次の設定フラグを使用して取得されました。 ```text -wolfSSL Server Benchmark on TLS13-AES256-GCM-SHA384 with group ECC_SECP256R1: - Total : 209715200 bytes - Num Conns : 801 - Rx Total : 238.549 ms - Tx Total : 80.893 ms - Rx : 419.200 MB/s - Tx : 1236.204 MB/s - Connect : 552.092 ms - Connect Avg : 0.689 ms -wolfSSL Client Benchmark on TLS13-AES256-GCM-SHA384 with group ECC_SECP256R1: - Total : 209715200 bytes - Num Conns : 801 - Rx Total : 264.171 ms - Tx Total : 77.399 ms - Rx : 378.542 MB/s - Tx : 1292.002 MB/s - Connect : 550.630 ms - Connect Avg : 0.687 ms - -wolfSSL Server Benchmark on TLS13-AES256-GCM-SHA384 with group ECC_SECP384R1: - Total : 164626432 bytes - Num Conns : 629 - Rx Total : 207.183 ms - Tx Total : 68.783 ms - Rx : 378.892 MB/s - Tx : 1141.270 MB/s - Connect : 508.584 ms - Connect Avg : 0.809 ms -wolfSSL Client Benchmark on TLS13-AES256-GCM-SHA384 with group ECC_SECP384R1: - Total : 164626432 bytes - Num Conns : 629 - Rx Total : 228.902 ms - Tx Total : 65.852 ms - Rx : 342.942 MB/s - Tx : 1192.073 MB/s - Connect : 506.299 ms - Connect Avg : 0.805 ms - -wolfSSL Server Benchmark on TLS13-AES256-GCM-SHA384 with group FFDHE_2048: - Total : 125829120 bytes - Num Conns : 481 - Rx Total : 158.742 ms - Tx Total : 53.102 ms - Rx : 377.971 MB/s - Tx : 1129.896 MB/s - Connect : 579.937 ms - Connect Avg : 1.206 ms -wolfSSL Client Benchmark on TLS13-AES256-GCM-SHA384 with group FFDHE_2048: - Total : 125829120 bytes - Num Conns : 481 - Rx Total : 175.313 ms - Tx Total : 50.565 ms - Rx : 342.245 MB/s - Tx : 1186.597 MB/s - Connect : 582.023 ms - Connect Avg : 1.210 ms - -wolfSSL Server Benchmark on TLS13-AES256-GCM-SHA384 with group KYBER_LEVEL1: - Total : 225968128 bytes - Num Conns : 863 - Rx Total : 258.872 ms - Tx Total : 87.586 ms - Rx : 416.229 MB/s - Tx : 1230.220 MB/s - Connect : 580.184 ms - Connect Avg : 0.672 ms -wolfSSL Client Benchmark on TLS13-AES256-GCM-SHA384 with group KYBER_LEVEL1: - Total : 225968128 bytes - Num Conns : 863 - Rx Total : 285.086 ms - Tx Total : 84.362 ms - Rx : 377.956 MB/s - Tx : 1277.233 MB/s - Connect : 574.039 ms - Connect Avg : 0.665 ms - -wolfSSL Server Benchmark on TLS13-AES256-GCM-SHA384 with group KYBER_LEVEL3: - Total : 214171648 bytes - Num Conns : 818 - Rx Total : 241.450 ms - Tx Total : 80.798 ms - Rx : 422.965 MB/s - Tx : 1263.960 MB/s - Connect : 603.945 ms - Connect Avg : 0.738 ms -wolfSSL Client Benchmark on TLS13-AES256-GCM-SHA384 with group KYBER_LEVEL3: - Total : 214171648 bytes - Num Conns : 818 - Rx Total : 263.357 ms - Tx Total : 81.142 ms - Rx : 387.781 MB/s - Tx : 1258.593 MB/s - Connect : 596.085 ms - Connect Avg : 0.729 ms - -wolfSSL Server Benchmark on TLS13-AES256-GCM-SHA384 with group KYBER_LEVEL5: - Total : 206307328 bytes - Num Conns : 788 - Rx Total : 249.636 ms - Tx Total : 84.465 ms - Rx : 394.073 MB/s - Tx : 1164.683 MB/s - Connect : 589.028 ms - Connect Avg : 0.747 ms -wolfSSL Client Benchmark on TLS13-AES256-GCM-SHA384 with group KYBER_LEVEL5: - Total : 206307328 bytes - Num Conns : 788 - Rx Total : 276.059 ms - Tx Total : 81.856 ms - Rx : 356.355 MB/s - Tx : 1201.798 MB/s - Connect : 580.463 ms - Connect Avg : 0.737 ms - -wolfSSL Server Benchmark on TLS13-AES256-GCM-SHA384 with group KYBER_90S_LEVEL1: - Total : 226754560 bytes - Num Conns : 866 - Rx Total : 249.504 ms - Tx Total : 86.285 ms - Rx : 433.360 MB/s - Tx : 1253.120 MB/s - Connect : 590.655 ms - Connect Avg : 0.682 ms -wolfSSL Client Benchmark on TLS13-AES256-GCM-SHA384 with group KYBER_90S_LEVEL1: - Total : 226754560 bytes - Num Conns : 866 - Rx Total : 274.258 ms - Tx Total : 83.674 ms - Rx : 394.246 MB/s - Tx : 1292.214 MB/s - Connect : 585.395 ms - Connect Avg : 0.676 ms - -wolfSSL Server Benchmark on TLS13-AES256-GCM-SHA384 with group KYBER_90S_LEVEL3: - Total : 208666624 bytes - Num Conns : 797 - Rx Total : 253.840 ms - Tx Total : 86.227 ms - Rx : 391.979 MB/s - Tx : 1153.925 MB/s - Connect : 584.268 ms - Connect Avg : 0.733 ms -wolfSSL Client Benchmark on TLS13-AES256-GCM-SHA384 with group KYBER_90S_LEVEL3: - Total : 208666624 bytes - Num Conns : 797 - Rx Total : 279.104 ms - Tx Total : 83.607 ms - Rx : 356.499 MB/s - Tx : 1190.096 MB/s - Connect : 580.950 ms - Connect Avg : 0.729 ms - -wolfSSL Server Benchmark on TLS13-AES256-GCM-SHA384 with group KYBER_90S_LEVEL5: - Total : 205783040 bytes - Num Conns : 786 - Rx Total : 255.324 ms - Tx Total : 85.233 ms - Rx : 384.316 MB/s - Tx : 1151.260 MB/s - Connect : 583.899 ms - Connect Avg : 0.743 ms -wolfSSL Client Benchmark on TLS13-AES256-GCM-SHA384 with group KYBER_90S_LEVEL5: - Total : 205783040 bytes - Num Conns : 786 - Rx Total : 281.997 ms - Tx Total : 82.461 ms - Rx : 347.964 MB/s - Tx : 1189.958 MB/s - Connect : 579.312 ms - Connect Avg : 0.737 ms - -wolfSSL Server Benchmark on TLS13-AES256-GCM-SHA384 with group P256_KYBER_LEVEL1: - Total : 182190080 bytes - Num Conns : 696 - Rx Total : 219.789 ms - Tx Total : 75.536 ms - Rx : 395.266 MB/s - Tx : 1150.114 MB/s - Connect : 641.859 ms - Connect Avg : 0.922 ms -wolfSSL Client Benchmark on TLS13-AES256-GCM-SHA384 with group P256_KYBER_LEVEL1: - Total : 182190080 bytes - Num Conns : 696 - Rx Total : 241.393 ms - Tx Total : 72.367 ms - Rx : 359.890 MB/s - Tx : 1200.483 MB/s - Connect : 581.373 ms - Connect Avg : 0.835 ms - -wolfSSL Server Benchmark on TLS13-AES256-GCM-SHA384 with group P384_KYBER_LEVEL3: - Total : 133431296 bytes - Num Conns : 510 - Rx Total : 152.666 ms - Tx Total : 53.693 ms - Rx : 416.760 MB/s - Tx : 1184.982 MB/s - Connect : 743.577 ms - Connect Avg : 1.458 ms -wolfSSL Client Benchmark on TLS13-AES256-GCM-SHA384 with group P384_KYBER_LEVEL3: - Total : 133431296 bytes - Num Conns : 510 - Rx Total : 169.131 ms - Tx Total : 50.632 ms - Rx : 376.188 MB/s - Tx : 1256.605 MB/s - Connect : 611.105 ms - Connect Avg : 1.198 ms - -wolfSSL Server Benchmark on TLS13-AES256-GCM-SHA384 with group P256_KYBER_90S_LEVEL1: - Total : 191102976 bytes - Num Conns : 730 - Rx Total : 211.835 ms - Tx Total : 72.819 ms - Rx : 430.170 MB/s - Tx : 1251.386 MB/s - Connect : 651.010 ms - Connect Avg : 0.892 ms -wolfSSL Client Benchmark on TLS13-AES256-GCM-SHA384 with group P256_KYBER_90S_LEVEL1: - Total : 191102976 bytes - Num Conns : 730 - Rx Total : 233.104 ms - Tx Total : 70.994 ms - Rx : 390.919 MB/s - Tx : 1283.561 MB/s - Connect : 589.063 ms - Connect Avg : 0.807 ms - -wolfSSL Server Benchmark on TLS13-AES256-GCM-SHA384 with group P384_KYBER_90S_LEVEL3: - Total : 136052736 bytes - Num Conns : 520 - Rx Total : 168.780 ms - Tx Total : 57.603 ms - Rx : 384.376 MB/s - Tx : 1126.236 MB/s - Connect : 723.880 ms - Connect Avg : 1.392 ms -wolfSSL Client Benchmark on TLS13-AES256-GCM-SHA384 with group P384_KYBER_90S_LEVEL3: - Total : 136052736 bytes - Num Conns : 520 - Rx Total : 189.078 ms - Tx Total : 52.841 ms - Rx : 343.112 MB/s - Tx : 1227.747 MB/s - Connect : 594.282 ms - Connect Avg : 1.143 ms -``` - - - - -次のベンチマークは、次の設定フラグを使用して取得しました。 - - - -```text -./configure --with-liboqs \ - --disable-psk \ +./configure --enable-kyber \ + --enable-dilithium \ --disable-shared \ --enable-intelasm \ --enable-aesni \ --enable-sp \ - --enable-sp-math-all \ - CFLAGS="-Os -DECC_USER_CURVES -DHAVE_ECC521" + --enable-sp-math \ + --enable-sp-asm \ + CFLAGS="-Os -DECC_USER_CURVES -DHAVE_ECC256" ``` +**注意**: これらのベンチマークには2つのコアのみが使用されています。 + +```text +wolfSSL Server Benchmark on TLS13-AES128-GCM-SHA256 with group ECC_SECP256R1: + Total : 6029312 bytes + Num Conns : 24 + Rx Total : 965.511 ms + Tx Total : 7.469 ms + Rx : 2.978 MB/s + Tx : 384.903 MB/s + Connect : 48.343 ms + Connect Avg : 2.014 ms +wolfSSL Client Benchmark on TLS13-AES128-GCM-SHA256 with group ECC_SECP256R1: + Total : 6029312 bytes + Num Conns : 24 + Rx Total : 967.748 ms + Tx Total : 6.789 ms + Rx : 2.971 MB/s + Tx : 423.496 MB/s + Connect : 48.574 ms + Connect Avg : 2.024 ms + +wolfSSL Server Benchmark on TLS13-AES128-GCM-SHA256 with group ECC_SECP384R1: + Total : 6029312 bytes + Num Conns : 24 + Rx Total : 960.296 ms + Tx Total : 7.494 ms + Rx : 2.994 MB/s + Tx : 383.617 MB/s + Connect : 56.255 ms + Connect Avg : 2.344 ms +wolfSSL Client Benchmark on TLS13-AES128-GCM-SHA256 with group ECC_SECP384R1: + Total : 6029312 bytes + Num Conns : 24 + Rx Total : 962.002 ms + Tx Total : 7.367 ms + Rx : 2.989 MB/s + Tx : 390.259 MB/s + Connect : 56.220 ms + Connect Avg : 2.343 ms + +wolfSSL Server Benchmark on TLS13-AES128-GCM-SHA256 with group ECC_SECP521R1: + Total : 5767168 bytes + Num Conns : 23 + Rx Total : 938.745 ms + Tx Total : 7.889 ms + Rx : 2.929 MB/s + Tx : 348.596 MB/s + Connect : 61.261 ms + Connect Avg : 2.664 ms +wolfSSL Client Benchmark on TLS13-AES128-GCM-SHA256 with group ECC_SECP521R1: + Total : 5767168 bytes + Num Conns : 23 + Rx Total : 940.382 ms + Tx Total : 7.540 ms + Rx : 2.924 MB/s + Tx : 364.711 MB/s + Connect : 61.433 ms + Connect Avg : 2.671 ms + +wolfSSL Server Benchmark on TLS13-AES128-GCM-SHA256 with group ML_KEM_512: + Total : 6029312 bytes + Num Conns : 24 + Rx Total : 952.389 ms + Tx Total : 5.561 ms + Rx : 3.019 MB/s + Tx : 517.005 MB/s + Connect : 50.177 ms + Connect Avg : 2.091 ms +wolfSSL Client Benchmark on TLS13-AES128-GCM-SHA256 with group ML_KEM_512: + Total : 6029312 bytes + Num Conns : 24 + Rx Total : 954.202 ms + Tx Total : 4.751 ms + Rx : 3.013 MB/s + Tx : 605.110 MB/s + Connect : 48.602 ms + Connect Avg : 2.025 ms + +wolfSSL Server Benchmark on TLS13-AES128-GCM-SHA256 with group ML_KEM_768: + Total : 6029312 bytes + Num Conns : 24 + Rx Total : 955.030 ms + Tx Total : 5.882 ms + Rx : 3.010 MB/s + Tx : 488.757 MB/s + Connect : 51.283 ms + Connect Avg : 2.137 ms +wolfSSL Client Benchmark on TLS13-AES128-GCM-SHA256 with group ML_KEM_768: + Total : 6029312 bytes + Num Conns : 24 + Rx Total : 955.658 ms + Tx Total : 6.200 ms + Rx : 3.008 MB/s + Tx : 463.686 MB/s + Connect : 49.717 ms + Connect Avg : 2.072 ms + +wolfSSL Server Benchmark on TLS13-AES128-GCM-SHA256 with group ML_KEM_1024: + Total : 6029312 bytes + Num Conns : 24 + Rx Total : 973.042 ms + Tx Total : 7.294 ms + Rx : 2.955 MB/s + Tx : 394.150 MB/s + Connect : 51.750 ms + Connect Avg : 2.156 ms +wolfSSL Client Benchmark on TLS13-AES128-GCM-SHA256 with group ML_KEM_1024: + Total : 6029312 bytes + Num Conns : 24 + Rx Total : 973.655 ms + Tx Total : 7.996 ms + Rx : 2.953 MB/s + Tx : 359.573 MB/s + Connect : 50.328 ms + Connect Avg : 2.097 ms + +wolfSSL Server Benchmark on TLS13-AES128-GCM-SHA256 with group P256_ML_KEM_512: + Total : 6029312 bytes + Num Conns : 24 + Rx Total : 961.483 ms + Tx Total : 7.430 ms + Rx : 2.990 MB/s + Tx : 386.966 MB/s + Connect : 55.885 ms + Connect Avg : 2.329 ms +wolfSSL Client Benchmark on TLS13-AES128-GCM-SHA256 with group P256_ML_KEM_512: + Total : 6029312 bytes + Num Conns : 24 + Rx Total : 963.042 ms + Tx Total : 7.088 ms + Rx : 2.985 MB/s + Tx : 405.605 MB/s + Connect : 53.236 ms + Connect Avg : 2.218 ms + +wolfSSL Server Benchmark on TLS13-AES128-GCM-SHA256 with group P384_ML_KEM_768: + Total : 5767168 bytes + Num Conns : 23 + Rx Total : 927.519 ms + Tx Total : 7.338 ms + Rx : 2.965 MB/s + Tx : 374.747 MB/s + Connect : 64.464 ms + Connect Avg : 2.803 ms +wolfSSL Client Benchmark on TLS13-AES128-GCM-SHA256 with group P384_ML_KEM_768: + Total : 5767168 bytes + Num Conns : 23 + Rx Total : 929.281 ms + Tx Total : 6.923 ms + Rx : 2.959 MB/s + Tx : 397.229 MB/s + Connect : 60.200 ms + Connect Avg : 2.617 ms + +wolfSSL Server Benchmark on TLS13-AES128-GCM-SHA256 with group P521_ML_KEM_1024: + Total : 5767168 bytes + Num Conns : 23 + Rx Total : 918.122 ms + Tx Total : 7.598 ms + Rx : 2.995 MB/s + Tx : 361.941 MB/s + Connect : 79.426 ms + Connect Avg : 3.453 ms +wolfSSL Client Benchmark on TLS13-AES128-GCM-SHA256 with group P521_ML_KEM_1024: + Total : 5767168 bytes + Num Conns : 23 + Rx Total : 919.900 ms + Tx Total : 7.563 ms + Rx : 2.989 MB/s + Tx : 363.618 MB/s + Connect : 71.686 ms + Connect Avg : 3.117 ms +wolfSSL Server Benchmark on TLS13-AES256-GCM-SHA384 with group ECC_SECP256R1: + Total : 6029312 bytes + Num Conns : 24 + Rx Total : 962.723 ms + Tx Total : 6.394 ms + Rx : 2.986 MB/s + Tx : 449.663 MB/s + Connect : 52.042 ms + Connect Avg : 2.168 ms +wolfSSL Client Benchmark on TLS13-AES256-GCM-SHA384 with group ECC_SECP256R1: + Total : 6029312 bytes + Num Conns : 24 + Rx Total : 963.166 ms + Tx Total : 7.537 ms + Rx : 2.985 MB/s + Tx : 381.433 MB/s + Connect : 52.348 ms + Connect Avg : 2.181 ms -**注**:2コアで測定したものです。 +wolfSSL Server Benchmark on TLS13-AES256-GCM-SHA384 with group ECC_SECP384R1: + Total : 6029312 bytes + Num Conns : 24 + Rx Total : 966.071 ms + Tx Total : 8.458 ms + Rx : 2.976 MB/s + Tx : 339.929 MB/s + Connect : 56.135 ms + Connect Avg : 2.339 ms +wolfSSL Client Benchmark on TLS13-AES256-GCM-SHA384 with group ECC_SECP384R1: + Total : 6029312 bytes + Num Conns : 24 + Rx Total : 968.053 ms + Tx Total : 7.895 ms + Rx : 2.970 MB/s + Tx : 364.155 MB/s + Connect : 56.188 ms + Connect Avg : 2.341 ms -```text wolfSSL Server Benchmark on TLS13-AES256-GCM-SHA384 with group ECC_SECP521R1: - Total : 22806528 bytes - Num Conns : 88 - Rx Total : 29.526 ms - Tx Total : 9.423 ms - Rx : 368.325 MB/s - Tx : 1154.060 MB/s - Connect : 447.201 ms - Connect Avg : 5.082 ms + Total : 5767168 bytes + Num Conns : 23 + Rx Total : 930.195 ms + Tx Total : 7.849 ms + Rx : 2.956 MB/s + Tx : 350.364 MB/s + Connect : 62.644 ms + Connect Avg : 2.724 ms wolfSSL Client Benchmark on TLS13-AES256-GCM-SHA384 with group ECC_SECP521R1: - Total : 22806528 bytes - Num Conns : 88 - Rx Total : 32.363 ms - Tx Total : 9.206 ms - Rx : 336.028 MB/s - Tx : 1181.257 MB/s - Connect : 442.915 ms - Connect Avg : 5.033 ms - -wolfSSL Server Benchmark on TLS13-AES256-GCM-SHA384 with group P521_KYBER_LEVEL5: - Total : 10747904 bytes - Num Conns : 42 - Rx Total : 8.199 ms - Tx Total : 30.942 ms - Rx : 625.096 MB/s - Tx : 165.633 MB/s - Connect : 958.292 ms - Connect Avg : 22.816 ms -wolfSSL Client Benchmark on TLS13-AES256-GCM-SHA384 with group P521_KYBER_LEVEL5: - Total : 10747904 bytes - Num Conns : 42 - Rx Total : 9.919 ms - Tx Total : 3.685 ms - Rx : 516.689 MB/s - Tx : 1390.684 MB/s - Connect : 679.437 ms - Connect Avg : 16.177 ms - -wolfSSL Server Benchmark on TLS13-AES256-GCM-SHA384 with group P521_KYBER_90S_LEVEL5: - Total : 13107200 bytes - Num Conns : 51 - Rx Total : 19.132 ms - Tx Total : 6.887 ms - Rx : 326.680 MB/s - Tx : 907.481 MB/s - Connect : 976.107 ms - Connect Avg : 19.139 ms -wolfSSL Client Benchmark on TLS13-AES256-GCM-SHA384 with group P521_KYBER_90S_LEVEL5: - Total : 13107200 bytes - Num Conns : 51 - Rx Total : 23.578 ms - Tx Total : 5.039 ms - Rx : 265.078 MB/s - Tx : 1240.273 MB/s - Connect : 673.107 ms - Connect Avg : 13.198 ms + Total : 5767168 bytes + Num Conns : 23 + Rx Total : 932.128 ms + Tx Total : 7.440 ms + Rx : 2.950 MB/s + Tx : 369.619 MB/s + Connect : 62.538 ms + Connect Avg : 2.719 ms + +wolfSSL Server Benchmark on TLS13-AES256-GCM-SHA384 with group ML_KEM_512: + Total : 6029312 bytes + Num Conns : 24 + Rx Total : 973.208 ms + Tx Total : 8.190 ms + Rx : 2.954 MB/s + Tx : 351.021 MB/s + Connect : 49.608 ms + Connect Avg : 2.067 ms +wolfSSL Client Benchmark on TLS13-AES256-GCM-SHA384 with group ML_KEM_512: + Total : 6029312 bytes + Num Conns : 24 + Rx Total : 975.874 ms + Tx Total : 7.051 ms + Rx : 2.946 MB/s + Tx : 407.772 MB/s + Connect : 48.708 ms + Connect Avg : 2.030 ms + +wolfSSL Server Benchmark on TLS13-AES256-GCM-SHA384 with group ML_KEM_768: + Total : 6029312 bytes + Num Conns : 24 + Rx Total : 965.259 ms + Tx Total : 8.098 ms + Rx : 2.978 MB/s + Tx : 355.041 MB/s + Connect : 51.284 ms + Connect Avg : 2.137 ms +wolfSSL Client Benchmark on TLS13-AES256-GCM-SHA384 with group ML_KEM_768: + Total : 6029312 bytes + Num Conns : 24 + Rx Total : 967.507 ms + Tx Total : 7.774 ms + Rx : 2.972 MB/s + Tx : 369.828 MB/s + Connect : 49.899 ms + Connect Avg : 2.079 ms + +wolfSSL Server Benchmark on TLS13-AES256-GCM-SHA384 with group ML_KEM_1024: + Total : 6029312 bytes + Num Conns : 24 + Rx Total : 972.588 ms + Tx Total : 7.835 ms + Rx : 2.956 MB/s + Tx : 366.959 MB/s + Connect : 52.259 ms + Connect Avg : 2.177 ms +wolfSSL Client Benchmark on TLS13-AES256-GCM-SHA384 with group ML_KEM_1024: + Total : 6029312 bytes + Num Conns : 24 + Rx Total : 974.238 ms + Tx Total : 7.838 ms + Rx : 2.951 MB/s + Tx : 366.813 MB/s + Connect : 50.758 ms + Connect Avg : 2.115 ms + +wolfSSL Server Benchmark on TLS13-AES256-GCM-SHA384 with group P256_ML_KEM_512: + Total : 6029312 bytes + Num Conns : 24 + Rx Total : 971.832 ms + Tx Total : 7.544 ms + Rx : 2.958 MB/s + Tx : 381.096 MB/s + Connect : 54.727 ms + Connect Avg : 2.280 ms +wolfSSL Client Benchmark on TLS13-AES256-GCM-SHA384 with group P256_ML_KEM_512: + Total : 6029312 bytes + Num Conns : 24 + Rx Total : 972.623 ms + Tx Total : 8.807 ms + Rx : 2.956 MB/s + Tx : 326.456 MB/s + Connect : 52.613 ms + Connect Avg : 2.192 ms + +wolfSSL Server Benchmark on TLS13-AES256-GCM-SHA384 with group P384_ML_KEM_768: + Total : 5767168 bytes + Num Conns : 23 + Rx Total : 921.217 ms + Tx Total : 7.740 ms + Rx : 2.985 MB/s + Tx : 355.285 MB/s + Connect : 69.367 ms + Connect Avg : 3.016 ms +wolfSSL Client Benchmark on TLS13-AES256-GCM-SHA384 with group P384_ML_KEM_768: + Total : 5767168 bytes + Num Conns : 23 + Rx Total : 923.622 ms + Tx Total : 6.928 ms + Rx : 2.977 MB/s + Tx : 396.956 MB/s + Connect : 63.739 ms + Connect Avg : 2.771 ms + +wolfSSL Server Benchmark on TLS13-AES256-GCM-SHA384 with group P521_ML_KEM_1024: + Total : 5767168 bytes + Num Conns : 23 + Rx Total : 920.447 ms + Tx Total : 7.735 ms + Rx : 2.988 MB/s + Tx : 355.548 MB/s + Connect : 78.446 ms + Connect Avg : 3.411 ms +wolfSSL Client Benchmark on TLS13-AES256-GCM-SHA384 with group P521_ML_KEM_1024: + Total : 5767168 bytes + Num Conns : 23 + Rx Total : 921.889 ms + Tx Total : 7.585 ms + Rx : 2.983 MB/s + Tx : 362.578 MB/s + Connect : 71.310 ms + Connect Avg : 3.100 ms ``` - - ## ドキュメンテーション - - 技術文書や既知の回答テストなどのその他のリソースは、NIST PQC Webサイトにあります。 - - アルゴリズム固有のベンチマーク情報については、OQSプロジェクトのWebサイトに掲載されています。 @@ -1100,51 +895,67 @@ wolfSSL Client Benchmark on TLS13-AES256-GCM-SHA384 with group P521_KYBER_90S_LE ### 動機づけ -ステートフルHBSスキームは、さまざまな理由から関心が高まっています。 -ステートフルHBSスキームの主な目的は、量子セキュリティの強化です。前述したように、ショアのアルゴリズムにより、量子コンピューターは大きな整数を効率的に因数分解し、離散対数を計算することができます。これによって、RSAやECCなどの公開鍵暗号スキームを完全に破ることができます。 +ステートフルHBSスキームは、いくつかの理由から注目を集めています。 + +ステートフルHBSスキームの主な目的は、量子セキュリティの強化です。 +前述したように、ショアのアルゴリズムにより、量子コンピューターは大きな整数を効率的に因数分解し、離散対数を計算することができます。 +これによって、RSAやECCなどの公開鍵暗号スキームを完全に破ることができます。 -対照的に、ステートフルHBSスキームは、その基礎となるハッシュ関数とマークルツリー(通常SHA256で実装)のセキュリティに基づいており、暗号に関連する量子コンピューターの登場によって破られることは予想されていません。これらの理由から、ステートフルHBSスキームは NIST SP 800-208 および NSA の CNSA 2.0 スイートで推奨されています。詳細については、次の2つのリンクをご参照ください。 +対照的に、ステートフルHBSスキームは、その基礎となるハッシュ関数とマークルツリー(通常SHA256で実装)のセキュリティに基づいており、暗号に関連する量子コンピューターの登場によって破られることは予想されていません。 +これらの理由から、ステートフルHBSスキームは NIST SP 800-208 および NSA の CNSA 2.0 スイートで推奨されています。 +詳細については、次の2つのリンクをご参照ください。 - - -さらにCNSA 2.0のタイムラインでは、2030年までにポスト量子ステートフルHBSスキームのみを使用する必要があり、採用は 「直ちに」 開始する必要があると規定されています。LMS の採用は、CNSA 2.0スイートのタイムラインで最も早い要件です。 +さらにCNSA 2.0のタイムラインでは、2030年までにポスト量子ステートフルHBSスキームのみを使用する必要があり、採用は 「直ちに」 開始する必要があると規定されています。 +LMS の採用は、CNSA 2.0スイートのタイムラインで最も早い要件です。 -ただし、ステートフルHBSスキームの性質上、その使用と状態の追跡には細心の注意を払う必要があります。ステートフルHBSシステムでは、秘密鍵は実際にはワンタイム署名(OTS)キーの有限セットであり、再利用されることはありません。同じOTSキーを使用して2つの異なるメッセージを署名すると、攻撃者が署名を偽造できる可能性があり、スキーム全体のセキュリティが崩壊します。したがって、ステートフルHBSスキームは、パブリックインターネットなどの一般的な使用には適していません。 +ただし、ステートフルHBSスキームの性質上、その使用と状態の追跡には細心の注意を払う必要があります。 +ステートフルHBSシステムでは、秘密鍵は実際にはワンタイム署名(OTS)キーの有限セットであり、再利用されることはありません。 +同じOTSキーを使用して2つの異なるメッセージを署名すると、攻撃者が署名を偽造できる可能性があり、スキーム全体のセキュリティが崩壊します。 +したがって、ステートフルHBSスキームは、パブリックインターネットなどの一般的な使用には適していません。 LMS/HSSなどのステートフルHBSスキームは、特に長い運用寿命が期待され、暗号に関連する量子コンピューターに対して耐性が求められる組み込みシステムや制約付きシステムでのオフラインファームウェア認証と署名検証に特に役立ちます。 - ### LMS/HSS署名 -wolfSSLは、wolfCrypt組み込み暗号エンジンにLMS/HSSハッシュベースの署名スキームのサポートを追加しています。これは、以前のlibOQS統合と同様に、hash-sigsLMS/HSSライブラリ()との実験的な統合によって実現されます。 +wolfSSLは、wolfCrypt組み込み暗号エンジンにLMS/HSSハッシュベースの署名スキームのサポートを追加しています。 +これは、以前のliboqs統合と同様に、hash-sigsLMS/HSSライブラリ()との実験的な統合によって実現されます。 -Leighton-Micali Signatures(LMS)とそのマルチツリーのバリアントであるHierarchical Signature System(HSS)は、ポスト量子、ステートフルハッシュベース署名スキームです。公開鍵と秘密鍵が小さく、署名と検証が速いことで知られています。署名のサイズは大きくなりますが、Winternitzパラメーターを介して調整できます。詳細については、RFC8554の次の2つのリンクを参照してください: +Leighton-Micali Signatures(LMS)とそのマルチツリーのバリアントであるHierarchical Signature System(HSS)は、ポスト量子、ステートフルハッシュベース署名スキームです。 +公開鍵と秘密鍵が小さく、署名と検証が速いことで知られています。 +署名のサイズは大きくなりますが、Winternitzパラメーターを介して調整できます。 +詳細については、RFC8554の次の2つのリンクを参照してください: - LMS: - HSS: -前述したように、LMS/HSS署名システムは有限数のワンタイム署名(OTS)鍵で構成されているため、有限数の署名しか安全に生成できません。ただし、署名の数と署名のサイズは、次に説明する一連の定義済みパラメーターを介して調整できます。 +前述したように、LMS/HSS署名システムは有限数のワンタイム署名(OTS)鍵で構成されているため、有限数の署名しか安全に生成できません。 +ただし、署名の数と署名のサイズは、次に説明する一連の定義済みパラメーターを介して調整できます。 #### サポートしているパラメータ LMS/HSS署名は3つのパラメータによって定義されます。 + - levels: マークルツリーのレベル数 - height: 個々のマークルツリーの高さ -- Winternitz: ウィンターニッツチェーンで使用されるハッシュのビット数。 署名サイズの時空間トレードオフとして使用されます。 +- Winternitz: ウィンターニッツチェーンで使用されるハッシュのビット数。 + 署名サイズの時空間トレードオフとして使用されます。 -wolfSSLは、RFC8554で定義されているすべてのLMS/HSSパラメータをサポートします: +wolfSSLは、[RFC 8554](https://tex2e.github.io/rfc-translater/html/rfc8554.html)で定義されているすべてのLMS/HSSパラメータをサポートしています。 - levels = {1..8} - height = {5, 10, 15, 20, 25} - Winternitz = {1, 2, 4, 8} -利用可能な署名の数: +利用可能な署名の数は次の通りです。 - N = 2 ** (levels * height) -便宜上、一部のパラメータセットは列挙型 `wc_LmsParm` で事前定義されています。 その値を以下の表に示します: +便宜上、一部のパラメータセットはenum `wc_LmsParm` で事前定義されています。 +その値を以下の表に示します。 -パラメータセット | 意味 +パラメータセット | 説明 -------------------- | --------------------------- WC_LMS_PARM_NONE | 設定されていません。デフォルトを使用します (WC_LMS_PARM_L1_H15_W2) WC_LMS_PARM_L1_H15_W2 | level:1, height:15, Winternitz:2 @@ -1158,8 +969,7 @@ WC_LMS_PARM_L3_H5_W8 | level:3, height:5, Winternitz:8 WC_LMS_PARM_L3_H10_W4 | level:3, height:10, Winternitz:4 WC_LMS_PARM_L4_H5_W8 | level:4, height:5, Winternitz:8 -ここで設定したパラメータに対する署名のサイズと署名の数を表示します: - +ここで設定したパラメータに対する、署名のサイズと署名の数を示します。 パラメータセット | 署名サイズ | 署名数 -------------------- | -------------------- | -------------------- @@ -1174,30 +984,35 @@ WC_LMS_PARM_L3_H5_W8 | 3992 | 32768 WC_LMS_PARM_L3_H10_W4 | 7640 | 1073741824 WC_LMS_PARM_L4_H5_W8 | 5340 | 1048576 -表からわかるように、署名のサイズは主にレベルとWinternitz値、および比較的影響は小さいですが高さによって決まります。 +表から分かるように、署名のサイズは主にレベルとWinternitz値、および比較的影響は小さいですが高さによって決まります。 - レベル値を大きくすると、署名サイズは大幅に増加します。 - 高さの値を大きくすると、署名のサイズは増加します。 - Winternitz値を大きくすると、署名のサイズは小さくなりますが、鍵の生成と署名/検証にかかる時間が長くなります。 -鍵の生成時間は、第1レベルのツリーの高さによって大きく決まります。使用可能な署名の数が同じであっても、レベル3、高さ5のツリーは、初期鍵生成時にレベル1、高さ15のツリーよりもはるかに高速です +鍵の生成時間は、第1レベルのツリーの高さによって大きく決まります。 +使用可能な署名の数が同じであっても、レベル3、高さ5のツリーは、初期鍵生成時にレベル1、高さ15のツリーよりもはるかに高速です #### LMS/HSSビルド方法 -wolfSSLリポジトリのINSTALLファイル (https://github.com/wolfSSL/wolfssl/blob/master/INSTALL) を参照してください。 項目17(LMS/HSSサポートのためのhash-sigsライブラリを使用した構築 [実験]) には、wolfSSLとhash-sigs LMS/HSSライブラリを設定および構築する方法についての手順が記載されています。 +wolfSSLリポジトリの[INSTALLファイル](https://github.com/wolfSSL/wolfssl/blob/master/INSTALL) をご参照ください。 +項目17には、wolfSSLとhash-sigs LMS/HSSライブラリを設定および構築する方法についての手順が記載されています。 #### ベンチマークデータ -次のベンチマークデータは、Fedora 38(`6.2.9-300.fc38.x86_64`)上の8コアIntel i7-8700 CPU@3.20GHzで取得されました。マルチスレッドの例では4スレッドと4コアが使用されましたが、シングルスレッドの例では1コアのみが使用されました。 -INSTALLファイルの項目17で説明したように、hash-sigsライブラリは2つの静的ライブラリを提供します。 +次のベンチマークデータは、8コアIntel i7-8700 CPU@3.20GHz、Fedora 38(`6.2.9-300.fc38.x86_64`)で取得されました。 +マルチスレッドの例では4スレッドと4コアが使用されましたが、シングルスレッドの例では1コアのみが使用されました。 + +INSTALLファイルの項目17で説明されているように、hash-sigsライブラリは2つの静的ライブラリを提供します。 + - `hss_lib.a`: シングルスレッド - `hss_lib_thread.a`: マルチスレッド -マルチスレッドバージョンではワーカースレッドが生成され、鍵生成などのCPUを集中的に使用するタスクが高速化されます。これにより、主にすべてのパラメータ値に対する鍵の生成と署名が高速化され、より大きなレベル値の検証も多少高速化されます。 +マルチスレッドバージョンではワーカースレッドが生成され、鍵生成などのCPUを集中的に使用するタスクが高速化されます。 +これにより、主にすべてのパラメータ値に対する鍵の生成と署名が高速化され、より大きなレベル値の検証も多少高速化されます。 なお、以下のベンチマークは次の構成オプションを有効化して取得しました。 - ```text ./configure \ --enable-static \ @@ -1210,7 +1025,6 @@ INSTALLファイルの項目17で説明したように、hash-sigsライブラ 以下は、集中的なタスクを並列化するために4スレッドを使用し、4コアを使用したマルチスレッド `hss_lib_thread.a` と共にビルドして取得したベンチマークデータです。 - ```text ./wolfcrypt/benchmark/benchmark -lms_hss ------------------------------------------------------------------------------ @@ -1238,7 +1052,6 @@ Benchmark complete 以下は、シングルスレッドの`hss_lib.a`と共にビルドして取得したベンチマークデータです これは単一のコアのみを使用します。 - ```text $ ./wolfcrypt/benchmark/benchmark -lms_hss ------------------------------------------------------------------------------ @@ -1261,26 +1074,31 @@ LMS/HSS L4_H5_W8 5340 verify 200 ops took 1.478 sec, avg 7.388 ms, 135. Benchmark complete ``` - ### XMSS/XMSS^MT 署名 -wolfSSLは、XMSS/XMSS^MTステートフルハッシュベース署名のサポートを追加しています。LMSと同様に、これはRFC 8391 (https://www.rfc-editor.org/rfc/rfc8391.html) のxmss-reference リポジトリ (https://github.com/XMSS/xmss-reference.git) との実験的な統合によって実現されています。 +wolfSSLは、XMSS/XMSS^MTステートフルハッシュベース署名のサポートを追加しています。 +LMSと同様に、これは[RFC 8391](https://tex2e.github.io/rfc-translater/html/rfc8391.html) のxmss-reference リポジトリ (https://github.com/XMSS/xmss-reference.git) との実験的な統合によって実現されています。 -xmss-referenceは、`xmss_core_fast` および `xmss_core` 実装をサポートしています。`xmss_core_fast` 実装は、トレードオフとしてより大きな秘密鍵サイズでパフォーマンスを優先するように設計されています。 +xmss-referenceは、`xmss_core_fast` および `xmss_core` 実装をサポートしています。 +`xmss_core_fast` 実装は、トレードオフとしてより大きな秘密鍵サイズでパフォーマンスを優先するように設計されています。 当社の統合では `xmss_core_fast` を使用していますが、パッチが適用されているため、代わりに wolfCrypt SHA256実装を使用できます。 -パッチは、wolfssl-examplesリポジトリの -```pq/stateful_hash_sig/0001-Patch-to-support-wolfSSL-xmss-reference-integration.patch``` -で公開しています。https://github.com/wolfSSL/wolfssl-examples +パッチは、[wolfssl-examplesリポジトリ](https://github.com/wolfSSL/wolfssl-examples)の +``` +pq/stateful_hash_sig/0001-Patch-to-support-wolfSSL-xmss-reference-integration.patch +``` +にて公開しています。 -全体的に、XMSS/XMSS^MTはLMS/HSSに似ています。より詳細な比較については、「LMS vs XMSS: 2 つのハッシュベース署名標準の比較」(https://eprint.iacr.org/2017/349.pdf) を参照してください。 +全体的に、XMSS/XMSS^MTはLMS/HSSに似ています。 +より詳細な比較については、[「LMS vs XMSS: 2 つのハッシュベース署名標準の比較」](https://eprint.iacr.org/2017/349.pdf) をご参照ください。 -XMSS^MTはXMSSのマルチツリー一般化であり、HSS with LMSに似ていますが、XMSS/XMSS^MTではWinternitz値が `w=16` に固定されている点が異なります。公開鍵はXMSS/XMSS^MTでは若干大きくなり(XMSS/XMSS^MTでは68 バイト、LMS/HSSでは60バイト)、署名は若干小さくなります。 +XMSS^MTはXMSSのマルチツリー一般化であり、HSS with LMSに似ていますが、XMSS/XMSS^MTではWinternitz値が `w=16` に固定されている点が異なります。 +公開鍵はXMSS/XMSS\^MTでは若干大きくなり(XMSS/XMSS\^MTでは68 バイト、LMS/HSSでは60バイト)、署名は若干小さくなります。 #### サポートしているパラメータ -wolfSSLは、NIST SP 800-208 (https://csrc.nist.gov/pubs/sp/800/208/final) の表10および11のSHA256 XMSS/XMSS^MTパラメータセットをサポートしています。 +wolfSSLは、[NIST SP 800-208](https://csrc.nist.gov/pubs/sp/800/208/final) の表10および11のSHA256 XMSS/XMSS^MTパラメータセットをサポートしています。 parameter set name | Oid | n | w | h | d | h/d | Sig len ----------------------- | ----------- | --- | --- | --- | --- | --- | -- @@ -1302,17 +1120,24 @@ XMSS^MT | | | | | | | 鍵生成時間は第1レベルのツリーの高さ(または`h/d`) によって大きく左右されますが、署名の長さは主に`d` (ハイパーツリーレベルの数)とともに増加します。 -LMS/HSSと同様に、使用可能な署名の数は `2**h` に比例して増加します。ここで `h` はツリー システムの合計高さです。 +LMS/HSSと同様に、使用可能な署名の数は `2**h` に比例して増加します。 +ここで `h` はツリー システムの合計高さです。 + #### ベンチマークデータ -以下では、Intel x86_64およびaarch64のいくつかのXMSS/XMSS^MTパラメータセットのベンチマーク データを示します。これらのシステムでのSHA256パフォーマンスも参考として記載されています。必要なハッシュチェーンの数が多いため、XMSS/XMSS^MTのCPU 作業の大部分が計算されるためです。さらに、xmss-referenceへのパッチはwolfCryptのSHA256実装を置き換えるため、同じASMの高速化のメリットが得られます。 +以下では、Intel x86_64およびaarch64のいくつかのXMSS/XMSS^MTパラメータセットのベンチマーク データを示します。 +これらのシステムでのSHA256パフォーマンスも参考として記載されています。 +必要なハッシュチェーンの数が多いため、XMSS/XMSS^MTのCPU 作業の大部分が計算されるためです。 +さらに、xmss-referenceへのパッチはwolfCryptのSHA256実装を置き換えるため、同じASMの高速化のメリットが得られます。 -前述のように、XMSS統合ではxmss-referenceの`xmss_core_fast`実装を使用しています。この実装は、秘密鍵のサイズが大きいというトレードオフで、より高速なパフォーマンスを実現します。 +前述のように、XMSS統合ではxmss-referenceの`xmss_core_fast`実装を使用しています。 +この実装は、秘密鍵のサイズが大きいというトレードオフで、より高速なパフォーマンスを実現します。 **x86_64** -以下のx86_64ベンチマークデータは、Fedora 38 (`6.2.9-300.fc38.x86_64`) が動作するIntel i7-8700 CPU @ 3.20GHz(8コア)で取得しました。このCPUには`avx avx2`フラグがあり、`--enable-intelasm` を有効化することでハッシュ操作を高速化できます。 +以下のx86_64ベンチマークデータは、Fedora 38 (`6.2.9-300.fc38.x86_64`) が動作するIntel i7-8700 CPU @ 3.20GHz(8コア)で取得しました。 +このCPUには`avx avx2`フラグがあり、`--enable-intelasm` を有効化することでハッシュ操作を高速化できます。 `--enable-intelasm` を使用する場合 @@ -1370,7 +1195,8 @@ Benchmark complete **aarch64** -以下のaarch64データは、CPUフラグ`sha1 sha2 sha3 sha512`を使用してApple M1上で実行されているUbuntu(`5.15.0-71-generic`) で取得されました。`--enable-armasm` を使用してビルドすると、特に SHA ハッシュ操作が大幅に高速化されます。 +以下のaarch64データは、CPUフラグ`sha1 sha2 sha3 sha512`を使用してApple M1上で実行されているUbuntu(`5.15.0-71-generic`) で取得されました。 +`--enable-armasm` を使用してビルドすると、特に SHA ハッシュ操作が大幅に高速化されます。 `--enable-armasm`を使用する場合 @@ -1425,3 +1251,6 @@ XMSSMT-SHA2_60/12_256 27688 sign 200 ops took 1.607 sec, avg 8.036 ms, XMSSMT-SHA2_60/12_256 27688 verify 100 ops took 1.501 sec, avg 15.011 ms, 66.616 ops/sec Benchmark complete ``` + +### 開発者ノート +* 「今収穫し、後で復号する」脅威モデルを阻止しようとしていて、相互運用性の一部を犠牲にしても構わない場合は、Supported Groups拡張機能で従来のアルゴリズムのサポートを広告したくないことと思います。選択したアルゴリズムで`wolfSSL_UseKeyShare()`と`wolfSSL_set_groups()`を必ず呼び出してください。`wolfSSL_UseKeyShare()`だけを呼び出すだけでは不十分です。なぜなら、それは量子的に脆弱なアルゴリズムのサポートを広告することになるからです。ピアがポスト量子アルゴリズムをサポートしていない場合、`HelloRetryRequest`を送信し、その結果として、従来のアルゴリズムとの接続が確立されます。 diff --git a/wolfSSL/src-ja/chapter03.md b/wolfSSL/src-ja/chapter03.md index 1f31c172..12248d3d 100644 --- a/wolfSSL/src-ja/chapter03.md +++ b/wolfSSL/src-ja/chapter03.md @@ -658,4 +658,4 @@ wolfSSLを使用したクライアントアプリケーションのサンプル ファイルシステムが利用できない場合は、バッファから証明書と鍵を読み込むこともできます。 詳しい情報は`wolfSSL_CTX_use_certificate_buffer()`と`wolfSSL_CTX_use_PrivateKey_buffer()`のAPIドキュメントをご参照ください。 -wolfSSLを使用したサーバーアプリケーションのサンプルプログラムは、`/examples/server.c`ファイルを参照してください。 \ No newline at end of file +wolfSSLを使用したサーバーアプリケーションのサンプルプログラムは、`/examples/server.c`ファイルを参照してください。 diff --git a/wolfSSL/src-ja/chapter04.md b/wolfSSL/src-ja/chapter04.md index 1e9f99ef..18c850af 100644 --- a/wolfSSL/src-ja/chapter04.md +++ b/wolfSSL/src-ja/chapter04.md @@ -1,1398 +1,979 @@ - - # 機能 +wolfSSLは主要なインターフェースとしてC言語をサポートしていますが、[SWIG](http://swig.org/)インターフェースを通じてJava、PHP、Perl、Pythonなどもサポートしています。 +現在サポートされていない他のプログラミング言語でwolfSSLをホストすることに興味がある場合は、お問い合わせください。 +本章では、ストリーム暗号、AES-NI、IPv6サポート、SSL検査(スニファー)サポートなど、wolfSSLの機能についてより詳しく説明します。 -wolfSSL (以前の CyaSSL) は、主要なインターフェースとして C プログラミング言語をサポートしていますが、Java、PHP、Perl、Python など、他のいくつかのホスト言語もサポートしています ([SWIG](http://swig.org/) インターフェースを介して)。 現在サポートされていない別のプログラミング言語で wolfSSL をホストすることに関心がある場合は、お問い合わせください。 - - -この章では、ストリーム暗号、AES-NI、IPv6サポート、SSL検査(SNIFFER)サポートなど、wolfSSLのいくつかの機能について、より詳しく説明しています。 +## 機能概要 +wolfSSLの機能概要については、製品紹介ページをご覧ください。 + -## 機能の概要 - +## プロトコルサポート +wolfSSLは**SSL 3.0**、**TLS**(**1.0**、**1.1**、**1.2、1.3**)、および**DTLS**(**1.0**と**1.2**)をサポートしています。 +以下の関数のいずれかを使用することで、使用するプロトコルを簡単に選択できます。 +wolfSSLはSSL 2.0をサポートしていません。 +OpenSSL互換性レイヤーを使用する場合、以下の関数はわずかに異なります。 +OpenSSL互換関数については、[第13章 OpenSSL互換性](chapter13.md)をご参照ください。 -wolfSSL機能の概要については、wolfSSL製品Webページを参照してください:[https://www.wolfssl.com/products/wolfssl](https://www.wolfssl.com/products/wolfssl) +### サーバー関数 +* [`wolfDTLSv1_server_method()`](group__Setup.md#function-wolfdtlsv1_server_method) - DTLS 1.0 +* [`wolfDTLSv1_2_server_method()`](group__Setup.md#function-wolfdtlsv1_2_server_method) - DTLS 1.2 +* [`wolfSSLv3_server_method()`](group__Setup.md#function-wolfsslv3_server_method) - SSL 3.0 +* [`wolfTLSv1_server_method()`](group__Setup.md#function-wolftlsv1_server_method) - TLS 1.0 +* [`wolfTLSv1_1_server_method()`](group__Setup.md#function-wolftlsv1_1_server_method) - TLS 1.1 +* [`wolfTLSv1_2_server_method()`](group__Setup.md#function-wolftlsv1_2_server_method) - TLS 1.2 +* [`wolfTLSv1_3_server_method()`](group__Setup.md#function-wolftlsv1_3_server_method) - TLS 1.3 +* [`wolfSSLv23_server_method()`](group__Setup.md#function-wolfsslv23_server_method) - SSLv3からTLS 1.2までの可能な限り新しいバージョンを使用 +wolfSSLは[`wolfSSLv23_server_method()`](group__Setup.md#function-wolfsslv23_server_method)関数による堅牢なサーバーダウングレードをサポートしています。 +詳しくは、本章の「堅牢なクライアントとサーバーのダウングレード」節をご参照ください。 -## プロトコルサポート +### クライアント関数 +* [`wolfDTLSv1_client_method()`](group__Setup.md#function-v1_client_method) - DTLS 1.0 +* [`wolfDTLSv1_2_client_method_ex()`](ssl_8h.md#function-wolfdtlsv1_2_client_method_ex) - DTLS 1.2 +* [`wolfSSLv3_client_method()`](group__Setup.md#function-wolfsslv3_client_method) - SSL 3.0 +* [`wolfTLSv1_client_method()`](group__Setup.md#function-wolftlsv1_client_method) - TLS 1.0 +* [`wolfTLSv1_1_client_method()`](group__Setup.md#function-wolftlsv1_1_client_method) - TLS 1.1 +* [`wolfTLSv1_2_client_method()`](group__Setup.md#function-wolftlsv1_2_client_method) - TLS 1.2 +* [`wolfTLSv1_3_client_method()`](group__Setup.md#function-wolftlsv1_3_client_method) - TLS 1.3 +* [`wolfSSLv23_client_method()`](group__Setup.md#function-wolfsslv23_client_method) - SSLv3からTLS 1.2までの可能な限り新しいバージョンを使用 +wolfSSLは[`wolfSSLv23_client_method()`](group__Setup.md#function-wolfsslv23_client_method)関数による堅牢なクライアントダウングレードをサポートしています。 +詳しくは、本章の「堅牢なクライアントとサーバーのダウングレード」節ご参照ください。 -wolfsslは** SSL 3.0 **、** tls **(** 1.0 **、** 1.1 **、** 1.2、1.3 **)、および** dtls **(** 1.0 **および**1.2 **)。以下の機能のいずれかを使用して、使用するプロトコルを簡単に選択できます(クライアントまたはサーバーのいずれかに示すように)。wolfSSLは、SSL 2.0をサポートしていません。OpenSSL互換性レイヤーを使用すると場合、クライアントとサーバーの機能はわずかに異なります。OpenSSL互換機能については、[OpenSSL互換性](chapter13.md#openssl-compatibility)を参照してください。 +これらの関数の使用方法の詳細については、[第3章 入門](chapter03.md#getting-started)をご参照ください。 +SSL 3.0、TLS 1.0、1.1、1.2、およびDTLSの比較については、[付録D SSL/TLSの概要](appendix04.md)をご参照ください。 +### 堅牢なクライアントとサーバーのダウングレード +wolfSSLのクライアントとサーバーはどちらも堅牢なバージョンダウングレード機能を持っています。 +どちらかの側で特定のプロトコルバージョンメソッドが使用されている場合、そのバージョンによりネゴシエーションされるか、エラーが返されます。 +例えば、TLS 1.0を使用するクライアントがSSL 3.0のみのサーバーに接続しようとすると、接続は失敗します。 +同様に、TLS 1.1への接続も失敗します。 -### サーバー機能 +この問題を解決するには、クライアント側で[`wolfSSLv23_client_method()`](group__Setup.md#function-wolfsslv23_client_method)関数を使用し、必要に応じてダウングレードすることでサーバーがサポートする最高のプロトコルバージョンをサポートします。 +この場合、クライアントはTLS 1.0〜TLS 1.3(またはSSL 3.0を含むサブセットまたはスーパーセット、wolfSSLで設定されているプロトコルバージョンによる)を実行しているサーバーに接続できます。 +接続できないバージョンは、長年安全でないとされているSSL 2.0と、デフォルトで無効化されているSSL 3.0のみです。 +同様に、サーバー側で[`wolfSSLv23_server_method()`](group__Setup.md#function-wolfsslv23_server_method)関数を使用することで、TLS 1.0〜TLS 1.2のプロトコルバージョンをサポートするクライアントを処理できます。 +wolfSSLサーバーはセキュリティ上の問題から、SSLv2からの接続を受け入れません。 +### IPv6サポート +wolfSSLはIPv6もサポートしています。 -* [`wolfDTLSv1_server_method()`](group__Setup.md#function-wolfdtlsv1_server_method) -DTLS 1.0 +wolfSSLはIPニュートラルとして設計しており、IPv4とIPv6の両方で動作します。 +ただしより広範なシステムに適用するために、現在のテストアプリケーションはデフォルトでIPv4を使用します。 +テストアプリケーションでIPv6を使用するには、wolfSSLのビルド時に `--enable-ipv6` オプションをお使いください。 +IPv6に関する一般的な情報はこちらで確認できます。 -* [`wolfDTLSv1_2_server_method()`](group__Setup.md#function-wolfdtlsv1_2_server_method) -DTLS 1.2 + +### DTLS -* [`wolfSSLv3_server_method()`](group__Setup.md#function-wolfsslv3_server_method) -SSL 3.0 +wolfSSLはクライアントとサーバーの両方でDTLS(「データグラム」TLS)をサポートしています。 +現在サポートしている最新バージョンはDTLS 1.3です。 +TLSプロトコルは**信頼性のある**媒体(TCPなど)を介して安全なトランスポートチャネルを提供するように設計されました。 +UDPトランスポートを使用するアプリケーション層プロトコル(SIPやゲームプロトコルなど)が開発され始めるにつれて、遅延に敏感なアプリケーションの通信セキュリティを提供する必要性が生じました。 +この必要性がDTLSプロトコルの作成につながりました。 -* [`wolfTLSv1_server_method()`](group__Setup.md#function-wolftlsv1_server_method) - TLS 1.0 +多くの人がTLSとDTLSの違いはTCPとUDPの違いと同じだと考えていますが、これは正しくありません。 +UDPはハンドシェイクがなく、切断がなく、何かが失われた場合にTCPと比較して遅延が少ないという利点があります。 +一方、DTLSは拡張されたSSLハンドシェイクと切断を持ち、ハンドシェイクにTCPのような動作を実装する必要があります。 +本質的に、DTLSは安全な接続と引き換えにUDPが提供する利点を逆転させます。 +DTLSはwolfSSLをビルドする際に`--enable-dtls`ビルドオプションを使用することで有効にできます。 -* [`wolfTLSv1_1_server_method()`](group__Setup.md#function-wolftlsv1_1_server_method) -TLS 1.1 +### LwIP(軽量インターネットプロトコル) +wolfSSLは、軽量インターネットプロトコル実装をすぐ使えるようサポートしています。 +このプロトコルを使用するには、`WOLFSSL_LWIP`を定義するか、`settings.h`ファイルを編集して次の行のコメントアウトを解除してください。 -* [`wolfTLSv1_2_server_method()`](group__Setup.md#function-wolftlsv1_2_server_method) - TLS 1.2 +```c +/*#define WOLFSSL_LWIP*/ +``` +lwIPの焦点は、できるだけ小さなRAM使用量で完全なTCPスタックを提供することです。 +これはまさに、wolfSSLの主なユースケースである組み込みシステムでのSSL/TLSニーズとマッチしています。 -* [`wolfTLSv1_3_server_method()`](group__Setup.md#function-wolftlsv1_3_server_method) -TLS 1.3 +### TLS拡張機能 +wolfSSLがサポートするTLS拡張機能のリストと、参照できる対応するRFCについての注記です。 -* [`wolfSSLv23_server_method()`](group__Setup.md#function-wolfsslv23_server_method) - SSLv3 - TLS 1.2から最高のバージョンを使用する +| RFC | 拡張機能 |wolfSSLタイプ | +| --- | --------- | ------------ | +| [6066](https://tex2e.github.io/rfc-translater/html/rfc6066) | サーバー名表示 | `TLSX_SERVER_NAME` | +| [6066](https://tex2e.github.io/rfc-translater/html/rfc6066) | 最大フラグメント長ネゴシエーション | `TLSX_MAX_FRAGMENT_LENGTH` | +| [6066](https://tex2e.github.io/rfc-translater/html/rfc6066) | 短縮HMAC | `TLSX_TRUNCATED_HMAC` | +| [6066](https://tex2e.github.io/rfc-translater/html/rfc6066) | ステータスリクエスト | `TLSX_STATUS_REQUEST` | +| [7919](https://tex2e.github.io/rfc-translater/html/rfc7919) | サポートされているグループ | `TLSX_SUPPORTED_GROUPS` | +| [5246](https://tex2e.github.io/rfc-translater/html/rfc5246) | 署名アルゴリズム | `TLSX_SIGNATURE_ALGORITHMS` | +| [7301](https://tex2e.github.io/rfc-translater/html/rfc7301) | アプリケーション層プロトコルネゴシエーション | `TLSX_APPLICATION_LAYER_PROTOCOL` | +| [6961](https://tex2e.github.io/rfc-translater/html/rfc6961) | 複数証明書ステータスリクエスト | `TLSX_STATUS_REQUEST_V2` | +| [5077](https://tex2e.github.io/rfc-translater/html/rfc5077) | セッションチケット | `TLSX_SESSION_TICKET` | +| [5746](https://tex2e.github.io/rfc-translater/html/rfc5746) | 再ネゴシエーションの提示 | `TLSX_RENEGOTIATION_INFO` | +| [8446](https://tex2e.github.io/rfc-translater/html/rfc8446) | 鍵共有 | `TLSX_KEY_SHARE` | +| [8446](https://tex2e.github.io/rfc-translater/html/rfc8446) | 事前共有鍵 | `TLSX_PRE_SHARED_KEY` | +| [8446](https://tex2e.github.io/rfc-translater/html/rfc8446) | PSK鍵交換モード | `TLSX_PSK_KEY_EXCHANGE_MODES` | +| [8446](https://tex2e.github.io/rfc-translater/html/rfc8446) | 早期データ | `TLSX_EARLY_DATA` | +| [8446](https://tex2e.github.io/rfc-translater/html/rfc8446) | クッ鍵 | `TLSX_COOKIE` | +| [8446](https://tex2e.github.io/rfc-translater/html/rfc8446) | サポートされているバージョン | `TLSX_SUPPORTED_VERSIONS` | +| [8446](https://tex2e.github.io/rfc-translater/html/rfc8446) | ポストハンドシェイク認証 | `TLSX_POST_HANDSHAKE_AUTH` | +## 暗号サポート +### 暗号スイートの強度と適切な鍵サイズの選択 -wolfSSLは、[`wolfSSLv23_server_method()`](group__Setup.md#function-wolfsslv23_server_method)関数で堅牢なサーバーダウングレードをサポートしています。詳細については、[堅牢なクライアントとサーバーのダウングレード](#robust-client-and-server-downgrade)を参照してください。 +メソッド[`wolfSSL_get_ciphers()`](group__IO.md#function-wolfssl_get_ciphers)を呼び出すことで、現在有効になっている暗号スイートを確認できます。 +暗号スイートはさまざまな強度で提供されています。 +それらはいくつかの異なるタイプのアルゴリズム(認証、暗号化、およびメッセージ認証コード(MAC))で構成されているため、各々の強度は選択された鍵サイズによって異なります。 +暗号スイートの強度を評価する方法は多数あり、実際に使用される手法はプロジェクトや企業によって異なるようです。 +これには、共通鍵および公開鍵アルゴリズムの鍵サイズ、アルゴリズムの種類、性能、既知の弱点などが含まれる場合があります。 -### クライアント機能 +**NIST**(米国国立標準技術研究所)は、各鍵サイズに対して比較可能なアルゴリズムの強度を提供することにより、受け入れ可能な暗号スイートを選択するための推奨事項を提供しています。 +暗号アルゴリズムの強度は、アルゴリズムと使用される鍵サイズに依存します。 +NIST Special Publication [SP800-57](https://csrc.nist.gov/publications/detail/sp/800-57-part-1/rev-5/final)では、どのようにして2つのアルゴリズムが同等の強度であると見なすのか述べられています。 +> 2つのアルゴリズムは、与えられた鍵サイズ(XとY)に対して、「アルゴリズムを破る」または鍵を決定するために必要な作業量が、与えられたリソースを使用して概ね同じである場合、同等の強度を持つと見なされます。特定の鍵サイズに対するアルゴリズムのセキュリティ強度は、伝統的に、ショートカット攻撃(つまり、最も効率的な攻撃はすべての可能な鍵を試すこと)がない「X」の鍵サイズを持つ対称アルゴリズムに対してすべての鍵を試すのにかかる作業量の観点から説明されています。 +以下の2つの表は、[NIST SP800-57](https://csrc.nist.gov/publications/detail/sp/800-57-part-1/rev-5/final)の表2(56ページ)と表4(59ページ)の両方に基づいており、アルゴリズム間の比較可能なセキュリティ強度と強度測定(NISTが提案するアルゴリズムセキュリティの寿命をセキュリティビット数に基づいて)を示しています。 +**注意**:次の表では、「L」は有限体暗号(FFC)の公開鍵のサイズ、「N」はFFCの秘密鍵のサイズ、「k」は整数因数分解暗号(IFC)の鍵サイズ、「f」は楕円曲線暗号(ECC)の鍵サイズを示しています。 -* [`wolfDTLSv1_client_method()`](group__Setup.md#function-v1_client_method) -DTLS 1.0 +| セキュリティビット数 | 対称鍵アルゴリズム | **FFC** 鍵サイズ (DSA, DH, 等) | **IFC** 鍵サイズ (RSA, 等) | **ECC** 鍵サイズ (ECDSA, 等) | 説明 | +| ---------------- | ------------------------ | -------------------------------- | ---------------------------- | ------------------------------ | ----------- | +| 80 | 2TDEA, 等 | L = 1024, N = 160 | k = 1024 | f = 160-223 | セキュリティは2010年まで有効 | +| 128 | AES-128, 等 | L = 3072, N = 256 | k = 3072 | f = 256-383 | セキュリティは2030年まで有効 | +| 192 | AES-192, 等 | L = 7680, N = 384 | k = 7680 | f = 384-511 | 長期的に有効 | +| 256 | AES-256, 等 | L = 15360, N = 512 | k = 15360 | f = 512+ | 予見可能な将来にわたって有効 | +この表をガイドとして使用すると、暗号スイートは対称暗号化アルゴリズムの強度に基づいて分類できます。 +これにより、セキュリティビット数に基づいて各暗号スイートを大まかに分類するための等級分類を考案できます(対称鍵サイズのみを考慮しています)。 -* [`wolfDTLSv1_2_client_method_ex()`](ssl_8h.md#function-wolfdtlsv1_2_client_method_ex) -DTLS 1.2 +* **低** - 128ビット未満のセキュリティビット +* **中** - 128ビットのセキュリティビット +* **高** - 128ビットを超えるセキュリティビット +暗号スイートの強度は、対称暗号化アルゴリズムの強度以外にも、鍵交換および認証アルゴリズムの鍵サイズに大きく依存します。 +暗号スイートを構成する要素のうち、最も弱い要素の強度により評価されます。 -* [`wolfSSLv3_client_method()`](group__Setup.md#function-wolfsslv3_client_method) -SSL 3.0 +上記の評価方法(および対称暗号化アルゴリズムの強度のみに基づく)に従うと、wolfSSL 2.0.0は現在、以下にリストされているように、合計0の低強度暗号スイート、12の中程度強度暗号スイート、および8の高強度暗号スイートをサポートしています。 +この強度分類は、他のアルゴリズムの選択された鍵サイズによって変わる可能性があります。 +ハッシュ関数のセキュリティ強度に関する参考として、[NIST SP800-57](https://csrc.nist.gov/publications/detail/sp/800-57-part-1/rev-5/final)の表3(56ページ)をご参照ください。 +媒体によっては、「**EXPORT**」暗号として示されていることがあります。 +これは1992年まで、米国では強力な暗号処理を含むソフトウェアを輸出することが違法とされていたことに由来しています。 +強力な暗号化は米国政府によって「弾薬」(核兵器、戦車、弾道ミサイルと同じカテゴリ)として分類されていました。 +この制限のため、輸出されるソフトウェアには「弱められた」暗号(主に小さい鍵サイズ)が含まれていました。 +現在ではこの制限は解除されており、EXPORT暗号はもはや必要とされなくなりました。 -* [`wolfTLSv1_client_method()`](group__Setup.md#function-wolftlsv1_client_method) - TLS 1.0 +### サポートしている暗号スイート +以下の暗号スイートはwolfSSLでサポートしています。 +暗号スイートとは、SSL/TLSハンドシェイク中にコネクションのセキュリティ設定をネゴシエーションするために使用される、認証、暗号化、メッセージ認証コード(MAC)アルゴリズムの組み合わせです。 -* [`wolfTLSv1_1_client_method()`](group__Setup.md#function-wolftlsv1_1_client_method) -TLS 1.1 +各暗号スイートは、鍵交換アルゴリズム、バルク暗号化アルゴリズム、メッセージ認証コードアルゴリズム(MAC)を定義します。 +**鍵交換アルゴリズム**(RSA、DSS、DH、EDH)は、ハンドシェイクプロセス中にクライアントとサーバーがどのように認証するかを決定します。 -* [`wolfTLSv1_2_client_method()`](group__Setup.md#function-wolftlsv1_2_client_method) - TLS 1.2 +**バルク暗号化アルゴリズム**(DES、3DES、AES、ARC4)(ブロック暗号とストリーム暗号を含む)は、メッセージストリームを暗号化するために使用されます。 +**メッセージ認証コード(MAC)アルゴリズム**(MD2、MD5、SHA-1、SHA-256、SHA-512、RIPEMD)は、メッセージダイジェストを作成するために使用されるハッシュ関数です。 -* [`wolfTLSv1_3_client_method()`](group__Setup.md#function-wolftlsv1_3_client_method) -TLS 1.3 +以下の表は、`/wolfssl/internal.h`(約706行目以降に記載)にある暗号スイート(およびカテゴリ)に対応しています。 +以下のリストにない暗号スイートをお探しの場合は、お問い合わせください。 +#### ECC暗号スイート -* [`wolfSSLv23_client_method()`](group__Setup.md#function-wolfsslv23_client_method) - SSLv3 - TLS 1.2から最高のバージョンを使用する +* `TLS_DHE_RSA_WITH_3DES_EDE_CBC_SHA` +* `TLS_DHE_RSA_WITH_AES_256_CBC_SHA` +* `TLS_DHE_RSA_WITH_AES_128_CBC_SHA` +* `TLS_DH_anon_WITH_AES_128_CBC_SHA` +* `TLS_RSA_WITH_AES_256_CBC_SHA` +* `TLS_RSA_WITH_AES_128_CBC_SHA` +* `TLS_RSA_WITH_NULL_SHA` +* `TLS_PSK_WITH_AES_256_CBC_SHA` +* `TLS_PSK_WITH_AES_128_CBC_SHA256` +* `TLS_PSK_WITH_AES_256_CBC_SHA384` +* `TLS_PSK_WITH_AES_128_CBC_SHA` +* `TLS_PSK_WITH_NULL_SHA256` +* `TLS_PSK_WITH_NULL_SHA384` +* `TLS_PSK_WITH_NULL_SHA` +* `SSL_RSA_WITH_RC4_128_SHA` +* `SSL_RSA_WITH_RC4_128_MD5` +* `SSL_RSA_WITH_3DES_EDE_CBC_SHA` +* `TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA` +* `TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA` +* `TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA` +* `TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA` +* `TLS_ECDHE_RSA_WITH_RC4_128_SHA` +* `TLS_ECDHE_ECDSA_WITH_RC4_128_SHA` +* `TLS_ECDHE_RSA_WITH_3DES_EDE_CBC_SHA` +* `TLS_ECDHE_ECDSA_WITH_3DES_EDE_CBC_SHA` +* `TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256` +* `TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256` +* `TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384` +* `TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA384` +* `TLS_ECDHE_PSK_WITH_NULL_SHA256` +* `TLS_ECDHE_PSK_WITH_AES_128_CBC_SHA256` +* `TLS_ECDHE_ECDSA_WITH_NULL_SHA` +#### 静的ECC暗号スイート +* `TLS_ECDH_RSA_WITH_AES_256_CBC_SHA` +* `TLS_ECDH_RSA_WITH_AES_128_CBC_SHA` +* `TLS_ECDH_ECDSA_WITH_AES_256_CBC_SHA` +* `TLS_ECDH_ECDSA_WITH_AES_128_CBC_SHA` +* `TLS_ECDH_RSA_WITH_RC4_128_SHA` +* `TLS_ECDH_ECDSA_WITH_RC4_128_SHA` +* `TLS_ECDH_RSA_WITH_3DES_EDE_CBC_SHA` +* `TLS_ECDH_ECDSA_WITH_3DES_EDE_CBC_SHA` +* `TLS_ECDH_RSA_WITH_AES_128_CBC_SHA256` +* `TLS_ECDH_ECDSA_WITH_AES_128_CBC_SHA256` +* `TLS_ECDH_RSA_WITH_AES_256_CBC_SHA384` +* `TLS_ECDH_ECDSA_WITH_AES_256_CBC_SHA384` -wolfSSLは、[`wolfSSLv23_client_method()`](group__Setup.md#function-wolfsslv23_client_method)関数でロバストクライアントのダウングレードをサポートしています。詳細については、[堅牢なクライアントとサーバーのダウングレード](#robust-client-and-server-downgrade)を参照してください。 +#### Blake2b暗号スイート +* `TLS_RSA_WITH_AES_128_CBC_B2B256` +* `TLS_RSA_WITH_AES_256_CBC_B2B256` -これらの機能の使用方法の詳細については、[入門](chapter03.md#getting-started)の章を参照してください。SSL 3.0、TLS 1.0、1.1、1.2、およびDTLSの比較については、付録Aを参照してください。 +#### SHA-256暗号スイート +* `TLS_DHE_RSA_WITH_AES_256_CBC_SHA256` +* `TLS_DHE_RSA_WITH_AES_128_CBC_SHA256` +* `TLS_RSA_WITH_AES_256_CBC_SHA256` +* `TLS_RSA_WITH_AES_128_CBC_SHA256` +* `TLS_RSA_WITH_NULL_SHA256` +* `TLS_DHE_PSK_WITH_AES_128_CBC_SHA256` +* `TLS_DHE_PSK_WITH_NULL_SHA256` +#### SHA-384暗号スイート -### 堅牢なクライアントとサーバーのダウングレード +* `TLS_DHE_PSK_WITH_AES_256_CBC_SHA384` +* `TLS_DHE_PSK_WITH_NULL_SHA384` +#### AES-GCM暗号スイート +* `TLS_RSA_WITH_AES_128_GCM_SHA256` +* `TLS_RSA_WITH_AES_256_GCM_SHA384` +* `TLS_DHE_RSA_WITH_AES_128_GCM_SHA256` +* `TLS_DHE_RSA_WITH_AES_256_GCM_SHA384` +* `TLS_PSK_WITH_AES_128_GCM_SHA256` +* `TLS_PSK_WITH_AES_256_GCM_SHA384` +* `TLS_DHE_PSK_WITH_AES_128_GCM_SHA256` +* `TLS_DHE_PSK_WITH_AES_256_GCM_SHA384` -wolfSSLクライアントとサーバーの両方に、堅牢なバージョンのダウングレード機能があります。どちらの側で特定のプロトコルバージョンメソッドが使用されている場合、そのバージョンのみがネゴシエートされるか、エラーが返されます。たとえば、TLS 1.0を使用してSSL 3.0のみのサーバーに接続しようとするクライアントは、接続が失敗し、同様にTLS 1.1に接続すると同様に失敗します。 +#### ECC AES-GCM暗号スイート +* `TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256` +* `TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384` +* `TLS_ECDH_ECDSA_WITH_AES_128_GCM_SHA256` +* `TLS_ECDH_ECDSA_WITH_AES_256_GCM_SHA384` +* `TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256` +* `TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384` +* `TLS_ECDH_RSA_WITH_AES_128_GCM_SHA256` +* `TLS_ECDH_RSA_WITH_AES_256_GCM_SHA384` -この問題を解決するために、[`wolfSSLv23_client_method()`](group__Setup.md#function-wolfsslv23_client_method)関数を使用するクライアントは、必要に応じてダウングレードすることによりサーバーがサポートする最高のプロトコルバージョンをサポートします。この場合、クライアントはTLS 1.0 -TLS 1.3を実行しているサーバーに接続できます(または、wolfSSLで構成されているプロトコルバージョンに応じてSSL 3.0を含むサブセットまたはスーパーセット)。接続できない唯一のバージョンは、長年にわたって不安定であるSSL 2.0と、デフォルトで無効になっているSSL 3.0です。 +#### AES-CCM暗号スイート +* `TLS_RSA_WITH_AES_128_CCM_8` +* `TLS_RSA_WITH_AES_256_CCM_8` +* `TLS_ECDHE_ECDSA_WITH_AES_128_CCM` +* `TLS_ECDHE_ECDSA_WITH_AES_128_CCM_8` +* `TLS_ECDHE_ECDSA_WITH_AES_256_CCM_8` +* `TLS_PSK_WITH_AES_128_CCM` +* `TLS_PSK_WITH_AES_256_CCM` +* `TLS_PSK_WITH_AES_128_CCM_8` +* `TLS_PSK_WITH_AES_256_CCM_8` +* `TLS_DHE_PSK_WITH_AES_128_CCM` +* `TLS_DHE_PSK_WITH_AES_256_CCM` -同様に、[`wolfSSLv23_server_method()`](group__Setup.md#function-wolfsslv23_server_method)関数を使用するサーバーは、TLS 1.0 -TLS 1.2のプロトコルバージョンをサポートするクライアントを処理できます。wolfSSLサーバーは、セキュリティが提供されていないため、SSLV2からの接続を受け入れることができません。 +#### Camellia暗号スイート +* `TLS_RSA_WITH_CAMELLIA_128_CBC_SHA` +* `TLS_RSA_WITH_CAMELLIA_256_CBC_SHA` +* `TLS_RSA_WITH_CAMELLIA_128_CBC_SHA256` +* `TLS_RSA_WITH_CAMELLIA_256_CBC_SHA256` +* `TLS_DHE_RSA_WITH_CAMELLIA_128_CBC_SHA` +* `TLS_DHE_RSA_WITH_CAMELLIA_256_CBC_SHA` +* `TLS_DHE_RSA_WITH_CAMELLIA_128_CBC_SHA256` +* `TLS_DHE_RSA_WITH_CAMELLIA_256_CBC_SHA256` +#### ChaCha暗号スイート -### IPv6サポート +* `TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305_SHA256` +* `TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305_SHA256` +* `TLS_DHE_RSA_WITH_CHACHA20_POLY1305_SHA256` +* `TLS_ECDHE_PSK_WITH_CHACHA20_POLY1305_SHA256` +* `TLS_PSK_WITH_CHACHA20_POLY1305_SHA256` +* `TLS_DHE_PSK_WITH_CHACHA20_POLY1305_SHA256` +* `TLS_ECDHE_RSA_WITH_CHACHA20_OLD_POLY1305_SHA256` +* `TLS_ECDHE_ECDSA_WITH_CHACHA20_OLD_POLY1305_SHA256` +* `TLS_DHE_RSA_WITH_CHACHA20_OLD_POLY1305_SHA256` +#### 再ネゴシエーション表示拡張特別スイート +* `TLS_EMPTY_RENEGOTIATION_INFO_SCSV` -IPv6 を採用していて、組み込み SSL 実装を使用したい場合、wolfSSL が IPv6 をサポートしているかどうか疑問に思っているかもしれません。答えはイエスです。IPv6の上で実行されているwolfSSLをサポートしています。 +### AEADスイート +wolfSSLは、AES-GCM、AES-CCM、CHACHA-POLY1305などのAEADスイートをサポートしています。 +これらのAEADスイートと他のスイートの大きな違いは、追加のクリアテキストデータを使用して暗号化されたデータを認証することです。 +これは、データ改ざんを伴う中間者攻撃を軽減するのに役立ちます。 +AEADスイートはブロック暗号(または最近ではストリーム暗号)アルゴリズムと、鍵付きハッシュアルゴリズムによって生成されるタグの組み合わせを使用します。 +これら2つのアルゴリズムの組み合わせは、wolfSSLの暗号化・復号プロセスによって処理されます。 +特定のAEADスイートを使用するために必要なのは、サポートされているスイートで使用されるアルゴリズムを有効にするだけです。 -wolfSSLはIP ニュートラルとして設計されており、IPv4とIPv6の両方で動作しますが、現在のテストアプリケーションはIPv4にデフォルトになります(より広い範囲のシステムに適用されます)。テストアプリケーションをIPv6に変更するには、wolfSSLのコンフィグれションに** --enable-IPv6 **オプションを使用します。 +### ブロック暗号とストリーム暗号 +wolfSSLは **AES**、**DES**、**3DES**、**Camellia** ブロック暗号と、**RC4** および **CHACHA20** ストリーム暗号をサポートしています。 +AES、DES、3DES、RC4はデフォルトで有効です。 -IPv6に関する詳細情報はここにあります。 +CamelliaとChaCha20は、wolfSSLのビルド時に(それぞれ [`--enable-camellia`](chapter02.md#--enable-camellia) および [`--disable-chacha`](chapter02.md#--disable-chacha) ビルドオプションで)有効にできます。 +AESのデフォルトモードはCBCモードです。 +AESでGCMやCCMモードを有効にするには、ビルドオプション[`--enable-aesgcm`](chapter02.md#--enable-aesgcm) または [`--enable-aesccm`](chapter02.md#--enable-aesccm)をお使いください。 +サンプルプログラムや[第10章 wolfCryptの使用法](chapter10.md)に詳しい情報を掲載しています。 -[https://en.wikipedia.org/wiki/IPv6](https://en.wikipedia.org/wiki/IPv6)。 +SSLではデフォルトのストリーム暗号としてRC4を使用していましたが、セキュリティ上の問題により廃止されました。 +最近、wolfSSLはChaCha20を追加しました。 +RC4はChaChaよりも約11%高い性能を示しますが、一般的にChaChaよりも安全性が低いと考えられています。 +ChaChaはセキュリティ性能とのトレードオフとして、処理時間の短さを提供しています。 +暗号性能の比較については、wolfSSLのベンチマークウェブページをご覧ください。 + -### DTLS +#### 違いは何でしょうか +ブロック暗号は、暗号のブロックサイズのチャンク単位で暗号化する必要があります。 +例えば、AESのブロックサイズは16バイトです。 +したがって、2〜3バイトの小さなチャンクを暗号化する場合、データの80%以上が無駄なパディングとなります。 +これにより暗号化/復号処理速度は低下し、ネットワーク帯域幅を無駄に消費します。 +基本的に、ブロック暗号は大きなデータチャンク用に設計されており、パディングを必要とするブロックサイズを有し、固定の不変な変換を使用します。 +ストリーム暗号は、大小さまざまなデータチャンクに適しています。 +ブロックサイズが不要なため、小さいデータサイズにも適しています。 +速度が重要な場合、ストリーム暗号が最適です。 +これは、一般的にXOR処理された鍵ストリームを含むより単純な変換を使用するためです。 +メディアをストリーミングしたり、小さなサイズを含むさまざまなデータサイズを暗号化したり、高速な暗号が必要な場合は、ストリーム暗号が最適な選択です。 +### ハッシュ関数 -wolfSSLは、クライアントとサーバーの両方のDTLS( "データグラム" TLS)をサポートしています。現在のサポートされているバージョンはDTLS 1.0です。 +wolfSSLはいくつかの異なるハッシュ関数をサポートしています。 +これには、**MD2**、**MD4**、**MD5**、**SHA-1**、**SHA-2**(SHA-224、SHA-256、SHA-384、SHA-512)、**SHA-3**(BLAKE2)、**RIPEMD-160** が含まれます。 +これらの関数の詳細な使用方法は、[第10章 wolfCryptの使用法](chapter10.md)の「ハッシュ関数」節で確認できます。 +### 公開鍵オプション -TLSプロトコルは、**信頼性の高い**媒体(TCPなど)に安全なトランスポートチャネルを提供するように設計されています。アプリケーション層プロトコルが UDP トランスポート (SIP やさまざまな電子ゲーム プロトコルなど) を使用して開発され始めたため、遅延に敏感なアプリケーションに通信セキュリティを提供する方法が必要になりました。この必要性は、DTLSプロトコルの作成につながります。 +wolfSSLは **RSA**、**ECC**、**DSA/DSS**、**DH** の公開鍵オプションに加え、wolfSSLサーバー上での **EDH**(Ephemeral Diffie-Hellman)もサポートしています。 +これらの関数の詳細な使用方法は、[第10章 wolfCryptの使用法](chapter10.md)の「公開鍵暗号」節で確認できます。 +### ECC サポート -多くの人々がTLSとDTLSの違いがTCPとUDPと同じであると考えています。これは正しくありません。UDP には、(TCP と比較して) 何かが失われた場合に、ハンドシェイク、ティアダウン、および途中での遅延がないという利点があります。一方、DTLSは、拡張SSLハンドシェイクと引き裂きを持ち、ハンドシェイクのTCPのような動作を実装する必要があります。本質的に、DTLSは安全な接続と引き換えにUDPによって提供される利点を逆にします。 +wolfSSLは楕円曲線暗号(ECC)をサポートしています。 +これには、ECDH-ECDSA、ECDHE-ECDSA、ECDH-RSA、ECDHE-PSK、ECDHE-RSA などが含まれます。 +wolfSSLのECC実装は、`/wolfssl/wolfcrypt/ecc.h` ヘッダーファイルと `/wolfcrypt/src/ecc.c` ソースファイルにあります。 -DTLは、[`--enable-dtls`](chapter02.md#--enable-dtls)ビルドオプションを使用してwolfSSLをビルドするときに有効にできます。 +サポートされている暗号スイートは上の表に示されています。 +ECCは非x86_64ビルドではデフォルトで無効になっていますが、`HAVE_ECC` 定義を使用するか、autoconfシステムを使用して次のようにwolfSSLをビルドすることで有効にできます。 +```sh +./configure --enable-ecc +make +make check +``` +`make check`を実行すると、wolfSSLがチェックする多数の暗号スイートを出力します。 +もし`make check`が暗号スイートのリストを生成しない場合は、`./testsuite/testsuite.test` を単独で実行してください。 +これらの暗号スイートは、それぞれ個別にテストできます。 +例えば、ECDH-ECDSAとAES256-SHAを試すには、wolfSSLサーバーを次のように起動します。 -### LWIP(軽量インターネットプロトコル) +```sh +./examples/server/server -d -l ECDHE-ECDSA-AES256-SHA -c ./certs/server-ecc.pem -k ./certs/ecc-key.pem +``` +(`-d`)はクライアント証明書チェックを無効にし、(`-l`)は暗号スイートリストを指定します。 +(`-c`)は使用する証明書、(`-k`)は対応する秘密鍵です。 +クライアントを接続するには次のようにします。 +```sh +./examples/client/client -A ./certs/server-ecc.pem +``` -wolfSSLは、軽量のインターネットプロトコルの実装をすぐに使えるようにサポートしています。このプロトコルを使用するには、DEFINE `WOLFSSL_LWIP`、または`settings.h`ファイルに移動して以下の行のコメントアウトを外してください。 +ここで(`-A`)はサーバーを検証するための CA 証明書です。 +### PKCS サポート +PKCS(Public Key Cryptography Standards)は、RSA Security, Inc. によって作成され公開された標準規格のグループを指します。 +wolfSSLは **PKCS #1、PKCS #3、PKCS #5、PKCS #7、PKCS #8、PKCS #9、PKCS #10、PKCS #11、PKCS #12** をサポートしています。 -```c -/*#define WOLFSSL_LWIP*/ -``` +さらに、wolfSSLは PKCS #1 の一部として標準化された RSA-Probabilistic Signature Scheme(PSS)もサポートしています。 +#### PKCS #5、PBKDF1、PBKDF2、PKCS #12 +PKCS #5 はパスワードベースの鍵導出方法です。 +具体的には、パスワード、ソルト、反復回数を組み合わせてパスワードベースの鍵を生成します。 +wolfSSLは鍵導出関数として、PBKDF1とPBKDF2の両方をサポートしています。 +鍵導出関数は、基本鍵と他のパラメータ(上記で説明したソルトや反復回数など)から派生鍵を生成します。 +PBKDF1はハッシュ関数(MD5、SHA1 など)を適用して鍵を導出し、派生鍵の長さはハッシュ関数の出力長によって制限されます。 +PBKDF2では、疑似乱数関数(HMAC-SHA-1 など)を適用して鍵を導出します。 +PBKDF2の場合、派生鍵の長さに制限はありません。 -LWIPの焦点は、完全なTCPスタックを提供しながら、RAMの使用量を減らすことです。その焦点は、wolfSSLがSSL/TLSニーズに理想的なマッチであるエリアであるEmbedded Systemsでの使用に最適です。 +wolfSSLはPBKDF1とPBKDF2に加えて、PKCS #12からのPBKDF関数もサポートしています。 +関数プロトタイプは次の通りです。 +```c +int PBKDF2(byte* output, const byte* passwd, int pLen, + const byte* salt,int sLen, int iterations, + int kLen, int hashType); +int PKCS12_PBKDF(byte* output, const byte* passwd, int pLen, + const byte* salt, int sLen, int iterations, + int kLen, int hashType, int purpose); +``` -### TLSエクステンション +`output` には派生鍵が含まれ、`passwd` は長さ `pLen` のユーザーパスワードを保持します。 +`salt` は長さ `sLen` のソルト入力を保持します。 +`iterations` は実行する反復回数、`kLen` は希望する派生鍵の長さ、`hashType` は使用するハッシュ(MD5、SHA1、または SHA2)です。 +`./configure` を使用してwolfSSLをビルドする場合、`--enable-pwdbased` オプションを使用することでこの機能を有効にできます。 +完全な例は `/wolfcrypt/test.c` にあります。 +PKCS #5、PBKDF1、PBKDF2 に関する詳細情報は、以下の仕様書から入手できます。 -wolfSSLによってサポートされているTLS拡張機能のリストと、指定された拡張子に対してRFCを参照することができます。 +PKCS#5、PBKDF1、PBKDF2:[RFC 2898](https://tex2e.github.io/rfc-translater/html/rfc2898) -|RFC |拡張|wolfsslタイプ| -| --- | --------- | ------------ | -|[6066](https://datatracker.ietf.org/doc/html/rfc6066) |サーバー名表示|`TLSX_SERVER_NAME` | -|[6066](https://datatracker.ietf.org/doc/html/rfc6066) |最大フラグメント長ネゴシエーション|`TLSX_MAX_FRAGMENT_LENGTH` | -|[6066](https://datatracker.ietf.org/doc/html/rfc6066) |切り捨てられたhmac |`TLSX_TRUNCATED_HMAC` | -|[6066](https://datatracker.ietf.org/doc/html/rfc6066) |ステータスリクエスト|`TLSX_STATUS_REQUEST` | -|[7919](https://datatracker.ietf.org/doc/html/rfc7919) |サポートされているグループ|`TLSX_SUPPORTED_GROUPS` | -|[5246](https://datatracker.ietf.org/doc/html/rfc5246) |署名アルゴリズム|`TLSX_SIGNATURE_ALGORITHMS` | -|[7301](https://datatracker.ietf.org/doc/html/rfc7301) |アプリケーション層プロトコルネゴシエーション|`TLSX_APPLICATION_LAYER_PROTOCOL` | -|[6961](https://datatracker.ietf.org/doc/html/rfc6961) |証明書ステータスリクエスト|`TLSX_STATUS_REQUEST_V2` | -|[5077](https://datatracker.ietf.org/doc/html/rfc5077) |セッションチケット|`TLSX_SESSION_TICKET` | -|[5746](https://datatracker.ietf.org/doc/html/rfc5746) |再ネゴシエーションの提示|`TLSX_RENEGOTIATION_INFO` | -|[8446](https://datatracker.ietf.org/doc/html/rfc8446) |鍵共有|`TLSX_KEY_SHARE` | -|[8446](https://datatracker.ietf.org/doc/html/rfc8446) |事前共有鍵|`TLSX_PRE_SHARED_KEY` | -|[8446](https://datatracker.ietf.org/doc/html/rfc8446) |PSK交換モード|`TLSX_PSK_KEY_EXCHANGE_MODES` | -|[8446](https://datatracker.ietf.org/doc/html/rfc8446) |アーリーデータ|`TLSX_EARLY_DATA` | -|[8446](https://datatracker.ietf.org/doc/html/rfc8446) |クッキー|`TLSX_COOKIE` | -|[8446](https://datatracker.ietf.org/doc/html/rfc8446) |サポートバージョン|`TLSX_SUPPORTED_VERSIONS` | -|[8446](https://datatracker.ietf.org/doc/html/rfc8446) |ハンドシェーク承認|`TLSX_POST_HANDSHAKE_AUTH` | +#### PKCS #8 +PKCS #8 は、秘密鍵情報構文の標準として設計されました。 +公開鍵アルゴリズムの秘密鍵と属性セットを含む秘密鍵情報を保存するために使用されます。 +PKCS #8 標準には2つのバージョンがあり、暗号化された秘密鍵と非暗号化鍵の両方を保存する構文について説明しています。 +wolfSSLは暗号化と非暗号化の両方の PKCS #8 をサポートしています。 +サポートしているフォーマットには、PKCS #5 バージョン 1 - バージョン 2、および PKCS#12 が含まれます。 +暗号化の種類として、 DES、3DES、RC4、AES が利用可能です。 +PKCS#8:[RFC 5208](https://tex2e.github.io/rfc-translater/html/rfc5208) -## 暗号サポート +#### PKCS #7 +PKCS #7 は、暗号化された証明書や暗号化されていないが署名されたデータ文字列などのデータバンドルを転送するように設計されています。 +この機能は、ビルドオプション`--enable-pkcs7`を使用するか、マクロ `HAVE_PKCS7` を定義することで有効にできます。 +RFCに従って、デフォルトでは署名者の空セットを持つ縮退ケースが許可されています。 +縮退ケースの許可/不許可を切り替えるには、関数 `wc_PKCS7_AllowDegenerate()` を使用します。 +サポートされている機能は以下の通りです。 +* 縮退バンドル +* KARI、KEKRI、PWRI、ORI、KTRI バンドル +* 分離署名 +* 圧縮およびファームウェアパッケージバンドル +* カスタムコールバックサポート +* 限定的なストリーミング機能 -### 暗号スイート強度と適切な鍵サイズの選択 +##### PKCS #7 コールバック +PKCS7バンドルが解析された後、ユーザーが鍵を選択できるようにするための追加のコールバックとサポート関数が追加されました。 +CEKをアンラップするには、`wc_PKCS7_SetWrapCEKCb()` を使用します。 +このコールバックはKARIおよびKEKRIバンドルの場合に呼び出されます。 +keyIDまたはSKIDは、KARIの場合、オリジネータ鍵と共にwolfSSLからユーザーに渡されます。 +ユーザーがKEKでCEKをアンラップした後、使用する復号された鍵をwolfSSLに戻す必要があります。 +この実装例は、[wolfssl-examples リポジトリ](https://github.com/wolfssl/wolfssl-examples)内の `signedData-EncryptionFirmwareCB.c` で公開しています。 +PKCS7 バンドルの復号のための追加のコールバックが追加されました。 +復号コールバック関数を設定するには、`wc_PKCS7_SetDecodeEncryptedCb()` を使用します。 +ユーザー定義のコンテキストを設定するには、`wc_PKCS7_SetDecodeEncryptedCtx()` を使用する必要があります。 +このコールバックは、`wc_PKCS7_DecodeEncryptedData()` の呼び出し時に実行されます。 -どの暗号が現在使用されているかを確認するには、メソッドを呼び出すことができます.[`wolfSSL_get_ciphers()`](group__IO.md#function-wolfssl_get_ciphers)。 +##### PKCS #7 ストリーミング +PKCS7 デコーディングのためのストリーム指向APIは、すべてを一度に渡すのではなく、より小さなチャンクで入力するオプションを提供します。 +デフォルトでは、PKCS7 のストリーミング機能はオンになっています。 +PKCS7 APIのストリーミングサポートをオフにするには、マクロ `NO_PKCS7_STREAM` を定義してください。 +autoconfで行う場合は、 `./configure --enable-pkcs7 CFLAGS=-DNO_PKCS7_STREAM` とします。 -この関数は、現在有効な暗号スイートを返します。 +バンドルのデコード/検証のためのストリーミングでは、以下の関数がサポートされています。 +1. `wc_PKCS7_DecodeEncryptedData()` +2. [`wc_PKCS7_VerifySignedData()`](group__PKCS7.md#function-wc_pkcs7_verifysigneddata) +3. [`wc_PKCS7_VerifySignedData_ex()`](group__PKCS7.md#function-wc_pkcs7_verifysigneddata_ex) +4. [`wc_PKCS7_DecodeEnvelopedData()`](group__PKCS7.md#function-wc_pkcs7_decodeenvelopeddate) +5. `wc_PKCS7_DecodeAuthEnvelopedData()` -暗号スイートにはさまざまな強みがあります。それらはいくつかの異なるタイプのアルゴリズム(認証、暗号化、およびメッセージ認証コード(MAC))で構成されているため、それぞれの強度は選択された鍵サイズによって異なります。 +**注意**:[`wc_PKCS7_VerifySignedData_ex`](group__PKCS7.md#function-wc_pkcs7_verifysigneddata_ex) を呼び出す場合、引数`pkiMsgFoot`は完全なバッファであることが想定されています。 +内部構造は1つのバッファのストリーミングのみをサポートしており、この場合は`pkiMsgHead`になります。 +### 特定の暗号スイートの使用を強制する -暗号スイートの強度を評価する多くの方法があります。使用される特定の方法は、プロジェクトや企業によって異なると思われ、対称および公開鍵アルゴリズムの鍵サイズ、アルゴリズムの種類、パフォーマンス、既知の弱点などを含めることができます。 +デフォルトでは、wolfSSLは接続の両側がサポートしている最良の暗号スイートを選択します。 +128ビットAESなどの特定の暗号を強制するには、次のような内容を追加します。 +```c +wolfSSL_CTX_set_cipher_list(ctx, "AES128-SHA"); +``` -** nist **(米国立標準技術研究所)は、それぞれのさまざまな鍵サイズに同等のアルゴリズム強度を提供することにより、許容可能な暗号スイートを選択することを推奨します。暗号化アルゴリズムの強度は、アルゴリズムと使用される鍵サイズに依存します。NIST Special Publication、[SP800-57](https://csrc.nist.gov/publications/detail/sp/800-57-part-1/rev-5/final)は、2つのアルゴリズムが次のように同等の強度であると見なされると述べています。 +[`wolfSSL_CTX_new()`](group__Setup.md#function-wolfssl_ctx_new) の呼び出しの後で、次のように実装してください。 +```c +ctx = wolfSSL_CTX_new(method); +wolfSSL_CTX_set_cipher_list(ctx, "AES128-SHA"); +``` -> 2つのアルゴリズムは、「アルゴリズムを壊す」または鍵を決定するか(与えられた鍵サイズで)鍵を使用してほぼ同じである場合、2つのアルゴリズムが与えられた鍵サイズ(xとy)に対して匹敵する強さと考えられています。資源。特定の鍵サイズのアルゴリズムのセキュリティ強度は、ショートカット攻撃を有していない「X」の鍵サイズを持つすべての鍵を試してみるのにかかる作業量に関して説明しています(すなわち、最も効率的なもの)。攻撃はすべての可能な鍵を試すことです)。 +### OpenQuantumSafeのliboqs 統合 +[付録G ポスト量子暗号の実験](appendix07.md)をご覧ください。 -次の2つの表は、[NIST SP 800-57](https://csrc.nist.gov/publications/detail/sp/800-57-part-1/rev-5/final)の表2(pg。56)と表4(pg。59)の両方に基づいており、アルゴリズム間の同等のセキュリティ強度と強度測定(NIST が推奨するアルゴリズムのセキュリティ ライフタイムに基づいており、セキュリティの一部を使用しています)。 +## ハードウェアによる支援機構の活用 +wolfSSLは、さまざまなプロセッサやチップに搭載されたハードウェアアクセラレーテッド機能をいくつか活用できます。 +ここでは、wolfSSLがサポートしているテクノロジーについて説明します。 -**注**:次の表「L」は有限フィールド暗号化(FFC)の公開鍵のサイズであり、「n」はFFCの秘密鍵のサイズで、「K」は重要なサイズと見なされます。整数因数分解暗号化(IFC)、および「F」は、楕円曲線暗号の重要なサイズと見なされます。 +### AES-NI -|セキュリティのビット|対称鍵アルゴリズム|**FFC**鍵サイズ(DSA、DHなど)|**ifc**鍵サイズ(RSAなど)|**ECC**鍵サイズ(ECDSAなど)|説明| -| ---------------- | ------------------------ | -------------------------------- | ---------------------------- | ------------------------------ | ----------- | -|80 |2tdeaなど|L=1024、n=160 |K=1024 |F=160-223 |セキュリティは2010年まで有効| -|128 |AES-128など|L=3072、n=256 |K=3072 |F=256-383 |セキュリティは2030年まで有効| -|192 |AES-192など|L=7680、n=384 |K=7680 |f=384-511 |長期保護| -|256 |AES-256など|L=15360、n=512 |K=15360 |f=512+ |予見可能な将来のために安全| +AESは世界中の政府によって使用される鍵暗号化標準です。 +Intelは、AESをより高速に処理する新しい命令セットをリリースしました。 +wolfSSLは、商用環境でこの命令セットを完全にサポートする最初のSSLライブラリです。 +基本的に、IntelとAMDはAESアルゴリズムの計算集約的な部分を実行するチップレベルのAES命令を追加し、パフォーマンスを向上させています。 +AES-NIをサポートするIntelのチップのリストは、こちらで確認できます。 + -このテーブルをガイドとして使用して、暗号スイートを分類し始めるために、対称暗号化アルゴリズムの強度に基づいて分類します。これを行う際には、セキュリティのビットに基づいて各暗号スイートを分類することを考案することができます(対称鍵サイズを考慮してください)。 +wolfSSLでは、ソフトウェアでアルゴリズムを実行する代わりにチップから直接命令を呼び出す機能を追加しました。 +これにより、AES-NIをサポートするチップセットでwolfSSLを実行すると、AES暗号を5〜10倍高速に実行できるようになりました。 +AES-NIをサポートするチップセットで実行している場合は、ビルドオプション`--enable-aesni`を使用します。 +AES-NIを使用してwolfSSLをビルドする場合、アセンブリコードを使用するために GCC 4.4.3 以降が必要です。 +wolfSSLは、同一のビルドオプションを使用してAMDプロセッサ上のASM命令もサポートしています。 +AES-NIに関する文献を、いくつか以下に示します。 +AES-NIによるパフォーマンス向上に関する情報については、3つ目のIntel Software Network ページをご参照ください。 -* **低** - 128ビット未満のセキュリティのビット +* [AES(Wikipedia)](https://en.wikipedia.org/wiki/Advanced_Encryption_Standard) +* [AES-NI(Wikipedia)](https://en.wikipedia.org/wiki/AES_instruction_set) +* [AES-NI(Intel Software Network )](https://software.intel.com/en-us/articles/intel-advanced-encryption-standard-instructions-aes-ni/) +AES-NIは、AES暗号モード AES-CBC、AES-GCM、AES-CCM-8、AES-CCM、AES-CTRに対応しています。 +AES-GCMは、GHASH認証用にIntelチップに追加された128ビット乗算関数を使用することでさらに高速になります。 -* **中** - セキュリティのビット128ビット +### STM32F2 +wolfSSLは、STM32F2標準周辺機器ライブラリを通じて、STM32F2ハードウェアベースの暗号処理および乱数生成器を使用できます。 -* **高** - 128ビットより大きいセキュリティのビット +使用するには、`settings.h` に `WOLFSSL_STM32F2` を定義してください。 +STM32F2ハードウェア暗号とRNGサポートを有効にします。 +これらを個別に有効にするには、`STM32F2_CRYPTO`(ハードウェア暗号サポート用)と `STM32F2_RNG`(ハードウェア RNG サポート用)を使用します。 +STM32F2標準周辺機器ライブラリの詳細は、次のドキュメントで確認できます。 + -対称暗号化アルゴリズムの強度以外では、暗号スイートの強度は、鍵交換および認証アルゴリズム鍵の鍵サイズに大きく依存します。 強度は、暗号スイートの最も弱いリンクと同程度です。 +### Cavium NITROX +wolfSSLはMarvell(旧称:Cavium)NITROX()をサポートしています。 +Marvell NITROXサポートを有効にするには、wolfSSLをビルドする際に次のオプションを使用します。 -上記の等級付け方法に従って (対称暗号化アルゴリズムの強度のみに基づいて)、wolfSSL 2.0.0 は現在、以下に示すように、低強度の暗号スイート 0 個、中強度の暗号スイート 12 個、高強度の暗号スイート 8 個をサポートしています。以下の強度の分類は、関与する他のアルゴリズムの選択された鍵サイズによって変わる可能性があります。ハッシュ関数セキュリティ強度については、[NIST SP 800-57](https://csrc.nist.gov/publications/detail/sp/800-57-part-1/rev-5/final)の表3(56)を参照のこと。 +```sh +./configure --with-cavium=/home/user/cavium/software +``` +[`--with-cavium=**`](chapter02.md#--with-cavium) オプションは、ライセンスされた cavium/software ディレクトリを指しています。 +Caviumはライブラリをビルドしないため、wolfSSLは `cavium_common.o` ファイルを取り込み、これによってこの移植性に関するlibtool警告が表示されます。 +また、GitHubソースツリーを使用している場合は、Caviumヘッダーがこの警告に準拠していないため、生成されたMakefileから `-Wredundant-decls` 警告を削除する必要があります。 -場合によっては、"**EXPORT**"の暗号として参照されている暗号が表示されます。これらの暗号は、米国から強い暗号のソフトウェアを輸出することが違法であったときの米国履歴の期間(1992年に遅く)に由来しました。強い暗号は、米国政府によって(核兵器、戦車、弾道ミサイルなど)によって「弾薬」として分類されました。この制限のため、エクスポートされているソフトウェアは「弱められた」暗号(主により小さな鍵サイズ)を含んでいます。現在、この制限は解除されているため、EXPORT 暗号は必須ではなくなりました。 +現在、wolfSSLは暗号レイヤーで直接Cavium RNG、AES、3DES、RC4、HMAC、RSAをサポートしています。 +SSLレベルでのサポートは部分的であり、現在はAES、3DES、RC4のみです。 +Cavium呼び出しを非ブロッキングモードで利用できるようになるまで、RSAとHMACは遅くなります。 +クライアントのサンプルプログラムでも、暗号テストとベンチマークと同様にCaviumサポートをオンにできます。 +`HAVE_CAVIUM` を定義してください。 +### ESP32-WROOM-32 +wolfSSLはESP32-WROOM-32ハードウェアベースの暗号化を使用できます。 -### サポートされている暗号スイート +使用するには、`settings.h`に`WOLFSSL_ESPWROOM32`を定義します。 +ESP32-WROOM-32 ハードウェア暗号とRNGサポートが有効になります。 +現在、wolfSSLは暗号レイヤーで RNG、AES、SHA、RSAプリミティブをサポートしています。 +TLS サーバー/クライアント、wolfCrypt テスト、ベンチマークを含むサンプルプロジェクトは、ファイルをデプロイした後の ESP-IDF の `/examples/protocols` ディレクトリにあります。 +### ESP8266 +ESP32とは異なり、ESP8266ではハードウェアベースの暗号化は利用できません。 +ESP8266用にコンパイルするには、`user_settings.h` に `WOLFSSL_ESP8266` を定義します。 +autoconfにより`./configure CFLAGS="-DWOLFSSL_ESP8266"` とすることも可能です。 -次の暗号スイートは、wolfSSLによってサポートされています。暗号スイートは、TLSまたはSSLハンドシェイク中に使用される認証、暗号化、およびメッセージ認証コード(MAC)アルゴリズムの組み合わせで、接続のセキュリティ設定をネゴシエートします。 +### ERF32 +wolfSSLはERF32ファミリーのハードウェアベースの暗号化を使用できます。 -各暗号スイートは、キー交換アルゴリズム、一括暗号化アルゴリズム、およびメッセージ認証コード アルゴリズム (MAC) を定義します。 **キー交換アルゴリズム** (RSA、DSS、DH、EDH) は、ハンドシェイク プロセス中にクライアントとサーバーが認証する方法を決定します。 メッセージ ストリームの暗号化には、ブロック暗号とストリーム暗号を含む **一括暗号化アルゴリズム** (DES、3DES、AES、ARC4) が使用されます。 **メッセージ認証コード (MAC) アルゴリズム** (MD2、MD5、SHA-1、SHA-256、SHA-512、RIPEMD) は、メッセージ ダイジェストの作成に使用されるハッシュ関数です。 +サポートを有効にするには、`user_settings.h` で `WOLFSSL_SILABS_SE_ACCEL` を定義します。 +wolfSSLは現在、EFR32プラットフォーム上で RNG、AES-CBC、AES-GCM、AES-CCM、SHA-1、SHA-2、ECDHE、ECDSA のハードウェアアクセラレーションをサポートしています。 +詳細とベンチマークは、wolfSSLリポジトリの`wolfcrypt/src/port/silabs/README.md`をご覧ください。 -以下の表は、`/wolfssl/internal.h`(約706行から始まる)にある暗号スイート(およびカテゴリ)と一致しています。次のリストにない暗号スイートをお探しの場合は、wolfSSLに追加することについてお問い合わせください。 +### MAX32665/MAX32666 +wolfSSLは、Analog Devicesの [MAX32666](https://www.analog.com/ja/products/max32666.html)/[MAX32665](https://www.analog.com/ja/products/max32665.html) マイクロコントローラーのサポートモデルに搭載されている Trust Protection Unit(TPU)、Modular Arithmetic Accelerator(MAA)、TRNG の使用をサポートしています。 -ECC暗号スイート: +サポートを有効にするには、`WOLFSSL_MAX3266X` と `WOLFSSL_SP_MATH_ALL` を定義します。 +wolfSSLは現在、RNG、AES-CBC、AES-GCM、AES-ECB、SHA-1、SHA-2、RSA 2048、および ECDSA のハードウェアアクセラレーションをサポートしています。 +このハードウェアは、ハードウェアとソフトウェア実装の両方を使用できるようにするwolfSSLの暗号コールバック機能の使用もサポートしています。 +サポートの詳細は、wolfSSLリポジトリの`wolfcrypt/src/port/maxim/README.md`をご覧ください。 -* `TLS_DHE_RSA_WITH_3DES_EDE_CBC_SHA` +## SSL検査(スニファー) +wolfSSL 1.5.0リリース以降、wolfSSLにはSSLスニファー(SSL検査)機能でビルドできるビルドオプションが含まれています。 +これは、SSLトラフィックパケットを収集し、正しい鍵ファイルを使用して復号できることを意味します。 +SSLトラフィックを「検査」する機能は、以下のような場面で役立ちます。 +* ネットワーク問題の分析 +* 内部および外部ユーザーによるネットワーク誤用の検出 +* ネットワーク使用状況とデータコピーの監視 +* クライアント/サーバー通信のデバッグ -* `TLS_DHE_RSA_WITH_AES_256_CBC_SHA` +スニファーサポートを有効にするには、\*nix では`--enable-sniffer`オプション、Windows では **vcproj** ファイルを使用してwolfSSLをビルドします。 +\*nix では **pcap** を、Windows では **WinPcap** をインストールする必要があります。 +`sniffer.h`で見つけることができる主なスニファー関数を、各機能の簡単な説明と共に以下に示します。 +* `ssl_SetPrivateKey` - 特定のサーバーとポートの秘密鍵を設定します。 +* `ssl_SetNamedPrivateKey` - 特定のサーバー、ポート、ドメイン名の秘密鍵を設定します。 +* `ssl_DecodePacket` - 復号のために TCP/IP パケットを渡します。 +* `ssl_Trace` - トレースファイルへのデバッグトレースを有効/無効にします。 +* `ssl_InitSniffer` - 全体的なスニファーを初期化します。 +* `ssl_FreeSniffer` - 全体的なスニファーを解放します。 +* `ssl_EnableRecovery` - パケット損失の場合にSSLトラフィックの復号を再開しようとするオプションを有効にします。 +* `ssl_GetSessionStats` - スニファーセッションのメモリ使用量を取得します。 +wolfSSLのスニファーサポートに関する完全なサンプルとして、wolfSSLの `sslSniffer/sslSnifferTest/snifftest`アプリをご参照ください。 -* `TLS_DHE_RSA_WITH_AES_128_CBC_SHA` +暗号化鍵はSSLハンドシェイクで設定されるため、その後のアプリケーションデータを復号するためにはスニファーによってハンドシェイクを復号する必要があることにご注意ください。 +例えば、wolfSSLのサンプルプログラム`echoserver`と`echoclient`で「snifftest」を使用している場合、サーバーとクライアント間のハンドシェイクが始まる前に snifftest アプリケーションを起動する必要があります。 +スニファーは、AES-CBC、DES3-CBC、ARC4、Camellia-CBCで暗号化されたストリームのみを復号できます。 +ECDHEまたはDHE 鍵合意が使用されている場合、ストリームをスニッフすることはできません。 +RSA及びECDH鍵交換のみがサポートされています。 +wolfSSLスニファーでのウォッチコールバックは、`WOLFSSL_SNIFFER_WATCH` で有効にできます。 +スニファーウォッチ機能がコンパイルされている場合、関数 `ssl_SetWatchKeyCallback()` を使用してカスタムコールバックを設定できます。 +このコールバックは、証明書チェーン、エラー値、ピアから送信された証明書のダイジェストを検査するために使用されます。 +コールバックからゼロ以外の値が返された場合、ピアの証明書を処理する際にエラー状態が設定されます。 +ウォッチコールバックをサポートする追加関数は次のとおりです。 -* `TLS_DH_anon_WITH_AES_128_CBC_SHA` +* `ssl_SetWatchKeyCtx`:ウォッチコールバックに渡されるカスタムユーザーコンテキストを設定します。 +* `ssl_SetWatchKey_buffer`:新しいDER形式の鍵をサーバーセッションにロードします。 +* `ssl_SetWatchKey_file`:`ssl_SetWatchKey_buffer` のファイルバージョンです。 +スニファーでの統計収集を有効にするには、マクロ `WOLFSSL_SNIFFER_STATS` を定義します。 +統計はSSLStats構造体に保持され、`ssl_ReadStatistics` を呼び出すことでアプリケーションのSSLStats構造体にコピーされます。 +スニファー統計で使用する追加APIは `ssl_ResetStatistics`(統計収集をリセット)と `ssl_ReadResetStatistics`(現在の統計値を読み取り、内部状態をリセット)です。 +現在保持される統計値は、以下の通りです。 -* `TLS_RSA_WITH_AES_256_CBC_SHA` +* `sslStandardConns` +* `sslClientAuthConns` +* `sslResumedConns` +* `sslEphemeralMisses` +* `sslResumeMisses` +* `sslCiphersUnsupported` +* `sslKeysUnmatched` +* `sslKeyFails` +* `sslDecodeFails` +* `sslAlerts` +* `sslDecryptedBytes` +* `sslEncryptedBytes` +* `sslEncryptedPackets` +* `sslDecryptedPackets` +* `sslKeyMatches` +* `sslEncryptedConns` +## 静的バッファ確保オプション +wolfSSLでは、**動的**メモリ管理が提供されていることを前提に処理が記述されています。 +すなわち、`malloc`/`free`関数でバッファを確保/解放できることを前提としています。 +しかし、wolfSSLが内部で使用している暗号化ライブラリwolfCryptでは、動的メモリを使用しない設定も可能です。 +これは動的メモリ管理機能を提供していない環境や、あるいは安全面の制約で動的メモリ管理機能の使用が制限されている環境では好ましいと言えます。 +具体的には、組み込み機器でOSを使用しない(いわゆるベアメタル)環境で使用する場合、あるいはリアルタイムOSを使用している場合に動的メモリ管理機能が提供されていない場合があります。 +このような環境でwolfSSLを使用する方法として**静的バッファ確保オプション**を提供しています。 -* `TLS_RSA_WITH_AES_128_CBC_SHA` +### 静的バッファ確保の基本操作 +先に説明した「動的メモリ管理」はバッファを「指定されたサイズ(可変長)」に動的に切り出して提供する管理方法です。 +バッファの使用効率は高いですが処理が比較的複雑です。 +一方、wolfSSLが提供する「静的バッファ確保機能」は、あらかじめ(静的に)用意した何種類かのバッファの中から、要求したサイズに近いものを検索して提供するメモリ管理機能のことを言います。 +バッファの要求元には要求サイズ以上の大きさを持ったメモリブロックが割り当てられることがあります(そのため使用効率が低下します)が、バッファの確保と解放は`malloc`/`free`と同様に行え、割り当て処理は単純で済みます。 +まとめると、任意サイズのメモリブロックを動的に確保する動的メモリ確保を模擬した機能となっています。 +静的バッファ確保機能の使用は、wolfSSLにとって動的メモリ機能と等価に使用されます。 +この機能はwolfSSLがメモリの確保/解放を`XMALLOC`/`XFREE`関数呼び出しに抽象化してあることで実現できています。 +一旦、静的バッファ確保機能が設定されると、以降wolfSSLは内部で使用するバッファや他の構造体の確保に静的バッファ確保機能を使用します。 -* `TLS_RSA_WITH_NULL_SHA` +静的バッファ割り当ては`WOLFSSL_CTX`で設定され、スレッドセーフです。 +同一の`WOLFSSL_CTX`を異なるスレッドで共有しながら使用している場合でも、バッファの確保/解放はwolfSSL内部で排他制御しながら利用します。 +以下はコンテキスト構造を図示したもので、矢印はヒープへのポインタの受け渡しを示します。 +「...」はリストに挙げられたものだけでなく、すべての構造体を参照しています。 +![コンテキスト構造](CTX_structure.png) +また、RTOSで使用されているメモリプールを使ったメモリ機能では、未使用のメモリブロックが見つからない場合にはそのスレッド(タスク)は空きブロックが発生するまでサスペンドされますが、wolfSSLの静的バッファ確保機能にはそのような待ち合わせ機能はありません。 -* `TLS_PSK_WITH_AES_256_CBC_SHA` +### 静的バッファ使用の指定 +静的バッファ確保機能では、2つの用途別にメモリを分けることが可能です。 +つまり、一般的な目的用とI/O用に使用するバッファを分けて割り当て/解放を行うことが可能です。 +I/Oに使用するバッファは、TLSでの典型的必要サイズから最大2^16バイトまでを扱えるよう、比較的大きく(17KB程度)設定されており、それ以外の一般的な用途のバッファサイズと異なります。 +またI/Oを行うスレッド(タスク)とそれ以外のスレッドでのメモリ獲得/解放に伴う排他制御を排除するためにも、用途別に分けることを推奨しています。 +さらにバッファを設定した際、同時に生成できる`WOLFSSL`オブジェクトの最大数を制限することができます。 +最大数を制限すると`wolfSSL_new()`関数を実行する度に、生成できる`WOLFSSL`オブジェクトの数がチェックされ、上限を超えるとエラーとなります。 +### 静的バッファ確保の有効化 -* `TLS_PSK_WITH_AES_128_CBC_SHA256` +wolfSSLをビルドする際に静的バッファ確保オプションを有効にします。 +autoconfを使用するシステムの場合、次のように`--enable-staticmemory`を指定します。 +``` +$ ./configure --enable-staticmemory +``` +`user_settings.h`ヘッダーを使用している場合、次のマクロ定義を追加します。 -* `TLS_PSK_WITH_AES_256_CBC_SHA384` +``` +user_settings.h + #define WOLFSSL_STATIC_MEMORY +``` +静的バッファ確保機能は、与えられたバッファから確保するメモリブロックが枯渇した際、NULLを返さず標準関数の`malloc()`を呼び出す実装となっています。 +環境に動的メモリ管理機能が提供されていない場合には、ここでリンクエラーとなります。 +したがって、この機能を無効化する為に**WOLFSSL_NO_MALLOC**マクロも定義します。 -* `TLS_PSK_WITH_AES_128_CBC_SHA` +``` +user_settings.h + #define WOLFSSL_STATIC_MEMORY + #define WOLFSSL_NO_MALLOC +``` +さらに、2つのビルド構成があります。 +`--enable-staticmemory=small`は、構造体のサイズが小さく、利用可能なAPIも限定される小さなバージョンです。 +もう1つは`--enable-staticmemory=debug`で、コールバック関数を設定する機能を有効にします。 +これは`printf()`が利用できない状況で、何が割り当てられどのバケットサイズが使用されているかを調査する際に有用です。 +以下に、サンプルコールバックを使用したクライアントの出力例を示します。 -* `TLS_PSK_WITH_NULL_SHA256` +``` +./examples/client/client +... +... +... +Free'ing : 16128 +OUT BUFFER: Alloc'd 6 bytes using bucket size 16992 +Alloc'd 848 bytes using bucket size 1024 +OUT BUFFER: Alloc'd 150 bytes using bucket size 16992 +Alloc'd 13 bytes using bucket size 64 +Alloc'd 12 bytes using bucket size 64 +Alloc'd 848 bytes using bucket size 1024 +IN BUFFER: Alloc'd 40 bytes using bucket size 16992 +Alloc'd 13 bytes using bucket size 64 +Alloc'd 12 bytes using bucket size 64 +Free'ing : 1024 +Free'ing : 512 + +... +... +... +``` +### 静的バッファ確保の使用 +上記設定でwolfSSLをビルドすることにより、静的バッファ確保機能が有効となります。 -* `TLS_PSK_WITH_NULL_SHA384` +#### 静的バッファ設定関数とその引数 +この機能を利用する際、アプリケーションは次の関数を呼び出してヒープとして使用するバッファを指定します。 +```c +int wolfSSL_CTX_load_static_memory( + WOLFSSL_CTX** ctx, /* 生成したWOLFSSL_CTXを受け取る為の変数へのポインタ */ + wolfSSL_Methos_func method,/* メソッド */ + unsigned char* buf, /* ヒープとして使用するバッファへのポインタ */ + unsigned int sz, /* ヒープとして使用するバッファのサイズ */ + int flag, /* ヒープの使用用途 */ + int max); /* 許可する最大並行動作数 */ +``` -* `TLS_PSK_WITH_NULL_SHA` +* 引数**ctx**には、生成されたWOLFSSL_CTX構造体へのポインタを受け取る変数のアドレスを指定します。 +* 引数**method**には`wolfSSLv23_client_method_ex()`などの**_ex**が付いた関数の戻り値を指定します。 + * 使用できる関数は、後の章に掲載しています。 +* 引数**buf**,**sz**には、それぞれヒープに使用するバッファのアドレスとそのサイズを指定します。 + * 設定するバッファサイズの決定に関する情報については、「**必要バッファサイズの取得**」をご参照ください。 -* `SSL_RSA_WITH_RC4_128_SHA` +* 引数**flag**には、一般用途あるいはI/O用を指定する用途と静的バッファの確保状況のトラッキングを行うかどうかのフラグを組み合わせて指定します。 + * 一般用途を指定する場合には、`0`あるいは`WOLFMEM_GENERAL`を指定します。 + * I/O用として指定する場合には、`WOLFMEM_IO_POO`あるいは`WOLFMEM_IO_POOL_FIXED`を指定します。 + * 静的バッファの確保状況のトラッキングを行う場合には、用途を指定する値に`WOLFMEM_TRACK_STATS`をORで加えて指定します。 +* 引数**max**は、引数flagで指定したバッファの用途に関係します。 + * バッファの用途が一般用の場合には、生成する`WOLFSSL`オブジェクトの最大同時生成数(同時に存在できるオブジェクト数)を設定することになります。 + * 制限を行う必要がなければ0を指定します。 + * 0以外の制限値を指定した場合には、その後の`wolfSSL_new()`の呼び出しで、生成する`WOLFSSL`オブジェクトの同時オブジェクト数が設定値を超える際には生成が失敗することになります。 +#### 静的バッファ設定関数の呼び出し方法 -* `SSL_RSA_WITH_RC4_128_MD5` +静的バッファ確保オプションを使用する場合、関数`wolfSSL_CTX_load_static_memory()`を**2回**呼び出します。 +最初の呼び出しでは一般的な使用のためのバッファを設定し、そのバッファを使用して`WOLFSSL_CTX`構造を割り当てます。 +2回目の呼び出しでI/Oバッファを設定します。 +```c +WOLFSSL_CTX* ctx = NULL; /* WOLFSSL_CTXを生成する場合にはNULLを指定 */ +int ret; + +#define MAX_CONCURRENT_TLS 0 +#define MAX_CONCURRENT_IO 0 + +unsigned char GEN_MEM[GEN_MEM_SIZE]; +unsigned char IO_MEM[IO_MEM_SIZE];  +/* 最初の呼び出しで一般用静的バッファを設定してそこからWOLFSSL_CTXを生成する */ +ret = wolfSSL_CTX_load_static_memory( + &ctx, /* ctx変数の内容にはNULLをセットしておく */ + wolfSSLv23_client_method_ex(), /* "_ex"の付いた関数を使う */ + GEN_MEM, GEN_MEM_SIZE, /* 一般用途のバッファとそのサイズ */ + WOLFMEM_GENERAL, /* 一般用途で使用 */ + MAX_CONCURRENT_TLS); /* 最大許容同時接続数 */ + +/* 次は生成したWOLFSSL_CTXにI/O用静的バッファをセットする */ +ret = wolfSSL_CTX_load_static_memory( + &ctx, /* ctxには生成済み構造体が格納されている */ + NULL, /* 今度はctxの生成は行わないのでNULLをセット */ + IO_MEM, IO_MEM_SIZE, /* I/O用途のバッファとそのサイズ */ + WOLFMEM_IO_FIXED, + MAX_CONCURRENT_IO); +``` +`WOLFSSL_CTX`構造体の使用を終了した後は、通常の`wolfSSL_CTX_free()`を使って解放してください。 -* `SSL_RSA_WITH_3DES_EDE_CBC_SHA` +#### グローバルヒープヒントの設定 +関数`void* wolfSSL_SetGlobalHeapHint(void* heap)`を使用して、グローバルヒープヒントを設定できます。 +グローバルヒープヒントが設定されると、NULLポインタをヒープヒントとして使用する`XMALLOC`および`XFREE`へのすべての呼び出しが、設定されたグローバルヒープヒントを使用するようにリダイレクトされます。 +これは、使用するシステムに`malloc`がなく、NULLヒープヒントポインタが使用されている場合に便利です。 -* `TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA` +関数`wolfSSL_SetGlobalHeapHint()`は現在設定されているグローバルヒープヒントを返します。 +スレッドセーフとは見なされません。 +ゲッター関数`void* wolfSSL_GetGlobalHeapHint(void)`を使用して、現在設定されているグローバルヒープヒントを取得できます。 +この機能はwolfSSL 5.7.0で追加されました。 -* `TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA` +### 静的バッファ確保の調整 +wolfSSLで提供しているこの静的バッファ確保機能では、指定されたバッファを次の図のように複数の「バケット(bucket)」という領域に分けて管理します。 +バケット内には同一サイズの複数のメモリブロックがリンクされています。 +下図ではメモリブロックの管理のための構造は省略しています。 +実際にはそれらの管理領域も含めて必要なサイズを持つバッファが与えられなければなりません。 +![バケット](buckets.png) -* `TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA` +上記構造は一般用、I/O用のいずれのバッファにも適用されますが、I/O用バッファにはBucketは一種類しかありません。 +#### 一般用バッファを設定するためのマクロ +各バケットは、含まれるメモリブロックの数とそのサイズによってサイズが異なります。 -* `TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA` +各領域で使用されるメモリブロックのサイズとブロック数は、`wolfssl/wolfcrypt/memory.h`の次のマクロで定義されています。 +```c +/wolfssl/wolfcrypt/memory.h + #define WOLFSSL_STATIC_ALIGN 16 /* 適用されるアライメント(デフォルト16バイト)*/ + #define WOLFMEM_MAX_BUCKETS 9 /* バケット数 */ + #define WOLFMEM_IO_SZ 16992 /* I/0用のバッファサイズ */ + #define LARGEST_MEM_BUCKET 16128 /* 最大ブロックのサイズ */ + #define WOLFMEM_BUCKETS 64,128,256,512,1024,2432,3456, + 4544,LARGEST_MEM_BUCKET + #define WOLFMEM_DIST 49,10,6,14,5,6,9,1,1 -* `TLS_ECDHE_RSA_WITH_RC4_128_SHA` +``` +- **WOLFSSL_STATIC_ALIGN**にて、バッファのアライメントサイズを指定します。 + - デフォルトで16バイトです。 + - ご使用のMCUでのアライメントサイズに合わせて変更する必要があります。 +- **WOLFMEM_MAX_BUCKETS**は、バケットの数を示しています。 + - 9種類のサイズのバケットを使用することを意味しています。 -* `TLS_ECDHE_ECDSA_WITH_RC4_128_SHA` +- **WOLFMEM_BUCKETS**では、各バケット内のブロックのバイト数を小さいものから順にコンマ区切りで指定しています。 + - この定義は一般用バッファに適用されます。 +- **WOLFMEM_DIST**では、各バケットに含まれる同一サイズのブロックの数を`WOLFMEM_BUCKETS`の各ブロックに対応するように、それらの個数をコンマ区切りで指定しています。 + - この定義は一般用バッファに適用されます。 +上記の例でいえば、ブロックサイズ64バイトのバケットが最小のサイズであり、そのバケットには49個のメモリブロックを用意することになります。 +次に大きいバケットはブロックサイズ128バイトで10個のメモリブロックを用意することを意味します。 +上記定義値はデフォルトの値として使用していただけますが、実際の環境での使用時には各バケットのサイズとそこに含まれるメモリブロック数は調整が必要かもしれません。 -* `TLS_ECDHE_RSA_WITH_3DES_EDE_CBC_SHA` +#### I/O用バッファの設定用マクロ定義 +I/O用途のバッファは上記一般用途と管理方法は同じですが、バケット数は1、バケット内のメモリブロックは1つだけです。 +またメモリブロックのサイズは、**WOLFMEM_IO_SZ**で定義された値となっています。 +このI/Oバッファのサイズは、TLSハンドシェークで送受信される最大パケットサイズを考慮して設定されています。 +**wolfSSL_CTX_UseMaxFragment**()を使用して、より小さい値に設定することも可能です。 +この関数を使って最大パケットサイズを小さくした場合には、その値(この例では660バイト)を`WOLFMEM_IO_SZ`として設定してください。 +``` +./configure --enable-staticmemory C_EXTRA_FLAGS="-DWOLFMEM_IO_SZ=660" +``` -* `TLS_ECDHE_ECDSA_WITH_3DES_EDE_CBC_SHA` +#### 必要バッファサイズの取得 +静的バッファ確保機能に割り当てるバッファサイズ(すなわち関数`wolfSSL_CTX_load_static_memory()`に渡すバッファサイズ)の決定に有用な関数を用意してあります。 +この章の冒頭で、バッファが内部でバケットと管理領域からなる構造によって構成、使用されることを説明しました。 +実際にバッファのサイズを決定する際には、メモリブロックのサイズと管理領域の占めるサイズ、そしてパディングによる余分に必要なサイズも含めて計算する必要があります。 +この計算を行い、必要なバッファサイズを返してくれる関数を用意してあります。 +関数`wolfSSL_StaticBufferSz()`は、直前のセクションで紹介したマクロ定義値を基に、必要なバッファサイズを計算して返します。 +この関数が0より大きい値を返すまで、第2引数に与えるサイズは1000などの適当な値からスタートし、戻り値が正となるまでサイズを増やして何度も呼び出します。 +第3引数の`flag`には、一般用バッファサイズを計算する場合には**WOLFMEM_GENERAL**を、I/O用バッファサイズを計算する場合には**WOLFMEM_IO_FIXED**あるいは**WOLFMEM_IO_POOL**を指定してください。 -* `TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256` +```c +int wolfSSL_StaticBufferSz(byte* buffer, /* バッファアドレス */ + word32 sz, /* バッファサイズ */ + int flag); /* バッファの用途 */ +``` +この関数を使って、一般用とI/O用に必要なバッファサイズをそれぞれ取得し、前述の関数`wolfSSL_CTX_load_static_memory()`に渡してください。 +一旦バッファサイズが決定したら、関数`wolfSSL_StaticBufferSz()`は呼び出す必要はありません。 +製品コードから呼び出し部分をコメントアウトまたは削除していただけます。 +### 静的バッファ利用状況のトラッキング -* `TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256` +静的バッファ確保機能を利用する際に、バッファの確保、解放に関する使用状況を記録させることができます。 +この使用状況を記録する機能は、静的バッファ確保機能にデフォルトで含まれています。 +従って、ビルド時は有効化するための別段のマクロ設定は必要ありません。 +機能の有効化は実行時に行います。 +#### トラッキングの有効化 +トラッキング機能の有効化は、先に説明した関数`wolfSSL_CTX_load_static_memory()`の第5引数に**WOLFMEM_TRACK_STATS**をORで加えて指定します。 +wolfSSL内部に構造体`WOLFSSL_MEM_CONN_STATS`が確保され、そこにメモリブロックの使用状況が記録されていきます。 -* `TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384` - - - -* `TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA384` - - - -* `TLS_ECDHE_PSK_WITH_NULL_SHA256` - - - -* `TLS_ECDHE_PSK_WITH_AES_128_CBC_SHA256` - - - -* `TLS_ECDHE_ECDSA_WITH_NULL_SHA` - - - - -静的ECC暗号スイート: - - - -* `TLS_ECDH_RSA_WITH_AES_256_CBC_SHA` - - - -* `TLS_ECDH_RSA_WITH_AES_128_CBC_SHA` - - - -* `TLS_ECDH_ECDSA_WITH_AES_256_CBC_SHA` - - - -* `TLS_ECDH_ECDSA_WITH_AES_128_CBC_SHA` - - - -* `TLS_ECDH_RSA_WITH_RC4_128_SHA` - - - -* `TLS_ECDH_ECDSA_WITH_RC4_128_SHA` - - - -* `TLS_ECDH_RSA_WITH_3DES_EDE_CBC_SHA` - - - -* `TLS_ECDH_ECDSA_WITH_3DES_EDE_CBC_SHA` - - - -* `TLS_ECDH_RSA_WITH_AES_128_CBC_SHA256` - - - -* `TLS_ECDH_ECDSA_WITH_AES_128_CBC_SHA256` - - - -* `TLS_ECDH_RSA_WITH_AES_256_CBC_SHA384` - - - -* `TLS_ECDH_ECDSA_WITH_AES_256_CBC_SHA384` - - - - -blake2b暗号スイート: - - - -* `TLS_RSA_WITH_AES_128_CBC_B2B256` - - - -* `TLS_RSA_WITH_AES_256_CBC_B2B256` - - - - -SHA-256暗号スイート: - - - -* `TLS_DHE_RSA_WITH_AES_256_CBC_SHA256` - - - -* `TLS_DHE_RSA_WITH_AES_128_CBC_SHA256` - - - -* `TLS_RSA_WITH_AES_256_CBC_SHA256` - - - -* `TLS_RSA_WITH_AES_128_CBC_SHA256` - - - -* `TLS_RSA_WITH_NULL_SHA256` - - - -* `TLS_DHE_PSK_WITH_AES_128_CBC_SHA256` - - - -* `TLS_DHE_PSK_WITH_NULL_SHA256` - - - - -SHA-384暗号スイート: - - - -* `TLS_DHE_PSK_WITH_AES_256_CBC_SHA384` - - - -* `TLS_DHE_PSK_WITH_NULL_SHA384` - - - - -AES-GCM暗号スイート: - - - -* `TLS_RSA_WITH_AES_128_GCM_SHA256` - - - -* `TLS_RSA_WITH_AES_256_GCM_SHA384` - - - -* `TLS_DHE_RSA_WITH_AES_128_GCM_SHA256` - - - -* `TLS_DHE_RSA_WITH_AES_256_GCM_SHA384` - - - -* `TLS_PSK_WITH_AES_128_GCM_SHA256` - - - -* `TLS_PSK_WITH_AES_256_GCM_SHA384` - - - -* `TLS_DHE_PSK_WITH_AES_128_GCM_SHA256` - - - -* `TLS_DHE_PSK_WITH_AES_256_GCM_SHA384` - - - - -ECC AES-GCM暗号スイート: - - - -* `TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256` - - - -* `TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384` - - - -* `TLS_ECDH_ECDSA_WITH_AES_128_GCM_SHA256` - - - -* `TLS_ECDH_ECDSA_WITH_AES_256_GCM_SHA384` - - - -* `TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256` - - - -* `TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384` - - - -* `TLS_ECDH_RSA_WITH_AES_128_GCM_SHA256` - - - -* `TLS_ECDH_RSA_WITH_AES_256_GCM_SHA384` - - - - -AES-CCM暗号スイート: - - - -* `TLS_RSA_WITH_AES_128_CCM_8` - - - -* `TLS_RSA_WITH_AES_256_CCM_8` - - - -* `TLS_ECDHE_ECDSA_WITH_AES_128_CCM` - - - -* `TLS_ECDHE_ECDSA_WITH_AES_128_CCM_8` - - - -* `TLS_ECDHE_ECDSA_WITH_AES_256_CCM_8` - - - -* `TLS_PSK_WITH_AES_128_CCM` - - - -* `TLS_PSK_WITH_AES_256_CCM` - - - -* `TLS_PSK_WITH_AES_128_CCM_8` - - - -* `TLS_PSK_WITH_AES_256_CCM_8` - - - -* `TLS_DHE_PSK_WITH_AES_128_CCM` - - - -* `TLS_DHE_PSK_WITH_AES_256_CCM` - - - - -Camellia Cipher Suites: - - - -* `TLS_RSA_WITH_CAMELLIA_128_CBC_SHA` - - - -* `TLS_RSA_WITH_CAMELLIA_256_CBC_SHA` - - - -* `TLS_RSA_WITH_CAMELLIA_128_CBC_SHA256` - - - -* `TLS_RSA_WITH_CAMELLIA_256_CBC_SHA256` - - - -* `TLS_DHE_RSA_WITH_CAMELLIA_128_CBC_SHA` - - - -* `TLS_DHE_RSA_WITH_CAMELLIA_256_CBC_SHA` - - - -* `TLS_DHE_RSA_WITH_CAMELLIA_128_CBC_SHA256` - - - -* `TLS_DHE_RSA_WITH_CAMELLIA_256_CBC_SHA256` - - - - -ChaCha暗号スイート: - - - -* `TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305_SHA256` - - - -* `TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305_SHA256` - - - -* `TLS_DHE_RSA_WITH_CHACHA20_POLY1305_SHA256` - - - -* `TLS_ECDHE_PSK_WITH_CHACHA20_POLY1305_SHA256` - - - -* `TLS_PSK_WITH_CHACHA20_POLY1305_SHA256` - - - -* `TLS_DHE_PSK_WITH_CHACHA20_POLY1305_SHA256` - - - -* `TLS_ECDHE_RSA_WITH_CHACHA20_OLD_POLY1305_SHA256` - - - -* `TLS_ECDHE_ECDSA_WITH_CHACHA20_OLD_POLY1305_SHA256` - - - -* `TLS_DHE_RSA_WITH_CHACHA20_OLD_POLY1305_SHA256` - - - - -再ネゴシエーション提示拡張特別スイート: - - - -* `TLS_EMPTY_RENEGOTIATION_INFO_SCSV` - - - - - -### AEADスイート - - - -wolfSSLは、AES-GCM、AES-CCM、Chacha-Poly1305などのAEADスイーツをサポートしています。これらのAEADスイートと他のスイートの大きな違いは、追加のクリアテキストデータを使用して暗号化されたデータを認証することです。これは、データを改ざんすることになる中間者攻撃を緩和するのに役立ちます。AEADスイートは、キー付きハッシュアルゴリズムによって生成されたタグと組み合わせたブロック暗号(または最近でもストリーム暗号)アルゴリズムの組み合わせを使用します。これらの2つのアルゴリズムを組み合わせることで、これら 2 つのアルゴリズムの組み合わせは、ユーザーにとって簡単な wolfSSL 暗号化および復号化プロセスによって処理されます。特定のAEADスイートを使用するために必要なのは、サポートされているスイートで使用されるアルゴリズムを単純に有効にすることです。 - - - -### ブロックとストリーム暗号 - - - -wolfSSLは**AES**、**DES**、**3DES**、**Camellia**ブロック暗号と**RC4**、および**Chacha20**ストリーム暗号をサポートしています。AES、DES、3DES、RC4はデフォルトで有効になっています。Camellia、およびChacha20は、([`--enable-camellia`](chapter02.md#--enable-camellia)、および[`--disable-chacha`](chapter02.md#--disable-chacha)ビルドオプションで)wolfSSLをビルドするときに有効にすることができます。AESのデフォルトモードはCBCモードです。AESを使用してGCMまたはCCMモードを有効にするには、[`--enable-aesgcm`](chapter02.md#--enable-aesgcm)と[`--enable-aesccm`](chapter02.md#--enable-aesccm)ビルドオプションを使用します。特定の使用状況については、使用例と[wolfCryptの使用法](chapter10.md#wolfcrypt-usage-reference)の例をご覧ください。 - - -SSLはRC4をデフォルトのストリーム暗号として使用しますが、脆弱性のために廃止されています。最近、wolfSSLはChacha20を追加しました。RC4はChachaよりも約11%パフォーマンスが高いですが、RC4は一般にChachaよりも安全性が低いと考えられています。Chachaは、トレードオフとしてセキュリティを追加することで一時代を作り出すと考えられます。 - - -暗号性能の比較を見るには、ここにあるwolfSSLベンチマークWebページを参照してください。。 - - - -#### 違いは何ですか? - - - -ブロック暗号は、暗号のブロックサイズであるチャンク単位で暗号化する必要があります。たとえば、AESには16バイトのブロックサイズがあります。そのため、2 バイトまたは 3 バイトの小さなチャンクを何度も暗号化している場合、データの 80% 以上が無駄なパディングであり、暗号化/復号化プロセスの速度が低下し、起動するためにネットワーク帯域幅が不必要に浪費されます。基本的にブロック暗号は、大きなデータのチャンク用に設計されており、パディングを必要とするブロックサイズを有し、固定されていない変換を使用します。 - - -ストリーム暗号は、大量または小さなデータに適しています。ブロックサイズが不要なため、データサイズが小さい場合に適しています。速度が懸念される場合、ストリーム暗号はあなたの答えです。なぜなら、それらは通常、Xorのキーストリームを含むよりシンプルな変換を使用するからです。したがって、メディアをストリーミングする必要がある場合、小さなデータを含むさまざまなデータサイズを暗号化する、または高速暗号が必要な場合は、暗号をストリーミングすることが最善の策です。 - - - -### ハッシュ機能 - - -wolfSSLは**MD2,MD4,MD5,SHA-1,SHA2**(SHA-224,SHA-256,SHA-384,SHA-512), **SHA-3**(BLAKE2)、および**RIPEMD-160**などのハッシュ機能をサポートしています。これらの機能の詳細な使用法は、wolfCryptの使用法、[ハッシュ関数](chapter10.md#hash-functions)にあります。 - - - -### 公開鍵オプション - - - -wolfSSLは**RSA**、**ECC**、**DSA/DSS**と**DH**公開鍵オプションをサポートしています。これらの機能の詳細な使用法は、wolfCryptの使用法、[公開鍵暗号](chapter10.md#public-key-cryptography)にあります。 - - - -### ECCサポート - - - -wolfSSLは、ECDH-ECDSA、ECDHE-ECDSA、ECDH-RSA、ECDHE-PSK、ECDHE-RSAを含むがこれらに限定されない楕円曲線暗号化(ECC)をサポートしています。 - - -wolfSSLのECC実装は、`/wolfssl/wolfcrypt/ecc.h`ヘッダーファイルと`/wolfcrypt/src/ecc.c`ソースファイルにあります。 - - -サポートされている暗号スイートは、上の表に示されています。ECCは、x86_64以外のビルドでデフォルトで無効になりますが、`HAVE_ECC`を使用してwolfSSLをビルドするときまたはautoconfシステムを使用してオンにすることができます。 - - - -```sh -./configure --enable-ecc -make -make check -``` - - - -`make check`が実行される場合は、wolfSSLがチェックする多数の暗号スイートに注意してください(チェックがCipher Suitesのリストが作成されていない場合、それ自体で`./testsuite/testsuite.test`を実行します)。これらの暗号スイートのいずれかを個別にテストすることができます。たとえば、AES256-SHAでECDH-ECDSAを試すために、wolfSSLサーバーの例は次のように開始できます。 - - - -```sh -./examples/server/server -d -l ECDHE-ECDSA-AES256-SHA -c ./certs/server-ecc.pem -k ./certs/ecc-key.pem -``` - - - -(`-d`)クライアントの証明書チェックを無効にし、(`-l`)は暗号スイートリストを指定します。(`-c`)は使用する証明書であり、(`-k`)は、使用する対応する秘密鍵です。クライアントを接続するには、次のことを試してください。 - - - -```sh -./examples/client/client -A ./certs/server-ecc.pem -``` - - - -ここで、(`-A`)は、サーバーの検証に使用するCA証明書です。 - - - -### PKCSサポート - - - -PKCS(公開鍵暗号化スタンダード)は、RSA Security、Inc.によって作成および公開された標準のグループを指します。wolfSSLは**PKCS#1、PKCS#3、PKCS#5、PKCS#7、PKCS#8、PKCS#9、PKCS#10、PKCS#11**および**PKCS#12**をサポートしています。 - - -さらに、wolfSSLは、PKCS#1の一部として標準化されているRSA-Probabilistic Signature Scheme(PSS)のサポートも提供しています。 - - - -#### PKCS #5, PBKDF1, PBKDF2, PKCS #12 - - - - -PKCS#5は、パスワード、ソルト、および繰り返し回数を合成してパスワードベースのキーを生成するパスワードベースの鍵導出方法です。wolfSSLはPBKDF1とPBKDF2鍵導出機能の両方をサポートしています。鍵導出関数は、基本鍵および他のパラメータ(上述のようにソルトおよび反復回数など)から派生鍵を生成する。PBKDF1は、派生鍵長がハッシュ関数出力の長さによって囲まれている鍵を導出するためにハッシュ関数(MD5、SHA1など)を適用します。PBKDF2では、鍵を導出するために疑似ランダム関数(HMAC-SHA-1など)が適用されます。PBKDF2の場合、派生鍵の長さは無制限です。 - - -wolfSSLは、PBKDF1およびPBKDF2に加えて、PKCS#12のPBKDF関数もサポートしています。関数プロトタイプは次のようになります: - - - -```c -int PBKDF2(byte* output, const byte* passwd, int pLen, - const byte* salt,int sLen, int iterations, - int kLen, int hashType); - -int PKCS12_PBKDF(byte* output, const byte* passwd, int pLen, - const byte* salt, int sLen, int iterations, - int kLen, int hashType, int purpose); -``` - - - -`output`には派生鍵が含まれ、`passwd`は長さ`pLen`のユーザーパスワードを保持します`pLen`、`salt`は長さ`sLen`、`iterations`のソルト入力を保持します。md5、sha1、またはsha2にすることができます。 - - -`./configure`を使用してwolfSSLをビルドしている場合、この機能を有効にする方法は、オプション[`--enable-pwdbased`](chapter02.md#--enable-pwdbased)を使用することです - - -完全な例は`/wolfcrypt/test.c`にあります。詳細については、次の仕様からPKCS#5、PBKDF1、およびPBKDF2にあります。 - - -PKCS#5、PBKDF1、PBKDF2:[https://tools.ietf.org/html/rfc2898](https://tools.ietf.org/html/rfc2898) - - - -#### PKCS #8 - - - - -PKCS#8は、秘密鍵情報を格納するために使用されている秘密鍵情報構文標準として設計されています。 - - -PKCS #8 標準には、暗号化された秘密鍵と暗号化されていない鍵の両方を格納するための構文を説明する 2 つのバージョンがあります。wolfSSLは、暗号化されていないPKCS#8の両方をサポートしています。サポートされている形式には、PKCS#5バージョン1-バージョン2、およびPKCS#12が含まれます。利用可能な暗号化の種類には、DES、3DES、RC4、およびAESが含まれます。 - - -PKCS#8:[https://tools.ietf.org/html/rfc5208](https://tools.ietf.org/html/rfc5208) - - - -#### PKCS #7 - -PKCS #7 は、エンベロープ証明書であれ、暗号化されていないが署名されたデータ文字列であれ、データのバンドルを転送するように設計されています。 この機能は、有効化オプション ([`--enable-pkcs7`](chapter02.md#--enable-pkcs7)) を使用するか、マクロ `HAVE_PKCS7` を使用してオンにします。 署名者の空のセットを持つ RFC に従って、デフォルトで縮退ケースが許可されることに注意してください。 関数 `wc_PKCS7_AllowDegenerate()` を呼び出して、縮退ケースのオンとオフを切り替えることができます。 - - -サポートされている機能は次のとおりです。 - - - -* 縮退した束 - - -* Kari、Kekri、Pwri、Ori、Ktriバンドル - - -* 切り離された署名 - - -* 圧縮およびファームウェアパッケージバンドル - - -* カスタムコールバックサポート - - -* 限られたストリーミング機能 - - - - -##### PKCS#7コールバック - - - -ユーザーがPKCS7バンドルが解析された後にユーザーが自分の鍵を選択できるように追加のコールバックおよびサポート機能が追加されました。CEK をアンラップするには、関数 `wc_PKCS7_SetWrapCEKCb()` を呼び出すことができます。この関数によって設定されたコールバックは、KARIとKEKRIバンドルの場合に呼び出されます。キー ID または SKID は、KARI の場合はオリジネータ キーとともに wolfSSL からユーザーに渡されます。ユーザーが自分の KEK で CEK をアンラップした後、使用する復号化されたキーを wolfSSL に戻す必要があります。この例は、ファイル`signedData-EncryptionFirmwareCB.c`のwolfSSL-examplesリポジトリにあります。 - - -PKCS7バンドルの復号のために追加のコールバックが追加されました。復号コールバック関数を設定するには、API `wc_PKCS7_SetDecodeEncryptedCb()`を使用できます。ユーザー定義のコンテキストを設定するには、API `wc_PKCS7_SetDecodeEncryptedCtx()`を使用する必要があります。このコールバックは、`wc_PKCS7_DecodeEncryptedData()`の呼び出しで実行されます。 - - - -##### PKCS#7ストリーミング - - - -PKCS7 デコード用のストリーム指向 API により、入力を一度に渡すのではなく、小さなチャンクで渡すオプションが提供されます。デフォルトでは、PKCS7 によるストリーミング機能はオンになっています。ストリーミングPKCS7 APIのサポートをオフにするには、マクロ`NO_PKCS7_STREAM`を定義できます。Autotoolsでこれを行う例は`./configure --enable-pkcs7 CFLAGS=-DNO_PKCS7_STREAM`です。 - - -バンドルのデコード/検証時のストリーミングでは、次の関数がサポートされています。 - - - -1. `wc_PKCS7_DecodeEncryptedData()` - - -2. [`wc_PKCS7_VerifySignedData()`](group__PKCS7.md#function-wc_pkcs7_verifysigneddata) - - -3. [`wc_PKCS7_VerifySignedData_ex()`](group__PKCS7.md#function-wc_pkcs7_verifysigneddata_ex) - - -4. [`wc_PKCS7_DecodeEnvelopedData()`](group__PKCS7.md#function-wc_pkcs7_decodeenvelopeddate) - - -5. `wc_PKCS7_DecodeAuthEnvelopedData()` - - - -** NOTE **:[`wc_PKCS7_VerifySignedData_ex`](group__PKCS7.md#function-wc_pkcs7_verifysigneddata_ex)を呼び出したとき、引数pkimsgfootがフルバッファであることが予想されます。内部構造は、この場合に`pkiMsgHead`になる1つのバッファのストリーミングのみをサポートします。 - - - -### 特定の暗号スイート強制使用 - - - -デフォルトでは、wolfSSLは、接続の両側がサポートできる「最高の」(最高のセキュリティ)暗号スイートを選択します。128ビットAESなどの特定の暗号を強制するには、次のようなものを追加します。 - - - -```c -wolfSSL_CTX_set_cipher_list(ctx, "AES128-SHA"); -``` - - - -[`wolfSSL_CTX_new()`](group__Setup.md#function-wolfssl_ctx_new)への呼び出しの後に: - - - -```c -ctx=wolfSSL_CTX_new(method); -wolfSSL_CTX_set_cipher_list(ctx, "AES128-SHA"); -``` - - - - -### OpenQuantumsafeのliboqs統合 - - - -詳細については、このドキュメントの「Quantum-Safe Cryptographyの実験」を参照してください。 - - - -## ハードウェアを使っての暗号の高速化 - - - -wolfSSLは、さまざまなプロセッサやチップの中のいくつかのハードウェアが加速された(または「支援」)暗号機能を利用することができます。次のセクションでは、wolfSSLがどのテクノロジをサポートしているかについて説明します。 - - - -### AES-NI - - - - -AESは、wolfSSLが常にサポートしてきた世界中の政府が使用する重要な暗号化基準です。Intel は、AES をより高速に実装する新しい命令セットをリリースしました。 wolfSSLは、生産環境向けの新しい命令セットを完全にサポートする最初のSSLライブラリです。 - - -基本的に、IntelとAMDは、AESアルゴリズムの計算集約型部分を実行するCHIPレベルでAES命令を追加し、パフォーマンスを向上させました。現在AES-NIをサポートしているIntelのチップのリストについては、こちらをご覧ください。 - - -[https://ark.intel.com/search/advanced/?s=t&AESTech=true](https://ark.intel.com/search/advanced/?s=t&AESTech=true) - - -ソフトウェアでアルゴリズムを実行する代わりに、wolfSSLに機能を追加して、チップから命令を直接呼び出すことができます。これは、AES-NIをサポートするチップセットでwolfSSLを実行している場合、AES Cryptoを5〜10倍速く実行できることを意味します。 - - -AES-NIサポートされたチップセットで実行されている場合は、[`--enable-aesni` build option](chapter02.md#--enable-aesni)でAES-NIを有効にします。AES-NIでwolfSSLをビルドするには、GCC 4.4.3以降はアセンブリコードを使用する必要があります。wolfSSLは、同じビルドオプションを使用してAMDプロセッサのASM命令をサポートしています。 - - -AES-NI に関する参考文献と参考資料を、一般的なものから特定のものまで、以下に示します。AES-NIによるパフォーマンス向上の詳細については、Intel Software Networkページへの3番目のリンクを参照してください。 - - - -* [AES(Wikipedia)](https://en.wikipedia.org/wiki/Advanced_Encryption_Standard) - - -* [AES-NI(Wikipedia)](https://en.wikipedia.org/wiki/AES_instruction_set) - - -* [AES-NI(Intel Software Network page)](https://software.intel.com/en-us/articles/intel-advanced-encryption-standard-instructions-aes-ni/) - - - -AES-NIは、次のAES暗号モードを加速します:AES-CBC、AES-GCM、AES-CCM-8、AES-CCM、およびAES-CTR。AES-GCMは、Ghash認証のためにIntelチップに追加された128ビットの多数関数を使用することにより、さらに加速されます。 - - - -### STM32F2 - - - - -wolfSSLは、STM32F2標準周辺ライブラリを介してSTM32F2ハードウェアベースの暗号化と乱数ジェネレーターを使用できます。 - - -必要な定義については、`WOLFSSL_STM32F2`を`settings.h`に定義してください。`WOLFSSL_STM32F2`定義は、デフォルトでSTM32F2ハードウェアクリプトとRNGサポートを有効にします。これらを個別に有効にするための定義は、`STM32F2_CRYPTO`(ハードウェア暗号サポート用)および`STM32F2_RNG`(ハードウェアRNGサポート用)です。 - - -STM32F2標準周辺ライブラリのドキュメントは、次の文書にあります。 - - - -### Cavium Nitrox - - -wolfSSL は Marvell (以前の Cavium) NITROX () をサポートしています。 wolfSSL のビルド時に Marvell NITROX サポートを有効にするには、次の構成オプションを使用します。 - -```sh -./configure --with-cavium=/home/user/cavium/software -``` - - - -[`--with-cavium=**`](chapter02.md#--with-cavium)オプションは、ライセンスされたCavium/Softwareディレクトリを指しています。Caviumがライブラリをビルドしないため、wolfSSLは`cavium_common.o`ファイルを引っ張ります。また、githubソースツリーを使用している場合は、キャビウムヘッダーがこの警告に準拠していないため、生成されたメイクファイルから`-Wredundant-decls`警告を削除する必要があります。 - - -現在、wolfSSLはCavium RNG、AES、3DES、RC4、HMAC、およびRSAを暗号層で直接サポートしています。SSLレベルでのサポートは部分的であり、現在、AES、3DES、およびRC4を実行しています。RSAとHMACは、非ブロッキングモードでキャビウムの呼び出しが利用できるまで遅くなります。クライアントのサンプルプログラムは、暗号テストとベンチマークと同様に、Caviumサポートをオンにします。`HAVE_CAVIUM`定義を参照してください。 - - - -### ESP32-WROOM-32 - - - - -wolfSSLは、ESP32-WROOM-32ハードウェアベースの暗号化を使用できます。 - - -必要な定義については、`WOLFSSL_ESPWROOM32`を`settings.h`に定義してください。`WOLFSSL_ESPWROOM32`の定義は、デフォルトでESP32-WROOM-32ハードウェアクリプトとRNGサポートを有効にします。現在、wolfSSLは、Crypt層でRNG、AES、SHA、RSAプリミティブをサポートしています。TLSサーバー/クライアント、WolfCryptテスト、ベンチマークを含むプロジェクトの例は、ファイルを展開した後、ESP-IDFの/Examples/Protocols Directoryで見つけることができます。 - -### ESP8266 - -ESP32 とは異なり、ESP8266 で使用できるハードウェアベースの暗号化はありません。 「user_settings.h」の「WOLFSSL_ESP8266」定義を参照してください。 -または `./configure CFLAGS="-DWOLFSSL_ESP8266"` を使用して、組み込み ESP8266 ターゲット用にコンパイルします。 - -### ERF32 - -wolfSSLはERF32ファミリーのハードウェアベースの暗号化を使用できます。 -user_settings.hに`WOLFSSL_SILABS_SE_ACCEL`を定義してください。現在wolfSSLは、RNG、AES-CBC、AES-GCM、AES-CCM、SHA-1、SHA-2、ECDHEとECDSAのハードウェアアクセラレーションをサポートしています。さらに詳細な情報とベンチマーク結果はwolfSSLレポジトリツリーのwolfcrypt/src/port/silabsのREADME.mdを参照してください。 - -## SSL検査(Sniffer) - - - -wolfSSL 1.5.0のリリースから始めて、wolfSSLには、SSL Sniffer(SSL検査)機能を持つようにビルドできるビルドオプションが含まれています。これは、SSLトラフィックパケットを収集し、正しいキーファイルを使用して、それらを復号化できることを意味します。SSLトラフィックを「検査」する機能は、いくつかの理由で役立ちます。その一部には以下が含まれます。 - - - -* ネットワークの問題の分析 - - -* 内部および外部ユーザーによるネットワークの誤用を検出します - - -* 動きのネットワークの使用とデータの監視 - - -* クライアント/サーバー通信のデバッグ - - - -Snifferサポートを有効にするには、\*nixで[`--enable-sniffer`](chapter02.md#--enable-sniffer)オプションを使用してwolfSSLをビルドするか、Windowsで**vcproj**ファイルを使用します。\*nixまたは**winpcap**に**pcap**をWindowsにインストールする必要があります。`sniffer.h`で見つけることができるメインスニファー機能は、それぞれの簡単な説明とともに以下にリストされています。 - - - -* `ssl_SetPrivateKey` - 特定のサーバーとポートの秘密鍵を設定します。 - - -* `ssl_SetNamedPrivateKey` - 特定のサーバー、ポート、ドメイン名の秘密鍵を設定します。 - - -* `ssl_DecodePacket`-デコードのためにTCP/IPパケットで通過します。 - - -* `ssl_Trace` - デバッグトレースをTraceFileに有効/無効にします。 - - -* `ssl_InitSniffer` - 全体的なスニファーを初期化します。 - - -* `ssl_FreeSniffer` - 全体的なスニファーを解放します。 - - -* `ssl_EnableRecovery`-失われたパケットの場合、SSLトラフィックのデコードを取得しようとするオプションを有効にします。 - - -* `ssl_GetSessionStats` - スニファセッションのメモリ使用量を取得します。 - - - -wolfSSLのSnifferのサポートを確認し、完全な例を参照するには、wolfSSLダウンロードの`sslSniffer/sslSnifferTest`フォルダーの`snifftest`アプリを参照してください。 - - -暗号化キーはSSLハンドシェイクにセットアップされているため、その後のアプリケーションデータをデコードするためには、スニファーによってハンドシェークをデコードする必要があることに注意してください。たとえば、wolfSSLのechoserverとechoclientで「snifftest」を使用している場合、サーバーとクライアントの間でハンドシェークが始まる前にSnifftestアプリケーションを開始する必要があります。 - - -スニファは、AES-CBC、DES3-CBC、ARC4、およびCamellia-CBCで暗号化されたストリームのみをデコードできます。ECDHEまたはDHEキー合意が使用されている場合、ストリームは監視できません。RSAまたはECDH鍵交換のみがサポートされています。 - - -wolfSSL Snifferを使用したCallbacksを`WOLFSSL_SNIFFER_WATCH`でオンにすることができます。SnifferWatch機能をコンパイルした状態で、関数`ssl_SetWatchKeyCallback()`を使用してカスタムコールバックを設定できます。コールバックは、ピアから送信された証明書チェーン、エラー値、および証明書のダイジェストの検査に使用されます。コールバックから非0値が返される場合、ピアの証明書を処理するときにエラー状態が設定されます。ウォッチコールバックの追加のサポート機能は次のとおりです。 - - - -* `ssl_SetWatchKeyCtx`:ウォッチコールバックに渡されるカスタムユーザコンテキストを設定します。 - - -* `ssl_SetWatchKey_buffer`:新しいDER形式キーをサーバーセッションにロードします。 - - -* `ssl_SetWatchKey_file`:`ssl_SetWatchKey_buffer`のファイルバージョン。 - - - -スニファを収集する統計は、マクロ`WOLFSSL_SNIFFER_STATS`を定義することでコンパイルできます。統計はSSLSTATS構造体に保持され、`ssl_ReadStatistics`への呼び出しによってアプリケーションSSLSTATS構造にコピーされます.Sniffer Statisticsで使用する追加のAPIは`ssl_ResetStatistics`です(統計の収集をリセットします)と`ssl_ReadResetStatistics`(現在の統計値を読み込み、内部状態をリセットします)。以下は、オンになっているときに保存されている現在の統計です。 - - - -* `sslStandardConns` - - -* `sslClientAuthConns` - - -* `sslResumedConns` - - -* `sslEphemeralMisses` - - -* `sslResumeMisses` - - -* `sslCiphersUnsupported` - - -* `sslKeysUnmatched` - - -* `sslKeyFails` - - -* `sslDecodeFails` - - -* `sslAlerts` - - -* `sslDecryptedBytes` - - -* `sslEncryptedBytes` - - -* `sslEncryptedPackets` - - -* `sslDecryptedPackets` - - -* `sslKeyMatches` - - -* `sslEncryptedConns` - - -## 静的バッファ確保オプション - -wolfSSLでは**動的**メモリ管理が提供されていることを前提に処理が記述されています。すなわち、malloc/free関数でバッファを確保/解放できることを前提としています。 - -wolfSSLが内部で使用している暗号化ライブラリwolfCryptでは動的メモリを使用しない設定も可能です。これは動的メモリ管理機能を提供していない環境や、あるいは安全面の制約で動的メモリ管理機能の使用が制限されている環境では好ましいと言えます。 - -一方、組み込み機器ではOSを使用しない(いわゆるベアメタル)環境で使用する場合、あるいはリアルタイムOSを使用している場合でも動的メモリ管理機能が提供されていない場合があります。このような環境でwolfSSLを使用する方法として**静的バッファ確保オプション**を提供しています。 - -### 静的バッファ確保の基本動作 - -先に説明した「動的メモリ管理」はバッファを「指定されたサイズ(可変長)」に動的に切り出して提供する管理方法です。バッファの使用効率は高いですが処理が比較的複雑です。一方、wolfSSLが提供する「静的バッファ確保機能」は、あらかじめ(静的に)用意した何種類かのバッファのなかから、要求したサイズに近いものを検索して提供するメモリ管理機能のことを言います。バッファの要求元には要求サイズ以上の大きさを持ったメモリブロックが割り当てられることがあります(そのため使用効率が低下します)が、バッファの確保と解放はmalloc/freeと同様に行え、割り当て処理は単純ですみます。任意サイズのメモリブロックを動的に確保する動的メモリ確保を模擬した機能となっています。 - -静的バッファ確保機能の使用はwolfSSLにとっては動的メモリ機能と等価に使用されます。この機能はwolfSSLがメモリの確保/解放をXMALLOC/XFREE関数呼び出しに抽象化してあることで実現できています。一旦、静的バッファ確保機能が設定されると、以降wolfSSLは内部で使用するバッファや他の構造体の確保に静的バッファ確保機能を使用します。この機能はWOLFSSL_CTXに対して設定するので、このオブジェクトの生存期間中は機能が継続します。 - -WOLFSSL_CTXに設定された静的バッファ確保機能はスレッドセーフとなっています。同一のWOLFSSL_CTXを異なるスレッドで共有しながら使用している場合でも、バッファの確保/解放はwolfSSL内部で排他制御しながら利用します。 - -また、RTOSで使用されているメモリプールを使ったメモリ機能では未使用のメモリブロックが見つからない場合にはそのスレッド(タスク)は空きブロックが発生するまでサスペンドされますが、wolfSSLの静的バッファ確保機能にはそのような待ち合わせ機能はありません。 - -### 静的バッファの用途指定 - -静的バッファ確保機能では、2つの用途別にメモリを分けることが可能です。つまり、一般的な目的用とI/O用に使用するバッファを分けて割り当て/解放を行うことが可能です。I/Oに使用するバッファはTLSでの典型的必要サイズから最大2^16バイトまでを扱えるように比較的大きく(17KB程度)設定されていて、それ以外の一般的な用途のバッファサイズと異なる点と、I/Oを行うスレッド(タスク)とそれ以外のスレッドでのメモリ獲得/解放に伴う排他制御を排除したいという2つの理由で用途別に分けることを推奨しています。 - -さらに、バッファを設定した際に、同時に生成できるWOLFSSLオブジェクトの最大数を制限することができます。最大数を制限するとwolfSSL_new()関数を使う度に生成できるWOLFSSLオブジェクトの数がチェックされ、上限を超えるとエラーとなります。 - -### 静的バッファ確保機能の有効化 - -wolfSSLのビルド時に静的バッファ確保オプションを有効化します。autoconfツールを使用してビルドするシステムでは次のように”–enable-staticmemory“を指定します。 - -``` - $./configure --enable-staticmemory -``` - -あるいはuser_settings.hを使用している場合には次のマクロ定義を追加します: -``` -user_settings.h - - #define WOLFSSL_STATIC_MEMORY -``` -さらに、静的バッファ確保機能は与えられたバッファから確保するメモリブロックが枯渇した際に、NULLを返さず標準関数のmalloc()を追加で呼び出す実装となっています。もし、環境に動的メモリ管理機能が提供されていない場合にはリンクエラーとなります。したがって、この機能をディセーブルにする為に、**WOLFSSL_NO_MALLOC**マクロも定義しておきます: - -``` -user_settings.h - - #define WOLFSSL_STATIC_MEMORY - #define WOLFSSL_NO_MALLOC -``` - - -### 静的バッファ確保機能の利用方法 - -上記設定でwolfSSLをビルドすることにより、静的バッファ確保機能が有効となります。 - - -#### 静的バッファの設定関数とその引数 -さらにこの機能を利用するにあたってはアプリケーションは次の関数を呼び出してヒープとして使用するバッファを指定します: - -``` -int wolfSSL_CTX_load_static_memory( - WOLFSSL_CTX** ctx, /* 生成したWOLFSSL_CTXを受け取る為の変数へのポインタ */ - wolfSSL_Methos_func method,/* メソッド */ - unsigned char* buf, /* ヒープとして使用するバッファへのポインタ */ - unsigned int sz, /* ヒープとして使用するバッファのサイズ */ - int flag, /* ヒープの使用用途 */ - int max); /* 許可する最大平行動作数 */ -``` - - -- 引数**ctx**には生成されたWOLFSSL_CTX構造体へのポインタを受け取る変数のアドレスを指定します。
-- 引数**method**にはwolfSSLv23_client_method_**ex**()などの"_ex"が付いた関数の戻り値を指定します。
-- 引数**buf**,**sz**にはそれぞれヒープに使用するバッファのアドレスとそのサイズを指定します。設定すべきバッファのサイズの決定については「必要バッファのサイズの取得」を参照してください。
-- 引数**flag**には一般用途あるいはI/O用を指定する用途と静的バッファの確保状況のトラッキングを行うかどうかのフラグを組み合わせて指定します。一般用途を指定する場合には”0″あるいはWOLFMEM_GENERALを指定します。I/O用としての指定はWOLFMEM_IO_POOあるいはWOLFMEM_IO_POOL_FIXEDを指定します。静的バッファの確保状況のトラッキングを行う場合には用途を指定する値にWOLFMEM_TRACK_STATSをORして指定します。
-- 引数**max**は引数flagで指定したバッファの用途に関係します。バッファの用途が一般用の場合には、生成するWOLFSSLオブジェクトの最大同時生成数(同時に存在できるオブジェクト数)を設定することになります。制限を行う必要がなければ0を指定します。0以外の制限値を指定した場合には、その後のwolfSSL_newの呼び出しで生成するWOLFSSLオブジェクトの同時オブジェクト数が設定値を超える際には生成が失敗することになります。 - -#### 静的バッファの設定関数の呼び出し方 - -静的バッファ確保機能を利用する際には、この**wolfSSL_CTX_load_static_memory関数を2回呼び出します。最初は一般用途用にバッファを設定し、さらにそのバッファを使ってWOLFSSL_CTX構造体を確保します。2回目の呼び出しでは、I/O用バッファを設定します**: - - ``` - WOLFSSL_CTX* ctx = NULL; /* WOLFSSL_CTXを生成する場合にはNULLを指定 */ - int ret; - - #define MAX_CONCURRENT_TLS 0 - #define MAX_CONCURRENT_IO 0 - - unsigned char GEN_MEM[GEN_MEM_SIZE]; - unsigned char IO_MEM[IO_MEM_SIZE];  - - /* 最初の呼び出しで一般用静的バッファを設定してそこからWOLFSSL_CTXを生成する */ - ret = wolfSSL_CTX_load_static_memory( - &ctx, /* ctx変数の内容にはNULLをセットしておく */ - wolfSSLv23_client_method_ex(), /* "_ex"の付いた関数を使う */ - GEN_MEM, GEN_MEM_SIZE, /* 一般用途のバッファとそのサイズ */ - WOLFMEM_GENERAL, /* 一般用途で使用 */ - MAX_CONCURRENT_TLS); /* 最大許容同時接続数 */ - - /* 次は生成したWOLFSSL_CTXにI/O用静的バッファをセットする */ - ret = wolfSSL_CTX_load_static_memory( - &ctx, /* ctxには生成済み構造体が格納されている */ - NULL, /* 今度はctxの生成は行わないのでNULLをセット */ - IO_MEM, IO_MEM_SIZE, /* I/O用途のバッファとそのサイズ */ - WOLFMEM_IO_FIXED, - MAX_CONCURRENT_IO); - - - ``` -この後、WOLFSSL_CTX構造体の使用を終了した後は、通常のwolfSSL_CTX_free()を使って解放してください。 - - -### 静的バッファ確保機能の調整 - -wolfSSLで提供しているこの静的バッファ確保機能では指定されたバッファを次の図の様に複数の”バケット(bucket)”という領域に分けて管理します。バケット内には同一サイズの複数のメモリブロックがリンクされています。下図の中にはメモリブロックの管理のための構造は省略していますが、実際にはそれらの管理領域も含めて必要なサイズを持つバッファが与えられなければなりません。 - -![バケット](buckets.png) - -上記構造は一般用、I/O用のいずれのバッファにも適用されますが、I/O用バッファにはBucketは一種類しかありません。 - -#### 一般用バッファの設定用マクロ定義 - -各バケットはバケット内に含むメモリブロックの数とそのサイズに応じて大きさが異なります。 - -使用する各領域のメモリブロックサイズとブロックの個数が/wolfssl/wolfcrypt/memory.hに次のようなマクロで定義してあります: - -``` -/wolfssl/wolfcrypt/memory.h - - #define WOLFSSL_STATIC_ALIGN 16 /* 適用されるアライメント(デフォルト16バイト)*/ - #define WOLFMEM_MAX_BUCKETS 9    /* バケット数 */ - #define LARGEST_MEM_BUCKET 16128 /* 最大ブロックのサイズ */ - #define WOLFMEM_BUCKETS 64,128,256,512,1024,2432,3456,4544,LARGEST_MEM_BUCKET - #define WOLFMEM_DIST 49,10,6,14,5,6,9,1,1 -``` - - -- **WOLFSSL_STATIC_ALIGN**はバッファのアライメントサイズを指定します。デフォルトで16バイトです。御使用のMCUでのアライメントサイズに合わせて変更する必要があります。 -- **WOLFMEM_MAX_BUCKETS**がバケットの数を示しています。9種類のサイズのバケットを使用することを意味しています。 -- **WOLFMEM_BUCKETS**が各バケット内のブロックのバイト数を小さいものから順にコンマ区切りで指定しています。この定義は一般用バッファに適用されます。 -- **WOLFMEM_DIST**が各バケットに含まれる同一サイズのブロックの数をWOLFMEM_BUCKETSの各ブロックに対応するようにそれらの個数をコンマ区切りで指定しています。この定義は一般用バッファに適用されます。 - -上記の例でいえば、ブロックサイズ64バイトのバケットが最小のサイズであり、そのバケットには49個のメモリブロックを用意することになります。次に大きいバケットはブロックサイズ128バイトで10個のメモリブロックを用意することを意味します。 - -上記定義値はデフォルトの値として使用していただけますが、実際の環境での使用時には各バケットのサイズとそこに含まれるメモリブロック数は調整が必要かもしれません。 - -#### I/O用バッファの設定用マクロ定義 - -I/O用途のバッファは上記一般用途と管理方法は同じですが、バケット数は”1”、バケット内のメモリブロックは1つだけです。またメモリブロックのサイズは**WOLFMEM_IO_SZ**で定義された値となっています。 - -このI/OバッファのサイズはTLSハンドシェークで送受信される最大パケットサイズを考慮して設定されていますが、この最大パケットサイズを**wolfSSL_CTX_UseMaxFragment**()を使ってより小さい値に設定することが可能です。この関数を使って最大パケットサイズを小さくした場合には、その値(この例では660バイト)をWOLFMEM_IO_SZとして設定してください。 - -``` - $ ./configure --enable-staticmemory C_EXTRA_FLAGS="-DWOLFMEM_IO_SZ=660" -``` - - -#### 必要バッファサイズの取得 - -静的バッファ確保機能に割り当てるバッファサイズ(すなわちwolfSSL_CTX_load_static_memory関数に渡すバッファサイズ)の決定に有用な関数を用意してあります。この章の冒頭でバッファが内部でバケットと管理領域からなる構造に構成されて使用されることを説明しました。実際にバッファのサイズを決定する際には、メモリブロックのサイズと管理領域の占めるサイズとパディングによる余分に必要なサイズも含めて計算する必要があります。この計算を行い、必要なバッファサイズを返してくれる関数を用意してあります。 - -wolfSSL_StaticBufferSz関数は、直前のセクションで紹介したマクロ定義値を基にに必要なバッファサイズを計算して返します。この関数が0より大きい値を返すまで、第2引数に与えるサイズは1000などの適当な値からスタートし、戻り値が正となるまでサイズを増やして何度も呼び出します。第3引数のflagには一般用バッファサイズを計算する場合には**WOLFMEM_GENERAL**を与え、I/O用バッファサイズを計算する場合には**WOLFMEM_IO_FIXED**あるいは**WOLFMEM_IO_POOL**を指定してください。 - -``` -int wolfSSL_StaticBufferSz(byte* buffer, /* バッファアドレス */ - word32 sz, /* バッファサイズ */ - int flag); /* バッファの用途 */ -``` - -この関数を使って一般用と、I/O用に必要なバッファサイズを取得し、前述のwolfSSL_CTX_load_static_memory関数に渡してください。 - -一旦バッファサイズが決定したら、上記wolfSSL_StaticBufferSz関数は呼び出す必要はありませんので、製品コードから呼び出し部分をコメントアウトするか削除していただけます。 - -### 静的バッファ利用状況のトラッキング - -静的バッファ確保機能を利用する際に、バッファの確保、解放に関する使用状況を記録させることができます。この使用状況を記録する機能は静的バッファ確保機能にデフォルトで含まれていますからビルド時の有効化として別段のマクロ設定は必要ありません。機能の有効化は実行時に行います。 - -#### トラッキングの有効化 - -トラッキング機能の有効化は先に説明したwolfSSL_CTX_load_static_memory関数の第5引数に**WOLFMEM_TRACK_STATS**をORして指定します。wolfSSL内部に**WOLFSSL_MEM_CONN_STATS構造体**が確保されそこにメモリブロックの使用状況が記録されていきます。 - -``` +```c wolfssl/wolfcrypt/memory.h - struct WOLFSSL_MEM_CONN_STATS { word32 peakMem; /* メモリ使用量最大値(バイト数) */ word32 curMem; /* 現在のメモリ使用量 */ @@ -1405,18 +986,21 @@ struct WOLFSSL_MEM_CONN_STATS { #### メモリ使用状況の取得 -トラッキングが有効になった時点からメモリブロックの使用状況は記録が有効となります。プログラム実行の任意の時点で次の関数を呼び出して、引数で渡したWOLFSSL_CTXあるいはWOLFSSLオブジェクトに静的バッファ確保機能が使用されているか否かを戻り値で返します。使用されている場合には戻り値として”1″を返します。さらに記録されているメモリの使用状況を取得することができます。 +トラッキングが有効になった時点から、メモリブロックの使用状況記録が有効となります。 +プログラム実行の任意の時点で次の関数を呼び出して、引数で渡した`WOLFSSL_CTX`あるいは`WOLFSSL`オブジェクトに静的バッファ確保機能が使用されているか否かを戻り値で返します。 +使用されている場合には戻り値として`1`を返します。 +さらに、記録されているメモリの使用状況を取得できます。 -``` -int wolfSSL_CTX_is_static_memory(WOLFSSL_CTX* ctx, +```c +int wolfSSL_CTX_is_static_memory(WOLFSSL_CTX* ctx, WOLFSSL_MEM_STATS* mem_stats); - int wolfSSL_is_static_memory(WOLFSSL* ssl, WOLFSSL_MEM_STATS* mem_stats); ``` -上記関数の引数として渡したWOLFSSL_MEM_STATS構造体は: -``` +上記関数の引数として渡した`WOLFSSL_MEM_STATS`構造体は、次のように構成されています。 + +```c struct WOLFSSL_MEM_STATS { word32 curAlloc; /* 現在のメモリ確保数 */ word32 totalAlloc;/* 累計メモリ確保回数 */ @@ -1427,239 +1011,141 @@ struct WOLFSSL_MEM_STATS { word32 maxIO; /* I/O用に設定した最大コネクション数 */ word32 blockSz[WOLFMEM_MAX_BUCKETS]; /* ブロックサイズの配列 */ word32 avaBlock[WOLFMEM_MAX_BUCKETS];/* 空きブロック数の配列 */ - word32 usedBlock[WOLFMEM_MAX_BUCKETS]; - int flag;   /* 静的メモリ管理機能に設定したフラグ(バッファ用途等) */ - }; -``` -この構造体に返却された値が呼び出した時点の静的バッファ管理状態を示します。この機能はメモリーリークの検出や無駄に多く割り当てたメモリブロック数の調査などに利用できます。 - -### 静的バッファ管理API - -ここで紹介する関数はwolfSSL_CTX_load_static_memory関数の第2引数に指定するWOLFSSL_METHOD構造体へのポインタを取得する為に使用する関数です。こららの関数はアプリケーションをTLSあるいはDTLSプロトコルのクライアントあるいはサーバーのいずれとして動作させるのかによって選択すべき関数が異なります。静的バッファ管理機能を使う際には必ず関数名の最後に”_ex”が付加された以下の関数を指定してください。こららの関数は”_ex”がつかない関数と機能は同じで、内部でWOLFSSL_METHOD構造体を有効になった静的バッファ管理機能を使って確保する点だけが異なります。各関数の詳細はwolfSSLマニュアルの”wolfSSL APIリファレンス>wolfSSLコンテクストの設定”を参照してください。 - -#### WOLFSSL_METHOD構造体を返す関数群 - -TLSクライアント用関数 - -- `wolfTLSv1_3_client_method_ex` -- `wolfTLSv1_2_client_method_ex` -- `wolfTLSv1_1_client_method_ex` -- `wolfSSLv23_client_method_ex` - -TLSサーバ用関数 - -- `wolfTLSv1_3_server_method_ex` -- `wolfTLSv1_2_server_method_ex` -- `wolfTLSv1_1_server_method_ex` -- `wolfSSLv23_server_method_ex` - -DTLSクライアント用関数 - -- `wolfDTLSv1_3_client_method_ex` -- `wolfTLSv1_2_client_method_ex` -- `wolfTLSv1_1_client_method_ex` -- `wolfSSLv23_client_method_ex` - -DTLSサーバ用関数 - -- `wolfDTLSv1_3_server_method_ex` -- `wolfTLSv1_2_server_method_ex` -- `wolfTLSv1_1_server_method_ex` -- `wolfSSLv23_server_method_ex` - -#### 静的バッファ管理機能 API - -APIリファレンス - - -|関数|機能| -|:---|:---| -|`wolfSSL_CTX_load_static_memory`|WOLFSSL_CTXに静的バッファ管理用のバッファを設定します。| -|`wolfSSL_CTX_is_static_memory`|静的バッファ管理が設定されているかと設定されている場合にはその使用状況を取得します。| -|`wolfSSL_is_static_memory`|静的バッファ管理が設定されているかと設定されている場合にはその使用状況を取得します。| -|[`wolfSSL_StaticBufferSz`](group__Memory.md#function-wolfssl_staticbuffersz)|静的バッファ管理で必要なバッファサイズを計算します。| - - - - - - - - - - - - - - - - - - -## 圧縮 - - - -wolfSSLは、**zlib**ライブラリとのデータ圧縮をサポートしています。`./configure`ビルドシステムはこのライブラリの存在を検出しますが、他の方法でビルドしている場合は、定数`HAVE_LIBZ`を定義し、Zlib.hへのパスを含めます。 - - -特定の暗号ではデフォルトで圧縮がオフになっています。オンにするには、SSLが接続または受け入れる前に、関数[`wolfSSL_set_compression()`](group__Setup.md#function-wolfssl_set_compression)を使用します。クライアントとサーバーの両方が、圧縮を使用するために圧縮をオンにする必要があります。 - - -送信する前にデータを圧縮すると、送信されて受信されるメッセージの実際のサイズが減少しますが、圧縮によって保存されたデータの量は通常、最も遅いネットワークを除くすべてのもので生で送信するよりも分析に時間がかかることに注意してください。 - - - -## 事前共有鍵 - - - -wolfSSLは、静的事前共有キーを使用してこれらの暗号をサポートしています。 - - - -* `TLS_PSK_WITH_AES_256_CBC_SHA` - - - -* `TLS_PSK_WITH_AES_128_CBC_SHA256` - - - -* `TLS_PSK_WITH_AES_256_CBC_SHA384` - - - -* `TLS_PSK_WITH_AES_128_CBC_SHA` - - - -* `TLS_PSK_WITH_NULL_SHA256` - - - -* `TLS_PSK_WITH_NULL_SHA384` - - - -* `TLS_PSK_WITH_NULL_SHA` - - - -* `TLS_PSK_WITH_AES_128_GCM_SHA256` - - - -* `TLS_PSK_WITH_AES_256_GCM_SHA384` - - - -* `TLS_PSK_WITH_AES_128_CCM` - - - -* `TLS_PSK_WITH_AES_256_CCM` - - - -* `TLS_PSK_WITH_AES_128_CCM_8` - - - -* `TLS_PSK_WITH_AES_256_CCM_8` - - - -* `TLS_PSK_WITH_CHACHA20_POLY1305` - - - - -これらのスイートは、`WOLFSSL_STATIC_PSK`オンのwolfSSLに組み込まれています。すべてのPSKスイートは、一定の`NO_PSK`でビルド時にオフにできます。これらの暗号を実行時にのみ使用するには、[`wolfSSL_CTX_set_cipher_list()`](group__Setup.md#function-wolfssl_ctx_set_cipher_list) を目的の暗号スイートとともに使用します。 - - -wolfSSLは、Ephemeral Key PSKスイートをサポートしています。 - - - -* `ECDHE-PSK-AES128-CBC-SHA256` - - - -* `ECDHE-PSK-NULL-SHA256` - - - -* `ECDHE-PSK-CHACHA20-POLY1305` + word32 usedBlock[WOLFMEM_MAX_BUCKETS]; + int flag;   /* 静的メモリ管理機能に設定したフラグ(バッファ用途等) */ + }; +``` +この構造体に返却された値が、呼び出した時点における静的バッファ管理状態を示します。 +この機能はメモリーリークの検出や、無駄に多く割り当てたメモリブロック数の調査などに利用できます。 +### 静的バッファ管理API -* `DHE-PSK-CHACHA20-POLY1305` +ここで紹介する関数は関数`wolfSSL_CTX_load_static_memory()`の第2引数に指定する`WOLFSSL_METHOD`構造体へのポインタを取得する為に使用する関数です。 +こららの関数はアプリケーションをTLSあるいはDTLSプロトコルの、クライアントあるいはサーバーのいずれとして動作させるのかによって選択すべき関数が異なります。 +静的バッファ管理機能を使う際には、必ず関数名の最後に `_ex` が付加された以下の関数を指定してください。 +こららの関数は `_ex` がつかない関数と機能は同じで、内部で`WOLFSSL_METHOD`構造体を、有効になった静的バッファ管理機能を使って確保する点だけが異なります。 +各関数の詳細は[付録A wolfSSL APIリファレンス](appendix01.md)の「wolfSSLコンテクストの設定」節を参照してください。 +#### WOLFSSL_METHOD構造体を返す関数 +TLSクライアント用 -* `DHE-PSK-AES256-GCM-SHA384` +- `wolfTLSv1_3_client_method_ex` +- `wolfTLSv1_2_client_method_ex` +- `wolfTLSv1_1_client_method_ex` +- `wolfSSLv23_client_method_ex` +TLSサーバー用 +- `wolfTLSv1_3_server_method_ex` +- `wolfTLSv1_2_server_method_ex` +- `wolfTLSv1_1_server_method_ex` +- `wolfSSLv23_server_method_ex` -* `DHE-PSK-AES128-GCM-SHA256` +DTLSクライアント用 +- `wolfDTLSv1_3_client_method_ex` +- `wolfTLSv1_2_client_method_ex` +- `wolfTLSv1_1_client_method_ex` +- `wolfSSLv23_client_method_ex` +DTLSサーバー用 -* `DHE-PSK-AES256-CBC-SHA384` +- `wolfDTLSv1_3_server_method_ex` +- `wolfTLSv1_2_server_method_ex` +- `wolfTLSv1_1_server_method_ex` +- `wolfSSLv23_server_method_ex` +#### 静的バッファ確保用のAPI +|API|説明| +|:---|:---| +|[`wolfSSL_CTX_load_static_memory`](group__Memory.md#function-wolfSSL_CTX_static_memory)| WOLFSSL_CTXに静的バッファ確保用のバッファを設定します。 | +|[`wolfSSL_CTX_is_static_memory`](group__Memory.md#function-wolfSSL_CTX_is_static_memory)| 静的バッファ確保が設定されているかと、設定されている場合にはその使用状況を取得します。 | +|[`wolfSSL_is_static_memory`](group__Memory.md#function-wolfSSL_is_static_memory)| 静的バッファ確保が設定されているかと、設定されている場合にはその使用状況を取得します。 | +|[`wc_LoadStaticMemory`](group__Memory.md#function-wc_LoadStaticMemory)| wolfCrypt用に静的メモリを確保するために使用されます。| +|[`wolfSSL_StaticBufferSz`](group__Memory.md#function-wolfssl_staticbuffersz)| `/wolfssl/wolfcrypt/memory.h`で定義されたマクロに基づいて、静的バッファ確保に必要なバッファサイズを計算します。 | -* `DHE-PSK-AES128-CBC-SHA256` +## 圧縮 +wolfSSLは**zlib**ライブラリによるデータ圧縮をサポートしています。 +`./configure`ビルドシステムはこのライブラリの存在を検出しますが、他の方法でビルドしている場合は定数`HAVE_LIBZ`を定義し、zlib.hへのパスをインクルードに含めてください。 +圧縮は特定の暗号では標準でオフになっています。 +オンにするには、SSL接続または受け入れの前に[`wolfSSL_set_compression()`](group__Setup.md#function-wolfssl_set_compression)関数をお使いください。 +圧縮が使用されるためには、クライアントとサーバーの両方で圧縮がオンになっている必要があります。 -* `DHE-PSK-AES128-CBC-SHA256` +送信する前にデータを圧縮すると、送信されて受信されるメッセージの実際のサイズが減少します。 +しかし、圧縮によって保存されたデータは、著しく低速なネットワーク以外では、通常、生のデータを送信するよりも分析に時間がかかることに注意してください。 +## 事前共有鍵 +wolfSSLは、静的な事前共有鍵を持つ以下の暗号をサポートしています。 +* `TLS_PSK_WITH_AES_256_CBC_SHA` +* `TLS_PSK_WITH_AES_128_CBC_SHA256` +* `TLS_PSK_WITH_AES_256_CBC_SHA384` +* `TLS_PSK_WITH_AES_128_CBC_SHA` +* `TLS_PSK_WITH_NULL_SHA256` +* `TLS_PSK_WITH_NULL_SHA384` +* `TLS_PSK_WITH_NULL_SHA` +* `TLS_PSK_WITH_AES_128_GCM_SHA256` +* `TLS_PSK_WITH_AES_256_GCM_SHA384` +* `TLS_PSK_WITH_AES_128_CCM` +* `TLS_PSK_WITH_AES_256_CCM` +* `TLS_PSK_WITH_AES_128_CCM_8` +* `TLS_PSK_WITH_AES_256_CCM_8` +* `TLS_PSK_WITH_CHACHA20_POLY1305` -クライアントでは、関数[`wolfSSL_CTX_set_psk_client_callback()`](ssl_8h.md#function-wolfssl_ctx_set_psk_client_callback)を使用してコールバックをセットアップします。`/examples/client/client.c`のクライアントの例は、クライアントのIDとキーをセットアップするための使用例を示していますが、実際のコールバックは`wolfssl/test.h`に実装されています。 +これらのスイートは`WOLFSSL_STATIC_PSK`がオンの状態でwolfSSLに組み込まれています。 +すべてのPSKスイートはビルド時に定数`NO_PSK`でオフにできます。 +実行時にこれらの暗号のみを使用するには、[`wolfSSL_CTX_set_cipher_list()`](group__Setup.md#function-wolfssl_ctx_set_cipher_list)関数と目的の暗号スイートをお使いください。 +wolfSSLは、エフェメラル鍵PSKスイートもサポートしています。 -サーバー側では、2つの追加のコールが必要です。 +* `ECDHE-PSK-AES128-CBC-SHA256` +* `ECDHE-PSK-NULL-SHA256` +* `ECDHE-PSK-CHACHA20-POLY1305` +* `DHE-PSK-CHACHA20-POLY1305` +* `DHE-PSK-AES256-GCM-SHA384` +* `DHE-PSK-AES128-GCM-SHA256` +* `DHE-PSK-AES256-CBC-SHA384` +* `DHE-PSK-AES128-CBC-SHA256` +* `DHE-PSK-AES128-CBC-SHA256` +クライアント側では、[`wolfSSL_CTX_set_psk_client_callback()`](ssl_8h.md#function-wolfssl_ctx_set_psk_client_callback)関数を使用してコールバックを設定します。 +`/examples/client/client.c`のクライアントサンプルプログラムでは、クライアントIDと鍵の設定の使用例を提供しています。 +ただし、実際のコールバックは`wolfssl/test.h`で実装されたものを使用しています。 +サーバー側では、さらに2つの呼び出しが必要です。 * [`wolfSSL_CTX_set_psk_server_callback()`](ssl_8h.md#function-wolfssl_ctx_set_psk_server_callback) - - * [`wolfSSL_CTX_use_psk_identity_hint()`](group__CertsKeys.md#function-wolfssl_ctx_use_psk_identity_hint) +サーバーは2回目の呼び出しでクライアントを支援するためにIDヒントを保存します。 +サーバー例では「wolfssl server」です。 +サーバーPSKコールバックのサンプル実装も`wolfssl/test.h`の`my_psk_server_cb()`にあります。 - -サーバーは、「wolfSSL Server」のサーバーの例で、2回目の呼び出しを使用してクライアントを支援するためにIDヒントを格納します。Server PSKコールバックの例は、`wolfssl/test.h`で`my_psk_server_cb()`にあります。 - - -wolfSSL は、最大 128 オクテットの ID とヒント、および最大 64 オクテットの事前共有鍵をサポートします。 - - +wolfSSLは最大128オクテットのIDとヒント、および最大64オクテットの事前共有鍵をサポートしています。 ## クライアント認証 +クライアント認証は、クライアントが接続する際にサーバーがクライアントへ証明書を送信するように要求し、クライアントを認証できるようにする機能です。 +クライアント認証にはCA(または自己署名、あなたまたはCA以外の誰かによって生成された場合)からのX.509クライアント証明書が必要です。 - -クライアント認証は、クライアントが接続時に認証のためにサーバーに証明書を送信するように要求することによって、サーバーがクライアントを認証できるようにする機能です。 クライアント認証には、CA からの X.509 クライアント証明書 (または、あなたまたは CA 以外の誰かによって生成された場合は自己署名) が必要です。 - - -デフォルトでは、wolfSSLは受信したすべての証明書を検証します - これにはクライアントとサーバーの両方が含まれます。クライアント認証をセットアップするには、サーバーは、クライアント証明書を次のように確認するために使用される信頼できるCA証明書のリストをロードする必要があります。 - - +デフォルトでは、wolfSSLは受け取るすべての証明書を検証します。 +これには、クライアントとサーバーの両方が含まれます。 +クライアント認証を設定するには、サーバーはクライアント証明書を検証するために使用される、信頼されたCA証明書のリストをロードする必要があります。 ```c wolfSSL_CTX_load_verify_locations(ctx, caCert, 0); ``` - - -クライアントの検証をオンにし、その動作を制御するために、[`wolfSSL_CTX_set_verify()`](group__Setup.md#function-wolfssl_ctx_set_verify)機能が使用されます。次の例では、`SSL_VERIFY_PEER`がサーバーからクライアントへの証明書リクエストをオンにします。`SSL_VERIFY_FAIL_IF_NO_PEER_CERT`は、クライアントがサーバー側で検証する証明書を提示しない場合、サーバーに失敗するように指示します。[`wolfSSL_CTX_set_verify()`](group__Setup.md#function-wolfssl_ctx_set_verify)のその他のオプションには、`SSL_VERIFY_NONE`および`SSL_VERIFY_CLIENT_ONCE`が含まれます。 - - +クライアント検証をオンにしてその動作を制御するには、[`wolfSSL_CTX_set_verify()`](group__Setup.md#function-wolfssl_ctx_set_verify)関数を使用します。 +次の例では、`SSL_VERIFY_PEER`はサーバーからクライアントへの証明書要求をオンにします。 +`SSL_VERIFY_FAIL_IF_NO_PEER_CERT`はクライアントがサーバー側で検証する証明書を提示しない場合に処理を失敗するようにサーバーに指示します。 +[`wolfSSL_CTX_set_verify()`](group__Setup.md#function-wolfssl_ctx_set_verify)のその他のオプションには、`SSL_VERIFY_NONE`および`SSL_VERIFY_CLIENT_ONCE`があります。 ```c wolfSSL_CTX_set_verify(ctx,SSL_VERIFY_PEER | ((usePskPlus)? @@ -1667,135 +1153,98 @@ wolfSSL_CTX_set_verify(ctx,SSL_VERIFY_PEER | ((usePskPlus)? SSL_VERIFY_FAIL_IF_NO_PEER_CERT),0); ``` +クライアント認証の例は、wolfSSLリポジトリに含まれるサンプルサーバー(`server.c`)(`/examples/server/server.c`)で提供しています。 +## Server Name Indication -クライアント認証の例は、wolfsslダウンロード(`/examples/server/server.c`)に含まれるサンプルサーバー(`server.c`)にあります。 - - - -## サーバー名の提示 - - - -SNIは、サーバーが単一の基礎となるネットワークアドレスで複数の「仮想」サーバーをホストする場合に役立ちます。クライアントが連絡しているサーバーの名前を提供することが望ましい場合があります。WolfsSLでSNIを有効にするには、簡単に実行できます。 - - +SNIは、サーバーが単一の基盤となるネットワークアドレスで複数の「仮想」サーバーをホストする場合に役立ちます。 +クライアントが接続先のサーバーの名前を提供することが望ましい場合があります。 +wolfSSLでSNIを有効にするには、次のようにビルドします。 ```sh ./configure --enable-sni ``` - - -クライアント側にSNIを使用するには、追加の関数呼び出しが必要です。これは、次の機能の1つである必要があります。 - - +クライアント側でSNIを使用するには、追加の関数呼び出しが必要です。 +以下のいずれかの関数をお使いください。 * [`wolfSSL_CTX_UseSNI()`](ssl_8h.md#function-wolfssl_ctx_usesni) - - * [`wolfSSL_UseSNI()`](ssl_8h.md#function-wolfssl_usesni) +[`wolfSSL_CTX_UseSNI()`](ssl_8h.md#function-wolfssl_ctx_usesni)は、クライアントが同じサーバーに複数回接続する場合に適しています。 +コンテキストレベルでSNI拡張を設定すると、呼び出しの瞬間から先に、同じコンテキストから作成されたすべてのSSLオブジェクトでSNIの使用が有効になります。 +[`wolfSSL_UseSNI()`](ssl_8h.md#function-wolfssl_usesni)は、1つのSSLオブジェクトに対してのみSNI使用を有効にします。 +セッション間でサーバー名が変わる場合には、この関数を使用することをお勧めします。 -クライアントが同じサーバーに複数回連絡すると、[`wolfSSL_CTX_UseSNI()`](ssl_8h.md#function-wolfssl_ctx_usesni)が最も推奨されます。コンテキストレベルでのSNI拡張子を設定すると、呼び出しの瞬間から同じコンテキストから作成されたすべてのSSLオブジェクトのSNI使用法が可能になります。 - - -[`wolfSSL_UseSNI()`](ssl_8h.md#function-wolfssl_usesni)は1つのSSLオブジェクトのみのSNI使用を有効にするため、サーバー名がセッション間で変更されたときにこの関数を使用することをお勧めします。 - - -サーバー側では、同じ関数呼び出しの1つが必要です。wolfSSL Serverは複数の「仮想」サーバーをホストしていないため、SNIの不一致の場合に接続の終了が必要な場合にSNIの使用が役立ちます。このシナリオでは、[`wolfSSL_CTX_UseSNI()`](ssl_8h.md#function-wolfssl_ctx_usesni)がより効率的になります。サーバーは、同じコンテキストからSNIを使用して後続のすべてのSSLオブジェクトを作成するコンテキストごとに1回しか設定しないためです。 - - +サーバー側では、同じ関数呼び出しのいずれかが必要です。 +wolfSSLサーバーは複数の仮想サーバーをホストしないため、SNIの使用は「SNIが一致しない場合に接続を終了させることが望ましい状況」で役立ちます。 +このシナリオでは、[`wolfSSL_CTX_UseSNI()`](ssl_8h.md#function-wolfssl_ctx_usesni)が適しています。 +サーバーは同じコンテキストからSNIを持つすべての後続のSSLオブジェクトを作成して、コンテキストごとに一度だけ設定します。 ## ハンドシェイクの変更 - - - ### ハンドシェイクメッセージのグループ化 +wolfSSLは、ユーザーが望む場合にハンドシェイクメッセージをグループ化する機能を持っています。 +これはコンテキストレベルで[`wolfSSL_CTX_set_group_messages(ctx);`](group__Setup.md#function-wolfssl_ct_set_group_messages)またはSSLオブジェクトレベルで[`wolfSSL_set_group_messages(ssl);`](group__Setup.md#function-wolfssl_set_group_messages)で行うことができます。 +## 短縮HMAC -wolfSSLには、ユーザーが望む場合、ハンドシェイクメッセージをグループ化する機能があります。これは、[`wolfSSL_CTX_set_group_messages(ctx);`](group__Setup.md#function-wolfssl_ct_set_group_messages)のコンテキストレベルで、または[`wolfSSL_set_group_messages(ssl);`](group__Setup.md#function-wolfssl_set_group_messages)のSSLオブジェクトレベルで実行できます。 - - - -## 短縮されたHMAC. - - - -現在定義されているTLS暗号スイートは、HMACを使用してレコード層通信を認証します。TLSでは、ハッシュ関数の出力全体がMacタグとして使用されます。ただし、MACタグを形成するときにハッシュ関数の出力を80ビットに切り捨てることにより、帯域幅を節約することは、制約付き環境で望ましい場合があります。wolfSSLで切り捨てられたHMACの使用を可能にするには、簡単にできることを説明できます。 - - +現在定義されているTLS暗号スイートは、レコードレイヤー通信を認証するためにHMACを使用します。 +TLSでは、ハッシュ関数の出力全体がMACタグとして使用されます。 +ただし、リソースが制約された環境では、MACタグを形成する際にハッシュ関数の出力を80ビットに切り詰めることで帯域幅を節約することが望ましい場合があります。 +wolfSSLで短縮HMACを有効にするには、次のようにします。 ```sh ./configure --enable-truncatedhmac ``` - - -クライアント側に切り捨てられたHMACを使用するには、追加の関数呼び出しが必要です。これは、次の機能の1つである必要があります。 - - +クライアント側で短縮HMACを使用するには、追加の関数呼び出しが必要です。 +以下のいずれかの関数をお使いください。 * [`wolfSSL_CTX_UseTruncatedHMAC()`](ssl_8h.md#function-wolfssl_ctx_usetruncatedhmac) - - * [`wolfSSL_UseTruncatedHMAC()`](ssl_8h.md#function-wolfssl_usetruncatedhmac) +[`wolfSSL_CTX_UseTruncatedHMAC()`](ssl_8h.md#function-wolfssl_ctx_usetrunctatedhmac)は、クライアントがすべてのセッションで短縮HMACを有効にしたい場合に適しています。 +コンテキストレベルで短縮HMAC拡張を設定すると、呼び出しの瞬間から先に、同じコンテキストから作成されたすべてのSSLオブジェクトで有効になります。 +[`wolfSSL_UseTruncatedHMAC()`](ssl_8h.md#function-wolfssl_usetruncatedhmac)は1つのSSLオブジェクトに対してのみ有効にします。 +すべてのセッションで短縮HMACが必要ない場合に、この関数を使用することをお勧めします。 -クライアントがすべてのセッションに対して切り捨てられたHMACを有効にしたい場合に最も推奨されます。コンテキストレベルでの切り捨てられたHMAC拡張子を設定すると、呼び出しの瞬間と同じコンテキストから作成されたすべてのSSLオブジェクトでそれを有効にします。 - - -[`wolfSSL_UseTruncatedHMAC()`](ssl_8h.md#function-wolfssl_usetruncatedhmac)は1つのSSLオブジェクトのみを有効にします。そのため、すべてのセッションでTruncated HMACを必要としない場合はこの機能を使用することをお勧めします。 - - -サーバー側では、通話は不要です。サーバーは、クライアントの切り捨てられたHMACの要求に自動的に注意を払っています。 - - -すべてのTLS拡張機能を有効にすることもできます。 - +サーバー側での関数呼び出しは必要ありません。 +サーバーは短縮HMACのクライアントの要求に自動的に対応します。 +すべてのTLS拡張機能も以下で有効にできます。 ```sh ./configure --enable-tlsx ``` - - - ## ユーザー暗号モジュール - - -ユーザーCryptoモジュールを使用すると、ユーザーがサポートされている操作中に使用したいカスタム暗号をプラグインできます(現在RSA操作がサポートされています)。モジュールの例は、IPPライブラリを使用してディレクトリ`root_wolfssl/wolfcrypt/user-crypto/`にあります。Cryptoモジュールを使用するためにwolfSSLをビルドするときの構成オプションの例は次のとおりです。 - - +ユーザー暗号モジュールでは、サポートされている処理の実行中に、ユーザーが使用したいカスタム暗号をプラグインできます。 +(現在はRSA操作をサポートしています。) +モジュールの例は、IPPライブラリを使用した`wolfssl/wolfcrypt/user-crypto/`ディレクトリにあります。 +ユーザー暗号モジュールを有効にしてwolfSSLをビルドするには、次のようにします。 ```sh ./configure --with-user-crypto ``` - - -また - - +特定のディレクトリを指定するには、次のようにします。 ```sh ./configure --with-user-crypto=/dir/to ``` +RSA操作を実行するユーザー暗号モジュールを作成する場合、RSA用のヘッダーファイル`user_rsa.h`が必須です。 +すべてのユーザー暗号操作では、ユーザーのライブラリが`libusercrypto`と命名されていることが必須条件です。 +これらは、wolfSSL autoconfツールがユーザー暗号モジュールをリンクして使用する際に探す名前です。 +wolfSSLで提供している実装例では、ヘッダーファイル`user_rsa.h`は`wolfcrypt/user-crypto/include/`ディレクトリにあり、作成後のライブラリは`wolfcrypt/user-crypto/lib/`ディレクトリにあります。 +必要なAPIのリストについては、提供されているヘッダーファイルをご参照ください。 - -RSA操作を実行するユーザー暗号モジュールを作成するときは、`user_rsa.h`と呼ばれるRSA用のヘッダーファイルがあることが必須です。すべてのユーザー暗号操作では、ユーザーライブラリが`libusercrypto`と呼ばれます。これらはwolfSSL AutoConfツールの名前です。ユーザー暗号モジュールをリンクして使用するときに探してください。wolfSSLを備えた例では、ヘッダファイル`user_rsa.h`はディレクトリ`wolfcrypt/user-crypto/include/`にあり、作成されたライブラリはディレクトリ`wolfcrypt/user-crypto/lib/`にあります。提供されているヘッダーファイルを参照してください。 - - -例を作成するには、IPPライブラリをインストールした後、ルートwolfSSLディレクトリから次のコマンドを実行する必要があります。 - - +IPPライブラリをインストールした後、実装例をビルドするには、wolfSSLのルートディレクトリから次のコマンドを実行する必要があります。 ```sh cd wolfcrypt/user-crypto/ @@ -1805,203 +1254,85 @@ make sudo make install ``` +wolfSSLに含まれる例ではIPPの使用が必要であり、プロジェクトをビルドする前にIPPライブラリをインストールする必要があります。 +IPPライブラリがなくても実装例をビルドすることはできますが、あくまでファイル名の選択とAPIインターフェースの例を提供することを目的としています。 +ライブラリ`libusercrypto`とヘッダーファイルの両方を作成してインストールした後、wolfSSLに暗号モジュールを使用させるには追加の手順は必要ありません。 +単に[`--with-user-crypto`](chapter02.md#--with-user-crypto)設定フラグを使用するだけで、通常のwolfSSL暗号からユーザー暗号モジュールへのすべての関数呼び出しがマッピングされます。 +wolfSSLの`XMALLOC`を使用してメモリ割り当てを行う場合は、`DYNAMIC_TYPE_USER_CRYPTO`でタグ付けする必要があります。 +これにより、モジュールによって使用されるメモリ割り当ての分析が可能になります。 -wolfSSLの添付の例では、プロジェクトをビルドする前にインストールする必要があるIPPの使用が必要です。ただし、例をビルドするためのIPPライブラリを持っていなくても、ファイル名選択とAPIインターフェイスの例をユーザーに提供することを目的としています。ライブラリlibusercryptoとヘッダーファイルの両方を作成してインストールしたら、wolfSSLを使用すると、Cryptoモジュールは追加のステップを必要としません。Configure Flag [`--with-user-crypto`](chapter02.md#--with-user-crypto)を使用するだけで、一般的なwolfSSL暗号からのすべての関数呼び出しをユーザー暗号モジュールにマッピングします。 - - -メモリの割り当ては、wolfSSLのXMALLOCを使用している場合は、`DYNAMIC_TYPE_USER_CRYPTO`でタグ付けする必要があります。モジュールで使用されるメモリ割り当てを分析できます。 - - -ユーザーの暗号モジュールは、wolfsslの設定オプションの速いRSAおよび/またはFIPSと組み合わせて使用することは**できません**。FIPSには、特定の認証コードを使用し、FAST-RSAを使用してRSA操作を実行するために例ユーザー暗号モジュールを使用します。 - - - -## Wolfsslのタイミング耐性 +ユーザー暗号モジュールは、wolfSSLのconfigureオプション`fast-rsa`や`fips`と**一緒に**使用することはできません。 +FIPSは特定の認証済みコードの使用を要求し、fast-rsaはRSA操作を実行するためのサンプルユーザー暗号モジュールを使用します。 +## wolfSSLのタイミング耐性 +wolfSSLは、潜在的にリークタイミング情報を漏らす可能性のある比較操作を行うときに一定の時間を保証する関数`ConstantCompare`を提供します。 +このAPIは、タイミングベースのサイドチャネル攻撃を阻止するために、wolfSSLのTLSレベルと暗号レベルの両方で使用されます。 -wolfSSLは、潜在的にリークタイミング情報を漏らす可能性のある比較操作を行うときに一定の時間を保証する関数"ConstantCompare"を提供します。このAPIは、タイミングベースのサイドチャネル攻撃を阻止するために、wolfSSLのTLSレベルと暗号レベルの両方で使用されます。 - - -wolfSSL ECC実装には、ECCアルゴリズムのタイミング耐性を有効にするために、`ECC_TIMING_RESISTANT`を定義しています。同様に、定義`TFM_TIMING_RESISTANT`は、RSAアルゴリズムのタイミング耐性のFast Mathライブラリに提供されます。関数exptmodは、タイミング耐性のモンゴメリーラダーを使用します。 - - -参照:[`--disable-harden`](chapter02.md#--disable-harden) - - +wolfSSLのECC実装には、ECCアルゴリズムでタイミング耐性を有効にするために、`ECC_TIMING_RESISTANT`を定義しています。 +同様に、fastmathライブラリにはRSAアルゴリズムのタイミング耐性のために、`TFM_TIMING_RESISTANT`を定義しています。 +関数`exptmod`はタイミング耐性のあるMontgomeryラダーを使用します。 +詳細は[第2章 wolfSSLのビルド](chapter02.md)の`--disable-harden`をご覧ください。 処理時間一定化とキャッシュ抵抗は、`--enable-harden`で有効になっています。 - - -* `WOLFSSL_SP_CACHE_RESISTANT`:使用するアドレスをマスクするロジックを有効にします。 - - +* 非推奨:`WOLFSSL_SP_CACHE_RESISTANT`:使用するアドレスをマスクするロジックを有効にします。デフォルトで常に有効です。デフォルトのキャッシュ耐性を無効にするには[第2章 wolfSSLのビルド](chapter02.md)の`--disable-harden`をご覧ください。 * `WC_RSA_BLINDING`:タイミング攻撃を防ぐために、ブラインドモードを有効にします。 - - * `ECC_TIMING_RESISTANT`:ECC固有の処理時間一定化。 - - * `TFM_TIMING_RESISTANT`:Fast Math固有の処理時間一定化。 +## 固定ABI - - -## 固定化されたABI - - - - -wolfSSLは、アプリケーションプログラミングインターフェイス(API)のサブセットに固定アプリケーションバイナリインターフェイス(ABI)を提供します。次の機能は、wolfSSL v4.3.0以降、wolfSSLの将来のすべてのリリースにわたって互換性があります。 - - +wolfSSLは、アプリケーションプログラミングインターフェース(API)のサブセットに対して、固定アプリケーションバイナリインターフェース(ABI)を提供します。 +wolfSSL v4.3.0以降、以下の関数はwolfSSLのすべての将来のリリースで互換性があります。 * [`wolfSSL_Init()`](group__TLS.md#function-wolfssl_init) - - * [`wolfTLSv1_2_client_method()`](group__Setup.md#function-wolftlsv1_2_client_method) - - * [`wolfTLSv1_3_client_method()`](group__Setup.md#function-wolftlsv1_3_client_method) - - * [`wolfSSL_CTX_new()`](group__Setup.md#function-wolfssl_ctx_new) - - * [`wolfSSL_CTX_load_verify_locations()`](group__CertsKeys.md#function-wolfssl_ctx_load_verify_locations) - - * [`wolfSSL_new()`](group__Setup.md#function-wolfssl_new) - - * [`wolfSSL_set_fd()`](group__Setup.md#function-wolfssl_set_fd) - - * [`wolfSSL_connect()`](group__IO.md#function-wolfssl_connect) - - * [`wolfSSL_read()`](group__IO.md#function-wolfssl_read) - - * [`wolfSSL_write()`](group__IO.md#function-wolfssl_write) - - * [`wolfSSL_get_error()`](group__Debug.md#function-wolfssl_get_error) - - * [`wolfSSL_shutdown()`](group__TLS.md#function-wolfssl_shutdown) - - * [`wolfSSL_free()`](group__Setup.md#function-wolfssl_free) - - * [`wolfSSL_CTX_free()`](group__Setup.md#function-wolfssl_ctx_free) - - * [`wolfSSL_check_domain_name()`](group__Setup.md#function-wolfssl_check_domain_name) - - * [`wolfSSL_UseALPN()`](group__Setup.md#function-wolfssl_usealpn) - - * [`wolfSSL_CTX_SetMinVersion()`](group__Setup.md#function-wolfssl_ctx_setminversion) - - * [`wolfSSL_pending()`](group__IO.md#function-wolfssl_pending) - - * [`wolfSSL_set_timeout()`](group__Setup.md#function-wolfssl_set_timeout) - - * [`wolfSSL_CTX_set_timeout()`](group__Setup.md#function-wolfssl_ctx_set_timeout) - - * [`wolfSSL_get_session()`](group__IO.md#function-wolfssl_get_session) - - * [`wolfSSL_set_session()`](group__Setup.md#function-wolfssl_set_session) - - * [`wolfSSL_flush_sessions()`](group__IO.md#function-wolfssl_flush_sessions) - - * [`wolfSSL_CTX_set_session_cache_mode()`](group__Setup.md#function-wolfssl_ctx_set_session_cache_mode) - - * [`wolfSSL_get_sessionID()`](group__openSSL.md#function-wolfssl_get_sessionid) - - * [`wolfSSL_UseSNI()`](ssl_8h.md#function-wolfssl_usesni) - - * [`wolfSSL_CTX_UseSNI()`](ssl_8h.md#function-wolfssl_ctx_usesni) - - * [`wc_ecc_init_ex()`](group__ECC.md#function-wc_ecc_init_ex) - - * [`wc_ecc_make_key_ex()`](group__ECC.md#function-wc_ecc_make_key_ex) - - * [`wc_ecc_sign_hash()`](group__ECC.md#function-wc_ecc_sign_hash) - - * [`wc_ecc_free()`](group__ECC.md#function-wc_ecc_free) - - * [`wolfSSL_SetDevId()`](ssl_8h.md#function-wolfssl_setdevid) - - * [`wolfSSL_CTX_SetDevId()`](ssl_8h.md#function-wolfssl_ctx_setdevid) - - * [`wolfSSL_CTX_SetEccSignCb()`](ssl_8h.md#function-wolfssl_ctx_seteccsigncb) - - * [`wolfSSL_CTX_use_certificate_chain_file()`](group__CertsKeys.md#function-wolfssl_ctx_use_certificate_chain_file) - - * [`wolfSSL_CTX_use_certificate_file()`](group__CertsKeys.md#function-wolfssl_ctx_use_certificate_file) - - * [`wolfSSL_use_certificate_chain_file()`](group__openSSL.md#function-wolfssl_use_certificate_chain_file) - - * [`wolfSSL_use_certificate_file()`](group__openSSL.md#function-wolfssl_use_certificate_file) - - * [`wolfSSL_CTX_use_PrivateKey_file()`](group__CertsKeys.md#function-wolfssl_ctx_use_privatekey_file) - - * [`wolfSSL_use_PrivateKey_file()`](group__openSSL.md#function-wolfssl_use_privatekey_file) - - * [`wolfSSL_X509_load_certificate_file()`](group__CertsKeys.md#function-wolfssl_x509_load_certificate_file) - - * [`wolfSSL_get_peer_certificate()`](group__CertsKeys.md#function-wolfssl_get_peer_certificate) - - * [`wolfSSL_X509_NAME_oneline()`](group__CertsKeys.md#function-wolfssl_x509_name_oneline) - - * [`wolfSSL_X509_get_issuer_name()`](group__CertsKeys.md#function-wolfssl_x509_get_issuer_name) - - * [`wolfSSL_X509_get_subject_name()`](group__CertsKeys.md#function-wolfssl_x509_get_subject_name) - - * [`wolfSSL_X509_get_next_altname()`](group__CertsKeys.md#function-wolfssl_x509_get_next_altname) - - * [`wolfSSL_X509_notBefore()`](group__CertsKeys.md#function-wolfssl_x509_notbefore) - - * [`wolfSSL_X509_notAfter()`](group__CertsKeys.md#function-wolfssl_x509_notafter) - - * [`wc_ecc_key_new()`](group__ECC.md#function-wc_ecc_key_new) - - * [`wc_ecc_key_free()`](group__ECC.md#function-wc_ecc_key_free) diff --git a/wolfSSL/src-ja/chapter05.md b/wolfSSL/src-ja/chapter05.md index df0bfda9..46ec3a5e 100644 --- a/wolfSSL/src-ja/chapter05.md +++ b/wolfSSL/src-ja/chapter05.md @@ -1,33 +1,24 @@ - - -# ポータビリティ - - - +# 移植性 ## 抽象化レイヤー - - - ### C標準ライブラリ抽象化レイヤー - - -wolfSSL(以前のCyassl)は、C標準ライブラリなしでビルドして、開発者により高いレベルのポータビリティと柔軟性を提供することができます。ユーザーは、C標準の関数の代わりに使用したい関数をマッピングする必要があります。 - - +wolfSSLはC標準ライブラリなしでビルドでき、開発者へより高いレベルの移植性と柔軟性を提供します。 +ユーザーは、C標準の代わりに使用したい関数をマッピングする必要があります。 #### メモリ使用 +ほとんどのCプログラムは動的メモリ割り当てに`malloc()`と`free()`を使用します。 +wolfSSLは、代わりに`XMALLOC()`と`XFREE()`を使用します。 +デフォルトでは、これらはCランタイムバージョンを指します。 +`XMALLOC_USER`を定義することで、ユーザーは独自のフックを提供できます。 +各メモリ関数は標準的なものに加えて、ヒープヒントと割り当てタイプという2つの追加引数を取ります。 +ユーザーはこれらを無視するか、好きな方法で使用できます。 +wolfSSLのメモリ関数は`wolfssl/wolfcrypt/types.h`にあります。 - -ほとんどのCプログラムは、動的メモリ割り当てに`malloc()`および`free()`を使用します。wolfSSLは、代わりに`XMALLOC()`および`XFREE()`を使用します。デフォルトでは、これらはCランタイムバージョンを指します。`XMALLOC_USER`を定義することにより、ユーザーは独自のフックを提供できます。各メモリ関数は、標準的なものについて2つの追加の引数、ヒープのヒント、および割り当てタイプを使用します。ユーザーは、これらを無視するか、好きな方法で使用できます。wolfSSLメモリ関数は`wolfssl/wolfcrypt/types.h`で見つけることができます。 - - -wolfSSLは、コンパイル時ではなく実行時にメモリオーバーライド関数を登録する機能も提供します。`wolfssl/wolfcrypt/memory.h`はこの機能のヘッダーであり、ユーザーは次の関数を呼び出してメモリ関数をセットアップできます。 - - +wolfSSLはコンパイル時ではなく実行時に、メモリオーバーライド関数を登録する機能も提供します。 +`wolfssl/wolfcrypt/memory.h`はこの機能のヘッダーであり、ユーザーは以下の関数を呼び出してメモリ関数を設定できます。 ```c int wolfSSL_SetAllocators(wolfSSL_Malloc_cb malloc_function, @@ -35,309 +26,165 @@ int wolfSSL_SetAllocators(wolfSSL_Malloc_cb malloc_function, wolfSSL_Realloc_cb realloc_function); ``` - - -コールバックプロトタイプについては、ヘッダー`wolfssl/wolfcrypt/memory.h`、実装については`memory.c`を参照してください。 - - +詳しくは`wolfssl/wolfcrypt/memory.h`のコールバックプロトタイプと、`memory.c`の実装をご参照ください。 #### string.h - - -wolfSSLは、`string.h`の`memcpy()`、`memset()`、および`memcmp()`のように振る舞ういくつかの機能を使用します。それらはそれぞれ`XMEMCPY()`、`XMEMSET()`、および`XMEMCMP()`に抽象化されています。デフォルトでは、C標準ライブラリバージョンを指します。`STRING_USER`を定義することで、ユーザーは`types.h`で独自のフックを提供できます。たとえば、デフォルトでは`XMEMCPY()`は次のとおりです。 - - +wolfSSLは`string.h`の`memcpy()`、`memset()`、`memcmp()`などのように動作するいくつかの関数を使用します。 +これらはそれぞれ`XMEMCPY()`、`XMEMSET()`、`XMEMCMP()`として抽象化されています。 +デフォルトでは、それらはC標準ライブラリのバージョンを指しています。 +`STRING_USER`を定義することで、ユーザーは`types.h`で独自のフックを提供できます。 +例えば、デフォルトでは`XMEMCPY()`は次の通りです。 ```c #define XMEMCPY(d,s,l) memcpy((d),(s),(l)) ``` - - -`STRING_USER`を定義した後は、次のことができます。 - - +`STRING_USER`を定義した後、別途用意したバージョン`my_memcpy()`を指すように設定するには以下のようにします。 ```c #define XMEMCPY(d,s,l) my_memcpy((d),(s),(l)) ``` - - -またはマクロを避けたい場合: - - +マクロを避けたい場合、次のように示すこともできます。 ```c external void* my_memcpy(void* d, const void* s, size_t n); ``` +#### math.h - -あなたのバージョン`my_memcpy()`を指すようにwolfsslの抽象化レイヤーを設定する。 - - - -#### Math.H - - - -wolfSSLは、`math.h`の`pow()` `log()`のように振る舞う2つの機能を使用しています。Difie-Hellmanのみが必要とするため、ビルドからDHを除外すると、独自のDHを提供する必要はありません。それらは`XPOW()`および`XLOG()`として`wolfcrypt/src/dh.c`に定義されます。 - - +wolfSSLは`math.h`の`pow()`と`log()`のように動作する2つの関数を使用します。 +これらはDiffie-Hellmanでのみ必要とするため、ビルドからDHを除外すれば、独自のものを提供する必要はありません。 +これらは`XPOW()`と`XLOG()`として抽象化され、`wolfcrypt/src/dh.c`にあります。 #### ファイルシステムの使用 +デフォルトでは、wolfSSLは鍵と証明書をロードするためにシステムのファイルシステムを使用します。 +これは`NO_FILESYSTEM`を定義することでオフにできます。 +代わりに、システムが提供するものとは別のファイルシステムを使用したい場合、`ssl.c`の`XFILE()`レイヤーを使用して、ファイルシステム呼び出しを使用したいものに向けることができます。 +詳細はMICRIUMの定義で提供される実装例をご参照ください。 +### カスタム入出力抽象化レイヤー -デフォルトでは、wolfSSLはキーと証明書をロードするためにシステムのファイルシステムを使用します。`NO_FILESYSTEM`を定義することでオフにすることができます。代わりに項目Vを参照してください。システムがて提供するファイル システムと異なるものを使用したい場合は、ssl.c の XFILE() レイヤーを使用して、ファイル システム呼び出しを使用したいシステムに向けることができます。Micrium Defineによって提供される例を参照してください。 - - - -### カスタム入力/出力抽象化レイヤー - +wolfSSLは、SSL接続のI/Oをより高度に制御したい、あるいはTCP/IP以外の異なる転送媒体の上でSSLを実行したい場合のために、カスタムI/O抽象化レイヤーを提供します。 +ユーザーは2つの関数を定義する必要があります。 -wolfSSLは、SSL接続のI/Oをより高く制御したい、またはTCP/IP以外の異なるトランスポートメディアの上にSSLを実行したい方のためのカスタムI/O抽象化レイヤを提供します。 - - -ユーザーは2つの機能を定義する必要があります。 - - - -1. ネットワーク送信機能 - - -2. ネットワーク受信機能 - - - -これらの2つの関数は、`ssl.h`の`CallbackIOSend`および`CallbackIORecv`によってプロトタイプ化されています。 - +1. ネットワーク送信関数 +2. ネットワーク受信関数 +これら2つの関数は`ssl.h`の`CallbackIOSend`と`CallbackIORecv`でプロトタイプ化されています。 ```c typedef int (*CallbackIORecv)(WOLFSSL *ssl, char *buf, int sz, void *ctx); typedef int (*CallbackIOSend)(WOLFSSL *ssl, char *buf, int sz, void *ctx); ``` - - -ユーザーは`WOLFSSL_CTX`ごとに`wolfSSL_SetIOSend()`および`wolfSSL_SetIORecv()`に登録する必要があります。たとえば、デフォルトの場合は、`CBIORecv()`と`CBIOSend()`は`io.c`の下部に登録されています。 - - +ユーザーは`WOLFSSL_CTX`ごとに、`wolfSSL_SetIOSend()`と`wolfSSL_SetIORecv()`を使ってこれらの関数を登録する必要があります。 +例えばデフォルトの場合、`CBIORecv()`と`CBIOSend()`は`io.c`の最後に登録されています。 ```c void wolfSSL_SetIORecv(WOLFSSL_CTX *ctx, CallbackIORecv CBIORecv) { - ctx->CBIORecv=CBIORecv; + ctx->CBIORecv = CBIORecv; } void wolfSSL_SetIOSend(WOLFSSL_CTX *ctx, CallbackIOSend CBIOSend) { - ctx->CBIOSend=CBIOSend; + ctx->CBIOSend = CBIOSend; } ``` +ユーザーは`io.c`の最後で示されているように、`wolfSSL_SetIOWriteCtx()`と`wolfSSL_SetIOReadCtx()`を使用して、WOLFSSLオブジェクト(セッション)ごとにコンテキストを設定できます。 +例えば、ユーザーがメモリバッファを使用している場合、コンテキストはメモリバッファへのアクセス方法を説明する構造体へのポインタかもしれません。 +ユーザーによるオーバーライドがない場合、ソケットをコンテキストとして登録します。 +`CBIORecv`と`CBIOSend`関数ポインタは、カスタムI/O関数を指すことができます。 +`io.c`にあるデフォルトの`Send()`および`Receive()`関数である`EmbedSend()`と`EmbedReceive()`は、テンプレートやガイドとして使用できます。 -ユーザは、`io.c`の下部に示されているように、`wolfSSL_SetIOWriteCtx()`および`wolfSSL_SetIOReadCtx()`でwolfSSLオブジェクト(セッション)ごとにコンテキストを設定することができる。例えば、ユーザがメモリバッファを使用している場合、コンテキストはどこで説明を説明する構造へのポインタであり得る。メモリバッファにアクセスします。デフォルトの場合は、ユーザーが上書きしないで、ソケットをコンテキストとして登録します。 - - -`CBIORecv`および`CBIOSend`関数ポインターは、カスタムI/O関数を指すことができます。`io.c`にあるデフォルトの`Send()`および`Receive()`関数、`EmbedSend()`および`EmbedReceive()`は、テンプレートとガイドとして使用できます。 - - -`WOLFSSL_USER_IO`は、デフォルトのI/O関数`EmbedSend()`および`EmbedReceive()`の自動設定を削除するために定義できます。 - - - -### オペレーティングシステムの抽象化レイヤー - +`WOLFSSL_USER_IO`を定義すると、デフォルトのI/O関数`EmbedSend()`と`EmbedReceive()`の自動設定を削除できます。 +### オペレーティングシステム抽象化レイヤー -wolfSSL OS抽象化レイヤーは、ユーザーのオペレーティングシステムへのwolfSSLの簡単な移植を容易にするのに役立ちます。`wolfssl/wolfcrypt/settings.h`ファイルには、OSレイヤーをトリガーする設定が含まれています。 +wolfSSL OS抽象化レイヤーは、wolfSSLをユーザーのオペレーティングシステムに移植しやすくします。 +`wolfssl/wolfcrypt/settings.h`には、OS抽象化レイヤーを起動する設定が含まれています。 +OS固有の定義は、wolfCryptの場合`wolfssl/wolfcrypt/types.h`に、wolfSSLの場合`wolfssl/internal.h`にあります。 -OS特有の定義は、WolfCryptおよびWolfsslの`wolfssl/internal.h`の`wolfssl/wolfcrypt/types.h`にあります。 - - - -## サポートされているオペレーティングシステム - - - -wolfSSLを定義する1つの要因は、新しいプラットフォームに簡単に移植される能力です。そのため、wolfsslは、out-of-box のオペレーティングシステムの多くをサポートしています。現在サポートされているオペレーティングシステムは次のとおりです。 - +## サポートしているオペレーティングシステム +wolfSSLを定義する1つの要因は、新しいプラットフォームに簡単に移植される能力です。 +そのため、wolfsslは、out-of-box のオペレーティングシステムの多くをサポートしています。 +現在サポートしているオペレーティングシステムは、次の通りです。 * Win32/64 - - -* Linux. - - +* Linux * Mac OS X - - * Solaris - - * ThreadX - - * VxWorks - - * FreeBSD - - * NetBSD - - * OpenBSD - - -* embedded Linux - - -* yocto linux - - +* Embedded Linux +* Yocto Linux * OpenEmbedded - - * WinCE - - * Haiku - - * OpenWRT - - -* iPhone(iOS) - - +* iPhone (iOS) * Android - - -* Nintendo Wii と Gamecube through DevKitPro - - +* Nintendo Wii/Gamecube(DevKitPro経由) * QNX - - - * MontaVista - - * NonStop - - * TRON/ITRON/µITRON - - -* Micrium's µC/OS-III - - +* Micrium µC/OS-III * FreeRTOS - - * SafeRTOS - - - * NXP/Freescale MQX - - * Nucleus - - * TinyOS - - * HP/UX - - * AIX - - * ARC MQX - - * TI-RTOS - - * uTasker - - * embOS - - * INtime - - * Mbed - - * µT-Kernel - - * RIOT - - - * CMSIS-RTOS - - - * FROSTED - - - * Green Hills INTEGRITY - - -* keil RTX - - +* Keil RTX * TOPPERS - - - -* Petalinux - - +* PetaLinux * Apache Mynewt +## サポートしているチップメーカー +wolfSSLはARM、Intel、Motorola、mbed、Freescale、Microchip(PIC32)、STMicro(STM32F2/F4)、NXP、Analog Devices、Texas Instruments、AMDなどのチップセットをサポートしています。 +## C#ラッパー -## サポートされたチップメーカー - - - -wolfSSLは、ARM、Intel、Motorola、MBED、Freescale、Microchip(PIC32)、STMicro(STM32F2/F4)、NXP、Analog Devices、Texas Instruments、AMDなどを含むチップセットをサポートしています。 - - - -## C#ラッパー - - - -wolfSSLは、制限付きですがC#での使用をサポートしています。ポートを含むビジュアルスタジオプロジェクトは、ディレクトリ`root_wolfSSL/wrapper/CSharp/`にあります。ビジュアルスタジオプロジェクトを開いた後、ビルド -> 構成マネージャーをクリックして「アクティブソリューション構成」と「アクティブソリューションプラットフォーム」を設定します。」はDLLデバッグとDLLリリースです。サポートされているプラットフォームはWin32およびX64です。 - - -ソリューションとプラットフォームを設定したら、プリプロセッサフラグ`HAVE_CSHARP`を追加する必要があります。これにより、C#ラッパーで使用され、サンプルプログラムで使用されるオプションがオンになります。 - - -その後、ビルドするだけでビルドソリューションを選択します。これにより、`wolfssl.dll`、`wolfSSL_CSharp.dll`および例が作成されます。サンプルプログラムは、それらをエントリポイントとしてターゲットにして、Visual Studioでデバッグを実行することで実行できます。 - +wolfSSLは、制限付きですがC#での使用をサポートしています。 +ポートを含むVisual Studioプロジェクトは、`root_wolfSSL/wrapper/CSharp/`にあります。 +Visual Studioプロジェクトを開いた後、ビルド -> 構成マネージャーをクリックして「アクティブソリューション構成」と「アクティブソリューションプラットフォーム」を設定します。 +サポートしているアクティブソリューション構成はDLLデバッグとDLLリリースです。 +サポートされているプラットフォームはWin32およびx64です。 -作成されたC#ラッパーをC#プロジェクトに追加することは、いくつかの方法で実行できます。1つの方法は、作成された`wolfssl.dll`および`wolfSSL_CSharp.dll`をディレクトリ`C:/Windows/System/`にインストールすることです。これにより、Wolfssl C#ラッパーの呼び出しが可能になります。 +ソリューションとプラットフォームを設定したら、プリプロセッサフラグ`HAVE_CSHARP`を追加する必要があります。 +これにより、C#ラッパー及びサンプルプログラムで使用されるオプションがオンになります。 +その後、ビルドするだけでソリューションをビルドを選択します。 +これにより`wolfssl.dll`、`wolfSSL_CSharp.dll`および例が作成されます。 +サンプルプログラムは、それらをエントリポイントとしてターゲットにして、Visual Studioでデバッグを実行することで実行できます。 +作成されたC#ラッパーをC#プロジェクトに追加するには、いくつかの方法があります。 +1つは、作成された`wolfssl.dll`と`wolfSSL_CSharp.dll`をディレクトリ`C:/Windows/System/`にインストールすることです。 ```cs using wolfSSL.CSharp @@ -351,5 +198,6 @@ public some_class { ... ``` +これにより、wolfSSL C#ラッパーへの呼び出しができるようになります。 -Wolfssl C#ラッパーに電話をかける。別の方法は、Visual Studioプロジェクトを作成し、wolfSSLのバンドルC#ラッパーソリューションを参照することです。 +もう1つの方法は、Visual Studioプロジェクトを作成し、wolfSSLにバンドルされているC#ラッパーソリューションを参照することです。 diff --git a/wolfSSL/src-ja/chapter06.md b/wolfSSL/src-ja/chapter06.md index b0d3b027..371e55ef 100644 --- a/wolfSSL/src-ja/chapter06.md +++ b/wolfSSL/src-ja/chapter06.md @@ -1,17 +1,10 @@ - - # コールバック - - - ## ハンドシェイクコールバック - - -wolfSSL(以前のCyassl)には、ハンドシェイクコールバックが接続または待受に設定できるようにする拡張子があります。これは、別のデバッガが利用できず、スニッフィングが実用的でない場合に、組み込みシステムでのデバックに役立ちます。wolfSSLハンドシェイクコールバックを使用するには、拡張機能、[`wolfSSL_connect_ex()`](ssl_8h.md#function_wolfssl_connect_ex)および[`wolfSSL_accept_ex()`](ssl_8h.md#function-wolfssl_accept_ex)を使用します。 - - +wolfSSLには、`connect`または`accept`のためのハンドシェイクコールバックを設定できる拡張機能があります。 +これは、別のデバッガーが利用できず、スニッフィングが現実的でない場合に、組み込みシステムでのデバッグサポートに役立ちます。 +wolfSSLハンドシェイクコールバックを使用するには、拡張関数[`wolfSSL_connect_ex()`](ssl_8h.md#function_wolfssl_connect_ex)と[`wolfSSL_accept_ex()`](ssl_8h.md#function-wolfssl_accept_ex)を使用します。 ```c int wolfSSL_connect_ex(WOLFSSL*, HandShakeCallBack, TimeoutCallBack, @@ -20,21 +13,13 @@ int wolfSSL_accept_ex(WOLFSSL*, HandShakeCallBack, TimeoutCallBack, Timeval) ``` - - `HandShakeCallBack`は次のように定義されています。 - - ```c typedef int (*HandShakeCallBack)(HandShakeInfo*); ``` - - -`HandShakeInfo`は`wolfssl/callbacks.h`で定義されています(標準以外のビルドに追加する必要があります): - - +`HandShakeInfo`は`wolfssl/callbacks.h`(非標準ビルドに追加される必要があります)で定義されています。 ```c typedef struct handShakeInfo_st { @@ -46,29 +31,22 @@ typedef struct handShakeInfo_st { } HandShakeInfo; ``` - - -ハンドシェーク中のSSLパケットの最大数がわかっているため、動的メモリは使用されません。パケット名には、`packetNames[idx]` から `numberPackets` までアクセスできます。コールバックは、ハンドシェイクエラーが発生したかどうかを呼び出します。使用法の例がクライアントのサンプルプログラムにあります。 - - +ハンドシェイク交換での最大SSLパケット数は既知であるため、動的メモリは使用されません。 +パケット名は`packetNames[idx]`で`numberPackets`まで参照できます。 +コールバックは、ハンドシェイクエラーが発生したかどうかに関係なく呼び出されます。 +実装例はクライアントのサンプルプログラムに掲載しています。 ## タイムアウトコールバック - - -wolfSSLハンドシェイクコールバックで使用されているのと同じ拡張機能をwolfSSLタイムアウトコールバックにも使用できます。これらの拡張機能は、コールバック (Handshake および/または Timeout) のいずれか、両方、またはどちらも使用せずに呼び出すことができます。`TimeoutCallback`は次のように定義されています。 - - +wolfSSLハンドシェイクコールバックで使用する拡張機能は、wolfSSLタイムアウトコールバックにも使用できます。 +これらの拡張機能は、コールバック(ハンドシェイクやタイムアウト)のいずれか、両方、またはどちらも使用せずに使用できます。 +`TimeoutCallback`は、次のように定義されています。 ```c typedef int (*TimeoutCallBack)(TimeoutInfo*); ``` - - -`TimeoutInfo`は次のようになります。 - - +`TimeoutInfo`は次のようになっています。 ```c typedef struct timeoutInfo_st { @@ -80,125 +58,341 @@ typedef struct timeoutInfo_st { } TimeoutInfo; ``` - - -やはり、最大数のSSLパケットがハンドシェイクでわかっているので、この構造に動的メモリは使用されません。`Timeval`は、struct timevalのtypedefです。 - +ハンドシェイクに対する最大SSLパケット数が分かっているため、ここでもこの構造体に動的メモリは使用されません。 +`Timeval`はstruct timevalのtypedefです。 `PacketInfo`は次のように定義されています。 - - ```c typedef struct packetInfo_st { char packetName[MAX_PACKETNAME_SZ + 1]; /* SSL name */ - Timeval timestamp; /* when it occured */ + Timeval timestamp; /* when it occurred */ unsigned char value[MAX_VALUE_SZ]; /* if fits, it's here */ unsigned char* bufferValue; /* otherwise here (non 0) */ int valueSz; /* sz of value or buffer */ } PacketInfo; ``` +ここでは、動的メモリが使用される場合があります。 +SSLパケットが`value`に収まる場合は、そこに配置されます。 +`valueSz`は長さを保持し、`bufferValue`は0です。 +パケットが`value`にとって大きすぎる場合、パケットは`bufferValue`に配置されます。 +(**Certificate**パケットがこれを引き起こすことがあります。) +`valueSz`はサイズを保持します。 + +**Certificate**パケットのためにメモリが割り当てられると、コールバックが戻った後に回収されます。 +タイムアウトはシグナル、特に`SIGALRM`を使用して実装され、スレッドセーフです。 +`ITIMER_REAL`タイプの以前のアラームが設定されている場合、その後、正しいハンドラとともにリセットされます。 +古いタイマーは、wolfSSLの処理にかかる時間に合わせて時間調整されます。 +既存のタイマーが渡されたタイマーよりも短い場合、既存のタイマー値が使用されます。 +それでも後でリセットされます。 +期限切れとなる既存のタイマーは、間隔が関連付けられている場合はリセットされます。 +コールバックはタイムアウトが発生した場合にのみ実行されます。 + +使用例については、[第3章 入門](chapter03.md)の「クライアントサンプルプログラム」節をご参照ください。 +## ユーザーアトミックレコードレイヤー処理 + +wolfSSLは、SSL/TLS接続中にMAC/暗号化/復号/検証機能をより詳細に制御したいユーザー向けに、アトミックレコード処理コールバックを提供します。 -ここでは、動的メモリを用いてもよい。SSLパケットが`value`に収まることができる場合、それが配置されている場所です。`valueSz`は長さと`bufferValue`を保持します。パケットが`value`で大きすぎる場合は、**証明書**パケットのみがこれを引き起こすはずです.`valueSz`にはSIZEを保持します。 +ユーザーは2つの関数を定義する必要があります。 +1. MAC/暗号化コールバック関数 +2. 復号/検証コールバック関数 -**証明書**パケットにメモリが割り当てられている場合は、コールバックが返された後に回収されます。タイムアウトはシグナル、具体的には `SIGALRM` を使用して実装され、スレッドセーフです。以前のアラームがタイプ`ITIMER_REAL`のセットである場合、その後、正しいハンドラーとともにリセットされます。古いタイマーは、wolfSSL が処理に費やす時間に合わせて調整されます。既存のタイマーが渡されたタイマーよりも短い場合、既存のタイマー値が使用されます。その後はまだリセットされます。期限切れになる既存のタイマーは、それに関連付けられた間隔がある場合、リセットされます。コールバックは、タイムアウトが発生した場合にのみ発行されます。 +これら2つの関数は`ssl.h`の`CallbackMacEncrypt`と`CallbackDecryptVerify`でプロトタイプ化されています。 + +```c +typedef int (*CallbackMacEncrypt)(WOLFSSL* ssl, + unsigned char* macOut,const unsigned char* macIn, + unsigned int macInSz,int macContent, int macVerify, + unsigned char* encOut, const unsigned char* encIn, + unsigned int encSz,void* ctx); +typedef int (*CallbackDecryptVerify)(WOLFSSL* ssl, + unsigned char* decOut, const unsigned char* decIn, + unsigned int decSz, int content, int verify, + unsigned int* padSz, void* ctx); +``` -使用法については[クライアントの例](chapter03.md#client-example)を参照してください。 +ユーザーはこれらの関数を作成し、[`wolfSSL_CTX_SetMacEncryptCb()`](ssl_8h.md#function-wolfssl_ctx_setmacencryptcb)と[`wolfSSL_CTX_SetDecryptVerifyCb()`](ssl_8h.md#function-wolfssl_ctx_setdecryptverifycb)でwolfSSLコンテキスト(`WOLFSSL_CTX`)ごとに登録する必要があります。 +ユーザーは[`wolfSSL_SetMacEncryptCtx()`](ssl_8h.md#function-wolfssl_setmacencryptctx)と[`wolfSSL_SetDecryptVerifyCtx()`](ssl_8h.md#function-wolfssl_setdecryptverifyctx)で`WOLFSSL`オブジェクト(セッション)ごとにコンテキストを設定できます。 +このコンテキストは、ユーザー指定のコンテキストへのポインタであり、`void* ctx`パラメータを通じてMAC/暗号化/復号/検証コールバックに返されます。 +コールバックの実装例は、`wolfssl/test.h`の`myMacEncryptCb()`と`myDecryptVerifyCb()`に掲載しています。 +使用例は、wolfSSLのクライアントサンプルプログラム(`examples/client/client.c`)で`-U`コマンドラインオプションを使用することで見ることができます。 -## ユーザーアトミックレコードレイヤー処理 +アトミックレコードレイヤーコールバックを使用するには、wolfSSLを`--enable-atomicuser`設定オプションを使用してコンパイルするか、`ATOMIC_USER`プリプロセッサフラグを定義する必要があります。 +## 公開鍵コールバック +wolfSSLは、SSL/TLS接続中にDH、ECC、Ed25519、X25519、Ed448、X448、およびRSA操作をより詳細に制御したいユーザー向けに公開鍵(PK)コールバックを提供します。 -wolfSSLは、SSL/TLS接続中にMAC/暗号化、復号化/検証などの機能をより制御したユーザーにアトミックレコード処理コールバックを提供します。 +公開鍵コールバックを使用するには、wolfSSLを`HAVE_PK_CALLBACKS`を定義してコンパイルする必要があります。 +これは次の設定オプションを使用して行うことができます。 +```sh +./configure --enable-pkcallbacks +``` -ユーザーは2つの関数を定義する必要があります。 +さらに、各コールバックタイプには、特定の機能が有効になっている必要があります。 +例:`HAVE_DH`、`HAVE_ED25519` +### DHコールバック -1. Mac/暗号化コールバック関数 +wolfSSLは、SSL/TLS接続中にDH鍵生成と鍵合意操作をより詳細に制御したいユーザー向けにDH(Diffie-Hellman)コールバックを提供します。 +ユーザーはオプションで2つの関数を定義できます。 +1. DH鍵生成コールバック +2. DH鍵合意コールバック -2. 復号化/検証コールバック関数 +これらの関数は`ssl.h`の`CallbackDhGenerateKeyPair`と`CallbackDhAgree`でプロトタイプ化されています。 +```c +typedef int (*CallbackDhGenerateKeyPair)(DhKey* key, WC_RNG* rng, + byte* priv, word32* privSz, + byte* pub, word32* pubSz); + +typedef int (*CallbackDhAgree)(WOLFSSL* ssl, struct DhKey* key, + const unsigned char* priv, unsigned int privSz, + const unsigned char* otherPubKeyDer, unsigned int otherPubKeySz, + unsigned char* out, word32* outlen, + void* ctx); +``` + +ユーザーはこれらの関数を作成し、wolfSSLコンテキスト(`WOLFSSL_CTX`)ごとに以下を使用して登録する必要があります。 + +* `wolfSSL_CTX_SetDhGenerateKeyPair()` +* `wolfSSL_CTX_SetDhAgreeCb()` + +ユーザーは`wolfSSL_SetDhAgreeCtx()`を使用して`WOLFSSL`オブジェクト(セッション)ごとにコンテキストを設定できます。 +コールバックの実装例は`wolfssl/test.h`の`myDhCallback()`で提供しています。 +使用例はwolfSSLのクライアントサンプルプログラム(`examples/client/client.c`)で見ることができます。 -これらの2つの関数は、`ssl.h`の`CallbackMacEncrypt`および`CallbackDecryptVerify`によってプロトタイプ化されています。 +DHコールバックを使用するには、wolfSSLを`HAVE_DH`を定義してコンパイルする必要があります。 +### Ed25519コールバック +wolfSSLは、SSL/TLS接続中にEd25519署名/検証操作をより詳細に制御したいユーザー向けにEd25519コールバックを提供します。 + +ユーザーはオプションで2つの関数を定義できます。 +1. Ed25519署名コールバック +2. Ed25519検証コールバック + +これらの関数は`ssl.h`の`CallbackEd25519Sign`と`CallbackEd25519Verify`でプロトタイプ化されています。 ```c -typedef int (*CallbackMacEncrypt)(WOLFSSL* ssl, - unsigned char* macOut,const unsigned char* macIn, - unsigned int macInSz,int macContent, int macVerify, - unsigned char* encOut, const unsigned char* encIn, - unsigned int encSz,void* ctx); +typedef int (*CallbackEd25519Sign)(WOLFSSL* ssl, + const unsigned char* in, unsigned int inSz, + unsigned char* out, unsigned int* outSz, + const unsigned char* keyDer, unsigned int keySz, + void* ctx); + +typedef int (*CallbackEd25519Verify)(WOLFSSL* ssl, + const unsigned char* sig, unsigned int sigSz, + const unsigned char* msg, unsigned int msgSz, + const unsigned char* keyDer, unsigned int keySz, + int* result, void* ctx); +``` -typedef int (*CallbackDecryptVerify)(WOLFSSL* ssl, - unsigned char* decOut, const unsigned char* decIn, - unsigned int decSz, int content, int verify, - unsigned int* padSz, void* ctx); +ユーザーはこれらの関数を作成し、wolfSSLコンテキスト(`WOLFSSL_CTX`)ごとに以下を使用して登録する必要があります。 + +* `wolfSSL_CTX_SetEd25519SignCb()` +* `wolfSSL_CTX_SetEd25519VerifyCb()` + +ユーザーは以下を使用して`WOLFSSL`オブジェクト(セッション)ごとにコンテキストを設定できます。 + +* `wolfSSL_SetEd25519SignCtx()` +* `wolfSSL_SetEd25519VerifyCtx()` + +コールバックの実装例は`wolfssl/test.h`の`myEd25519Sign()`と`myEd25519Verify()`で提供しています。 +使用例はwolfSSLのクライアントサンプルプログラム(`examples/client/client.c`)で見ることができます。 + +Ed25519コールバックを使用するには、wolfSSLを`HAVE_PK_CALLBACKS`と`HAVE_ED25519`を定義してコンパイルする必要があります。 + +### X25519コールバック + +wolfSSLは、SSL/TLS接続中にX25519鍵生成と共有秘密計算をより詳細に制御したいユーザー向けにX25519コールバックを提供します。 + +ユーザーはオプションで2つの関数を定義できます。 +1. X25519鍵生成コールバック +2. X25519共有秘密コールバック + +これらの関数は`ssl.h`の`CallbackX25519KeyGen`と`CallbackX25519SharedSecret`でプロトタイプ化されています。 + +```c +typedef int (*CallbackX25519KeyGen)(WOLFSSL* ssl, struct curve25519_key* key, + unsigned int keySz, void* ctx); + +typedef int (*CallbackX25519SharedSecret)(WOLFSSL* ssl, + struct curve25519_key* otherKey, + unsigned char* pubKeyDer, unsigned int* pubKeySz, + unsigned char* out, unsigned int* outlen, + int side, void* ctx); ``` +ユーザーはこれらの関数を作成し、wolfSSLコンテキスト(`WOLFSSL_CTX`)ごとに以下を使用して登録する必要があります。 +* `wolfSSL_CTX_SetX25519KeyGenCb()` +* `wolfSSL_CTX_SetX25519SharedSecretCb()` -ユーザーは、[`wolfSSL_CTX_SetMacEncryptCb()`](ssl_8h.md#function-wolfssl_ctx_setmacencryptcb)および[`wolfSSL_CTX_SetDecryptVerifyCb()`](ssl_8h.md#function-wolfssl_ctx_setdecryptverifycb()でwolfSSLコンテキスト(`WOLFSSL_CTX`)ごとにこれらの機能を書いて登録する必要があります。 +ユーザーは以下を使用して`WOLFSSL`オブジェクト(セッション)ごとにコンテキストを設定できます。 +* `wolfSSL_SetX25519KeyGenCtx()` +* `wolfSSL_SetX25519SharedSecretCtx()` -ユーザーは、[`wolfSSL_SetMacEncryptCtx()`](ssl_8h.md#function-wolfssl_setmacencryptctx)と[`wolfSSL_SetDecryptVerifyCtx()`](ssl_8h.md#function-wolfssl_setdecryptverifyctx)でwolfSSLオブジェクト(セッション)ごとにコンテキストを設定できます。このコンテキストは、ユーザー指定のコンテキストへのポインタであり得ます。これは次にMac/EncryptおよびDecrypt/Decrypt/Decrypt/Verify Callbacksに渡されます。`void* ctx`パラメータ。 +コールバックの実装例は`wolfssl/test.h`の`myX25519KeyGen()`と`myX25519SharedSecret()`で提供しています。 +使用例はwolfSSLのクライアントサンプルプログラム(`examples/client/client.c`)で見ることができます。 +X25519コールバックを使用するには、wolfSSLを`HAVE_PK_CALLBACKS`と`HAVE_CURVE25519`を定義してコンパイルする必要があります。 +### Ed448コールバック -1. コールバックの例は、`-U`コマンドラインオプションを使用する場合、`wolfssl/test.h`、`myMacEncryptCb()`および`myDecryptVerifyCb()`の下で、wolfSSLの例クライアント(`examples/client/client.c`)で使用できます。 +wolfSSLは、SSL/TLS接続中にEd448署名/検証操作をより詳細に制御したいユーザー向けにEd448コールバックを提供します。 +ユーザーはオプションで2つの関数を定義できます。 +1. Ed448署名コールバック +2. Ed448検証コールバック +これらの関数は`ssl.h`の`CallbackEd448Sign`と`CallbackEd448Verify`でプロトタイプ化されています。 -Atomic Record Layer Callbacksを使用するには、wolfSSLを`--enable-atomicuser` Configureオプションを使用してコンパイルする必要があります。 +```c +typedef int (*CallbackEd448Sign)(WOLFSSL* ssl, + const unsigned char* in, unsigned int inSz, + unsigned char* out, unsigned int* outSz, + const unsigned char* keyDer, unsigned int keySz, + void* ctx); + +typedef int (*CallbackEd448Verify)(WOLFSSL* ssl, + const unsigned char* sig, unsigned int sigSz, + const unsigned char* msg, unsigned int msgSz, + const unsigned char* keyDer, unsigned int keySz, + int* result, void* ctx); +``` +ユーザーはこれらの関数を作成し、wolfSSLコンテキスト(`WOLFSSL_CTX`)ごとに以下を使用して登録する必要があります。 +* `wolfSSL_CTX_SetEd448SignCb()` +* `wolfSSL_CTX_SetEd448VerifyCb()` -## 公開キーのコールバック +ユーザーは以下を使用して`WOLFSSL`オブジェクト(セッション)ごとにコンテキストを設定できます。 +* `wolfSSL_SetEd448SignCtx()` +* `wolfSSL_SetEd448VerifyCtx()` +コールバックの実装例は`wolfssl/test.h`の`myEd448Sign()`と`myEd448Verify()`で提供しています。 +使用例はwolfSSLのクライアントサンプルプログラム(`examples/client/client.c`)で見ることができます。 -wolfSSLは、SSL/TLS接続中にRSAの署名/検証機能をもっと多くの制御を希望するユーザーのための公開鍵コールバックを提供します。 +Ed448コールバックを使用するには、wolfSSLを`HAVE_PK_CALLBACKS`と`HAVE_ED448`を定義してコンパイルする必要があります。 +### X448コールバック -ユーザーはオプションで7つの関数を定義できます。 +wolfSSLは、SSL/TLS接続中にX448鍵生成と共有秘密操作をより詳細に制御したいユーザー向けにX448コールバックを提供します。 + +ユーザーはオプションで2つの関数を定義できます。 +1. X448鍵生成コールバック +2. X448共有秘密コールバック + +これらの関数は`ssl.h`の`CallbackX448KeyGen`と`CallbackX448SharedSecret`でプロトタイプ化されています。 + +```c +typedef int (*CallbackX448KeyGen)(WOLFSSL* ssl, struct curve448_key* key, + unsigned int keySz, void* ctx); +typedef int (*CallbackX448SharedSecret)(WOLFSSL* ssl, + struct curve448_key* otherKey, + unsigned char* pubKeyDer, unsigned int* pubKeySz, + unsigned char* out, unsigned int* outlen, + int side, void* ctx); +``` +ユーザーはこれらの関数を作成し、wolfSSLコンテキスト(`WOLFSSL_CTX`)ごとに以下を使用して登録する必要があります。 -1. ECCサインコールバック +* `wolfSSL_CTX_SetX448KeyGenCb()` +* `wolfSSL_CTX_SetX448SharedSecretCb()` +ユーザーは以下を使用して`WOLFSSL`オブジェクト(セッション)ごとにコンテキストを設定できます。 -2. ECCの確認コールバック +* `wolfSSL_SetX448KeyGenCtx()` +* `wolfSSL_SetX448SharedSecretCtx()` +コールバックの実装例は`wolfssl/test.h`の`myX448KeyGen()`と`myX448SharedSecret()`で提供しています。 +使用例はwolfSSLのクライアントサンプルプログラム(`examples/client/client.c`)で見ることができます。 -3. ECCはシークレットコールバックを共有しました +X448コールバックを使用するには、wolfSSLを`HAVE_PK_CALLBACKS`と`HAVE_CURVE448`を定義してコンパイルする必要があります。 +### RSA PSS コールバック -4. RSAサインコールバック +wolfSSLは、SSL/TLS接続中にRSA PSS署名/検証操作をより詳細に制御したいユーザー向けにRSA PSSコールバックを提供します。 +ユーザーはオプションで4つの関数を定義できます。 +1. RSA PSS署名コールバック +2. RSA PSS検証コールバック +3. RSA PSS署名チェックコールバック +4. RSA PSS検証チェックコールバック -5. RSAはコールバックを検証します +これらの関数は`ssl.h`の`CallbackRsaPssSign`、`CallbackRsaPssVerify`、および`CallbackRsaPssSignCheck`でプロトタイプ化されています。 +```c +typedef int (*CallbackRsaPssSign)(WOLFSSL* ssl, + const unsigned char* in, unsigned int inSz, + unsigned char* out, unsigned int* outSz, + int hash, int mgf, + const unsigned char* keyDer, unsigned int keySz, + void* ctx); + +typedef int (*CallbackRsaPssVerify)(WOLFSSL* ssl, + unsigned char* sig, unsigned int sigSz, + unsigned char** out, + int hash, int mgf, + const unsigned char* keyDer, unsigned int keySz, + void* ctx); + +typedef int (*CallbackRsaPssSignCheck)(WOLFSSL* ssl, + unsigned char* sig, unsigned int sigSz, + unsigned char** out, + const unsigned char* keyDer, unsigned int keySz, + void* ctx); +``` -6. RSA暗号化コールバック +ユーザーはこれらの関数を作成し、wolfSSLコンテキスト(`WOLFSSL_CTX`)ごとに以下を使用して登録する必要があります。 + +* `wolfSSL_CTX_SetRsaPssSignCb()` +* `wolfSSL_CTX_SetRsaPssVerifyCb()` +* `wolfSSL_CTX_SetRsaSignCheckCb()` +* `wolfSSL_CTX_SetRsaPssSignCheckCb()` + +ユーザーは以下を使用して`WOLFSSL`オブジェクト(セッション)ごとにコンテキストを設定できます。 + +* `wolfSSL_SetRsaPssSignCtx()` +* `wolfSSL_SetRsaPssVerifyCtx()` +* `wolfSSL_SetRsaSignCheckCtx()` +* `wolfSSL_SetRsaPssSignCheckCtx()` +コールバックの例は`wolfssl/test.h`の`myRsaPssSign()`、`myRsaPssVerify()`、および`myRsaPssSignCheck()`にあります。 +使用例はwolfSSL例のクライアントで見ることができます。 -7. RSA復号化コールバック +コールバックの実装例は`wolfssl/test.h`の`myRsaPssSign()`、`myRsaPssVerify()`、`myRsaPssSignCheck()`で提供しています。 +使用例はwolfSSLのクライアントサンプルプログラム(`examples/client/client.c`)で見ることができます。 +RSA PSSコールバックを使用するには、wolfSSLを`HAVE_PK_CALLBACKS`と`WC_RSA_PSS`を定義してコンパイルする必要があります。 +### ECCコールバック -これら2つの機能は`ssl.h`に`CallbackRsaSign`,`CallbackEccVerify`,`CallbackRsaSign`,`CallbackRsaSign`,`CallbackRsaEnc`、`CallbackRsaEnc`、`CallbackRsaEnc`、`CallbackRsaSign`、`CallbackRsaEnc`、`CallbackRsaDec`、`CallbackRsaDec`、`CallbackRsaDec` +ユーザーはオプションで7つの関数を定義できます。 +1. ECC署名コールバック +2. ECC検証コールバック +3. ECC共有秘密コールバック +4. RSA署名コールバック +5. RSA検証コールバック +6. RSA暗号化コールバック +7. RSA復号コールバック +これらの関数は`ssl.h`の`CallbackEccSign`、`CallbackEccVerify`、`CallbackEccSharedSecret`、`CallbackRsaSign`、`CallbackRsaVerify`、`CallbackRsaEnc`、および`CallbackRsaDec`でプロトタイプ化されています。 ```c typedef int (*CallbackEccSign)(WOLFSSL* ssl, const unsigned @@ -241,63 +435,214 @@ typedef int (*CallbackRsaDec)(WOLFSSL* ssl, unsigned char* in, void* ctx); ``` +ユーザーはこれらの関数を作成し、wolfSSLコンテキスト(`WOLFSSL_CTX`)ごとに以下を使用して登録する必要があります。 + +* [`wolfSSL_CTX_SetEccSignCb()`](ssl_8h.md#function-wolfssl_ctx_seteccsigncb) +* [`wolfSSL_CTX_SetEccVerifyCb()`](ssl_8h.md#function-wolfssl_ctx_seteccverifycb) +* `wolfSSL_CTX_SetEccSharedSecretCb()` +* [`wolfSSL_CTX_SetRsaSignCb()`](ssl_8h.md#function-wolfssl_ctx_setrsasigncb) +* [`wolfSSL_CTX_SetRsaVerifyCb()`](ssl_8h.md#function-wolfssl_ctx_setrsaverifycb) +* [`wolfSSL_CTX_SetRsaEncCb()`](ssl_8h.md#function-wolfssl_ctx_setrsaenccb) +* [`wolfSSL_CTX_SetRsaDecCb()`](ssl_8h.md#function-wolfssl_ctx_setrsadeccb) + +ユーザーは`WOLFSSL`オブジェクト(セッション)ごとに以下でコンテキストを設定できます。 +* [`wolfSSL_SetEccSignCtx()`](ssl_8h.md#function-wolfssl_seteccsignctx) +* [`wolfSSL_SetEccVerifyCtx()`](ssl_8h.md#function-wolfssl_seteccverifyctx) +* `wolfSSL_SetEccSharedSecretCtx()` +* [`wolfSSL_SetRsaSignCtx()`](ssl_8h.md#function-wolfssl_setrsasignctx) +* [`wolfSSL_SetRsaVerifyCtx()`](ssl_8h.md#function-wolfssl_setrsaverifyctx) +* [`wolfSSL_SetRsaEncCtx()`](ssl_8h.md#function-wolfssl_setrsaencctx) +* [`wolfSSL_SetRsaDecCtx()`](ssl_8h.md#function-wolfssl_setrsadecctx) -ユーザーはwolfSSLコンテキストごとにこれらの機能を書いて登録する必要があります(`WOLFSSL_CTX`)。 +これらのコンテキストは、ユーザー指定のコンテキストへのポインタであり、それぞれの公開鍵コールバックに`void* ctx`パラメータを通じて返されます。 +コールバックの実装例は`wolfssl/test.h`の`myEccSign()`、`myEccVerify()`、`myEccSharedSecret()`、`myRsaSign()`、`myRsaVerify()`、`myRsaEnc()`、および`myRsaDec()`で提供しています。 +使用例は、wolfSSLのクライアントサンプルプログラム(`examples/client/client.c`)で`-P`コマンドラインオプションを使用することで見ることができます。 +アトミックレコードレイヤーコールバックを使用するには、wolfSSLを[`--enable-pkcallbacks`](chapter02.md#--enable-pkcallbacks)設定オプションを使用してコンパイルするか、`HAVE_PK_CALLBACKS`プリプロセッサフラグを定義する必要があります。 -* [`wolfSSL_CTX_SetEccSignCb()`](ssl_8h.md#function-wolfssl_ctx_seteccsigncb) +## 暗号コールバック(cryptocb) +wolfSSL/wolfCryptの暗号コールバックフレームワークは、ユーザーが特定の暗号アルゴリズムのデフォルト実装をオーバーライドし、実行時に独自のカスタム実装を提供できるようにします。 +暗号コールバックの最も一般的なユースケースは、アルゴリズムをカスタムハードウェアアクセラレーションにオフロードすることです。 +この他にも、追加のロギング/内部検査の追加、セキュアストレージからの鍵の取得、標準準拠の理由で別のライブラリから暗号を呼び出す、あるいはリモートプロシージャコールの実行にも使用できます。 -* [`wolfSSL_CTX_SetEccVerifyCb()`](ssl_8h.md#function-wolfssl_ctx_seteccverifycb) +### 暗号コールバックの使用方法 +暗号コールバックを使用するには、次のようにします。 -* `wolfSSL_CTX_SetEccSharedSecretCb()` +1. 暗号コールバックサポート付きでwolfSSLをコンパイルする +2. コールバックと一意のデバイスID(`devId`)をwolfCryptに登録する +3. `devId`をwolfCrypt API関数の引数として渡す +4. (TLSのみ)`devId`をwolfSSLコンテキストに関連付ける +#### 1. 暗号コールバックサポート付きでwolfSSLをコンパイルする -* [`wolfSSL_CTX_SetRsaSignCb()`](ssl_8h.md#function-wolfssl_ctx_setrsasigncb) +暗号コールバックのサポートは、`–enable-cryptocb`設定オプション、または`#define WOLF_CRYPTO_CB`を使用して有効にできます。 +#### 2. コールバックと一意のdevIDをwolfCryptに登録する -* [`wolfSSL_CTX_SetRsaVerifyCb()`](ssl_8h.md#function-wolfssl_ctx_setrsaverifycb) +暗号コールバックを使用するには、ユーザーはトップレベルの暗号コールバック関数をwolfCryptに登録し、このコールバック関数をwolfCryptに一意に識別するデバイスID(`devId`)を提供する必要があります。 +これにより、複数の暗号コールバックを一度にwolfCryptに登録できます。 +適切なコールバック関数は、`devId`パラメータを取る全てのwolfCrypt関数内部で、または`WOLFSSL_CTX`または`WOLFSSL`構造体に関連付けられた場合に、wolfSSLによって呼び出されます。 +暗号コールバック関数をwolfCryptに登録するには、`wc_CryptoCb_RegisterDevice` APIを使用します。 +これは(`devId`)、コールバック関数、および呼び出し時にコールバックに渡される任意のユーザーコンテキストを取ります。 -* [`wolfSSL_CTX_SetRsaEncCb()`](ssl_8h.md#function-wolfssl_ctx_setrsaenccb) +```c +typedef int (*CryptoDevCallbackFunc)(int devId, wc_CryptoInfo* info, void* ctx); +WOLFSSL_API int wc_CryptoCb_RegisterDevice(int devId, + CryptoDevCallbackFunc cb, + void* ctx); +``` -* [`wolfSSL_CTX_SetRsaDecCb()`](ssl_8h.md#function-wolfssl_ctx_setrsadeccb) +**注:** 登録された`devId`は、特別な`INVALID_DEVID`列挙値のために予約されている`-2`以外の任意の値にできます。 +`devId == INVALID_DEVID`をwolfCrypt APIの引数として渡すと、コールバックが呼び出されず、代わりにデフォルトの内部実装を使用することを示します。 +#### 3. `devId`をwolfCrypt API関数の引数として渡す +wolfCrypt APIの場合、`devId`を受け入れる初期化関数を使用します。 -ユーザーは、次のように`WOLFSSL`オブジェクト(セッション)ごとにコンテキストを設定できます。 +``` +wc_InitRsaKey_ex +wc_ecc_init_ex +wc_AesInit +wc_InitSha256_ex +wc_InitSha_ex +wc_HmacInit +wc_InitCmac_ex +``` +これにより、wolfCryptはデフォルト実装の代わりに暗号コールバックを呼び出します。 +これは使用可能なAPIのすべてを示しているわけではありません。 +特定のアルゴリズムが暗号コールバックをサポートしているかどうかについては、wolfCrypt APIドキュメントをご参照ください。 +#### 4. (TLSのみ)devIdをwolfSSLコンテキストに関連付ける -* [`wolfSSL_SetEccSignCtx()`](ssl_8h.md#function-wolfssl_seteccsignctx) +TLSを使用する際に暗号コールバックの使用を有効にするには、`WOLFSSL_CTX`または`WOLFSSL`構造体の初期化時に`devId`引数を渡す必要があります。 +```c +wolfSSL_CTX_SetDevId(ctx, devId); +wolfSSL_SetDevId(ssl, devId); +``` -* [`wolfSSL_SetEccVerifyCtx()`](ssl_8h.md#function-wolfssl_seteccverifyctx) +これらの構造体に関連付けられたTLS接続に関連する暗号処理は、暗号コールバックを呼び出します。 +### 暗号コールバックの作成 -* `wolfSSL_SetEccSharedSecretCtx()` +暗号コールバックが呼び出されると、どの暗号操作が要求されているか、および入力データと出力データの場所と成功/失敗をwolfCryptに伝える方法を知る必要があります。 +この情報は、`wc_CryptoInfo* info`引数を通じてコールバックに中継されます。 +高レベルでは、暗号コールバックは要求された操作をサポートしているかどうかを判断し、入力データに対して処理を実行し、関連する出力データで`wc_CryptoInfo *info`引数を更新し、有効なwolfCryptエラーコードを返す必要があります。 -* [`wolfSSL_SetRsaSignCtx()`](ssl_8h.md#function-wolfssl_setrsasignctx) +#### リクエストのタイプの判断 +`wc_CryptoInfo`構造体には、異なる構造体の共用体(一部は共用体自体)が含まれており、それぞれが特定のタイプの暗号操作に対応しています。 +実行される操作のタイプは`info->algo_type`によって決定され、これは`wolfssl/wolfcrypt/types.h`で定義されている`enum wc_AlgoType`のバリアントである必要があります。 +この`algo_type`に基づいて、`wc_CryptoInfo`内の適切な共用体要素にアクセスして、操作に固有のパラメータを取得または設定できます。 +このトップレベルの共用体を「アルゴタイプ共用体」と呼ぶことができます。 -* [`wolfSSL_SetRsaVerifyCtx()`](ssl_8h.md#function-wolfssl_setrsaverifyctx) +暗号リクエストのタイプを判断し、それに応じて処理するには、通常、`wc_CryptoInfo`構造体の`algo_type`フィールドに対してswitch-case文を使用します。 +switchの各caseは、対称暗号、ハッシュ化、公開鍵操作などの異なる暗号操作に対応します。 +`wc_AlgoType`と対応するアルゴタイプ共用体の間には一対一のマッピングがあり、それらは`wolfssl/wolfcrypt/cryptocb.h`の`wc_CryptoInfo`構造体定義にコメントされています。 +暗号コールバックは成功時にゼロを返すか、失敗時に有効なwolfCryptエラーコードを返す必要があります。 +サポートされていないアルゴリズムの場合、コールバックは`CRYPTOCB_UNAVAILABLE`を返す必要があり、これによりwolfCryptは内部実装にフォールバックします。 -* [`wolfSSL_SetRsaEncCtx()`](ssl_8h.md#function-wolfssl_setrsaencctx) +これを説明するための、簡略化した実装例を以下に示します。 +```c +int myCryptoCallback(int devId, wc_CryptoInfo* info, void* ctx) +{ + int ret = CRYPTOCB_UNAVAILABLE; + + switch (info->algo_type) { + case WC_ALGO_TYPE_HASH: + /* Handle hashing, using algo type union: info->hash */ + ret = 0; /* or wolfCrypt error code */ + break; + + case WC_ALGO_TYPE_PK: + /* Handle public key operations, using algo type union: info->pk */ + ret = 0; /* or wolfCrypt error code */ + break; + + case WC_ALGO_TYPE_CIPHER: + /* Handle cipher operations, using algo type union: info->cipher */ + ret = 0; /* or wolfCrypt error code */ + break; + + /* and so on for other algo types... */ + } + + return ret; // Return success or an appropriate error code +} +``` -* [`wolfSSL_SetRsaDecCtx()`](ssl_8h.md#function-wolfssl_setrsadecctx) +いくつかの単純なアルゴタイプ共用体(RNGやシード共用体など)はさらなる処理を必要とせず、すぐに実行できます。 +ただし、暗号や公開鍵タイプなどのより複雑な操作には、同じ方法で条件付きで解釈されなければならない複数の共用体バリアントが自分自身に存在します。 +各共用体の変種と階層レベルは、アルゴリズムタイプの各カテゴリに固有であり、その完全な定義は`wc_CryptoInfo`構造体の定義で見つけることができます。 +一般的なルールとして、共用体である各レベルには、共用体の残りの部分をどのように参照解除すべきかを知らせる何らかのタイプ指示子が含まれています。 + +以下は、複数のレベルの共用体デコーディングを持つ複雑なアルゴタイプ共用体の、簡略化した実装例です。 +コールバックには乱数生成のサポートと、ECC鍵合意、署名、検証のサポートが含まれています。 + +```c +int myCryptoCallback(int devId, wc_CryptoInfo* info, void* ctx) +{ + int ret = CRYPTOCB_UNAVAILABLE; + + switch (info->algo_type) { + case WC_ALGO_TYPE_PK: + /* Handle public key operations, using algo type union: info->pk */ + switch (info->pk.type) { /* pk type is of type wc_PkType */ + case WC_PK_TYPE_ECDH: + /* use info->pk.ecdh */ + ret = 0; /* or wolfCrypt error code */ + break; + + case WC_PK_TYPE_ECDSA_SIGN: + /* use info->pk.eccsign */ + ret = 0; /* or wolfCrypt error code */ + break; + + case WC_PK_TYPE_ECDSA_VERIFY: + /* use info->pk.eccverify */ + ret = 0; /* or wolfCrypt error code */ + break; + } + break; + + case WC_ALGO_TYPE_RNG: + /* use info->rng */ + ret = 0; /* or wolfCrypt error code */ + break; + } + + return ret; +} +``` + +### リクエストの処理 +各タイプのリクエストのデータ構造には、一般に入力データと出力データのポインタと関連するサイズが含まれます。 +リクエストによっては、暗号鍵、ノンス、またはさらなる設定を含む追加データが含まれる場合があります。 +暗号コールバックは入力データに対して操作し、関連する出力データをアルゴタイプ共用体の適切なバリアントに書き戻す必要があります。 +問題のアルゴリズムタイプに対応しない共用体バリアント(例えば、`info->algo_type == WC_ALGO_TYPE_RNG`の場合に`info->cipher`を使用する)にデータを書き込むことはメモリエラーであり、未定義の動作を引き起こす可能性があります。 +### トラブルシューティング -これらのコンテキストは、ユーザー指定のコンテキストへのポインターである場合があります。これにより、`void* ctx`パラメーターを介してそれぞれの公開キーコールバックに渡されます。 +一部の古いコンパイラは、wolfCryptがスペースを節約するために「匿名インライン集約体」を使用して入れ子になった`wcCryptoInfo`匿名共用体を定義する際に使用する「匿名インライン集約体」を許可していません。 +匿名インライン集約体の使用を無効にするには、プリプロセッサマクロ`HAVE_ANONYMOUS_INLINE_AGGREGATES`を`0`として定義します。 +これにより暗号コールバックを使用できるようになりますが、`wcCryptoInfo`構造体のサイズが大幅に増加します。 +### 実装例 -コールバックの例は、`wolfssl/test.h`、`myEccSign()`、`myEccVerify()`、`myEccSharedSecret()`、`myRsaSign()`、`myRsaVerify()`、`myRsaEnc()`、および`myRsaDec()`に基づいて見つけることができます。 +暗号コールバックの完全な実装例は以下のページで見つけることができます。 -Atomic Record Layer Callbacksを使用するには、wolfSSLを[`--enable-pkcallbacks`](chapter02.md#--enable-pkcallbacks) Configureオプションを使用してコンパイルする必要があります。 +* [VaultIC Crypto Callbacks](https://github.com/wolfSSL/wolfssl-examples/blob/master/ccb_vaultic/ccb_vaultic.c) +* [STSAFE-A100 ECC Crypto Callbacks](https://github.com/wolfSSL/wolfssl/blob/master/wolfcrypt/src/port/st/stsafe.c) +* [TPM 2.0 wolfTPM Crypto Callbacks](https://github.com/wolfSSL/wolfTPM/blob/master/src/tpm2_cryptocb.c) +* [Generic wolfCrypt tests](https://github.com/wolfSSL/wolfssl/blob/master/wolfcrypt/test/test.c) diff --git a/wolfSSL/src-ja/chapter07.md b/wolfSSL/src-ja/chapter07.md index ae2ab0ce..1b5d6756 100644 --- a/wolfSSL/src-ja/chapter07.md +++ b/wolfSSL/src-ja/chapter07.md @@ -1,104 +1,94 @@ +# 鍵と証明書 +X.509証明書の紹介、およびSSLとTLSでの使用方法については付録Aをご参照ください。 -# キーと証明書 +## サポートしているフォーマットとサイズ +wolfSSLは証明書と鍵において**PEM**および**DER**フォーマットをサポートしています。 +また、PKCS#8秘密鍵(PKCS#5またはPKCS#12暗号化付き)もサポートしています。 +**PEM**、つまり「Privacy Enhanced Mail」は、認証局によって証明書が発行される最も一般的なフォーマットです。 +PEMファイルはBase64エンコードされたASCIIファイルで、複数のサーバー証明書、中間証明書、秘密鍵を含むことができ、通常は`.pem`、`.crt`、`.cer`、または`.key`のファイル拡張子を持ちます。 +PEMファイル内の証明書は「`-----BEGIN CERTIFICATE-----`」と「`-----END CERTIFICATE-----`」のステートメントで囲まれています。 -X.509証明書の紹介と、SSLおよびTLSでの使用方法については、付録Aを参照してください。 +**DER**、つまり「Distinguished Encoding Rules」は、証明書のバイナリフォーマットです。 +DERファイル拡張子には`.der`と`.cer`があり、テキストエディタでは表示できません。 +X.509証明書はASN.1フォーマットを使用してエンコードされます。 +DERフォーマットはASN.1エンコーディングです。 +PEMフォーマットはBase64エンコードされ、人間が読めるヘッダーとフッターで囲まれています。 +TLSは証明書をDERフォーマットで送信します。 +## サポートしている証明書拡張 -## サポートされている形式とサイズ +サポートしていない、または未知の拡張機能がクリティカルとしてマークされている場合、エラーメッセージを出力します。 +それ以外の場合では、これらの拡張機能は無視されます。 +証明書拡張機能の解析では、少なくとも`--enable-certext`(マクロ`WOLFSSL_CERT_EXT`)がwolfSSLライブラリのコンパイル時に使用されていることが期待されます。 +以下は、一部またはすべての拡張機能が使用でき、解析に対応している証明書拡張機能の一覧です。 - - -wolfSSL(以前のCyassl)は、** pem **、および ** der ** 証明書とキーのフォーマット、およびPKCS#8プライベートキー(PKCS#5またはPKCS#12暗号化)をサポートしています。 - - -** PEM **、または「プライバシー強化されたメール」は、証明書が証明書当局によって発行される最も一般的な形式です。PEMファイルは、複数のサーバー証明書、中間証明書、およびプライベートキーを含むことができるBase64エンコードASCIIファイルであり、通常`.pem`、`.crt`、`.cer`、または`.key`ファイル拡張子を備えています。PEMファイル内の証明書は、「`-----BEGIN CERTIFICATE-----`」および「`-----END CERTIFICATE-----`」ステートメントに包まれています。 - - -** der **、または「区別されたエンコードルール」は、証明書のバイナリ形式です。derファイル拡張子には`.der`および`.cer`を含めることができ、テキストエディターでは表示できません。 - - -X.509証明書は、ASN.1形式を使用してエンコードされます。der形式はASN.1エンコーディングです。PEM形式は、Base64エンコードされており、人間の読み取り可能なヘッダーとフッターでラップされています。TLSはDER形式で証明書を送信します。 - -## サポートされている証明書の拡張子 - - -クリティカルとしてマークされたサポートされていない、または不明な拡張機能が見つかった場合、 -エラー メッセージが返されます。それ以外の場合は、サポートされていないか不明な拡張子が見つかりました -は無視されます。 証明書拡張子の解析では、少なくとも -`--enable-certext` (マクロ WOLFSSL_CERT_EXT) が使用された場合 -wolfSSL ライブラリのコンパイル。 これは証明書のハイレベルなリストです -**解析**可能な拡張子と、すべてではないにしても少なくとも一部の拡張子 - 使用されます。 - -| [RFC 5280からの拡張](https://datatracker.ietf.org/doc/html/rfc5280#section-4.2) | サポート | +| [RFC 5280](https://tex2e.github.io/rfc-translater/html/rfc5280.html#4-2--Certificate-Extensions)からの拡張機能 | サポート | | --- | --- | -| 権限キー識別子 | はい | -| サブジェクト キー識別子 | はい | -| キーの使用法 | はい | -| 証明書ポリシー | はい | -| ポリシー マッピング | いいえ | -| サブジェクトの別名 | はい | -| 発行者の別名 | いいえ | -| サブジェクト ディレクトリの属性 | いいえ | -| 基本的な制約 | はい | -| 名前の制約 | はい | -| ポリシーの制約 | はい | -| 拡張キー使用法 | はい | -| CRL 配布ポイント | はい | -| anyPolicy を禁止する | はい | -| 最新の CRL | いいえ | - -| 追加拡張 | サポート | +| Authority Key Identifier | はい | +| Subject Key Identifier | はい | +| Key Usage | はい | +| Certificate Policies | はい | +| Policy Mappings | いいえ | +| Subject Alternative Name | はい | +| Issuer Alternative Name | いいえ | +| Subject Directory Attributes | いいえ | +| Basic Constraints | はい | +| Name Constraints | はい | +| Policy Constraints | はい | +| Extended Key Usage | はい | +| CRL Distribution Points | はい | +| Inihibit anyPolicy | はい | +| Freshest CRL | いいえ | + +| 追加の拡張機能 | サポート | | --- | --- | -| ネットスケープ | はい | -| カスタム OID | はい | +| Netscape | はい | +| Custom OID | はい | -次の 2 つのセクションでは、個々の証明書拡張機能のサポートについて詳しく説明します。 +次のいくつかのセクションでは、個々の証明書拡張機能のサポート状況について詳しくご説明します。 -#### 認証/サブジェクト キー ID +#### Authority / Subject Key Identifier -デフォルトでは、キー ID はキーの SHA1 ハッシュです。 キーのSHA256ハッシュは -もサポートされています。 +デフォルトでは、鍵IDは鍵のSHA1ハッシュです。 +鍵のSHA256ハッシュもサポートしています。 -#### サブジェクトの別名 +#### Subject Alternative Names - -| 別名タイプ | サポート | -| --- | --- | -| 電子メール | はい | -| DNS 名 | はい | -| IP アドレス | はい | +| Alternative Name Types | サポート | +| ---------------------- | --- | +| メール | はい | +| DNS名 | はい | +| IPアドレス | はい | | URI | はい | -#### キーの使い方 +#### Key Usage -キーの使用法は、証明書の解析が完了した後に解析および取得できます。 +Key Usageは、証明書の解析完了後に取得・解析できます。 -| キーの使用法 | サポート | -| --- | --- | -| デジタル署名 | はい | -| 否認防止 | はい | -| キー暗号化 | はい | -| データ暗号化 | はい | -| キー契約 | はい | +| Key Usage | サポート | +| --------- | --- | +| digitalSignature | はい | +| nonRepudiation | はい | +| keyEncipherment | はい | +| dataEncipherment | はい | +| keyAgreement | はい | | keyCertSign | はい | -| cRLサイン| はい | -| 暗号化のみ | はい | -| 解読のみ | はい | +| cRLSign | はい | +| encipherOnly | はい | +| decipherOnly | はい | -#### 拡張キー使用法 +#### Extended Key Usage -拡張キーの使用法が -unknown/unsupported の場合は無視されます。 3.15.5 より前のバージョンの場合は不明 -拡張キー使用法 OID は解析エラーを引き起こします。 +wolfSSLバージョン3.15.5以降では、不明/サポートしていないExtended Key Usageは無視されます。 +3.15.5より前のバージョンでは、不明なExtended Key Usage OIDは解析エラーを出力します。 -| 拡張キー使用法 | サポート | -| ----| ---| -| 任意の拡張キー使用法 | はい | +| Extended Key Usage | サポート | +| ------------------ | --- | +| anyExtendedKeyUsage | はい | | id-kp-serverAuth | はい | | id-kp-clientAuth | はい | | id-kp-codeSigning | はい | @@ -106,26 +96,22 @@ unknown/unsupported の場合は無視されます。 3.15.5 より前のバー | id-kp-timeStamping | はい | | id-kp-OCSPSigning | はい | -#### カスタム OID +#### カスタムOID拡張 -カスタム OID インジェクションと解析は、wolfSSL バージョン 5.3.0 で導入されました。 有効化オプション --enable-certgen および --enable-asn=template は、マクロとともに使用する必要があります。 カスタム拡張機能を操作するための WOLFSSL_CUSTOM_OID および HAVE_OID_ENCODING。 これらの設定で wolfSSL を構築した後、関数 wc_SetCustomExtension を使用して証明書構造体にカスタム拡張を設定できます。 +カスタムOID X.509拡張機能の挿入と解析はwolfSSLバージョン5.3.0で導入されました。 +有効化オプション`--enable-certgen`は、マクロ`WOLFSSL_ASN_TEMPLATE`、`WOLFSSL_CUSTOM_OID`、および`HAVE_OID_ENCODING`と一緒に使用する必要があります。 +`WOLFSSL_ASN_TEMPLATE`は`./configure`を使用する場合はデフォルトで定義されますが、`WOLFSSL_USER_SETTINGS`でビルドする場合は手動で定義する必要があります。 +これらの設定でwolfSSLをビルドした後、`wc_SetCustomExtension()`関数を使用して`Cert`構造体にカスタム拡張機能を設定し、`wc_SetUnknownExtCallback()`を使用して`DecodedCert`構造体内の未知の拡張機能OIDを処理するためのコールバックを登録できます。 ## 証明書の読み込み +証明書は通常ファイルシステムを使用して読み込まれますが、メモリバッファからの読み込みもサポートしています。 +詳しくは、本章下部の「ファイルシステムなしでの証明書の使用」をご参照ください。 +### CA証明書の読み込み -証明書は通常、ファイルシステムを使用してロードされます(ただし、メモリバッファーからの読み込みもサポートされています - [ファイルシステムがなく、証明書の使用](#no-file-system-and-using-certificates)を参照)。 - - - -### CA証明書をロードする - - - -CA証明書ファイルは、[`wolfSSL_CTX_load_verify_locations()`](group__CertsKeys.md#function-wolfssl_ctx_load_verify_locations)関数を使用してロードできます。 - - +CA証明書ファイルは[`wolfSSL_CTX_load_verify_locations()`](group__CertsKeys.md#function-wolfssl_ctx_load_verify_locations)関数を使用して読み込むことができます。 ```c int wolfSSL_CTX_load_verify_locations(WOLFSSL_CTX *ctx, @@ -134,21 +120,18 @@ int wolfSSL_CTX_load_verify_locations(WOLFSSL_CTX *ctx, ``` +複数のCA証明書情報を`CAfile`(PEMフォーマット)にまとめて記載しておくことで、それらを一括して解析することもできます。 +これは特に、クライアントが起動時に複数のルートCAを読み込む必要がある場合に便利です。 +このように処理することで、CAとして単一のファイルを使用することを想定しているツールに移植しやすくしています。 -CA Loadingは、PEM形式で`CAfile`をできるだけ多くのCERTで渡して、上記の機能を使用してファイルごとの複数のCA証明書を解析することもできます。これにより、初期化が簡単になり、クライアントが起動時に複数のルートCA証明書をロードする必要がある場合に役立ちます。これにより、wolfSSLはCA証明書用の単一のファイルを使用できるようにするツールに移植するのを簡単にします。 - - -**注**:ルーツのチェーンと中間証明書をロードする必要がある場合は、信頼の順にロードする必要があります。最初にルートCAをロードした後、中間体1に続いて中間体2などが続きます。CERTがロードされるごとに[`wolfSSL_CTX_load_verify_locations()`](group__CertsKeys.md#function-wolfssl_ctx_load_verify_locations)を呼び出すか、CERTを順番に含むファイルを1回(フファイルの先頭にあるルートと信頼チェーンによって順序付けられた証明書)を使用できます。 - - - -### クライアントまたはサーバーの証明書を読み込みます - - - -単一のクライアントまたはサーバー証明書の読み込みは、[`wolfSSL_CTX_use_certificate_file()`](group__CertsKeys.md#function-wolfssl_ctx_use_certificate_file)関数で実行できます。この関数が証明書チェーンで使用される場合、実際の、つまり「最下位」の証明書のみが送信されます。 +**注意**:ルート証明書と中間証明書のチェーンを読み込む必要がある場合、信頼の順にそれらを読み込む必要があります。 +まずルートCAを読み込み、次に中間1、次に中間2などを読み込みます。 +読み込む各証明書に対して[`wolfSSL_CTX_load_verify_locations()`](group__CertsKeys.md#function-wolfssl_ctx_load_verify_locations)を呼び出すか、順序付けられた証明書(ファイルの先頭にルートがあり、信頼のチェーンによって順序付けられた証明書)を含むファイルで一度だけこの関数を実行します。 +### クライアントまたはサーバー証明書の読み込み +単一のクライアントまたはサーバー証明書の読み込みは[`wolfSSL_CTX_use_certificate_file()`](group__CertsKeys.md#function-wolfssl_ctx_use_certificate_file)関数で行うことができます。 +この関数を証明書チェーンで使用する場合、実際の「最下位」の証明書のみが送信されます。 ```c int wolfSSL_CTX_use_certificate_file(WOLFSSL_CTX *ctx, @@ -156,184 +139,116 @@ int wolfSSL_CTX_use_certificate_file(WOLFSSL_CTX *ctx, int type); ``` +`CAfile`はCA証明書ファイルであり、`type`は証明書のフォーマット(`SSL_FILETYPE_PEM`など)です。 +サーバーとクライアントは[`wolfSSL_CTX_use_certificate_chain_file()`](group__CertsKeys.md#function-wolfssl_ctx_use_certificate_chain_file)関数を使用して証明書チェーンを送信できます。 +証明書チェーンファイルはPEMフォーマットである必要があり、サブジェクトの証明書(実際のクライアントまたはサーバー証明書)から始まり、中間証明書が続き、オプションで最上位のルートCA証明書で終わるように並べる必要があります。 +サーバーのサンプルプログラム(`/examples/server/server.c`)では、この機能を使用しています。 -`CAfile`はCA証明書ファイルであり、`type`は`SSL_FILETYPE_PEM`などの証明書の形式です。 - - -サーバーとクライアントは、[`wolfSSL_CTX_use_certificate_chain_file()`](group__CertsKeys.md#function-wolfssl_ctx_use_certificate_chain_file)関数を使用して証明書チェーンを送信できます。証明書チェーンファイルはPEM形式である必要があり、被験者の証明書(実際のクライアントまたはサーバー証明書)から始まり、その後、中間証明書が続き、(オプションでは)最上位のルートCA証明書で終了する必要があります。サンプルサーバー(`/examples/server/server.c`)は、この機能を使用します。 - - -**注意**:これは、検証のために証明書チェーンをロードするときに必要な順序とはまったく逆です! このシナリオでのファイルの内容は、ファイルの先頭にエンティティ証明書があり、その後にチェーンの次の証明書が続き、ファイルの末尾にルート CA が続きます。 - - +**注意**:これは、検証のために証明書チェーンを読み込む場合とは正反対です。このシナリオでのファイル内容は、ファイルの先頭にエンティティ証明書があり、その次にチェーンの次の証明書が続き、ファイルの最後にルートCAがある形になります。 ```c int wolfSSL_CTX_use_certificate_chain_file(WOLFSSL_CTX *ctx, const char *file); ``` +### 秘密鍵の読み込み - - -### 秘密鍵を読み込む - - - -サーバープライベートキーは、[`wolfSSL_CTX_use_PrivateKey_file()`](group__CertsKeys.md#function-wolfssl_ctx_use_PrivateKey_file)関数を使用してロードできます。 - - +サーバー秘密鍵は[`wolfSSL_CTX_use_PrivateKey_file()`](group__CertsKeys.md#function-wolfssl_ctx_use_PrivateKey_file)関数を使用して読み込むことができます。 ```c int wolfSSL_CTX_use_PrivateKey_file(WOLFSSL_CTX *ctx, const char *keyFile, int type); ``` +`keyFile`は秘密鍵ファイルであり、`type`は秘密鍵のフォーマット(例:`SSL_FILETYPE_PEM`)です。 -| 拡張キー使用法 | サポート | -| ------------------ | --------- | -| 任意の拡張キー使用法 | はい | -| id-kp-serverAuth | はい | -| id-kp-clientAuth | はい | -| id-kp-codeSigning | はい | -| id-kp-emailProtection | はい | -| id-kp-timeStamping | はい | -| id-kp-OCSPSigning | はい | - - -`keyFile`は秘密のキーファイルであり、`type`は秘密鍵の形式です(例:`SSL_FILETYPE_PEM`)。 - - -### 信頼できるピア証明書を読み込み - -| 拡張キー使用法 | サポート | -| ------------------ | --------- | -| 任意の拡張キー使用法 | はい | -| id-kp-serverAuth | はい | -| id-kp-clientAuth | はい | -| id-kp-codeSigning | はい | -| id-kp-emailProtection | はい | -| id-kp-timeStamping | はい | -| id-kp-OCSPSigning | はい | - - -使用する信頼できるピア証明書を読み込むことは、[`wolfSSL_CTX_trust_peer_cert()`](group__Setup.md#function-wolfssl_ctx_trust_peer_cert)で行うことができます。 +### 信頼されるピア証明書の読み込み +信頼されるピア証明書の読み込みは[`wolfSSL_CTX_trust_peer_cert()`](group__Setup.md#function-wolfssl_ctx_trust_peer_cert)で行うことができます。 ```c int wolfSSL_CTX_trust_peer_cert(WOLFSSL_CTX *ctx, const char *trustCert, int type); ``` +`trustCert`は読み込む証明書ファイルであり、`type`は秘密鍵のフォーマット(つまり`SSL_FILETYPE_PEM`)です。 +## 証明書チェーンの検証 -`trustCert`はロードする証明書ファイルであり、`type`は秘密鍵の形式(つまり`SSL_FILETYPE_PEM`)です。 - - - -## 証明書チェーン検証 - - - -wolfSSL では、証明書チェーンを検証するために、チェーンのトップまたは「ルート」証明書のみを信頼できる証明書としてロードする必要があります。これは、証明書チェーン (A -> B -> C) がある場合、C は B によって署名され、B は A によって署名される場合、wolfSSL は、チェーン全体 (A->B->C) を検証するために、証明書 A を信頼できる証明書としてロードすることのみを必要とします。 - - -たとえば、サーバー証明書チェーンが次のように見える場合 - -![Certificate Chain](certchain.png) +wolfSSLでは、証明書チェーン全体を検証するために、チェーン内のトップまたは「ルート」証明書のみを信頼された証明書として読み込む必要があります。 +つまり、証明書チェーン(A -> B -> C)があり、CがBによって署名され、BがAによって署名されている場合、wolfSSLはチェーン全体(A->B->C)を検証するために証明書Aのみを信頼された証明書として読み込む必要があります。 +例えば、サーバー証明書チェーンが次のようになっているとき、 +![証明書チェーン](certchain.png) -wolfSSLクライアントには、少なくともルート証明書(a)が信頼できるルート([`wolfSSL_CTX_load_verify_locations()`](group__CertsKeys.md#function-wolfssl_ctx_load_verify_locations))としてロードされている必要があります。クライアントがサーバーCERTチェーンを受信すると、Aの署名を使用してBを検証し、Bが以前に信頼できるルートとしてwolfSSLにロードされていなかった場合、BはwolfSSLの内部CERTチェーンに保存されます(wolfSSLは必要なものを保存します証明書の確認:一般名ハッシュ、公開キー、キータイプなど)。Bが有効な場合、Cを確認するために使用されます。 +wolfSSLクライアントは、少なくともルート証明書(A)を信頼されたルートとして([`wolfSSL_CTX_load_verify_locations()`](group__CertsKeys.md#function-wolfssl_ctx_load_verify_locations)で)あらかじめ読み込んでおく必要があります。 +クライアントがサーバー証明書チェーンを受信すると、Aの署名を使用してBを検証し、Bが以前にwolfSSLに信頼されたルートとして読み込まれていない場合、BはwolfSSLの内部証明書チェーンに保存されます(wolfSSLは証明書を検証するために必要なもの、つまり共通名ハッシュ、公開鍵、鍵タイプなどのみを保存します)。 +Bが有効であれば、それを使用してCを検証します。 +このモデルに従えば、ルート証明書「A」がwolfSSLサーバーに信頼されたルートとして読み込まれている限り、サーバーが(A->B->C)または(B->C)を送信した場合でも、サーバー証明書チェーンは検証できます。 +サーバーが中間証明書ではなく(C)のみを送信する場合、wolfSSLクライアントがすでにBを信頼されたルートとして読み込んでいない限り、チェーンは検証できません。 -このモデルに従って、ルート証明書「A」がwolfSSLサーバーに信頼できるルートとしてロードされている限り、サーバーが送信する場合、サーバー証明書チェーンを確認することができます(A -> B -> C)、または(b -> c)。サーバーが中間証明書ではなく(c)を送信するだけの場合、wolfSSLクライアントが既にBを信頼できるルートとしてロードしていない限り、チェーンを検証することはできません。 +## サーバー証明書のドメイン名チェック +wolfSSLには、サーバー証明書のドメインを自動的にチェックするクライアント拡張機能があります。 +OpenSSLモードでは、これを実行するために約十個の関数呼び出しが必要です。 +wolfSSLは証明書の日付が範囲内であることをチェックし、署名を検証し、さらに[`wolfSSL_connect()`](group__IO.md#function-wolfssl_connect)を呼び出す前に[`wolfSSL_check_domain_name(WOLFSSL* ssl, const char* dn)`](group__Setup.md#function-wolfssl_check_domain_name)を呼び出した場合にドメインを検証します。 +wolfSSLはピアのサーバー証明書のX.509発行者名を`dn`(期待されるドメイン名)と照合します。 +名前が一致すれば[`wolfSSL_connect()`](group__IO.md#function-wolfssl_connect)は正常に進行しますが、名前が一致しない場合、[`wolfSSL_connect()`](group__IO.md#function-wolfssl_connect)は致命的なエラーを返し、[`wolfSSL_get_error()`](group__Debug.md#function-wolfssl_get_error)は`DOMAIN_NAME_MISMATCH`を返します。 +証明書のドメイン名をチェックすることは、サーバーが実際に名乗っているものと一致していることを検証する重要なステップです。 +この拡張機能は、チェックを実行する負担を軽減するためのものです。 -## ドメイン名サーバー証明書のチェック - - - -wolfSSLには、サーバー証明書のドメインを自動的にチェックするクライアントに拡張機能があります。OpenSSLモードでは、これを実行するにはほぼ1ダースの関数呼び出しが必要です。wolfSSLは、証明書の日付が範囲にあることをチェックし、署名を検証し、[`wolfSSL_connect()`](group__IO.md#function-wolfssl_connect)を呼び出す前に[`wolfSSL_check_domain_name(WOLFSSL* ssl, const char* dn)`](group__Setup.md#function-wolfssl_check_domain_name)を呼び出す場合、ドメインをさらに検証します。名前が一致する場合[`wolfSSL_connect()`](group__IO.md#function-wolfssl_connect)は正常に処理されますが、名前の不一致がある場合、[`wolfSSL_connect()`](group__IO.md#function-wolfssl_connect)は致命的なエラーを返し、[`wolfSSL_get_error()`](group__Debug.md#function-wolfssl_get_error)は`DOMAIN_NAME_MISMATCH`を返します。 - - -証明書のドメイン名を確認することは、サーバーが実際にあると主張しているのかを確認する重要な手順です。この拡張は、チェックを実行する負担を軽減することを目的としています。 - - - -## ファイルシステムがなく、証明書の使用 - - - -通常、ファイルシステムは、プライベートキー、証明書、およびCAのロードに使用されます。wolfSSLは完全なファイルシステムのない環境で使用されることがあるため、代わりにメモリバッファーを使用するための拡張機能が提供されます。拡張機能を使用するには、定数`NO_FILESYSTEM`を定義し、次の機能が利用可能になります。 - +## ファイルシステムなしでの証明書の使用 +通常、秘密鍵、証明書、CAを読み込むためにファイルシステムを使用します。 +wolfSSLは完全なファイルシステムのない環境で使用されることがあるため、代わりにメモリバッファを使用するため拡張機能も提供しています。 +マクロ`NO_FILESYSTEM`を定義することで、以下の関数を使用できるようになります。 * [`int wolfSSL_CTX_load_verify_buffer(WOLFSSL_CTX* ctx, const unsigned char* in,long sz, int format);`](group__CertsKeys.md#function-wolfssl_ctx_load_verify_buffer) - - * [`int wolfSSL_CTX_use_certificate_buffer(WOLFSSL_CTX* ctx, const unsigned char* in, long sz, int format);`](group__CertsKeys.md#function-wolfssl_ctx_use_certificate_buffer) - - * [`int wolfSSL_CTX_use_PrivateKey_buffer(WOLFSSL_CTX* ctx, const unsigned char* in, long sz, int format);`](group__CertsKeys.md#function-wolfssl_ctx_use_PrivateKey_buffer) - - * [`int wolfSSL_CTX_use_certificate_chain_buffer(WOLFSSL_CTX* ctx, const unsigned char* in,long sz);`](group__CertsKeys.md#function-wolfssl_ctx_use_certificate_chain_buffer) - - * [`int wolfSSL_CTX_trust_peer_buffer(WOLFSSL_CTX* ctx, const unsigned char* in, Long sz, int format);`](group__Setup.md#function-wolfssl_ctx_trust_peer_buffer) +これらの関数は、`*_file` の代わりに `*_buffer`という名前の対応する関数と全く同じように使用します。 +そしてファイル名を提供する代わりにメモリバッファを提供します。 +使用法の詳細についてはAPIドキュメントをご参照ください。 +### テスト証明書と鍵バッファ -これらの関数を`*_buffer`ではなく`*_file`という名前のカウンターパートとまったく同じように使用します。そして、ファイル名を指定する代わりにメモリバッファを提供します。使用上の詳細についてはAPIの資料を参照してください。 - - - -### テスト証明書とキーバッファー - - - -wolfSSLは、過去にテスト証明書とキーファイルのみがバンドルされていました。現在は、また、ファイルシステムが利用できない環境で使用するためのテスト証明書とキーバッファがバンドルされています。これらのバッファーは、`USE_CERT_BUFFERS_1024`、`USE_CERT_BUFFERS_2048`、または`USE_CERT_BUFFERS_256`の1つ以上を定義する場合、`certs_test.h`で利用できます。 - - - -## シリアル番号検索 - - - -X.509証明書のシリアル番号は、[`wolfSSL_X509_get_serial_number()`](group__openSSL.md#function-wolfssl_x509_get_serial_number)を使用してwolfSSLから抽出できます。 +wolfSSLは過去にテスト証明書と鍵をファイル形式でのみ同梱してきました。 +現在は、ファイルシステムが利用できない環境で使用するためのテスト証明書と鍵バッファも同梱しています。 +これらのバッファは`USE_CERT_BUFFERS_1024`、`USE_CERT_BUFFERS_2048`、または`USE_CERT_BUFFERS_256`のいずれかを定義すると`certs_test.h`で利用できます。 +## シリアル番号の取得 +X.509証明書のシリアル番号は[`wolfSSL_X509_get_serial_number()`](group__openSSL.md#function-wolfssl_x509_get_serial_number)を使用してwolfSSLから抽出できます。 +シリアル番号は任意の長さになる可能性があります。 ```c int wolfSSL_X509_get_serial_number(WOLFSSL_X509* x509, unsigned char* buffer, int* inOutSz) ``` +`buffer`には入力時に最大`*inOutSz`バイトが書き込まれます。 +成功した場合、0が返され、呼び出し後に`*inOutSz`には`buffer`に実際に書き込まれたバイト数が保持されます。 +完全なサンプルプログラムは`wolfssl/test.h`で提供しています。 +## RSA鍵生成 -`buffer`は、入力で最大`*inOutSz`バイトで書き込まれます。コールの後、成功した場合(0の戻り)、`*inOutSz`は`buffer`に書き込まれた実際のバイト数を保持します。完全な例は`wolfssl/test.h`が含まれています。 - - - -## RSAキー生成 - - - -wolfSSLは、最大4096ビットのさまざまな長さのRSAキー生成をサポートしています。キー生成はデフォルトでオフになっていますが、`--enable-keygen`の`./configure`プロセス中に、またはWindowsまたは非標準の環境で`WOLFSSL_KEY_GEN`を定義することにより、オンにすることができます。キーを作成するのは簡単で、`rsa.h`から1つの関数のみが必要です。 - - +wolfSSLは、最大4096ビットのさまざまな長さのRSA鍵生成をサポートしています。 +鍵生成はデフォルトではオフですが、`./configure`プロセスに`--enable-keygen`引数を加えることで(Windowsや非標準環境では、`WOLFSSL_KEY_GEN`を定義することで)有効化できます。 +鍵の作成は簡単で、`rsa.h`から1つの関数のみを使用します。 ```c int MakeRsaKey(RsaKey* key, int size, long e, RNG* rng); ``` - - -`size`はBITSの長さで、`e`が公開指数です。 - - +ここで`size`はビット単位の長さ、`e`は公開指数で、通常`e`には65537を使用するのが良いでしょう。 +`wolfcrypt/test/test.c`にて、1024ビットのRSA鍵を作成する実装例を提供しています。 ```c RsaKey genKey; @@ -343,143 +258,73 @@ int ret; InitRng(&rng); InitRsaKey(&genKey, 0); -ret=MakeRsaKey(&genKey, 1024, 65537, &rng); +ret = MakeRsaKey(&genKey, 1024, 65537, &rng); if (ret != 0) /* ret contains error */; ``` - - -RSAKEY `genKey`は、他のRSAKEYのように使用できるようになりました。キーをエクスポートする必要がある場合は、wolfsslはasn.hでDERとPEMフォーマットの両方を提供します。常にキーを最初にDERフォーマットに変換してから、PEMが必要な場合は汎用`DerToPem()`関数を使用する必要があります。 - - +RsaKey `genKey`は、他のRsaKeyと同じように使用できます。 +鍵をエクスポートする必要がある場合、wolfSSLは`asn.h`でDERとPEMの両方のフォーマットを提供しています。 +いずれの場合も、まずは鍵をDERフォーマットに変換し、PEMが必要であれば汎用の`DerToPem()`関数を次のように使用します。 ```c byte der[4096]; -int derSz=RsaKeyToDer(&genKey, der, sizeof(der)); +int derSz = RsaKeyToDer(&genKey, der, sizeof(der)); if (derSz < 0) /* derSz contains error */; ``` - - -バッファ`der`は、キーのDERフォーマットを保持する。DERバッファをPEMに変換するには、変換関数を使用します。 - - +バッファ`der`には現在、鍵のDERフォーマットが含まれています。 +DERバッファをPEMに変換するには、変換関数を使用します。 ```c byte pem[4096]; -int pemSz=DerToPem(der, derSz, pem, sizeof(pem), +int pemSz = DerToPem(der, derSz, pem, sizeof(pem), PRIVATEKEY_TYPE); if (pemSz < 0) /* pemSz contains error */; ``` - - -_dertopem()_の最後の引数は、通常`PRIVATEKEY_TYPE`または`CERT_TYPE`のタイプパラメーターを取得します。これで、バッファ`pem`がキーのPEM形式を保持します。サポートされているタイプは次のとおりです。 - - +`DerToPem()`の最後の引数はタイプパラメータを取り、通常は`PRIVATEKEY_TYPE`または`CERT_TYPE`のいずれかです。 +現在バッファ`pem`には鍵のPEMフォーマットが含まれています。 +サポートしているタイプは、次の通りです。 * `CA_TYPE` - - - * `TRUSTED_PEER_TYPE` - - - * `CERT_TYPE` - - - * `CRL_TYPE` - - - * `DH_PARAM_TYPE` - - - * `DSA_PARAM_TYPE` - - - * `CERTREQ_TYPE` - - - * `DSA_TYPE` - - - * `DSA_PRIVATEKEY_TYPE` - - - * `ECC_TYPE` - - - * `ECC_PRIVATEKEY_TYPE` - - - * `RSA_TYPE` - - - * `PRIVATEKEY_TYPE` - - - * `ED25519_TYPE` - - - * `EDDSA_PRIVATEKEY_TYPE` - - - * `PUBLICKEY_TYPE` - - - * `ECC_PUBLICKEY_TYPE` - - - * `PKCS8_PRIVATEKEY_TYPE` - - - * `PKCS8_ENC_PRIVATEKEY_TYPE` +### RSA鍵生成に関する注意 +RSA秘密鍵には公開鍵も含まれています。 +`test.c`で使用されているように、秘密鍵はwolfSSLによって秘密鍵と公開鍵の両方として使用できます。 +通常、SSL/TLSに必要なのは秘密鍵と(証明書の形式の)公開鍵のみです。 - - -### RSAキー生成ノート - - - -RSA秘密鍵には公開鍵も含まれています。秘密鍵は、test.cで使用されるwolfSSLによってプライベートキーと公開鍵の両方として使用できます。秘密鍵と公開鍵(証明書の形式)は、SSLに通常必要なものすべてです。 - - -必要に応じて、RsaPublicKeyDecode()関数を使用して、別の公開キーを手動でwolfSSLにロードできます。さらに、[`wc_RsaKeyToPublicDer()`](group__RSA.md#function-wc_rsakeytopublicder)関数を使用して、パブリックRSAキーをエクスポートできます。 - - +必要に応じて、`RsaPublicKeyDecode()`関数を使用して別の公開鍵をwolfSSLに手動で読み込むこともできます。 +そして、[`wc_RsaKeyToPublicDer()`](group__RSA.md#function-wc_rsakeytopublicder)関数を使用してRSA公開鍵をエクスポートすることもできます。 ## 証明書生成 +wolfSSLはX.509 v3証明書生成をサポートしています。 +証明書生成はデフォルトではオフですが、`./configure`プロセスに`--enable-certgen`引数を加えることで(Windowsや非標準環境では、`WOLFSSL_CERT_GEN`を定義することで)有効化できます。 - -wolfSSLはX.509 V3証明書生成をサポートしています。証明書の生成はデフォルトでオフになっていますが、`--enable-certgen`の`./configure`プロセス中に、またはWindowsまたは非標準の環境で`WOLFSSL_CERT_GEN`を定義することにより、オンにすることができます。 - - -証明書を生成する前に、ユーザーは証明書の主題に関する情報を提供する必要があります。この情報は、`Cert`という名前の`wolfssl/wolfcrypt/asn_public.h`の構造に含まれています。 - - +証明書を生成する前に、ユーザーは証明書のサブジェクト情報を入力する必要があります。 +この情報は`wolfssl/wolfcrypt/asn_public.h`にある`Cert`という構造体に含まれています。 ```c /* for user to fill for certificate generation */ @@ -496,15 +341,11 @@ typedef struct Cert { } Cert; ``` - - CertNameは次のようになります。 - - ```c typedef struct CertName { - char country[CTC_NAME_SIZE]; +char country[CTC_NAME_SIZE]; char countryEnc; char state[CTC_NAME_SIZE]; char stateEnc; @@ -522,61 +363,33 @@ typedef struct CertName { } CertName; ``` - - サブジェクト情報を入力する前に、次のように初期化関数を呼び出す必要があります。 - - ```c Cert myCert; InitCert(&myCert); ``` +`InitCert()`は、いくつかの変数にデフォルト値を設定します。 +バージョンを**3** (0x02)、シリアル番号を**0**(ランダム生成)、sigTypeを`CTC_SHAwRSA`、daysValidを**500**、selfSignedを**1**(TRUE)に設定します。 -`InitCert()` は、バージョンを **3** (0x02) に、シリアル番号を **0** (ランダムに生成) に、sigType を `CTC_SHAwRSA` に、daysValid を **500** に、selfSigned を **1** (TRUE) に設定するなど、いくつかの変数のデフォルトを設定します。 - -サポートされている署名タイプは次のとおりです。 - - +サポートしている署名タイプは次の通りです。 * `CTC_SHAwDSA` - - * `CTC_MD2wRSA` - - * `CTC_MD5wRSA` - - * `CTC_SHAwRSA` - - * `CTC_SHAwECDSA` - - * `CTC_SHA256wRSA` - - * `CTC_SHA256wECDSA` - - * `CTC_SHA384wRSA` - - * `CTC_SHA384wECDSA` - - * `CTC_SHA512wRSA` - - * `CTC_SHA512wECDSA` - - -これで、ユーザーは`wolfcrypt/test/test.c`からこの例のようなサブジェクト情報を初期化できます。 - - +次に、以下のようにしてサブジェクト情報を初期化します。 +ただし実際には、ユーザの環境に応じた値を入力します。 +詳細は`wolfcrypt/test/test.c`にも掲載しています。 ```c strncpy(myCert.subject.country, "US", CTC_NAME_SIZE); @@ -588,221 +401,122 @@ strncpy(myCert.subject.commonName, "www.wolfssl.com", CTC_NAME_SIZE); strncpy(myCert.subject.email, "info@wolfssl.com", CTC_NAME_SIZE); ``` - - -次に、上記のキー生成例からの変数GenKeyとRNGを使用して自己署名証明書を生成できます(もちろん、有効なRSAKEYまたはRNGを使用できます): - - +そして、上記の鍵生成例からの変数`genKey`と`rng`を使用して、自己署名証明書を生成できます。 +もちろん、有効なものであればwolfSSLによって生成したものでなくとも構いません。 ```c byte derCert[4096]; -int certSz=MakeSelfCert(&myCert, derCert, sizeof(derCert), &key, &rng); +int certSz = MakeSelfCert(&myCert, derCert, sizeof(derCert), &key, &rng); if (certSz < 0) /* certSz contains the error */; ``` - - -バッファ`derCert`には、証明書のDERフォーマットが含まれています。証明書のPEMフォーマットが必要な場合は、Generic `DerToPem()`関数を使用して、このように`CERT_TYPE`になるタイプを指定できます。 - - +バッファ`derCert`にはDERフォーマットの証明書が含まれています。 +証明書のPEMフォーマットが必要な場合は、汎用の`DerToPem()`関数を使用して、タイプを`CERT_TYPE`として指定します。 ```c byte* pem; -int pemSz=DerToPem(derCert, certSz, pem, sizeof(pemCert), CERT_TYPE); +int pemSz = DerToPem(derCert, certSz, pem, sizeof(pemCert), CERT_TYPE); if (pemCertSz < 0) /* pemCertSz contains error */; ``` - - -サポートされているタイプは次のとおりです。 - - +サポートしているタイプは以下の通りです。 * `CA_TYPE` - - - * `TRUSTED_PEER_TYPE` - - - * `CERT_TYPE` - - - * `CRL_TYPE` - - - * `DH_PARAM_TYPE` - - - * `DSA_PARAM_TYPE` - - - * `CERTREQ_TYPE` - - - * `DSA_TYPE` - - - * `DSA_PRIVATEKEY_TYPE` - - - * `ECC_TYPE` - - - * `ECC_PRIVATEKEY_TYPE` - - - * `RSA_TYPE` - - - * `PRIVATEKEY_TYPE` - - - * `ED25519_TYPE` - - - * `EDDSA_PRIVATEKEY_TYPE` - - - * `PUBLICKEY_TYPE` - - - * `ECC_PUBLICKEY_TYPE` - - - * `PKCS8_PRIVATEKEY_TYPE` - - - * `PKCS8_ENC_PRIVATEKEY_TYPE` +これで、バッファ`pemCert`には証明書のPEMフォーマットが含まれています。 - - -これで、バッファ`pemCert<`が証明書のPEM形式を保持します。 - - -CA署名証明書を作成する場合は、いくつかの手順が必要です。以前のようにサブジェクト情報を記入した後、CA証明書から発行者情報を設定する必要があります。これは、このように`SetIssuer()`で行うことができます。 - - +CA署名付き証明書を作成したい場合は、いくつかの手順が必要です。 +前述のようにサブジェクト情報を入力した後、CA証明書から発行者情報を設定する必要があります。 +これは`SetIssuer()`を使用して次のように実行できます。 ```c -ret=SetIssuer(&myCert, "ca-cert.pem"); +ret = SetIssuer(&myCert, "ca-cert.pem"); if (ret < 0) /* ret contains error */; ``` - - -その後、証明書を作成してから署名する2ステップのプロセスを実行する必要があります(`MakeSelfCert()`は両方とも1段階で行います)。発行者(`caKey`)とサブジェクト(`key`)の両方から秘密鍵が必要です。完全な使用法については`test.c`の例をご覧ください。 - - +その後、証明書を作成し、それに署名する2段階のプロセスを実行する必要があります。 +(`MakeSelfCert()`は一度にこれら両方を実行します) +発行者(`caKey`)と対象(`key`)の両方の秘密鍵が必要です。 +完全な使用方法については、`test.c`の実装例をご参照ください。 ```c byte derCert[4096]; -int certSz=MakeCert(&myCert, derCert, sizeof(derCert), &key, NULL, &rng); +int certSz = MakeCert(&myCert, derCert, sizeof(derCert), &key, NULL, &rng); if (certSz < 0); /*certSz contains the error*/; -certSz=SignCert(myCert.bodySz, myCert.sigType, derCert, +certSz = SignCert(myCert.bodySz, myCert.sigType, derCert, sizeof(derCert), &caKey, NULL, &rng); if (certSz < 0); /*certSz contains the error*/; ``` +これで、バッファ`derCert`にはCA署名付き証明書のDERフォーマットが含まれています。 +証明書のPEMフォーマットが必要な場合は、上記の自己署名の実装例をご参照ください。 +`MakeCert()`と`SignCert()`は、RSA鍵またはECC鍵のいずれかを使用するための関数パラメータを提供していることに注意してください。 +上記の実装例ではRSA鍵を使用し、ECC鍵パラメータにはNULLを渡しています。 +## 証明書署名要求(CSR)の生成 -バッファ`derCert`には、CA署名証明書のder形式が含まれるようになりました。証明書のPEM形式が必要な場合は、上記の自己署名の例を参照してください。`MakeCert()`および`SignCert()`は、使用するRSAまたはECCキーの関数パラメーターを提供していることに注意してください。上記の例では、RSAキーを使用し、ECCキーパラメーターのnullを渡します。 +wolfSSLはX.509 v3証明書署名要求(CSR)生成をサポートしています。 +CSR生成はデフォルトではオフですが、`./configure`プロセスに`--enable-certreq --enable-certgen`引数を加えることで(Windowsや非標準環境では、`WOLFSSL_CERT_GEN`**および**`WOLFSSL_CERT_REQ`を定義することで)有効化できます。 +CSRを生成する前に、ユーザーは証明書のサブジェクトに関する情報を提供する必要があります。 +この情報は`wolfssl/wolfcrypt/asn_public.h`にある`Cert`という構造体に含まれています。 +CertとCertName構造体の詳細については本章の「証明書生成」節をご参照ください。 -## 証明書署名要求(CSR)生成 - - - -wolfSSLは、X.509 v3証明書署名要求(CSR)生成をサポートしています。CSR生成はデフォルトでオフになっていますが、`--enable-certreq --enable-certgen`で`./configure`プロセス中、またはWindowsまたは非標準の環境で`WOLFSSL_CERT_GEN` **と** `WOLFSSL_CERT_REQ`を定義することによってオンにすることができます。 - - -CSRを生成する前に、ユーザーは証明書の主題に関する情報を提供する必要があります。この情報は、`Cert`という名前の`wolfssl/wolfcrypt/asn_public.h`の構造に含まれています。 - - -CERTおよびCERTNAME構造の詳細については、上記の[証明書生成](#certificat-generation)を参照してください。 - - -サブジェクト情報に記入する前に、初期化機能を次のように呼び出す必要があります。 - - +サブジェクトの情報を入力する前に、次のように初期化関数を呼び出す必要があります。 ```c Cert request; InitCert(&request); ``` +`InitCert()`はいくつかの変数にデフォルト値を設定します。 +バージョンを**3** (0x02)、シリアル番号を**0**(ランダム生成)、sigTypeを`CTC_SHAwRSA`、daysValidを**500**、selfSignedを**1**(TRUE)に設定します。 -`InitCert()` は、バージョンを **3** (0x02) に、シリアル番号を **0** (ランダムに生成) に、sigType を `CTC_SHAwRSA` に、daysValid を **500** に、selfSigned を **1** (TRUE) に設定するなど、いくつかの変数のデフォルトを設定します。 - -サポートされている署名タイプは次のとおりです。 - - +サポートしている署名タイプは次のとおりです。 * `CTC_SHAwDSA` - - * `CTC_MD2wRSA` - - * `CTC_MD5wRSA` - - * `CTC_SHAwRSA` - - * `CTC_SHAwECDSA` - - * `CTC_SHA256wRSA` - - * `CTC_SHA256wECDSA` - - * `CTC_SHA384wRSA` - - * `CTC_SHA384wECDSA` - - * `CTC_SHA512wRSA` - - * `CTC_SHA512wECDSA` - - -これで、ユーザーはからこの例のようなサブジェクト情報を初期化できます。 - - +次に、以下のようにしてサブジェクト情報を初期化します。 +ただし実際には、ユーザの環境に応じた値を入力します。 +詳細はにも掲載しています。 ```c strncpy(req.subject.country, "US", CTC_NAME_SIZE); @@ -814,78 +528,55 @@ strncpy(req.subject.commonName, "www.wolfssl.com", CTC_NAME_SIZE); strncpy(req.subject.email, "info@wolfssl.com", CTC_NAME_SIZE); ``` - - -次に、上記のキー生成例(もちろん有効なECC/RSAキーまたはRNGを使用できます)の変数キーを使用して、有効な署名されたCSRを生成できます。 - - +そして、上記の鍵生成例からの変数`key`と`rng`を使用して、署名付きCSRを生成できます。 +もちろん、有効なものであればwolfSSLによって生成したものでなくとも構いません。 ```c byte der[4096]; /* Store request in der format once made */ -ret=wc_MakeCertReq(&request, der, sizeof(der), NULL, &key); +ret = wc_MakeCertReq(&request, der, sizeof(der), NULL, &key); /* check ret value for error handling, <= 0 indicates a failure */ ``` - - -次に、リクエストに署名して有効にします。上記のキー生成例からRNG変数を使用します。(もちろん、有効なECC/RSAキーまたはRNGを使用できます) - - +次に、リクエストに署名して有効にします。 +上記の鍵生成例から`rng`変数を使用します。 +こちらも同様に、wolfSSLによって生成したものである必要はありません。 ```c -derSz=ret; +derSz = ret; -req.sigType=CTC_SHA256wECDSA; -ret=wc_SignCert(request.bodySz, request.sigType, der, sizeof(der), NULL, &key, &rng); +req.sigType = CTC_SHA256wECDSA; +ret = wc_SignCert(request.bodySz, request.sigType, der, sizeof(der), NULL, &key, &rng); /* check ret value for error handling, <= 0 indicates a failure */ ``` - - -最後に、CSRをPEM形式に変換して、証明書の発行に使用するCA権限に送信します。 - - +最後に、CSRをPEMフォーマットに変換して、CA機関に送信して証明書の発行に使用します。 ```c -ret=wc_DerToPem(der, derSz, pem, sizeof(pem), CERTREQ_TYPE); +ret = wc_DerToPem(der, derSz, pem, sizeof(pem), CERTREQ_TYPE); /* check ret value for error handling, <= 0 indicates a failure */ printf("%s", pem); /* or write to a file */ ``` +### 制限事項 +証明書には必須のフィールドがあり、CSRでは除外されます。 +CSRには「オプション」とみなされる他のフィールドもあり、証明書では必須です。 +このため、すべての証明書フィールドを厳密にチェックし、すべてのフィールドを必須と見なすwolfSSL証明書解析エンジンは、現時点ではCSRの使用をサポートしていません。 +したがって、CSR生成と最初からの証明書生成はサポートしていますが、wolfSSLはCSRからの証明書生成をサポートしていません。 +CSRをwolfSSL解析エンジンに渡すと、現時点ではエラーが返されます。 +アップデートをお待ちいただくか、[info@wolfssl.jp](mailto:info@wolfssl.jp)までお問い合わせください。 +## 生のECC鍵に変換 -### 制限 - - - -CSRで除外された証明書に必須のフィールドがあります。CSRには、証明書に載っているときに必須の「オプション」と見なされる他のフィールドがあります。このため、すべての証明書フィールドを厳密にチェックし、すべてのフィールドを必須と見なすwolfSSL証明書解析エンジンは、現時点ではCSRの使用をサポートしていません。したがって、CSRの生成と証明書の生成はゼロからサポートされていますが、wolfSSLはCSRからの証明書生成をサポートしていません。CSRをwolfSSL解析エンジンに渡すと、現時点では障害が返されます。証明書生成でCSRの使用をサポートしたかについては更新を確認してください! - - -**関連項目**:[証明書生成](#certificate-generation) - - - -## RawのECCキーに変換 - - - -Raw ECCキーのインポートに対する最近追加されたサポートでは、ECCキーをPEMからDERに変換する機能が得られます。これを実行するには、指定された引数を次に使用します。 - - +生のECC鍵インポートを用いて、ECC鍵をPEMからDERに変換する機能を提供しています。 +これを実行するには、指定された引数で次の関数を実行します。 ```c EccKeyToDer(ecc_key*, byte* output, word32 inLen); ``` - - - -### 例 - - - +### 実装例 ```c #define FOURK_BUF 4096 @@ -893,4 +584,4 @@ byte der[FOURK_BUF]; ecc_key userB; EccKeyToDer(&userB, der, FOURK_BUF); -``` +``` \ No newline at end of file diff --git a/wolfSSL/src-ja/chapter10.md b/wolfSSL/src-ja/chapter10.md index 3c030e55..4251fed8 100644 --- a/wolfSSL/src-ja/chapter10.md +++ b/wolfSSL/src-ja/chapter10.md @@ -1,40 +1,27 @@ +# wolfCryptの使用法 +wolfCryptは、主にwolfSSLが使用する暗号ライブラリです。 +速度、小さなフットプリント、移植性のために最適化されています。 +wolfSSLは、必要に応じて他の暗号ライブラリと交換します。 -# WolfCryptの使用法 - - - -WolfCryptは、主にwolfSSLが使用する暗号化ライブラリです。速度、小さなフットプリント、および移植性のために最適化されています。wolfSSLは、必要に応じて他の暗号ライブラリと交換します。 - - -例で使用される型: - - +実装例で使用する型は次の通りです。 ```c typedef unsigned char byte; typedef unsigned int word32; ``` - - - ## ハッシュ関数 - - - ### MD4 +**注意**:MD4は古く、安全でないと考えられています。 +可能であれば、異なるハッシュ関数を使用してください。 - - -**注**:MD4は古くて安全でないと考えられています。可能であれば、異なるハッシュ関数を使用してください。 - - -MD4を使用するには、MD4ヘッダー`wolfssl/wolfcrypt/md4.h`を含みます。使用する構造は`Md4`です。これはTypedefです。使用する前に、ハッシュの初期化は[`wc_InitMd4()`](group__MD4.md#function-wc_initmd4)呼び出しで行われなければなりません。ファイナルハッシュを取得するには、HASHと[`wc_Md4Final()`](group__MD4.md#function-wc_md4final)を更新するために[`wc_Md4Update()`](group__MD4.md#function-wc_initmd4)を使用してください。 - - +MD4を使用するには、MD4ヘッダー`wolfssl/wolfcrypt/md4.h`をインクルードします。 +使用する構造体は`Md4`で、これはtypedefです。 +使用する前に、[`wc_InitMd4()`](group__MD4.md#function-wc_initmd4)を実行してハッシュの初期化を行う必要があります。 +ハッシュを更新するには[`wc_Md4Update()`](group__MD4.md#function-wc_initmd4)を使用し、最終的なハッシュを取得するには[`wc_Md4Final()`](group__MD4.md#function-wc_md4final)を使用します。 ```c byte md4sum[MD4_DIGEST_SIZE]; @@ -49,23 +36,17 @@ wc_Md4Update(&md4, buffer, sizeof(buffer)); /*can be called again wc_Md4Final(&md4, md4sum); ``` - - -`md4sum`には、バッファーのハッシュデータのダイジェストが含まれています。 - - +`md4sum`には、bufferのハッシュ化されたデータのダイジェストが含まれます。 ### MD5 +**注意**:MD5は古く、安全でないと考えられています。 +可能であれば、異なるハッシュ関数を使用してください。 - - -**注**:MD5は時代遅れであり、不安定であると考えられています。可能であれば、異なるハッシュ関数を使用してください。 - - -MD5を使用するには、MD5ヘッダー`wolfssl/wolfcrypt/md5.h`が含まれます。使用する構造は`Md5`で、これはtypedefです。使用する前に、ハッシュの初期化は[`wc_InitMd5()`](group__MD5.md#function-wc_initmd5)呼び出しで行われなければなりません。[`wc_Md5Update()`](group__MD5.md#function-wc_md5update)を使用してハッシュと[`wc_Md5Final()`](group__MD5.md#function-wc_md5final)を更新して最終的なハッシュを取得します - - +MD5を使用するには、MD5ヘッダー`wolfssl/wolfcrypt/md5.h`をインクルードします。 +使用する構造体は`Md5`で、これはtypedefです。 +使用する前に、[`wc_InitMd5()`](group__MD5.md#function-wc_initmd5)を実行してハッシュの初期化を行う必要があります。 +ハッシュを更新するには[`wc_Md5Update()`](group__MD5.md#function-wc_md5update)を使用し、最終的なハッシュを取得するには[`wc_Md5Final()`](group__MD5.md#function-wc_md5final)を使用します。 ```c byte md5sum[MD5_DIGEST_SIZE]; @@ -80,20 +61,14 @@ wc_Md5Update(&md5, buffer, sizeof(buffer)); /*can be called again wc_Md5Final(&md5, md5sum); ``` +`md5sum`には、bufferのハッシュ化されたデータのダイジェストが含まれます。 +### SHA / SHA-224 / SHA-256 / SHA-384 / SHA-512 -`md5sum`には、バッファーのハッシュデータのダイジェストが含まれています。 - - - -### SHA/SHA-224/SHA-256/SHA-384/SHA-512 - - - - -SHAを使用するには、SHAヘッダー`wolfssl/wolfcrypt/sha.h`を含めます。使用する構造は`Sha`で、typedefです。使用する前に、ハッシュの初期化は[`wc_InitSha()`](group__SHA.md#function-wc_initsha)呼び出しで行われなければなりません。[`wc_ShaUpdate()`](group__SHA.md#function-wc_shaupdate)を使用して、ハッシュと[`wc_ShaFinal()`](group__SHA.md#function-wc_shafinal)を更新して最終的なハッシュを取得します。 - - +SHAを使用するには、SHAヘッダー`wolfssl/wolfcrypt/sha.h`をインクルードします。 +使用する構造体は`Sha`で、これはtypedefです。 +使用する前に、[`wc_InitSha()`](group__SHA.md#function-wc_initsha)を実行してハッシュの初期化を行う必要があります。 +ハッシュを更新するには[`wc_ShaUpdate()`](group__SHA.md#function-wc_shaupdate)を使用し、最終的なハッシュを取得するには[`wc_ShaFinal()`](group__SHA.md#function-wc_shafinal)を使用します。 ```c byte shaSum[SHA_DIGEST_SIZE]; @@ -108,34 +83,31 @@ wc_ShaUpdate(&sha, buffer, sizeof(buffer)); /*can be called again wc_ShaFinal(&sha, shaSum); ``` +`shaSum`には、bufferのハッシュ化されたデータのダイジェストが含まれます。 +SHA-224、SHA-256、SHA-384、SHA-512のいずれかを使用するには、上記と同じ手順に従います。 +ただし、`wolfssl/wolfcrypt/sha256.h`または`wolfssl/wolfcrypt/sha512.h`(SHA-384もこちら)のいずれかを使用します。 +SHA-256、SHA-384、SHA-512関数は、SHA関数と同様に名付けられています。 -`shaSum`には、バッファーのハッシュデータのダイジェストが含まれています。 - - -SHA-224、SHA-256、SHA-384、またはSHA-512を使用するには、上記と同じ手順に従いますが、`wolfssl/wolfcrypt/sha256.h`または`wolfssl/wolfcrypt/sha512.h`(SHA-384とSHA-512の両方)のいずれかを使用します。SHA-256、SHA-384、およびSHA-512機能は、SHA関数と同様に命名されています。 - - -** sha-224 **の場合、関数[`wc_InitSha224()`](group__SHA.md#function-wc_initsha224)、[`wc_Sha224Update()`](group__SHA.md#function-wc_sha224update)、および[`wc_Sha224Final()`](group__SHA.md#function-wc_sha224final)が構造SHA224で使用されます。 - - -** sha-256 **の場合、関数[`wc_InitSha256()`](group__SHA.md#function-wc_initsha256)、[`wc_Sha256Update()`](group__SHA.md#function-wc_sha256update)、および[`wc_Sha256Final()`](group__SHA.md#function-wc_sha256final)が構造SHA256で使用されます。 +**SHA-224**の場合、構造体Sha224と共に[`wc_InitSha224()`](group__SHA.md#function-wc_initsha224)、[`wc_Sha224Update()`](group__SHA.md#function-wc_sha224update)、[`wc_Sha224Final()`](group__SHA.md#function-wc_sha224final)関数が使用されます。 +**SHA-256**の場合、構造体Sha256と共に[`wc_InitSha256()`](group__SHA.md#function-wc_initsha256)、[`wc_Sha256Update()`](group__SHA.md#function-wc_sha256update)、[`wc_Sha256Final()`](group__SHA.md#function-wc_sha256final)関数が使用されます。 -** SHA-384 **では、機能[`wc_InitSha384()`](group__SHA.md#function-wc_initsha384),[`wc_Sha384Update()`](group__SHA.md#function-wc_sha384update)、および[`wc_Sha384Final()`](group__SHA.md#function-wc_sha384final)は構造SHA384で使用されます。 +**SHA-384**の場合、構造体Sha384と共に[`wc_InitSha384()`](group__SHA.md#function-wc_initsha384)、[`wc_Sha384Update()`](group__SHA.md#function-wc_sha384update)、[`wc_Sha384Final()`](group__SHA.md#function-wc_sha384final)関数が使用されます。 +**SHA-512**の場合、構造体Sha512と共に[`wc_InitSha512()`](group__SHA.md#function-wc_initsha512)、[`wc_Sha512Update()`](group__SHA.md#function-wc_sha512update)、[`wc_Sha512Final()`](group__SHA.md#function-wc_sha512final)関数が使用されます。 -** sha-512 **の場合、関数[`wc_InitSha512()`](group__SHA.md#function-wc_initsha512)、[`wc_Sha512Update()`](group__SHA.md#function-wc_sha512update)、および[`wc_Sha512Final()`](group__SHA.md#function-wc_sha512final)が構造SHA512で使用されます。 - - - -### blake2b - - - -Blake2B(SHA-3ファイナリスト)を使用するには、Blake2Bヘッダー`wolfssl/wolfcrypt/blake2.h`を含みます。使用する構造は`Blake2b`です。これはTypedefです。使用する前に、ハッシュの初期化は[`wc_InitBlake2b()`](group__BLAKE2.md#function-wc_initblake2b)呼び出しで行われなければなりません。[`wc_Blake2bUpdate()`](group__BLAKE2.md#function-wc_blake2bupdate)を使用して、ハッシュと[`wc_Blake2bFinal()`](group__BLAKE2.md#function-wc_blake2bfinal)を更新して最終的なハッシュを取得します。 +SHAインターリービングはデフォルトで有効になっています。 +(通常は、それをサポートするハードウェアアクセラレーションでのみ使用されます。) +無効にするには`NO_WOLFSSL_SHA256_INTERLEAVE`を定義します。 +ソフトウェアSHAは常にインターリービングをサポートしています。 +### BLAKE2b +BLAKE2b(SHA-3ファイナリスト)を使用するには、BLAKE2bヘッダー`wolfssl/wolfcrypt/blake2.h`をインクルードします。 +使用する構造体は`Blake2b`で、これはtypedefです。 +使用する前に、[`wc_InitBlake2b()`](group__BLAKE2.md#function-wc_initblake2b)を実行してハッシュの初期化を行う必要があります。 +ハッシュを更新するには[`wc_Blake2bUpdate()`](group__BLAKE2.md#function-wc_blake2bupdate)を使用し、最終的なハッシュを取得するには[`wc_Blake2bFinal()`](group__BLAKE2.md#function-wc_blake2bfinal)を使用します。 ```c byte digest[64]; @@ -148,23 +120,17 @@ wc_Blake2bUpdate(&b2b, input, sizeof(input)); wc_Blake2bFinal(&b2b, digest, 64); ``` +[`wc_InitBlake2b()`](group__BLAKE2.md#function-wc_initblake2b)の2番目のパラメータは、最終的なダイジェストサイズです。 +`digest`には、bufferのハッシュ化されたデータのダイジェストが含まれます。 - -[`wc_InitBlake2b()`](group__BLAKE2.md#function-wc_initblake2b)の2番目のパラメータは、最終ダイジェストサイズです。`digest`バッファ内のハッシュデータのダイジェストを含みます。 - - -使用例使用例は、`blake2b_test()`関数内で、WolfCryptテストアプリケーション(`wolfcrypt/test/test.c`)にあります。 - - +使用例はwolfCryptテストアプリケーション(`wolfcrypt/test/test.c`)の`blake2b_test()`関数内にあります。 ### RIPEMD-160 - - - -RIPEMD-160を使用するには、ヘッダー`wolfssl/wolfcrypt/ripemd.h`を含めます。使用する構造は`RipeMd`で、これはtypedefです。使用する前に、ハッシュの初期化は[`wc_InitRipeMd()`](group__RIPEMD.md#function-wc_initripemd)呼び出しで行われなければなりません。[`wc_RipeMdUpdate()`](group__RIPEMD.md#function-wc_ripemdupdate)を使用してハッシュと[`wc_RipeMdFinal()`](group__RIPEMD.md#function-wc_ripemdfinal)を更新して最終的なハッシュを取得します - - +RIPEMD-160を使用するには、ヘッダー`wolfssl/wolfcrypt/ripemd.h`をインクルードします。 +使用する構造体は`RipeMd`で、これはtypedefです。 +使用する前に、[`wc_InitRipeMd()`](group__RIPEMD.md#function-wc_initripemd)を実行してハッシュの初期化を行う必要があります。 +ハッシュを更新するには[`wc_RipeMdUpdate()`](group__RIPEMD.md#function-wc_ripemdupdate)を使用し、最終的なハッシュを取得するには[`wc_RipeMdFinal()`](group__RIPEMD.md#function-wc_ripemdfinal)を使用します。 ```c byte ripeMdSum[RIPEMD_DIGEST_SIZE]; @@ -179,25 +145,18 @@ wc_RipeMdUpdate(&ripemd, buffer, sizeof(buffer)); /*can be called wc_RipeMdFinal(&ripemd, ripeMdSum); ``` +`ripeMdSum`には、bufferのハッシュ化されたデータのダイジェストが含まれます。 - -`ripeMdSum`には、バッファーのハッシュデータのダイジェストが含まれています。 - - - -## キー付きハッシュ関数 - - - +## 鍵付きハッシュ関数 ### HMAC +wolfCryptは現在、メッセージダイジェストのニーズに対してHMACを提供しています。 +構造体`Hmac`はヘッダー`wolfssl/wolfcrypt/hmac.h`にあります。 +HMACの初期化は[`wc_HmacSetKey()`](group__HMAC.md#function-wc_hmacsetkey)で行われます。 +HMACでは、MD5、SHA、SHA-256、SHA-384、SHA-512をサポートしています。 - - -WolfCryptは現在メッセージダイジェストニーズにHMACを提供しています。構造`Hmac`はヘッダ`wolfssl/wolfcrypt/hmac.h`にあります.HMAC初期化は[`wc_HmacSetKey()`](group__HMAC.md#function-wc_hmacsetkey)で行われます.5つの異なるタイプがHMACでサポートされています.MD5、SHA、SHA-256、SHA-384、およびSHA-512。これがSHA-256の例です。 - - +以下は、SHA-256の例です。 ```c Hmac hmac; @@ -210,20 +169,13 @@ wc_HmacUpdate(&hmac, buffer, sizeof(buffer)); wc_HmacFinal(&hmac, hmacDigest); ``` - - -`hmacDigest`には、バッファーのハッシュデータのダイジェストが含まれています。 - - +`hmacDigest`には、bufferのハッシュ化されたデータのダイジェストが含まれます。 ### GMAC - - - -WolfCryptは、メッセージダイジェストのニーズにもGMACを提供します。構造`Gmac`は、アプリケーションAES-GCMであるため、ヘッダー`wolfssl/wolfcrypt/aes.h`にあります。GMAC初期化は[`wc_GmacSetKey()`](group__AES.md#function-wc_gmacsetkey)で行われます。 - - +wolfCryptはメッセージダイジェストのニーズに対してGMACも提供しています。 +構造体`Gmac`はヘッダー`wolfssl/wolfcrypt/aes.h`にあります(AES-GCMのアプリケーションです)。 +GMACの初期化は[`wc_GmacSetKey()`](group__AES.md#function-wc_gmacsetkey)で行われます。 ```c Gmac gmac; @@ -237,19 +189,14 @@ wc_GmacUpdate(&gmac, iv, sizeof(iv), buffer, sizeof(buffer), gmacDigest, sizeof(gmacDigest)); ``` +`gmacDigest`には、bufferのハッシュ化されたデータのダイジェストが含まれます。 +### Poly1305 -`gmacDigest`には、バッファーのハッシュデータのダイジェストが含まれています。 - - - -### poly1305 - - - -WolfCryptは、メッセージダイジェストニーズに合わせてPoly1305も提供しています。構造体`Poly1305`はヘッダ`wolfssl/wolfcrypt/poly1305.h`にあります.Poly1305の初期化は[`wc_Poly1305SetKey()`](group__Poly1305.md#function-wc_poly1305setkey)で行われます.Poly1305でキーを設定するプロセスは、[`wc_Poly1305Final()`](group__Poly1305.md#function-wc_poly1305final)以降にPoly1305を使用して次にPoly1305を使用して実行する必要があります。 - - +wolfCryptはメッセージダイジェストのニーズに対してPoly1305も提供しています。 +構造体`Poly1305`はヘッダー`wolfssl/wolfcrypt/poly1305.h`にあります。 +Poly1305の初期化は[`wc_Poly1305SetKey()`](group__Poly1305.md#function-wc_poly1305setkey)で行われます。 +[`wc_Poly1305Final()`](group__Poly1305.md#function-wc_poly1305final)が呼び出された後、次にPoly1305を使用する際には、Poly1305での鍵の設定プロセスを新しい鍵で再度行う必要があります。 ```c Poly1305 pmac; @@ -262,35 +209,28 @@ wc_Poly1305Update(&pmac, buffer, sizeof(buffer)); wc_Poly1305Final(&pmac, pmacDigest); ``` - - -`pmacDigest`には、バッファーのハッシュデータのダイジェストが含まれています。 - - +`pmacDigest`には、bufferのハッシュ化されたデータのダイジェストが含まれます。 ## ブロック暗号 - - - ### AES +wolfCryptは16バイト(128ビット)、24バイト(192ビット)、32バイト(256ビット)の鍵サイズのAESをサポートしています。 +サポートされるAESモードには、CBC、CTR、GCM(GCM-ストリーミング)、OFB、CFB(1、8、128)、SIV、XTS(XTS-ストリーミング)、GMAC、CMAC、ECB、KW(KeyWrap)、CCM-8が含まれます。 +**注意**:[`wc_AesSetKey()`](group__AES.md#function-wc_aessetkey)や[`wc_AesGcmSetKey()`](group__AES.md#function-wc_aesgcmsetkey)などの他の`Aes` API関数を呼び出す前に、必ずはじめに[`wc_AesInit()`](group__AES.md#function-wc_aesinit)を呼び出し、`Aes`構造体を初期化する必要があります。 - -WolfCryptは、16バイト(128ビット)、24バイト(192ビット)、または32バイト(256ビット)のキーサイズを持つAESをサポートしています。サポートされているAESモードには、CBC、CTR、GCM、およびCCM-8が含まれます。 - - -CBCモードは、暗号化と復号化の両方でサポートされており、[`wc_AesSetKey()`](group__AES.md#function-wc_aessetkey),[`wc_AesCbcEncrypt()`](group__AES.md#function-wc_aescbcencrypt)および[`wc_AesCbcDecrypt()`](group__AES.md#function-wc_aescbcdecrypt)の関数を介して提供されます。AESを使用するヘッダー`wolfssl/wolfcrypt/aes.h`を含めてください。AESには16バイトのブロックサイズがあり、IVも16バイトになります。関数の使用法は通常次のとおりです。 - - +CBCモードは暗号化と復号の両方でサポートしており、[`wc_AesSetKey()`](group__AES.md#function-wc_aessetkey)、[`wc_AesCbcEncrypt()`](group__AES.md#function-wc_aescbcencrypt)、[`wc_AesCbcDecrypt()`](group__AES.md#function-wc_aescbcdecrypt)関数を通じて提供されます。 +AESを使用するには、ヘッダー`wolfssl/wolfcrypt/aes.h`をインクルードしてください。 +AESのブロックサイズは16バイトで、IVも16バイトである必要があります。 +関数の使用方法は通常、次のとおりです。 ```c Aes enc; Aes dec; -const byte key[]={ /*some 24 byte key*/ }; -const byte iv[]={ /*some 16 byte iv*/ }; +const byte key[] = { /*some 24 byte key*/ }; +const byte iv[] = { /*some 16 byte iv*/ }; byte plain[32]; /*an increment of 16, fill with data*/ byte cipher[32]; @@ -303,11 +243,7 @@ wc_AesSetKey(&enc, key, sizeof(key), iv, AES_ENCRYPTION); wc_AesCbcEncrypt(&enc, cipher, plain, sizeof(plain)); ``` - - -`cipher`には、プレーンテキストの暗号文が含まれています。 - - +`cipher`には、平文から生成された暗号文が入ります。 ```c /*decrypt*/ @@ -315,38 +251,40 @@ wc_AesSetKey(&dec, key, sizeof(key), iv, AES_DECRYPTION); wc_AesCbcDecrypt(&dec, plain, cipher, sizeof(cipher)); ``` +`plain`には、暗号文を復号することで生成された平文が入ります。 +wolfCryptはAESの動作モードとしてCTR(カウンター)、GCM(ガロア/カウンター)、CCM-8(CBC-MAC付きカウンター)もサポートしています。 +CBCと同様に、これらのモードを使用する場合は、ヘッダー`wolfssl/wolfcrypt/aes.h`をインクルードしてください。 -`plain` CipherTextから元の平文を含みます。 - - -WolfCryptはまた、CTR(Counter)、GCM(Galois/Counter)、およびCCM-8(CBC-MACのCOUNTER)のAESの操作モードをサポートしています。CBCのようにこれらのモードを使用する場合は、`wolfssl/wolfcrypt/aes.h`ヘッダーを含めます。 - - -GCMモードは、[`wc_AesGcmSetKey()`](group__AES.md#function-wc_aesgcmsetkey)、[`wc_AesGcmEncrypt()`](group__AES.md#function-wc_aesgcmencrypt)、および[`wc_AesGcmDecrypt()`](group__AES.md#function-wc_aesgcmdecrypt)関数を介した暗号化と復号化の両方で使用できます。使用例については、`/wolfcrypt/test/test.c`の`aesgcm_test()`関数を参照してください。 - - -CCM-8モードは、[`wc_AesCcmSetKey()`](group__AES.md#function-wc_aesccmsetkey),[`wc_AesCcmEncrypt()`](group__AES.md#function-wc_aesccmencrypt)、および[`wc_AesCcmDecrypt()`](group__AES.md#function-wc_aesccmdecrypt)の関数を介して暗号化と復号化の両方でサポートされています。使用例については、`/wolfcrypt/test/test.c`の`aesccm_test()`関数を参照してください。 - - -CTRモードは、[`wc_AesCtrEncrypt()`](group__AES.md#function-wc_aesctrencrypt)関数を介して暗号化と復号化の両方で使用できます。暗号化および復号化アクションは同一であるため、両方に同じ関数が使用されます。使用例については、ファイル`wolfcrypt/test/test.c`の関数`aes_test()`を参照してください。 - - - -#### des and 3des +GCMモードは[`wc_AesGcmSetKey()`](group__AES.md#function-wc_aesgcmsetkey)、[`wc_AesGcmEncrypt()`](group__AES.md#function-wc_aesgcmencrypt)、[`wc_AesGcmDecrypt()`](group__AES.md#function-wc_aesgcmdecrypt)関数を通じて暗号化と復号の両方で利用できます。 +使用例については、`/wolfcrypt/test/test.c`の`aesgcm_test()`関数をご参照ください。 +CCM-8モードは[`wc_AesCcmSetKey()`](group__AES.md#function-wc_aesccmsetkey)、[`wc_AesCcmEncrypt()`](group__AES.md#function-wc_aesccmencrypt)、[`wc_AesCcmDecrypt()`](group__AES.md#function-wc_aesccmdecrypt)関数を通じて暗号化と復号の両方でサポートしています。 +使用例については、`/wolfcrypt/test/test.c`の`aesccm_test()`関数をご参照ください。 +CTRモードは[`wc_AesCtrEncrypt()`](group__AES.md#function-wc_aesctrencrypt)関数を通じて暗号化と復号の両方で利用できます。 +暗号化と復号のアクションは同一であるため、両方に同じ関数が使用されます。 +使用例については、ファイル`wolfcrypt/test/test.c`の`aes_test()`関数をご参照ください。 -WolfCryptはDESと3DESのサポートを提供します(3は無効な先頭のC識別子です)。これらを使用するには、ヘッダー`wolfssl/wolfcrypt/des.h`が含まれます。使用できる構造は`Des`および`Des3`です。3DESの場合は24)、ブロックサイズは8バイトであるため、機能を暗号化/復号化するために8バイトの増分だけを渡します。データがブロックサイズの増分になっていない場合は、必ずパディングを追加する必要があります。各`SetKey()`はまたIV(キーサイズと同じサイズの初期化ベクトル)を取ります。使用法は通常次のようなものです。 - +#### DESおよび3DES +wolfCryptはDESおよび3DESをサポートしています。 +(ただし、C言語では先頭に数字を使用できないため、Des3と示しています。) +これらを使用するには、ヘッダー`wolfssl/wolfcrypt/des.h`をインクルードします。 +使用できる構造体は`Des`および`Des3`です。 +初期化は[`wc_Des_SetKey()`](group__DES.md#function-wc_des_setkey)または[`wc_Des3_SetKey()`](group__DES.md#function-wc_des3_setkey)を通じて行われます。 +CBC暗号化/復号は[`wc_Des_CbcEnrypt()`](group__DES.md#function-wc_des_cbcencrypt) / [`wc_Des_CbcDecrypt()`](group__DES.md#function-wc_dec_cbcdecrypt)および[`wc_Des3_CbcEncrypt()`](group__DES.md#function-wc_des3_cbcencrypt) / [`wc_Des3_CbcDecrypt()`](group__DES.md#function-wc_des3_cbcdecrypt)を通じて提供されます。 +Desの鍵サイズは8バイト(3DESでは24)で、ブロックサイズは8バイトなので、暗号化/復号関数には8バイトの倍数のみを渡してください。 +データがブロックサイズの倍数でない場合は、確実にそうなるようにパディングを追加する必要があります。 +各`SetKey()`は、IV(鍵サイズと同じサイズの初期化ベクトル)も取ります。 +使用方法は通常、次のとおりです。 ```c Des3 enc; Des3 dec; -const byte key[]={ /*some 24 byte key*/ }; -const byte iv[] ={ /*some 24 byte iv*/ }; +const byte key[] = { /*some 24 byte key*/ }; +const byte iv[] = { /*some 24 byte iv*/ }; byte plain[24]; /*an increment of 8, fill with data*/ byte cipher[24]; @@ -356,11 +294,7 @@ wc_Des3_SetKey(&enc, key, iv, DES_ENCRYPTION); wc_Des3_CbcEncrypt(&enc, cipher, plain, sizeof(plain)); ``` - - -`cipher`には、プレーンテキストの暗号文が含まれています。 - - +`cipher`には、平文から生成された暗号文が入ります。 ```c /*decrypt*/ @@ -368,45 +302,35 @@ wc_Des3_SetKey(&dec, key, iv, DES_DECRYPTION); wc_Des3_CbcDecrypt(&dec, plain, cipher, sizeof(cipher)); ``` +`plain`には、暗号文を復号することで生成された平文が入ります。 +#### Camellia -`plain` CipherTextから元の平文を含みます。 - - - -#### カメリア - - - -WolfCryptは、Camelliaブロック暗号をサポートしています。Camelliaを使用するには、ヘッダー`wolfssl/wolfcrypt/camellia.h`を含みます。使用できる構造は`Camellia`と呼ばれます。初期化は[`wc_CamelliaSetKey()`](group__Camellia.md#function-wc_camelliasetkey)から行われます.CBC暗号化/復号化は[`wc_CamelliaCbcEnrypt()`](group__Camellia.md#function-wc_CamelliacbcEncrypt)と[`wc_CamelliaCbcDecrypt()`](group__Camellia.md#function-wc_camelliacbcdecrypt)から[`wc_CamelliaEncryptDirect()`](group__Camellia.md#function-wc_camelliaencryptdirect)と[`wc_CamelliaDecryptDirect()`](group__Camellia.md#function-wc_camelliadecryptdirect)まで提供されます。 - - -使用例については、`/wolfcrypt/test/test.c`のcamellia_test()関数を参照してください。 - - - -## シップシンパー - +wolfCryptはCamelliaブロック暗号をサポートしています。 +Camelliaを使用するには、ヘッダー`wolfssl/wolfcrypt/camellia.h`をインクルードします。 +使用できる構造体は`Camellia`と呼ばれます。 +初期化は[`wc_CamelliaSetKey()`](group__Camellia.md#function-wc_camelliasetkey)を通じて行われます。 +CBC暗号化/復号は[`wc_CamelliaCbcEnrypt()`](group__Camellia.md#function-wc_CamelliacbcEncrypt)および[`wc_CamelliaCbcDecrypt()`](group__Camellia.md#function-wc_camelliacbcdecrypt)を通じて提供され、直接の暗号化/復号は[`wc_CamelliaEncryptDirect()`](group__Camellia.md#function-wc_camelliaencryptdirect)および[`wc_CamelliaDecryptDirect()`](group__Camellia.md#function-wc_camelliadecryptdirect)を通じて提供されます。 +使用例については、`/wolfcrypt/test/test.c`のcamellia_test()関数をご参照ください。 +## ストリーム暗号 ### ARC4 +**注意**:ARC4は古く、安全でないと考えられています。 +他のストリーム暗号を使用してください。 - - -**注**:ARC4は古くて安全でないと考えられています。別のストリーム暗号を使用することを検討してください。 - - -インターネットで使用される最も一般的なストリーム暗号はARC4です。WolfCryptは、ヘッダー`wolfssl/wolfcrypt/arc4.h`を通じてそれをサポートしています。ブロックサイズがなく、キーの長さが任意の長さであるため、使用法はブロック暗号よりも簡単です。以下は、ARC4の典型的な使用法です。 - - +当時、インターネットで最も一般的に使用されるストリーム暗号はARC4でした。 +wolfCryptはヘッダー`wolfssl/wolfcrypt/arc4.h`を通じてそれをサポートしています。 +ブロックサイズがなく、鍵の長さも任意の長さにできるため、使用方法はブロック暗号よりも簡単です。 +以下はARC4の典型的な使用方法です。 ```c Arc4 enc; Arc4 dec; -const byte key[]={ /*some key any length*/}; +const byte key[] = { /*some key any length*/}; byte plain[27]; /*no size restriction, fill with data*/ byte cipher[27]; @@ -416,11 +340,7 @@ wc_Arc4SetKey(&enc, key, sizeof(key)); wc_Arc4Process(&enc, cipher, plain, sizeof(plain)); ``` - - -`cipher`には、プレーンテキストの暗号文が含まれています。 - - +`cipher`には、平文から生成された暗号文が入ります。 ```c /*decrypt*/ @@ -428,26 +348,20 @@ wc_Arc4SetKey(&dec, key, sizeof(key)); wc_Arc4Process(&dec, plain, cipher, sizeof(cipher)); ``` +`plain`には、暗号文を復号することで生成された平文が入ります。 +### ChaCha -`plain` CipherTextから元の平文を含みます。 - - - -### Chacha - - - -20ラウンドのチャチャは、高レベルのセキュリティを維持しながら、ARC4よりわずかに高速です。WolfCryptで使用するには、ヘッダー`wolfssl/wolfcrypt/chacha.h`を含めてください。Chachaは通常32バイトキー(256ビット)を使用しますが、16バイトキー(128ビット)を使用できます。 - - +20ラウンドのChaChaはARC4よりもわずかに高速であり、高いレベルのセキュリティを維持しています。 +wolfCryptで使用するには、ヘッダー`wolfssl/wolfcrypt/chacha.h`をインクルードしてください。 +ChaChaは通常32バイト(256ビット)の鍵を使用しますが、16バイト(128ビット)の鍵も使用できます。 ```c CHACHA enc; CHACHA dec; -const byte key[]={ /*some key 32 bytes*/}; -const byte iv[] ={ /*some iv 12 bytes*/ }; +const byte key[] = { /*some key 32 bytes*/}; +const byte iv[] = { /*some iv 12 bytes*/ }; byte plain[37]; /*no size restriction, fill with data*/ byte cipher[37]; @@ -459,11 +373,7 @@ wc_Chacha_SetIV(&enc, iv, counter); /*counter is the start block wc_Chacha_Process(&enc, cipher, plain, sizeof(plain)); ``` - - -`cipher`には、プレーンテキストの暗号文が含まれています。 - - +`cipher`には、平文から生成された暗号文が入ります。 ```c /*decrypt*/ @@ -472,104 +382,91 @@ wc_Chacha_SetIV(&enc, iv, counter); wc_Chacha_Process(&enc, plain, cipher, sizeof(cipher)); ``` +`plain`には、暗号文を復号することで生成された平文が入ります。 +[`wc_Chacha_SetKey`](group__ChaCha.md#function-wc_chacha_setkey)は一度設定するだけで済みますが、送信される各情報パケットごとに新しいiv(ノンス)を使用して[`wc_Chacha_SetIV()`](group__ChaCha.md#function-wc_chacha_setiv)を呼び出す必要があります。 +カウンターは、暗号化/復号プロセスを実行するときに異なるブロックから開始することで、部分的に情報を暗号化/復号できるように引数として設定されますが、ほとんどの場合は0に設定されます。 -`plain` CipherTextから元の平文を含みます。 - - -[`wc_Chacha_SetKey`](group__ChaCha.md#function-wc_chacha_setkey)は1回だけ設定する必要がありますが、送信された情報のパケットごとに、New IV(Nonce)で呼び出す必要があります。Counter は、暗号化/復号化プロセスを実行するときに別のブロックから開始することによって、情報の部分的な復号化/暗号化を可能にする引数として設定されますが、ほとんどの場合、0 に設定されます。 **ChaCha は、MAC アルゴリズムなしで使用しないでください (例 Poly1305、hmac).** - - +** ChaChaはMACアルゴリズム(例:Poly1305、HMAC)なしで使用しないでください。 ** ## 公開鍵暗号 - - - ### RSA - - - -WolfCryptは、ヘッダー`wolfssl/wolfcrypt/rsa.h`を介してRSAのサポートを提供します。PublicとPrivateのRSAキーには2つのタイプがあります。RSA 鍵には、公開鍵と秘密鍵の 2 種類があります。 公開鍵を使用すると、秘密鍵の所有者だけが解読できるものを誰でも暗号化できます。 また、秘密鍵の所有者が何かに署名することもでき、公開鍵を持っている人は誰でも、秘密鍵の所有者だけが実際に署名したことを確認できます。使用法は通常次のようなものです。 - - +wolfCryptはヘッダー`wolfssl/wolfcrypt/rsa.h`を通じてRSAをサポートしています。 +RSA鍵には、公開鍵と秘密鍵の2種類があります。 +公開鍵を使用すると、秘密鍵の保持者のみが復号できるように暗号化できます。 +また、秘密鍵の保持者が何かに署名することを可能にし、公開鍵を持つ誰もが、秘密鍵の保持者が署名したことを確認できます。 +使用方法は通常、次のとおりです。 ```c RsaKey rsaPublicKey; -byte publicKeyBuffer[] ={ /*holds the raw data from the key, maybe +byte publicKeyBuffer[] = { /*holds the raw data from the key, maybe from a file like RsaPublicKey.der*/ }; -word32 idx=0; /*where to start reading into the buffer*/ +word32 idx = 0; /*where to start reading into the buffer*/ RsaPublicKeyDecode(publicKeyBuffer, &idx, &rsaPublicKey, sizeof(publicKeyBuffer)); -byte in[]={ /*plain text to encrypt*/ }; +byte in[] = { /*plain text to encrypt*/ }; byte out[128]; RNG rng; wc_InitRng(&rng); -word32 outLen=RsaPublicEncrypt(in, sizeof(in), out, sizeof(out), &rsaPublicKey, &rng); +word32 outLen = RsaPublicEncrypt(in, sizeof(in), out, sizeof(out), &rsaPublicKey, &rng); ``` +これで`out`には、平文`in`からの暗号文が含まれます。 +[`wc_RsaPublicEncrypt()`](group__RSA.md#function-wc_rsapublicencrypt)は、`out`に書き込まれたバイト数を返すか、エラーの場合は負の数を返します。 +[`wc_RsaPublicEncrypt()`](group__RSA.md#function-wc_rsapublicencrypt)には、暗号化に使用されるパディング用のRNG(乱数ジェネレータ)が必要であり、使用する前に初期化する必要があります。 +出力バッファが十分な大きさであることを確認するために、最初に[`wc_RsaEncryptSize()`](group__RSA.md#function-wc_rsaencryptsize)を使用します。 +これにより、[`wc_RsaPublicEnrypt()`](group__RSA.md#function-wc_rsapublicencrypt)の成功した呼び出しが書き込むバイト数が返されます。 - -現在、`out`は、プレーンテキスト`in`から暗号文を保持します。[`wc_RsaPublicEncrypt()`](group__RSA.md#function-wc_rsapublicencrypt)は、エラーの場合に書き込まれたバイトまたは負の数の長さを返します。[`wc_RsaPublicEncrypt()`](group__RSA.md#function-wc_rsapublicencrypt)暗号化装置が使用するパディングにはRNG(乱数ジェネレーター)が必要であり、使用する前に初期化する必要があります。出力バッファーが渡すのに十分な大きさであることを確認するには、最初に[`wc_RsaEncryptSize()`](group__RSA.md#function-wc_rsaencryptsize)を呼び出すことができます。 - - -エラーが発生した場合、[`wc_RsaPublicEnrypt()`](group__RSA.md#function-wc_rsapublicencrypt)、または [`wc_RsaPublicKeyDecode()`](group__RSA.md#function-wc_rsapublickeydecode) からの負数リターンは、 [`wc_ErrorString()`](group__Error.md#function-wc_errorstring) を呼び出して、発生したエラーを説明する文字列を取得できます。 - - +エラーが発生した場合、[`wc_RsaPublicEnrypt()`](group__RSA.md#function-wc_rsapublicencrypt)または[`wc_RsaPublicKeyDecode()`](group__RSA.md#function-wc_rsapublickeydecode)から負の戻り値が返されます。 +その場合、[`wc_ErrorString()`](group__Error.md#function-wc_errorstring)を呼び出して、発生したエラーを説明する文字列を取得できます。 ```c void wc_ErrorString(int error, char* buffer); ``` +バッファが少なくとも`MAX_ERROR_SZ`バイト(80)であることを確認してください。 - -バッファーが少なくとも`MAX_ERROR_SZ`バイトであることを確認してください(80)。 - - -復号化するために: - - +続いて、`out`を復号します。 ```c RsaKey rsaPrivateKey; -byte privateKeyBuffer[]={ /*hold the raw data from the key, maybe +byte privateKeyBuffer[] = { /*hold the raw data from the key, maybe from a file like RsaPrivateKey.der*/ }; -word32 idx=0; /*where to start reading into the buffer*/ +word32 idx = 0; /*where to start reading into the buffer*/ wc_RsaPrivateKeyDecode(privateKeyBuffer, &idx, &rsaPrivateKey, sizeof(privateKeyBuffer)); byte plain[128]; -word32 plainSz=wc_RsaPrivateDecrypt(out, outLen, plain, +word32 plainSz = wc_RsaPrivateDecrypt(out, outLen, plain, sizeof(plain), &rsaPrivateKey); ``` +これで、`plain`には`plainSz`バイトまたはエラーコードが含まれます。 +wolfCryptでの各タイプの完全な例については、ファイル`wolfcrypt/test/test.c`をご参照ください。 +[`wc_RsaPrivateKeyDecode`](group__RSA.md#function-wc_rsaprivatekeydecode)関数は、生の`DER`形式の鍵のみを受け入れます。 +### DH (Diffie-Hellman) -これで、`plain`は`plainSz`バイトまたはエラーコードを保持します。wolfcryptの各タイプの完全な例については、ファイル`wolfcrypt/test/test.c`を参照してください。[`wc_RsaPrivateKeyDecode`](group__RSA.md#function-wc_rsaprivatekeydecode)関数は、raw `DER`形式のキーのみを受け入れることに注意してください。 - - - -### DH(diffie-hellman) - - - -WolfCryptは、Header `wolfssl/wolfrypt/dh.h`を通じてDiffie-Hellmanのサポートを提供します。Diffie-HellmanキーExchangeアルゴリズムにより、2つの関係者が共有秘密キーを確立できるようになります。使用は通常、次の例に似ています。ここで、** sideA ** and ** sideB **は2つのパーティを指定します。 - - -次の例では、`dhPublicKey`には、認証局によって署名されたDiffie-Hellmanパブリックパラメータが含まれています(または自己署名)。`privA` SIDEAの生成された秘密鍵を保持し、`pubA`はSIDEAの生成された公開鍵を保持し、`agreeA`は両側が合意したとの相互鍵を保持しています。 - +wolfCryptはヘッダー`wolfssl/wolfrypt/dh.h`を通じてDiffie-Hellmanをサポートしています。 +Diffie-Hellman鍵交換アルゴリズムにより、2人の当事者間で共有秘密鍵を確立できます。 +使用方法は通常、次の例のようになります。 +ここで**sideA**と**sideB**は2つの当事者を示します。 +以下の例では、`dhPublicKey`には認証局によって署名された(または自己署名された)Diffie-Hellman公開パラメータが含まれています。 +`privA`はsideAに対して生成された秘密鍵、`pubA`はsideAに対して生成された公開鍵を保持します。 +`agreeA`は、両者が合意した相互鍵を保持します。 ```c DhKey dhPublicKey; -word32 idx=0; /*where to start reading into the +word32 idx = 0; /*where to start reading into the publicKeyBuffer*/ word32 pubASz, pubBSz, agreeASz; byte tmp[1024]; @@ -581,101 +478,76 @@ byte agreeA[128]; wc_InitDhKey(&dhPublicKey); -byte publicKeyBuffer[]={ /*holds the raw data from the public key +byte publicKeyBuffer[] = { /*holds the raw data from the public key parameters, maybe from a file like dh1024.der*/ } wc_DhKeyDecode(tmp, &idx, &dhPublicKey, publicKeyBuffer); wc_InitRng(&rng); /*Initialize random number generator*/ ``` - - -[`wc_DhGenerateKeyPair()`](group__Diffie-Hellman.md#function-wc_dhgeneratekeypair) DHPublickeyの初期パラメータに基づいて、パブリックおよびプライベートDHキーを生成します。 - - +[`wc_DhGenerateKeyPair()`](group__Diffie-Hellman.md#function-wc_dhgeneratekeypair)は、dhPublicKeyの初期公開パラメータに基づいて公開鍵と秘密鍵のDH鍵を生成します。 ```c wc_DhGenerateKeyPair(&dhPublicKey, &rng, privA, &privASz, pubA, &pubASz); ``` - - -SIDEBがSIDEAに公開鍵(`pubB`)を送信した後、SIDEAは[`wc_DhAgree()`](group__Diffie-Hellman.md#function-wc_dhagree)関数を使用して相互合意キー(`agreeA`)を生成できます。 - - +sideBが彼らの公開鍵(`pubB`)をsideAに送信した後、sideAは[`wc_DhAgree()`](group__Diffie-Hellman.md#function-wc_dhagree)関数を使用して相互に合意された鍵(`agreeA`)を生成できます。 ```c wc_DhAgree(&dhPublicKey, agreeA, &agreeASz, privA, privASz, pubB, pubBSz); ``` +これで、`agreeA`はsideAの相互に生成された鍵(サイズは`agreeASz`バイト)を保持します。 +同じプロセスがsideBでも行われています。 +wolfCryptでのDiffie-Hellmanの完全な実装例については、ファイル`wolfcrypt/test/test.c`をご参照ください。 -現在、`agreeA`は、SIDEAの相互に生成されたキー(サイズ`agreeASz`バイト)を保持しています。同じプロセスがSideBで行われます。 - - -WolfCryptのDiffie-Hellmanの完全な例については、ファイル`wolfcrypt/test/test.c`を参照してください。 - - - -### EDH(Ephemeral DIFFIE-HELLMAN) - - - -wolfSSLサーバーは、Ephemeral Diffie-Hellmanを行うことができます。この機能を追加するためにビルドの変更は必要ありませんが、アプリケーションはEDH暗号スイートを有効にするためにサーバー側に Ephemeral グループパラメーターを登録する必要があります。これを行うために新しいAPIを使用できます。 - +### EDH (Ephemeral Diffie-Hellman) +wolfSSLサーバーはEphemeral Diffie-Hellmanを実行できます。 +この機能を追加するためにビルドの変更は必要ありませんが、EDH暗号スイートを有効にするためにはサーバー側でアプリケーションが一時的なグループパラメータを登録する必要があります。 +これには、次のAPIを使用します。 ```c int wolfSSL_SetTmpDH(WOLFSSL* ssl, unsigned char* p, int pSz,unsigned char* g,int gSz); ``` +実装例として提供しているサーバーとechoserverは、`SetDH()`からこの関数を使用します。 +### DSA (デジタル署名アルゴリズム) -サンプルサーバーとecho サーバーは、この関数を`SetDH()`から使用しています。 - - - -### DSA(デジタル署名アルゴリズム) - - - -WolfCryptは、ヘッダー`wolfssl/wolfcrypt/dsa.h`を介してDSAおよびDSSのサポートを提供します。DSAは、特定のデータハッシュに基づいてデジタル署名を作成できます。DSAは、SHAハッシュアルゴリズムを使用してデータブロックのハッシュを生成し、署名者の秘密鍵を使用してハッシュする署名を生成します。標準的な使用法は、次のものと似ています。 - - -最初にDSAキー構造(`key`)を宣言し、署名される最初のメッセージ(`message`)を初期化し、DSAキーバッファ(`dsaKeyBuffer`)を初期化します(`dsaKeyBuffer`)。 - +wolfCryptはヘッダー`wolfssl/wolfcrypt/dsa.h`を通じてDSAとDSSをサポートしています。 +DSAは、与えられたデータハッシュに基づいてデジタル署名を作成することを可能にします。 +DSAはSHAハッシュアルゴリズムを使用してデータブロックのハッシュを生成し、その後署名者の秘密鍵を使用してそのハッシュに署名します。 +標準的な使用方法は次のようになります。 +まず、DSA鍵構造(`key`)を宣言し、署名される初期メッセージ(`message`)を初期化し、DSA鍵バッファ(`dsaKeyBuffer`)を初期化します。 ```c DsaKey key; -Byte message[] ={ /*message data to sign*/ } -byte dsaKeyBuffer[]={ /*holds the raw data from the DSA key, +Byte message[] = { /*message data to sign*/ } +byte dsaKeyBuffer[] = { /*holds the raw data from the DSA key, maybe from a file like dsa512.der*/ } ``` - - -次に、SHA構造(`sha`)、乱数ジェネレーター(`rng`)、SHAハッシュ(`hash`)を保存する配列、署名(`signature`)、`idx`を保存する配列を宣言します(`dsaKeyBuffer`で読み始める場所をマークするために)、検証後の戻り値を保持するためのint(`answer`)などがあります。 - - +次に、SHA構造体(`sha`)、乱数ジェネレータ(`rng`)、SHAハッシュを格納する配列(`hash`)、署名を格納する配列(`signature`)、`idx`(`dsaKeyBuffer`の読み込み開始位置を示す)、検証後の戻り値を保持するint型の変数(`answer`)を宣言します。 ```c Sha sha; RNG rng; byte hash[SHA_DIGEST_SIZE]; byte signature[40]; -word32 idx=0; +word32 idx = 0; int answer; ``` +SHAハッシュを設定して作成します。 +wolfCryptのSHAアルゴリズムの詳細については、本章の「SHA / SHA-224 / SHA-256 / SHA-384 / SHA-512」節をご参照ください。 - -SHAハッシュを設定して作成します。WolfCryptのSHAアルゴリズムの詳細については、[SHA/SHA-224/SHA-256/SHA-384/SHA-512](#sha-sha-224-sha-256-sha-384-sha-512)を参照してください.`message`のSHAハッシュは、変数`hash`に格納されています。 - - +`message`のSHAハッシュは、変数`hash`に格納されます。 ```c wc_InitSha(&sha); @@ -683,11 +555,7 @@ wc_ShaUpdate(&sha, message, sizeof(message)); wc_ShaFinal(&sha, hash); ``` - - -DSAキー構造を初期化し、構造のキー値に入力し、乱数ジェネレーター(`rng`)を初期化します。 - - +DSA鍵構造体を初期化し、構造体の鍵値を設定し、乱数ジェネレータ(`rng`)を初期化します。 ```c wc_InitDsaKey(&key); @@ -696,23 +564,18 @@ wc_DsaPrivateKeyDecode(dsaKeyBuffer, &idx, &key, wc_InitRng(&rng); ``` - - -[`wc_DsaSign()`](group__DSA.md#function-wc_dsasign)関数は、DSA秘密キー、ハッシュ値、および乱数ジェネレーターを使用して署名(`signature`)を作成します。 - - +[`wc_DsaSign()`](group__DSA.md#function-wc_dsasign)関数は、DSA秘密鍵、ハッシュ値、および乱数ジェネレータを使用して署名(`signature`)を作成します。 ```c wc_DsaSign(hash, signature, &key, &rng); ``` +署名を検証するには、[`wc_DsaVerify()`](group__DSA.md#function-wc_dsaverify)を使用します。 +検証が成功すると、`answer`は「**1**」となります。 - -署名を確認するには、[`wc_DsaVerify()`](group__DSA.md#function-wc_dsaverify)を使用します。検証が成功した場合、答えは「** 1 **」に等しくなります。終了したら、[`wc_FreeDsaKey()`](group__DSA.md#function-wc_freedsakey)を使用してDSAキー構造を解放します。 - - +完了したら、[`wc_FreeDsaKey()`](group__DSA.md#function-wc_freedsakey)を使用してDSA鍵構造体を解放します。 ```c wc_DsaVerify(hash, signature, &key, &answer); wc_FreeDsaKey(&key); -``` +``` \ No newline at end of file diff --git a/wolfSSL/src-ja/chapter11.md b/wolfSSL/src-ja/chapter11.md index db2ec1c9..5959b260 100644 --- a/wolfSSL/src-ja/chapter11.md +++ b/wolfSSL/src-ja/chapter11.md @@ -1,64 +1,46 @@ +# SSL/TLSチュートリアル +## はじめに -# SSLチュートリアル +wolfSSL組み込みSSL/TLSライブラリは、SSLとTLSを用いて通信セキュリティを強化するために、既存のアプリケーションやデバイスに簡単に統合できます。 +組み込みおよびRTOS環境を主な対象としており、優れたパフォーマンスを維持しながら最小限のフットプリントで動作します。 +wolfSSLの最小ビルドサイズは、選択されたビルドオプションと使用されるプラットフォームに応じて20〜100kBの範囲です。 +このチュートリアルの目的は、シンプルなアプリケーションへのSSLとTLSの統合を案内することです。 +このチュートリアルを通じて、SSL/TLSについての理解も深まることを期待しています。 +これからechoserverとechoclientという簡単な実装例を使用して、wolfSSLによりできるだけシンプルにアプリケーションにSSL/TLSサポートを追加する手順を示します。 +echoserverとechoclientの実装例は、Richard Stevens、Bill Fenner、Andrew Rudoffによる書籍[UNIXネットワークプログラミング、第1版、第3版](http://www.unpbook.com/)を参考にしています。 +このチュートリアルは、読者がGNU GCCコンパイラを使用したCコードの編集とコンパイルに慣れており、公開鍵暗号化の概念に精通していることを前提としています。 +書籍「UNIXネットワークプログラミング」へのアクセスは必要ではありません。 +### このチュートリアルで使用される例 -## 序章 +* echoclient - 図5.4、124ページ +* echoserver - 図5.12、139ページ +## SSL/TLSの簡単な概要 +**TLS**(Transport Layer Security)と**SSL**(Secure Sockets Layer)は、さまざまなトランスポートプロトコル間で安全な通信を可能にする暗号プロトコルです。 +主に使用されるトランスポートプロトコルはTCP/IPです。 +SSL/TLSの最新バージョンはTLS 1.3です。 +wolfSSLはSSL 3.0、TLS 1.0、1.1、1.2、1.3に加えてDTLS 1.0、1.2、1.3をサポートしています。 -wolfSSL(以前のCyassl)の組み込みSSLライブラリは、SSLとTLSを追加することで、通信セキュリティを強化するために既存のアプリケーションまたはデバイスに簡単に統合できます。wolfSSLは組み込み環境およびRTOS環境を対象としており、そのため優れた性能を維持しながら最小限のフットプリントを提供します。wolfSSLの最小ビルドサイズは、選択されたビルドオプションと使用されているプラットフォームに応じて20~100KBの間の範囲です。 +SSLとTLSはOSI参照モデルのトランスポート層とアプリケーション層の間に位置し、任意のプロトコル(TCP/IP、Bluetoothなど)が下層のトランスポート媒体として機能します。 +HTTPやFTP、SMTPなどのアプリケーションプロトコルは、SSLの上の層で構成されます。 +SSL/TLSがOSIモデルにどのように適合するかの図と、SSL/TLSハンドシェイクプロセスの簡単な図は、[付録D SSL/TLSの概要](appendix04.md)にあります。 +## ソースコードの入手 -このチュートリアルの目標は、SSLとTLSの統合を簡単なアプリケーションに統合することです。このチュートリアルを通過するプロセスが、一般的にSSLをよりよく理解するプロセスにつながることを願っています。このチュートリアルでは、SSLサポートをアプリケーションに追加する一般的な手順を実証しながら、シンプルなEchoServerおよびEchoClientの例と組み合わせてwolfSSLを使用して、可能な限りシンプルなものを保持します。EchoServerとEchoClientの例は、リチャード・スティーブンス、ビル・フェナー、アンドリュー・ルドフによる[UNIXネットワークプログラミング、第1版、第3版](http://www.unpbook.com/)というタイトルの人気の本から参考にしました。 - - -このチュートリアルでは、読み手がGNU GCCコンパイラを使用してCコードを編集してコンパイルすることで、公開鍵暗号化の概念に精通していることを前提としています。UNIXネットワークプログラミング本へのアクセスはこのチュートリアルには必要ありません。 - - - -### このチュートリアルで使用されている例 - - - - -* EchoClient - 図5.4、124ページ - - -* EchoServer - 図5.12、139ページ - - - - -## SSL/TLSのクイックサマリー - - - -** TLS ** (トランスポート層セキュリティ) と** SSL ** (Secure Sockets Layer) は、さまざまなトランスポートプロトコルにわたって安全な通信を可能にする暗号プロトコルです。使用されるプライマリトランスポートプロトコルはTCP/IPです。SSL/TLSの最新バージョンはTLS 1.3です。wolfSSLは、DTLS 1.0と1.2に加えて、SSL 3.0、TLS 1.0,1.1,1.2,1.3をサポートしています。 - - -SSLとTLSは、OSIモデルの輸送層とアプリケーション層の間にあり、そこでは任意の数のプロトコル(TCP/IP、Bluetoothなどを含む)が基礎となる輸送媒体として機能する場合があります。アプリケーションプロトコルはSSLの上に階層化されており、HTTP、FTP、SMTPなどのプロトコルを含めることができます。SSLがOSIモデルにどのように適合するかの図と、SSLハンドシェイクプロセスの簡単な図は、付録Aにあります。 - - - -## ソースコードを取得します - - - -このチュートリアルで使用されているすべてのソースコードは、特に次の場所からwolfSSLのWebサイトからダウンロードできます。このダウンロードには、このチュートリアルで使用されているEchoServerとEchoClientの両方の元のソースコードと完成したソースコードが含まれています。特定の内容がリンクの下にリストされています。 - - - - - -ダウンロードしたzipファイルには次のような構造があります。 +このチュートリアルで使用されるすべてのソースコードは、wolfSSLのウェブサイトからダウンロードできます。 +このZIPファイルには、このチュートリアルで使用するechoserverとechoclientの両方のオリジナルコードと、完成されたソースコードが含まれています。 + ```text /finished_src + /certs (Certificate files) /echoclient (Completed echoclient code) /echoserver (Completed echoserver code) /include (Modified unp.h) @@ -71,452 +53,377 @@ SSLとTLSは、OSIモデルの輸送層とアプリケーション層の間に README ``` +## 基本例の修正 +このチュートリアルとそれに付随するソースコードは、さまざまなプラットフォームに容易に移植できるように設計されています。 +そのため、またアプリケーションにSSLとTLSを追加する方法に焦点を当てるため、基本的な例はできるだけシンプルにしています。 +不必要な複雑さを取り除く、または動作させるプラットフォームの範囲を広げるために、Unixネットワークプログラミングに掲載の実装例にいくつかの修正が加えられています。 +このチュートリアルの移植性を高めるために何か他にできることがあると思われる場合は、[info@wolfssl.jp](mailto:info@wolfssl.jp)までお知らせください。 +以下は、上記の書籍に記載されているオリジナルのechoserverとechoclientの例に加えられた修正のリストです。 -## 基本変形例 - - - -このチュートリアルとそれに付随するソースコードは、プラットフォーム全体で可能な限りポータブルになるように設計されています。このため、またSSLとTLSをアプリケーションに追加する方法に焦点を合わせたいため、ベースの例は可能な限り単純に保たれています。不必要な複雑さを削除するか、サポートされているプラットフォームの範囲を増やすために、UNIXネットワークプログラミングから取得した例にいくつかの変更が加えられています。このチュートリアルの移植性を高めるためにできることがあると思われる場合は、[support@wolfssl.com](mailto:support@wolfssl.com)までお知らせください。 - - -以下は、上記の本に記載されている元のEchoServerとEchoClientな例に加えられた修正のリストです。 - - - -### EcheServerへの変更(tcpserv04.c) - - - - -* `fork()`がWindowsでサポートされていないため、`Fork()`関数への呼び出しを削除しました。この結果は、1つのクライアントのみを同時に受け入れるEchoServerです。この削除に加えて、信号処理が削除されました。 - - -* `str_echo()`機能を`str_echo.c`ファイルから`tcpserv04.c`ファイルに移動しました +### echoserver (tcpserv04.c) への修正 - -* Printfステートメントを追加して、クライアントアドレスと私たちが接続したポートを表示します。 - - - - - ```text +* `fork()`関数の呼び出しを削除しました。これは`fork()`がWindowsでサポートされていないためです。その結果、echoserverは同時に1つのクライアントのみを受け入れます。この削除に伴い、シグナル処理も削除しました。 +* `str_echo()`関数を`str_echo.c`ファイルから`tcpserv04.c`ファイルに移動しました +* クライアントのアドレスと接続ポートを表示するためにprintf文を追加しました。 + ```c printf("Connection from %s, port %d\n", inet_ntop(AF_INET, &cliaddr.sin_addr, buff, sizeof(buff)), ntohs(cliaddr.sin_port)); ``` +* リスニングソケットの作成後に「Address already in use」バインドエラーを排除するために、`setsockopt()`への呼び出しを追加しました。 +* 新しいコンパイラの警告をクリーンアップするための軽微な調整を行いました。 +### echoclient (tcpcli01.c) への修正 +* `str_cli()`関数を`str_cli.c`ファイルから`tcpcli01.c`ファイルに移動しました。 +* 新しいコンパイラの警告をクリーンアップするための軽微な調整を行いました。 +### unp.hヘッダーへの修正 -* リスニングソケットを作成した後、`setsockopt()`に呼び出しを追加して、「既に使用されているアドレス」バインドエラーを排除しました。 - - -* 新しいコンパイラの警告をクリーンアップするためのマイナーな調整 - - - - -### EchoClient(tcpcli01.c)の変更 - - - - -* `str_cli()`機能を`str_cli.c`ファイルから`tcpcli01.c`ファイルに移動しました - - -* 新しいコンパイラの警告をクリーンアップするためのマイナーな調整 - - - - -### Unp.hヘッダーへの変更 - +* このヘッダーは、この例に必要なもののみを含むように簡略化しました。 +これらのソースコード例では、特定の関数が大文字になっていることに注意してください。 +例えば、`Fputs()`や`Writen()`などです。 +Unixネットワークプログラミングの著者たちは、エラーチェックを明確に処理するために、通常の関数のためのカスタムラッパー関数を書いています。 +これについての詳細な説明は、_Unixネットワークプログラミング_の**セクション1.4**(11ページ)をご参照ください。 +## wolfSSLのビルドとインストール -* このヘッダーは、この例に必要なもののみを含むように簡素化されました。 +始める前に、上記の「ソースコードの入手」節を参照し、実装例のコード(`echoserver`と`echoclient`)をダウンロードしてください。 +このセクションでは、wolfSSL組み込みSSL/TLSライブラリをシステムにダウンロード、設定、インストールする方法について説明します。 +wolfSSLの最新バージョンをwolfSSLの[ダウンロードページ](https://www.wolfssl.jp/download/)からダウンロードしてインストールする必要があります。 +利用可能なビルドオプションの完全なリストについては、[第2章 wolfSSLのビルド](chapter02.md)をご参照ください。 +wolfSSLは移植性を念頭に置いて書かれており、ほとんどのシステムで簡単にビルドできるはずです。 +wolfSSLのビルドに問題がある場合は、wolfSSLの[製品サポートフォーラム](https://www.wolfssl.com/forums)でサポートを求めるか、[info@wolfssl.jp](mailto:info@wolfssl.jp)までお問い合わせください。。 -これらのソースコードの例では、特定の関数が大文字になっていることに注意してください。たとえば、`Fputs()`と`Writen()`の作者は、エラーチェックをきれいに処理するために、通常の関数にカスタムラッパー関数を書いています。これについてのより詳細な説明は、_unixネットワークプログラミング_書籍の** 1.4 **(11ページ)を参照してください。 - - - -## Wolfsslのビルドとインストール - - - -開始する前に、上記の[ソースコードを取得します](chapter03.md#getting-the-source-code)セクションからサンプルコード(`echoserver`および`echoclient`)をダウンロードしてください。このセクションでは、システムにwolfSSL埋め込みSSLライブラリをダウンロード、構成、インストールする方法について説明します。 - - -Wolfssl [ダウンロードページ](https://wolfssl.com/yaSSL/download/downloadForm.php)から最新バージョンのwolfSSLをダウンロードしてインストールする必要があります。 - - -利用可能なビルドオプションの完全なリストについては、「[Building Wolfssl](https://www.yassl.com/yaSSL/Docs-cyassl-manual-2-building-cyassl.html)ガイド」を参照してください。Wolfsslは移植性を念頭に置いて書かれており、ほとんどのシステムでビルドするのは一般的に簡単なべきです。Wolfsslをビルドするのが難しい場合は、Wolfssl [製品サポートフォーラム](https://www.wolfssl.com/forums)でのサポートをお気軽にお問い合わせください。 - - -Linux、* BSD、OS X、Solaris、またはその他の* NIXシステムのwolfSSLをビルドするときは、AutoConfシステムを使用できます。Windows固有の指示については、wolfSSLマニュアルの[Building Wolfssl](chapter02.md#building-wolfssl)セクションを参照してください。wolfSSLを設定してビルドするには、端末から次の2つのコマンドを実行します。任意のビルドオプションを`./configure`に追加することができます(ex:`./configure -–enable-opensslextra`)。 - +Linux、\*BSD、OS X、Solaris、またはその他の \*nixライクなシステムでwolfSSLをビルドする場合、autoconfシステムを使用できます。 +Windowsでの特定の指示については、wolfSSLマニュアルの[第2章 wolfSSLのビルド](chapter02.md)セクションをご参照ください。 +wolfSSLを設定してビルドするには、ターミナルから次の2つのコマンドを実行します。 +任意のビルドオプションを`./configure`に追加することもできます。 +(例:`./configure -–enable-opensslextra`) ```sh ./configure make ``` - - -wolfsslをインストールするには、実行してください。 - - +wolfSSLをインストールするには、以下を実行します。 ```sh sudo make install ``` - - -これにより、wolfSSLヘッダーは`/usr/local/include/wolfssl`に、wolfSSLライブラリはシステム上の`/usr/local/lib`にインストールされます。ビルドをテストするには、wolfSSLルートディレクトリからTestSuiteアプリケーションを実行します。 - - +これによりwolfSSLヘッダーが`/usr/local/include/wolfssl`に、wolfSSLライブラリが`/usr/local/lib`にインストールされます。 +ビルドをテストするには、wolfSSLのルートディレクトリからテストスイートアプリケーションを実行します。 ```sh ./testsuite/testsuite.test ``` - - -一連のテストがWolfCryptとwolfSSLで実行され、正しくインストールされていることが確認されます。TestSuiteアプリケーションの実行が成功した後、次のような出力が表示されるはずです。 - - +wolfCryptとwolfSSLに対して一連のテストが実行され、正しくインストールされたかテストされます。 +テストスイートアプリケーションを正常に実行できると、以下のような出力が表示されるはずです。 ```text +------------------------------------------------------------------------------ + wolfSSL version 5.7.0 +------------------------------------------------------------------------------ +error test passed! +MEMORY test passed! +base64 test passed! +asn test passed! +RANDOM test passed! MD5 test passed! SHA test passed! SHA-224 test passed! SHA-256 test passed! SHA-384 test passed! SHA-512 test passed! +SHA-512/224 test passed! +SHA-512/256 test passed! +SHA-3 test passed! +Hash test passed! HMAC-MD5 test passed! HMAC-SHA test passed! HMAC-SHA224 test passed! HMAC-SHA256 test passed! HMAC-SHA384 test passed! HMAC-SHA512 test passed! +HMAC-SHA3 test passed! +HMAC-KDF test passed! +PRF test passed! +TLSv1.3 KDF test passed! GMAC test passed! Chacha test passed! POLY1305 test passed! ChaCha20-Poly1305 AEAD test passed! AES test passed! +AES192 test passed! +AES256 test passed! AES-GCM test passed! -RANDOM test passed! RSA test passed! DH test passed! +PWDBASED test passed! ECC test passed! +logging test passed! +time test passed! +mutex test passed! +memcb test passed! +Test complete + +Running simple test SSL version is TLSv1.2 -SSL cipher suite is TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 SSL version is TLSv1.2 SSL cipher suite is TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 +SSL curve name is SECP256R1 +SSL cipher suite is TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 +SSL curve name is SECP256R1 Client message: hello wolfssl! -Server response: I hear you fa shizzle! +I hear you fa shizzle! + +Running TLS test sending server shutdown command: quit! client sent quit command: shutting down! -ciphers=DHE-RSA-AES128-SHA:DHE-RSA-AES256-SHA:ECDHE-RSA-AES128-SHA:ECDHE-RSA-AES256-SHA:ECDHE-ECDSA-AES128-SHA:ECDHE-ECDSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES256-SHA256:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-CHACHA20-POLY1305:ECDHE-ECDSA-CHACHA20-POLY1305:DHE-RSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305-OLD:ECDHE-ECDSA-CHACHA20-POLY1305-OLD:DHE-RSA-CHACHA20-POLY1305-OLD +ciphers = TLS13-AES128-GCM-SHA256:TLS13-AES256-GCM-SHA384:TLS13-CHACHA20-POLY1305-SHA256:DHE-RSA-AES128-SHA:DHE-RSA-AES256-SHA:ECDHE-RSA-AES128-SHA:ECDHE-RSA-AES256-SHA:ECDHE-ECDSA-AES128-SHA:ECDHE-ECDSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES256-SHA256:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-CHACHA20-POLY1305:ECDHE-ECDSA-CHACHA20-POLY1305:DHE-RSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305-OLD:ECDHE-ECDSA-CHACHA20-POLY1305-OLD:DHE-RSA-CHACHA20-POLY1305-OLD 33bc1a4570f4f1abccd5c48aace529b01a42ab51293954a297796e90d20970f0 input -33bc1a4570f4f1abccd5c48aace529b01a42ab51293954a297796e90d20970f0 /tmp/output-N0Xq9c +33bc1a4570f4f1abccd5c48aace529b01a42ab51293954a297796e90d20970f0 /var/folders/dy/888x7r7d6dgcqw4840l32tpw0000gp/T//testsuite-output-9Ymbuv All tests passed! ``` +wolfSSLがインストールされたので、実装例のコードにSSL/TLS機能を追加する修正を始めることができます。 +まずechoclientにSSL/TLSを追加し、その後echoserverに進みます。 +## 初回コンパイル -wolfSSLがインストールされたので、SSL機能を追加するためにサンプルコードの変更を開始できます。まず、SSLをEchoClientに追加し、その後EchoServerに移動することから始めます。 - - - -## 初期コンパイル - - - -SSLチュートリアルソースバンドルからEchoClientおよびEchoServerコードの例をコンパイルして実行するには、含まれているメイクファイルを使用できます。ディレクトリ(CD)をEchoClientまたはEchoServerディレクトリに変更して実行します。 - - +SSLチュートリアルのZIPファイルから実装例のechoclientとechoserverコードをコンパイルして実行するために、付属のMakefileを使用できます。 +echoclientまたはechoserverディレクトリに移動(`cd`)して、次のコマンドを実行します。 ```sh make ``` - - -これにより、サンプルコードがコンパイルされ、ビルドされているものに応じて、EchoServerまたはEchoClientという名前の実行可能ファイルが作成されます。MakeFileで使用されるGCCコマンドを以下に示します。付属のMakeFileを使用せずに例のいずれかを作成する場合は、ディレクトリをサンプルディレクトリに変更し、次のコマンドで`tcpcli01.c`(echoclient)または`tcpserv04.c`(echoserver)を置き換えます。例の正しいソースファイルを使用して: - - +これにより実装例のコードがコンパイルされ、ビルドされているものに応じてechoserverまたはechoclientという名前の実行可能ファイルが生成されます。 +Makefileで使用されるGCCコマンドは以下の通りです。 +提供されたMakefileを使用せずに実装例の1つをビルドする場合は、実装例のディレクトリに移動し、次のコマンドの`tcpcli01.c`(echoclient)または`tcpserv04.c`(echoserver)を正しいソースファイルに置き換えます。 ```sh gcc -o echoserver ../lib/*.c tcpserv04.c -I ../include ``` - - -これにより、現在の例が実行可能ファイルにコンパイルされ、「EchoServer」または「EchoClient」アプリケーションのいずれかが作成されます。コンパイルされた後に例の1つを実行するには、現在のディレクトリを目的の例ディレクトリに変更してアプリケーションを開始します。たとえば、Echoserverの使用を開始するには: - - +これにより、現在の実装例が実行可能ファイルにコンパイルされ、「echoserver」または「echoclient」アプリケーションが作成されます。 +コンパイル後に実装例の1つを実行するには、現在のディレクトリを目的の例のディレクトリに変更し、アプリケーションを起動します。 +例えば、echoserverを起動するには次を使用します。 ```sh ./echoserver ``` - - -ローカルホストのEchoClientをテストするために2番目のターミナルウィンドウを開くことができ、アプリケーションを起動するときにサーバーのIPアドレスを指定する必要があります。これは私たちの場合は127.0.0.1になります。現在のディレクトリを "EchoClient"ディレクトリに変更して、次のコマンドを実行します。エコーサーバーはすでに実行されている必要があります。 - - +ローカルホストでechoclientをテストするために、2つ目のターミナルウィンドウを開きます。 +アプリケーションを起動する際にはサーバーのIPアドレスを指定する必要があります。 +今回の場合では、`127.0.0.1`を指定します。 +現在のディレクトリを「echoclient」ディレクトリに変更(`cd`)し、次のコマンドを実行します。 +なお、echoserverはすでに実行されている必要があります。 ```sh ./echoclient 127.0.0.1 ``` - - -EchoServerとEchoClientの両方の実行を行うと、EchoServerはEchoClientから受け取る入力をエコーバックする必要があります。EchoServerまたはEchoClientのいずれかを終了するには、_CTRL + C_を使用してアプリケーションを終了します。現在、これら 2 つの例の間でやり取りされるデータは平文で送信されており、少しのスキルがあれば誰でも簡単にクライアントとサーバーの間に自分自身を挿入して通信を聞くことができます。 - - +echoserverとechoclientの両方が実行されている場合、echoserverはechoclientから受け取った入力をエコーバックするはずです。 +echoserverまたはechoclientを終了するには、_Ctrl + C_を使用します。 +現在、これらの2つの実装例の間で行き来しているエコーデータは平文で送信されています。 +わずかなスキルさえ持っていれば、誰でも簡単にクライアントとサーバーの間に介入して通信を傍受できてしまいます。 ## ライブラリ - - -wolfSSLライブラリは、一度コンパイルされると`libwolfssl`という名前であり、特に構成されていない限り、wolfSSLビルドおよびインストールプロセスは、次のディレクトリの下に共有ライブラリのみを作成します。適切なビルドオプションを使用して、共有ライブラリと静的ライブラリの両方を有効または無効にすることができます。 - - +コンパイルされたwolfSSLライブラリは`libwolfssl`と名付けられます。 +特に設定されていない限り、wolfSSLのビルドとインストールプロセスは、次のディレクトリの下に共有ライブラリのみを作成します。 +適切なビルドオプションを使用して、共有ライブラリと静的ライブラリの両方を有効または無効にすることができます。 ```sh /usr/local/lib ``` - - -私たちがする必要がある最初のステップは、wolfSSLライブラリを私たちのサンプルアプリケーションにリンクすることです。GCCコマンドの変更(例としてEchoServerを使用して)、次の新しいコマンドを参照してください。wolfSSLは標準的な場所にヘッダーファイルとライブラリをインストールするため、コンパイラは明示的な命令なしでそれらを見つけることができるはずです(`-l`または`-L`を使用)。`-lwolfssl`を使用することで、コンパイラは自動的に正しいタイプのライブラリ(静的または共有)を選択します。 - - +私たちが最初に行う必要があるのは、wolfSSLライブラリを私たちの実装例のアプリケーションにリンクすることです。 +GCCコマンドを修正(echoserverを例として使用)して、次の新しいコマンドを参照してください。 +wolfSSLはヘッダーファイルとライブラリを標準的な場所にインストールするため、コンパイラは明示的な指示(`-l`または`-L`を使用)なしにそれらを見つけることができるはずです。 +`-lwolfssl`を使用することにより、コンパイラは自動的に正しいタイプのライブラリ(静的または共有)を選択します。 ```sh gcc -o echoserver ../lib/*.c tcpserv04.c -I ../include -lm -lwolfssl ``` - - - ## ヘッダー - - -最初に行う必要があるのは、クライアントとサーバーの両方にwolfSSLネイティブAPIヘッダーを含めることです。クライアントの`tcpcli01.c`ファイルとサーバーのtcpserv04.cファイルで、上部近くに次の行を追加します。 - - +最初に行う必要があるのは、クライアントとサーバーの両方にwolfSSLネイティブAPIヘッダーを含めることです。 +クライアントの`tcpcli01.c`ファイルとサーバーの`tcpserv04.c`ファイルの上部に次の行を追加します。 ```c #include ``` - - - ## 起動/シャットダウン - - -コードでwolfSSLを使用する前に、ライブラリーと`WOLFSSL_CTX`を初期化する必要があります.wolfSSLは[`wolfSSL_Init()`](group__TLS.md#function-wolfssl_init)を呼び出して初期化されます。 - - -`WOLFSSL_CTX`構造(wolfSSLコンテキスト)には、証明書情報を含む各SSL接続のグローバル値が含まれています。単一の`WOLFSSL_CTX`は、作成された`WOLFSSL`オブジェクトの任意の数で使用できます。これにより、信頼できるCA証明書のリストなど、特定の情報を1回だけ読み込むことができます。 - - -新しい`WOLFSSL_CTX`を作成するには、[`wolfSSL_CTX_new()`](group__Setup.md#function-wolfssl_ctx_new)を使用します。この関数には、クライアントまたはサーバーが使用するSSLまたはTLSプロトコルを定義する引数が必要です。目的のプロトコルを選択するためのいくつかのオプションがあります。wolfSSLは現在、SSL 3.0、TLS 1.0、TLS 1.1、TLS 1.2、DTLS 1.0、およびDTLS 1.2をサポートしています。これらの各プロトコルには、[`wolfSSL_CTX_new()`](group__Setup.md#function-wolfssl_ctx_new)の引数として使用できる対応する関数があります。可能なクライアントとサーバーのプロトコルオプションを以下に示します。SSL 2.0は、数年間不安定であるため、wolfSSLによってサポートされていません。 - - -エコークライアント: - - - -* [`wolfSSLv3_client_method();`](group__Setup.md#function-wolfsslv3_client_method) -SSL 3.0 - - -* [`wolfTLSv1_client_method();`](group__Setup.md#function-wolftlsv1_client_method) - TLS 1.0 - - -* [`wolfTLSv1_1_client_method();`](group__Setup.md#function-wolftlsv1_1_client_method) -TLS 1.1 - - -* [`wolfTLSv1_2_client_method();`](group__Setup.md#function-wolftlsv1_2_client_method) - TLS 1.2 - - -* [`wolfSSLv23_client_method();`](group__Setup.md#function-wolfsslv23_client_method) - SSLv3から可能な最高版を使用する - TLS 1.2 - - -* [`wolfDTLSv1_client_method();`](group__Setup.md#function-wolfdtlsv1_client_method) -DTLS 1.0 - - -* [`wolfDTLSv1_2_client_method_ex();`](ssl_8h.md#function-wolfdtlsv1_2_client_method_ex) -DTLS 1.2 - - - -エコーサーバー: - - - -* [`wolfSSLv3_server_method();`](group__Setup.md#function-wolfsslv3_server_method) - SSLv3 - - -* [`wolfTLSv1_server_method();`](group__Setup.md#function-wolftlsv1_server_method) - TLSv1 - - -* [`wolfTLSv1_1_server_method();`](group__Setup.md#function-wolftlsv1_1_server_method) -TLSV1.1 - - -* [`wolfTLSv1_2_server_method();`](group__Setup.md#function-wolftlsv1_2_server_method) -TLSV1.2 - - -* [`wolfSSLv23_server_method();`](group__Setup.md#function-wolfsslv23_server_method)-クライアントがTLSV1+に接続できるようにします - - -* [`wolfDTLSv1_server_method();`](group__Setup.md#function-wolfdtlsv1_server_method) - DTLS. - - -* [`wolfDTLSv1_2_server_method();`](ssl_8h.md#function-wolfdtlsv1_2_server_method) -DTLS 1.2 - - - -EchoClientがEchoServerに接続すると、CA(認証局)証明書を`WOLFSSL_CTX`にロードする必要があります。サーバーの身元を確認することができます。CA証明書を`WOLFSSL_CTX`にロードするには、[`wolfSSL_CTX_load_verify_locations()`](group__CertsKeys.md#function-wolfssl_ctx_load_verify_locations)を使用します。この関数には、`WOLFSSL_CTX`ポインタ、証明書ファイル、およびパス値の3つの引数が必要です。パス値は、PEM形式でCA証明書を含むべきディレクトリを指します。証明書を検索するとき、wolfsslはパスの場所を見る前に証明書ファイルの値を調べます。この場合、CAファイルを1つ指定するため、証明書パスを指定する必要はありません - パス引数に値0を使用します。[`wolfSSL_CTX_load_verify_locations`](group__CertsKeys.md#function-wolfssl_ctx_load_verify_locations)関数は`SSL_SUCCESS`または`SSL_FAILURE`のいずれかを返します。 - - +コード内でwolfSSLを使用する前に、ライブラリと`WOLFSSL_CTX`を初期化する必要があります。 +wolfSSLは[`wolfSSL_Init()`](group__TLS.md#function-wolfssl_init)を呼び出すことによって初期化されます。 +これはライブラリを使用して他のことを行う前に、必ず実行する必要があります。 + +## WOLFSSL_CTXファクトリ + +`WOLFSSL_CTX`構造体(wolfSSL Context)には、証明書情報を含む各SSL/TLS接続のグローバルな値が含まれます。 +単一の`WOLFSSL_CTX`は、作成された任意の数の`WOLFSSL`オブジェクトで使用できます。 +これにより、信頼されたCA証明書のリストなどの特定の情報を、一度だけロードして使用できます。 + +新しい`WOLFSSL_CTX`を作成するには、[`wolfSSL_CTX_new()`](group__Setup.md#function-wolfssl_ctx_new)を使用します。 +この関数は、クライアントまたはサーバーが使用するSSL/TLSプロトコルを定義する引数を必要とします。 +目的のプロトコルを選択するためのいくつかのオプションがあります。 +wolfSSLは現在、SSL 3.0、TLS 1.0、TLS 1.1、TLS 1.2、TLS 1.3、DTLS 1.0、DTLS 1.2、DTLS 1.3をサポートしています。 +これらの各プロトコルには、[`wolfSSL_CTX_new()`](group__Setup.md#function-wolfssl_ctx_new)の引数として使用できる対応する関数があります。 +使用可能なクライアントとサーバーのプロトコルオプションを以下に示します。 +SSL 2.0は数年間不安定であるため、wolfSSLではサポートしていません。 + +EchoClient: + +* [`wolfSSLv3_client_method();`](group__Setup.md#function-wolfsslv3_client_method) - SSL 3.0 +* [`wolfTLSv1_client_method();`](group__Setup.md#function-wolftlsv1_client_method) - TLS 1.0 +* [`wolfTLSv1_1_client_method();`](group__Setup.md#function-wolftlsv1_1_client_method) - TLS 1.1 +* [`wolfTLSv1_2_client_method();`](group__Setup.md#function-wolftlsv1_2_client_method) - TLS 1.2 +* [`wolfTLSv1_3_client_method();`](group__Setup.md#function-wolftlsv1_3_client_method) - TLS 1.3 +* [`wolfSSLv23_client_method();`](group__Setup.md#function-wolfsslv23_client_method) - SSL 3.0からTLS 1.3までの最高バージョンを使用 +* [`wolfDTLSv1_client_method();`](group__Setup.md#function-wolfdtlsv1_client_method) - DTLS 1.0 +* [`wolfDTLSv1_2_client_method_ex();`](ssl_8h.md#function-wolfdtlsv1_2_client_method_ex) - DTLS 1.2 +* [`wolfDTLSv1_3_client_method_ex();`](ssl_8h.md#function-wolfdtlsv1_3_client_method_ex) - DTLS 1.3 + +EchoServer: + +* [`wolfSSLv3_server_method();`](group__Setup.md#function-wolfsslv3_server_method) - SSL 3.0 +* [`wolfTLSv1_server_method();`](group__Setup.md#function-wolftlsv1_server_method) - TLS 1.0 +* [`wolfTLSv1_1_server_method();`](group__Setup.md#function-wolftlsv1_1_server_method) - TLS 1.1 +* [`wolfTLSv1_2_server_method();`](group__Setup.md#function-wolftlsv1_2_server_method) - TLS 1.2 +* [`wolfTLSv1_3_server_method();`](group__Setup.md#function-wolftlsv1_3_server_method) - TLS 1.3 +* [`wolfSSLv23_server_method();`](group__Setup.md#function-wolfsslv23_server_method) - クライアントがTLS 1.0+で接続するのを許可 +* [`wolfDTLSv1_server_method();`](group__Setup.md#function-wolfdtlsv1_server_method) - DTLS 1.0 +* [`wolfDTLSv1_2_server_method();`](ssl_8h.md#function-wolfdtlsv1_2_server_method) - DTLS 1.2 +* [`wolfDTLSv1_3_server_method();`](ssl_8h.md#function-wolfdtlsv1_3_server_method) - DTLS 1.3 + +echoclientがechoserverに接続するとき、サーバーの識別情報を確認できるように、CA(認証局)証明書を`WOLFSSL_CTX`にロードする必要があります。 +`WOLFSSL_CTX`にCA証明書をロードするには、[`wolfSSL_CTX_load_verify_locations()`](group__CertsKeys.md#function-wolfssl_ctx_load_verify_locations)を使用します。 +この関数は、`WOLFSSL_CTX`ポインタ、証明書ファイル、パス値の3つの引数を必要とします。 +パス値はPEM形式のCA証明書を含むべきディレクトリを指します。 +証明書を検索するとき、wolfSSLはパスの場所を見る前に証明書ファイルの値を調べます。 +この場合、1つのCAファイルを指定するためパスを指定する必要はありません。 +したがって、パス引数には0を使用します。 +[`wolfSSL_CTX_load_verify_locations`](group__CertsKeys.md#function-wolfssl_ctx_load_verify_locations)関数は`SSL_SUCCESS`または`SSL_FAILURE`のいずれかを返します。 ```c wolfSSL_CTX_load_verify_locations(WOLFSSL_CTX* ctx, const char* file, const char* path) ``` +これらのことをまとめると(ライブラリの初期化、プロトコルの選択、CA証明書)、次のようになります。 +ここでは、TLS 1.2を使用することにします。 - -これらのものをまとめる(ライブラリの初期化、プロトコルの選択、CA証明書)、次のことがあります。ここでは、TLS 1.2を使用することを選択します。 - - -エコーコイエント: - - +EchoClient: ```c - WOLFSSL_CTX* ctx; - - wolfSSL_Init();/* Initialize wolfSSL */ - - /* Create the WOLFSSL_CTX */ - if ( (ctx=wolfSSL_CTX_new(wolfTLSv1_2_client_method())) == NULL){ - fprintf(stderr, "wolfSSL_CTX_new error.\n"); - exit(EXIT_FAILURE); - } - - /* Load CA certificates into WOLFSSL_CTX */ - if (wolfSSL_CTX_load_verify_locations(ctx,"../certs/ca-cert.pem",0) != - SSL_SUCCESS) { - fprintf(stderr, "Error loading ../certs/ca-cert.pem, please check - the file.\n"); - exit(EXIT_FAILURE); - } -``` - +WOLFSSL_CTX* ctx; +wolfSSL_Init();/* Initialize wolfSSL */ -エコーサーバー: +/* Create the WOLFSSL_CTX */ +if ( (ctx = wolfSSL_CTX_new(wolfTLSv1_2_client_method())) == NULL) { + fprintf(stderr, "wolfSSL_CTX_new error.\n"); + exit(EXIT_FAILURE); +} +/* Load CA certificates into WOLFSSL_CTX */ +if (wolfSSL_CTX_load_verify_locations(ctx,"../certs/ca-cert.pem",0) != + SSL_SUCCESS) { + fprintf(stderr, "Error loading ../certs/ca-cert.pem, please check" + "the file.\n"); + exit(EXIT_FAILURE); +} +``` -`WOLFSSL_CTX`に証明書をロードする場合、CA証明書に加えてサーバー証明書とキーファイルをロードする必要があります。これにより、サーバーは識別検証のためにクライアントに証明書を送信できます。 +上記のコードを`tcpcli01.c`の`main()`内の、「ユーザーが引数としてIPアドレスを渡してクライアントを起動したかのチェック」の後に追加します。 +EchoServer: +`WOLFSSL_CTX`に証明書をロードする場合、CA証明書に加えてサーバー証明書と鍵ファイルをロードする必要があります。 +これにより、サーバーはクライアントに識別情報確認のための証明書を送信できるようになります。 ```c - WOLFSSL_CTX* ctx; +WOLFSSL_CTX* ctx; - wolfSSL_Init(); /* Initialize wolfSSL */ +wolfSSL_Init(); /* Initialize wolfSSL */ - /* Create the WOLFSSL_CTX */ - if ( (ctx=wolfSSL_CTX_new(wolfTLSv1_2_server_method())) == NULL){ - fprintf(stderr, "wolfSSL_CTX_new error.\n"); - exit(EXIT_FAILURE); - } +/* Create the WOLFSSL_CTX */ +if ( (ctx = wolfSSL_CTX_new(wolfTLSv1_2_server_method())) == NULL) { + fprintf(stderr, "wolfSSL_CTX_new error.\n"); + exit(EXIT_FAILURE); +} - /* Load CA certificates into CYASSL_CTX */ - if (wolfSSL_CTX_load_verify_locations(ctx, "../certs/ca-cert.pem", 0) != - SSL_SUCCESS) { - fprintf(stderr, "Error loading ../certs/ca-cert.pem, " - "please check the file.\n"); - exit(EXIT_FAILURE); - } +/* Load CA certificates into WOLFSSL_CTX */ +if (wolfSSL_CTX_load_verify_locations(ctx, "../certs/ca-cert.pem", 0) != + SSL_SUCCESS) { + fprintf(stderr, "Error loading ../certs/ca-cert.pem, " + "please check the file.\n"); + exit(EXIT_FAILURE); +} /* Load server certificates into WOLFSSL_CTX */ - if (wolfSSL_CTX_use_certificate_file(ctx,"../certs/server-cert.pem", - SSL_FILETYPE_PEM) != SSL_SUCCESS){ - fprintf(stderr, "Error loading ../certs/server-cert.pem, please - check the file.\n"); - exit(EXIT_FAILURE); - } - - /* Load keys */ - if (wolfSSL_CTX_use_PrivateKey_file(ctx,"../certs/server-key.pem", - SSL_FILETYPE_PEM) != SSL_SUCCESS){ - fprintf(stderr, "Error loading ../certs/server-key.pem, please check - the file.\n"); - exit(EXIT_FAILURE); - } -``` - - - -上記のコードは、変数定義の両方がIPアドレス(クライアント)を持つクライアントを起動したチェックの後、`tcpcli01.c`および`tcpserv04.c`の最初に追加されるべきです。完成したコードのバージョンは、参照用のSSLチュートリアルZIPファイルに含まれています。 - +if (wolfSSL_CTX_use_certificate_file(ctx,"../certs/server-cert.pem", + SSL_FILETYPE_PEM) != SSL_SUCCESS) { + fprintf(stderr, "Error loading ../certs/server-cert.pem, please" + "check the file.\n"); + exit(EXIT_FAILURE); +} -WOLFSSLと`WOLFSSL_CTX`が初期化されているので、アプリケーションがSSL/TLSを使用して完全に行われたときに`WOLFSSL_CTX`オブジェクトとwolfSSLライブラリが解放されていることを確認してください。クライアントとサーバーの両方で、`main()`関数の最後に次の2行を配置する必要があります(クライアント内のクライアント内の`exit()`まで)。 +/* Load keys */ +if (wolfSSL_CTX_use_PrivateKey_file(ctx,"../certs/server-key.pem", + SSL_FILETYPE_PEM) != SSL_SUCCESS) { + fprintf(stderr, "Error loading ../certs/server-key.pem, please check" + "the file.\n"); + exit(EXIT_FAILURE); +} +``` +上記のコードは、`tcpserv04.c`の変数定義の後の`main()`の先頭に追加する必要があります。 +完成したバージョンのコードは、SSLチュートリアルのZIPファイルに含まれています。 +必要に応じて参照してください。 +wolfSSLと`WOLFSSL_CTX`が初期化されたら、アプリケーションがSSL/TLSの使用を完全に終了したときに`WOLFSSL_CTX`オブジェクトとwolfSSLライブラリが解放されるようにしてください。 +クライアントとサーバーの両方で、以下の2行を`main()`関数の最後(クライアントでは`exit()`の呼び出しの直前)に配置する必要があります。 ```c wolfSSL_CTX_free(ctx); wolfSSL_Cleanup(); ``` +## WOLFSSLオブジェクト +### EchoClient - -## wolfsslオブジェクト - - - - -### ech - - - -各TCP Connectの後にwolfSSLオブジェクトを作成する必要があり、ソケットファイル記述子をセッションに関連付ける必要があります。EchoClientの例では、`Connect()`への呼び出し後にこれを行います。 - - +TCP接続の後に`WOLFSSL`オブジェクトを作成し、ソケットファイルディスクリプタをセッションに関連付ける必要があります。 +echoclientの実装例では、以下に示す`Connect()`の呼び出しの後にこれを行います。 ```c /* Connect to socket file descriptor */ Connect(sockfd, (SA *) &servaddr, sizeof(servaddr)); ``` - - -接続直後に、[`wolfSSL_new()`](group__Setup.md#function-wolfssl_new)関数を使用して新しい`WOLFSSL`オブジェクトを作成します。ここの関数は、成功した場合は `WOLFSSL` オブジェクトへのポインタを返し、失敗した場合は `NULL` を返します。その後、ソケットファイル記述子(`sockfd`)を新しい`WOLFSSL`オブジェクト(`ssl`)に関連付けることができます。 - - +接続直後に、[`wolfSSL_new()`](group__Setup.md#function-wolfssl_new)関数を使用して新しい`WOLFSSL`オブジェクトを作成します。 +この関数は成功した場合は`WOLFSSL`オブジェクトへのポインタを返し、失敗した場合は`NULL`を返します。 +その後、ソケットファイルディスクリプタ(`sockfd`)を新しい`WOLFSSL`オブジェクト(`ssl`)に関連付けることができます。 ```c /* Create WOLFSSL object */ WOLFSSL* ssl; -if( (ssl=wolfSSL_new(ctx)) == NULL) { +if( (ssl = wolfSSL_new(ctx)) == NULL) { fprintf(stderr, "wolfSSL_new error.\n"); exit(EXIT_FAILURE); } @@ -524,25 +431,19 @@ if( (ssl=wolfSSL_new(ctx)) == NULL) { wolfSSL_set_fd(ssl, sockfd); ``` - - -ここで注目すべきことの 1 つは、[`wolfSSL_connect()`](group__IO.md#function-wolfssl_connect) 関数を呼び出していないことです。[`wolfSSL_connect()`](group__IO.md#function-wolfssl_connect)はサーバーとのSSL/TLSハンドシェイクを開始し、以前に呼び出されていなかった場合は[`wolfSSL_read()`](group__IO.md#function-wolfssl_read)の処理中で呼び出されます。この例の場合、[`wolfSSL_read()`](group__IO.md#function-wolfssl_read)がそれを行ってくれるので、明示的に[`wolfSSL_connect()`](group__IO.md#function-wolfssl_connect)を呼びません。 - - +ここで注目すべき点は、[`wolfSSL_connect()`](group__IO.md#function-wolfssl_connect)関数を呼び出していないことです。 +[`wolfSSL_connect()`](group__IO.md#function-wolfssl_connect)はサーバーとのSSL/TLSハンドシェイクを開始し、以前に呼び出されていなかった場合は[`wolfSSL_read()`](group__IO.md#function-wolfssl_read)中に呼び出されます。 +今回、明示的に[`wolfSSL_connect()`](group__IO.md#function-wolfssl_connect)を呼び出すのではなく、最初の[`wolfSSL_read()`](group__IO.md#function-wolfssl_read)にそれを行わせています。 ### EchoServer - - -メインメソッドのforループの最後に、wolfSSLオブジェクトを挿入し、クライアントと同様に、ソケットファイル記述子(`connfd`)を`WOLFSSL`オブジェクト(`ssl`)に関連付けます。 - - +mainメソッドのforループの最後で`WOLFSSL`オブジェクトを挿入し、ソケットファイルディスクリプタ(`connfd`)を`WOLFSSL`オブジェクト(`ssl`)に関連付けます。 ```c /* Create WOLFSSL object */ WOLFSSL* ssl; -if ( (ssl=wolfSSL_new(ctx)) == NULL) { +if ( (ssl = wolfSSL_new(ctx)) == NULL) { fprintf(stderr, "wolfSSL_new error.\n"); exit(EXIT_FAILURE); } @@ -550,72 +451,43 @@ if ( (ssl=wolfSSL_new(ctx)) == NULL) { wolfSSL_set_fd(ssl, connfd); ``` +繰り返しになりますが、TCP接続の後に`WOLFSSL`オブジェクトを作成し、ソケットファイルディスクリプタをセッションに関連付ける必要があります。 +## データの送受信 -各TCP Connectの後にwolfSSLオブジェクトを作成する必要があり、ソケットファイル記述子をセッションに関連付ける必要があります。 - - -[`wolfSSL_new()`](group__Setup.md#function-wolfssl_new)関数を使用して、新しいwolfSSLオブジェクトを作成します。この関数は、成功した場合は `WOLFSSL` オブジェクトへのポインタを返し、失敗した場合は `NULL` を返します。その後、ソケットファイル記述子(`sockfd`)を新しい`WOLFSSL`オブジェクト(`ssl`)に関連付けることができます。 - - - -```c -/* Create WOLFSSL object */ -WOLFSSL* ssl; - -if( (ssl=wolfSSL_new(ctx)) == NULL) { - fprintf(stderr, "wolfSSL_new error.\n"); - exit(EXIT_FAILURE); -} - -wolfSSL_set_fd(ssl, sockfd); -``` - - - - -## データの送信/受信 - - - - -### EchoClientで送信します - - - -次のステップは安全にデータの送信を開始することです。echoclient の例では、`main()` 関数が送受信作業を `str_cli()` に渡すことに注意してください。`str_cli()`関数は、私たちの関数で置き換えが行われます。最初に`str_cli()`のオブジェクトにアクセスする必要があるため、別の引数を追加してSSL変数を`str_cli()`に渡します.`WOLFSSL`オブジェクトは`str_cli()`関数の内部で使用されるため、`sockfd`パラメーターを削除します。この変更後の新しい`str_cli()`関数シグネチャを以下に示します。 - +### EchoClientでの送信 +次のステップは、データを安全に送信し始めることです。 +echoclientの例では、`main()`関数が送受信処理を`str_cli()`に渡していることに注意してください。 +`str_cli()`関数は、私たちの関数で置き換えるところです。 +まず、`str_cli()`関数で`WOLFSSL`オブジェクトにアクセスする必要があるため、引数を追加して`ssl`変数を`str_cli()`に渡します。 +`WOLFSSL`オブジェクトが`str_cli()`関数内で使用されるようになるため、`sockfd`パラメータを削除します。 +この修正を行った新しい`str_cli()`関数のプロトタイプを以下に示します。 ```c void str_cli(FILE *fp, WOLFSSL* ssl) ``` - - -`main()`関数では、新しい引数(`ssl`)が`str_cli()`に渡されます。 - - +`main()`関数では、新しい引数(`ssl`)が`str_cli()`に渡されます。 ```c str_cli(stdin, ssl); ``` +`str_cli()`関数内では、`Writen()`と`Readline()`を[`wolfSSL_write()`](group__IO.md#function-wolfssl_write)と[`wolfSSL_read()`](group__IO.md#function-wolfssl_read)関数の呼び出しに置き換え、元のソケットファイルディスクリプタ(`sockfd`)の代わりに`WOLFSSL`オブジェクト(`ssl`)を使用します。 +新しい`str_cli()`関数を以下に示します。 +[`wolfSSL_write`](group__IO.md#function-wolfssl_write)と[`wolfSSL_read`](group__IO.md#function-wolfssl_read)の呼び出しが成功したかどうかを確認する必要があることに注意してください。 -`str_cli()`の内部では、`Writen()`と`Readline()`の内側に[`wolfSSL_write()`](group__IO.md#function-wolfssl_write)および[`wolfSSL_read()`](group__IO.md#function-wolfssl_read)の関数への呼び出しに置き換えられ、元のファイル記述子の代わりに`WOLFSSL`オブジェクト(`ssl`)が使用されます(`sockfd`)。新しい`str_cli()`関数を以下に示します。[`wolfSSL_write`](group__IO.md#function-wolfssl_write)と[`wolfSSL_read`](group__IO.md#function-wolfssl_read)へのコールが成功したかどうかを確認する必要があることに注意してください。 - - -UNIXプログラミングブックの著者は、それが交換された後に補う必要がある`Writen()`関数にエラーチェックを書きました。New Int変数`n`を追加し、戻り値[`wolfSSL_read`](group__IO.md#function-wolfssl_read)を監視し、バッファの内容を印刷する前にRecvline、Readデータの終わりに`\0`がマークされています。 - - +Unixプログラミングの著者たちは、`Writen()`関数にエラーチェックを組み込んでいたため、それが置き換えられた後にその分を補う必要があります。 +新しいint変数`n`を追加して[`wolfSSL_read`](group__IO.md#function-wolfssl_read)の戻り値を監視し、バッファの内容`recvline`を出力する前に、読み込んだデータの末尾を`\0`でマークします。 ```c void str_cli(FILE *fp, WOLFSSL* ssl) { char sendline[MAXLINE], recvline[MAXLINE]; - int n=0; + int n = 0; while (Fgets(sendline, MAXLINE, fp) != NULL) { @@ -624,20 +496,17 @@ str_cli(FILE *fp, WOLFSSL* ssl) err_sys("wolfSSL_write failed"); } - if ((n=wolfSSL_read(ssl, recvline, MAXLINE)) <= 0) + if ((n = wolfSSL_read(ssl, recvline, MAXLINE)) <= 0) err_quit("wolfSSL_read error"); - recvline[n]='\0'; + recvline[n] = '\0'; Fputs(recvline, stdout); } } ``` - - -最後に行うことは、WOLFSSL オブジェクトの使用が完全に終わったら、オブジェクトを解放することです。`main()`関数では、`WOLFSSL_CTX`を解放する前の行の直前に、[`wolfSSL_free()`](group__Setup.md#function-wolfssl_free)を呼び出します。 - - +最後に行うことは、完全に終了するときに`WOLFSSL`オブジェクトを解放することです。 +`main()`関数内の`WOLFSSL_CTX`を解放する行の直前に、[`wolfSSL_free()`](group__Setup.md#function-wolfssl_free)を呼び出します。 ```c str_cli(stdin, ssl); @@ -647,26 +516,19 @@ wolfSSL_CTX_free(ctx); /* Free WOLFSSL_CTX object */ wolfSSL_Cleanup(); /* Free wolfSSL */ ``` +### EchoServerでの受信 - - -### EchoServerで受信します - - - -エコー サーバーは読み書きを処理するために `str_echo()` を呼び出します (一方、クライアントは `str_cli()` を呼び出します)。クライアントと同様に、sockfdパラメーターを関数シグネチャの`WOLFSSL`オブジェクト(`ssl`)パラメーターに置き換えて、`str_echo()`を変更します。 - - +エコーサーバーは読み取りと書き込みを処理するために`str_echo()`を呼び出します。 +(クライアントでは`str_cli()`を呼び出しました。) +クライアントと同様に、sockfdパラメータを`WOLFSSL`オブジェクト(`ssl`)パラメータに置き換えて`str_echo()`を修正します。 ```c void str_echo(WOLFSSL* ssl) ``` - - -[`wolfSSL_read()`](group__IO.md#function-wolfssl_read)および[`wolfSSL_write()`](group__IO.md#function-wolfssl_write)関数の呼び出しに、`Read()`および`Writen()`への呼び出しを置き換えます。戻り値のエラーチェックを含む変更された`str_echo()`関数を以下に示します。`read()`から[`wolfSSL_read()`](group__IO.md#function-wolfssl_read)への変更に対応するために、変数`n`のタイプは`ssize_t`から`int`に変更されたことに注意してください。 - - +`Read()`と`Writen()`の呼び出しを[`wolfSSL_read()`](group__IO.md#function-wolfssl_read)と[`wolfSSL_write()`](group__IO.md#function-wolfssl_write)関数への呼び出しに置き換えます。 +戻り値のエラーチェックを含む、修正された`str_echo()`関数を以下に示します。 +`read()`から[`wolfSSL_read()`](group__IO.md#function-wolfssl_read)への変更に対応するため、変数`n`のタイプが`ssize_t`から`int`に変更されていることに注意してください。 ```c void @@ -675,24 +537,21 @@ str_echo(WOLFSSL* ssl) int n; char buf[MAXLINE]; - while ( (n=wolfSSL_read(ssl, buf, MAXLINE)) > 0) { + while ( (n = wolfSSL_read(ssl, buf, MAXLINE)) > 0) { if(wolfSSL_write(ssl, buf, n) != n) { err_sys("wolfSSL_write failed"); } } if( n < 0 ) - printf("wolfSSL_read error=%d\n", wolfSSL_get_error(ssl,n)); + printf("wolfSSL_read error = %d\n", wolfSSL_get_error(ssl,n)); else if( n == 0 ) printf("The peer has closed the connection.\n"); } ``` - - -`main()`では、FORループの最後に`str_echo()`関数を呼び出します(whileループに変更されます)。この関数の後、ループ内で、`WOLFSSL`オブジェクトを解放してCONNFDソケットを閉じるように呼び出します。 - - +`main()`でforループ(すぐにwhileループに変更される)の最後に`str_echo()`関数を呼び出します。 +この関数の後、ループ内で`WOLFSSL`オブジェクトを解放し`connfd`ソケットを閉じる呼び出しを行います。 ```c str_echo(ssl); /* process the request */ @@ -701,37 +560,24 @@ wolfSSL_free(ssl); /* Free WOLFSSL object */ Close(connfd); ``` - - -呼び出しの前に`ctx`とクリーンアップを解放します。 - - +exitの呼び出しの前に、必ず`ctx`を解放してクリーンアップします。 ## シグナル処理 +### Echoclient / Echoserver +echoclientとechoserverでは、ユーザーが「Ctrl+C」を使用してアプリを閉じる場合のシグナルハンドラを追加する必要があります。 +エコーサーバーは継続的にループで実行されています。 +このため、ユーザーが「Ctrl+C」を押したときにそのループを中断する手段を実装する必要があります。 +これを行うにはまず、終了変数(`cleanup`)が`true`に設定されたときに終了するwhileループに変更する必要があります。 - -### エコリエント /EchoServer - - - -ecoclientおよびecheCoserverでは、「Ctrl+C」を使用してユーザーがアプリを閉じるときの信号ハンドラーを追加する必要があります。Echoサーバーは、ループで継続的に実行されています。このため、ユーザーが「Ctrl+C」を押すと、そのループを抜け出す方法を提供する必要があります。これを行うには、最初に行う必要があることは、exit変数(クリーンアップ)がtrueに設定されたときに終了する場合に、ループを時間ループに変更することです。 - - -まず、`#include`ステートメントの直後に、`tcpserv04.c`の上部にあるクリーンアップという新しい静的INT変数を定義します。 - - +`tcpserv04.c`の`#include`文の直後に、`cleanup`という新しいstatic int変数を定義します。 ```c static int cleanup; /* To handle shutdown */ ``` - - -EchoServerループをforループからしばらくのループに変更して、EchoServerループを変更します。 - - +echoserverループをforループからwhileループに変更します。 ```c while(cleanup != 1) @@ -740,106 +586,74 @@ while(cleanup != 1) } ``` - - -EchoServerの場合、ハンドラが終了した後に信号が処理される前に実行されていたコールの再起動からオペレーティングシステムを無効にする必要があります。これらを無効にすると、信号が処理された後、オペレーティングシステムは`accept()`への呼び出しを再開しません。これをしなかった場合は、EchoServerがリソースを整理して終了する前に、他のクライアントが接続して切断するのを待つ必要があります。シグナルハンドラを定義して`SA_RESTART`をオフにするには、最初にEchoServerの`main()`関数内のACTとOACT構造を定義します。 - - +echoserverではハンドラが終了した後、シグナルが処理される前に実行していた呼び出しをOSが再開してしまわないようにする必要があります。 +これを無効にすることで、シグナルが処理された後、OSは`accept()`への呼び出しを再開しません。 +これを行わなければ、echoserverがリソースをクリーンアップして終了する前に、別のクライアントが接続してしまい、これを切断するのを待たなければならなくなってしまいます。 +シグナルハンドラを定義し`SA_RESTART`をオフにするには、まずechoserverの`main()`関数に`act`と`oact`の構造体を定義します。 ```c struct sigaction act, oact; ``` - - -メイン関数の[`wolfSSL_Init()`](group__TLS.md#function-wolfssl_init)への呼び出しの前に、変数宣言の後に次のコードを挿入します。 - - +変数宣言の後、main関数の[`wolfSSL_Init()`](group__TLS.md#function-wolfssl_init)の呼び出しの前に以下のコードを挿入します。 ```c /* Signal handling code */ struct sigaction act, oact; /* Declare the sigaction structs */ -act.sa_handler=sig_handler; /* Tell act to use sig_handler */ +act.sa_handler = sig_handler; /* Tell act to use sig_handler */ sigemptyset(&act.sa_mask); /* Tells act to exclude all sa_mask * * signals during execution of * * sig_handler. */ -act.sa_flags=0; /* States that act has a special * +act.sa_flags = 0; /* States that act has a special * * flag of 0 */ sigaction(SIGINT, &act, &oact); /* Tells the program to use (o)act * * on a signal or interrupt */ ``` - - -EchoserverのSig_Handler関数を以下に示します。 - - +echoserverの`sig_handler`関数を以下に示します。 ```c void sig_handler(const int sig) { printf("\nSIGINT handled.\n"); - cleanup=1; + cleanup = 1; return; } ``` +以上で、echoclientとechoserverでTLSv1.2が有効になりました。 +私たちが行ったことは、以下のとおりです。 -それだけです - EchoClientとEchoServerは、TLSV1.2で有効になりました!! - - -我々のしたこと: - - - -* wolfSSLのヘッダーをインクルードします - - -* wolfSSLを初期化します - - -* 使用したいプロトコルを選択した`WOLFSSL_CTX`構造を作成しました - - -* データの送信と受信に使用する`WOLFSSL`オブジェクトを作成しました - - -* [`wolfSSL_write()`](group__IO.md#function-wolfssl_write)および[`wolfSSL_read()`](group__IO.md#function-wolfssl_read)に`Writen()`および`Readline()`に通話を置き換えました - - -* `WOLFSSL`及び`WOLFSSL_CTX`を開放します - - -* シグナルハンドラでクライアントとサーバーのシャットダウンを処理していることを確認してください - - - -SSL接続の動作を設定および制御するための多くの局面や方法があります。詳細については、追加のwolfSSLのマニュアルとリソースを参照してください。 - - -もう一度、完成したソースコードは、このセクションの上部にあるダウンロードしたZIPファイルにあります。 +* wolfSSLヘッダーをインクルード +* wolfSSLを初期化 +* 使用したいプロトコルを選択した`WOLFSSL_CTX`構造体を作成 +* データの送受信に使用する`WOLFSSL`オブジェクトを作成 +* `Writen()`と`Readline()`の呼び出しを[`wolfSSL_write()`](group__IO.md#function-wolfssl_write)と[`wolfSSL_read()`](group__IO.md#function-wolfssl_read)に置き換え +* `WOLFSSL`、`WOLFSSL_CTX`を解放 +* シグナルハンドラでクライアントとサーバーのシャットダウンを確実に処理 +SSL接続の動作を設定および制御するための多くの側面とメソッドがあります。 +より詳細な情報については、wolfSSLドキュメントをご参照ください。 +繰り返しになりますが、完成したソースコードはこのセクションの先頭でダウンロードしたZIPファイルにあります。 ## 証明書 +テスト目的では、wolfSSLが提供する証明書を使用できます。 +これらはwolfSSLのダウンロードに含まれており、特にこのチュートリアルでは、`finished_src`フォルダで見つけることができます。 +本番アプリケーションでは、信頼できる認証局から正確で正当な証明書を取得する必要があります。 -テストのために、wolfSSLが提供する証明書を使用できます。これらはwolfSSLのダウンロードに記載されており、特にこのチュートリアルについては、`finished_src`フォルダーにあります。 - - -生産アプリケーションの場合、信頼できる証明書当局から正しい正当な証明書を取得する必要があります。 - - - -## 結論 - - - -このチュートリアルは、wolfSSL組み込みSLライブラリを簡単なクライアントおよびサーバーアプリケーションに統合するプロセスを進めました。この例は単純ですが、SSLまたはTLSを独自のアプリケーションに追加するために同じ原則を適用することができます。wolfSSL組み込みSSLライブラリは、サイズと速度の両方で最適化されたコンパクトで効率的なパッケージで必要なすべての機能を提供します。 +## まとめ +このチュートリアルでは、wolfSSL組み込みSSL/TLSライブラリを、簡単なクライアントとサーバーアプリケーションに統合するプロセスを説明しました。 +この例はシンプルですが、ご自身のアプリケーションにSSL/TLSを追加するために同じ手順を適用できます。 +wolfSSL組み込みSSL/TLSライブラリは、サイズと速度の両方に最適化されたコンパクトで効率的なパッケージで、必要とするすべての機能を提供します。 -GPLV2および標準的な商用ライセンスの下でデュアルライセンスを取得しているため、wolfSSLソースコードを当社のWebサイトから直接ダウンロードできます。サポートフォーラム()にお気軽に投稿してください。当社の製品の詳細については、[info@wolfssl.com](mailto:info@wolfssl.com)にお問い合わせください。 +GPLv2と標準的な商用ライセンスのデュアルライセンスで提供しているため、ウェブサイトから直接wolfSSLのソースコードをダウンロードできます。 +質問やコメントがあれば、サポートフォーラム()に投稿してください。 +製品についての詳細情報が必要な場合は、[info@wolfssl.jp](mailto:info@wolfssl.jp)までお問い合わせください。 -このSSLチュートリアルにあるフィードバックを歓迎します。より便利、理解しやすい、またはよりポータブルにするために、改善または強化できると思われる場合は、[support@wolfssl.com](mailto:support@yassl.com)でお知らせください。 +このSSL/TLSチュートリアルに関するフィードバックを歓迎します。 +より有用にしたり、理解しやすくしたり、移植性を高めるために改善や強化できると思われる場合は、[support@wolfssl.com](mailto:support@wolfssl.com)までお知らせください。 diff --git a/wolfSSL/src-ja/chapter16.md b/wolfSSL/src-ja/chapter16.md index e762a452..3c4b3277 100644 --- a/wolfSSL/src-ja/chapter16.md +++ b/wolfSSL/src-ja/chapter16.md @@ -1,4 +1,4 @@ -# wolfSSL(旧称:Cyassl)の更新 +# wolfSSLのアップデート ## 製品のリリース情報