wolfssl ユーザ・マニュアル...visual sturdio によるビルドについては、” wolfssl...

148
wolfSSL ユーザ・マニュアル この資料は wolfSSL User Manual, Version 3122 第1章から第11章の日本語翻訳版です

Upload: others

Post on 17-Jun-2020

3 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: wolfSSL ユーザ・マニュアル...Visual Sturdio によるビルドについては、” wolfSSL with Visual Studio” により詳細な説 明があります。 VS2008:Visual

wolfSSL ユーザ・マニュアル (この資料は wolfSSL User Manual, Version 3.12.2

第1章から第11章の日本語翻訳版です)

Page 2: wolfSSL ユーザ・マニュアル...Visual Sturdio によるビルドについては、” wolfSSL with Visual Studio” により詳細な説 明があります。 VS2008:Visual

i © 2004 - 2019 wolfSSL, Inc.

目次

はじめに 1

wolfSSL のビルド 2

wolfSSL ソースコードの入手 2

*nix 系でのビルド 3

Windows 上でのビルド 4

(組込みシステム向け)非標準環境でのビルド 5

ビルド・オプション 17

クロス・コンパイル 34

使用方法 37

全体説明 37

テスト・スイート 37

クライアントの例 38

サーバーの例 42

EchoServer の例 42

EchoClient の例 43

ベンチマーク 44

クライアント・アプリケーションを wolfSSL 用に修正 48

サーバ・アプリケーションを wolfSSL 用に変更 50

機能 52

概要 52

プロトコル・サポート 52

暗号化サポート 55

ハードウェア高速暗号 68

SSL 検査(Sniffer) 70

圧縮 71

事前共有鍵 72

クライアント認証 73

Server Name Indication (SNI) 74

ハンドシェイク修正 75

切り詰めた(Truncated) HMAC 75

ユーザー定義暗号モジュール 76

Page 3: wolfSSL ユーザ・マニュアル...Visual Sturdio によるビルドについては、” wolfSSL with Visual Studio” により詳細な説 明があります。 VS2008:Visual

ii © 2004 - 2019 wolfSSL, Inc.

wolfSSL内での耐タイミング性 78

移植性 79

抽象化レイヤー 79

サポートするオペレーティング・システム 82

サポートするチップ・メーカー 82

C#ラッパー 83

コールバック 84

ハンドシェイク・コールバック 84

タイムアウト・コールバック 84

ユーザー定義のアトミック・レコード層処理 86

公開鍵コールバック 87

鍵と証明書 90

サポートするフォーマットとサイズ 90

証明書のロード 90

証明書チェーンの検証 92

サーバー証明書のドメイン名チェック 93

ファイル・システム無しでの証明書使用 94

シリアル番号のリトリーブ 95

RSA 鍵生成 95

証明書の生成 97

証明書署名要求の作成 100

生 ECC 鍵への変換 102

デバッグ 104

デバッグとログ 104

エラー・コード 104

ライブラリ設計 106

ライブラリー・ヘッダー 106

開始と終了 106

構造体の使用 106

スレッド安全性 107

入力と出力バッファ 108

wolfCrypt 使用方法 109

ハッシュ関数 109

鍵付きハッシュ関数 112

Page 4: wolfSSL ユーザ・マニュアル...Visual Sturdio によるビルドについては、” wolfSSL with Visual Studio” により詳細な説 明があります。 VS2008:Visual

iii © 2004 - 2019 wolfSSL, Inc.

ブロック暗号 113

ストリーム暗号 116

公開鍵暗号 119

SSLチュートリアル 124

はじめに 124

SSL/TLSの概要 125

ソースコードの取得 125

基本となるサンプルの修正 126

wolfSSLのビルドとインストール 127

最初のコンパイル 129

ライブラリ 130

ヘッダー 131

スタートアップとシャットダウン 131

wolfSSL オブジェクト 134

データの送受信 136

シグナル処理 138

証明書 140

まとめ 140

Appendix これまでの TLS と TLS 1.3 の比較 141

図表目次

図 1 暗号間での相対性能グラフ 46

表 1 コンフィグレーション・オプション一覧 25 表 2 クロス・コンパイル例 36 表 3 相対ビットと鍵強度表 57 表 4 ビット強度の説明 57 表 5 wolfSSL 暗号化スイート 61

Page 5: wolfSSL ユーザ・マニュアル...Visual Sturdio によるビルドについては、” wolfSSL with Visual Studio” により詳細な説 明があります。 VS2008:Visual

1 © 2004 - 2019 wolfSSL, Inc.

はじめに

このマニュアルは wolfSSL(旧 CyaSSL)組込み向け SSL ライブラリのテクニカルガイ

ドです。wolfSSL のビルド方法、使い方、wolfSSL の機能概説、移植性強化点、サポ

ートその他を解説します。

wolfSSL を選択する理由

組込み向けソリューションとして wolfSSL を選択する理由はたくさんあります。簡単

には、まずメモリーサイズ(wolfSSL は 20-100 kバイトのサイズでビルド可能で

す)、そして最新の標準への準拠(TLS1.1 1.2、1.3 と DTLS1.2)、新しい暗号サポー

ト(ストリーム型暗号を含む)、多数のプラットフォーム、ロイヤルティー・フリー、ま

た古いアプリケーションの容易な移植を実現する OpenSSL 互換 API などなど。完全な

機能リストについて、セッション 4.1 を参照してください。

Page 6: wolfSSL ユーザ・マニュアル...Visual Sturdio によるビルドについては、” wolfSSL with Visual Studio” により詳細な説 明があります。 VS2008:Visual

2 © 2004 - 2019 wolfSSL, Inc.

wolfSSL のビルド

wolfSSL(旧 CyaSSL)はポータビリティに配慮してコーディングされており、ほとんどのシ

ステムに対して容易にビルドすることができるはずです。wolfSSL のビルドに関してお困

りの点などございましたら、遠慮なくサポートフォーラム

