wolfssl ポーティングガイド...© 2004 – 2020 wolfssl, inc. 2...

25
wolfSSL ポーティングガイド (この資料は wolfSSLPorting Guide の日本語翻訳版です)

Upload: others

Post on 14-Jul-2020

2 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: wolfSSL ポーティングガイド...© 2004 – 2020 wolfSSL, Inc. 2 いて概要をまとめます。詳細については、このユーザガイドの各項を参照してくださ

wolfSSL ポーティングガイド (この資料は wolfSSLPorting Guide

の日本語翻訳版です)

Page 2: wolfSSL ポーティングガイド...© 2004 – 2020 wolfSSL, Inc. 2 いて概要をまとめます。詳細については、このユーザガイドの各項を参照してくださ

© 2004 – 2020 wolfSSL, Inc

目的 このガイドでは、wolfSSL 組込み向け軽量 SSL/TLS ライブラリを新しい組み込みプラッ

トフォーム、オペレーティングシステム、または転送媒体(TCP / IP、Bluetooth など)

に移植する開発者、エンジニアのためのリファレンスを提供します。 それらのために、

通常、wolfSSL を移植するときに変更が必要とされる wolfSSL コードベース内の領域を呼

び出します。それは "ガイド"と見なされる進化する仕事であると考えています。文書に説

明や説明を随時追加いたしますので、不足しているものなどお気づきの際はお知らせくだ

さい。

対象

このガイドでは、デフォルトでサポートされていない新しいプラットフォームや環境に

wolfSSL 組込み向け軽量 SSL/TLS ライブラリを移植する開発者やエンジニアを対象として

います。

Page 3: wolfSSL ポーティングガイド...© 2004 – 2020 wolfSSL, Inc. 2 いて概要をまとめます。詳細については、このユーザガイドの各項を参照してくださ

© 2004 – 2020 wolfSSL, Inc

変更履歴:

2020/07/09: ・3 章 ビルドと 4 章 テストを追加

・2020/05/18 版の「3.1 wolfCrypt テストアプリケーション」は「4.1 暗号アルゴ

リズム層テスト」に含む

・誤字脱字修正

Page 4: wolfSSL ポーティングガイド...© 2004 – 2020 wolfSSL, Inc. 2 いて概要をまとめます。詳細については、このユーザガイドの各項を参照してくださ

© 2004 – 2019 wolfSSL, Inc.

目次 1 はじめに ...................................................................................... 1

2 wolfSSLのポーティング ............................................................ 5

2.1 データ型 .................................................................................................. 5

2.2 エンディアン .......................................................................................... 5 2.3 WRITEV ................................................................................................. 6 2.4 (ネットワーク) 入出力 ........................................................................... 6

2.5 ファイルシステム ................................................................................... 7

2.6 スレッド .................................................................................................. 9

2.7 乱数シード .............................................................................................. 9

2.8 メモリ ................................................................................................... 10

2.9 時計 ....................................................................................................... 11

2.10 C標準ライブラリ ................................................................................. 11

2.11 ロギング ................................................................................................ 12

2.12 公開鍵演算 ............................................................................................ 12

2.13 アトミックレコード層処理 ................................................................... 13

2.14 機能 ....................................................................................................... 13

3 ビルド ....................................................................................... 15

3.1 wolfSSLのファイル構成 ...................................................................... 15

3.2 プロジェクトの作成 .............................................................................. 16

4 テスト ....................................................................................... 18

4.1 暗号アルゴリズム層テスト ................................................................... 18

4.2 SSL/TLS対向テスト ............................................................................ 19

4.3 トラブルシューティング ...................................................................... 19

5 サポート .................................................................................... 21

Page 5: wolfSSL ポーティングガイド...© 2004 – 2020 wolfSSL, Inc. 2 いて概要をまとめます。詳細については、このユーザガイドの各項を参照してくださ

© 2004 – 2020 wolfSSL, Inc. 1

1 はじめに組み込みプラットフォーム上で wolfSSL を実行するには、いくつかのステップが必

要です。これらのステップのいくつかは、wolfSSL Manual(非標準環境でのビル

ド)の第 2.4 節で概説されています:

https://www.wolfssl.jp/fwd_wolfssl-usermanual-jp-201901/ wolfSSL マニュアルの第 2 章の手順とは別に、特定のプラットフォームに対応するた

めに移植や修正が必要なコードがいくつかあります。 wolfSSL は、これらの分野の

多くを抽象化して、wolfSSL を新しいプラットフォームに移植するのはできるだけ簡

単にしようとしています。

図1:プラットフォーム依存性の概要

図1は wolfSSL ライブラリが依存する主なプラットフォームコンポーネントを示し

