コンテンツにスキップ

1 はじめに

このガイドは、軽量 SSL/TLS ライブラリwolfSSLを新しい組み込みプラットフォーム、オペレーティングシステム、トランスポートメディア(TCP/IP、Bluetoothなど)に移植するエンジニア向けのリファレンスを提供します。wolfSSLを移植する際に通常変更が必要となるwolfSSLコードベースの領域を説明しています。本稿はあくまで「ガイド」で、技術の進化に伴い変更が必要になることもあります。不足していると感じる箇所があれば、気兼ねなくお知らせください。

想定する読者

このガイドは、wolfSSLおよびwolfCryptを、現在サポートされていない新しいプラットフォームまたは環境に移植するエンジニアを対象としています。

概要

組み込みプラットフォームでwolfSSLを実行するには、いくつかの手順を繰り返す必要があります。これらの手順の一部は、2.4章 で概説しています。

wolfSSLドキュメント第2章に示した手順に加えて、特定のプラットフォームに対応するために移植または変更が必要なコード領域があります。wolfSSLはこれらの領域の多くを抽象化して、新しいプラットフォームへできるだけ簡単に移植できるようにしています。

./wolfssl/wolfcrypt/settings.h ファイルには、さまざまなオペレーティングシステム、TCP/IPスタック、およびチップセット (例: MBED、FREESCALE_MQX、MICROCHIP_PIC32、MICRIUM、EBSNET など) に固有の定義がいくつかあります。wolfSSLをコンパイルして新しいプラットフォームに移植するときに、#defines を配置する主な場所は2つあります。

  1. オペレーティングシステムまたはTCP/IPスタックに対応するための新たなマクロ定義は、通常、wolfSSLのポーティングが完了すると、settings.h ファイルに追加しています。これにより、機能のオン/オフを簡単に切り替えたり、そのビルドの「デフォルト」となるビルド設定をカスタマイズしたりできます。wolfSSLを新しいプラットフォームに移植する際にも、このファイルに新しいカスタム定義を追加することでお使いいただけます。新しいプラットフォームへの移植が完了した際,もし差し支えなければ,wolfSSLの Gitリポジトリ にPull Requestを送信していただけると嬉しく思います。これにより、より多くの環境でwolfSSLを使用しやすくなります。

  2. wolfSSL自体に変更を加えたくない場合、または追加のプリプロセッサ定義を使用して wolfSSLビルドをカスタマイズしたい場合、wolfSSLはカスタムヘッダーファイルuser_settings.hの使用を推奨します。 wolfSSLソースファイルをコンパイルするときに WOLFSSL_USER_SETTINGS が定義されている場合、wolfSSLはカスタムヘッダーファイル user_settings.h を自動的にインクルードします。このヘッダーはユーザーが作成し、インクルードパスに配置する必要があります。これにより、ユーザーはwolfSSLビルド用に1つのファイルのみを管理すればよく、wolfSSLの新しいバージョンへの更新がはるかに簡単になります。

wolfSSLでは、直接のメール (info@wolfssl.jp) または GitHub Pull Request を通じてパッチとコード変更をご送信いただくことを推奨しています。

図1はwolfSSLライブラリが依存する主なプラットフォームコンポーネントを示しています。ポーティング作業ではこれらの依存コンポーネントについて、ユーザが実際に使用するものと整合をとる必要があります。以下に、主なコンポーネントについて概要をまとめます。詳細については、このユーザガイドの各項を参照してください。

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

  • ネットワーク送受信

wolfSSLライブラリはTCP層のメッセージ送受信のためのAPIを使用します。デフォルトではBSDソケットが使用されます。いくつかの代表的なTCP層APIのためには直接リンクできるためのビルドオプションが用意されています。それ以外のメッセージングAPIを使用する場合はWOLFSSL_USER_IOオプションを指定して、ユーザが用意したメッセージ送受信のコールバック関数を登録します。 なお、TCP接続の確立(TCPのコネクトないしアクセプトまでの処理)は、ユーザプログラムの側で行います。

  • ファイルI/O

ファイルI/Oは主に証明書や鍵の読み出し、生成時の書き込みのために使用されます。デフォルトではPOSIX APIが使用されます。それ以外のAPIを使用する場合はファイルオープン、クローズ、リード、ライト、シークなどのAPIをビルドオプションとして定義します。

  • スレッド、排他制御

スレッドの生成、削除に関してはユーザプログラムの責任で行います。スレッド間の排他制御についてはライブラリ内で必要な箇所で、MUTEXロック、アンロックが呼ばれます。主要なOS、RTOSではビルド時にオプション指定することで所定のロック、アンロック関数とリンクできます。 非RTOSアプリケーションや本ライブラリを単一のスレッドのみで使用する場合は、シングルスレッド・モードで動作するオプションを指定することができます。

  • メモリー管理

デフォルトでは、C言語標準ライブラリのmalloc、free、reallocが使用されます。独自のライブラリを使用する場合は、ビルドオプション、または実行時に登録するユーザ独自の関数を使用することもできます。

  • 時計

主に証明書の有効期間チェック、SSLセッションのタイムアウト管理などに使用されます。従って、高い正確性は要求されませんが、相対時間ではなく実時間である必要があります。デフォルトでは1970年からの秒数を返却するtime関数が使用されます。独自の関数を使用する場合はオプションで指定します。

  • C言語標準ライブラリ

文字列関数などいくつかのC言語標準関数が使用されます。独自の関数を使用する場合はオプションで指定します。