( http://www.wolfssl.com/forums ) または[email protected] に直接お問い合わせくだ

さい。

本章では Unix や Windows で wolfSSL をビルドする方法を解説するとともに、組み込み

プラットフォームなど非標準環境での wolfSSL ビルドについても触れています 。第3章使

用方法、第11章 wolfSSL SSL チュートリアルも合わせて参照してください。

Autoconf/automake システムを使って wolfSSL をビルドする場合は、wolfSSL は一つの

Makefile を使ってライブラリのすべてのパーツやサンプル・プログラムをビルドします。

この方法は Makefile を再帰的に使用するよりシンプルかつ高速です。

wolfSSL ソースコードの入手

wolfSSL の最新版は wolfSSL ウェブサイトの下記ページから ZIP ファイルでダウンロード

することができます。

https://www.wolfssl.jp/download/

ZIP ファイルをダウンロード後、unzip コマンドで unzip します。ネイティブの行端コー

ドを使用するために unzip を使用する場合は ”-a” オプションをオンにします。Unzip のマ

ニュアルページから “-a” オプションの機能について引用します。

“-a オプションは zip でテキストファイルに指定されたファイルに対して(zipinfo リスティ

ングで、”b”ではなく ”t“ラベルのもの)以下のような形で自動的に抽出します。(例え

ば、Unix ファイルは行端(EOL)にラインフィード(LF)を使用し、ファイル末尾

(EOF)には何もなし、アップル OS ではEOL には改行(CR)、またほとんどの PC オ

ペレーティング・システムでは EOL に CR+LF を使用します。加えて、IBM メインフレ

ームやミシガン端末システムではより普及している ASCII コードではなく EBCDIC を、

Page 7: wolfSSL ユーザ・マニュアル...Visual Sturdio によるビルドについては、” wolfSSL with Visual Studio” により詳細な説 明があります。 VS2008:Visual

3 © 2004 - 2019 wolfSSL, Inc.

NT では Unicode をサポートします。)”

注:wolfSSL2.0.0rc3 以降では標準のインストール場所とともにディレクトリー構造が変更

となっています。これらの変更は wolfSSL のオープンソース・プロジェクトへの統合を容

易にするためのものす。さらに詳細のヘッダーと構造変更については、本マニュアルのセ

クション9.1および9.3を参照してください。

*nix 系でのビルド

Linux、各種 BSD、OS X、Solaris またはその他の*nix ライクのシステム上でのwolfSSL

のビルドでは autconf システムを使用してください。wolfSSL をビルドするためにはたっ

た二つのコマンドが必要なだけです:

./configure

make

./configure コマンドには各種のオプションを指定することができます。利用可能なオプシ

ョンについては 2.5 章を参照するか、下記のようにヘルプを実行してください。

./configure --help

wolfSSL をビルドするには make コマンドを実行します。

make

wolfSSL をインストールするためには下記のコマンドを実行してください:

make install

インストールのためにはスーパーユーザの権限が必要かもしれません。その場合はコマン

ドの直前に sudo をつけて実行します。

sudo make install

Page 8: wolfSSL ユーザ・マニュアル...Visual Sturdio によるビルドについては、” wolfSSL with Visual Studio” により詳細な説 明があります。 VS2008:Visual

4 © 2004 - 2019 wolfSSL, Inc.

ビルドをテストするためには、wolfSSL ソース・ディレクトリーの root から testsuite プ

ログラム実行します:

./testsuite/testsuite.test

または、testsuite とともに標準の wolfSSL API と暗号アルゴリズムのテストも実行するた

めには下記のようにコマンドを実行します。

make test

testsuite の期待される出力に関してさらに詳細はユーザ・マニュアルの 3.2 を参照してく

ださい。wolfSSL ライブラリだけをビルド、追加のものが無い場合(例えば testsuite,

benchmark app など)は wolfSSL root ディレクトリーで以下のコマンドを実行すること

も可能です。

make src/libwolfssl.la

Windows 上でのビルド

Visual Sturdio によるビルドについては、” wolfSSL with Visual Studio” により詳細な説

明があります。

VS2008:Visual Studio2008 用のソリューションは wolfSSL の root ディレクトリーに格

納されています。Visual Studio2010 ないしそれ以降のバージョンを使用する場合、プロジ

ェクト・ファイルはインポート処理により変換されます。

注意:

Visual Studio の新しいバージョンにインポートする場合、プロジェクトとインポートされ

るプロパティ・シートを上書きするか聞かれます。「いいえ」を選択することで以下を 回

避することができます。「はい」を選択すると、SAFESEH 仕様の為

EDITANDCONTINUE の警告が無視されることになります。 testsuite, sslSniffer, server,

echoserver, echoclient と client をそれぞれ右クリックして Properties→Configuration

Properties→Linker→Advanced を探します。Advanced ウインドウを一番下までスクロー

Page 9: wolfSSL ユーザ・マニュアル...Visual Sturdio によるビルドについては、” wolfSSL with Visual Studio” により詳細な説 明があります。 VS2008:Visual

5 © 2004 - 2019 wolfSSL, Inc.

ルして、” Image Has Save Exception Handlers” の右端のドロップダウンをクリックし、

No (SAFESEH:NO) を選択します。これを前述の各々に対して行います。

VS2010: 一旦更新されてから、wolfSSL をビルドするために Service Pack 1 をダウンロー

ドする必要があります。もし VS がリンカーエラーを出力するようなら、プロジェクトをク

リーンして、プロジェクトを Rebuild すれば、リンカーエラーは修正されます。

VS2013(64 ビットソリューション): 一旦更新されてから、wolfSSL をビルドするために

Service Pack 4 をダウンロードする必要があります。VS がリンカーエラーを出力するよう

なら、プロジェクトを Rebuild すれば、リンカーエラーは修正されます。

それぞれのビルドをテストするには、Vidual Studio メニューの”Build ALL” を選択し、そ

れから testsuite プログラムを実行します。Visual Studio プロジェクトのビルド・オプシ

ョンをエディットするには、所定のプロジェクト(wolsssl, echoclient, echoserve など) を

選択して、Properties パネルを見てください。

Cygwin:Cygwin を使用する場合、または、その他の *nix ライクのコマンドを提供する

Windows 上のツールセットを使用する場合は、上記セクション2. “ *nix 上でのビル

ド” を参照してください。Windows 開発環境上での Windows 用の wolfSSL ビルドには、

同梱の Visual Studio の使用をお勧めします。

(組込みシステム向け)非標準環境でのビルド

正式サポートではありませんが、wolfSSL を非標準の環境、特に組込み向けのクロスコ

ンパイルシステムでビルドしようと思われる方々をできる限りお手伝いします。以下は、

こ の環境での作業開始のための注意点です。

ソースファイルとヘッダーファイルを wolfSSL ダウンロード・パッケージ内のディレク

トリー構成と同じに保つようにして、適当な格納ディレクトリーにコピーしてください。

開発環境によってはヘッダーファイルの格納場所を明示的に指定する必要がある場合があ

ります。ヘッダーファイルは<wolfssl_root>/wolfssl ディレクトリーにあります。通

常、インクルード・バスに<wolfssl_root>ディレクトリーを追加することでヘッダー・

Page 10: wolfSSL ユーザ・マニュアル...Visual Sturdio によるビルドについては、” wolfSSL with Visual Studio” により詳細な説 明があります。 VS2008:Visual

6 © 2004 - 2019 wolfSSL, Inc.

パスは解決するはずです。

wolfSSL のデフォルトは、configure コマンド処理でビッグエンディアンを検出しない

限りリトルエンディアンです。非標準環境のユーザーは configure コマンドを使用して

いないので、ビッグエンディアンのシステムを使用する場合は

BIG_ENDIAN_ORDER を定義する必要があります。

wolfSSL は 64 ビット型を有効利用して高速化します。configure コマンド処理を使用

している場合は long か long long が 、64bitかどうか判定し、定義を設定します。非標

準環境のユーザーはターゲット・システムで sizeof(long)が8バイトならば、

SIZEOF_LONG 8 を定義してください。もしそうでなく sizeof(long long)が8バイト

の場合は、SIZEOF_LONG_LONG 8 を定義してください。

ライブラリのビルドで何か問題があった場合は [email protected] に日本語でご連絡くだ

さい。

ビルドを修正できる定義については以下のサブセクションに掲載されています。各オ プシ

ョンのさらに詳しい説明は 2.5.1 ビルドオプション・ノートで後述します。

機能の削除

以下の定義を使用して wolfSSL の機能を削除することができます。これはライブラリ

全体の所要サイズを減らそうとするのに役立ちます。NO_<機能名> を定義することに

加え、対応するソースファイルをビルドから取り除くこともできます(ただし、ヘッダー

ファイルを除く)。

NO_WOLFSSL_CLIENT はクライアント向け固有の関数呼び出しを削除します。これ

はサーバーのみのビルドのためのものです。これはサイズ削減のためにいくつかの呼び出

しを、取り除きたい場合のみに使用してください。

NO_WOLFSSL_SERVER は同様にサーバー向け固有の関数呼び出しを削除します。

NO_DES3 は DES3 暗号化を削除します。DES3 は古いサーバーで要求される場合が

あり、SSL3.0 要件でもあるので、デフォルトで組み込まれます。

Page 11: wolfSSL ユーザ・マニュアル...Visual Sturdio によるビルドについては、” wolfSSL with Visual Studio” により詳細な説 明があります。 VS2008:Visual

7 © 2004 - 2019 wolfSSL, Inc.

NO_DH と NO_AES は上記と同じですが、広く使用されています。

NO_DSA は DSA を削除します。DSA は次第に使用されなくなりつつあります。

NO_ERROR_STRINGS エラー文字列を無効化します。エラー文字列は wolfSSL 用の

ものが src/internal.c に、wolfCrypt 用のものが wolfcrypt/src/error.c にあります。

NO_HMAC は HMAC をビルドから取り除きます。

NO_MD4 は MD4 をビルドから取り除きます。MD4 はすでに解読されているので、

使用すべきではありません。

NO_MD5 は MD5 をビルドから取り除きます。

NO_SHA256 は SHA-256 をビルドから取り除きます。

NO_PSK は事前共有鍵の使用をオフにします。これはデフォルトで組み込みです。

NO_PWDBASED は PBKDF1、 PDKDF2、また PCKS#12 の BKDF などパスワー

ド・ベース鍵導出関数を無効化します。

NO_RC4 はストリーム暗号化 ARC4 をビルドから取り除きます。ARC4 は現在も広く

使われているので、デフォルトで組込みです。

NO_RABBIT と NO_HC128 はストリーム暗号化の拡張をビルドから取り除きま

す。

NO_SESSION_CACHE はセッション・キャッシュが不要の場合、定義することがで

きます。これにより 3kB 近くのメモリ使用が削減されるはずです。

NO_TLS は TLS をオフにしますが、オフにすることはお勧めしません。

SMALL_SESSION_CACHE は、wolfSSL で使用するセッション・キャッシュのサイズを

Page 12: wolfSSL ユーザ・マニュアル...Visual Sturdio によるビルドについては、” wolfSSL with Visual Studio” により詳細な説 明があります。 VS2008:Visual

8 © 2004 - 2019 wolfSSL, Inc.

制限するのに使用することが出来ます。このオプションを設定するとデフォルトのセッシ

ョン・キャッシュを 33 セッションから 6 セッションへ削減し、約 2.5 kB を節約します。

WC_NO_RSA_OAEP は OAEP パディングのためのコードを取り除きます。

NO_AES_128、NO_AES_192、NO_AES_256 は、AESの鍵サイズをコンパイル時に選択

可能です。各定義を指定することで特定の鍵サイズをビルドから取り除きます。

NO_AESGCM_AEAD は、AES-GCMの暗号スイートをビルドから取り除きます。

NO_ASN は、ビルドから ASN.1 を取り除きます

NO_ASN_TIME は、全ての証明書の有効期間確認を無効にします。

NO_BIG_INT は、ビルドから巨大整数演算を取り除きます。

NO_CERTS は、証明書証明・認証に関する機能をビルドから取り除きます。

NO_CHAPOL は、ビルドから ChaCha 及び Poly1305 の暗号スイートを取り除きます。

NO_OLD_TLS は、TLS 1.1 以前のプロトコルのサポートを無効にします。

NO_RSA_BOUNDS_CHECK は、NIST 800-56Bで推奨されるRSA 鍵生成における境界チ

ェックを行いません。

NO_SHA512 は、ビルドから SHA512 を取り除きます。

NO_SKID は、ビルドから証明書の主体者鍵識別子( Subject Key ID) を取り除きます。

NO_WOLFSSL_MEMORY は、メモリーコールバックをビルドから取り除きます。

Page 13: wolfSSL ユーザ・マニュアル...Visual Sturdio によるビルドについては、” wolfSSL with Visual Studio” により詳細な説 明があります。 VS2008:Visual

9 © 2004 - 2019 wolfSSL, Inc.

デフォルトで無効の機能を有効にする

WOLFSSL_CERT_GEN は wolfSSL の証明書生成機能を有効にします。詳細は本マニュア

ルの第7章を参照してください。

WOLFSSL_DER_LOAD はwolfSSL_CTX_der_load_veryfiy_locations()関数を使用して

wolfSSL コンテクスト(WOLFSSL_CTX)に DER フォーマットの CA 証明書をロード可能

にします。

WOLFSSL_DTLS は DTLS(データグラム TLS)を有効にします。これは広くサポートさ

れておらず、または使用されていないので、デフォルトはオフとなっています。

WOLFSSL_KEY_GEN は wolfSSL の RSA 鍵生成機能を有効にします。詳しい情報は本マ

ニュアル第7章を参照してください。

WOLFSSL_RIPEMD は RIPEMD-160 サポートを有効にします。

WOLFSSL_SHA384 は SHA-384 サポートを有効にします。

WOLFSSL_SHA512 は SHA-512 サポートを有効にします。

DEBUG_WOLFSSL はデバッグ・モードでビルドします。wolfSSL のデバッグについては

本マニュアル第8章を参照してください。この機能はデフォルトではオフです。

HAVE_AESCCM は AES-CCM サポートを有効にします。

HAVE_AESGCM は AES-GCM サポートを有効にします。

HAVE_CAMELLIA は Camellia サポートを有効にします。

HAVE_CHACHA は ChaCha20 サポートを有効にします。

HAVE_POLY1305 は Poly1305 サポートを有効にします。

Page 14: wolfSSL ユーザ・マニュアル...Visual Sturdio によるビルドについては、” wolfSSL with Visual Studio” により詳細な説 明があります。 VS2008:Visual

10 © 2004 - 2019 wolfSSL, Inc.

HAVE_CRL は証明書失効リスト(CRL)サポートを有効にします。

HAVE_CRL_IO は、CRL URL のインライン HTTP 要求をブロック出来ます。これは、

CRL を WOLFSSL_CTX にロードし、それから作成されたすべてのWOLFSSLオブジェク

トに適用します。

HAVE_ECC は楕円曲線暗号化 (ECC)サポートを有効にします。

HAVE_LIBZ はコネクション時のデータ圧縮を可能にする拡張です。デフォルトでは無効

で、通常は使用すべきでありません。後述のビルド・オプション注意点の libz の項目を参

照してください。

HAVE_OCSP はオンライン証明書ステータス確認プロトコル(OCSP)サポートを有効にし

ます。

OPENSSL_EXTRA はライブラリにさらなる OpenSSL 互換性を組込み、wolfSSL を

OpenSSL で動作するよう設計された既存アプリケーションに移植容易にする

wolfSSL、OpenSSL 互換性レイヤーを有効にします。この機能はデフォルトでは無効

です。OpenSSL 互換レイヤーが有効な場合、OpenSSL ネイティブな定義名を

wolfSSL 定義済み名前に関連付けます。例えば、SHA1 を wolfSSL_SHA1 に関連付け

ます。これらの関連付けにより名前の衝突を回避し、 OpenSSL 既存定義名でのアクセ

スが可能となります。定義名の関連付けは、オプション定義により詳細に制御可能です

が通常は使用しません。詳細を確認したい場合は、[email protected] までお知らせくだ

さい。

TEST_IPV6 はアプリケーションのテストにおいて IPv6 のテストを有効にします。

wolfSSL 自身は IP 中立ですが、デフォルトでは IPv4 を使用したアプリケーションを

テストします。

HAVE_CSHARP は C#ラッパーに必要なコンフィグレーション・オプションを有効化し

ます。

CURVED25519_SMALL は curve25519 と ed25519 の両方に対してメモリ使用量を抑えま

す。これはメモリ使用量とスピードのトレードオフです。

Page 15: wolfSSL ユーザ・マニュアル...Visual Sturdio によるビルドについては、” wolfSSL with Visual Studio” により詳細な説 明があります。 VS2008:Visual

11 © 2004 - 2019 wolfSSL, Inc.

HAVE_CURVE25519 は curve25519 を有効化します。

HAVE_ED25519 は ed25519 を有効化します。

WOLFSSL_DH_CONST はディフィー・ヘルマン処理時の浮動小数点の使用をオフにし、

POW と LOG のためのテーブルを使用します。外部数学ライブラリへの依存を取り除きま

す。

WOLFSSL_TRUST_PEER_CERT は、信頼する相手方の証明書の使用を有効化します。

これによって、CA 証明書ではなく相手方の証明書をロードして接続に対して照合します。

有効化された場合、相手方証明書チェーンがロードされていなくても、信頼する相手方の

証明書がマッチすれば、認証されたとして扱います。この機能はデフォルトではオフにな

っており、CA 証明書を使うことをお勧めします。

WOLFSSL_STATIC_MEMORY は静的メモリ・バッファーの使用と関数を有効化しま

す。これによって、動的ではなく静的メモリの使用が可能となります。

WOLFSSL_SESSION_EXPORT は、DTLS セッション・エキスポート、インポートの使

用を有効化します。これによって、DTLS セッションの現在の状態を送受することが可能

となります。

wolfSSL カスタマイズおよびポーティング

WOLFSSL_USER_SETTINGSは、ユーザー固有の設定ファイルを使用できます。

このファイルの名前は、”user_settings.h”で、インクルードパスに存在する必要が

あります。これは標準の”settings.h”ファイルの前にインクルードされるので、デフ

ォルトの設定を上書きすることができます。

WOLFSSL_CALLBACKS はデバッガ無しの環境下でシグナルを使用してコールバ

ックのデバッグができるようにするための拡張です。デフォルトではオフです。これはま

たソケットをブロックしてタイマーを設定するためにも使用できます。詳細は第6章を参

照して ください。

Page 16: wolfSSL ユーザ・マニュアル...Visual Sturdio によるビルドについては、” wolfSSL with Visual Studio” により詳細な説 明があります。 VS2008:Visual

12 © 2004 - 2019 wolfSSL, Inc.

WOLFSSL_USER_IO はデフォルト I/O 関数の EmbedSend() と EmbedReceive()

の自動設定を取り除くことができるようにします。カスタム I/O 抽象化レイヤーのために

使用されます(詳細は本マニュアル 5.1 を参照してください)。

NO_FILESYSTEM は証明書と鍵ファイルをロードするために stdio が利用できない

場合に使用します。これによって、ファイル上のそれらの変わりにバッファ拡張の使用が

可能になります。

NO_STDIO_FILESYSTEM は、標準入出力関数が利用できない場合に使用します。これに

よって <stdio.h> の読み込みを抑制します。

NO_INLINE は小さな頻繁に使用される関数の自動インライン展開を不可にします。

これらの関数は小さな関数で、通常関数呼び出しのセットアップ、リターンよりずっと小

さい ため、これをオンにすると wolfSSL の実行速度は低下し、サイズは大きくなりま

す。

NO_MAIN_DRIVER は通常のビルド環境においてテスト・アプリケーションがそれ

自身の main 関数を持つのか、別のドライバー・アプリケーションから呼ばれるのかを

決定するために使用されます。以下のテストファイルを使用する際に指定します:

test.c, client.c, server.c, echoclient.c, echoserver.c, および testsuite.c

NO_WRITEV は writev() セマンティクスのシミュレーションを不可にします。

SINGLE_THREADED は相互排他の使用をオフにするスイッチです。wolfSSL は現在

これをセッション・キャッシュのためだけに使用しています。wolfSSL の使用が常に

シングル・スレッドの場合、これをオンにすることができます。

USER_TICKS は time(0)を使用したくない場合、自分自身のクロック・テイック関数

を定義することができるようにします。カスタム関数は秒単位の精度を必要としますが、

EPOCH と連携されている必要はありません。“wolfssl_int.c”の LowResTimer()関数を

参照してください。

USER_TIME は自分自身のものを使用したい(必要がある)場合に、time.h の構造体

定義を無効にします。ユーザーは XTIME, XGMTIME、および XVALIDATE_DATE

Page 17: wolfSSL ユーザ・マニュアル...Visual Sturdio によるビルドについては、” wolfSSL with Visual Studio” により詳細な説 明があります。 VS2008:Visual

13 © 2004 - 2019 wolfSSL, Inc.

を自分で定義します。

USE_CERT_BUFFER_1024 は<wolfSSL_rppt>/wolfssl/certs_test.h に格納されてい

る1024 ビットのテスト用証明書と鍵用のバッファを有効にします。ファイル・システム

の無い組み込みシステムに移植、テストする際に手助けとなります。

USE_CERT_BUFFER_2048 は<wolfSSL_rppt>/wolfssl/certs_test.h に格納されてい

る 2048 ビットのテスト用証明書と鍵用のバッファを有効にします。ファイル・システムの

無い組み込みシステムに移植、テストする際に手助けとなります。

NO_DEV_RANDOM はデフォルトの /dev/random ランダム数値生成を使用しない

ようにします。これが定義された場合には、OS 固有の GenerateSeed()関数

(“wolfcrypt/src/random.c” にあります) を書く必要があります。

CUSTOM_RAND_GENERATE_SEED によって、ユーザーは

wc_GenerateSeedGenerateSeed(byte* output, word32 sz)と等価な関数を定義することが

できます。

CUSTOM_RAND_GENERATE_BLOCK によって、ユーザーはカスタム乱数生成関数を定

義することができます。

以下に使用例を示します。

./configure --disable-hashdrbg CFLAGS="-

DCUSTOM_RAND_GENERATE_BLOCK=custom_rand_generate_block"

または、user_settings.h ヘッダーファイル内で以下の定義をします。

/* RNG */

//#define HAVE_HASHDRBG

extern int custom_rand_generate_block (unsigned char* output,

unsigned int sz);

下記のオプションはそれぞれの暗号アルゴリズムで、実行時間の一定化などを通じて暗号

強度を確保します。安全な通信の確保のために、これらのオプションは常に有効化するこ

とを強くおすすめします。詳細は、4.13 wolfSSL内での耐タイミング性を参照してくださ

Page 18: wolfSSL ユーザ・マニュアル...Visual Sturdio によるビルドについては、” wolfSSL with Visual Studio” により詳細な説 明があります。 VS2008:Visual

14 © 2004 - 2019 wolfSSL, Inc.

い。

ECC_TIMING_RESISTANT:楕円曲線暗号化

TFM_TIMING_RESISTANT:TFM1整数演算ライブラリ

WC_RSA_BLINDING:RSA暗号化

メモリー使用量削減

TFM_TIMING_RESISTANT はスタックサイズの小さなシステムで fast math

(USE_FAST_MATH オプション) を使用する場合に定義することができます。これに

よって、大きな静的配列が排除されます。

WOLFSSL_SMALL_STACK はスタックサイズの小さなデバイスのために使用しま

す。これによってスタックの代わりに動的メモリの使用が増加します。ただし、性能が

低下する場合があります。

RSA_LOW_MEM は定義された CRT が使用されない場合、幾らかのメモリを削減しま

す。ただし、RSA 処理の速度が低下します。デフォルトではオフとなっています。

デフォルトのキャッシュサイズは33セッションですが、以下のオプションでSSL セッショ

ン・キャッシュのサイズを制限、または拡張することができます。

NO_SESSION_CACHE :セッション・キャッシュを使用しないようにします。

SMALL_SESSION_CACHE :6セッション

MEDIUM_SESSION_CACHE:1055セッション

BIG_SESSION_CACHE :20027セッション

HUGE_SESSION_CACHE :65791セッション

性能改善

WOLFSSL_AESNI はいくつかのインテルチップセットに組込まれている AES 高速化処理

の使用を有効にします。この定義を使用する場合、aes_asm.s ファイルが wolfSSL ビルド

ソースに追加されている必要があります。

1 TFM:TomsFastMath

Page 19: wolfSSL ユーザ・マニュアル...Visual Sturdio によるビルドについては、” wolfSSL with Visual Studio” により詳細な説 明があります。 VS2008:Visual

15 © 2004 - 2019 wolfSSL, Inc.

USE_FAST_MATH は big integer ライブラリを、可能な場合アセンブラー命令を使用す

るより高速なものに切り替えます。Fastmath は RSA, DH または DSA のような公開鍵の

演算を高速化します。Big integer ライブラリは通常もっとも移植性も高く、簡単に使用で

きますが、通常の big integer ライブラリの短所は実行速度が遅く、動的メモリ を多量に使

用する点です。Mastmath を使用する場合、スタックメモリーの使用量が大きくなるた

め、このオプションの使用する場合、TFM_TIMING_REGISTANT を併用することをお

勧めします。

プロトコル・スタックおよびチップ固有の定義

wolfSSL は各種のプラットフォームと TCP/IP スタック向けにビルドすることができ

ます。以下のオプションは ./wolfssl/wolfcrypt/settings.h の中に定義されていて、デ

フォルトではコメント化されています。それぞれは、参照されている特定チップやスタッ

ク向け のサポートを有効にするためにコメントを外すことができます。

IPHONE は iOS 上で使用のためのビルドの場合に定義します。

THREADX は ThreadX RTOS (www.rtos.com)上で使用のためのビルドの場合に定義

します。

MICRIUM は Micrium のμC/OS (www.micrium.com)上で使用のためのビルドの場

合に定義します。

MBED は mbed プロトタイピング・プラットフォーム (www.mbed.org) 向けのビル

ドの際に定義します。

MICROCHIP_PIC32 は PIC32 プラットフォーム(www.microchip.com) 上で使用の

ためのビルドの場合に定義します。

MICROCHIP_TCPIP_V5 は Microchip TCP/IP スタック・バージョン 5 上で使用の

ためのビルドの場合に定義します。

MICROCHIP_TCPIP は Microchip TCP/IP スタック・バージョン6以降で使用のた

Page 20: wolfSSL ユーザ・マニュアル...Visual Sturdio によるビルドについては、” wolfSSL with Visual Studio” により詳細な説 明があります。 VS2008:Visual

16 © 2004 - 2019 wolfSSL, Inc.

めのビルドの場合に定義します。

WOLFSSL_MICROCHIP_PIC32MZ は PIC32MZ のハードウェア暗号化機能使用

のためのビルドの場合に定義します。

FREERTOS は FreeRTOS (www.freertos.org) 向けビルドの場合、定義することがで

きます。LwIP を使用する場合は WOLFSSL_LWIP も定義します。

FREERTOS_WINSIM は FreeRTOS Windows シミュレータ (www.freertos.org)

向けビルドの場合、定義することができます。

EBSNET は EMSnet 製品と RTIP 上で使用のためのビルドの場合に定義します。

WOLFSSL_LWIP は LwIP TCP/IPスタック

(http://savannah.nongnu.org/projects/lwip/) 上で wolfSSL を使用する場合に定義しま

す。

WOLFSSL_GAME_BUILD はゲームコンソール向けに wolfSSL をビルドする際に定

義することができます。

WOLFSSL_LSR は LSR 用のビルドの場合に定義します。

FREESCLAE_MQX は Freescale MQX/RTCS/MFS (www.freescale.com) のためのビ

ルドの際、定義します。この定義によって Kinetis H/W 乱数生成アクセラレータ・サ

ポートのための FREESCLAE_K70_RNGA が定義されます。

WOLFSSL_STM32F2 は STM32F2 のために定義します。この定義によって wolfSSL の

STM32F2 ハードウェア暗号とハードウェア RNG サポートが有効となります。

COMVERGE は Comverge のための設定を使用するために定義します。

WOLFSSL_QL は QL SEP のための設定を使用するために定義します。

WOLFSSL_EROAD は EROAD のビルドのために定義します。

Page 21: wolfSSL ユーザ・マニュアル...Visual Sturdio によるビルドについては、” wolfSSL with Visual Studio” により詳細な説 明があります。 VS2008:Visual

17 © 2004 - 2019 wolfSSL, Inc.

WOLFSSL_IAR_ARM は IAR EWARM 向けのビルドのために定義します。

WOLFSSL_TIRTOS は TI-RTOS 向けのビルド時に定義します。

WOLFSSL_ROWLEY_ARM は Rowley CrossWorks のビルド時に使用します。

WOLFSSL_NRF51 は、Nordic nRF51 へのポーティングの際に定義することができま

す。

WOLFSSL_NRF51_AES は、Nordic nRF51へのポーティングの際、AES128-ECB 暗号

化のためのビルドインAESハードウェアを使用するために定義することができます。

WOLFSSL_uITRON4は、μITRON4へのポーティングの際に定義します。

WOLFSSL_uTKERNEL2は、μT-Kernel2へのポーティングの際に定義します。

ビルド・オプション

以下は wolfSSL ライブラリのビルド方法をカスタマイズするために ./configure スクリプト

に追加できるオプションです。

デフォルトでは wolfSSL は、スタティック・モード無効で、共有モードのみでビルドしま

す。これにより、倍のオーダーでビルド時間が高速化されます。必要ならばどちらのモー

ドも明示的に無効化あるいは有効化することができます。

オプション デフォルト値 説明

--enable-debug 無効 wolfSSL デバッグサポートを有効化

--enable-distro 無効 wolfSSL distroビルドを有効化

--enable-

singleThreade

d

無効 シングルスレッド・モードを有効化。マルチ

スレッド保護無し

--enable-dtls 無効 wolfSSL の DTLS サポートを有効化

Page 22: wolfSSL ユーザ・マニュアル...Visual Sturdio によるビルドについては、” wolfSSL with Visual Studio” により詳細な説 明があります。 VS2008:Visual

18 © 2004 - 2019 wolfSSL, Inc.

--enable-rng 有効 RNGのコンパイルと使用を有効化

--enable-openssh 無効 OpenSSH 互換性ビルドを有効化。

--enable-opensslextra 無効 拡張 OpenSSL API 互換性を有効化。サイズ

が増加します。

--enable-maxstrength 無効 最大暗号化強度のビルドを有効化。TSLv1.2-

AEAD-PFS 暗号化のみ可能と成ります。

--enable-harden 有効 強化ビルドを有効化し、タイミング・レジスタンスと

ブランディングを有効にする

--enable-ipv6 無効 IPv6 のテストを有効化。wolfSSL 自身は IP

中立。

--enable-bump 無効 SSL Bump ビルド

--enable-leanpsk 無効 最小 PSK ビルド

--enable-leantls 無効 TLS1.2 クライアントのみ(クライアント認証

なし)の構成、ECC256、AES128、および

SHA256、Shamir無し。このオプション単独

で使用。他のビルドオプションとの組み合わ

せることはできない。

--enable-bigcache 無効 大きなセッション・キャッシュの有効化

--enable-hugecache 無効 巨大なセッション・キャッシュの有効化

--enable-smallcache 無効 小さなセッション・キャッシュの有効化

--enable-savesession 無効 セッション・キャッシュの永続化

--enable-savecert 無効 証明書キャッシュの永続化

--enable-atomicuser 無効 アトミックユーザレコード層の有効化

--enable-pkcallbacks 無効 公開鍵コールバックの有効化

--enable-sniffer 無効 Sniffer サポートの有効化

--enable-aesgcm 有効 AES-GCM サポートの有効化

--enable-aesccm 無効 AES-CCM サポートの有効化

--enable-armasm 無効 ARMv8 ハードウェアアクセラレーションを使用。

32ビット又は64ビットシステムに応じてMcpu又は

mfpuを設定する。CPPFLAGSで渡された mcpu

又は mfpu の設定を上書きしません。注意:いく

つかのコンパイラでは、”invalid address”警告が

出る場合、-mstrict-align が必要かもしれませ

Page 23: wolfSSL ユーザ・マニュアル...Visual Sturdio によるビルドについては、” wolfSSL with Visual Studio” により詳細な説 明があります。 VS2008:Visual

19 © 2004 - 2019 wolfSSL, Inc.

ん。

--enable-aesni 無効 Intel AES-NI サポートの有効化

--enable-intelasm 無効 全ての Intel ASM スピードアップを有効化

--enable-poly1305 無効 Poly1305 サポートの有効化

--enable-camellia 無効 Camellia サポートの有効化

--enable-md2 無効 MD2 サポートの有効化

--enable-nullcipher 無効 NULL サイファーサポートの有効化

--enable-ripemd 無効 RIPEDM-160 サポートの有効化

--enable-blake2 無効 BLAKE2 サポートの有効化

--enable-sha512 x86_84では有

wolfSSL の SHA-512 サポートの有効化

--enable-sessioncerts 無効 セッション証明書ストアを有効化

--enable-keygen 無効 鍵生成を有効化

--enable-certgen 無効 証明書生成を有効化

--enable-certreq 無効 証明書要求を有効化

--enable-sep 無効 SEP を有効化

--enable-hkdf 無効 HKDF (HMAC-KDF) を有効化

--enable-dsa 無効 TLSDSA を有効化

--enable-eccshamir x86_84では有

効 ECC Shamir を有効化

--enable-ecc x86_84では有

効 ECC を有効化

--enable-eccustcurves 無効 ECCカスタム曲線を有効化

--enable-compkey 無効 圧縮鍵サポートを有効化

--enable-curve25519 無効 Curve25519を有効化。又は ‘—enable-

curve25519=small’でCURVE25519_SMALLに対

--enable-ed25519 無効 ED25519を有効化。又は、’—enable-

ed25519=small’でED25519_SMALLに対応

--enable-fpecc 無効 固定小数点キャッシュ ECC を有効化

--enable-eccencrypt 無効 ECC 暗号化を有効化

--enable-psk 無効 PSK (事前共有鍵)を有効化

--enable-errorstrings 有効 エラー・メッセージ文字列テーブルを有効化

--enable-oldtls 有効 TLS1.1を有効化

Page 24: wolfSSL ユーザ・マニュアル...Visual Sturdio によるビルドについては、” wolfSSL with Visual Studio” により詳細な説 明があります。 VS2008:Visual

20 © 2004 - 2019 wolfSSL, Inc.

--enable-sslv3 無効 SSL3.0 を有効化

--enable-stacksize 無効 サンプル・プログラムにおけるスタックサイ

ズを有効化

--enable-memory 有効 メモリーコールバックを有効化

--enable-rsa 有効 RSA を有効化

--enable-dh 有効 DH を有効化

--enable-anon 無効 匿名を有効化

--enable-asn 有効 ASN を有効化

--enable-aes 有効 AES を有効化

--enable-base64encode x86_84では有

Base64 エンコーディングを有効化

--enable-coding 有効 ベース 16/64 コードを有効化

--enable-des3 無効 DES3 を有効化

--enable-idea 無効 IDEA 暗号を有効化

--enable-arc4 無効 ARC4 を有効化

--enable-md5 有効 MD5 を有効化

--enable-sha 有効 SHA を有効化

--enable-webserver 無効 Web サーバー向け SSL 機能を有効化

--enable-md4 無効 MD4 を有効化

--enable-pwdbased 無効 PWDBASED を有効化

--enable-hc128 無効 ストリーム暗号化 HC-128 を有効化

--enable-rabbit 無効 ストリーム暗号化 RABBIT を有効化

--enable-fips 無効 FIPS140-2 を有効化

--enable-sha224 x86_84では有

wolfSSL Sha-224サポートを有効化

--enable-poly1305 有効 wolfSSL POLY1305サポートを有効化

--enable-chacha 有効 CHACHAを有効化

--enable-hashbrdg 有効 Hash DRBG を有効化

--enable-filesystem 有効 ファイルシステム・サポートを有効化

--enable-inline 有効 インライン関数を有効化

--enable-ocsp 無効 OCSP機能 (Online Certificate Status Protocol )を有効化

--enable-ocspstapling 無効 OCSP Stapling を有効化

Page 25: wolfSSL ユーザ・マニュアル...Visual Sturdio によるビルドについては、” wolfSSL with Visual Studio” により詳細な説 明があります。 VS2008:Visual

21 © 2004 - 2019 wolfSSL, Inc.

--enable-

ocspstapling2 無効 OCSP Stapling バージョン2を有効化

--enable-crl 無効 CRL 機能を有効化

--enable-crl-monitor 無効 CRL モニターを有効化

--enable-ntru 無効 NTRU のビルドを有効化(要ライセンス)

--enable-sni 無効 SNI (Server Name Indication)を有効化

--enable-maxfragment 無効 Maximum Fragment Length を有効化

--enable-alpn 無効 Application Layer Protocol Negotiation

(ALPN) を有効化

--enable-trancatedmac 無効 Truncated Keyed-hash MAC (HMAC)を有効

--enable-

renegotiation-

indication

無効 Renegotiation Indication を有効化

--enable-secure-

renegotiation 無効 Secure Renegotiation を有効化

--enable-

supportedcurves 有効 「サポートされる楕円曲線」拡張を有効化

--enable-session-ticket 無効 セッション・チケット機能を有効化

--enable-tlsx 無効 TLS 拡張を有効化

--enable-pkcs7 無効 PKCS#7 を有効化

--enable-scep 無効 wolfSCEP を有効化

--enable-srp 無効 Secure Remote Passwordを有効化

--enable-smallstack 無効 小さいスタックサイズを有効化

--enable-valgrind 無効 単体テストのための Valgrind を有効化

--enable-testcert 無効 テスト用証明書を有効化

--enable-iopool 無効 I/O プールの例を有効化

--enable-certservice 無効 証明書サービス (Windows Servers) を有効

--enable-fastmath X86_64 にて

有効 fast math を有効化

--enable-

fastmathhugemath

無効 Fast math 有効+大きなコード

--enable-examples 有効 サンプル・プログラムを有効化

--enable-crypttests 有効 Crypt Bench/Testを有効化

--enable-fast-rsa 無効 RSA のための Intel IPP ライブラリを有効化

--enable-staticmemory 無効 静的メモリ使用を有効化

Page 26: wolfSSL ユーザ・マニュアル...Visual Sturdio によるビルドについては、” wolfSSL with Visual Studio” により詳細な説 明があります。 VS2008:Visual

22 © 2004 - 2019 wolfSSL, Inc.

--enable-mcapi 無効 Microchip API を有効化

--enable-asynccrypt 無効 非同期暗号化を有効化

--enable-sessionexport 無効 セッションのインポート、エクスポートを有

効化

--enable-

jobserver[=no/yes/

#]

Yes 最大#数のジョブを有効化。Yes: CPU カウ

ント+1を有効化

--enable-

shared[=PKGS] 有効 共有 wolfSSL ライブラリのビルドを有効化

[default = yes]

--enable-static[=PKGS] 無効 静的 wolfSSL ライブラリのビルドを有効化

[default = no]

--enable-32bit 無効 32ビットサポートを有効化

--enable-aescbc 有効 wolfSSL AES-CBC サポートを有効化

--enable-aescfb 無効 wolfSSL AES-CFB サポートを有効化

--enable-aesctr 無効 wolfSSL AES-CTR サポートを有効化

--enable-afalg 無効 Linux af_alg 使用を有効化

--enable-all 無効 全ての wolfSSL 機能を有効化(ただし、SSL 3.0 を

除く) --enable-asio

無効 asio を有効化

--enable-asm 有効 アセンブリを有効化

--enable-asyncthreads 有効 非同期スレッドを有効化

--enable-base16 無効 Base16 エンコード/デコードを有効化

--enable-certext 無効 証明書要求TLS拡張を有効化

--enable-cmac 無効 CMACを有効化

--enable-cryptodev 無効 ハードウェア暗号化サポートを有効化

--enable-devcrypto 無効 Linux dev crypto機能利用を有効:全て | aes(全て

の aes) | hash(全ての hash アルゴリズム) | cbc

(aes-cbcのみ) --enable-earlydata

無効 wolfSSL TLS v1.3 での Early Data ハンドシェイク

を有効化 --enable-enckeys

無効 PEM 暗号化された秘密鍵のサポートを有効化

--enable-fast-

install[=PKGS] yes 高速インストレーションの為に最適化

--enable-fortress 無効 SSL fortress ビルドを有効化

--enable-haproxy 無効 haproxyを有効化

--enable-hrrcookie 無効 サーバーがクッキーTLS拡張機能を状態付きで送

Page 27: wolfSSL ユーザ・マニュアル...Visual Sturdio によるビルドについては、” wolfSSL with Visual Studio” により詳細な説 明があります。 VS2008:Visual

23 © 2004 - 2019 wolfSSL, Inc.

信できるように有効化する

--enable-indef 無効 不定長符号化メッセージ解析を有効化

--enable-intelrand 無効 Intel rdrandをRNGソースとして有効化

--enable-lowresource 無効 メモリ・フラッシュ用に低リソース向けオプションを有

効化 --enable-mcast

無効 wolfSSL DTLS マルチキャストのサポートを有効化

--enable-memorylog 無効 ダイナミックメモリ・ロギングを有効化

--enable-memtest 無効 メモリテスト・オプションを有効化(内部使用向け)

--enable-nginx 無効 nginx を有効化

--enable-oldnames 有効 旧名称での後方互換を有効化

--enable-opensslall 無効 全ての OpenSSL API を有効化。サイズ大

--enable-opensslcoexist 無効 wolfSSLとopenssl の共存を有効化

--enable-optflags 有効 コンパイラのCFLAGSのデフォルト最適化を有効化

--enable-pkcs11 無効 pkcs11 アクセスを有効化

--enable-postauth 無効 ポストハンドシェイク認証を有効化

--enable-qsh 無効 QSHを有効化

--enable-rsapss 無効 RSA-PSSを有効化

--enable-selftest 無効 セルフテストを有効化。ただし、CAVPセルフテスト

のライセンスなしでは動作しない --enable-sha3

有効 wolfSSL SHA-3サポートを有効化

--enable-sha384 有効 wolfSSL SHA-384サポートを有効化

--enable-signal 無効 シグナルを有効化

--enable[disable]-

silent-rules N/A 簡略ビルド出力を有効化(取り消し: "make V=1")

--enable-

smallstackcache 無効 小さいスタック使用のキャッシングを有効化

--enable-sp 無効 単精度数値演算の実装の有効化

--enable-sp-asm 無効 単精度数値演算のアセンブリー実装を有効化

--enable-sp-math 無効 単精度数値演算のみを有効化

--enable-ssh 無効 wolfSSH オプションを有効化

--enable-stacklog 無効 スタック・ロギングを有効化

--enable-tls13 無効 wolfSSL TLS v1.3 を有効化

--enable-tls13-draft18 無効 wolfSSL TLS v1.3 ドラフト22 を有効化

--enable-tls13-draft22 無効 wolfSSL TLS v1.3 ドラフト22 を有効化

--enable-tls13-draft23 無効 wolfSSL TLS v1.3 ドラフト23 を有効化

--enable-tls13-draft26 無効 wolfSSL TLS v1.3 ドラフト26 を有効化

Page 28: wolfSSL ユーザ・マニュアル...Visual Sturdio によるビルドについては、” wolfSSL with Visual Studio” により詳細な説 明があります。 VS2008:Visual

24 © 2004 - 2019 wolfSSL, Inc.

--enable-tls13-draft28 無効 wolfSSL TLS v1.3 ドラフト28 を有効化

--enable-tlsv10 無効 TLS v1.0 を有効化

--enable-tlsv12 有効 TLS v1.2 を有効化

--enable-trackmemory 無効 wolfCrypt と wolfSSL クリーンアップ時のメモリ使用

情報を有効化 --enable-webclient

無効 Webクライアント(HTTP)を有効化

--enable-wpas 無効 wpa_supplicant サポートを有効化

--enable-writedup 無効 WOLFSSLオブジェクトの複製書き込みを有効化

--enable-xilinx 無効 ザイリンクスの強化暗号サポートを有効化

--enable-xts 無効 XTSを有効化

--enable-optflags 有効 コンパイラのCFLAGSのデフォルト最適化を有効化

--enable-pkcs11 無効 pkcs11 アクセスを有効化

--enable-postauth 無効 ポストハンドシェイク認証を有効化

--enable-qsh 無効 QSHを有効化

--enable-rsapss 無効 RSA-PSSを有効化

--enable-selftest 無効 セルフテストを有効化。ただし、CAVPセルフテスト

のライセンスなしでは動作しない

--disable-libtool-lock 無効 avoid locking (might break parallel builds)

--disable-libtool-lock 無効 ロックを回避します(並列ビルドに失敗する可能性

があります)。 --disable-option-

checking 無効 無効なオプション指定を無視

--with-pic[=PKGS] Use both PIC/non-PIC オブジェクトのどちらか一方のみを使

用するようにします [default=use both]。

--with-aix-

soname=aix|svr4|both Aix AIXで提供される共有ライブラリのバージョン管理

( "SONAME")の派生形、[default = aix]。

--with-gnu-ld 無効 CコンパイラがGNU ldを使用していると仮定.

--with-sysroot[=DIR] 無効 DIR(または指定されていない場合はコンパイラの

sysroot)内の依存ライブラリを検索します。 --with-

cryptoauthlib=PATH 無効 CryptoAuthLib のインストール・パス

--with-user-crypto=PATH 無効 USER_CRYPTO のインストール・パス (デフォルト:

/usr/local)

--with-ntru=PATH 無効 NTRU インストール・パス(デフォルトは /usr/)

--with-wnr=PATH 無効 Whitewood net Random のインストール・パス

--with-libz=PATH 無効 圧縮のための libz をオプションでインクルード

--with-cavium=PATH 無効 Cavium/software ディレクトリーへのパス

Page 29: wolfSSL ユーザ・マニュアル...Visual Sturdio によるビルドについては、” wolfSSL with Visual Studio” により詳細な説 明があります。 VS2008:Visual

25 © 2004 - 2019 wolfSSL, Inc.

--with-cavium-v=PATH 無効 Cavium V/software ディレクトリーへのパス

--with-intelqa=PATH 無効 Intel QuickAssist(QAT) ドライバ・ディレクトリへの

パス

表 1 コンフィグレーション・オプション一覧

(wolfSSL v3.15.5 より抽出)

ビルド・オプションの注意点

debug - デバッグサポートを有効化で、デバッグ情報と DEBUG_WOLFSSL 定数の定義と

ともにコンパイルすることにより stderr にメッセージが出力され、デバッグを簡単化する

ことができます。実行時にデバッグをオンにするには wolfSSL_Debugging_ON()を呼び出

してください。実行時にデバッグをオフにするには wolfSSL_Debugging_OFF()を呼び出し

てください。詳しい情報については、本マニュアル第8章を参照してください。

singleThreaded - シングルスレッド・モードを有効化するとセッション・キャッシュのマ

ルチスレッド保護が無効化されます。ユーザアプリケーションがシングル・スレッドの場

合、またはアプロケーションがマルチスレッドでも一度に一つのスレッドだけがライブラ

リーにアクセスすると分かっている場合にのみ、シングルスレッド・モードを有効化して

く ださい。

dtls - DTLS サポートを有効化することで、TLS と SSL に加えて DTLS の実行のためにラ

イブラリを使用できるようになります。DTLS はまだ試験的なものですので、コメント、

質問、要望などお知らせください。詳しい情報は本マニュアル第4章を参照してくだ さい。

opensslextra – OpenSSL 拡張を有効化することで、より広範囲の OpenSSL 互換関数を含

むことになります。基本ビルドでもほとんどの TLS/SSL への要求に対して十分な関数が有

効化されますが、数十、数百種類の OpenSSL 関数呼び出しを使用するアプリケーション

を移植する場合はこのオプションでより良いサポートが可能になります。wolfSSL

OpenSSL 互換レイヤーはアクティブに開発中です。もし、必要な関数が見当たらない場合

はお手伝いさせていただきますので、お知らせください。OpenSSL 互換レイヤーに関する

詳細はユーザ・マニュアル第13章を参照してください。

ipv6 – IPV6 を有効化するとテスト・アプリケーションを IPv4 ではなく IPv6 を使用する

ように切り替えます。wolfSSL 自身は IP 中立で、どちらのバージョンでも使用することが

Page 30: wolfSSL ユーザ・マニュアル...Visual Sturdio によるビルドについては、” wolfSSL with Visual Studio” により詳細な説 明があります。 VS2008:Visual

26 © 2004 - 2019 wolfSSL, Inc.

できますが、現在テスト・アプリケーションは IP 依存で、IPv4 がデフォルトです。

leanpsk – PSK を使用し、ライブラリから多くの機能を削除した非常に小さいビルドで

す。このオプションを有効にした場合、組み込み向け wolfSSL のサイズはおおよそ 21kB

となります。

fastmath – fastmath を有効化すると、RSA, DH または DSA のような公開鍵の演算が高

速化されます。デフォルトでは wolfSSL は普通の整数数学ライブラリを使用します。これ

は通常、最も移植性がよく使用も容易です。普通の整数数学ライブラリの欠点は、実 行速

度が遅いことと動的メモリを多量に使用する点です。このオプションは big integer ライブ

ラリを、可能な場合、アセンブラー命令を使用するより高速なものに切り替えま す。アセ

ンブラー言語のインクルードはコンパイラとプロセッサの組合せに依存します。いくつか

の組合せではさらなるコンフィグレーション・フラグを必要としたり、不可 能な場合もあ

るかもしれません。新たなアセンブラー・ルーチンでの fastmath 最適化に対するヘルプは

有償コンサルティング・ベースでご提供可能です。

例えば、ia32 においては、高い最適化とフレームポインタの必要性の管理を回避するた

め、すべてのレジスタが利用可能である必要があります。wolfSSL は 非デバッグビルドの

ために “-O3 -fomit-frame-pointer” を GCC に追加します。違うコンパイラをご使用の場合

はコンフィグレーション中の CFLAGS にマニュアルでこれらを追加してください。

OS X では “-mdynamic-no-pic” も CFLAGS に追加する必要があります。さらに、OS X で

ia32 向けに共有モードでビルドする場合は、LDFLAGS にもオプションを渡す必要があり

ます:

LDFLAGS="-Wl,-read_only_relocs,warning"

これはいくつかのシンボルに対して、エラーを起こす代わりに、ワーニングを与えます。

fastmath もまた、動的メモリとスタックメモリーの使用方法を切り替えます。通常の数学

ライブラリは big integer のために動的メモリを使用します。Fastmath はデフォルトで、

2048 ビット×2048 ビットの乗算が可能となるように 4096 ビット整数を保持する固定長バ

ッファを使用します。4096 ビット×4096 ビットの乗算が必要な場合は、

wolfssl/wolfcrypt/tmf.h の中の FP_MAX_BITS を変更してください。FP_MAX_BITS が増

Page 31: wolfSSL ユーザ・マニュアル...Visual Sturdio によるビルドについては、” wolfSSL with Visual Studio” により詳細な説 明があります。 VS2008:Visual

27 © 2004 - 2019 wolfSSL, Inc.

えるに従い公開鍵演算で使用されるバッファが大きくなるので、実行時のスタック使 用量

が増えます。ライブラリ内の2、3の関数では一時的な big integer を使用します。これ

は、スタックが相対的に大きくなる可能性があるということです。このようなこ とは、ス

タックサイズが小さな値に設定される組込みシステムやスレッド環境でしか問題 になりま

せん。もし、そのような環境において fastmath で公開鍵演算中にスタック破壊が起きる場

合は、スタックサイズをそのようなスタック使用に充分になるように増やして ください。

autoconf システムを使用しないで fastmath を有効化する場合は、USE_FAST_MATH を

定義し、integer.c の代わりに tfm.c を wolfSSL ビルドに追加する必要があります。

fastmath を使用する場合、スタックメモリーが大きくなる場合があるので、fastmath ラ

イブラリを使用するときは TFM_TIMING_RESISTANT を定義することを推奨しま す。

これにより大きな静的配列を排除することができます。

fasthugemath – fasthugemath を有効化すると、fastmath ライブラリ向けのサポートを含

み、公開鍵オプション中によく使われる鍵サイズ向けにループを展開してコードサイズ を

おおはばに増加させます。fasthugemath の使用前と使用後にベンチマーク・ユーティリテ

ィを使用してみて、コードサイズの増加がいくぶんかのスピードアップに見合っているか

どうか確認してください。

bigcache - 「大きなセッション・キャッシュ」を有効にすることで、セッション・キャッシ

ュは 33 セッションから 1055 セッションに増加します。デフォルトのセッションサイズ 33

は TLS クライアントや組込みサーバー向けに適切です。大きなセッション・キャッシュ

は、基本的に新セッション数が毎分 200 以下程度向けのあまり重い負荷でないサーバーを

可能にします。

hugecache - 「巨大セッション・キャッシュ」を有効にすると、セッション・キャッシ

ュのサイズは 65,791 セッションとなります。このオプションは、毎分 13,000 新セッ

ション以上、あるいは毎秒 200 新セッション以上の高負荷サーバー向けのオプション

です。

smallcache – 小さなセッション・キャッシュによってwolfSSLは6セッションのみを保

持することに成ります。これは、デフォルトの3kB近いセッションはRAMに対して負担と

なるような組込みクライアントやシステムに対して有効と考えられます。

Page 32: wolfSSL ユーザ・マニュアル...Visual Sturdio によるビルドについては、” wolfSSL with Visual Studio” により詳細な説 明があります。 VS2008:Visual

28 © 2004 - 2019 wolfSSL, Inc.

savesession – このオプションの有効化によって、アプリケーションはwolfSSLセッシ

ョン・キャッシュのメモリ・バッファーへの/からの永続化(保存)と復旧が可能と成

ります。

savecert – このオプションの有効化によって、アプリケーションはwolfSSLの証明書キ

ャッシュのメモリ・バッファーへの/からの永続化(保存)と復旧が可能と成ります。

atomicuser – このオプションの有効化で、User Atomic Record Layer Processing コ

ールバックをオンにします。これによって、ユーザー独自のMAC/暗号化と復号化/検証コ

ールバック を登録することが可能と成ります。

pkcallbacks – このオプションの有効化で、公開鍵コールバックをオンにし、ECC署名/

検証、およびRSA署名/検証、および暗号/復号コールバックをオンにします。

sniffer – sniffer(SSL 検査)サポートを有効化すると、正しい鍵ファイルによって

SSL トラフィックのパケット収集および正しい鍵ファイルによるそれらのパケットの復号

化を 可能にします。現在、sniffer は以下の暗号化をサポートしています。

CBC 暗号化:

AES-CBC

Camellia-CBC

3DES-CBC

Stream 暗号化:

RC4

Rabbit

HC-128

aesgcm - AES-GCM の有効化でそれらの暗号化スイーツを wolfSSL に追加します。

wolfSSL は、スピードとメモリ消費のバランスで4つの異なる AES-GCM のインプリ

メンテーションを提供しています。可能ならば、64 ビットまたは 32 ビットの整数ラ

イブラリを使用します。組込みアプリケーション向けには、RAM ベースのルックア

ップ・テーブル (8k バイト/セッション)を使用した 64 ビット版に匹敵するスピードの高速

の 8 ビット版と、追加の RAM を使用しない低速の 8 ビット版があります。--enable-

Page 33: wolfSSL ユーザ・マニュアル...Visual Sturdio によるビルドについては、” wolfSSL with Visual Studio” により詳細な説 明があります。 VS2008:Visual

29 © 2004 - 2019 wolfSSL, Inc.

aesgcm オプションは、例えば "--enable-aesgcm=table"のように、"=word32", "=table", ま

たは "=small"で修飾することができます。

aesccm – AES-CCM の有効化によって、8バイト認証(CCM-8)による CBC-MAC モー

ドが可能となります。

aesni – AES-NI サポートを有効化すると、AES-NI がサポートされているチップの場合チ

ップから直接に AES 命令が呼び出されます。これによって AES 関数が高速化されます。

AIS-NI に関しては詳細は本マニュアル第4章を参照してください。

poly1305 – このオプションを有効化すると、wolfCrypt と wolfSSL に Poly1305 が追加さ

れます。

camellia – このオプションを有効化すると、wolfCrypt と wolfSSL に Camellia が追加さ

れます。

chacha – このオプションを有効化すると、wolfCrypt と wolfSSL に ChaCha が追加され

ます。

md2 – このオプションを有効化すると、wolfSSL に MD2 アルゴリズムが追加されます。

MD2はセキュリティ脆弱性が知られており、デフォルトでは無効化されています。

ripemd – このオプションを有効化すると、wolfSSL に RIPEMD-160 のサポートが追加さ

れます。デフォルトでは無効化されています。

sha512 – このオプションを有効化すると、SHA-512ハッシュアルゴリズムのサポートが追

加されます。このアルゴリズムは word64 型が利用可能である必要があります。そのた

め、デフォルトでは無効化されています。組込みシステムの幾つかではこの型は利用可能

と考えらます。

Sha384 – このオプションを有効化すると、SHA-384ハッシュアルゴリズムのサポートが追

加されます。デフォルトでは無効化されています。

sessioncerts – このオプションの有効化によって、以下の関数によるセッション・キャッシ

Page 34: wolfSSL ユーザ・マニュアル...Visual Sturdio によるビルドについては、” wolfSSL with Visual Studio” により詳細な説 明があります。 VS2008:Visual

30 © 2004 - 2019 wolfSSL, Inc.

ュ内の相手方の証明書チェーンのサポートが追加されます。

wolfSSL_get_peer_chain(), wolfSSL_get_chain_count(), wolfSSL_get_chain_length(),

wolfSSL_get_chain_cert(), wolfSSL_get_chain_cert_pem(), and wolfSSL_get_sessionID()

keygen – RSA 鍵生成サポートを有効化すると、最長 4096 ビットの各種長さの鍵を生成す

ることができます。wolfSSL は DER および PEM フォーマットを提供します。

certgen – 自己署名の x509 v3 証明書生成サポートを有効化します。

certreq – 証明書要求の生成サポートを有効化します。

hc128 – HC-128 ストリーム暗号のスピードは非常に良いのですが、これを使用しないユー

ザーのためのスペースをとってしまいます。できる限り広い意味でデフォルトビルドを小

さくするために、この暗号化アルゴリズムはデフォルトでは無効化しています。この暗号

を使用するためには対応する暗号スイートをオンにするだけで、その他のアクションは 不

要です。

rabbit – このオプションを有効化すると RABBIT ストリーム暗号のサポートが追加されま

す。デフォルトでは無効化されています。

psk –事前共有鍵サポートは、一般的には使用しないのでデフォルトではオフとなってい

ます。この機能を有効化するためには、単にこれをオンにします。その他のアクションは

不要です。

poly1305 - このオプションを有効化すると Poly1305 のサポートが wolfCrypt と wolfSSL

に追加されます。

webserver – このオプションは、yaSSL 組込み Web サーバーのビルドのために必要とされ

るすべての機能をオンにします。

noFilesystem – これによってファイル・システムの使用の無効化を容易にします。このオ

プションは NO_FILESYSTEM を定義します。

inline – このオプションの無効化によって wolfSSL 内の関数のインライン化が無効化され

Page 35: wolfSSL ユーザ・マニュアル...Visual Sturdio によるビルドについては、” wolfSSL with Visual Studio” により詳細な説 明があります。 VS2008:Visual

31 © 2004 - 2019 wolfSSL, Inc.

ます。インライン化される場合は、関数はリンクされるのでなくそれぞれのコードブロッ

クが関数呼び出しに挿入されインライン化されます。

ecc – このオプションを有効化すると ECC のサポートが wolfSSL に追加されます。

ocsp - このオプションを有効化すると OCSP (Online Certificate Status Protocol)のサポー

トが wolfSSL に追加されます。RFC6960 に説明されている X.509 証明書の取り消し状況

を得るために使われます。

crl – このオプションを有効化すると CRL (Certificate Revocation List) のサポートが

wolfSSL に追加されます。

crl-monitor - このオプションを有効化すると wolfSSL がアクティブに特定の CRL

(Certificate Revocation List) ディレクトリーを監視する機能が wolfSSL に追加されます。

ntru - このオプションを有効化すると wolfSSL で NTRU 暗号化スイーツを使用できるよ

うになります。NTRU は今は Security Innovation から GPLv2 の元に利用可能です。

NTRU バンドルは Security Innovation GitHub レポジトリからダウンロード可能です。

https://github.com/NTRUOpenSourceProject/ntru-crypto

sni – このオプションの有効化によって TLS Server Name Indication (SNI)拡張がオンにな

ります。

maxfragment - このオプションの有効化によって TLS Maximum Fragment Length 拡張

がオンになります。

truncatedhmac – このオプションの有効化によって TLS Truncated HMAC 拡張がオンに

なります。

supportedcurves - このオプションの有効化によって TLS Supported ECC Curves 拡張が

オンになります。

tlsx - このオプションの有効化によって、すべての TLS 拡張がオンになります。

Page 36: wolfSSL ユーザ・マニュアル...Visual Sturdio によるビルドについては、” wolfSSL with Visual Studio” により詳細な説 明があります。 VS2008:Visual

32 © 2004 - 2019 wolfSSL, Inc.

valgrind – このオプションの有効化によって、wolfSSL 単体テスト動作中 valgrant がオン

になります。これは、開発サイクルにおいて問題を早期に発見するために有効です。

testcert - このオプションの有効化によって、通常開示されていない ASN 証明書 API が開

示されます。これは、 wolfCrypt テスト・アプリケーションに見られるように

(wolfcrypt/test/test.c)、テスト目的に便利です。

examples – このオプションはデフォルトで有効化されています。有効化されていると、

wolfSSL サンプルアプリケーション (client, server, echoclient, echoserver) がビルドされ

ます。

gcc-hardening – このオプションの有効化でさらにコンパイラのセキュリティチェックが追

加されます。

jobserver – このオプションを有効化することで、複数のコンピュータ上の” make” に対し

て複数ファイルのビルドを並行に行うための複数プロセスを可能にします。これによって

ビルド時間を大幅に削減することが可能です。ユーザーはこのコマンドに対して異なるア

ーギュメント(yes/no/#) を渡すことができます。”yes”が使用されると、ジョブ数に対して

CPU カウント+1を使うよう” make” に対して伝えます。 “no” は明示的にこの機能を無効

化します。ユーザーはジョブの数を渡すこともできます。

shared の無効化 – 共有ライブラリのビルド無効化オプションを有効化すると、

wolfSSL 共有ライブラリはビルドから外されます。デフォルトでは、時間とスペースを

節約するために一つの共有ライブラリだけビルドされます。

static の無効化 – static の無効化オプションを有効化すると、wolfSSL 静的ライブラリはビ

ルドから外されます。--enable-stat ビルド・オプションを使うことで、静的ライブラリを

ビルドすることができます。このオプションはデフォルトでは無効化されています。

libz – libz の有効化で、wolfSSL 内で libz ライブラリから圧縮をサポート可能となりま

す。このオプションを含めるかどうか、wolfSSL_set_commpression()を呼び出すかどうか

については慎重に考えてください。送信前にデータを圧縮すれば送受信される実際のメッ

セージサイズは減少する反面、圧縮のための解析時間はよほど遅いネットワークで送信す

るような場合でないかぎり生で送信したときの時間より長くかかってしまいます。

Page 37: wolfSSL ユーザ・マニュアル...Visual Sturdio によるビルドについては、” wolfSSL with Visual Studio” により詳細な説 明があります。 VS2008:Visual

33 © 2004 - 2019 wolfSSL, Inc.

fast-rsa – fast-rsa を有効化によって、IPP ライブラリを使用して RSA 処理を高速化しま

す。wolfSSL デフォルトの RSA より大きなメモリを消費します。IIP ライブラリが見つか

らない場合、コンフィグレーション時にエラーが表示されます。Autoconf が最初に探す

場所は wolfssl_root/IPP、次は Linux システムの/usr/lib のような該当マシンの標準のライ

ブラリの格納場所です。

RSA 処理に使用されるライブラリは “wolfssl-X.X.X/IPP” ディレクトリーとなります。

X.X.X は wolfSSL のバージョン番号です。バンドルされるライブラリからのビルドは、以

下のサブディレクトリの IPP のファイル構成に変更がないようにディレクトリ・ロケーシ

ョンと

IPP の名前に依存するようになっています。

メモリのアロケート時、fast-rsa 処理は DYNAMIC_TYPE_USER_CRYPTO メモリータグ

でアロケートします。これによって、fast-rsa オプションでの実行期間中の RSA 処理のメ

モリ消費を見ることを可能になります。

leantls – 有効化で小さなフットプリントの TLS クライアントを生成します。(クライアン

ト認証なし) Shamir 無しの ECC256, AES128 と SHA256 だけの TLS1.2 クライアン

トを生成します。このオプションだけを指定し、その他のビルド・オプションとの組み合

わせての使用はできません。

renegotiation-indication – RFC5746 に説明されるように、この仕様は一旦成立した TLS

接続に対する再ネゴシエートに関連した SSL/TLS への攻撃を予防します。

scep – IETF (Internet Engineering Task Force) で定義されているように、SCEP (Simple

Certificate Enrollment Protocol) はHTTPによるPKCS#7とPKCS#10を利用したPKIで

す。CERTはSCEPは証明書要求を認証しないと強くコメントしています。

dsa – RSAやECDSAとともにNISTはDSAデジタル署名アルゴリズムをFIPS186-4に定義

し、Secure Hash Standard (FIPS 180-4) として定義され、承認されたハッシュ関数との組

み合わせでデジタル署名の生成、検証に使用される場合、これを承認しています。

curve25519 - curve25519 オプションを有効化すると、curve25519 アルゴリズムの使用が

Page 38: wolfSSL ユーザ・マニュアル...Visual Sturdio によるビルドについては、” wolfSSL with Visual Studio” により詳細な説 明があります。 VS2008:Visual

34 © 2004 - 2019 wolfSSL, Inc.

可能となります。デフォルトの curve25519 は多量のメモリを使用し、処理速度が速くなる

よう設定されています。メモリ消費を抑えるために”--enable-curve25519=small” オプショ

ンを使用することができます。ただし、これはスピードとのトレードオフです。

ed25519 – ed25519 オプションを有効化することで、ed25519 アルゴリズムの使用が可能

となります。デフォルトの ed25519 は多量のメモリを使用し、処理速度が速くなるよう設

定されています。メモリ消費を抑えるために”--enable-ed25519=small” オプションを使用

することができます。ただし、curve25519 と同様に、これはスピードとのトレードオフ

です。

クロス・コンパイル

多くの場合、組込み用プラットフォームでユーザー環境向けに wolfSSL をクロス・コンパ

イルします。 ./configure システムを使用するともっとも簡単にクロスコンパイルすること

ができます。これによって、wolfSSL ビルドに使用することができる Makefile を生成し

ます。クロスコンパイルの場合、./configue に対してホストを指定する必要があります。例

えば以下のように:

./configure --host=arm-linux

また、使用したいコンパイラ、リンカーなどの指定も必要となるかも知れません:

./configure --host=arm-linux CC=arm-linux-gcc AR=arm-linux-

ar RANLIB=arm-linux

configure システムにはバグがあって、クロス・コンパイル時にユーザーの malloc をオー

バーライドを検出すると、それに遭遇することがあるかも知れません。もし、’rpl_malloc’

および/または ‘rpl_realloc’ の未定義エラーが起きてしまった場合は、./configure に以下を

追加してください:

ac_cv_func_malloc_0_nonnull=yes ac_cv_func_realloc_0_nonnull=yes

クロス・コンパイル向けに wolfSSL を正しくコンフィグレーションした後、標準の

autoconf 実行でライブラリのビルドとインストールを行ってください。

Page 39: wolfSSL ユーザ・マニュアル...Visual Sturdio によるビルドについては、” wolfSSL with Visual Studio” により詳細な説 明があります。 VS2008:Visual

35 © 2004 - 2019 wolfSSL, Inc.

make

sudo make install

もし、wolfSSL クロス・コンパイルに関してさらにヒントやフィードバックがありました

[email protected] までお知らせください。

Toolchain ビルドの為のクロス・コンパイル例

Toolchain 備考

armebv7-eabihf-glibc ./configure --host=armeb-linux \ CC=armeb-linux-gcc LD=armeb-linux-ld \

AR=armeb-linux-ar \

RANLIB=armeb-linux-ranlib \

CFLAGS="-DWOLFSSL_USER_IO -Os" \

CPPFLAGS="-I./"

armv5-eabi-glibc ./configure --host=arm-linux \ CC=arm-linux-gcc LD=arm-linux-ld \

AR=arm-linux-ar \

RANLIB=arm-linux-ranlib \

CFLAGS="-DWOLFSSL_USER_IO -Os" \

CPPFLAGS="-I./"

armv6-eabihf-glibc ./configure --host=arm-linux \ CC=arm-linux-gcc LD=arm-linux-ld \

AR=arm-linux-ar \

RANLIB=arm-linux-ranlib \

CFLAGS="-DWOLFSSL_USER_IO -Os" \

CPPFLAGS="-I./"

armv7-eabihf-glibc ./configure --host=arm-linux \ CC=arm-linux-gcc LD=arm-linux-ld \

AR=arm-linux-ar \

RANLIB=arm-linux-ranlib \

CFLAGS="-DWOLFSSL_USER_IO -Os" \

CPPFLAGS="-I./"

armv7m-uclibc ./configure --enable-static --disable-shared \ --host=arm-linux CC=arm-linux-gcc \

LD=arm-linux-ld AR=arm-linux-ar \

RANLIB=arm-linux-ranlib \

CFLAGS="-DWOLFSSL_USER_IO -Os" \

CPPFLAGS="-I./"

arm-none-eabi-gcc ./configure --host=arm-none-eabi \

CC=arm-none-eabi-gcc LD=arm-none-eabi-ld \

AR=arm-none-eabi-ar RANLIB=arm-none-eabi-ranlib \

CFLAGS="-DNO_WOLFSSL_DIR \

-DWOLFSSL_USER_IO -DNO_WRITEV \

Page 40: wolfSSL ユーザ・マニュアル...Visual Sturdio によるビルドについては、” wolfSSL with Visual Studio” により詳細な説 明があります。 VS2008:Visual

36 © 2004 - 2019 wolfSSL, Inc.

-mcpu=cortex-m4 -mthumb -Os \

-specs=rdimon.specs" CPPFLAGS="-I./"

mips32--glibc

./configure --host=mips-linux \ CC=mips-linux-gcc LD=mips-linux-ld \

AR=mips-linux-ar \

RANLIB=mips-linux-ranlib \

CFLAGS="-DWOLFSSL_USER_IO -Os" \

CPPFLAGS="-I./"

PowerPc64le-Power8-Glibc ./configure --host=powerpc64le-buildroot-linux-gnu \ CC=powerpc64le-buildroot-linux-gnu-gcc \

LD=powerpc64le-buildroot-linux-gnu-ld \

AR=powerpc64le-buildroot-linux-gnu-ar \

RANLIB=powerpc64le-buildroot-linux-gnu-ranlib \

CFLAGS="-DWOLFSSL_USER_IO -Os" \

CPPFLAGS="-I./"

x86-64-core-i7-glibc ./configure --host=x86_64-linux \ CC=x86_64-linux-gcc LD=x86_64-linux-ld \

AR=x86_64-linux-ar \

RANLIB=x86_64-linux-ranlib \

CFLAGS="-DWOLFSSL_USER_IO -Os" \

CPPFLAGS="-I./"

x86-64-core-i7-musl ./configure --host=x86_64-linux \ CC=x86_64-linux-gcc LD=x86_64-linux-ld \

AR=x86_64-linux-ar \

RANLIB=x86_64-linux-ranlib \

CFLAGS="-DWOLFSSL_USER_IO -Os" \

CPPFLAGS="-I./"

x86-64-core-i7-uclibc ./configure --host=x86_64-linux \ CC=x86_64-linux-gcc LD=x86_64-linux-ld \

AR=x86_64-linux-ar \

RANLIB=x86_64-linux-ranlib \

CFLAGS="-DWOLFSSL_USER_IO -Os" \

CPPFLAGS="-I./"

表 2 クロス・コンパイル例

Page 41: wolfSSL ユーザ・マニュアル...Visual Sturdio によるビルドについては、” wolfSSL with Visual Studio” により詳細な説 明があります。 VS2008:Visual

37 © 2004 - 2019 wolfSSL, Inc.

使用方法

全体説明

wolfSSL は本マニュアル第二章 wolfSSL のビルドで説明したオプションを使用した場合、

yaSSL の約 10 分の 1、OpenSSL の 20 分の 1 以下のサイズとなります。ベンチマークと

フィードバックによれば、ほとんど大多数の標準的 SSL オペレーションにおいて、

OpenSSL に対して wolfSSL は劇的に良い性能を示します。

ビルド手順については本マニュアル第二章 wolfSSL のビルドを参照してください。

テスト・スイート

テストスイート・プログラムは wolfSSL とその暗号ライブラリwolfCrypt の能力をターゲ

ット・システム上でテストするために設計されたものです。

wolfSSL はすべての例題とテストを wolfSSL ホーム・ディレクトリーから実行する必要が

あります。これは証明書と鍵を./certs から見つけるためです。テスト・スイートを実行す

るためには、以下を実行してください:

./testsuite/testsuite

または、

make test (autoconf 使用の場合)

*nix または Windows 上では、例題とテスト・スイートはカレント・ディレクトリーがソ

ース・ディレクトリーかどうかを見てチェックし、wolfSSL ホーム・ディレクトリーに

変更しようとします。これはほとんどのスタートアップのケースでうまく動作しますが、

動作 しない場合は、上記一つ目のほうの方法だけを使用して、フルパスを指定します。

実行が成功すると、以下のようなメッセージが出力されます:

MD5 test passed!

SHA test passed!

SHA-224 test passed!

Page 42: wolfSSL ユーザ・マニュアル...Visual Sturdio によるビルドについては、” wolfSSL with Visual Studio” により詳細な説 明があります。 VS2008:Visual

38 © 2004 - 2019 wolfSSL, Inc.

SHA-256 test passed!

SHA-384 test passed!

SHA-512 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!

GMAC test passed!

Chacha test passed!

POLY1305 test passed!

ChaCha20-Poly1305 AEAD test passed!

AES test passed!

AES-GCM test passed!

RANDOM test passed!

RSA test passed!

DH test passed!

ECC test passed!

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

Client message: hello wolfssl!

Server response: I hear you fa shizzle!

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

33bc1a4570f4f1abccd5c48aace529b01a42ab51293954a297796e90d20970f0 input

33bc1a4570f4f1abccd5c48aace529b01a42ab51293954a297796e90d20970f0 /tmp/output-

7Iyhbo

All tests passed!

これは、すべてのコンフィグレーションとビルドが正しく行われたことを示します。も

し、何かテストがうまく行かない場合は、ビルド・システムが正しくセットアップされて

いるかどうか確認してください。本当の原因となりそうなものとしては、誤ったエンディ

ア ン、64 ビット型が正しく設定していない、などが含まれます。何か非デフォルトの設

定を使用している場合は、いったん外して wolfSSL を再ビルド、再テストしてみてくださ

い。

クライアントの例

Page 43: wolfSSL ユーザ・マニュアル...Visual Sturdio によるビルドについては、” wolfSSL with Visual Studio” により詳細な説 明があります。 VS2008:Visual

39 © 2004 - 2019 wolfSSL, Inc.

example/client にあるクライアントの例を使用して、任意の SSL サーバーに対して

wolfSSL をテストすることができます。使用可能な実行時オプションの一覧は、このク

ライアントを —help アーギュメントで実行してください。

./examples/client/client --help

wolfSSL client 3.15.5 NOTE: All files relative to wolfSSL home dir

Max RSA key size in bits for build is set at : 4096

-? <num> Help, print this usage

0: English, 1: Japanese

-h <host> Host to connect to, default 127.0.0.1

-p <num> Port to connect on, not 0, default 11111

-v <num> SSL version [0-3], SSLv3(0) - TLS1.2(3)), default 3

-V Prints valid ssl version numbers, SSLv3(0) - TLS1.2(3)

-l <str> Cipher suite list (: delimited)

-c <file> Certificate file, default ./certs/client-cert.pem

-k <file> Key file, default ./certs/client-key.pem

-A <file> Certificate Authority file, default ./certs/ca-cert.pem

-Z <num> Minimum DH key bits, default 1024

-b <num> Benchmark <num> connections and print stats

-B <num> Benchmark throughput using <num> bytes and print stats

-s Use pre Shared keys

-d Disable peer checks

-D Override Date Errors example

-e List Every cipher suite available,

-g Send server HTTP GET

-u Use UDP DTLS, add -v 2 for DTLSv1, -v 3 for DTLSv1.2 (default)

-m Match domain name in cert

-N Use Non-blocking sockets

-r Resume session

-w Wait for bidirectional shutdown

-M <prot> Use STARTTLS, using <prot> protocol (smtp)

-f Fewer packets/group messages

-x Disable client cert/key loading

-X Driven by eXternal test case

-j Use verify callback override

-n Disable Extended Master Secret

-H <arg> Internal tests [defCipherList, exitWithRet, verifyFail]

-2 Disable DH Prime check

-1 <num> Display a result by specified language.

0: English, 1: Japanese

example.com:443に対してテストするには、以下のようにしてみてください。これは、--

enable-opensslextra --enable-supportedcurves オプションでビルドしたものを使用しま

す。

./examples/client/client -h example.com -p 443 -d -g

peer's cert info:

issuer : /C=US/O=DigiCert Inc/OU=www.digicert.com/CN=DigiCert SHA2 High

Assurance Server CA

subject: /C=US/ST=California/L=Los Angeles/O=Internet Corporation for

Assigned Names and Numbers/OU=Technology/CN=www.example.org

altname = www.example.net

Page 44: wolfSSL ユーザ・マニュアル...Visual Sturdio によるビルドについては、” wolfSSL with Visual Studio” により詳細な説 明があります。 VS2008:Visual

40 © 2004 - 2019 wolfSSL, Inc.

altname = www.example.edu

altname = www.example.com

altname = example.org

altname = example.net

altname = example.edu

altname = example.com

altname = www.example.org

serial number:0e:64:c5:fb:c2:36:ad:e1:4b:17:2a:eb:41:c7:8c:b0

SSL version is TLSv1.2

SSL cipher suite is TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256

Client Random :

83083A1D84404E66C86D7560A2C6ACEEEB0C35F94FDD5E07BC7507CD4E273B19

SSL connect ok, sending GET...

Server response: HTTP/1.0 200 OK

Accept-Ranges: bytes

Content-Type: text/html

Date: Tue, 20 D

ec 2016 22:52:00 GMT

Last-Modified: Tue, 20 Dec 2016 22:33:12 GMT

Server: ECS

(pae/378A)

Content-Length: 94

Connection: close

<html><head><title>edgecastcdn.net</title></head>

<body><h1>edgecastcdn.net</h1></body></html>

これは、クライアントが(-h) example.com に https のポート(-p) 443 でコネクトするため

に、通常の GET を送信 (-g) していることを示します。(-d) オプションはクライアントにサ

ーバー認証を行わないよう指示するものです。以下はリードバッファへのサーバーからの

最初に出力です。

コマンドラインのアーギュメントが与えられない場合、クライアントは localhost の

wolfSSL のデフォルト・ポート 11111 にコネクトしようとします。サーバーがクライアン

ト認証を要求する場合は、クライアント証明書もロードします。

“-b <num>” アーギュメントを使用して、クライアントは接続のベンチマークをすることが

可能です。クライアントは特定のサーバー/ポートに対して、アーギュメントで指定された

回数の接続を試み、SSL_connect()関数の処理の平均時間をミリ秒で表示します。

./examples/client/client -b 100

SSL_connect avg took: 0.653 milliseconds

デフォルト・ホストを localhost から変更したい場合、またはデフォルト・ポートを

11111 から変更したい場合は、これらの設定を/wolfssl/test.h で変更することができます。

Page 45: wolfSSL ユーザ・マニュアル...Visual Sturdio によるビルドについては、” wolfSSL with Visual Studio” により詳細な説 明があります。 VS2008:Visual

41 © 2004 - 2019 wolfSSL, Inc.

wolfsslIP と wolfsslPort 変数はこれらの設定をコントロールしています。これらの設定を

変更した場合は、テスト・スイートを含むすべての例題を再ビルドしてください。そう し

ないと、テスト・プログラムはお互いにコネクトできなくなってしまいます。

デフォルトでは wolfSS サンプルクライアントは指定されたサーバーに対して TLS1.2

を使用して接続を試みます。”-v” オプションを使用することで、SSL/TLS のバージョン

を変更することができます。このオプションで以下の値が利用可能です:

-v 0 = SSL 3.0 (デフォルトでは無効化されています)

-v 1 = TLS 1.0

-v 2 = TLS 1.1

-v 3 = TLS 1.2

-v 4 = TLS 1.3

サンプル・プログラムを使用していて、よくあるエラーとして -155 があります。

err = -155, ASN sig error, confirm failure

これは通常、wolfSSL クライアントが接続しようとするサーバーの証明書の認証ができ

ないことが原因です。デフォルトでは wolfSSL クライアントは、yaSSL test CA 証明

書を信頼するルート証明書としてロードします。この test CA 証明書は、異なる CA に

よって署名された外部のサーバー証明書を認証することはできません。このように、この

問題を解決す るには、”-d”オプションを使って相手がた(server) の認証をオフにす

るか、

./examples/client/client -h myhost.com -p 443 –d

“-A” コマンドライン・オプションを使って、正しい CA 証明書を wolfSSL クライアン

トにロードしなければなりません。

./examples/client/client -h myhost.com -p 443 -A serverCA.pem

Page 46: wolfSSL ユーザ・マニュアル...Visual Sturdio によるビルドについては、” wolfSSL with Visual Studio” により詳細な説 明があります。 VS2008:Visual

42 © 2004 - 2019 wolfSSL, Inc.

サーバーの例

サーバ・サンプルプログラムでは、オプションでクライアント認証をすることもできる簡

単な SSL サーバーをデモンストレートします。一つのクライアント接続だけをアクセプト

し、サーバーは停止します。通常モード(コマンドライン・アーギュメントなし)のクラ

イ アントサンプルプログラムはサーバ・サンプルに対して正常に動作しますが、クライア

ント プログラムに対してコマンドライン・アーギュメントを指定することで、クライアン

ト証 明書をロードさせないと wolfSSL_connect()は(サーバー側で ”-d”クライアント認証

を無効化していない限り)異常終了します。サーバーは “-245, peer didn’t send cert (相手

がたが証明書を送ってこなかった)” をレポートします。クライアント・サンプルプログラ

ムと同様に、サーバーはコマンドライン・アーギュメントを使用することができます。

./examples/server/server --help

-? <num> Help, print this usage

0: English, 1: Japanese

-p <num> Port to listen on, not 0, default 11111

-v <num> SSL version [0-3], SSLv3(0) - TLS1.2(3)), default 3

-l <str> Cipher suite list (: delimited)

-c <file> Certificate file, default ./certs/server-cert.pem

-k <file> Key file, default ./certs/server-key.pem

-A <file> Certificate Authority file, default ./certs/client-cert.pem

-R <file> Create Ready file for external monitor default none

-D <file> Diffie-Hellman Params file, default ./certs/dh2048.pem

-Z <num> Minimum DH key bits, default 1024

-d Disable client cert check

-b Bind to any interface instead of localhost only

-s Use pre Shared keys

-u Use UDP DTLS, add -v 2 for DTLSv1, -v 3 for DTLSv1.2

(default)

-f Fewer packets/group messages

-r Allow one client Resumption

-N Use Non-blocking sockets

-S <str> Use Host Name Indication

-w Wait for bidirectional shutdown

-x Print server errors but do not close connection

-i Loop indefinitely (allow repeated connections)

-e Echo data mode (return raw bytes received)

-B <num> Benchmark throughput using <num> bytes and print stats

-g Return basic HTML web page

-C <num> The number of connections to accept, default: 1

-H <arg> Internal tests [defCipherList, exitWithRet, verifyFail]

-2 Disable DH Prime check

-1 <num> Display a result by specified language.

0: English, 1: Japanese

EchoServer の例

Page 47: wolfSSL ユーザ・マニュアル...Visual Sturdio によるビルドについては、” wolfSSL with Visual Studio” により詳細な説 明があります。 VS2008:Visual

43 © 2004 - 2019 wolfSSL, Inc.

EchoServer の例では、無限ループで無限回のクライアント・コネクションを待ちます。ク

ライアントが何を送ろうと、echoserver はそれをエコーバックします。クライアント例が

echoserver に対して3つすべてのモードを使用できるように、クライアント認証は実行さ

れないようになっています。以下の4つの特別なコマンドについてはエコーバックされ

ず、echoserver に特定のアクションをとるように指示します。

1. “quit” echoserver が文字列 “quit” を受信した場合、ショットダウンします。

2. “break” echoserver が文字列 “break” を受信した場合、カレントのセッションを停止します

が、リクエストの処理は継続します。これは特に DTLS のテストのために便利です。

3. “printstats” echoserver が文字列 “printstats” を受信した場合、セッションキャッシュにつ

いての統計情報を出力します。

4. “GET” echoserver が文字列 “GET” を受信した場合、http get として扱い、 “greeting

from wolfSSL” メッセージの簡単なページを送り返します。これによって、Safari, IE,

Firefox, gnutls その他の各種 TLS/SSL クライアントが echoserver の例に対してテストするこ

とができます。

NO_MAIN_DRIVER が定義されていない限り、echoserver の出力は標準出力に出力され

ます。シェルやコマンドラインの第一アーギュメントで出力先を変更することができま

す。Echoserver の出力で Output.txt という名前のファイルに出力するには以下のような

コマンドを実行します。

./examples/echoserver/echoserver output.txt

EchoClient の例

echoclient の例はインタラクティブ・モードまたはファイルとともにバッチ・モードで実行

することができます。インタラクティブ・モードで実行して、”hell”、“wolfssl”と“quit” の

3つの文字列を書くと、以下のようになります:

./examples/echoclient/echoclient

hello

hello

Page 48: wolfSSL ユーザ・マニュアル...Visual Sturdio によるビルドについては、” wolfSSL with Visual Studio” により詳細な説 明があります。 VS2008:Visual

44 © 2004 - 2019 wolfSSL, Inc.

wolfssl

wolfssl

quit

sending server shutdown command: quit!

入力ファイルを使用するには、ファイル名をコマンド行の第一アーギュメントに指定しま

す。ファイル input.txt の内容をエコーさせる場合、以下のように発行してください:

./examples/echoclient/echoclient input.txt

結果をファイルに出力したい場合、出力ファイル名を次のコマンド行アーギュメントに指

定することができます。以下のコマンドは、input.txt ファイルの内容をエコーし、

output.txt ファイルにサーバーからの結果を書き出します。

./examples/echoclient/echoclient input.txt output.txt

テストスイート・プログラムは入力をハッシュし、出力ファイルに書き出し、クライアン

トと サーバーが正しく期待された結果を送受していることを確認しているだけです。

ベンチマーク

多くのユーザーの皆様は wolfSSL 組込み SSL ライブラリが特定のハードウェアの上、もし

くは特定の環境下でどのような性能になるのか興味をお持ちかと思います。今日の組込

み、企業システム、またクラウド・ベースの環境などを使った、非常に多様なプラットフ

ォームやコンパイラに対して、さまざまなボード相互の一般的な性能評価は難しくなって

います。

wolfSSL/wolfCrypt の SSL 性能評価をされる wolfSSL ユーザーの皆様のために、ベンチマ

ーク・アプリケーションが wolfSSL にバンドルされ提供されています。wolfSSL はデフォ

ルトではすべての暗号操作に wolfCrypt 暗号ライブラリを使用しています。ベースとなっ

てる暗号は SSL/TLS の性能に非常にクリティカルな側面なので、我々のベンチマーク・ア

プリケーションは wolfCrypt の各アルゴリズムに対して性能テストを実行しています。

wolfcrypt/benchimark (./wolfcrypt/benchmar/benchmark) にあるベンチマーク・ユーティ

リティーをwolfCryptの暗号化機能のベンチマークに使用することができます。典型的

な出力は下記のような感じになります(この出力例では、HC-128, RABBIT, ECC, SHA-

Page 49: wolfSSL ユーザ・マニュアル...Visual Sturdio によるビルドについては、” wolfSSL with Visual Studio” により詳細な説 明があります。 VS2008:Visual

45 © 2004 - 2019 wolfSSL, Inc.

256, SHA-512, AES-GCM, AES-CCMおよびCamelliaを含むオプショナルなアルゴリズ

ム、暗号を含んでいます。):

./wolfcrypt/benchmark/benchmark

RNG 50 megs took 0.516 seconds, 96.975 MB/s Cycles per byte = 22.57

AES enc 50 megs took 0.278 seconds, 179.737 MB/s Cycles per byte = 12.18

AES dec 50 megs took 0.260 seconds, 192.029 MB/s Cycles per byte = 11.40

AES-GCM 50 megs took 0.840 seconds, 59.552 MB/s Cycles per byte = 36.75

AES-CCM 50 megs took 0.534 seconds, 93.548 MB/s Cycles per byte = 23.39

Camellia 50 megs took 0.376 seconds, 132.928 MB/s Cycles per byte = 16.46

HC128 50 megs took 0.032 seconds, 1550.586 MB/s Cycles per byte = 1.41

RABBIT 50 megs took 0.109 seconds, 459.559 MB/s Cycles per byte = 4.76

CHACHA 50 megs took 0.144 seconds, 347.427 MB/s Cycles per byte = 6.30

CHA-POLY 50 megs took 0.190 seconds, 262.978 MB/s Cycles per byte = 8.32

IDEA 50 megs took 0.807 seconds, 61.982 MB/s Cycles per byte = 35.31

MD5 50 megs took 0.111 seconds, 452.121 MB/s Cycles per byte = 4.84

POLY1305 50 megs took 0.039 seconds, 1281.392 MB/s Cycles per byte = 1.71

SHA 50 megs took 0.118 seconds, 424.747 MB/s Cycles per byte = 5.15

SHA-224 50 megs took 0.242 seconds, 206.789 MB/s Cycles per byte = 10.58

SHA-256 50 megs took 0.243 seconds, 206.022 MB/s Cycles per byte = 10.62

SHA-384 50 megs took 0.172 seconds, 290.787 MB/s Cycles per byte = 7.53

SHA-512 50 megs took 0.175 seconds, 286.117 MB/s Cycles per byte = 7.65

scrypt 39.698 milliseconds, avg over 10 iterations

RSA 2048 public 0.358 milliseconds, avg over 100 iterations

RSA 2048 private 4.537 milliseconds, avg over 100 iterations

DH 2048 key generation 1.391 milliseconds, avg over 100 iterations

DH 2048 key agreement 1.422 milliseconds, avg over 100 iterations

ECC 256 key generation 0.885 milliseconds, avg over 100 iterations

EC-DHE key agreement 0.874 milliseconds, avg over 100 iterations

EC-DSA sign time 0.929 milliseconds, avg over 100 iterations

EC-DSA verify time 0.602 milliseconds, avg over 100 iterations

これは特に、数学ライブラリの変更前後の公開鍵のスピードを比較するのに有効です。 通

常の数学ライブラリ(./counfigure)、fastmath (./configure --enable-fastmath) または

fasthugemath ライブラリ (./configure --enable-fasthugemath) を使用した結果をテス

トすることができます。

さらに詳細とベンチマーク結果については、wolfSSL のベンチマーク・ページを参照し

てください(https://wolfssl.com/wolfSSL/benchmarks-wolfssl.html)。

相対的性能

Page 50: wolfSSL ユーザ・マニュアル...Visual Sturdio によるビルドについては、” wolfSSL with Visual Studio” により詳細な説 明があります。 VS2008:Visual

46 © 2004 - 2019 wolfSSL, Inc.

個々の暗号化とアルゴリズムの性能はホストとなるプラットフォームに依存しますが、次

のグラフは wolfCrypt の暗号間での相対的性能を示しています。これらのテストは

Macbook Pro (OSx 10.6.8) Intel Core i7, 2.2GHz で実行されたものです。

図 1 暗号間での相対性能グラフ

SSL/TLS 接続時に特定のスイートのみに限定したい場合、wolfSSL が使用する暗号化スイ

ーツをカスタマイズすることができます。wolfSSL_CTX_new(SSL_CTX_net)で次のよう

に指定します。

wolfSSL_CTX_set_cipher_list(ctx, “AES128-SHA”);

ベンチマークに関するコメント

1. プロセッサのネイティブのレジスタサイズ(32 対 64 ビット)は 1000 ビット以上の公開鍵の処理を行う場合大きな違いをもたらします。

2. keygen (--enable-keygen) オプションで、ベンチマーク・ユーティリティの実行時に鍵生成のスピードをベンチマークすることもできます。

3. fastmath (--enable-fastmath) オプションにより公開鍵処理における動的メモリを削減、処理速度が改善します。32 ビットプラットフォーム上で fastmath のビルドに問題がある場合、PIC

Page 51: wolfSSL ユーザ・マニュアル...Visual Sturdio によるビルドについては、” wolfSSL with Visual Studio” により詳細な説 明があります。 VS2008:Visual

47 © 2004 - 2019 wolfSSL, Inc.

が一つのレジスタを占有しないように共有ライブラリを無効化します。

./configure --enable-fastmath --disable-shared

make clean

make

注:wolfSSL でコンフィグ・オプションを変更した場合、”make clean”すること

をお勧めします。

4. デフォルトでは、fastmath は可能な限りアセンブリー最適化を使用します。アセンブリー最適化が機能しない場合も、wolfSSL のビルド時に FTM_NO_ASM を CFLAGS に加えることでアセンブリー最適化無しでビルド可能です。

./configure --enable-fastmath CFLAGS=DTFM_NO_ASM

5. 組込みプラットフォームで実行しないユーザーは、masthugemath オプション使用でfastmath

をさらにプッシュすることが可能です。

./configure --enable-fasthugemath

6. wolfSSL のデフォルトビルドで、メモリ使用と性能の良いバランスについてこれまで説明の通り

試行できます。どちらか一方により関心が高いユーザーは第 2 章に戻って、さらなる wolfSSL

コンフィグレーション・オプションを参照ください。

7. バルク転送:wolfSSL のデフォルトでは、128 バイトの I/O バッファを使用します。およそ 80%の SSL トラフィックはこのサイズにおさまり、動的メモリの使用を抑えるといわれています。バルク転送が要求される場合は、16K バイト(SSL の最大サイズ)を使用するよう構成が可能です。

組込みシステムに対するベンチマーク

組込みシステムでのベンチマーク・アプリケーションのビルドを容易にするために幾つか

の ビルド・オプションが用意されています。

BENCH_EMBEDDED – このオプションの有効化でベンチマーク・アプリケーションをメ

ガバイトからキロバイドを使用するように切り替え、メモリ使用量を削減します。このオ

プションを使用した場合、デフォルトでは暗号とアルゴリズムは 25k バイトでベンチマー

クされます。公開鍵アルゴリズムは1回の繰り返しのみ(幾つかの組みこみプロセッサで

の公開鍵処理はかなり遅いので)に対してベンチマークされます。これらは benchmark.c

の BENCH_EMBEDDED 定義内の “numBlocks” と “times” 変数を取り替えることで調

Page 52: wolfSSL ユーザ・マニュアル...Visual Sturdio によるビルドについては、” wolfSSL with Visual Studio” により詳細な説 明があります。 VS2008:Visual

48 © 2004 - 2019 wolfSSL, Inc.

整可能です。

USE_CERT_BUFFER_1024 - この定義を有効化することで、ベンチマーク・アプリケー

ションはテスト用の鍵と証明書をファイル・システムからのロードではなく、

<wolfssl_root>/wolfssl/cert_test.h にある 1024 ビット鍵と証明書バッファを使用するよう

に切り替わります。これは、組込み向けプラットフォームにファイル・システムが無い場

合、2048 ビット公開鍵処理が妥当でない遅いプロセッサに有効です (NO_FILESYSTEM

と共に使用)。

USE_CERT_BUFFER_2048 - この定義を有効化すると USE_CERT_BUFFER_1024 と

似ていますが、 1024 ビットではなく 2048 ビットの鍵と証明書バッファを受け付けます。

この定義はプロセッサの処理が 2048 ビット公開鍵処理のために十分速位けれど鍵と証明書

をロードしてくるためのファイル・システムがない場合、有効です。

クライアント・アプリケーションを wolfSSL 用に修正

このセクションでは、wolfSSL のネイティブ API を使用してクライアント・アプリケーシ

ョンに wolfSSL を加えるのに必要な基本的ステップを説明します。サーバー側の例につい

ては次のセクション9を参照してください。「wolfSSL SSL チュートリアル」ではサンプ

ル・コードを使ったより詳細なウォークスルーを掲載しています。OpenSSL 互換レイヤー

の使用を希望する場合は、ユーザ・マニュアル第十三章を参照してください。

1. wolfSSL ヘッダーをインクルードする。

#include <wolfssl/ssl.h>

2. すべての read() (または recv())関数呼び出しを wolfSSL_read() に変更する。

result = read(fd, buffer, bytes);

result = wolfSSL_read(ssl, buffer, bytes);

となります。

3. すべての write (または send) 関数呼び出しを wolfSSL_write()に変更する。

Page 53: wolfSSL ユーザ・マニュアル...Visual Sturdio によるビルドについては、” wolfSSL with Visual Studio” により詳細な説 明があります。 VS2008:Visual

49 © 2004 - 2019 wolfSSL, Inc.

result = write(fd, buffer, bytes);

result = wolfSSL_write(ssl, buffer, bytes);

となります。

4. wolfSSL_connect() を呼び出す。

5. wolfSSL と WOLFSSL_CTX を初期化します。WOLFSSL オブジェクトをいくつ生成する場合でも、一つの WOLFSSL_CTX を使用できます。基本的に、コネクトしようとするサーバーに対して証明するための CA 証明書をロードしなければならないだけです。基本的な初期化は以下のような感じになります:

wolfSSL_Init();

WOLFSSL_CTX* ctx;

if ( (ctx = wolfSSL_CTX_new(wolfTLSv1_client_method())) == NULL) {

fprintf(stderr, "wolfSSL_CTX_new error.\n");

exit(EXIT_FAILURE);

}

if (wolfSSL_CTX_load_verify_locations(ctx,"./ca-cert.pem",0) !=

SSL_SUCCESS) {

fprintf(stderr, "Error loading ./ca-cert.pem,"

" please check the file.\n");

exit(EXIT_FAILURE);

}

6. 各 TCP コネクトし、ファイル・ディスクリプタをセッションに関連付けた後、WOLFSSL を生成します:

/*after connecting to socket fd*/

WOLFSSL* ssl;

if ( (ssl = wolfSSL_new(ctx)) == NULL) {

fprintf(stderr, "wolfSSL_new error.\n");

exit(EXIT_FAILURE);

}

wolfSSL_set_fd(ssl, fd);

7. エラーチェック。各 wolfSSL_read() または wolfSSL_write() 呼び出しは、read()またはwrite()と同じように、

成功した書き込みバイト数、コネクション・クローズに対して0、 エラーに対して-1を返します。エラー時に、

以下のような二つの関数を使って、エラー 情報をさらに取得できます:

char errorString[80];

int err = wolfSSL_get_error(ssl, 0);

wolfSSL_ERR_error_string(err, errorString);

Page 54: wolfSSL ユーザ・マニュアル...Visual Sturdio によるビルドについては、” wolfSSL with Visual Studio” により詳細な説 明があります。 VS2008:Visual

50 © 2004 - 2019 wolfSSL, Inc.

ノンブロック型ソケットを使用している場合は、EAGAIN / EWOULDBLOCK でエラーを、あるいは、

より正確には特定のエラー・コードを SSL_ERROR_WANT_READ または

SSL_ERROR_WANT_WRITE でテストすることができます。

8. 後処理。各 WOLFSSL オブジェクトを使用した後、下記の呼び出しでクリーンアップすることができます:

wolfSSL_free(ssl);

SSL/TLS の使用をすべて完全に完了した場合は、WOLFSSL_CTX を以下のように呼び出して解

放することができます:

wolfSSL_CTX_free(ctx); wolfSSL_Cleanup();

サーバ・アプリケーションを wolfSSL 用に変更

このセクションでは、wolfSSL のネイティブ API を使用してサーバ・アプリケーションに

wolfSSL を加えるのに必要な基本的ステップを説明します。クライアント側の例について

は前のセクション8を参照してください。「wolfSSL SSL チュートリアル」ではサンプ

ル・コードを使ったより詳細なウォークスルーを掲載しています。

1. 前述のクライアント向けの説明に従ってください。ただし、ステップ5のクライアント・ メソッドはサーバ・メソッドに読み替えてください。

クライアントに SSLv3 と TLSv1+でサーバーコネクトを許可するには、

wolfSSL_CTX_new(wolfTLSv1_client_method())

を wolfSSL_CTX_new(wolfTLSv1_server_method()) または

wolfSSL_CTX_new(wolfSSLv23_server_method()) とします。

2. 上記ステップ5の初期化に、サーバーの証明書と鍵ファイルを加えます。 if (wolfSSL_CTX_use_certificate_file(ctx,"./server-cert.pem",

SSL_FILETYPE_PEM) != SSL_SUCCESS) {

fprintf(stderr, "Error loading ./server-cert.pem,"

" please check the file.\n");

exit(EXIT_FAILURE);

}

if (wolfSSL_CTX_use_PrivateKey_file(ctx,"./server-key.pem",

SSL_FILETYPE_PEM) != SSL_SUCCESS) {

fprintf(stderr, "Error loading ./server-key.pem,"

Page 55: wolfSSL ユーザ・マニュアル...Visual Sturdio によるビルドについては、” wolfSSL with Visual Studio” により詳細な説 明があります。 VS2008:Visual

51 © 2004 - 2019 wolfSSL, Inc.

" please check the file.\n");

exit(EXIT_FAILURE);

}

ファイル・システムが無い場合、証明書と鍵をバッファからロードすることも可能で

す。wolfSSL_CTX_use_certificate_buffer() と

wolfSSL_CTX_use_PrivateKey_buffer() について詳しくはAPIドキュメントを参照し

てください。

wolfSSL を使ったサーバ・アプリケーションの例については、

<wolfsssl_root>/examples/serve.cファイルにあるサーバ・サンプルを参照してくださ

い。

Page 56: wolfSSL ユーザ・マニュアル...Visual Sturdio によるビルドについては、” wolfSSL with Visual Studio” により詳細な説 明があります。 VS2008:Visual

52 © 2004 - 2019 wolfSSL, Inc.

機能

wolfSSL は基本インターフェースとして C 言語をサポートしますが、そのほかにも Java,

PHP, Perl および Python(swig インターフェース経由)などを含むホスト言語をサポー

トします。その他のプログラミング言語から wolfSSL を利用されることをご検討の際は弊

社までお問合わせください。

この章では、ストリーム暗号化、AES-NI、IPv6、SSL 検査のサポートなど wolfSSL のい

くつかの機能について、より詳細に説明します。

概要

wolfSSL の概要については、以下の wolfSSL 製品 Webページを参照ください:

https://www.wolfssl.jp/products/wolfssl/

プロトコル・サポート

wolfSSL は SSL3.0, TLS(1.0, 1.1, 1.2 及び 1.3 および DTLS(1.0 と 1.2)をサポートしま

す。ユーザーは以下の関数のうちの一つを利用して使用するプロトコルを容易に選択する

ことができます(クライアントまたはサーバーとして)。wolfSSL は、セキュリティ上

問題があるため SSL2.0 はサポートしていません。以下のクライアントおよびサーバー関数

はOpenSSL 互換レイヤーを利用する場合、若干違いがあります。OpenSSL 互換関数につ

いては、ユーザ・マニュアルの第 13 章を参照ください。

サーバ関数

wolfDTLSv1_server_method(void); /*DTLS 1.0*/

wolfDTLSv1_2_server_method(void); /*DTLS 1.2*/

wolfSSLv3_server_method(void); /*SSL 3.0*/

wolfTLSv1_server_method(void); /*TLS 1.0*/

wolfTLSv1_1_server_method(void); /*TLS 1.1*/

wolfTLSv1_2_server_method(void); /*TLS 1.2*/

wolfTLSv1_3_server_method(void); /*TLS 1.3*/

wolfSSLv23_server_method(void); /* SSLv3 - TLS 1.3のうち利用可能な

最も高いバージョンを利用*/

Page 57: wolfSSL ユーザ・マニュアル...Visual Sturdio によるビルドについては、” wolfSSL with Visual Studio” により詳細な説 明があります。 VS2008:Visual

53 © 2004 - 2019 wolfSSL, Inc.

wolfSSLはwolfSSLv23_server_method()関数を利用して堅牢なサーバ・ダウングレードを

サポートします。詳細は4.2.3を参照してください。

クライアント関数

wolfDTLSv1_client_method(void); /* DTLS 1.0*/

wolfDTLSv1_2_client_method(void); /* DTLS 1.2*/

wolfSSLv3_client_method(void); /* SSL 3.0*/

wolfTLSv1_client_method(void); /* TLS 1.0*/

wolfTLSv1_1_client_method(void); /* TLS 1.1*/

wolfTLSv1_2_client_method(void); /* TLS 1.2*/

wolfTLSv1_3_client_method(void); /* TLS 1.3*/

wolfSSLv23_client_method(void); /* SSLv3 - TLS 1.3のうち利用可能な

最も高いバージョンを使用*/

wolfSSLはwolfSSLv23_client_method()関数を利用して堅牢なクライアント・ダウングレ

ードをサポートします。詳細は4.2.3を参照してください。

これらの関数の利用方法の詳細は本マニュアルの”第3章:使用方法”参照してください。ま

た、SSL3.0, TLS1.0, 1.1, 1.2およびDTLSの比較についてはユーザ・マニュアルの

Appendix Aを参照してください。これまでのTLSとTLS1.3の比較については Appendix

これまでの TLS とTLS1.3 の違いを参照してください。

堅牢なクライアントおよびサーバ・ダウングレード

wolfSSL クライアントおよびサーバーは双方とも堅牢なバージョン・ダウングレード機能

を持っています。もし、ある特定のプロトコル・バージョンのメソッドがどちらかの側で

使用されていると、そのバージョンだけがネゴシエートされるか、エラーが返却されてし

ま います。たとえば、クライアントが TLSv1 を使用していて、SSLv3 のみのサーバーに

コネクトしようとすると失敗となってしまいます。同じように、TLS1.1 にコネクトしよう

としても失敗となってしまいます。

この問題を解決するために、wolfSSLv23_client_method() 関数を使用するクライアントは

サーバー側でサポートされているもっとも高いプロトコル・バージョンを利用し、必要な

ら ば SSLv3 までダウングレードします。この場合、クライアントは SSLv3 から TLSv1.3

が動作しているサーバーにコネクトすることができます。長年セキュリティ上問題がある

Page 58: wolfSSL ユーザ・マニュアル...Visual Sturdio によるビルドについては、” wolfSSL with Visual Studio” により詳細な説 明があります。 VS2008:Visual

54 © 2004 - 2019 wolfSSL, Inc.

とされる SSLv2 にだけはコネクトすることができません。

似たように、wolfSSLv23_server_method()を使用するサーバーは SSLv3 から TLSv1.3 の

プロトコル・バージョンをサポートするクライアントを取り扱うことができます。wolfSSL

サーバーはセキュリティ上問題のある SSLv2 からのコネクションについては受け入れませ

ん。

IPv6 サポート

IPv6 対応で組込み SSL を利用したいユーザーは、wolfSSL が IPv6 サポートかどうか

疑問に思われているかもしれません。答は Yes。wolfSSL は IPv6 上で動作します。

wolfSSL は IP 中立に設計されており、IPv4 でも IPv6 でも動作しますが、現行のテス

ト・アプリケーションでは IPv4 をデフォルトとしています(他の多くのシステムと同

様に)。テスト・アプリケーションを IPv6 に変更するには、wolfSSL ビルド時に--

enable-ipv6 オプションを使用してください。

IPv6 に関する詳しい情報は:http://en.wikipedia.org/wiki/IPv6

DTLS

上のリストに挙げたように、wolfSSL はクライアント、サーバー両方の DTLS(「データ

グラム」TLS)をサポートします。現在のサポートバージョンは DTLS1.0 です。

TLS プロトコルは(TCP のように)信頼性のある媒体におけるセキュアなトランスポー

ト・チャネルを提供するよう設計されました。アプリケーション層のプロトコルが(SIP

や各種ゲーム・プロトコルのように)UDP トランスポートを使用して開発されはじめるに

従って、通信遅れに対して敏感なアプリケーションのための通信セキュリティを提供 する

方法に対するニーズが高まってきました。そのようなニーズが DTLS プロトコルの誕生を

導きました。

多くの人々は TLS と DTLS の違いは TCP と UDP と同様だと理解していますが、これは

誤解です。UDP は(TCP と比べ)ハンドシェイク無し、通信切れサポート無し、またはパ

ケットロスに対する遅れ無しなどの利点があります。一方、DTLS は拡張された SSL ハン

ドシェイク、通信切れに対するサポート、また、ハンドシェイクに対して TCP のような挙

Page 59: wolfSSL ユーザ・マニュアル...Visual Sturdio によるビルドについては、” wolfSSL with Visual Studio” により詳細な説 明があります。 VS2008:Visual

55 © 2004 - 2019 wolfSSL, Inc.

動を実現しなければなりません。つまり、DTLS は UDP が信頼できるコネクションと引き

換えに提供する利点を無効にしてしまっています。

--enable-dtls ビルド・オプションを使用して wolfSSL をビルドすることで、DTLS を有効

化することができます。

Lightweight Internet Protocol (lwIP)

wolfSSL はそのまま変更なしで Lightweight Internet Protocol (lwIP)をサポートします。

このプロトコルを使用するためには単に WOLFSSL_LWIP を定義するだけです。また

は、 settings.h ファイルにて次の行のコメントを外します。

/*#define WOLFSSL_LWIP*/

lwIP はフルの TCP スタックを提供しながら RAM 消費量の削減にフォーカスしていま

す。このフォーカスは wolfSSL の SSL/TLS におけるフォーカスと理想的なマッチングで

す。

暗号化サポート

暗号化スイート強度と適切な鍵サイズの選択

現在どの暗号化が使用されているかを見るには、次のメソッドを呼び出すことができま

す。

wolfSSL_get_ciphers()

この関数はカレントの暗号化スイーツを返却します。

暗号化スイートはそれぞれ異なった強度を実現します。異なる種類のアルゴリズム(認

証、 暗号化おおよびメッセージ認証コード(MAC))で作られるため選択する鍵サイズ

により それぞれの強度が異なることになります。暗号化スイートの強度に関してグレード

付けする 方法は様々で、対称型か公開鍵アルゴリズムの鍵サイズ、アルゴリズム種別、性

能、また は既知の脆弱性などとも絡んで、プロジェクトや企業によっても異なってくるよ

うです。

Page 60: wolfSSL ユーザ・マニュアル...Visual Sturdio によるビルドについては、” wolfSSL with Visual Studio” により詳細な説 明があります。 VS2008:Visual

56 © 2004 - 2019 wolfSSL, Inc.

NIST(Nathional Institute of Standards and Technology)はそれぞれの異な

る鍵サイズに対して比較可能なアルゴリズムの強度を提供することで、採用可能な暗号化

スイート選択 についてレコメンデーションを作成しています。暗号化アルゴリズムの強度

はアルゴリズ ムに使用される鍵サイズに依存します。NIST Special Publication、

SP800-57 では、以下のように、二つのアルゴリズムは等価な強度を持つと述べて

います。

「…二つのアルゴリズムは、与えられた鍵サイズ(X と Y)に対して『アルゴリズムを破る』ま

たは鍵(与えられた鍵サイズにおいて)を決定するのに必要とされた仕事量が与えられた資

源を使用してほぼ同じであるならば、互換の強度と考えられる。与えられた鍵サイズにおけ

るあるアルゴリズムのセキュリティ強度は、伝統的に、対称アルゴリズムのある鍵サイズ“X”

がショートカット・アタッ クを持っていない場合(すなわち、すべての可能な鍵を試すこと

が最も効率が良いような場合)においてすべての鍵を試すのに必要な仕事量として説明さ

れる。」

次の二つの表は NIST SP800-57 の表2(64 ページ)と表4(66 ページ)から引用して、

(NIST の、セキュリティのビットを使用するときのセキュリティ寿命に対する推奨をベー

スに)アルゴリズムと強度の計測とともにアルゴリズム間のセキュリティ強度比 較を示し

たものです。

注:以下の表で“L”は有限体暗号(FFC)のための公開鍵のサイズ、“N” は FFC のための

秘密鍵のサイズ、“k”は素因数分解暗号化(IFC)のための鍵サイズ、“f”は楕円曲線暗号化

のための鍵サイズです。

セキュリティ

ービット数

対称鍵アルゴリ

ズム

FFC 鍵サイズ

(DSA, DH,

etc)

IFC 鍵サイズ

(RSA, etc.)

ECC 鍵サイズ

(ECDSA, etc)

80 2TDEA ほか L = 1024

N = 160

k = 1024 F = 160 - 223

128 AES-128 ほか L = 3072

N = 256

k =3072 F = 256 - 383

Page 61: wolfSSL ユーザ・マニュアル...Visual Sturdio によるビルドについては、” wolfSSL with Visual Studio” により詳細な説 明があります。 VS2008:Visual

57 © 2004 - 2019 wolfSSL, Inc.

192 AES-192 ほか L = 7680

N = 384

k =7680 F = 384 - 511

256 AES-256 ほか L = 15360

N = 512

k =15360 F = 512 +

表 3 相対ビットと鍵強度表

セキュリティービット 説明

80 2010 年まで有効

128 2030 年まで有効

192 長期間プロテクション

256 予見できる限りセキュア

表 4 ビット強度の説明

この表をガイドとして使用し暗号化スイートの分類を始めるため、対称鍵暗号化アルゴリ

ズ ムの強度を基本に分類しました。このようにして、おおざっぱなグレード分類をセキュ

リティのビット数をベースに暗号化スイート毎に分類することができます(対称鍵暗号の

鍵 サイズを考慮にいれるだけで)。

強度「低」 = 128 ビット未満のセキュリティ

強度「中」 = 128 ビット程度のセキュリティ

強度「高」 = 128 ビット以上のセキュリティ

対称鍵暗号の強度の外では、暗号化スイートの強度は鍵交換と認証アルゴリズム鍵の鍵サ

イズに多く依存しています。その強度は暗号化スイートのもっとも弱いリンクと同程度と

なり ます。

上記のグレーディング手法(対称鍵暗号アルゴリズムの強度だけに基づいた)に従って、

wolfSSL2.0.0 では強度「低」の暗号化スイート0個、強度「中」の暗号化スイート 12

個、強度「高」の暗号化スイート 8 個をサポートしています(この後に示す通り)。この

強度分類は関係する他のアルゴリズムに選択された鍵サイズに依存して変わる可能性があ

ります。 ハッシュ関数のセキュリティ強度に関しては NISTSP800-57 の表3(64 ペー

ジ)を参照してください。

いくつかのケースで、「輸出」暗号化と示される暗号化を目にするかと思います。これら

Page 62: wolfSSL ユーザ・マニュアル...Visual Sturdio によるビルドについては、” wolfSSL with Visual Studio” により詳細な説 明があります。 VS2008:Visual

58 © 2004 - 2019 wolfSSL, Inc.

の暗号化は、(1992 年以前の)合衆国の歴史上、米国から強固な暗号化を持つソフトウェ

アの輸出は違法であったころに端を発しています。強固な暗号化は米国政府によって「軍

需品」(核兵器、戦車、弾道ミサイルなどと同じ)として分類されていました。この制限

により、輸出されるソフトウェアには「弱められた」暗号化(おもに小さな鍵サイズ で)

を添付していました。今日、この制限は撤廃され、「輸出」暗号化のようなものは必 要と

されなくなりました。

サポートされる暗号化スイート

以下の暗号化スイートが wolfSSL によってサポートされます。暗号化スイートは認証、暗

号化、コネクションの設定のために TLS または SSL のハンドシェイクで利用されるメッ

セージ認証コード(MAC)アルゴリズムの組み合わせになります。

それぞれの暗号化スイートは鍵交換アルゴリズム、バルク暗号アルゴリズム、およびメッ

セージ認証コード・アルゴリズムを定義します。鍵交換アルゴリズム(RSA、ECC、

DDS、DH、EDH)は、クライアントとサーバーがハンドシェイク・プロセスの間に認証

する方法について決定します。ブロック暗号およびストリーム暗号を含むバルク暗号アル

ゴリズム(DES、3DES、AES、ARC4、RABBIT、HC-128)はメッセージ・ストリーム

を暗号化するのに使用されます。メッセージ認証コード(MAC)アルゴリズム(MD2、

MD5、SHA-1、SHA-256、 SHA-512、RIPEMD)はメッセージ・ダイジェストを生成す

るためのハッシュ関数です。

以下の表は<wolfssl_root>/wolfssl/internal.h (706 行目あたりから)の暗号スイーツに対

応しています。もし表に探している暗号スイートが見つからない場合は追加に関して

wolfSSL にコンタクトしてください。

Page 63: wolfSSL ユーザ・マニュアル...Visual Sturdio によるビルドについては、” wolfSSL with Visual Studio” により詳細な説 明があります。 VS2008:Visual

59 © 2004 - 2019 wolfSSL, Inc.

wolfSSL 暗号スイーツ

(3.10.0 版)

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

SSL_RSA_WITH_IDEA_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

静的 ECDE 暗号化

スイート

Page 64: wolfSSL ユーザ・マニュアル...Visual Sturdio によるビルドについては、” wolfSSL with Visual Studio” により詳細な説 明があります。 VS2008:Visual

60 © 2004 - 2019 wolfSSL, Inc.

TLS_RSA_WITH_HC_128_MD5

TLS_RSA_WITH_HC_128_SHA

TLS_RSA_WITH_RABBIT_SHA

wolfSSL 拡張 -

eSTREAM 暗号化ス

イート

TLS_RSA_WITH_AES_128_CBC_B2B256

TLS_RSA_WITH_AES_256_CBC_B2B256

TLS_RSA_WITH_HC_128_B2B256

Blake2b 暗号化スイ

ート

TLS_QSH wolfSSL 拡張 -量子

安全ハンドシェイク

TLS_NTRU_RSA_WITH_RC4_128_SHA

TLS_NTRU_RSA_WITH_3DES_EDE_CBC_SHA

TLS_NTRU_RSA_WITH_AES_128_CBC_SHA

TLS_NTRU_RSA_WITH_AES_256_CBC_SHA

wolfSSL 拡張 -NTRU

暗号化スイート

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-256 暗号化スイ

ート

TLS_DHE_PSK_WITH_AES_256_CBC_SHA384

TLS_DHE_PSK_WITH_NULL_SHA384 SHA-384 暗号化スイ

ート

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

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

ECC AES-GCM暗号

化スイート

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

AES-CCM 暗号化ス

イート

Page 65: wolfSSL ユーザ・マニュアル...Visual Sturdio によるビルドについては、” wolfSSL with Visual Studio” により詳細な説 明があります。 VS2008:Visual

61 © 2004 - 2019 wolfSSL, Inc.

TLS_PSK_WITH_AES_256_CCM_8

TLS_DHE_PSK_WITH_AES_128_CCM

TLS_DHE_PSK_WITH_AES_256_CCM

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

Camellia 暗号化スイ

ート

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

ChaCha 暗号化スイ

ート

TLS_EMPTY_RENEGOTIATION_INFO_SCSV 再ネゴシエーション指

示拡張特殊スイート

(Renegotiation

Indication Extension

Special suites)

表 5 wolfSSL 暗号化スイート

AEAD スイーツ

wolfSSL は、AES-GCM, AES-CCM, および CHACHAPOLY1305 を含む AEAD をサポー

トします。AEAD スイーツとそれ以外の大きな違いは、AEAD では暗号化されたデータ

を認証する点です。これによって、中間者攻撃によるデータ改ざんを防ぐのに有効です。

AEAD スイーツではブロック暗号(最近はストリーム暗号化とも)アルゴリズムが鍵付き

ハッシュアルゴリズムと組み合わされます。これら二つのアルゴリズムを組み合わせは

wolfSSL 暗号化と復号化処理によって扱われることで、ユーザーに取って使いやすいも

のいなっています。特定の AEAD スイーツを使用するために必要なものは、単にサポート

されているそのアルゴリズムを有効化するだけです。

ブロックおよびストリーム暗号化

wolfSSL は AES、DES、3DES および Camellia ブロック暗号化および RC4、

RABBIT、HC-128 および ChaCha ストリーム暗号化をサポートします。AES、3

Page 66: wolfSSL ユーザ・マニュアル...Visual Sturdio によるビルドについては、” wolfSSL with Visual Studio” により詳細な説 明があります。 VS2008:Visual

62 © 2004 - 2019 wolfSSL, Inc.

DES, RABBIT はデフォルトで有効化されています。HC-128 は wolfSSL ビルド時に

(--enable-hc128, --enable-camellia 及び –enable-chacha ビルド・オプションで)有

効化することができます。使用情報に関しては使用例および wolfCrypt レファレンス

(第10章)をご参照ください。

SSL は RC4 をデフォルトのストリーム暗号化として使用します。これは少々古くなりつつ

ありますが、かなり有効です。wolfSSL は eStream プロジェクトから次の二つの暗号化を

コードベースに追加しました。RABBIT と HC-128 は RC4 にくらべ2倍近く、HC-128 は

約5倍高速です。ですから、もしスピードが心配で SSL を使用したくないということであ

れば、wolfSSL のストリーム暗号化はそうした性能への疑いを軽減ないし解消するはずで

す。wolfSSL は ChaCha20 も追加しました。RC4 の性能は ChaCha より 11倍ほど速いの

ですが、RC4は ChaCha より通常安全性が低いと考えられています。ChaCha はトレード

オフとしてセキュリティを高めています。暗号化の性能比較に関しては wolfSSL ベンチマ

ーク Web ページを参照下さい。

http://wolfssl.com/yaSSL/benchmarks-wolfssl.html

4.3.4.1 両者の違い

ブロック暗号化とストリーム暗号化の違いは何か疑問に思われたことがありますか?

ブロック暗号化は暗号表のブロックサイズの区切り毎に暗号化されます。例えば、AES は

16 バイトのブロックサイズを持っています。従って、もし2、3バイトのたくさんの小

さな断片を暗号でやり取りするようだと、データの 80%以上は無駄なパディングになって

しまい、暗号・復号プロセスのスピードを低下させ、ネットワークの必要な帯域幅を無駄

にしてしまいます。基本的にブロック暗号化は大きなデータの塊のために設計されてお

り、ブロックサイズのためにパディング・サイズがあり、固定の変化の無い転送を使用し

ます。

ストリーム暗号化はデータの塊が大きくても小さくてもうまく機能します。ブロックサイ

ズというものが不要なので、非常に小さなデータサイズに適切です。もしスピードが心配

ならば、ストリーム暗号化が答となります。ストリーム暗号化では、通常 XOR された鍵ス

トリームを利用した単純な変換を使用するからです。従って、もし小さなサイズを含む い

ろいろなサイズの暗号化を行うストリーム・メディアや高速な暗号化へのニーズをお持ち

でしたら、ストリーム暗号化が最良の答となります。

Page 67: wolfSSL ユーザ・マニュアル...Visual Sturdio によるビルドについては、” wolfSSL with Visual Studio” により詳細な説 明があります。 VS2008:Visual

63 © 2004 - 2019 wolfSSL, Inc.

ハッシュ関数

wolfSSL は、MD2、MD4、MD5、SHA-1、SHA-2(SHA224、SHA-256、SHA-384、

SHA-512)、SHA-3(BLAKE2)、および RIPEMD-160 などを含む複数のハッシュ関数をサ

ポートします。これらの関数使用方法の詳細は wolfCrypt レファレンスのセッション 10.1

を参照ください。

公開鍵オプション

wolfSSL は RSA、ECC、DSA/DSS、DH および NTRU の各公開鍵オプションをサポート

します。また、wolfSSL サーバーでは EDH(Ephemeral Diffie-Hellman)をサポートし

ます。これらの関数使用方法の詳細は wolfCrypt レファレンスのセッション 10.5 を参照

ください。

wolfSSL は NTRU 公開鍵を利用して以下の4つの暗号化スイートをサポートします。

TLS_NTRU_RSA_WITH_3DES_EDE_CBC_SHA

TLS_NTRU_RSA_WITH_RC4_128_SHA

TLS_NTRU_RSA_WITH_AES_128_CBC_SHA

TLS_NTRU_RSA_WITH_AES_256_CBC_SHA

最も強固な AES-256 がデフォルトです。wolfSSL が NTRU 利用可が選択されていて

NTRU パッケージが利用可能な場合、これらの暗号化スイートが wolfSSL ライブラリに組

み込まれます。wolfSSL クライアントでは、ユーザ・インタラクション無しにこれらの

暗号化スイートを利用可能となります。一方、wolfSSL サーバ・アプリケーションで

は、これらの暗号化スイートを利用可能とするためには NTRU 秘密鍵と NTRU x509 証明

書をロードする必要があります。

例題の、echoserver と server の両方のサーバーは(NTRU を利用可とする)

HAVE_NTRU 定義を使用し NTRU 鍵と証明書をロードするかどうかを示します。

wolfSSL パッケージは certs/ ディレクトリー下にテスト鍵と証明書を含みます。Ntru-

cert.pem は証明書、ntru-key.raw は秘密鍵 Blob です。

wolfSSL NTRU 暗号化スイートは、プロトコルがスイートを選択するときもっとも高い選

Page 68: wolfSSL ユーザ・マニュアル...Visual Sturdio によるビルドについては、” wolfSSL with Visual Studio” により詳細な説 明があります。 VS2008:Visual

64 © 2004 - 2019 wolfSSL, Inc.

択肢となっています。その選択順序は、上に示したものの逆順になっています。例えば、

AES-256 が最初に選択され、3DES が最後に、「標準の」暗号化スイートに行く前に選択

されます。基本的に、NTRU を wolfSSL に組み込んであり、両者のコネクションが

NTRU をサポートするならば、他の暗号化スイートしか使用しないことを宣言して明示的

に排除しない 限り、NTRU 暗号化スイートが選択されます。

RSA 上の NTRU の利用は 20-200 倍の速度改善をもたらします。鍵サイズが大きくなるほ

ど改善も大きくなり、短い鍵(1024 ビット)に対して長い鍵(8192 ビット)を利用すれ

ばずっと大きな速度の恩恵を受けるということです。

ECC サポート

wolfSSL は楕円曲線暗号(ECC)をサポートします。サポートは、

ECDH-ECDSA, ECDHE-ECDSA, ECDH-RSA, ECDHE-PSK, ECDHE-RSA、その他を含

みます。

wolfSSL の ECC のプログラムについては以下に含まれています。

<wolfssl_root>/wolfssl/wolfcrypt/ecc.h ヘッダファイル

<wolfssl_root>/wolfcrypt/src/ecc.c source file ソースコード

サポートしている暗号スイーツに関しては表4を参照してください。ECC はデフォルトで

は無効化されていますが、HAVE_ECC 定義によって wolfSSL をビルドすることで有効化

することができます。また、autoconf を使用する場合は、次の通りです。

./configure --enable-cc

make

make check

“make check”実行時には、多くの暗号スイーツがチェックされることに注目してください

(make checkが暗号スイーツのリストを生成しない場合は ./testsuite/testsuite.test 自身を

実行してください)。それらの暗号スイーツは、

例えば ECDH-ECDSA with AES256-SHAなど、個別にテストすることもできます。

wolfSSLサーバーは次のように起動することができます。

Page 69: wolfSSL ユーザ・マニュアル...Visual Sturdio によるビルドについては、” wolfSSL with Visual Studio” により詳細な説 明があります。 VS2008:Visual

65 © 2004 - 2019 wolfSSL, Inc.

./examples/server/server -d -l ECDHE-ECDSA-AES256-SHA -c

./certs/server-ecc.pem -k ./certs/ecc-key.pem

(-d) は証明書チェックを無効化し、(-l) は暗号スイーツリストを指定します。(-c)は使用すべ

き証明書、(-k)は対応する秘密鍵を指定します。接続するクライアント側は下記のように起

動します:

./examples/client/client -A ./certs/server-ecc.pem

(-A) はサーバー認証に使用する CA 証明書です。

PKCS サポート

PKCS(公開鍵暗号化標準)とは、RSA Security 社によって開発、公開された一連の標準

を言います。wolfSSL は PKCS #5, PKCS #8 および PKCS #12 から PBKD をサポートし

ます。

4.3.8.1 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 関数をサポートしま

す。関数プロトタイプはこのような感じです:

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);

Page 70: wolfSSL ユーザ・マニュアル...Visual Sturdio によるビルドについては、” wolfSSL with Visual Studio” により詳細な説 明があります。 VS2008:Visual

66 © 2004 - 2019 wolfSSL, Inc.

output は導出される鍵を制約します。Passwd は長さ pLen のユーザパスワードを保持し

ます。Salt は長さ sLen のソルト入力、iteration は実行されるべき繰り返しの回数、 kLen

は導出したい鍵の長さ、hashType は使用するハッシュ(MD5, SHA1 またはSHA2)で

す。

wolfSSL のビルドに./configure を使用している場合、この機能を有効化するには--enable-

pwdbased オプションを使用します。

フルの例題については wolfcrypt/src/test.c を参照してください。PKCS#5、PBKDF1 およ

び PBKDF2 に関する詳細情報は以下の仕様をご参照ください。

PKCS#5, PBKDF1, PBKDF2: http://tools.ietf.org/html/rfc2898

4.3.8.2 PKCS#8

PKCS#8 は、公開鍵アルゴリズムおよび属性集合のための秘密鍵を保持するために使用す

る秘密鍵関連情報の構文に関する標準(Private-Key Information Syntax Standard)と し

て設計されました。

PKCS#8 には、暗号化された秘密鍵および暗号化されない秘密鍵の両方を保持するための

構文を説明した二つのバージョンの標準があります。サポートするフォーマットには

PKCS#5 バージョン1、バージョン2および PKCS12 が含まれます。暗号化のタイプとし

ては DES、3DES、RC4 および AES が利用可能です。

PKCS#8: http://tools.ietf.org/html/rfc5208

特定の暗号化の使用を強制

デフォルトで、wolfSSL はコネクションの双方がサポート可能な「最適な(最高のセキ

ュリティ)」暗号化スイートを選択します。例えば 128 ビット AES のように、特定の暗号

化を強制するためには、SSL_CTX_new()を呼び出した後に以下のような感じの指定を追加

します。

SSL_CTX_set_cipher_list(ctx, “AES128-SHA”);

Page 71: wolfSSL ユーザ・マニュアル...Visual Sturdio によるビルドについては、” wolfSSL with Visual Studio” により詳細な説 明があります。 VS2008:Visual

67 © 2004 - 2019 wolfSSL, Inc.

従って、次のようになります。

ctx = SSL_CTX_new(method); SSL_CTX_set_cipher_list(ctx, “AES128-

SHA”);

量子安全ハンドシェイク暗号スイート

wolfSSL は NTRU のようなものを利用した量子ハンドシェイク暗号スイート (post

quantum handshake cipher suite) を利用した暗号スイーツをサポートします:

TLS_QSH

wolfSSL が NTRU 有効化されていて、NTRU パッケージが利用可能ならば、

TLS_QSH 暗号スイートが wolfSSL ライブラリにビルドされます。wolfSSL クライア

ントとサーバーはユーザーによる何のインタラクションもなしにこの暗号スイートを利

用可能になります。

wolfSSL 量子安全ハンドシェイク暗号スイートはプロトコルがスイートを選択する時に

最も高い選択順位が与えられます。基本的に、ユーザーが wolfSSL に NTRU を組み込

み、接続の両側が NTRU をサポートするならば、片方のユーザーが異なる暗号スイー

ツだけを使用するように主張して明示的にそれらを排除しない限り NTRU 暗号スイー

トが選択されます。

ユーザーはどの暗号アルゴリズムか、そしてクライアント側が公開鍵を送ってくるかどう

か を、下記のような関数例を使って調整することができます。

wolfSSL_UseClientQSHKeys(ssl, 1); wolfSSL_UseSupportedQSH(ssl,

WOLFSSL_NTRU_EESS439);

クライアントが接続された後、QSH 接続が確立されたかどうかテストするためには以下

の関数例を使用することができます。

wolfSSL_isQSH(ssl);

Page 72: wolfSSL ユーザ・マニュアル...Visual Sturdio によるビルドについては、” wolfSSL with Visual Studio” により詳細な説 明があります。 VS2008:Visual

68 © 2004 - 2019 wolfSSL, Inc.

ハードウェア高速暗号

wolfSSL では様々なプロセッサやチップにおいてハードウェア高速化(またはアシステト)

暗号機能の恩恵を受けることができます。以降のセクションでは wolfSSL がそのままでサ

ポートできるテクノロジーについて説明します。

インテル AES-NI

AES は全世界の政府関係で使用されている暗号化標準で、wolfSSL も常にサポートしてき

ました。インテル社は AES 実行の高速化の方法として新しい命令セットをリリースしまし

た。wolfSSL は製品化環境でこの新しい命令セットをフルにサポートした最初の SSL ライ

ブラリです。

本質的に、性能を改善するために、インテルは AES アルゴリズムのうち演算が集中してい

る部分を実行するチップ・レベルの AES 命令群を追加しました。現在 AES-NI をサポート

しているインテルのチップについては、下記を参照ください。

http://ark.intel.com/search/advanced/?s=t&AESTech=true

wolfSSL では、アルゴリズムをソフトウェアで実行するのではなく、チップから直接命令

を呼び出す機能を追加しました。これによって、AES-NI をサポートするチップ・セット上

で wolfSSL 実行時には、AES 暗号を 5~10 倍高速に実行することができます。

AES-NI がサポートされているチップ・セットで実行する場合は、--enable-aesni ビルド・

オプションを有効にしてください。AES-NI で wolfSSL をビルドするには、アセンブリ

ー・コードを使用するために GCC4.4.3 かそれ以降が必要です。

AES-NI に関してさらに参照できるものを、一般的なものから特定のものの順に、以下にま

とめます。AES-NI の性能改善に関する情報は、3番目の Intel Software Network ページ

を参照ください。

AES (Wikipedia) http://en.wikipedia.org/wiki/Advanced_Encryption_Standard

AES-NI (Wikipedia) http://en.wikipedia.org/wiki/AES_instruction_set

Page 73: wolfSSL ユーザ・マニュアル...Visual Sturdio によるビルドについては、” wolfSSL with Visual Studio” により詳細な説 明があります。 VS2008:Visual

69 © 2004 - 2019 wolfSSL, Inc.

AES-NI (Intel

Software

Network page)

http://software.intel.com/en-us/articles/intel-advanced-encryption-

standard-instructions-aes-ni/

STM32F2/4/7, STML5

wolfSSL では STRM32Fx 標準周辺ライブラリ(STM32Fx Standard Peripheral Library)

またはCubeMXを通じてハードウェア・ベースの暗号化と乱数生成器を使用することがで

きます。

settings.h の中で WOLFSSL_STM32Fx の定義を探してください。

WOLFSSL_STM32Fx 定義は STM32Fx ハードウェア暗号化と RNG サポートを有効化し

ます。これらを個別に有効化する場合は STM32F2_CRYPTO(ハードウェア暗号サポー

ト)と STM32Fx_RNG (ハードウェア RNG サポート) です。

STM32Fx 標準周辺ライブラリ(STM32Fx Standard Peripheral Library)に関しては下記を

参照してください。

http://www.st.com/internet/com/TECHNICAL_RESOURCES/TECHNICAL_LITERATU

R E/USER_MANUAL/DM00023896.pdf

Page 74: wolfSSL ユーザ・マニュアル...Visual Sturdio によるビルドについては、” wolfSSL with Visual Studio” により詳細な説 明があります。 VS2008:Visual

70 © 2004 - 2019 wolfSSL, Inc.

Cavium NITROX

wolfSSLはCavium NITROX (http://www.cavium.com/processor_security.html) をサポー

トします。Cavium NITROXサポートを有効化するにはwolfSSLのビルド時に次のコンフ

ィグレー ション・オプションを使用します。

./configure --with-cavium=/home/user/cavium/software

ここにおいて、“--with-cavium=” オプションはライセンスされたcavium/softwareディレ

クトリーを指しています。Caviumは、wolfSSLをcavium_common.oファイルに引き込む

ようにビルドしないため、libtoolはこのポータビリティに関してワーニングを出します。ま

た、github source treeを使っている場合、Camiumのヘッダーはこのワーニングを認めな

いので、生成されたMakefileから –Wredundant-decls ワーニング・オプションを削除する

必要があります。

現在の所、wolfSSLはCaviumのRNG, AES, 3DES, RC4, HMAC、およびRSAを直接暗号

化層でサポートします。SSLレベルでのサポートは一部で、現在の所AES、3DESとRC4の

みで す。RSAとHMACは、Cavium呼び出しが非同期モードで利用できるようになるま

で、低速 での実行になります。暗号テスト、ベンチマークと同様にサンプルクライアント

でも

Caviumサポートが有効になります。HAVE_CAVIUM定義を参照してください。

SSL 検査(Sniffer)

wolfSSL1.5.0 リリース以降、wolfSSL は SSL Sniffer(SSL 検査)とともにビルドするた

めのオプションを提供しています。これによって、SSL のトラフィックパケットを収集

することができ、正しい鍵ファイルによって復号化することが可能になります。SSL ト

ラフィックを「検査」する機能は以下のように複数の用途で便利です。

ネットワークの問題を解析する

内部または外部ユーザーによるネットワークの不正な利用を検出する

ネットワークの使用状況と動いているデータをモニターする

Page 75: wolfSSL ユーザ・マニュアル...Visual Sturdio によるビルドについては、” wolfSSL with Visual Studio” により詳細な説 明があります。 VS2008:Visual

71 © 2004 - 2019 wolfSSL, Inc.

クライアント・サーバ間のコミュニケーションをデバックする

Sniffer サポートを有効にするためには、*nix 上または Windows 上で vcproj ファイルを使

用して --enable-sniffer オプションで wolfSSL をビルドしてください。pcap がインスト

ールされた*nix、または Windows 上の WinPcap が必要です。sniffer.h にあるように5つ

の主要な関数があります。以下はそれらの簡単な説明です。

ssl_SetPrivateKey – 指定したサーバーとポートに秘密鍵を設定する。

ssl_SetNamedPrivateKey – 指定したサーバーの秘密鍵にポートとドメイン名を設定す

る。

ssl_DecodePacket – 復号のための TCP/IP パケットを渡す。ssl_Trace – traceFile のデバ

ッグ・トレースを有効/無効にする。ssl_InitSniffer – sniffer 全体を初期化する。

ssl_FreeSniffer – sniffer 全体を解放する。

ssl_EnableRecovery – ロスト・パケットの場合において、SSL トラッフィクの復号を取り

上げる試みを有効化するオプション

ssl_GetSessionStats – Sniffer セッションのメモリ使用量を得る

wolfSSL の sniffer サポートと例題全体を参照するには、wolfSSL ダウンロードから

"sslSniffer/sslSnifferTest" フォルダーの ”sniffertest” を参照してください。

SSL ハンドシェイクに暗号化鍵が設定されているので、さらなるアプリケーション・デー

タのデコードには、そのハンドシェイクが sniffer によってデコードされる必要がある点に

注意してください。例えば、wolfSSL 例題の echoserver と echoclient とともに

に”snifftest”を使用した場合、snifftest アプリケーションはサーバーとクライアント間のハ

ンドシェイク開始前に開始されていなければなりません。

Sniffer 機能は以下のアルゴリズムで暗号化されたストリームの復号のみ可能です:AES-

CBC, DES3-CBC, ARC4, HC-128, RABBIT, Camellia-CBC, および IDEA。ECDHEまた

はDHE鍵合意が使用されている場合、ストリームを見ることはできません。RSA鍵交換の

み サポートされています。

圧縮

Page 76: wolfSSL ユーザ・マニュアル...Visual Sturdio によるビルドについては、” wolfSSL with Visual Studio” により詳細な説 明があります。 VS2008:Visual

72 © 2004 - 2019 wolfSSL, Inc.

wolfSSL は zlib ライブラリのデータ圧縮をサポートしています。./configure ビルド・シス

テムはこのライブラリの存在を検出しますが、何か別の方法でビルドする場合は

HAVE_LIBZ 定数を定義し、zlib.h へのパスをインクルードのために含めてください。

与えられた暗号化では圧縮はデフォルトではオフになっています。オンにするには、SSL

コネクションまたはアクセプトの前に 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 に組込

まれますが、NO_PSK 定数によってビルド時にオフにすることができます。実行時のみに

これらの暗号化を使用する場合には、希望する暗号化スイートにおいて

wolfSSL_CTX_set_cipher_list()関数を使用してください。

wolfSSL は以下の一時鍵 (ephemeral key) PSK をサポートします。

ECDHE-PSK-AES128-CBC-SHA256

ECDHE-PSK-NULL-SHA256

Page 77: wolfSSL ユーザ・マニュアル...Visual Sturdio によるビルドについては、” wolfSSL with Visual Studio” により詳細な説 明があります。 VS2008:Visual

73 © 2004 - 2019 wolfSSL, Inc.

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() を使用してコールバック

を設定してください。<wolfSSL_Home>/examples/client/client.c のクライアントの事例

では、クライアント・アイデンティティーと鍵を設定するための例を提供しています。た

だし、実 際のコールバック関数の実体は wolfssl/test.h でインプリメントされています。

サーバー側では、二つの追加の関数呼び出しが必要です。

wolfSSL_CTX_set_psk_server_callback()

wolfSSL_CTX_use_psk_identity_hint()

我々のサーバ・サンプルプログラムでは、サーバーは二つ目の呼び出しでクライアントを

助 けるために、識別のヒント(identity hint) 保持しています。サーバー PSK コールバ

ックの 例は wolfssl/test.h の中のmy_psk_server_cb()にあります。

wolfSSL は最長 128 オクテットのアイデンティティーとヒント、および最長 64 オクテッ

トの事前共有鍵をサポートします。

クライアント認証

クライアント認証は、クライアントがコネクト時に認証のための証明書をサーバーに送る

ことを要求することで、サーバーがクライアントを認証できるようにする機能 です。クラ

イアント認証は CA から得た(または、ユーザーか CA 以外の誰かが生成し自己署名し

た)X.509 クライアント証明書を要求します。

デフォルトでは、wolfSSL はクライアントとサーバー双方の受け取ったすべての証明書

の有効性をチェックします。クライアント側の認証を設定するには、サーバー側は、クラ

イアント側の証明書をチェックするのに使用する、信頼できる CA 証明書のリストをロー

Page 78: wolfSSL ユーザ・マニュアル...Visual Sturdio によるビルドについては、” wolfSSL with Visual Studio” により詳細な説 明があります。 VS2008:Visual

74 © 2004 - 2019 wolfSSL, Inc.

ドしなければなりません。

wolfSSL_CTX_load_verify_locations(ctx, caCert, 0);

クライアント認証をオフにするような、その挙動を管理するためには

wolfSSL_CTX_set_verify() 関数が使用されます。以下の例では、

SSL_VERIFY_PEER はサーバーからクライアントに対する認証をオンにします。

SSL_VERIFY_FAIL_IF_NO_PEER_CERT はクライアントがサーバー側でチェックす

べき証明書を提示しない場合にフェイルするように指示します。

wolfSSL_CTX_set_verify() のその他のオプションとし SSL_VERIFY_NONE、

SSL_VERIFY_CLIENT_ONCE などがあります。

wolfSSL_CTX_set_verify(ctx,SSL_VERIFY_PEER | ((usePskPlus)?

SSL_VERIFY_FAIL_EXCEPT_PSK :

SSL_VERIFY_FAIL_IF_NO_PEER_CERT),0);

wolfSSL ダウンロード(/examples/server/server.c)に含まれる例題サーバ(server.c)のクラ

イアント認証の例も参照してください。

Server Name Indication (SNI)

SNI は、単一のネットワークアドレスにおいて1サーバー複数仮想サーバーの場合に有効

です。多分、クライアントに対してコンタクトしているサーバーの名前を用意することが

望ましい。SNI を有効化するにはビルド時に以下を実行します:

/configure --enable-sni

クライアント側で SNI を利用する場合、追加で以下のうちどちらかもう一つの関数呼び出

しが必要です。

wolfSSL_CTX_UseSNI()

wolfSSL_UseSNI()

Page 79: wolfSSL ユーザ・マニュアル...Visual Sturdio によるビルドについては、” wolfSSL with Visual Studio” により詳細な説 明があります。 VS2008:Visual

75 © 2004 - 2019 wolfSSL, Inc.

wolfSSL_CTX_UseSNI()はクライアントが同じサーバーに複数回コンタクトする場合に推

奨さ れます。SNI拡張をコンテクスト・レベルで設定することで、その呼び出しがさ

れて以降、同じコンテクストから生成される全てのオブジェクトにおいてSNIの使用を可

能にし ます。

wolfSSL_UseSNI()は一つの SSL オブジェクトのみに SNI を有効化するので、サーバー

名がセッション間で変わるような場合に推奨されます。

サーバー側でも同じ関数呼び出しが必要です。wolfSSLサーバーは複数”仮想“サーバー

をホストしないので、SNIの使用はSNIミスマッチのケースに接続の終了が望まれるような

場合に有 効です。このシナリオでは、サーバーはコンテクストごとに一回だけで、同じコ

ンテクスト からのすべてのそれ以降のSSLオブジェクトに設定されるので、

wolfSSL_CTX_UseSNI()が 効率的です。

ハンドシェイク修正

ハンドシェイク・メッセージのグループ化

必要な場合、wolfSSL はハンドシェイク・メッセージをグループ化する機能を持っていま

す。これはコンテクスト・レベルで、

wolfSSL_CTX_set_group_messages(ctx);

を使用するか、SSL オブジェクト・レベルで、

wolfSSL_set_group_messages(ssl);

行うことが出来きます。

切り詰めた(Truncated) HMAC

現在定義されている TLS 暗号スイーツはレコード層通信の認証に HMAC を使用していま

す。TLS では、ハッシュ関数の全体出力に対して MAC タグとして使用されています。しか

し、制限された環境では、MAC タグを形成する時ハッシュ関数の出力を 80 ビットに切り

詰める事によってバンド幅を節約したくなる場合があります。切り詰めた(Truncated)

Page 80: wolfSSL ユーザ・マニュアル...Visual Sturdio によるビルドについては、” wolfSSL with Visual Studio” により詳細な説 明があります。 VS2008:Visual

76 © 2004 - 2019 wolfSSL, Inc.

HMAC を使用可能にするために wolfSSL ではビルド時に単に次のように指定します:

./configure --enable-truncatedhmac

切り詰めた(Truncated) HMAC をクライアント側で使用するには、次の二つのいずれか

の関数を呼び出す必要があります。

wolfSSL_CTX_UseTruncatedHMAC();

wolfSSL_UseTruncatedHMAC();

クライアント側で SNI を利用する場合、追加で以下のうちどちらかもう一つの関数呼び出

しが必要です。

wolfSSL_CTX_UseTruncatedHMAC ()はクライアントが同じサーバーに複数回コンタク

トする場合に推奨されます。Truncated HMAC拡張をコンテクスト・レベルで設定する

ことで、その呼び出しがされて以降、同じコンテクストから生成される全てのオブジェク

トにおいてTruncated HMACの使用を可能にします。

wolfSSL_UseTruncatedHMAC ()は一つの SSL オブジェクトのみに Truncated HMAC

を有効化するので、TruncatedHMAC が必要かどうか、セッション間で変わるような場

合に推奨されます。

サーバー側では関数呼び出しは不要です。サーバーは自動的にクライアントの Truncated

HMAC の要求に対応します。

なお、すべての TLS 拡張は下記でも有効化されます:

./configure --enable-tlsx

ユーザー定義暗号モジュール

ユーザー定義暗号モジュールによって、ユーザーはサポートされている処理の間に使用し

たい カスタム暗号をプラグインすることができます(現在の所、RSA 処理がサポートされ

ています)。IPP を使ったモジュールの例は root_wolfssl/wolfcrypt/user-crypto/ ディレクト

リーにあります。ユーザー定義暗号モジュールを使用する wolfSSL のビルドの場合の

Page 81: wolfSSL ユーザ・マニュアル...Visual Sturdio によるビルドについては、” wolfSSL with Visual Studio” により詳細な説 明があります。 VS2008:Visual

77 © 2004 - 2019 wolfSSL, Inc.

configure に対するオプションの例は次の通りです:

./configure --with-user-crypto

または

./configure --with-user-crypto=/dir/to

RSA 処理を実行するユーザー暗号モジュールを生成する時には、user_rsa.h という名前の

RSA のためのヘッダーファイルがあることが必須です。すべてのユーザー暗号処理のため

に、libusercrypt という名前のユーザライブラリが必須です。これらは、ユーザー暗号モジ

ュールをリンクする際に wolfSSL の autoconf ツールが探しに行く名前です。wolfSSL で

提供されるサンプルでは、user_rsa.h は wolfcrypt/user-crypto/include/ディレクトリーに

あります。また、一旦生成されたライブラリは wolfcrypt/user-crypto/lib/に置かれます。必

要なAPI のリストについては、提供されたヘッダーファイルを参照してください。

サンプルをビルドする為に IPP ライブラリをインストールした後、次のコマンドを

wolfSSL のルートディレクトリで実行させます。

cd wolfcrypt/user-crypto/

./autogen.sh

./configue make

sudo make install

wolfSSL に含まれているサンプルは IPP を使用する必要があります。これはプロジェク

トがビルドされる前にインストールされている必要があります。サンプルをビルドするた

め に IPP ライブラリが無い場合でも、ユーザーにファイル名の選択と API インターフ

ェースの例を提供するためです。一旦、libusercrypto とヘッダーファイルの両方が

make さ れ、インストールされると、暗号モジュールを使った wolfSSL の make に追

加ステップは必要なくなります。単に、-with-user-crypto フラグを configure に使用する

だけで、通常の wolfSSL 暗号からユーザー暗号モジュールにすべての関数呼び出しがマッ

プされます。

もし wolfSSL の XMALLOC を使用している場合、メモリー・アロケーションは

DYNAMIC_TYPE_USER_CRYPTO とタグ付けしなければなりません。モジュールで使わ

Page 82: wolfSSL ユーザ・マニュアル...Visual Sturdio によるビルドについては、” wolfSSL with Visual Studio” により詳細な説 明があります。 VS2008:Visual

78 © 2004 - 2019 wolfSSL, Inc.

れたすべてのメモリー・アロケーションの分析を可能にします。

ユーザー暗号モジュールは wolfSSL の configure オプション fast-rsa と/または fips オプシ

ョンと組み合わせ使用することはできません。FIPS は、特定の認証されたコードが使用さ

れることを要求します。fast-rsa は RSA 処理の実行にサンプル・ユーザ暗号モジュールを

使用させます。

wolfSSL内での耐タイミング性

wolfSSL は、タイミング情報を漏出する可能性があるような比較操作を一定時間で行うこ

とを保証する ”ConstantCompare” 関数を提供します。この API は、タイミングベースの

サイドチャネル攻撃を防止する為に wolfSSL 内で TLSレベル と暗号レベルの両方で使用

されます。

wolfSSL ECC 実装では、ECC アルゴリズムのタイミング耐性を有効にするために

ECC_TIMING_RESISTANT を定義します。 同様に、TFM_TIMING_RESISTANT の定

義は、RSAアルゴリズムのタイミング抵抗のための高速数学ライブラリで提供されます。

関数 exptmod はタイミング耐性のある Montgomery ラダーを使用します。

参照:--enable-harden

Page 83: wolfSSL ユーザ・マニュアル...Visual Sturdio によるビルドについては、” wolfSSL with Visual Studio” により詳細な説 明があります。 VS2008:Visual

79 © 2004 - 2019 wolfSSL, Inc.

移植性

抽象化レイヤー

各抽象化レイヤーの詳細、プラットフォームへのポーティングに関しては “wolfSSLポーテ

ィングガイド“を参照してください。

C 標準ライブラリ抽象化レイヤー

wolfSSL(旧 CyaSSL)は、開発者に対してより高レベルの移植性と柔軟性を提供する為

に、C 標準ライブラリ無しでビルドすることが可能になっています。そのために、ユーザ

ーは C 標準ライブラリの関数に対応した自分の使用したい関数をマップする必要がありま

す。

5.1.1.1.1 メモリの使用

ほとんどの C プログラムは動的メモリー・アロケーションに malloc()と free()を使用して

います。CyaSLL では、代わりに XMALLOC()と XFREE()を使用しています。デフォルト

では、これらは C 実行バージョンを指しています。XMALLOC_USER を定義すること

で、独自のフックを提供することができます。それぞれのメモリ関数は、標準のものに加

えて heap hint とアロケーション・タイプの2つのアーギュメントが追加されています。

これらを無視するのも、任意の用途に使用するのも自由です。wolfSSL メモリ関数は

wolfssl/wolfcrypt/type.h にあります。

wolfSSL はメモリーオーバーライド関数をコンパイル時ではなく実行時に登録する機能を

提供しています。wolfssl/wolfcrypt/memory.h はこの機能のためのヘッダーで、次の関数

を呼び出しメモリ関数に設定することができます。

int wolfSSL_SetAllocators(wolfSSL_Malloc_cb malloc_function,

wolfSSL_Free_cb free_function, wolfSSL_Realloc_cb

realloc_function);

コールバックの関数プロトタイプは wolfssl/wolfcrypt/memory.h ヘッダーを、実現に関し

ては memory.c を参照してください。

5.1.1.1.2 string.h

wolfSSL は string.h の memcpy()、memset() 、memcmp()、その他の関数のような動作

Page 84: wolfSSL ユーザ・マニュアル...Visual Sturdio によるビルドについては、” wolfSSL with Visual Studio” により詳細な説 明があります。 VS2008:Visual

80 © 2004 - 2019 wolfSSL, Inc.

をする関数を使用します。これらは、それぞれ XMEMCPY()、XMEMSET()、

XMEMCMP()に抽象化されています。デフォルトでは、それらは C 標準ライブラリのバー

ジョンを指しています。XSTRING_USER を定義することで、types.h に独自フックを提

供できるようになっています。例えば、XMEMCPY()は:

#define XMEMCPY(d,s,l) memcpy((d),(s),(l))

となっています。XSTRING_USER を定義して下記のようにもできます:

#define XMEMCPY(d,s,l) my_memcpy((d),(s),(l))

あるいは、マクロを避けたいようでしたら:

external void* my_memcpy(void* d, const void* s, size_t n);

のように、wolfSSL 抽象化レイヤーが独自バージョンの my_memcpy()を指すようにするこ

ともできます。

5.1.1.1.3 math.h

wolfSSL は math.h の pow()と log()のような動作をする二つの関数を使用します。それら

は Diffie-Hellman に必要とされるだけですので、もし DH をビルドから外すようでした

ら、独自のものを用意する必要はありません。これらは wolfcrypt/src/dh.h に XPOW()と

XLOG()として抽象化されています。

5.1.1.1.4 ファイル・システムの使用

デフォルトでは、wolfSSL は鍵と証明書のロードの目的でターゲット・システムのファイ

ル・システムを使用します。これは NO_FILESYSTEM を定義することでオフにすること

ができます。「第5章:ビルド・オプション」を参照してください。もし代わりに、シス

テム のものではないファイル・システムを使用したい場合は、ssl.c の XFILE()レイヤーを

使用して、ファイル・システムへの呼び出しを使用したいと思うものを指すようにするこ

とができます。MICRIUM 定義で提供されている例を参照してください。

カスタム入出力抽象化レイヤー

Page 85: wolfSSL ユーザ・マニュアル...Visual Sturdio によるビルドについては、” wolfSSL with Visual Studio” により詳細な説 明があります。 VS2008:Visual

81 © 2004 - 2019 wolfSSL, Inc.

wolfSSL は、SSL コネクションや SSL を TCP/IP 以外のトランスポート層で実行する場合

により高レベルのコントロールを望むような場合のためのカスタム I/O 抽象化レイヤーを

提供します。

使用するには、二つの関数を定義する必要があります。

1. ネットワーク送信関数

2. ネットワーク受信関数

これら二つの関数は ssl.h の CallbackIOSend と CallbackIORecv によってプロトタイプ宣

言されています。

typedef int (*CallbackIORecv)(char *buf, int sz, void *ctx);

typedef int (*CallbackIOSend)(char *buf, int sz, void *ctx);

これらの関数を WOLFSSL_CTX ごとに wolfSSL_SetIOSend() と wolfSSL_SetIORecv()

として登録する必要があります。デフォルトでは CBIORecv() と CBIOSend()が io.c の最

後尾に登録されています:

void wolfSSL_SetIORecv(WOLFSSL_CTX *ctx, CallbackIORecv CBIORecv)

{

ctx->CBIORecv = CBIORecv;

}

void wolfSSL_SetIOSend(WOLFSSL_CTX *ctx, CallbackIOSend CBIOSend)

{

ctx->CBIOSend = CBIOSend;

}

ユーザーは、io.c の一番下に示しているように、WOLFSSL オブジェクト(セッション)

毎に wolfSSL_SetIOWriteCtx() と wolfSSL_SetIOReadCtx()でコンテクストをセットで

きます。例えば、メモリ・バッファーを使用するような場合は、コンテクストはそのメモ

リー・バッファーの場所とアクセス方法を説明するような構造体へのポインタとなるで し

ょう。デフォルトでは、ユーザ・オーバーライド無しで、ソケットをコンテクストとして

登録しています。

CBIORecv と CBIOSend 関数のポインタはユーザー独自のカスタム I/O 関数を指すことが

できます。デフォルトの Send()と Receive()関数は、io.c にある EmbedSend()と

Page 86: wolfSSL ユーザ・マニュアル...Visual Sturdio によるビルドについては、” wolfSSL with Visual Studio” により詳細な説 明があります。 VS2008:Visual

82 © 2004 - 2019 wolfSSL, Inc.

EmbedReceive()で、テンプレートやガイドとして使用することができます。

WOLFSSL_USER_IO を定義して、デフォルト I/O 関数、EmbedSend()と

EmbedReceive()の自動設定を取り除くことができます。

オペレーティング・システム抽象化レイヤー

wolfSSL の OS 抽象化レイヤーは wolfSSL をユーザーのオペレーティング・システムへの

移植をより容易にします。wolfssl/wolfcrypt/settings.h ファイルには OS レイヤーを起動す

るための設定が格納されています。

OS 固有の定義は wolfCrypt 向けは wolfssl/wolfcrypt/types.h、wolfSSL 向けのものは

wolfssl/internal.h にあります。

サポートするオペレーティング・システム

wolfSSL は新しいプラットフォームへの容易な移植性という特徴をもっていますが、一方

で wolfSSL にはそのまますぐに利用いただけるたくさんのサポート対象オペレーティン

グ・システムがあります。現在サポートされるオペレーティング・システムとしては以下

のようなものが含まれます:

Win32/64, Linux, Mac OS X, Solaris, ThreadX, VxWorks, FreeBSD, NetBSD,

OpenBSD, embedded Linux, WinCE, Haiku, OpenWRT, iPhone (iOS),

Android, Nintendo Wii and Gamecube through DevKitPro, QNX,

MontaVista, NonStop, µITRON, μT-Kernel, Micrium's µC/OS, FreeRTOS,

SafeRTOS, Freescale MQX, Nucleus, TinyOS, HP/UX, TIRTOS, uTasker,

embOS

サポートするチップ・メーカー

wolfSSLがサポートするチップ・メーカーのチップ・セットとしてはARM, Intel, ST

(STM32F2/F4), Motorola, mbed, Freescale, Microchip (PIC32), Texas Instruments その

Page 87: wolfSSL ユーザ・マニュアル...Visual Sturdio によるビルドについては、” wolfSSL with Visual Studio” により詳細な説 明があります。 VS2008:Visual

83 © 2004 - 2019 wolfSSL, Inc.

ほかが含まれます。

C#ラッパー

wolfSSL はC#に対して限定されたサポートを提供しています。Visual Studioプロジェクト

が“root_wolfSSL/wrapper/CSharp/”ディレクトリーにあります。Visual Studio プロジェク

トを開いた後、”BUILD->Configuration Manager…” をクリックして、“Active solution

configuration” と “Active solution platform” をセットします。“Active solution

configuration” はDLL Debug とDLL Release です。サポートされるプラットフォームは

Win32とWin64です。

ソリューションとプラットフォームをセットしたら、プリプロセッサフラグに

HAVE_CSHARPが必要となります。これは、C#ラッパーと同梱のサンプルによって使用

されるオプションをオンにします。

次に、“Build Solusion”を選択してビルドします。これによって、wolfssl.dll.

wolfSSL_CSharp.dllとexamplesが生成されます。”examplese” はエントリーポイントと

してそれをターゲッティングし、Visual Satudio をDebug実行することで実行できます。

生成されたC#ラッパーをC#プロジェクトに加えるのは、2つの方法で可能です。一つの方

法は、 生成されたwolfssl.dll とwolfSSL_CSharp.dllをC:/Windows/System/にインストー

ルします。これによって、プロジェクトは以下のように、C#ラッパーを呼び出すことがで

きる ようになります。

using wolfSSL.CSharp

public some_class {

public static main(){

wolfssl.Init()

...

}

...

もう一つの方法は、Visual Studio プロジェクトを生成して、wolfSSL 内の C#ラッパーソ

リューションを呼び出します。

Page 88: wolfSSL ユーザ・マニュアル...Visual Sturdio によるビルドについては、” wolfSSL with Visual Studio” により詳細な説 明があります。 VS2008:Visual

84 © 2004 - 2019 wolfSSL, Inc.

コールバック

ハンドシェイク・コールバック

wolfSSLは、コネクトまたはアクセプトを設定するためのハンドシェイク・コールバッ

クのための拡張機能を提供しています。これは、組込みシステムのデバッグサポートにお

いて他のデバッガが利用可能でない場合やスニファリングが現実的でない場合に有用で

す。wolfSSL HandShakeCallBackを使用するためには、拡張関数wolfSSL_connect_ex()

またはwolfSSL_accept_ex() を使用して:

int wolfSSL_connect_ex(WOLFSSL*, HandShakeCallBack, TimeoutCallBack,

Timeval)

int wolfSSL_accept_ex(WOLFSSL*, HandShakeCallBack, TimeoutCallBack,

Timeval)

HandShakeCallBack は以下のように定義されます:

typedef int (*HandShakeCallBack)(HandShakeInfo*);

HandShakeInfo はwolfssl/callbacks.h (非標準のビルドに追加)に定義されます:

typedef struct handShakeInfo_st {

char cipherName[MAX_CIPHERNAME_SZ + 1]; /*negotiated name */

char packetNames[MAX_PACKETS_HANDSHAKE][MAX_PACKETNAME_SZ+1];

/* SSL packet names */

int numberPackets; /*actual # of packets */

int negotiationError; /*cipher/parameter err */

} HandShakeInfo;

ハンドシェイクにおけるSSLパケットの最大数はわかっているので、動的メモリは使用 さ

れません。パケット名はpacketNames[idx]をmuberPacketsで指定された数だけ評価され

ます。コールバックはハンドシェイクエラーが発生したかどうかにかかわらず呼び出され

ます。使用例はclientの例にもあります。

タイムアウト・コールバック

Page 89: wolfSSL ユーザ・マニュアル...Visual Sturdio によるビルドについては、” wolfSSL with Visual Studio” により詳細な説 明があります。 VS2008:Visual

85 © 2004 - 2019 wolfSSL, Inc.

wolfSSL ハンドシェイク・コールバックに使用されたものと同じ拡張が wolfSSL タイムア

ウト・コールバックにも使用することができます。これらの拡張はどちらか一方、両方の

呼び出し、またはどちらのコールバックも(ハンドシェイク/タイムアウト)使用しないこ

とができます。TimeoutCallback は次のように定義されます:

typedef int (*TimeoutCallBack)(TimeoutInfo*);

その中の TimeoutInfo は以下のように:

typedef struct timeoutInfo_st {

char timeoutName[MAX_TIMEOUT_NAME_SZ +1]; /*timeout Name*/

int flags; /* for future use*/

int numberPackets; /*actual # of packets */

PacketInfo packets[MAX_PACKETS_HANDSHAKE]; /*list of packets */

Timeval timeoutValue; /*timer that caused it */

} TimeoutInfo;

繰り返しになりますが、ハンドシェイクにおける SSL パケットの最大数はわかっているの

で、動的メモリは使用されません。Timeval は timeval 構造体の typedef です。

PacketInfo は次のような定義になります:

typedef struct packetInfo_st {

char packetName[MAX_PACKETNAME_SZ + 1]; /* SSL name */

Timeval timestamp; /* when it occured */

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 のほうに置かれ、

valueSz は変わらずサイズを保持します。このようなことは証明書パケットにのみ発生する

はずです。

証明書パケット向けにメモリがアロケートされる場合、コールバックからリターンした

後、再クレームされます。タイムアウトはシグナル(SIGALRM)を使用して実現されて

おり、スレッドセイフです。以前のアラームが ITIMER_REAL タイプにセットされている

場合は、後でその時点のハンドラーとともにリセットされます。既存のタイマーが過去 の

Page 90: wolfSSL ユーザ・マニュアル...Visual Sturdio によるビルドについては、” wolfSSL with Visual Studio” により詳細な説 明があります。 VS2008:Visual

86 © 2004 - 2019 wolfSSL, Inc.

タイマーより短い場合は、既存のタイマー値が使用されます。これも、その後リセット さ

れます。タイムアウトする既存のタイマーは、それと関連付けられたインターバルを持 っ

ている場合はリセットされます。コールバックはタイムアウトが発生した場合だけに発行

されます。

使用方法については client の例を参照してください。

ユーザー定義のアトミック・レコード層処理

wolfSSL はユーザー定義のアトミック・レコード層処理のコールバックを提供していま

す。これは、SSL/TLS 接続中に MAC/暗号と復号化/検証機能を自分で管理したいユーザー

のためのものです。

ユーザーは二つの関数を定義する必要があります。

1. MAC/暗号化コールバック関数

2. 復号化/検証コールバック関数

これらの二つの関数は ssl.h の中で CallbackMacEncrypt と CallbackDecryptVerify と

してプロトタイプ定義されています。

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);

ユーザーはこれらの関数を書き、wolfSSL コンテクスト(WOLFSSL_CTX)ごとに

wolfSSL_CTX_SetMacEncryptCb() と wolfSSL_CTX_SetDecryptVerifyCb() で登録する必

要があります。

Page 91: wolfSSL ユーザ・マニュアル...Visual Sturdio によるビルドについては、” wolfSSL with Visual Studio” により詳細な説 明があります。 VS2008:Visual

87 © 2004 - 2019 wolfSSL, Inc.

ユーザーは wolfSSL_SetMacEncryptCtx() と wolfSSL_SetDecryptVerifyCtx() で

WOLFSSL オブジェクト (セッション) ごとにユーザコンテクストを設定することができま

す。このコンテクストは任意のユーザー定義コンテクストに対するポインタが指定可能で

す。ここで指定したポインタは、”void* ctx”パラメータとして MAC/暗号化と復号化/検証

コールバックに送り返されます。

サンプルコールバックが wolfssl/test.h の myMacEncryptCb()と myDecryptVerifyCb()に

あります。使用方法は wolfSSL サンプルクライアント(examples/client/client.c) の”-U”オ

プションを指定した場合を参照してください。

アトミックなレコード層コールバックを使用するために、wolfSSL は configure コマンド

のオプションで “--enable-atomicuser”を指定するか、プリプロセッサフラブに

ATOMIC_USER を定義してください。

公開鍵コールバック

wolfSSL は、SSL/TLS 接続中に ECC 署名/検証機能、RSA 署名/検証機能、および暗号

化、復号化に対して自分で管理したいユーザーのために公開鍵コールバックを提供してい

ま す。

ユーザーは以下の7 つの関数を使うことができます。

1. ECC 署名コールバック

2. ECC 検証コールバック

3. ECC 共有秘密コールバック

4. RSA 署名コールバック

5. RSA 検証コールバック

6. RSA 暗号化コールバック

7. RSA 復号化コールバック

Page 92: wolfSSL ユーザ・マニュアル...Visual Sturdio によるビルドについては、” wolfSSL with Visual Studio” により詳細な説 明があります。 VS2008:Visual

88 © 2004 - 2019 wolfSSL, Inc.

これら6つの関数はssl.hの中でCallbackEccSign, CallbackEccVerify,

CallbackEccSharedSecret, CallbackRsaSign, CallbackRsaVerify, CallbackRsaEnc,

および CallbackRsaDec としてプロトタイプ定義されています。

typedef int (*CallbackEccSign)(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 (*CallbackEccVerify)(WOLFSSL* ssl,

const unsigned char* sig, unsigned int sigSz,

const unsigned char* hash, unsigned int hashSz,

const unsigned char* keyDer, unsigned int keySz,

int* result, void* ctx);

typedef int (*CallbackEccSharedSecret)(WOLFSSL* ssl,

struct ecc_key* otherKey,

unsigned char* pubKeyDer, unsigned int* pubKeySz,

unsigned char* out, unsigned int* outlen,

int side, void* ctx);

typedef int (*CallbackRsaSign)(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 (*CallbackRsaVerify)(WOLFSSL* ssl,

unsigned char* sig, unsigned int sigSz,

unsigned char** out, const unsigned char* keyDer,

unsigned int keySz, void* ctx);

typedef int (*CallbackRsaEnc)(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 (*CallbackRsaDec)(WOLFSSL* ssl, unsigned char* in,

unsigned int inSz, unsigned char** out,

const unsigned char* keyDer, unsigned int keySz,

void* ctx);

ユーザーはこれらの関数を書き、wolfSSLコンテクスト (WOLFSSL_CTX)ごとに

wolfSSL_CTX_SetEccSignCb(), wolfSSL_CTX_SetEccVerifyCb(),

wolfSSL_CTX_SetEccSharedSecretCb(), wolfSSL_CTX_SetRsaSignCb(),

wolfSSL_CTX_SetRsaVerifyCb(),wolfSSL_CTX_SetRsaEncCb(), および

wolfSSL_CTX_SetRsaDecCb() を登録する必要があります。

Page 93: wolfSSL ユーザ・マニュアル...Visual Sturdio によるビルドについては、” wolfSSL with Visual Studio” により詳細な説 明があります。 VS2008:Visual

89 © 2004 - 2019 wolfSSL, Inc.

ユーザーはWOLFSSL オブジェクト (セッション) ごとにユーザコンテクストを

wolfSSL_SetEccSignCtx(), wolfSSL_SetEccVerifyCtx(),

wolfSSL_SetEccSharedSecretCtx(), wolfSSL_SetRsaSignCtx(),

wolfSSL_SetRsaVerifyCtx(), wolfSSL_SetRsaEncCtx(), およびwolfSSL_SetRsaDecCtx()

関数で登録することができます。このコンテクストは任意のユーザー定義コンテクストに

対するポインタが指定可能です。ここで指定したポインタは、”void* ctx”パラメータとして

MAC/暗号化と復号化/検証コールバックに送り返されます。

サンプルコールバックが wolfssl/test.h の myEccSignCb(), myEccVerfyCb(),

myEccSharedSecret(), myRsaSignCb(), myRsaVerfyCb(), myRsaEncCb()と

myRsaDecCb()にあります。使用方法は wolfSSL サンプルクライアント

(examples/client/client.c) の”-P”オプションを指定した場合を参照してください。

公開鍵コールバックを使用するために、wolfSSL は configure コマンドのオプションで “--

enable-atomicuser”を指定するか、プリプロセッサフラブに ATOMIC_USER を定義して

ください。

Page 94: wolfSSL ユーザ・マニュアル...Visual Sturdio によるビルドについては、” wolfSSL with Visual Studio” により詳細な説 明があります。 VS2008:Visual

90 © 2004 - 2019 wolfSSL, Inc.

鍵と証明書

X.509 署名入門、また SSL と TLS における使用方法については付録 A を参照してくださ

い。

サポートするフォーマットとサイズ

wolfSSL は、PKCS#8 秘密鍵(PKCS#5 または PKCS#12 暗号化による)とともに PEM

と DER フォーマットの証明書と鍵をサポートします。

PEM(Privacy Enhanced Mail)は認証局から発行される証明書のもっとも一般的なフォ

ーマットです。PEM ファイルは、複数のサーバーの証明書、中間認証、秘密鍵を含むこと

ができる Base64 でエンコードされた ASCII ファイルで、.pem, .crt, .cer および.key のフ

ァイル拡張子を持ちます。PEM ファイルを含む証明書は“-----BEGIN CERTIFICATE--

---” と“-----END CERTIFICATE-----” ステートメントで包まれます。

DER(Distinguished Encoding Rules)は証明書のバイナリー・フォーマットです。

DER ファイルの拡張子は.der または.cer などで、テキスト・エディターで見ることができ

ます。

証明書のロード

証明書は通常、ファイル・システムを使用してロードされます(メモリ・バッファーから

のロードもサポートされています。セクション 7.5 参照)

CA 証明書のロード

CA 証明書ファイルは wolfSSL_CTX_load_verify_locations()関数を使用してロードするこ

とができます:

int wolfSSL_CTX_load_verify_locations(WOLFSSL_CTX *ctx,

const char *CAfile, const char *CApath);

Page 95: wolfSSL ユーザ・マニュアル...Visual Sturdio によるビルドについては、” wolfSSL with Visual Studio” により詳細な説 明があります。 VS2008:Visual

91 © 2004 - 2019 wolfSSL, Inc.

CA のロードは、上記の関数を使用して PEM フォーマットで CAfile を渡すことで、証明

書の数に制限なくファイル当たり複数の CA 証明書を解析することができます。これによ

って初期値化が簡単になり、スタートアップ時に複数のルート CA をロードする必要があ

る場合便利です。これは、wolfSSL を複数の CA を単一ファイルで扱うことを期待してい

るツールへの移植を容易にします。

注意:ルートと中間証明書のチェーンをロードする必要がある場合は、信頼の順にそれら

をロードする必要があります。 最初にROOT CAをロードし、その後に中間1を、次に中間

2をロードします。各証明書がロードされるたびにwolfSSL_CTX_load_verify_locationsを

呼び出すか、証明書を含むファイルを順番に1回だけ呼び出すことができます(ファイルの

先頭のルートと信頼チェーンによって注文された証明書)

クライアントまたはサーバー証明書のロード

単一のクライアントまたはサーバー証明書のロードはwolfSSL_CTX_use_certificate_file()

関数で行われます。この関数は証明書チェーンに使用した場合、実際の(または“ボトム

の”)証明書だけが送られます。

int wolfSSL_CTX_use_certificate_file(WOLFSSL_CTX *ctx,

const char *CAfile, int type);

CAfile は CA 証明書ファイルです。Type は SSL_FILETYPE_PEM などの証明書のフォー

マットです。

サーバーまたはクライアントは wolfSSL_CTX_use_certificate_chain_file()関数を使って証

明書チェーンを送ることができます。証明書チェーン・ファイルは PEM フォーマットでな

ければならず、subject の証明書(実際のクライアントまたはサーバー証明書)で始まり、

以降は中間証明書および(必要に応じて)ルート(トップ)CA で終わるように順序がソ

ートされていなければなりません。サーバーの例(/examples/server/server.c)はこ の機

能を使用しています。

int wolfSSL_CTX_use_certificate_chain_file(WOLFSSL_CTX

*ctx,const char *file);

Page 96: wolfSSL ユーザ・マニュアル...Visual Sturdio によるビルドについては、” wolfSSL with Visual Studio” により詳細な説 明があります。 VS2008:Visual

92 © 2004 - 2019 wolfSSL, Inc.

注意:これは、検証のために証明書チェーンをロードするときに必要な順序とはまったく

逆です。 このシナリオでのファイルの内容は、ファイルの先頭にEntityの証明書が続き、

チェーンの次の証明書が続き、ファイルの末尾にルートCAが続きます。

秘密鍵のロード

サーバーの秘密鍵は wolfSSL_CTX_use_PrivateKey_file()関数を使用してロードすること

ができます。

int wolfSSL_CTX_use_PrivateKey_file(WOLFSSL_CTX *ctx,

const char *keyFile, int type);

keyFile は秘密鍵、type は秘密鍵のフォーマット(例えば

SSL_FILETYPE_PEM)です。

信頼する相手の証明書のロード

信頼する相手の証明書のロードは wolfSSL_CTX_trust_peer_cert()関数で行います。

int wolfSSL_CTX_trust_peer_cert(WOLFSSL_CTX *ctx, const char

*trustCert, int type);

trustCert はロードすべき証明書、type は証明書のフォーマット(例えば、

SSL_FILETYPE_PEM)です。

証明書チェーンの検証

wolfSSL は、証明書チェーンを検証するために、信頼できる証明書としてロードされるチ

ェーンのトップ(ルート)証明書だけを必要とします。つまり、C は B によって署名さ

れ、B は A によって署名されたような証明書チェーン(A→B→C)を持っている場合、

wolfSSL は、チェーン(A→B→C)全体を検証するために信頼できる証明書としてロード

された証明書 A だけを要求するということです。

Page 97: wolfSSL ユーザ・マニュアル...Visual Sturdio によるビルドについては、” wolfSSL with Visual Studio” により詳細な説 明があります。 VS2008:Visual

93 © 2004 - 2019 wolfSSL, Inc.

例えばサーバー証明書チェーンは次のような感じになっています:

wolfSSL クライアントは少なくとも一つの信頼する CA をすでに持っているはずです。ク

ライアントがサーバーの証明書チェーンを受診すると、まず署名 A を使って署名 B を検証

します。もし、B が以前に信頼する CA として wolfSSL にロードされていなければ、B は

wolfSSL 内部の信頼する CA チェーンに保存されます(wolfSSL は証明書の検証に必要な

物だけを保存します:共通名ハッシュ、公開鍵と鍵タイプ他)。B が検証されたら、それ

を C の検証に使います。

このモデルに従って、A が信頼するルートとして wolfSSL クライアントにロードされてい

る限り、サーバーが(A->B->C)または(B->C)を送れば、サーバー証明書チェーンの検証は

可能なのです。もし、サーバーが中間証明書なしで C のみを送った場合、wolfSSL クライ

ントが信頼するルートとして B をロードしていない限り検証することはできません。

サーバー証明書のドメイン名チェック

wolfSSL は、サーバー証明書のドメインを自動的にチェックするクライアントに対する拡

張機能を持っています。OpenSSL モードでは、これを実現するのに十数個近くの関数コー

ルを必要とします。wolfSSL は証明書の日付のレンジのチェック、署名の検証、また必要

ならドメインの検証などを、wolfSSL_connect()の前に以下の関数呼び出しで行います:

wolfSSL_check_domain_name(WOLFSSL* ssl, cons char* dn) ;

wolfSSL はピアのサーバー証明書の X509 発行者名と dn を照合します。名前がマッチする

Page 98: wolfSSL ユーザ・マニュアル...Visual Sturdio によるビルドについては、” wolfSSL with Visual Studio” により詳細な説 明があります。 VS2008:Visual

94 © 2004 - 2019 wolfSSL, Inc.

場合、wolfSSL_connect()は正常に処理しますが、マッチしない場合はwolfSSL_connect()

は致命的エラーを返却し、wolfSSL_get_error() はDOMAIN_NAME_MISMATCH を返却

します。

証明書のドメイン名チェックはサーバーが実際にだれを名乗っているのかを検証する重要

なステップです。この拡張はチェックを実現する負荷を軽減することを意図しています。

ファイル・システム無しでの証明書使用

通常は、秘密鍵、証明書、CA などのロードのためにはファイル・システムが使用されま

す。wolfSSL は本格的ファイル・システム無しの環境で使用されることもあるので、代

わりにメモリ・バッファーを使用した拡張を提供しています。この拡張を利用するには定

数 NO_FILESYSTEM を定義して下記の関数を使用可能にしてください:

int wolfSSL_CTX_load_verify_buffer(WOLFSSL_CTX* ctx, const unsigned

char* in,long sz, int format);

int wolfSSL_CTX_use_certificate_buffer(WOLFSSL_CTX* ctx,

const unsigned char* in,

long sz, int format);

int wolfSSL_CTX_use_PrivateKey_buffer(WOLFSSL_CTX* ctx,

const unsigned char* in,

long sz, int format);

int wolfSSL_CTX_use_certificate_chain_buffer(WOLFSSL_CTX* ctx,

const unsigned char* in,long

sz);

int wolfSSL_CTX_trust_peer_buffer(WOLFSSL_CTX* ctx,

const unsigned char* in,

Long sz, int format);

関数名の buffer が file となっている対応する関数とまったく同じように、これらの関数

を使用してください。また、ファイル名を与える代わりにメモリ・バッファーを与えてく

ださい。

テスト用証明書と鍵バッファ

wolfSSL は、以前からテスト用の証明書と鍵ファイルをバンドルしていました。今は、そ

Page 99: wolfSSL ユーザ・マニュアル...Visual Sturdio によるビルドについては、” wolfSSL with Visual Studio” により詳細な説 明があります。 VS2008:Visual

95 © 2004 - 2019 wolfSSL, Inc.

れに加えてファイル・システムの使えない環境のために、テスト用の証明書バッファと鍵

バッファもバンドルしています。これらのバッファは cert_test.h にあって、

SE_CERT_BUFFERS_1024 、USE_CERT_BUFFERS_2048 または

USE_CERT_BUFFERS_256 を定義することで使用できます。

シリアル番号のリトリーブ

X509 証明書のシリアル番号は以下の関数を使って wolfSSL から抽出することができま

す。シリアル番号の長さは任意です。

int wolfSSL_X509_get_serial_number(WOLFSSL_X509* x509,

byte* buffer,int* inOutSz)

buffer は入力の最大*inOutSz バイトで書き込まれます。呼び出し後、正常の場合(返却値

0)、*inOutSz は buffer に実際に書き込まれたバイト数を保持します。例全体は

wolfssl/test.h に含まれています。

RSA 鍵生成

wolfSSL は最長 4096 ビット長の RSA 鍵生成をサポートします。鍵生成はデフォルトでは

オフとなっていますが、./coufigure プロセスで:

--enable-keygen

で、または Windows や非標準環境では WOLFSSL_KEY_GEN を定義によってオンにする

ことができます。鍵の生成は簡単で、rsa.h から一つの関数を要求するだけです:

int MakeRsaKey(RsaKey* key, int size, long e, RNG* rng);

size はビット長、e は公開鍵暗号化指数で通常 65537 がおすすめです。以下の

wolfcrypt/test/test.c からの例では 1024 ビットの RSA 鍵を生成します:

Page 100: wolfSSL ユーザ・マニュアル...Visual Sturdio によるビルドについては、” wolfSSL with Visual Studio” により詳細な説 明があります。 VS2008:Visual

96 © 2004 - 2019 wolfSSL, Inc.

RsaKey genKey;

RNG rng;

int ret;

InitRng(&rng);

InitRsaKey(&genKey, 0);

ret = MakeRsaKey(&genKey, 1024, 65537, &rng);

if (ret != 0)

/* ret contains error */;

これで RsaKey genKey は他の RsaKey と同じように使用できます。鍵をエクスポートす

る必要がある場合は、wolfSSL は asn.h 中の DER と PEM フォーマットの両方を提供しま

す。常に最初 DER フォーマットに変換して、それから PEM が必要なら汎用の

DerToPem()関数を以下のように使用してください:

byte der[4096];

int derSz = RsaKeyToDer(&genKey, der, sizeof(der));

if (derSz < 0)

/* derSz contains error */;

これで、バッファdef は DER フォーマットの鍵を保持します。DER バッファを PEM

に変換するために変換関数を使用します:

byte pem[4096];

int pemSz = DerToPem(der, derSz, pem, sizeof(pem),

PRIVATEKEY_TYPE);

if (pemSz < 0)

/* pemSz contains error */;

DerToPem()の最後のアーギュメントは type パラメータで、通常、PRIVATEKEY_TYPE

か CERT_TYPE のいずれかです。これで、バッファpem は PEM フォーマットの鍵を保持

します。

RSA 鍵生成の注意点

RSA 秘密鍵は公開鍵も含みますが、wolfSSL は現在、スタンド・アロンの RSA 公開鍵の

みを生成する機能は持っていません。wolfSSL では test.c で使用されているように、秘密

鍵をプライベートと公開鍵どちらとしても使用することができます。

wolfSSL で個々の RSA 公開鍵生成が無い理由は、秘密鍵と公開鍵(証明書の形で)はどち

らも通常 SSL にとって必要とされるものだからです。

Page 101: wolfSSL ユーザ・マニュアル...Visual Sturdio によるビルドについては、” wolfSSL with Visual Studio” により詳細な説 明があります。 VS2008:Visual

97 © 2004 - 2019 wolfSSL, Inc.

分離した公開鍵は RsaPublicKeyDecode()関数を使用して手動で wolfSSL にロードするこ

とができます。

証明書の生成

wolfSSL は x509 v3 証明書の生成をサポートします。証明書生成はデフォルトではオフと

なっていますが、./coufigure 過程で以下を使ってオンにすることができます:

--enable-certgen

また、Windows や非標準の環境では WOLFSSL_CERT_GEN を定義してオンにすること

もできます。

証明書を生成できるようにする前に、証明書のサブジェクトについての情報を準備する必

要があります。この情報は Cert と命名された wolfssl/wolfcrypt /asn.h の構造体に含まれ

ています:

/* for user to fill for certificate generation */

typedef struct Cert {

int version; /* x509 version */

byte serial[CTC_SERIAL_SIZE]; /* serial number */

int sigType; /*signature algo type */

CertName issuer; /* issuer info */

int daysValid; /* validity days */

int selfSigned; /* self signed flag */

CertName subject; /* subject info */

int isCA; /*is this going to be a

CA*/

...

} Cert;

ここにおいて、CertName は以下のような感じです:

typedef struct CertName {

char country[CTC_NAME_SIZE];

char countryEnc;

char state[CTC_NAME_SIZE];

char stateEnc;

char locality[CTC_NAME_SIZE];

char localityEnc;

char sur[CTC_NAME_SIZE];

Page 102: wolfSSL ユーザ・マニュアル...Visual Sturdio によるビルドについては、” wolfSSL with Visual Studio” により詳細な説 明があります。 VS2008:Visual

98 © 2004 - 2019 wolfSSL, Inc.

char surEnc;

char org[CTC_NAME_SIZE];

char orgEnc;

char unit[CTC_NAME_SIZE];

char unitEnc;

char commonName[CTC_NAME_SIZE];

char commonNameEnc;

char email[CTC_NAME_SIZE]; /* !!!! email has to be last!!!! */

} CertName;

サブジェクト情報を格納する前に、以下のような初期化関数を呼び出す必要があります:

Cert myCert;

InitCert(&myCert);

InitCert()は、バージョン番号を 3(0x02)、シリアル番号を 0(ランダムに生成)、

sigType を SHA_WITH_RSA、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 からの例のように、サブジェクト情報を初期化することがで

きるようになりました:

strncpy(myCert.subject.country, "US", NAME_SIZE);

strncpy(myCert.subject.state, "OR", NAME_SIZE);

strncpy(myCert.subject.locality, "Portland", NAME_SIZE);

strncpy(myCert.subject.org, "wolfSSL", NAME_SIZE);

strncpy(myCert.subject.unit, "Development", NAME_SIZE);

Page 103: wolfSSL ユーザ・マニュアル...Visual Sturdio によるビルドについては、” wolfSSL with Visual Studio” により詳細な説 明があります。 VS2008:Visual

99 © 2004 - 2019 wolfSSL, Inc.

strncpy(myCert.subject.commonName, "www.wolfssl.com",

NAME_SIZE); strncpy(myCert.subject.email,

"[email protected]", NAME_SIZE);

次に、自己署名の証明書を genKey と mg 変数を使って上記の鍵生成例から(もちろん、

有効な RsaKey や RNG を使用可能です)生成することができます:

byte derCert[4096];

int certSz = MakeSelfCert(&myCert, derCert, sizeof(derCert), &key,

&rng);

if (certSz < 0)

/* certSz contains the error */;

これで derCert バッファには DER フォーマットの証明書が格納されます。PEN フォーマ

ットの証明書が必要な場合は汎用の DerToPem 関数で CERT_TYPE を type に指定し

て、以下のように生成することができます:

byte* pem;

int pemSz = DerToPem(derCert, certSz, pem, sizeof(pemCert),

CERT_TYPE);

if (pemCertSz < 0)

/* pemCertSz contains error */;

以上で pemCert は PEM フォーマットの証明書を保持します。

CA 署名の証明書を生成したい場合は、さらに2、3のステップを必要とします。まず、

サブジェクト情報を入れた後、CA 証明書から発行者情報を設定する必要があります。こ

れは SetIssuer()で以下のようにできます:

ret = SetIssuer(&myCert, “ca-cert.pem”);

if (ret < 0)

/* ret contains error */;

次に、証明書を生成する2ステップのプロセスと、さらにそれに署名します

(MakeSelfCert()はこれら二つを一つのステップで行います)。発行者(caKey)とサブジ

ェクト(key)の両方から秘密鍵を生成する必要があります。使用方法全体については

test.c の例を参照してください。

Page 104: wolfSSL ユーザ・マニュアル...Visual Sturdio によるビルドについては、” wolfSSL with Visual Studio” により詳細な説 明があります。 VS2008:Visual

100 © 2004 - 2019 wolfSSL, Inc.

byte derCert[4096];

int certSz = MakeCert(&myCert, derCert, sizeof(derCert), &key,

NULL, &rng);

if (certSz < 0);

/*certSz contains the error*/;

certSz = SignCert(myCert.bodySz, myCert.sigType, derCert,

sizeof(derCert), &caKey, NULL, &rng);

if (certSz < 0);

/*certSz contains the error*/;

以上で derCert バッファには DER フォーマットの CA 署名された証明書が格納されます。

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が生成される前に、ユーザーは証明書の件名に関する情報を提供する必要がありま

す。 この情報は、Certという名前のwolfssl / wolfcrypt / asn_public.hの構造体に含まれて

います。

CertおよびCertName構造の詳細については、前述の「7.8証明書の生成」を参照してくだ

さい。

Subject 情報を入力する前に、このように初期化関数を呼び出す必要があります:

Page 105: wolfSSL ユーザ・マニュアル...Visual Sturdio によるビルドについては、” wolfSSL with Visual Studio” により詳細な説 明があります。 VS2008:Visual

101 © 2004 - 2019 wolfSSL, Inc.

Cert request;

InitCert(&request);

nitCert()は、バージョンを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

これで、ユーザーは、Subject情報を、例 https://github.com/wolfSSL/wolfssl-

examples/blob/master/certgen/csr_example.c のように初期化できます:

strncpy(req.subject.country, "US", CTC_NAME_SIZE);

strncpy(req.subject.state, "OR", CTC_NAME_SIZE);

strncpy(req.subject.locality, "Portland", CTC_NAME_SIZE);

strncpy(req.subject.org, "wolfSSL", CTC_NAME_SIZE);

strncpy(req.subject.unit, "Development", CTC_NAME_SIZE);

strncpy(req.subject.commonName, "www.wolfssl.com", CTC_NAME_SIZE);

strncpy(req.subject.email, "[email protected]", CTC_NAME_SIZE);

次に、上記の鍵生成例の可変鍵を使用して有効な署名付きCSRを生成することができます

(もちろん、有効なECC / RSA鍵またはRNGを使用できます)

byte der[4096]; /* Store request in der format once made */

ret = wc_MakeCertReq(&request, der, sizeof(der), NULL, &key); /* check ret value for error handling, <= 0 indicates a failure */

Page 106: wolfSSL ユーザ・マニュアル...Visual Sturdio によるビルドについては、” wolfSSL with Visual Studio” により詳細な説 明があります。 VS2008:Visual

102 © 2004 - 2019 wolfSSL, Inc.

次に、有効にするリクエストに署名したい場合は、上記の鍵生成の例のrng変数を使用しま

す。 (もちろん、有効なECC / RSA鍵またはRNGを使用できます)

derSz = ret;

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 */

最後に、証明書の発行に使用するCA機関に送信するために、CSRからPEM形式に変換しま

す。

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からの証明書生成

をサポートしていません。 現在、wolfSSL解析エンジンにCSRを渡すと失敗します。 証明

書生成に使用するためにCSRを使用することをサポートしたら、アップデートをチェック

してください!

参照:7.8 証明書の作成

生 ECC 鍵への変換

最近追加されたサポートの一環として、生 ECC 鍵インポート ECC 鍵の PEM から DER

への変換が可能となりました。次のような関数をアーギュメントを指定して実行してくだ

さい。

EccKeyToDer(ecc_key*, byte* output, word32 inLen);

Page 107: wolfSSL ユーザ・マニュアル...Visual Sturdio によるビルドについては、” wolfSSL with Visual Studio” により詳細な説 明があります。 VS2008:Visual

103 © 2004 - 2019 wolfSSL, Inc.

例:

#define FOURK_BUF 4096

byte der[FOURK_BUF];

ecc_key userB;

EccKeyToDer(&userB, der, FOURK_BUF);

Page 108: wolfSSL ユーザ・マニュアル...Visual Sturdio によるビルドについては、” wolfSSL with Visual Studio” により詳細な説 明があります。 VS2008:Visual

104 © 2004 - 2019 wolfSSL, Inc.

デバッグ

デバッグとログ

wolfSSL はデバッグ機能が限られている環境のために、ログ・メッセージを通じてデバッ

グをサポートします。実行時にログ機能をオンにするには wolfSSL_Debugging_ON()関

数、オフにするには wolfSSL_Debugging_OFF()関数を使用してください。通常ビルド(リ

リースモード)ではこれらの関数は作用しないようになります。デバッグビルドでは、

DEBUG_WOLFSSL を定義しこれらの関数をオンにしておく必要があります。

wolfSSL2.0 では、ログ機能のコールバック関数が実行時に登録でき、ログがどのようにさ

れるか柔軟に指定できます。ログ機能のコールバックは次のような関数で登録できま す:

int wolfSSL_SetLoggingCb(wolfSSL_Logging_cb log_function);

typedef void (*wolfSSL_Logging_cb)(const int logLevel,

const char *const logMessage);

ログレベルについては wolfssl/wolfcrypt/logging.h に定義があり、その実体は logging.c に

あります。デフォルトでログは fprintf の stderr に出力されます。

エラー・コード

wolfSSL は、デバッグを手助けするために有用なエラー・メッセージを提供します。

それぞれの wolfSSL_read()または wolfSSL_write()呼び出しは、ちょうど read()や write()

と同じように、成功した場合書き込みバイト数、コネクションのクローズ時には 0、エラー

時には-1 を返却します。エラー時には二つの呼び出しを使ってエラーに関してさらに情報

を得ることができます。

wolfSSL_get_error()はその時点のエラー・コードを返却します。WOLFSSL オブジェク

トと wolfSSL_read()または wolfSSL_write()の返却値をアーギュメントとして受け取り、

対応するエラー・コードを返却します

Page 109: wolfSSL ユーザ・マニュアル...Visual Sturdio によるビルドについては、” wolfSSL with Visual Studio” により詳細な説 明があります。 VS2008:Visual

105 © 2004 - 2019 wolfSSL, Inc.

int err = wolfSSL_get_error(ssl, result);

さらに人が読める形のエラー・コードの説明を得るためにはwolfSSL_ERR_error_string()

関数を使用することができます。wolfSSL_get_error()の返却するコードとストレージ・バ

ッファをアーギュメントとして受け取り、対応するエラー の説明をストレージ・バッファ

(下の例では errorString)に置きます。

char errorString[80];

wolfSSL_ERR_error_string(err, errorString);

ノンブロッキングのソケットを使用している場合、EAGAIN/EWOULDBLOCK でエラー

チェックすることができます。さらにより正確には、特定のエラー・コードを

SSL_ERROR_WANT_READ と SSL_ERROR_WANT_WRITE でテストすることができま

す。

wolfSSL と wolfCrypt のエラー・コードのリストはユーザ・マニュアル Appendix C (エラ

ー・コード)を参照してください。

Page 110: wolfSSL ユーザ・マニュアル...Visual Sturdio によるビルドについては、” wolfSSL with Visual Studio” により詳細な説 明があります。 VS2008:Visual

106 © 2004 - 2019 wolfSSL, Inc.

ライブラリ設計

ライブラリー・ヘッダー

wolfSSLでは、ライブラリー・ヘッダーファイルは以下の場所に格納されています:

wolfSSL: wolfssl/

wolfCrypt: wolfssl/wolfcrypt/

wolfSSL OpenSSL Compatibility Layer: wolfssl/openssl/

OpenSSL 互換レイヤー(ユーザマニュアル第 13 章参照)を使用する場合、

/wolfssl/openssl/ssl.h ヘッダーをインクルードする必要があります:

#include <wolfssl/openssl/ssl.h>

wolfSSL ネイティブ API のみを使用する場合は /wolfssl/ssl.h ヘッダーをインクルードする

必要があります:

#include <wolfssl/ssl.h>

開始と終了

すべてのアプリケーションはライブラリを使用する前に wolfSSL_Init()を呼び出し、プ

ログラム終了時には wolfSSL_Cleanup()を呼び出す必要があります。現在は、これらの関

数はマルチユーザーモードにおいてセッション・キャッシュのための共有の相互排他を初

期化あるいは解放するだけですが、将来、拡張の可能性があるのでこれらを使用すること

をお勧めします。

構造体の使用

ヘッダーファイルの格納場所の変更のほかに、現在のwolfSSLではネイティブ wolfSSL

Page 111: wolfSSL ユーザ・マニュアル...Visual Sturdio によるビルドについては、” wolfSSL with Visual Studio” により詳細な説 明があります。 VS2008:Visual

107 © 2004 - 2019 wolfSSL, Inc.

API と wolfSSL OpenSSL 互換レイヤーの間を命名法で区別しています。この区別によっ

て、ネイティブ wolfSSL API によって使用される主なSSL/TLS 構造体は名前はopenSSL

とは異なっています。wolfSSLでの構造体は以下の通りです。OpenSSL 互換レイヤー(ユ

ーザ・マニュアル第 13 章参照)を使用する場合は以前の名前も使用されています。

WOLFSSL (旧 wolfSSLまたは openSSL互換ビルド時 SSL)

WOLFSSL_CTX (旧 wolfSSLまたは openSSL互換ビルド時 SSL_CTX)

WOLFSSL_METHOD (旧 wolfSSLまたは openSSL互換ビルド時

SSL_METHOD)

WOLFSSL_SESSION (旧 wolfSSLまたは openSSL互換ビルド時 SSL_SESSION)

WOLFSSL_X509 (旧 wolfSSLまたは openSSL互換ビルド時 X509)

WOLFSSL_X509_NAME (旧 wolfSSLまたは openSSL互換ビルド時

X509_NAME)

WOLFSSL_X509_CHAIN (旧 wolfSSLまたは openSSL互換ビルド時

X509_CHAIN)

スレッド安全性

wolfSSL はスレッドに対して安全に設計されています。wolfSSL はグローバル・データ、

静的データおよび共有オブジェクトを避けているので、マルチスレッドが競合を起こすこ

となしに並列にライブラリに入ることができます。しかし、それでも二つの場合で潜在的

問題に注意してください。

1. クライアントはWOLFSSL オブジェクトをマルチスレッド間で共有してもかまいませんが、アクセスは同期しなければいけません。例えば、二つの異なるスレッドから同 時に同じ SSL ポインタに read/write するようなことはサポートされていません。

wolfSSL はより過激な(制限のきつい)スタンス、つまり「複数ユーザー間で共有する関

数に誰かが入った場合、他のユーザーをロックアウトする」というようなスタンスもとり

得たかもしれません。しかし、この粒度レベルは直観に反します。すべてのユー ザ(シン

グルスレッドでさえ)はロッキングの代償を払うことになり、マルチスレッ ドではスレッ

ド間で共有されていなくてもライブラリに再入不可となってしまいます。この代償は大き

すぎるように思われ、wolfSSL は共有オブジェクトの同期責任をユーザーの手にゆだねて

います。

Page 112: wolfSSL ユーザ・マニュアル...Visual Sturdio によるビルドについては、” wolfSSL with Visual Studio” により詳細な説 明があります。 VS2008:Visual

108 © 2004 - 2019 wolfSSL, Inc.

WOLFSSL ポインタを共有するほかに、ユーザーは wolfSSL_new()に構造体を渡す前に

WOLFSSL_CTX を完全に初期化する責任があります。同じ WOLFSSL_CTX は複

数の WOLFSSL 構造体を生成することができますが、いったん WOLFSSL オブジェ

クトが生成された後は wolfSSL_new()生成と WOLFSSL_CTX に対するその後の(あ

るいは同時の)変更は反映されません。

繰り返しになりますが、WOLFSSL_CTX に対する書き込みアクセスはマルチスレッドに対

して同期する必要があり、上記説明の同期とアップデート問題を回避するため に、

WOLFSSL_CTX のシングル・スレッドの初期化をお勧めします。

入力と出力バッファ

wolfSSL は入力と出力のために小さな静的バッファを使用しています。デフォルトでは128

バイト、wolfssl/internal.h の RECORD_SIZE でコントロールされています。受け取る入

力レコードが静的バッファよりサイズ的に大きい場合は、要求を処理するために動 的バッ

ファが一時的に使用され、解放されます。静的バッファのサイズは最大

MAX_RECORD_SIZE、2 の 16 乗または 16,384 まで指定することができます。

もし動的メモリを必要としない場合で、wolfSSL の以前の方法、16Kb の静的バッファのほ

うの使用を希望する場合、LARGE_STATIC_BUFFER を定義してそのオプションを選択

することができます。

小さな静的バッファが使用され、バッファー・サイズより大きな wolfSSL_write()を要求し

た場合、最大 MAX_RECORD_SIZE の動的ブロックが使用されデーターを送信します。現

時点のバッファー・サイズの分のデータだけを送信したい(そして、動的メモリ を避けた

い)場合は STATIC_CHUNKS_ONLY を定義して、これを行うことができます。

Page 113: wolfSSL ユーザ・マニュアル...Visual Sturdio によるビルドについては、” wolfSSL with Visual Studio” により詳細な説 明があります。 VS2008:Visual

109 © 2004 - 2019 wolfSSL, Inc.

wolfCrypt 使用方法

wolfCrypt は、wolfSSLから主に使用される暗号化ライブラリです。このライブラリは、実

行速度、フットプリント、そして移植性に最適化されています。wolfSSLは必要に応じて他

の暗号化ライブラリと相互作用します。

以下は、例の中で使用される型:

Types used in the examples:

typedef unsigned char byte;

typedef unsigned int word32;

ハッシュ関数

MD4

注意:MD4は、古く、安全性に問題があると考えられています。可能であれば、別のハッ

シュ関数を使用することを検討してください。

MD4を使用するには、MD4ヘッダー “wolfSSL/wolfcrypt/md4.h”を含めます。使用する構

造体は、typedef 済みの Md4 です。使用する前に、ハッシュの初期化を wc_InitMd4() 呼

び出しで行う必要があります。wc_Md4Update() を使用してハッシュを更新し、

wc_Md4Final()を使用して最終ハッシュを取得します。

byte md4sum[MD4_DIGEST_SIZE];

byte buffer[1024];

/* fill buffer with data to hash*/

Md4 md4;

wc_InitMd4(&md4);

wc_Md4Update(&md4, buffer, sizeof(buffer)); /*can be called again

and again*/

wc_Md4Final(&md4, md4sum);

md4sumには、bufferに対するハッシュ済みのダイジェストが含まれています。

MD5

Page 114: wolfSSL ユーザ・マニュアル...Visual Sturdio によるビルドについては、” wolfSSL with Visual Studio” により詳細な説 明があります。 VS2008:Visual

110 © 2004 - 2019 wolfSSL, Inc.

注意:MD5は、古く、安全性に問題があると考えられています。可能であれば、別のハッ

シュ関数を使用することを検討してください。

MD5 を使用するには、MD5 ヘッダー “wolfSSL/wolfcrypt/md5.h”を含めます。使用する構

造体は、typedef 済みの Md5 です。使用する前に、ハッシュの初期化を wc_InitMd5() 呼

び出しで行う必要があります。wc_Md5Update() を使用してハッシュを更新し、

wc_Md5Final()を使用して最終ハッシュを取得します。

byte md5sum[MD5_DIGEST_SIZE];

byte buffer[1024];

/*fill buffer with data to hash*/

Md5 md5;

wc_InitMd5(&md5);

wc_Md5Update(&md5, buffer, sizeof(buffer)); /*can be called again

and again*/

wc_Md5Final(&md5, md5sum);

md5sumには、bufferに対するハッシュ済みのダイジェストが含まれています。

SHA / SHA-224 / SHA-256 / SHA-384 / SHA-512

SHAを使用するには、SHAヘッダー "wolfssl / wolfcrypt / sha.h"を含めます。 使用する構

造体は、typedef済みの Sha です。 使用する前に、ハッシュの初期化を wc_InitSha() 呼び

出しで行う必要があります。 wc_ShaUpdate() を使用してハッシュを更新し、

wc_ShaFinal() を使用して最終的なハッシュを取得します。

byte shaSum[SHA_DIGEST_SIZE];

byte buffer[1024];

/*fill buffer with data to hash*/

Sha sha;

wc_InitSha(&sha);

wc_ShaUpdate(&sha, buffer, sizeof(buffer)); /*can be called again

and again*/

wc_ShaFinal(&sha, shaSum);

shaSumには、bufferに対するハッシュ済みのダイジェストが含まれています。

SHA-224、SHA-256、SHA-384、またはSHA-512のいずれかを使用するには、上記の手順

Page 115: wolfSSL ユーザ・マニュアル...Visual Sturdio によるビルドについては、” wolfSSL with Visual Studio” により詳細な説 明があります。 VS2008:Visual

111 © 2004 - 2019 wolfSSL, Inc.

と同じ手順を実行しますが、「wolfssl / wolfcrypt / sha256.h」または「wolfssl / wolfcrypt

/ sha512.h」 "(SHA-384とSHA-512の両方)。 SHA-256、SHA-384、およびSHA-512関

数の名前は、SHA関数と類似した関数を使用します。

SHA-224の場合、InitSha224()、Sha224Update() 、およびSha224Final() の各関数は

Sha224構造体とともに使用されます。

SHA-256の場合、InitSha256() 、Sha256Update() 、Sha256Final() の各関数はSha256構

造体で使用されます。

SHA-384では、構造Sha384で関数InitSha384() 、Sha384Update() 、および

Sha384Final() が使用されます。

SHA-512の場合、構造Sha512で関数InitSha512() 、Sha512Update() 、および

Sha512Final() が使用されます。

BLAKE2b

BLAKE2b(SHA-3ファイナリスト)を使用するには、BLAKE2b ヘッダー "wolfssl /

wolfcrypt / blake2.h"を含めます。 使用する構造体は、typedef済みの Blake2b です。 使用

する前に、ハッシュの初期化を wc_InitBlake2b() 呼び出しで行う必要があります。

wc_Blake2bUpdate() を使用してハッシュを更新し、wc_Blake2bFinal() を使用して最終的

なハッシュを取得します。

byte digest[64];

byte input[64]; /*fill input with data to hash*/

Blake2b b2b;

wc_InitBlake2b(&b2b, 64);

wc_Blake2bUpdate(&b2b, input, sizeof(input));

wc_Blake2bFinal(&b2b, digest, 64);

wc_InitBlake2b() の2番目のパラメータは最終的なダイジェストサイズにする必要がありま

す。 ダイジェストには、バッファ内のハッシュされたデータのダイジェストが含まれるよ

うになりました。

Page 116: wolfSSL ユーザ・マニュアル...Visual Sturdio によるビルドについては、” wolfSSL with Visual Studio” により詳細な説 明があります。 VS2008:Visual

112 © 2004 - 2019 wolfSSL, Inc.

使用例は、blake2b_test() 関数内のwolfCryptテスト・アプリケーション(wolfcrypt / test /

test.c)にあります。

RIPEMD-160

RIPEMD-160を使用するには、ヘッダー "wolfssl / wolfcrypt / ripemd.h"を含めてくださ

い。 使用する構造体は typedef 済みの RipeMd です。 使用する前に、ハッシュの初期化を

wc_InitRipeMd() 呼び出しで行う必要があります。 wc_RipeMdUpdate() を使用してハッ

シュを更新し、wc_RipeMdFinal() を使用して最終的なハッシュを取得します。

byte ripeMdSum[RIPEMD_DIGEST_SIZE];

byte buffer[1024];

/*fill buffer with data to hash*/

RipeMd ripemd;

wc_InitRipeMd(&ripemd);

wc_RipeMdUpdate(&ripemd, buffer, sizeof(buffer)); /*can be called

again and

again*/

wc_RipeMdFinal(&ripemd, ripeMdSum);

ripeMdSum には、buffer に対するハッシュ済みのダイジェストが含まれています。

鍵付きハッシュ関数

HMAC

wolfCryptは現在、メッセージ・ダイジェストに必要なHMACを提供しています。 構造体

Hmacはヘッダー "wolfssl / wolfcrypt / hmac.h"にあります。 HMAC の初期化は

wc_HmacSetKey() で行います。 MD5、SHA、SHA-256、SHA-384、および SHA-512 の

5種類が HMAC でサポートされています。 SHA-256 の例を以下に示します。

Hmac hmac;

byte key[24]; /*fill key with keying material*/

byte buffer[2048]; /*fill buffer with data to digest*/

byte hmacDigest[SHA256_DIGEST_SIZE];

wc_HmacSetKey(&hmac, SHA256, key, sizeof(key));

wc_HmacUpdate(&hmac, buffer, sizeof(buffer));

wc_HmacFinal(&hmac, hmacDigest);

Page 117: wolfSSL ユーザ・マニュアル...Visual Sturdio によるビルドについては、” wolfSSL with Visual Studio” により詳細な説 明があります。 VS2008:Visual

113 © 2004 - 2019 wolfSSL, Inc.

hmacDigest には、バッファ内のハッシュされたデータのダイジェストが含まれます。

GMAC

wolfCrypt は、メッセージ・ダイジェストに必要な GMAC も提供します。構造体 Gmac

は、AES-GCMのアプリケーションである為、ヘッダー “wolfssl/wolfcrypt/aes.h” にありま

す。 GMAC の初期化は wc_GmacSetKey() で行います。

Gmac gmac;

byte key[16]; /*fill key with keying material*/

byte iv[12]; /*fill iv with an initialization vector*/

byte buffer[2048]; /*fill buffer with data to digest*/

byte gmacDigest[16];

wc_GmacSetKey(&gmac, key, sizeof(key));

wc_GmacUpdate(&gmac, iv, sizeof(iv), buffer, sizeof(buffer),

gmacDigest, sizeof(gmacDigest));

gmacDigest には、バッファ内のハッシュされたデータのダイジェストが含まれます。

Poly1305

wolfCrypt は、メッセージ・ダイジェストに必要な Poly1305 も提供します。構造体

Poly1305 は、ヘッダー “wolfssl/wolfcrypt/poly1305.h” にあります。 Poly1305 の初期化は

wc_Poly1305SetKey() で行います。wc_Poly1305Final() が呼び出された後で Poly1305 に

鍵を設定する手順は、Poly1305構造体を使用して、次の新しい鍵で再度実行する必要があ

ります。

Poly1305 pmac;

byte key[32]; /*fill key with keying material*/

byte buffer[2048]; /*fill buffer with data to digest*/

byte pmacDigest[16];

wc_Poly1305SetKey(&pmac, key, sizeof(key));

wc_Poly1305Update(&pmac, buffer, sizeof(buffer));

wc_Poly1305Final(&pmac, pmacDigest);

pmacDigestには、バッファ内のハッシュ済みデータのダイジェストが含まれます。

ブロック暗号

Page 118: wolfSSL ユーザ・マニュアル...Visual Sturdio によるビルドについては、” wolfSSL with Visual Studio” により詳細な説 明があります。 VS2008:Visual

114 © 2004 - 2019 wolfSSL, Inc.

AES

wolfCryptは、16バイト(128ビット)、24バイト(192ビット)、または32バイト(256

ビット)の鍵サイズで AES をサポートします。 サポートされている AES モードには、

CBC、CTR、GCM、および CCM-8 があります。

CBCモードは、暗号化と復号化の両方でサポートされており、wc_AesSetKey() 、

wc_AesCbcEncrypt() および wc_AesCbcDecrypt() 関数によって提供されます。 AES を使

用するには、ヘッダー "wolfssl / wolfcrypt / aes.h" を使用してください。 AES は 16バイト

のブロックサイズを持ち、IV も 16 バイトでなければなりません。 関数の使用法は通常次

のとおりです。

Aes enc;

Aes dec;

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];

/*encrypt*/

wc_AesSetKey(&enc, key, sizeof(key), iv, AES_ENCRYPTION);

wc_AesCbcEncrypt(&enc, cipher, plain, sizeof(plain));

cipherには、暗号文が含まれています。

/*decrypt*/

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" ヘッダーを使用します。

CTR モードは、wc_AesCtrEncrypt() 関数を介して暗号化に使用できます。

Page 119: wolfSSL ユーザ・マニュアル...Visual Sturdio によるビルドについては、” wolfSSL with Visual Studio” により詳細な説 明があります。 VS2008:Visual

115 © 2004 - 2019 wolfSSL, Inc.

GCM モードは、wc_AesGcmSetKey()、wc_AesGcmEncrypt()、および

wc_AesGcmDecrypt() 関数を使用して、暗号化および復号化の両方に使用できます。 使用

例については、<wolfssl_root> /wolfcrypt/test/test.c の aesgcm_test()関数を参照してく

ださい。

CCM-8 モードは、wc_AesCcmSetKey()、wc_AesCcmEncrypt()、および

wc_AesCcmDecrypt() 関数を使用した暗号化と復号化の両方でサポートされています。 使

用例については、<wolfssl_root> /wolfcrypt/test/test.c の aesccm_test()関数を参照して

ください。

DES と 3DES

wolfCryptは DES と 3DES のサポートを提供します(3は無効な先頭のC識別子ですから

Des3 を以下使用します)。 これらを使用するには、ヘッダー "wolfssl / wolfcrypt / des.h"

を使用します。 使用できる構造は Des と Des3 です。 初期化は wc_Des_SetKey() または

wc_Des3_SetKey() によって行われます。 CBC 暗号化 / 復号化は、wc_Des_CbcEnrypt() /

wc_Des_CbcDecrypt() および wc_Des3_CbcEncrypt() / wc_Des3_CbcDecrypt() を介して提

供されます。 Des は鍵サイズが 8 バイト( 3DES の場合は 24 )で、ブロックサイズは 8

バイトなので、暗号化 / 復号化関数には 8 バイトずつ増やします。 使用するデータがブロ

ックサイズの増分でない場合は、パディングを追加する必要があります。 各 SetKey() は

IV(鍵サイズと同じサイズの初期化ベクトル)も取ります。 使用方法は通常次のようにな

ります。

Des3 enc;

Des3 dec;

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];

/*encrypt*/

wc_Des3_SetKey(&enc, key, iv, DES_ENCRYPTION);

wc_Des3_CbcEncrypt(&enc, cipher, plain, sizeof(plain));

cipherには、暗号文が含まれています。

/*decrypt*/

wc_Des3_SetKey(&dec, key, iv, DES_DECRYPTION);

Page 120: wolfSSL ユーザ・マニュアル...Visual Sturdio によるビルドについては、” wolfSSL with Visual Studio” により詳細な説 明があります。 VS2008:Visual

116 © 2004 - 2019 wolfSSL, Inc.

wc_Des3_CbcDecrypt(&dec, plain, cipher, sizeof(cipher));

plain には、暗号文から復号された元の平文が含まれます。

Camellia

wolfCrypt は Camellia ブロック暗号のサポートを提供します。 Camellia を使用するに

は、ヘッダー "wolfssl / wolfcrypt / camellia.h"を使用します。 使用できる構造は Camellia

です。 初期化は wc_CamelliaSetKey() によって行われます。 CBC 暗号化 / 復号化は、

wc_CamelliaCbcEnrypt() および wc_CamelliaCbcDecrypt() によって提供され、

wc_CamelliaEncryptDirect() および wc_CamelliaDecryptDirect() によって直接暗号化/復

号化が提供されます。

使用例については、<wolfssl_root> /wolfcrypt/test/test.c の camellia_test() 関数を参照し

てください。

ストリーム暗号

ARC4

インターネットで使用される最も一般的なストリーム暗号は ARC4 です。 wolfCrypt はヘ

ッダー "wolfssl / wolfcrypt / arc4.h"でサポートしています。 ブロックサイズがなく、キー

の長さは任意の長さにすることができるため、ブロック暗号より簡単に使用できます。 以

下は ARC4 の一般的な使用方法です。

Arc4 enc;

Arc4 dec;

const byte key[] = { /*some key any length*/};

byte plain[27]; /*no size restriction, fill with data*/

byte cipher[27];

/*encrypt*/

wc_Arc4SetKey(&enc, key, sizeof(key));

wc_Arc4Process(&enc, cipher, plain, sizeof(plain));

cipherには、暗号文が含まれています。

Page 121: wolfSSL ユーザ・マニュアル...Visual Sturdio によるビルドについては、” wolfSSL with Visual Studio” により詳細な説 明があります。 VS2008:Visual

117 © 2004 - 2019 wolfSSL, Inc.

/*decrypt*/

wc_Arc4SetKey(&dec, key, sizeof(key));

wc_Arc4Process(&dec, plain, cipher, sizeof(cipher));

plain には、暗号文から復号された元の平文が含まれます。

RABBIT

人気を得ている新しいストリーム暗号は RABBIT です。 このストリーム暗号は、ヘッダー

"wolfssl / wolfcrypt / rabbit.h"を使用します。 RABBIT は ARC4 に比べて非常に高速です

が、16バイト(128ビット)のキー制約とオプションの8バイト(64ビット)の IV があり

ます。 それ以外の場合は ARC4 とまったく同じです。

Rabbit enc;

Rabbit dec;

const byte key[] = { /*some key 16 bytes*/};

const byte iv[] = { /*some iv 8 bytes*/ };

byte plain[27]; /*no size restriction, fill with data*/

byte cipher[27];

/*encrypt*/

wc_RabbitSetKey(&enc, key, iv); /*iv can be a NULL pointer*/

wc_RabbitProcess(&enc, cipher, plain, sizeof(plain));

cipherには、暗号文が含まれています。

/*decrypt*/

wc_RabbitSetKey(&dec, key, iv);

wc_RabbitProcess(&dec, plain, cipher, sizeof(cipher));

plain には、暗号文から復号された元の平文が含まれます。

HC-128

現在使用されている別のストリーム暗号は HC-128 で、RABBIT よりも高速です( ARC4

より約5倍高速)。 wolfCrypt で使用するには、ヘッダー "wolfssl / wolfcrypt / hc128.h"を

含めてください。 HC-128 は 16 バイトのキー( 128 ビット)も使用しますが、RABBIT

とは異なり 16 バイトの IV(128ビット)を使用します。

Page 122: wolfSSL ユーザ・マニュアル...Visual Sturdio によるビルドについては、” wolfSSL with Visual Studio” により詳細な説 明があります。 VS2008:Visual

118 © 2004 - 2019 wolfSSL, Inc.

HC128 enc;

HC128 dec;

const byte key[] = { /*some key 16 bytes*/};

const byte iv[] = { /*some iv 16 bytes*/ };

byte plain[37]; /*no size restriction, fill with data*/

byte cipher[37];

/*encrypt*/

wc_Hc128_SetKey(&enc, key, iv); /*iv can be a NULL pointer*/

wc_Hc128_Process(&enc, cipher, plain, sizeof(plain));

cipherには、暗号文が含まれています。

/*decrypt*/

wc_Hc128_SetKey(&dec, key, iv);

wc_Hc128_Process(&dec, plain, cipher, sizeof(cipher));

plain には、暗号文から復号された元の平文が含まれます。

ChaCha

20ラウンドの ChaCha は、高いレベルのセキュリティを維持しながら、ARC4 よりわずか

に高速です。 wolfCrypt で使用するには、ヘッダー "wolfssl / wolfcrypt / chacha.h"を含め

てください。 ChaCha は、通常 32 バイトのキー( 256 ビット)を使用しますが、16 バイ

トのキー( 128 ビット)も使用できます。

CHACHA enc;

CHACHA dec;

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];

/*encrypt*/

wc_Chacha_SetKey(&enc, key, keySz);

wc_Chacha_SetIV(&enc, iv, counter); /*counter is the start block

counter is usually set as 0*/

wc_Chacha_Process(&enc, cipher, plain, sizeof(plain));

cipherには、暗号文が含まれています。

/*decrypt*/

wc_Chacha_SetKey(&enc, key, keySz);

Page 123: wolfSSL ユーザ・マニュアル...Visual Sturdio によるビルドについては、” wolfSSL with Visual Studio” により詳細な説 明があります。 VS2008:Visual

119 © 2004 - 2019 wolfSSL, Inc.

wc_Chacha_SetIV(&enc, iv, counter);

wc_Chacha_Process(&enc, plain, cipher, sizeof(cipher));

plain には、暗号文から復号された元の平文が含まれます。

Chacha_SetKey は1回だけ設定する必要がありますが、Chacha_SetIV を送信する情報の

各パケットについては、新しい iv(nonce)で呼び出す必要があります。カウンタは、暗号

化/復号化プロセスを実行するときに別のブロックから開始することによって情報の部分的

な復号化/暗号化を可能にするための引数として設定されますが、ほとんどの場合0に設定さ

れます。

ChaCha は、Mac アルゴリズム(例:Poly1305、hmac)なしでは使用しないでくださ

い。

公開鍵暗号

RSA

wolfCrypt はヘッダー "wolfssl / wolfcrypt / rsa.h"を介してRSAをサポートしています。 公

開鍵と秘密鍵の2種類の RSA 鍵があります。 公開鍵は、秘密鍵の所有者だけが解読できる

暗号文を作成できるようにします。 また、秘密鍵所有者は何かに署名することができ、公

開鍵を持つ誰もが実際にそれを署名したことを検証することができます。 使用方法は通常

次のようになります。

RsaKey rsaPublicKey;

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*/

wc_RsaPublicKeyDecode(publicKeyBuffer, &idx, &rsaPublicKey,

sizeof(publicKeyBuffer));

byte in[] = { /*plain text to encrypt*/ };

byte out[128];

RNG rng;

wc_InitRng(&rng);

word32 outLen = wc_RsaPublicEncrypt(in, sizeof(in), out, sizeof(out),

&rsaPublicKey, &rng);

Page 124: wolfSSL ユーザ・マニュアル...Visual Sturdio によるビルドについては、” wolfSSL with Visual Studio” により詳細な説 明があります。 VS2008:Visual

120 © 2004 - 2019 wolfSSL, Inc.

'out' には、平文 'in' から暗号文を保持します。 wc_RsaPublicEncrypt() はバイト単位の長

さをバイトに返し、エラーが発生した場合は負の数を返します。 wc_RsaPublicEncrypt()

は、暗号化装置が使用するパディング用の RNG( Random Number Generator )を必要

とし、使用前に初期化する必要があります。 出力バッファが十分に大きいことを確認する

ために、最初に wc_RsaEncryptSize() を呼び出すことができます。これは、

wc_RsaPublicEnrypt() への呼び出しが成功するバイト数を返します。

エラーが発生した場合、wc_RsaPublicEnrypt() または wc_RsaPublicKeyDecode() からの

負の戻り値は、wc_ErrorString() を呼び出して発生したエラーを説明する文字列を取得で

きます。

void wc_ErrorString(int error, char* buffer);

バッファが MAX_ERROR_SZ バイト(80)以上であることを確認してください。

復号化して取り出します:

RsaKey rsaPrivateKey;

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*/

wc_RsaPrivateKeyDecode(privateKeyBuffer, &idx, &rsaPrivateKey,

sizeof(privateKeyBuffer));

byte plain[128];

word32 plainSz = wc_RsaPrivateDecrypt(out, outLen, plain,

sizeof(plain), &rsaPrivateKey);

plain は plainSz バイトまたはエラー・コードを保持します。 wolfCrypt の各タイプの完全

な例については、wolfcrypt / test / test.c を参照してください。 wc_RsaPrivateKeyDecode

関数は、生 DER 形式のキーのみを受け入れることに注意してください。

DH(ディフィー・ヘルマン)

wolfCrypt は、ヘッダー "wolfssl / wolfrypt / dh.h" を介して ディフィー・ヘルマンのサポ

ートを提供します。 ディフィー・ヘルマン 鍵交換アルゴリズムは、2つの当事者が共有秘

密鍵を確立することを可能にします。 使用法は通常、sideA とsideB が2つのパーティを指

Page 125: wolfSSL ユーザ・マニュアル...Visual Sturdio によるビルドについては、” wolfSSL with Visual Studio” により詳細な説 明があります。 VS2008:Visual

121 © 2004 - 2019 wolfSSL, Inc.

定する次の例と似ています。

次の例では、dhPublicKey には、認証局(または自己署名)によって署名されたディフィ

ー・ヘルマン・パブリックパラメータが含まれています。 privA は生成された sideA の秘

密鍵を保持し、pubA は生成された sideA の公開鍵を保持し、agreA は両者が合意した相互

鍵を保持します。

DhKey dhPublicKey;

word32 idx = 0; /*where to start reading into the

publicKeyBuffer*/

word32 pubASz, pubBSz, agreeASz;

byte tmp[1024];

RNG rng;

byte privA[128];

byte pubA[128];

byte agreeA[128];

wc_InitDhKey(&dhPublicKey);

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() は、dhPublicKey の初期パブリックパラメータに基づいてパブ

リックおよびプライベートDHキーを生成します。

wc_DhGenerateKeyPair(&dhPublicKey, &rng, privA, &privASz,

pubA, &pubASz);

sideB が sideA に公開鍵( pub )を送信した後、sideA は wc_DhAgree() 関数を使用して

相互に合意された鍵( agreeA )を生成できます。

agreA は sideA の相互に生成された鍵(サイズは equivalentASz バイトです)を保持しま

す。 同じプロセスが sideB で行われます。

wolfCrypt のディフィー・ヘルマンの完全な例については、wolfcrypt / test / test.cファイ

ルを参照してください。

EDH(Ephemeral ディフィー・ヘルマン)

Page 126: wolfSSL ユーザ・マニュアル...Visual Sturdio によるビルドについては、” wolfSSL with Visual Studio” により詳細な説 明があります。 VS2008:Visual

122 © 2004 - 2019 wolfSSL, Inc.

wolfSSLサーバーは Ephemeral ディフィー・ヘルマンを実行できます。 この機能を追加す

るには、変更を加える必要はありませんが、EDH暗号スイートを有効にするには、アプリ

ケーションでサーバー側の一時的なグループパラメータを登録する必要があります。

新しいAPIを使用してこれを行うことができます:

int wolfSSL_SetTmpDH(WOLFSSL* ssl, unsigned char* p,

int pSz,unsigned char* g,int gSz);

サンプルサーバーとechoserver はこの関数を SetDH() から使用しています。

DSA(デジタル署名アルゴリズム)

wolfCrypt はヘッダー "wolfssl / wolfcrypt / dsa.h"を介して DSA と DSS のサポートを提供

します。 DSA では、特定のデータハッシュに基づいてデジタル署名を作成することができ

ます。 DSA は SHA ハッシュアルゴリズムを使用してデータブロックのハッシュを生成

し、署名者の秘密鍵を使用してそのハッシュに署名します。 一般的な使用法は次のように

なります。

最初に DSA 鍵構造(鍵)を宣言し、署名する初期メッセージ(メッセージ)を初期化し、

DSA 鍵バッファ( dsaKeyBuffer )を初期化します。

DsaKey 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(回答)を宣言します。

Sha sha;

RNG rng;

byte hash[SHA_DIGEST_SIZE];

byte signature[40];

word32 idx = 0;

int answer;

SHA ハッシュを設定して作成します。 wolfCrypt の SHA アルゴリズムの詳細について

は、第 10.1.3 項 を参照してください。 変数 "hash" には、 "message" の SHAハッシュが

Page 127: wolfSSL ユーザ・マニュアル...Visual Sturdio によるビルドについては、” wolfSSL with Visual Studio” により詳細な説 明があります。 VS2008:Visual

123 © 2004 - 2019 wolfSSL, Inc.

格納されます。

wc_InitSha(&sha);

wc_ShaUpdate(&sha, message, sizeof(message));

wc_ShaFinal(&sha, hash);

DSA 鍵構造体を初期化し、構造体の鍵値を取り込み、乱数ジェネレータ(rng)を初期化

します。

wc_InitDsaKey(&key);

wc_DsaPrivateKeyDecode(dsaKeyBuffer, &idx, &key,

sizeof(dsaKeyBuffer));

wc_InitRng(&rng);

wc_DsaSign() 関数は、DSA 秘密鍵、ハッシュ値、および乱数ジェネレータを使用して署

名(署名)を作成します。

wc_DsaSign(hash, signature, &key, &rng);

署名を検証するには、wc_DsaVerify() を使用します。 検証が成功すると、答えは「1」に

等しくなります。 終了後、wc_FreeDsaKey() を使用してDSAキー構造を解放します。

Page 128: wolfSSL ユーザ・マニュアル...Visual Sturdio によるビルドについては、” wolfSSL with Visual Studio” により詳細な説 明があります。 VS2008:Visual

124 © 2004 - 2019 wolfSSL, Inc.

SSLチュートリアル

はじめに

wolfSSL (旧CyaSSL)組み込み SSL ライブラリは、既存のアプリケーションやデバイス

に簡単に組み込みことが出来、SSL や TLS を追加することで通信セキュリティを強化する

ことが出来ます。wolfSSL は、組み込み及び RTOS 環境をターゲットにしており、優れた

パフォーマンスを維持しながら最小のフットプリントを提供します。選択されたビルド・

オプションと使用されるプラットフォームによっては、wolfSSL の最小ビルドサイズは、

20~ 100kB です。

このチュートリアルの目的は、SSL と TLS を簡単なアプリケーションに統合することで

す。さらに、このチュートリアルを進めるプロセスを通して、また、SSLの一般的な理解

に繋げることを期待しています。このチュートリアルでは、アプリケーションに SSL サポ

ートを追加する一般的な手順を実証しながら、単純さをなるべく維持する為に、wolfSSL

を利用し簡単な echoserver と echoclient の例を使用します。 echoclient と echoserver の

例は、Richard Stevens, Bill Fenner, Andrew Rudoff の “Unix Network Programming ,

Volume 1, 3rd Edition” という人気のある書籍から引用しています。

このチュートリアルでは、読者が GNU GCC コンパイラを使用して C コードを編集してコ

ンパイルするのに慣れていることと、公開鍵の暗号化の概念に精通していることを前提と

しています。このチュートリアルでは、 Unix Network Programming の書籍にアクセスす

る必要はありません。

このチュートリアルで使用する例:

echoclient – 図 5.4, Page 124

echoserver – 図 5.12, Page 139

Unix Network Programming Volume 1, 3rd Edition

www.unpbook.com

Page 129: wolfSSL ユーザ・マニュアル...Visual Sturdio によるビルドについては、” wolfSSL with Visual Studio” により詳細な説 明があります。 VS2008:Visual

125 © 2004 - 2019 wolfSSL, Inc.

SSL/TLSの概要

TLS ( Tlansport Layer Security ) と 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 、ブルートゥースなどの多くのトランスポート媒体が存

在します。アプリケーション層は、SSL / TLS の上部に階層化され、HTTP、FTP、SMTP

などのプロトコルが含まれます。SSL が、OSI モデルにどのように適合するか、また、

SSL ハンドシェイク・プロセスの概略図は、Appendix A を参照ください。

ソースコードの取得

このチュートリアルで使用されるすべてのソースコードは、wolfSSL の Web サイト、下記

にしますリンクからダウンロードすることが出来ます。

http://www.wolfssl.com/documentation/ssl-tutorial-2.3.zip

ダウンロード先には、このチュートリアルで使用した echoserver と echoclient の両方につ

いて、元のソースコードと完成したソースコードの両方が含まれます。具体的な内容はリ

ンクの下に記述します。

/finished_src

/echoclient (Completed echoclient code)

/echoserver (Completed echoserver code)

/include (Modified unp.h)

/lib (Library functions)

/original_src

/echoclient (Starting echoclient code)

/echoserver (Starting echoserver code)

/include (Modified unp.h)

/lib (Library functions)

Page 130: wolfSSL ユーザ・マニュアル...Visual Sturdio によるビルドについては、” wolfSSL with Visual Studio” により詳細な説 明があります。 VS2008:Visual

126 © 2004 - 2019 wolfSSL, Inc.

README

基本となるサンプルの修正

このチュートリアルとそれに伴うソースコードは、プラットフォーム間でできるだけ移植

性が高くなるように設計されています。アプリケーションに SSL と TLS を追加する方法

に焦点を当てるため、基本例はできるだけ単純化しています。不必要な複雑さを取り除く

か、サポートされるプラットフォームの範囲を広げるために、Unix Network

Programming からいくつかの変更が加えられています。このチュートリアルの移植性を高

めるための提案がある場合は、[email protected] までお知らせください。

上記の本の echoserver と echoclient のに加えられた変更を次に列挙します。

echoserver(tcpserv04.c) の修正

⚫ Windowsで Fork() 関数がサポートされていないため、Fork() 関数は削除されまし

た。この変更により、echoserver は、同時に一つのクライアントのみ受け付け可能

です。また、シグナル処理も削除されました。

⚫ 接続したクライアントのアドレスとポートを表示する printf 文が追加されていま

す。

printf("Connection from %s, port %d\n",

inet_ntop(AF_INET, &cliaddr.sin_addr, buff, sizeof(buff)),

ntohs(cliaddr.sin_port));

⚫ リスニング用の socket 作成後、”Address already in use” バインドエラーを回避す

るために、setsocktopt() 関数呼び出しを追加しました。

⚫ 新しコンパイラの警告に対応するためにマイナーな調整

echoclient(tcpcli01.c) の修正

⚫ str_cli()関数を tcpcli01.c ファイルから str_cli.c ファイルへ移動

⚫ 新しコンパイラの警告に対応するためにマイナーな調整

Page 131: wolfSSL ユーザ・マニュアル...Visual Sturdio によるビルドについては、” wolfSSL with Visual Studio” により詳細な説 明があります。 VS2008:Visual

127 © 2004 - 2019 wolfSSL, Inc.

unp.h ヘッダーの修正

⚫ この例で必要なものだけを含むように簡素化されました。

これらのソースコードの例は、特定の関数が大文字になります。例えば、Fputs() 及び

Writen() などです。 Unix Network Programming の著者は、エラーチェックをきれいに

処理するために、通常の関数用のカスタムラッパー関数を作成しています。これについて

の詳しい説明は、Unix Network Programming の 第1.4 節(11ページ)を参照してくださ

い。

wolfSSLのビルドとインストール

開始する前に、上記の11.3節ソースコードの取得で示したサンプル・コード(echosever と

echoclient)をダウンロードしてください。この節では、システムにwolfSSL 組み込み

SSL ライブラリをダウンロード、設定、及びインストールする方法について説明します。

wolfSSL の最新のバージョンの wolfSSL をダウンロード・ページからダウンロードしてイ

ンストールする必要があります。

使用可能なビルド・オプションの一覧については、wolfSSL のビルドガイドを参照してく

ださい。wolfSSL は、移植性を念頭に置いて書かれており、一般的にほとんどのシステム

で簡単に構築できます。 wolfSSL の構築が困難な場合、wolfSSL 製品フォーラムでサポー

トを依頼してください。

Linux、*BSD、OS X、Solaris、又は他の *nix のようなシステムで wolfSSL をビルドする

ときは、autoconf システムを使用できます。Windows 固有の手順については、2.3 節

Windows 上でのビルドを参照してください。wolfSSL を設定および構築するには、端末か

ら次の2つのコマンドを実行します。任意のビルド・オプションを ./configure に追加する

こともできます。(例: ./configure –enable-opensslextra)。

./configure make

wolfSSL をインストールします:

Page 132: wolfSSL ユーザ・マニュアル...Visual Sturdio によるビルドについては、” wolfSSL with Visual Studio” により詳細な説 明があります。 VS2008:Visual

128 © 2004 - 2019 wolfSSL, Inc.

sudo make install

これにより、/usr/local/include/wolfSSL にヘッダーファイルが、/usr/local/bin に wolfSSL

ライブラリがインストールされます。ビルドをテストするには、testsuite アプリケーショ

ンを wolfSSL のルートディレクトリから実行します。

./testsuite/testsuite.test

wolfCrypt と wolfSSL が正しくインストールされていることを確認するために一連のテス

トが実行されます。テストスイート・アプリケーションが正常に実行されると、次のよう

な出力が表示されます。

error test passed!

base64 test passed!

asn 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-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!

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!

ECC test passed!

logging test passed!

mutex test passed!

memcb test passed!

SSL version is TLSv1.2

SSL cipher suite is TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384

SSL curve name is SECP256R1

Page 133: wolfSSL ユーザ・マニュアル...Visual Sturdio によるビルドについては、” wolfSSL with Visual Studio” により詳細な説 明があります。 VS2008:Visual

129 © 2004 - 2019 wolfSSL, Inc.

SSL version is TLSv1.2

SSL cipher suite is TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384

SSL curve name is SECP256R1

Client message: hello wolfssl!

I hear you fa shizzle!

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

33bc1a4570f4f1abccd5c48aace529b01a42ab51293954a297796e90d20970f0

input

33bc1a4570f4f1abccd5c48aace529b01a42ab51293954a297796e90d20970f0

/tmp/output-69BRrZ

wolfSSL がインストールされたので、サンプル・コードを変更して SSL 機能を追加するこ

とができます。最初に、echoclient に SSL を追加し、その後、echoserver へ移行します。

最初のコンパイル

サンプルとしてバンドルされた echoclient と echoserver をコンパイルするのに Makefile

を使用できます。ディレクトリーを cd で、echoclient 又は echoserver に変更し、次のコ

マンドを実行します。

make

これは、サンプル・コードをコンパイルし、どちらがビルドされているかに応じて

echoserver または echoclient のいずれかの実行可能ファイルを作成します。Makefile で使

用されている GCC コマンドを以下に示します。提供された Makefile を使用せずにサンプ

ルをビルドする場合は、ディレクトリーを example ディレクトリーに変更し、次のコマン

ドの tcpcli01.c(echoclient) 又は、tcpserv04.c (echoserver) を、正しいソースファイルで置

き換えてください。

gcc -o echoserver ../lib/*.c tcpserv04.c -I ../include

Page 134: wolfSSL ユーザ・マニュアル...Visual Sturdio によるビルドについては、” wolfSSL with Visual Studio” により詳細な説 明があります。 VS2008:Visual

130 © 2004 - 2019 wolfSSL, Inc.

現在のサンプルを実行可能ファイルにコンパイルし、“echoserver” または、”echocient”

アプリケーションを作成します。コンパイル後のサンプルを実行するには、現在のディレ

クトリーを目的のサンプルディレクトリへ変更し、アプリケーションを起動します。例え

ば、echoserver を実行するには次のようにタイプします。

./echoserver

ローカルホスト上の echoclient をテストするために2番目の端末ウインドウを開きます。ア

プリケーション起動時にサーバーのIPアドレスを指定する必要があります。この場合、

127.0.0.1 になります。現在のディレクトリーを”echoclient” ディレクトリーに変更し、次

のコマンドを実行します。echoserver は、既に実行されている必要があります。

./echoclient 127.0.0.1

echoserver と echoclient の両方が動作したら、echoserver は、echoclient から受け取った

入力をエコーバック(オウム返し)します。echoserver 又は echoclient を終了するには、

[ Ctrl + C ] を押してアプリケーションを終了します。現在のところ、これらの2つの例の間

の送信データは明瞭な平文です。クラインとサーバー間に手を加えることでやり取りを見

ることができます。

ライブラリ

wolfSSL ライブラリは、一度コンパイルされると libwolfssl という名前になり、特に設定

されない限り wolfSSL のビルドとインストールのプロセスで次のディレクトリーの下に共

有ライブラリのみが作成されます。適切なビルド・オプションを使用して、共有ライブラ

リと静的ライブラリの両方を有効または無効にできます。

/usr/local/lib

必要な最初のステップは、wolfSSL ライブラリをサンプルアプリケーションとリンクする

ことです。GCC コマンドを変更すると(例として echoserver を使用)、次の新しいコマ

ンドが得られます。 wolfSSL は、ヘッダーファイルとライブラリを標準的な場所にインス

トールするので、コンパイラは(-l か -L を使って)明示的な指定なしでライブラリを見つ

けることができるはずです。-lwolfssl を使用すると、コンパイラは自動的に必要なライブ

Page 135: wolfSSL ユーザ・マニュアル...Visual Sturdio によるビルドについては、” wolfSSL with Visual Studio” により詳細な説 明があります。 VS2008:Visual

131 © 2004 - 2019 wolfSSL, Inc.

ラリ(静的または共有ライブラリ)を選択します。

gcc -o echoserver ../lib/*.c tcpserv04.c -I ../include -lm -lwolfssl

ヘッダー

最初に必要なことは、クライアントとサーバーの両方に wolfSSL ネイティブAPIヘッダー

を含めることです。クライアント用の tcpcli01.c ファイルとサーバー用の tcpserv04.c で、

先頭近くに次の行を追加します。

#include <wolfssl/ssl.h>

スタートアップとシャットダウン

コード内で wolfSSL を使用する前に、ライブラリと WOLFSSL_CTX を初期化する必要が

あります。wolfSSL は、wolfSSL_Init() を呼び出すことによって初期化されます。ライブ

ラリを使用して何かをする前に必ず行う必要があります。

WOLFSSL_CTX構造体(wolfSSLコンテキスト)には、証明書情報を含む各 SSL 接続の

グローバル値が含まれています。単一の WOLFSS_CTX は、作成された WOLFSSL オブ

ジェクトをいくつでも使用できます。これにより、信頼できる CA 証明書の一覧など、特

定の情報を一回だけ読み込むことができます。

新し WOLFSSL_CTX を作成するには、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 をサポートしています。これらのプロトコルはそれぞれ wolfSSL_CTX_new() へ

の引数として使用できる対応する関数を持っています。可能なクライアントとサーバーの

プロトコルオプションを以下に示します。SSL 2.0 は、数年前から安全性に問題があるため

に wolfSSL ではサポートしていません。

EchoClient:

wolfSSLv3_client_method(); // SSL 3.0

wolfTLSv1_client_method(); // TLS 1.0

Page 136: wolfSSL ユーザ・マニュアル...Visual Sturdio によるビルドについては、” wolfSSL with Visual Studio” により詳細な説 明があります。 VS2008:Visual

132 © 2004 - 2019 wolfSSL, Inc.

wolfTLSv1_1_client_method(); // TLS 1.1

wolfTLSv1_2_client_method(); // TLS 1.2

wolfTLSv1_3_client_method(); // TLS 1.3

wolfSSLv23_client_method(); // Use highest version possible from

// SSLv3 - TLS 1.2

wolfDTLSv1_client_method(); // DTLS 1.0

wolfDTLSv1_2_client_method(); // DTLS 1.2

EchoServer:

wolfSSLv3_server_method(); // SSLv3

wolfTLSv1_server_method(); // TLSv1

wolfTLSv1_1_server_method(); // TLSv1.1

wolfTLSv1_2_server_method(); // TLSv1.2

wolfTLSv1_3_server_method(); // TLSv1.3

wolfSSLv23_server_method(); // Allow clients to connect with

// TLSv1+

wolfDTLSv1_server_method(); // DTLS

wolfDTLSv1_2_server_method(); // DTLS 1.2

echoclient が ecoserver に接続したときにサーバーの身元を確認できるように、CA(認証

局)証明書を WOLFSSL_CTX にロードする必要があります。CA証明書を

WOLFSSL_CTX にロードするには、wolfSSL_CTX_load_verify_locations() を使用してく

ださい。この関数には、WOLFSSL_CTXポインタ、証明書ファイル、及びパスの値の3つ

の引数が必要です。パス値は、PEM形式のCA証明書を含むディレクトリーを指定します。

証明書を調べるとき、wolfSSL は指定のパスを調べる前に証明書ファイルの値を調べま

す。この場合、CAファイルを1つ指定するので証明書パスを指定する必要はありません。

そのため、path 引数には値 0 を使用します。 wolfSSL_CTX_load_verify_locations 関数

は、SSL_SUCCESS 又は SSL_FAILURE を返します。

wolfSSL_CTX_load_verify_locations(WOLFSSL_CTX* ctx, const char* file, const char* path)

これらをまとめると(ライブラリの初期化、プロトコルの選択、および CA 証明書)、次

のようになります。ここでは、TLS 1.2 を使用することを選択しました。

EchoClient:

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);

Page 137: wolfSSL ユーザ・マニュアル...Visual Sturdio によるビルドについては、” wolfSSL with Visual Studio” により詳細な説 明があります。 VS2008:Visual

133 © 2004 - 2019 wolfSSL, Inc.

}

/* 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);

}

EchoServer:

証明書をWOLFSSL_CTXにロードするときは、CA証明書に加えてサーバー証明書と鍵フ

ァイルもロードする必要があります。 これにより、サーバーは識別確認のために証明書を

クライアントに送信できます。

WOLFSSL_CTX* ctx;

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);

}

/* 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 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);

}

Page 138: wolfSSL ユーザ・マニュアル...Visual Sturdio によるビルドについては、” wolfSSL with Visual Studio” により詳細な説 明があります。 VS2008:Visual

134 © 2004 - 2019 wolfSSL, Inc.

上記のコードは、変数の定義と、ユーザーが IP アドレス(client)でクライアントを起動

したことの確認の両方を行った後、tcpcli01.c と tcpserv04.c の先頭に追加する必要があり

ます。 完成したコードのバージョンは、参考のために SSL チュートリアルの ZIP ファイ

ルに含まれています。

wolfSSL と WOLFSSL_CTX が初期化されました。また、アプリケーションが SSL / TLS

の使用後に WOLFSSL_CTX オブジェクトと wolfSSL ライブラリが解放されていることを

確認してください。 クライアントとサーバーの両方で、次の 2 行を main() 関数の末尾

( exit() の呼び出しの直前のクライアント内)に配置する必要があります。

wolfSSL_CTX_free(ctx);

wolfSSL_Cleanup();

wolfSSL オブジェクト

EchoClient

各 TCP Connect の後にWOLFSSLオブジェクトを作成し、ソケットファイル記述子をセッ

ションに関連付ける必要があります。 echoclient の例では、以下に示すように Connect()

を呼び出した後にこれを行います。

/* Connect to socket file descriptor */

Connect(sockfd, (SA *) &servaddr, sizeof(servaddr));

接続した直後に、wolfSSL_new() 関数を使用して新しいWOLFSSL オブジェクトを作成し

てください。 この関数は、成功した場合は WOLFSSL オブジェクトへのポインタを返し、

失敗した場合は NULL を返します。 その後、ソケットファイル記述子( sockfd )を新し

いWOLFSSL オブジェクト( ssl )に関連付けることができます。

/* 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);

Page 139: wolfSSL ユーザ・マニュアル...Visual Sturdio によるビルドについては、” wolfSSL with Visual Studio” により詳細な説 明があります。 VS2008:Visual

135 © 2004 - 2019 wolfSSL, Inc.

ここで気をつけなければならないことは、wolfSSL_connect() 関数を呼び出していないこと

です。 wolfSSL_connect() はサーバーとの SSL / TLS ハンドシェイクを開始します。以前

に呼び出されたことがなければ、wolfSSL_read() の関数内で呼び出されます。 今回の場合

は、最初のwolfSSL_read() に代わってwolfSSL_connect() を明示的に呼び出さないでくだ

さい。

EchoServer

main メソッドの for ループの最後に、WOLFSSL オブジェクトを挿入し、クライアントと

同様にソケットファイル記述子(connfd)をWOLFSSL オブジェクト(ssl)に関連付けま

す。

/* Create WOLFSSL object */

WOLFSSL* ssl;

if ( (ssl = wolfSSL_new(ctx)) == NULL) {

fprintf(stderr, "wolfSSL_new error.\n");

exit(EXIT_FAILURE);

}

wolfSSL_set_fd(ssl, connfd);

各TCP Connectの後にWOLFSSLオブジェクトを作成し、ソケットファイル記述子をセッ

ションに関連付ける必要があります。

wolfSSL_new() 関数を使って新しい WOLFSSL オブジェクトを作成します。 この関数

は、成功した場合は WOLFSSL オブジェクトへのポインタを返し、失敗した場合は NULL

を返します。 その後、ソケットファイル記述子( sockfd )を新しい WOLFSSL オブジェ

クト(ssl)に関連付けることができます。

/* 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);

Page 140: wolfSSL ユーザ・マニュアル...Visual Sturdio によるビルドについては、” wolfSSL with Visual Studio” により詳細な説 明があります。 VS2008:Visual

136 © 2004 - 2019 wolfSSL, Inc.

データの送受信

EchoClient

次のステップはデータを安全に送ることです。echoclientの例では、main() 関数が送受信

を str_cli() に渡すことに注意してください。 str_cli() 関数は、関数の置き換えが行われる

場所です。 まずstr_cli() 関数で WOLFSSL オブジェクトにアクセスする必要があるので、

別の引数を追加してssl変数をstr_cli() に渡します。 WOLFSSL オブジェクトは str_cli() 関

数内で使用されるようになったため、sockfd パラメータを削除しました。 この変更後の新

しいstr_cli() 関数シグネチャを以下に示します。

void str_cli(FILE *fp, WOLFSSL* ssl)

main() 関数内で新しい引数( ssl )が str_cli() に引き渡されます。

str_cli(stdin, ssl);

str_cli() 関数内では、Writen() と Readline() が wolfSSL_write() と wolfSSL_read() 関数

の呼び出しに置き換えられ、WOLFSSLオブジェクト( ssl )が元のファイル記述子

( sockfd )の代わりに使用されます。 新しい str_cli() 関数を以下に示します。

wolfSSL_write と wolfSSL_read の呼び出しが成功したかどうかを確認する必要があるこ

とに注意してください。

Unix Programming 本の著者は Writen() 関数にエラーチェックを行っています。私たちは

置き換えた後、そのエラーチェックを補う必要があります。wolfSSL_read の戻り値を監視

するために新しい int 変数 "n" を追加し、バッファの内容 recvline を出力する前に、読み

取りデータの最後には '\ 0'の印が付けられます。

void

str_cli(FILE *fp, WOLFSSL* ssl)

{

char sendline[MAXLINE], recvline[MAXLINE];

int n = 0;

while (Fgets(sendline, MAXLINE, fp) != NULL) {

Page 141: wolfSSL ユーザ・マニュアル...Visual Sturdio によるビルドについては、” wolfSSL with Visual Studio” により詳細な説 明があります。 VS2008:Visual

137 © 2004 - 2019 wolfSSL, Inc.

if(wolfSSL_write(ssl, sendline, strlen(sendline)) !=

strlen(sendline)){

err_sys("wolfSSL_write failed");

}

if ((n = wolfSSL_read(ssl, recvline, MAXLINE)) <= 0)

err_quit("wolfSSL_read error");

recvline[n] = '\0';

Fputs(recvline, stdout);

}

}

最後に、WOLFSSL オブジェクトを使い終わったら解放します。 main() 関数で、

WOLFSSL_CTX を解放する行の直前で wolfSSL_free() を呼び出します。

EchoServer

echoserver は、読み書きを処理するために str_echo() を呼び出します(クライアントは

str_cli() を呼び出しました)。 クライアントと同様に、関数シグネチャで sockfd パラメー

タを WOLFSSLオブジェクト( ssl )パラメータに置き換えて、str_echo() を変更します。

void str_echo(WOLFSSL* ssl)

Read() と Writen() の呼び出しを、wolfSSL_read() と wolfSSL_write() 関数の呼び出しに

置き換えます。 戻り値のエラーチェックを含む、変更された str_echo() 関数を以下に示し

ます。 read() から wolfSSL_read() への変更に対応するために、変数 “ n” の型が ssize_t か

ら int に変更されています。

void

str_echo(WOLFSSL* ssl)

{

int n;

char buf[MAXLINE];

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));

else if( n == 0 )

Page 142: wolfSSL ユーザ・マニュアル...Visual Sturdio によるビルドについては、” wolfSSL with Visual Studio” により詳細な説 明があります。 VS2008:Visual

138 © 2004 - 2019 wolfSSL, Inc.

printf("The peer has closed the connection.\n");

}

main() で for ループの終わりに str_echo() 関数を呼び出します。 この関数の後、ループ内

で、WOLFSSL オブジェクトを解放してconnfd ソケットを閉じるための呼び出しを行いま

す。

str_echo(ssl); /* process the request */

wolfSSL_free(ssl); /* Free WOLFSSL object */

Close(connfd);

exit () を呼び出す前に、ctx の解放と cleanup を行います。

シグナル処理

Echoclient / Echoserver

echoclient と echoserver では、ユーザーが「Ctrl + C」を使用してアプリを閉じるときの

シグナルハンドラを追加する必要があります。 echoserver は継続的にループしています。

このため、ユーザーが「Ctrl + C」を押したときにそのループを中断する方法を提供する必

要があります。 必要なことは、ループを while 変数に変更することです。これは、終了変

数( cleanup )が true に設定されたときに終了します。

まず、#include 文の直後の tcpserv04.c の先頭に、cleanup という新しい静的 int 型変数

を定義します。

static int cleanup; /* To handle shutdown */

echoserver のループを for ループから while ループへ変更します。

while(cleanup != 1)

{

/* echo server code here */

}

echoserver については、ハンドラーが終了した後にシグナルが処理される前に実行されて

Page 143: wolfSSL ユーザ・マニュアル...Visual Sturdio によるビルドについては、” wolfSSL with Visual Studio” により詳細な説 明があります。 VS2008:Visual

139 © 2004 - 2019 wolfSSL, Inc.

いた呼び出しをオペレーティング・システムが再開できないようにする必要があります。

これらを無効にすることで、シグナルが処理された後、オペレーティング・システムは

accept() の呼び出しを再開しません。 そうしなかった場合、echoserver がリソースをクリ

ーンアップして終了する前に、別のクライアントが接続および切断するのを待つ必要があ

ります。 シグナルハンドラを定義して SA_RESTART をオフにするには、まず echoserver

のmain() 関数で act および oact 構造体を定義します。

struct sigaction act, oact;

メイン関数の wolfSSL_Init() を呼び出す前に、変数宣言の後に次のコードを挿入します。

/* Signal handling code */

struct sigaction act, oact; /* Declare the sigaction structs */

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 *

* flag of 0 */

sigaction(SIGINT, &act, &oact); /* Tells the program to use (o)act *

* on a signal or interrupt */

echoserver の sig_handler 関数を以下に示します。

void sig_handler(const int sig)

{

printf("\nSIGINT handled.\n");

cleanup = 1;

return;

}

これで全てです。echoclient と echoserver は、TLS 1.2 で接続可能となりました。

ここまで行ってきたことをまとめると:

⚫ wolfSSL ヘッダーをインクルードする

⚫ wolfSSL を初期化する

⚫ 使用したいプロトコルを選択した WOLFSSL_CTX 構造体を作成する

⚫ データの送受信のために、WOLFSSL オブジェクトを作成する

⚫ Writen() と Readine() 関数を wolfSSL_write() と wolfSSL_read() に置き換える

⚫ WOLFSSL 及び WOLFSSL_CTX を解放する

⚫ シグナル処理が client と server で的確に行われていることを確認する

となります。

Page 144: wolfSSL ユーザ・マニュアル...Visual Sturdio によるビルドについては、” wolfSSL with Visual Studio” により詳細な説 明があります。 VS2008:Visual

140 © 2004 - 2019 wolfSSL, Inc.

SSL 接続の動作を設定および制御するためにより多くの側面と方法があります。より詳細

な情報については、他の wolfSSL のリソース及びドキュメントを含め参照ください。

証明書

テスト目的で、wolfSSL によって提供された証明書を使用することができます。 これらは

wolfSSL ダウンロードにあります、そして特にこのチュートリアルのために、それらは

finished_src フォルダーにあります。

実際のアプリケーションの場合は、信頼できる認証局から正しい正当な証明書を入手して

ください。

まとめ

このチュートリアルでは、wolfSSL 組み込み SSL ライブラリを単純なクライアントおよび

サーバ・アプリケーションに統合するプロセスを説明しました。 この例は単純ですが、

SSL または TLS を自分のアプリケーションに追加するために同じ原則を適用することがで

きます。 wolfSSL 組み込み SSL ライブラリは、サイズと速度の両方に最適化されたコンパ

クトで効率的なパッケージで必要となるすべての機能を提供します。

GPLv2 と標準の商用ライセンスの下でデュアルライセンスされているので、私たちのウェ

ブサイトから直接 wolfSSL ソースコードをダウンロードすることができます。 ご質問やご

意見がございましたら、サポートフォーラム(www.wolfssl.com/forums)にお気軽に投稿

してください。 私たちの製品についてのより多くの情報については、[email protected] へ日

本語で連絡してください。

この SSL チュートリアルについてのフィードバックをお待ちしています。 もっと有用にす

る、理解するのを容易にする、またはもっとポータブルにするなど改善案をお持ちでした

ら、是非 [email protected] まで知らせてください。

Page 145: wolfSSL ユーザ・マニュアル...Visual Sturdio によるビルドについては、” wolfSSL with Visual Studio” により詳細な説 明があります。 VS2008:Visual

141 © 2004 - 2019 wolfSSL, Inc.

Appendix これまでの TLS と TLS 1.3 の比較

TLS1.3はインターネットの標準化団体IETFが制定したインターネットセキュリティの新し

い標準です。TLS1.2が制定されてから10年がたち、その間インターネットの発展には目

覚しいものがありました。一方で、高まるセキュリティリスクの脅威や、増加する一方の

ネットワークトラフィックのために、多くの矛盾や無理を重ねているのが現状です。新し

い標準TLS1.3は、そうした課題を一掃しこれからのIoT時代のセキュリティを支える新し

い標準として期待されています。

TLS1.3 の優位性

これまでの仕様と大きく異なる点の一つとして、フルハンドシェイク時の往復回数の削減

があります。TLSの旧版のプロトコルでは、クライアントがサーバーにアプリケーショ

ン・データを送出する前に2往復を必要としていました。TLS1.3では1往復ですみます。

さらに、サーバーはクライアントに対する最初のハンドシェイク・メッセージのレスポン

スとして、アプリケーション・データを送ることも可能になりました。これはネットワー

クの遅れがあっても、安全な接続を確立するのに要する時間への影響が少なくなるという

ことです。

もう1つの違いは、TLS1.3のセッション再開です。これまでのTLSでは、クライアントはサ

ーバーがキャッシュを探すためのセッションIDを持っていました。もしマッチした場合は

同じセキュリティパラメータを使うことになりました。これは非常に単純な方法ですが、

サーバー間で状態を共有する必要がありました。TLS1.3では、これまでの TLS のチケット

システムを再活用する形で、画期的に進歩しました。ハンドシェイク完了後に、サーバー

はクライアントに対して新しいセッション・チケットを送るようにします。この、クライ

アントに対するひとかたまりのデータであるチケットは、以前のセッションIDのように鍵

を探すデータベースとして利用することができます。ただしこのデータは、前の接続に対

応する、自身で暗号化、認証された値とすることができます。つまり、サーバーは状態を

持たないという事になります。最後に、この仕様はプロトコルの安全性を証明すべく暗号

化の専門家によって評価されてきました。どんなセキュリティの証明も完全ではありえま

せんが、以前あったような再ネゴシエーション、プロトコル・バージョンのダウングレー

ディング、圧縮、CBCやパディングに対する攻撃などは改善され、プロトコルは全体的に

より強い攻撃耐性を実現しています。

Page 146: wolfSSL ユーザ・マニュアル...Visual Sturdio によるビルドについては、” wolfSSL with Visual Studio” により詳細な説 明があります。 VS2008:Visual

142 © 2004 - 2019 wolfSSL, Inc.

TLS 1.2 と TLS 1.3 の違い

TLS 1.3 では、セキュリティとスピードの向上が約束されています。しかし、TLS 1.2 から

TLS 1.3 への変更は、これらの改善をどのように実現しているのでしょうか?以下に、改善

がどのように達成されたか、TLS 1.2と1.3の相違点をあげてみます。

➢ 共通鍵暗号アルゴリズムでは、全ての古いアルゴリズムは取り除かれ、TLS1.3で

残っているアルゴリズムはすべて、AEAD(Authenticated Encryption with

Associated Data)で認証された暗号化を使用しセキュリティ強度は大幅に向上し

ます。

➢ ゼロRTT(0-RTT)モードにより、再セッション確立時間が大幅に短縮されま

す。一部のセキュリティ特性を犠牲にすることで、一部のアプリケーション・デ

ータの接続設定では往復回数を削減できるようになりました。

➢ ServerHello以後のすべてのハンドシェイク・メッセージは暗号化され、セキュリ

ティ強度が大幅に向上します。

➢ HMACベースのExtract-and-Expand Key Derivation Function(HKDF)をプリ

ミティブとして使用し、鍵導出関数が再設計されました。

➢ 余分なメッセージを取り除くよう再構成され、潜在的脆弱性が排除されました。

➢ ECCは基本仕様に入り、複数の新しい署名アルゴリズムが含まれています。楕円

曲線のポイントフォーマットネゴシエーションは、各楕円曲線の単一ポイントフ

ォーマットを使用することで削除されました。

➢ 圧縮、カスタムDHEグループ、およびDSAが削除され、RSAパディングでPSSが

使用されるようになりました。

➢ TLS 1.2のバージョンネゴシエーション検証メカニズムは、拡張機能のバージョン

リストを使用して廃止されました。

➢ セッション再開については、サーバー側の状態の有無にかかわらず旧バージョン

TLSのPSKベースの暗号スイートから、1つの新しいPSK交換方式に統一されまし

た。

wolfSSL の TLS 1.3 をコンパイルしてみる

TLS1.3を利用するには、以下のように./configureコマンドで“–enable-tls13” オプションを

指定するだけです:

$ unzip wolfssl-3.15.0.zip

Page 147: wolfSSL ユーザ・マニュアル...Visual Sturdio によるビルドについては、” wolfSSL with Visual Studio” により詳細な説 明があります。 VS2008:Visual

143 © 2004 - 2019 wolfSSL, Inc.

$ cd wolfssl-3.15.0

$ ./configure --enable-tls13

$ make

wolfSSL の TLS 1.3 を使用してみる

TLS1.3サポートを指定するために、wolfSSL コンテクスト(WOLFSSL_CTX)を生成す

る際に、新しいクライアント/サーバ・メソッドとして次のような二つのメソッドが追加さ

れました。

WOLFSSL_METHOD *wolfTLSv1_3_server_method(void); WOLFSSL_METHOD *wolfTLSv1_3_client_method(void);

wolfSSLサンプルクライアントとサーバーで簡単にTLS1.3機能を使うことができます。例

えば、wolfSSLサンプルクライアントをTLS1.3、暗号スイートTLS13-AES128-GCM-

SHA256 でサーバーに接続する場合は、次のように、”-v” オプションに “4” を指定し、”-

l”オプションで暗号スイートを指定します:

$ ./examples/server/server -v 4 -l TLS13-AES128-GCM-SHA256 $ ./examples/client/client -v 4 -l TLS13-AES128-GCM-SHA256

サンプルクライアントは外部サーバーに接続することもできます。例えば、wolfSSLサイト

にTLS1.3で接続する場合は次のように指定します。

$ ./examples/client/client -v 4 -h www.cloudflare.com -p 443 -d

このコマンドで”-h”はホスト、”-g”はHTTP GET要求、”-A” はサーバ認証のためのCA証明

書を指定します。

wolfSSL では、TLS 1.3 の暗号スイートとして下記の暗号スイートをサポートしていま

す。

TLS13-AES128-GCM-SHA256

TLS13-AES256-GCM-SHA384

TLS13-CHACHA20-POLY1305-SHA256

TLS13-AES128-CCM-SHA256

TLS13-AES128-CCM-8-SHA256

Page 148: wolfSSL ユーザ・マニュアル...Visual Sturdio によるビルドについては、” wolfSSL with Visual Studio” により詳細な説 明があります。 VS2008:Visual

144 © 2004 - 2019 wolfSSL, Inc.

wolfSSL に追加された TLS 1.3 用の関数

TLS 1.3 追加された機能を利用するために下記表の関数を追加しました。

関数名 備考

WOLFSSL_METHOD *wolfTLSv1_3_server_method(void) TLS1.3プロトコル指定

WOLFSSL_METHOD *wolfTLSv1_3_client_method(void)

int wolfSSL_connect_TLSv13(WOLFSSL* ssl) TLSコネクト

int wolfSSL_accept_TLSv13(WOLFSSL* ssl) TLSアクセプト

int wolfSSL_CTX_no_ticket_TLSv13(WOLFSSL_CTX* ctx) セッション・チケットの送

信を抑制 int wolfSSL_no_ticket_TLSv13(WOLFSSL* ssl)

int wolfSSL_CTX_no_dhe_psk(WOLFSSL_CTX* ctx/ssl) セッション再開時DHEなし

を指定 Int wolfSSL_no_dhe_psk(WOLFSSL* ssl)

int wolfSSL_update_keys(WOLFSSL* ssl) 鍵の明示的更新

int wolfSSL_CTX_allow_post_handshake_auth(WOLFSSL_CTX*

ctx/ssl)

ハンドシェイク後の認証

int wolfSSL_allow_post_handshake_auth(WOLFSSL* ctx)

int wolfSSL_request_certificate(WOLFSSL* ssl)

int wolfSSL_read/write_early_data(WOLFSSL*, const void*,

int, int*)

Early Data 関連

int wolfSSL_CTX_set_max_early_data(WOLFSSL_CTX* ctx,

unsigned int sz)

int wolfSSL_set_max_early_data(WOLFSSL* ssl, unsigned

int sz)