ています。ポーティング作業ではこれらの依存コンポーネントについて、ユーザーが

実際に使用するものと整合をとる必要があります。以下に、主なコンポーネントにつ

timelockunlock

mallocreallocfree

recvsend

fopen/fclosefread/fwrite

9#&B-/3<

TCPDUDP

=>A�� �����

���

�������1'2*

RTOS

wolfSSL

$;A+E-?C

wolSSL_accesptwolfSSL_connect

wolfSSL_ctxwolfSSL_new

wolSSL_recvwolfSSL_send

,C3*/502-?C SSL,6*-?C SSL=20E.���

100%C��F��$0C:@�);-?C�GC++, Java, Python"!API@28E(C4%$C�

���

=>A729#

C����

@&:@A

�� �"!

Page 6: wolfSSL ポーティングガイド...© 2004 – 2020 wolfSSL, Inc. 2 いて概要をまとめます。詳細については、このユーザガイドの各項を参照してくださ

© 2004 – 2020 wolfSSL, Inc. 2

いて概要をまとめます。詳細については、このユーザガイドの各項を参照してくださ

い。

(1) ネットワーク送受信

wolfSSL ライブラリは TCP 層のメッセージ送受信のための API を使用します。デ

フォルトでは BSD ソケットが使用されます。いくつかの代表的な TCP 層 API の

ためには直接リンクできるためのビルドオプションが用意されています。それ以外

のメッセージング API を使用する場合は WOLFSSL_USER_IO オプションを指定

して、ユーザーが用意したメッセージ送受信のコールバック関数を登録します

なお、TCP 接続の確立(TCP のコネクトないしアクセプトまでの処理)は、ユー

ザプログラムの側で行います。

2.4 節(ネットワーク) 入出力 を参照ください。

(2) ファイル I/O

ファイル I/O は主に証明書や鍵の読み出し、生成時の書き込みのために使用されま

す。デフォルトでは POSIX API が使用されます。それ以外の API を使用する場

合はファイルオープン、クローズ、リード、ライト、シークなどの API をビルド

オプションとして定義します。

2.5 節ファイルシステムを参照ください

(3) スレッド、排他制御

スレッドの生成、削除に関してはユーザプログラムの責任で行います。スレッド間

の排他制御についてはライブラリ内で必要な箇所で、MUTEXロック、アンロッ

クが呼ばれます。主要な OS、RTOS ではビルド時にオプション指定することで所

定のロック、アンロック関数とリンクできます。

非 RTOS アプリケーションや本ライブラリを単一のスレッドのみで使用する場合

は、シングルスレッド・モードで動作するオプションを指定することができます。

2.6 節スレッドを参照ください。

(4) メモリ管理

Page 7: wolfSSL ポーティングガイド...© 2004 – 2020 wolfSSL, Inc. 2 いて概要をまとめます。詳細については、このユーザガイドの各項を参照してくださ

© 2004 – 2020 wolfSSL, Inc. 3

デフォルトでは、C言語標準ライブラリの malloc、free、realloc が使用されま

す。独自のライブラリを使用する場合は、ビルドオプション、または実行時に登録

するユーザー独自の関数を使用することもできます。

2.8 節メモリを参照ください。

(5) 時計

主に証明書の有効期間チェック、SSL セッションのタイムアウト管理などに使用

されます。従って、高い正確性は要求されませんが、相対時間ではなく実時間であ

る必要があります。デフォルトでは 1970年からの秒数を返却する time関数が使

用されます。独自の関数を使用する場合はオプションで指定します。

2.9 節 時計を参照ください。

(6) C言語標準ライブラリ

文字列関数などいくつかの C言語標準関数が使用されます。独自の関数を使用す

る場合はオプションで指定します。

2.10 節 C 標準ライブラリを参照ください。

Page 8: wolfSSL ポーティングガイド...© 2004 – 2020 wolfSSL, Inc. 2 いて概要をまとめます。詳細については、このユーザガイドの各項を参照してくださ

© 2004 – 2020 wolfSSL, Inc. 4

./wolfssl/ctaocrypt/settings.h ファイルに、いくつかの異なるオペレーティングシス

テム、TCP / IP スタック、およびチップセット(MBED、FREESCALE_MQX、

MICROCHIP_PIC32、MICRIUM、EBSNET等)向けの定義があります。新しい定

義は wolfSSL の新しい移植が完了したときに settings.h ファイルに追加されます

が、それらは通常 wolfSSL を変更する必要があります。これによって、機能を有効/

無効にしたり、ビルド設定をカスタマイズしたりする簡単な方法が提供されます。

wolfSSL のポートを新しいプラットフォームにするときには、このファイルの新しい

カスタム定義に自由に追加してください。わたしどもは、ユーザーが wolfSSL のポ

ートに貢献してメインのオープンソースコードブランチに戻していただけるようお勧

めしています。これにより、wolfSSL を最新の状態に保つことができ、wolfSSL プ

ロジェクトが改善され、前進する際に、さまざまなポートを最新に維持することがで

きます。

wolfSSL は、直接メール([email protected])か、GitHub のプルリクエスト

(https://github.com/wolfssl/wolfssl)を介してパッチやコードの変更の提出をお勧

めしています。

Page 9: wolfSSL ポーティングガイド...© 2004 – 2020 wolfSSL, Inc. 2 いて概要をまとめます。詳細については、このユーザガイドの各項を参照してくださ

© 2004 – 2020 wolfSSL, Inc. 5

2 wolfSSLのポーティング

2.1 データ型

Q:このセクションが必要なのはどういう場合?

A: ポーティング対象のプラットフォームの正しいデータ型のサイズを設定するのは常に重要です。

wolfSSL は、64 ビットタイプが利用可能の場合、スピードに恩恵を受けます。プラットフォーム上の

sizeof(long)と sizeof(long long)の結果と一致するように SIZEOF_LONG または

SIZEOF_LONG_LONG を設定します。これは、settings.h ファイルのカスタム定義に追加することが

できます。たとえば、MY_NEW_PLATFORM のサンプル定義の settings.h で次のように指定しま

す。

#ifdef MY_NEW_PLATFORM

#define SIZEOF_LONG 4

#define SIZEOF_LONG_LONG 8

...

#endif

2.2 エンディアン

Q:このセクションが必要なのはどういう場合?

A: プラットフォームがビッグエンディアンの場合です

あなたのプラットフォームはビッグエンディアン、リトルエンディアン、どちらですか?

wolfSSL はデフォルトではリトルエンディアンシステムです。システムがビッグエンディ

Page 10: wolfSSL ポーティングガイド...© 2004 – 2020 wolfSSL, Inc. 2 いて概要をまとめます。詳細については、このユーザガイドの各項を参照してくださ

© 2004 – 2020 wolfSSL, Inc. 6

アンの場合は、wolfSSL をビルドするときに BIG_ENDIAN_ORDER を定義してくださ

い。これを settings.h で設定する例: #ifdef MY_NEW_PLATFORM

...

#define BIG_ENDIAN_ORDER

...

#endif

2.3 WRITEV Q:このセクションが必要なのはどういう場合?

A: <sys/uio.h> が提供されていない場合です

デフォルトでは、wolfSSL API はアプリケーションに対して writev関数のセマンティク

スをシミュレートする wolfSSL_writev()を提供します。使用可能な<sys / uio.h>ヘッダ

ーを持たないシステムでは、この機能を除外するために NO_WRITEV を定義してくださ

い。

2.4 (ネットワーク)入出力

Q:どういう場合このセクションが必要ですか?

A:BSDスタイルのソケット APIが使用できない場合。また、特別なポート層または

TCP/IPスタックを使用したい場合、静的バッファのみを使用したい場合です。

wolfSSL はデフォルトでは BSDスタイルのソケットインターフェイスを使用します。トラ

ンスポート層が BSDソケットインターフェイスを提供する場合、カスタムヘッダが必要な

場合を除いて、wolfSSL はそのままの状態で統合する必要があります。

wolfSSL は、ユーザーがシステムに wolfSSL の I / O 機能を合わせることが可能となるよ

うにカスタム I / O抽象レイヤーを提供しています。詳細は、wolfSSL マニュアルの第

5.1.2節をご覧ください :

https://www.wolfssl.jp/fwd_wolfssl-usermanual-jp-201901/

Page 11: wolfSSL ポーティングガイド...© 2004 – 2020 wolfSSL, Inc. 2 いて概要をまとめます。詳細については、このユーザガイドの各項を参照してくださ

© 2004 – 2020 wolfSSL, Inc. 7

単に、ビルド時オプションに WOLFSSL_USER_IOを指定して、独自の I / Oコールバック関

数を、テンプレートとして wolfSSL のデフォルト EmbedSend()と EmbedReceive()を参

照して記述してください。これら 2つの関数は./src/io.cにあります。

wolfSSL は、入出力時に動的バッファを使用します。デフォルトは 0バイトです。バッフ

ァよりサイズが大きい入力レコードが受信された場合は、動的バッファを使用して要求を

処理してから解放します。

ダイナミックメモリを使用せず、大きな 16kBスタティックバッファを使用したい場合

は、LARGE_STATIC_BUFFERS オプションを指定します。

ダイナミックバッファが使用されている時は、ユーザーがバッファサイズより大きい

wolfSSL_write()を要求すると、最大 MAX_RECORD_SIZEまでの動的ブロックがデータを

送信するために使用されます。 RECORD_SIZEで定義されているように、バッファサイズの

データを最大でのみ送信したい場合は、STATIC_CHUNKS_ONLYを定義します。この定義を使

用する場合、RECORD_SIZEのデフォルトは 128バイトです。

2.5 ファイルシステム

Q:どういう場合このセクションが必要ですか?

A: 使用可能なファイルシステムがない場合、標準のファイルシステム機能が使用できな

い場合、または、カスタムファイルシステムを使用する場合です。

wolfSSL は鍵と証明書を SSL セッションまたはコンテキストにロードするためにファイ

ルシステムを使用します。 wolfSSL では、これらをメモリバッファからロードすること

もできます。メモリバッファだけを使用する場合、ファイルシステムは必要ありません。

ライブラリをビルドするときに NO_FILESYSTEM を定義することにより、ファイルシス

テムの使用を無効にすることができます。この場合、ファイルではなくメモリバッファか

ら証明書と鍵をロードする必要があります。これを settings.h で設定する例:

Page 12: wolfSSL ポーティングガイド...© 2004 – 2020 wolfSSL, Inc. 2 いて概要をまとめます。詳細については、このユーザガイドの各項を参照してくださ

© 2004 – 2020 wolfSSL, Inc. 8

#ifdef MY_NEW_PLATFORM

...

#define NO_FILESYSTEM

...

#endif

テスト用の鍵と証明書バッファは、./wolfssl/certs_test.hヘッダーファイルにあります。

これらは、これらの証明書と./certs ディレクトリにある証明書と同じものです。

certs_test.hヘッダーファイルは、必要に応じて./gencertbuf.pl スクリプトを使用して更

新できます。 gencertbuf.pl には、fileList_1024 と fileList_2048 という 2 つの配列があ

ります。鍵のサイズに応じて、それぞれの配列に追加の証明書または鍵を追加することが

でき、DER形式でなければなりません。上記の配列は、目的のバッファ名を持つ証明書/

鍵ファイルの場所にマップされます。 gencertbuf.pl を変更した後、wolfSSL ルートディ

レクトリからそれを実行すると、./wolfssl/certs_test.h の証明書と鍵バッファが更新され

ます:

./gencertbuf.pl

デフォルト以外のファイルシステムを使用したい場合、ファイルシステム抽象化レイヤー

は./src/ssl.c にあります。ここでは、EBSNET、FREESCALE_MQX、MICRIUM などの

さまざまなプラットフォームのファイルシステムが表示されています。 XFILE、

XFOPEN、XFSEEK などでファイルシステム関数を定義できるように、必要に応じてプ

ラットフォームにカスタム定義を追加できます。たとえば、Micrium のμC/ OS

(MICRIUM)の ssl.c のファイルシステム層は次のとおりです。

#elif defined(MICRIUM)

#include <fs.h>

#define XFILE FS_FILE*

#define XFOPEN fs_fopen

#define XFSEEK fs_fseek

#define XFTELL fs_ftell

#define XREWIND fs_rewind

#define XFREAD fs_fread

Page 13: wolfSSL ポーティングガイド...© 2004 – 2020 wolfSSL, Inc. 2 いて概要をまとめます。詳細については、このユーザガイドの各項を参照してくださ

© 2004 – 2020 wolfSSL, Inc. 9

#define XFCLOSE fs_fclose

#define XSEEK_END FS_SEEK_END

#define XBADFILE NULL

2.6 スレッド

Q:どういう場合このセクションが必要ですか?

A:マルチスレッド環境で wolfSSL を使用したい場合、またはシングルスレッド・モード

でコンパイルしたい場合です。

wolfSSL がシングルスレッド環境でのみ使用される場合、wolfSSL をコンパイルするとき

に SINGLE_THREADEDを定義して wolfSSL の排他制御を無効にすることができます。これに

より、wolfSSL 排他制御層を移植する必要がなくなります。

wolfSSL をマルチスレッド環境で使用する必要がある場合は、wolfSSL排他制御層を新し

い環境に移植する必要があります。排他制御層は、./wolfssl/ctaocrypt/wc_port.h

と./ctaocrypt/src/wc_port.cにあります。 wolfSSL_Mutexは、wc_port.cの port.hの新

しいシステムと排他制御関数(InitMutex、FreeMutexなど)に定義する必要があります。

wc_port.hおよび wc_port.cで、いくつかの既存のプラットフォーム(EBSNET、

FREESCALE_MQXなど)を例として検索します。

2.7 乱数シード

Q:どういう場合このセクションが必要ですか?

A:/dev/randomまたは /dev/urandomのいずれかが利用できないか、RNG ハードウェアを

統合したい場合です。

デフォルトでは、wolfSSL は/dev/urandomまたは/dev/randomを使用して RNGシードを生

成します。 NO_DEV_RANDOMの定義は、デフォルトの wc_GenerateSeed()関数を無効にす

るときにビルド時に指定します。これが指定されている場合は、ターゲットプラットフォ

ームに固有の./wolfcrypt/src/random.cにカスタム wc_GenerateSeed()関数を記述する

Page 14: wolfSSL ポーティングガイド...© 2004 – 2020 wolfSSL, Inc. 2 いて概要をまとめます。詳細については、このユーザガイドの各項を参照してくださ

© 2004 – 2020 wolfSSL, Inc. 10

必要があります。これにより、ハードウェアベースのランダムエントロピーソースがあれ

ば、wolfSSL の PRNGにシードすることができます。

Wc_GenerateSeed 関数をどのように記述する必要があるかの例については、wolfSSL の既

存の wc_GenerateSeed 関数の実装を./wolfcrypt/src/random.cで参照してください。

2.8 メモリ

Q:どういう場合このセクションが必要ですか?

A:標準のメモリ関数を使用できない場合、またはオプションの数学ライブラリ間のメモ

リ使用量の違いに関心があるような場合です。

wolfSSL は、デフォルトでは malloc()と free()を使用しています。通常の整数演算ラ

イブラリを使用する場合、wolfCryptは realloc()も使用します。

デフォルトでは、wolfSSL/wolfCryptは、通常の整数ライブラリを使用します。これは、

かなりの動的メモリを使用します。 wolfSSL を構築する場合、FastMathライブラリのほ

うを有効にすることができます。こちらは通常速度も速く、暗号操作(すべてのスタック

上)には動的メモリを使用しません。 Fastmathを使う場合、wolfSSL は realloc()の実

装を必要としません。 wolfSSL の SSL 層はそのほかにもいくつかの処理で動的メモリを使

用しているので、malloc()と free()は依然として必要です。

通常の整数演算ライブラリと FastMathライブラリ間のリソース使用量(スタック/ヒー

プ)の比較のドキュメントを参照ご希望のかたはお知らせください。

FastMathを有効にするには、USE_FAST_MATHを定義し ./wolfcrypt/src/integer.cではな

く ./wolfcrypt/src/tfm.cを使用します。 fastmathを使用するときはスタックメモリが

大きいので、TFM_TIMING_RESISTANT も定義することをお勧めします。

標準の malloc()、free()を、および reallocの()関数が利用できない場合、

XMALLOC_USERを定義します。これによりターゲット環境依存のカスタムフック

を ./wolfssl/wolfcrypt/types.h内に定義することができます。

Page 15: wolfSSL ポーティングガイド...© 2004 – 2020 wolfSSL, Inc. 2 いて概要をまとめます。詳細については、このユーザガイドの各項を参照してくださ

© 2004 – 2020 wolfSSL, Inc. 11

XMALLOC_USERの使用方法の詳細については、wolfSSL マニュアルの第 5.1.1.1節を参照し

てください :

https://www.wolfssl.jp/fwd_wolfssl-usermanual-jp-201901/

2.9 時計

Q:どういう場合にこのセクションが必要ですか?

A:標準時間関数(time()、gmtime())が利用できない場合、またはカスタムクロッ

クティック関数を指定する必要がある場合です。

デフォルトでは、wolfSSL は./wolfcrypt/src/asn.cで指定されているように、time

()、gmtime()、および ValidateDate()を使用します。これらは、XTIME、XGMTIME、

XVALIDATE_DATEに抽象化されています。標準時刻関数、および time.hが使用できない場

合、ユーザーは USER_TIMEを定義できます。 USER_TIMEを定義した後、ユーザーは独自の

XTIME、XGMTIME、および XVALIDATE_DATE 関数を定義できます。

wolfSSL は、クロックティック機能のデフォルトで time(0)を使用します。これは、

LowResTimer()関数の内部の./src/internal.cにあります。

time(0)が望ましくない場合には、USER_TICKS を定義することでユーザー独自の clock

tick 関数を定義することができます。カスタム関数は秒の精度が必要ですが、EPOCHと相

関させる必要はありません。 ./src/internal.cの LowResTimer()関数を参照してくだ

さい。

2.10 C標準ライブラリ

Q:どういう場合このセクションが必要ですか?

A:C標準ライブラリがない場合、またはカスタムライブラリを使用する場合です。

wolfSSL は、C標準ライブラリを使用しなくても、開発者がより高いレベルの移植性と柔

軟性を得ることができます。そのようなとき、ユーザーは C標準のものの代わりに使用し

たい機能をマップする必要があります。

Page 16: wolfSSL ポーティングガイド...© 2004 – 2020 wolfSSL, Inc. 2 いて概要をまとめます。詳細については、このユーザガイドの各項を参照してくださ

© 2004 – 2020 wolfSSL, Inc. 12

上のセクション 2.8では、メモリ機能について説明しました。メモリ関数の抽象化に加え

て、wolfSSL は文字列関数と数学関数も抽象化します。それぞれの関数は抽象化される関

数の名前に対応して X<FUNC>の形で定義されます。

詳細については、wolfSSL マニュアルのセクション第 5.1節をお読みください :

https://www.wolfssl.jp/fwd_wolfssl-usermanual-jp-201901/

2.11 ロギング

Q:どういう場合このセクションが必要ですか?

A:デバッグメッセージを有効にしたいが、stderrは使用できません。

デフォルトでは、wolfSSL は stderrを介してデバッグ出力を提供します。デバッグメッセ

ージを有効にするには、wolfSSL を DEBUG_WOLFSSL でコンパイルし、

wolfSSL_Debugging_ON()をアプリケーションコードから呼び出す必要があります。

wolfSSL_Debugging_OFF()は、アプリケーション層が wolfSSL デバッグメッセージをオ

フにするために使用できます。

stdderが利用できない環境や、デバッグメッセージを別の出力ストリームや別の形式で出

力したい場合、wolfSSL ではアプリケーションはロギングコールバックに登録できます。

詳細については、wolfSSL マニュアルの第 8.1節をお読みください。

2.12 公開鍵演算

Q:どういう場合このセクションが必要ですか?

A:wolfSSL で独自の公開鍵実装を使用したいとします。

wolfSSL を使用すると、SSL / TLS 層が公開鍵操作を行う必要があるときに呼び出される

独自の公開鍵コールバックをユーザーが書くことができます。ユーザーはオプションで 6

つの関数を定義できます。

ECC 符号コールバック

ECC 検証コールバック

RSA 署名コールバック

Page 17: wolfSSL ポーティングガイド...© 2004 – 2020 wolfSSL, Inc. 2 いて概要をまとめます。詳細については、このユーザガイドの各項を参照してくださ

© 2004 – 2020 wolfSSL, Inc. 13

RSA 検証コールバック

RSA暗号化コールバック

RSA 復号化コールバック

詳細は、wolfSSL マニュアルの第 6.4節を参照してください :

https://www.wolfssl.jp/fwd_wolfssl-usermanual-jp-201901/

2.13 アトミックレコード層処理

Q:どういう場合このセクションが必要ですか?

A:TLS レコード層の独自の処理、特に MAC /暗号化と解読/検証操作を行いたい場合で

す。

デフォルトでは、wolfSSL は、暗号化ライブラリ wolfCryptを使用して、ユーザーの TLS

レコード層処理を処理します。 wolfSSL は、MAC /暗号化をより詳細に制御し、SSL / TLS

接続を復号/検証したい場合、アトミックレコード処理コールバックを使用します。

ユーザーは 2つの関数を定義する必要があります:

MAC /暗号化コールバック関数

コールバック関数の復号化/検証

詳細は、wolfSSL マニュアルのセクション 6.3を参照してください。

https://www.wolfssl.jp/fwd_wolfssl-usermanual-jp-201901/

2.14 機能

Q:どういう場合このセクションが必要ですか?

A:機能を無効にする場合。

適切な定義を使用して wolfSSL をビルドするとき、機能を無効にすることができます。利

用可能な定義のリストについては、wolfSSL Manual の第 2章を参照してください。

Page 18: wolfSSL ポーティングガイド...© 2004 – 2020 wolfSSL, Inc. 2 いて概要をまとめます。詳細については、このユーザガイドの各項を参照してくださ

© 2004 – 2020 wolfSSL, Inc. 14

Page 19: wolfSSL ポーティングガイド...© 2004 – 2020 wolfSSL, Inc. 2 いて概要をまとめます。詳細については、このユーザガイドの各項を参照してくださ

© 2004 – 2020 wolfSSL, Inc. 15

3 ビルド

3.1 wolfSSLのファイル構成

以下に、wolfSSL のポーティングに使用する主なディレクトリとファイル構成

を説明します。wolfSSL サイトよりファイル一式をダウンロード、解凍し、デ

ィレクトリー構成をくずさずにそのまま利用します。 ライブラリ生成に必要なプログラムソースファイル、ヘッダーファイルは、

SSL/TLS プロトコル層と暗号アルゴリズム層の二つにわけてそれぞれ以下の

ディレクトリーに格納されています。 ⇒src/*.c SSL プロトコル層のソースファイル ⇒wolfcrypt/src/*.c 暗号化アルゴリズム層のソースファイル ⇒wolfssl/*.h SSL プロトコル層のヘッダーファイル →wolfcrypt/*h 暗号化アルゴリズム層のヘッダーファイル →openssl/*.h openSSL 互換のためのヘッダーファイル アルゴリズム層のテストとベンチマークプログラムが下記に格納されていま

す。ライブラリーをポーティングしたら最初のテストプログラムとして利用し

ます。詳細は4.テストを参照してください。 ⇒wolfcrypt/test ⇒wolfcrypt/benchmark SSL/TLS レイヤーの簡単なサンプル・プログラムが下記のディレクトリ下に

格納されています。4.2対向テストで使用します。 ⇒examples echoserver, echoclient: 一往復のメッセージをやり取りする簡単なクライア

ントとサーバ。 server, client: 簡単なメッセージ送受信サーバとクライアントですが、コマ

ンドオプションにより、呼出し先 IP, Port, 認証のための証明書、鍵ファイル

の指定、暗号スイートなどを指定することができます。Linux や Windows 用

Page 20: wolfSSL ポーティングガイド...© 2004 – 2020 wolfSSL, Inc. 2 いて概要をまとめます。詳細については、このユーザガイドの各項を参照してくださ

© 2004 – 2020 wolfSSL, Inc. 16

コマンドとしてビルドすることもできるので、対向テストにおいてマイコン上

のサーバ、クライアントとして使用できます。

3.2 プロジェクトの作成

GNU Autoconf が利用可能の環境ならば、以下のコマンドで Makefile を作成

し、make を実行することで wolfSSL ライブラリーやサンプルプログラム一式

がビルドされます。 $ configure <コンフィグレーションオプション> $ make コンフィグレーションオプションについては、本資料の第二章で紹介している

各種のオプションや、ユーザマニュアルを参照してください。 独自の make ファイルや各種 IDE を使用する場合は、プロジェクトに以下の

ようにソースファイルを登録し、ヘッダーファイルのインクルードパスを指定

します。 1) ソースファイルの登録

コンパイル対象のソースファイルとして、以下の二つのディレクトリ下

のすべての C 言語ソースファイル(*.c)を登録します。

⇒src/*.c SSL プロトコル層のソースファイル ⇒wolfcrypt/src/*.c 暗号化アルゴリズム層のソースファイル

ただし、以下のファイルは他のソースファイルから自動的にインクルードさ

れるので、登録から除外します。 src/bio.c, wolfcrypt/src/evp.c, wolfcrypt/src/misc.c

2) ヘッダーファイルのインクルードパス

インクルードパスに wolfSSL ファイルのルートディレクトリを登録しま

す。 3) ビルドオプションの指定とビルド

Page 21: wolfSSL ポーティングガイド...© 2004 – 2020 wolfSSL, Inc. 2 いて概要をまとめます。詳細については、このユーザガイドの各項を参照してくださ

© 2004 – 2020 wolfSSL, Inc. 17

各種 IDE などでビルドする場合は、次のように設定します。 ユーザ個別のビルドオプションは user_settings.h という名前のヘッダ

ーファイルに格納し、適当なディレクトリに置きます。ライブラリソースコー

ドのコンパイル時に参照されるように、インクルードパスにそのディレクトリ

を含めるようにします。また、コンパイル時のマクロ定義として WOLFSSL_USER_SETTINGS を定義して、そのヘッダーファイルの参照を有効化します。 以上の指定を完了したら、ライブラリをビルドし、必要に応じて上記のテスト

プログラムやアプリケーションプログラムとリンクします。

Page 22: wolfSSL ポーティングガイド...© 2004 – 2020 wolfSSL, Inc. 2 いて概要をまとめます。詳細については、このユーザガイドの各項を参照してくださ

© 2004 – 2020 wolfSSL, Inc. 18

4 テストwolfSSL では、ポーティングのためのビルドが意図通り正常に行われているか確認するた

めに各種のテスト方法を提供しています。この手順をスキップして SSL 接続の確立に直接

進むと、基になる暗号化操作が失敗したために発生した問題をデバッグするのがより困難

になります。必ず、この段階で確実に確認してください。

4.1 暗号アルゴリズム層テスト

wolfSSL をターゲットプラットフォーム上に適切に構築した後、wolfCrypt テストアプリ

ケーションを利用して暗号アルゴリズム層のテストを行います。このアプリケーションを

ターゲットシステムで実行すると、NIST テストベクタを使用して、すべての暗号アルゴ

リズムが正しく動作していることが確認されます。

このテストにより次のようなことを確認することができます。

1)対象アルゴリズム

テスト結果はアルゴリズムごとに成否が表示されます。ビルドオプションで指定したすべ

てのアルゴリズムが含まれていることを確認してください。

2)機能確認

テストプログラムでは各アルゴリズムでテストベクタが正常な結果を返却していることを

確認しています。結果が正常でない場合は、テスト不成功が表示されます。不成功だった

り、途中で例外が発生している場合は原因を解析する必要がります。組込みシステムでは

この段階でのエラーはヒープ領域の不足によるケースが多いので、エラーの場合は十分な

領域が確保されているか確認してください。また、途中で例外が発生する場合は、スタッ

ク領域が十分であるか確認してください。

wolfSSL では利用機能によってヒープ領域やスタック領域を削減するためのオプションも

提供しています。メモリー領域の削減方法については wolfSSL ユーザマニュアルを参照

するか、弊社ヘルプデスクに問い合わせてください。

Page 23: wolfSSL ポーティングガイド...© 2004 – 2020 wolfSSL, Inc. 2 いて概要をまとめます。詳細については、このユーザガイドの各項を参照してくださ

© 2004 – 2020 wolfSSL, Inc. 19

wolfCrypt テストアプリケーションは、./wolfcrypt/test/test.c にあります。埋め込みアプ

リケーションに独自の main()関数がある場合、./wolfcrypt/test/test.c をコンパイルす

るときに NO_MAIN_DRIVER を定義することができます。これにより、アプリケーショ

ンの main()はそれぞれの暗号/アルゴリズムテストを個別に呼び出すことができます。

組み込みデバイスに wolfCrypt テストアプリケーション全体を実行するのに十分なリソー

スがない場合、個々のテストを test.c から抜き出して個別にコンパイルすることができま

す。 test.c から隔離された暗号テストを抽出する際に、ビルドに含まれる特定のテストケ

ースに必要な正しいヘッダーファイルがあることを確認してください。

4.2 SSL/TLS対向テスト

次に、SSL/TLS レイヤーの確認のために、適当な通信相手と対向テストを行

います。本格的な対向テストにはユーザ自身によるテストケースの作成が必要

ですが、wolfSSL では初期の対向テストのために、ターゲット環境に移植して

動作させるための echoclient, echoserver を用意しています。また、対向テス

トの相手方として各種テストケースを簡単に実現することができるようなサン

プルテストドライバーとして、 examples/client/client, examples/server/server を用意しています。このサーバとクライアントは Linux, Windows, MacOS な

どの環境でもビルド、実行させることができます。 これらのクライアント、サーバで指定できる各種オプションについては、 ./examples/server/server -? ./examples/client/client -? を指定して、それぞれのコマンドのヘルプメッセージを参照してください。

4.3 トラブルシューティング

トラブルシューティンのために wolfSSL ライブラリーの実行ログを出力させる

ためには、下記のビルドオプションを使用します。

Page 24: wolfSSL ポーティングガイド...© 2004 – 2020 wolfSSL, Inc. 2 いて概要をまとめます。詳細については、このユーザガイドの各項を参照してくださ

© 2004 – 2020 wolfSSL, Inc. 20

Automake 環境: $ ./configure –enable-debug IDE 環境、独自の Makefile など: user_settings.h ヘッダーファイルにて以下のマクロ定義を指定 #define DEBUG_WOLFSSL 実行時に、以下の関数呼び出しで、ログ生成の開始、終了を指定します。

wolfSSL_Debugging_ON(); /* ログ出力の開始 */

wolfSSL_Debugging_OFF(); /* ログ出力の終了 */

Page 25: wolfSSL ポーティングガイド...© 2004 – 2020 wolfSSL, Inc. 2 いて概要をまとめます。詳細については、このユーザガイドの各項を参照してくださ

© 2004 – 2020 wolfSSL, Inc. 21

5 サポート一般的なサポートに関する質問は、電子メール、サポートフォーラムを介して

wolfSSL に直接送信することができます。

ウェブサイト:https://www.wolfssl.com, https://www.wolfssl.jp (日本語)

サポートメール:[email protected] (日本語可)

フォーラム:http://www.wolfssl.com/forums

wolfSSL は、お客様が新しい環境に wolfSSL を移植できるためのサポートパ

ッケージとコンサルティングサービスを提供しています。

お問い合わせ:[email protected], https://www.wolfssl.jp (日本語)