From 50a0293d0bceb2ecd1df08fbee007bfaac3b428f Mon Sep 17 00:00:00 2001 From: Takashi Kojo Date: Sat, 28 Jan 2023 10:57:22 +0900 Subject: [PATCH 1/2] add Japanese version --- wolfSSL-Porting/Makefile | 9 +- wolfSSL-Porting/mkdocs-ja.yml | 27 ++ wolfSSL-Porting/src-ja/platformDependency.png | Bin 0 -> 68396 bytes wolfSSL-Porting/src-ja/section01.md | 61 +++++ wolfSSL-Porting/src-ja/section02.md | 242 ++++++++++++++++++ wolfSSL-Porting/src-ja/section03.md | 11 + wolfSSL-Porting/src-ja/section04.md | 30 +++ 7 files changed, 379 insertions(+), 1 deletion(-) create mode 100644 wolfSSL-Porting/mkdocs-ja.yml create mode 100644 wolfSSL-Porting/src-ja/platformDependency.png create mode 100644 wolfSSL-Porting/src-ja/section01.md create mode 100644 wolfSSL-Porting/src-ja/section02.md create mode 100644 wolfSSL-Porting/src-ja/section03.md create mode 100644 wolfSSL-Porting/src-ja/section04.md diff --git a/wolfSSL-Porting/Makefile b/wolfSSL-Porting/Makefile index 88346f0b..281b49d7 100644 --- a/wolfSSL-Porting/Makefile +++ b/wolfSSL-Porting/Makefile @@ -8,7 +8,14 @@ SOURCES = section01.md \ section03.md \ section04.md -PDF = wolfSSL-Porting-Guide.pdf +ifeq ($(DOC_LANG),JA) + PDF = wolfSSL-Porting-Guide-ja.pdf + DOXYFILE = Doxyfile-ja +else + PDF = wolfSSL-Porting-Guide.pdf + DOXYFILE = Doxyfile +endif + .PHONY: html-prep html-prep: diff --git a/wolfSSL-Porting/mkdocs-ja.yml b/wolfSSL-Porting/mkdocs-ja.yml new file mode 100644 index 00000000..5e1393ff --- /dev/null +++ b/wolfSSL-Porting/mkdocs-ja.yml @@ -0,0 +1,27 @@ +site_name: wolfSSLポーティングガイド +site_url: https://wolfssl.com/ +docs_dir: build/html/ +site_dir: html/ +copyright: Copyright © 2023 wolfSSL Inc. +nav: + - "1. はじめに": index.md + - "2. wolfSSLのポーティング": section02.md + - "3. 次のステップ": section03.md + - "4. サポート": section04.md +theme: + name: null + custom_dir: ../mkdocs-material/material + language: en + palette: + primary: indigo + accent: indigo + font: + text: roboto + code: roboto mono + icon: "logo.png" + logo: logo.png + favicon: logo.png + feature: + tabs: true +extra_css: [skin.css] +use_directory_urls: false diff --git a/wolfSSL-Porting/src-ja/platformDependency.png b/wolfSSL-Porting/src-ja/platformDependency.png new file mode 100644 index 0000000000000000000000000000000000000000..8fa1fca83479bc3131a6b074d5d1074747fe5257 GIT binary patch literal 68396 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 ZfIR|P?B{-xs|5ic-pT#9atB}5{{ZnnAuj*` literal 0 HcmV?d00001 diff --git a/wolfSSL-Porting/src-ja/section01.md b/wolfSSL-Porting/src-ja/section01.md new file mode 100644 index 00000000..6f3dd58d --- /dev/null +++ b/wolfSSL-Porting/src-ja/section01.md @@ -0,0 +1,61 @@ +# 1 はじめに + +組み込みプラットフォーム上でwolfSSLを実行するには、いくつかのステップが必要です。これらのステップのいくつかは、wolfSSL Manual(非標準環境でのビルド)のセクション2.4で概説されています。 + +wolfSSLマニュアルの第2章の手順とは別に、特定のプラットフォームに対応するために移植や修正が必要なコードがいくつかあります。 wolfSSLは、これらの分野の多くを抽象化して、wolfSSLを新しいプラットフォームに移植するのはできるだけ簡単にしようとしています。 + + + +## 想定する読者 + +のガイドは、デフォルトでサポートされていない新しいプラットフォームまたは環境に wolfSSL および wolfCrypt を移植する開発者またはエンジニアを対象としています。 + +## 概要 + +組み込みプラットフォームで wolfSSL を実行するには、いくつかの手順を繰り返す必要があります。 これらの手順のいくつかは、wolfSSL マニュアルのセクション 2.4 で概説されています。 + +wolfSSL マニュアルの第 2 章の手順とは別に、特定のプラットフォームに対応するために移植または変更が必要なコードの領域があります。 wolfSSL はこれらの領域の多くを抽象化し、wolfSSL を新しいプラットフォームにできるだけ簡単に移植できるようにします。 + +./wolfssl/wolfcrypt/settings.h ファイルには、さまざまなオペレーティング システム、TCP/IP スタック、およびチップセット (つまり、MBED、FREESCALE\_MQX、MICROCHIP\_PIC32、MICRIUM、EBSNET など) に固有の定義がいくつかあります。 wolfSSL をコンパイルして新しいプラットフォームに移植するときに \#defines を配置する主な場所は次の 2 つです。 + +まず、オペレーティング システムまたは TCP/IP スタック ポートの新しい定義は、通常、wolfSSL の新しいポートが完了すると、settings.h ファイルに追加されます。 これにより、機能をオン/オフしたり、そのビルドのデフォルトにする必要があるビルド設定をカスタマイズしたりする簡単な方法が提供されます。 wolfSSL を新しいプラットフォームに移植する際に、このファイルに新しいカスタム定義を追加できます。 ユーザーは、GitHub のマスター オープン ソース コード ブランチに wolfSSL のポートを提供することをお勧めします。 これにより、wolfSSL を最新の状態に保つことができ、wolfSSL プロジェクトが改善され前進するにつれて、さまざまなポートを最新の状態に保つことができます。 + +自分の変更を wolfSSLproper に戻したくないユーザー、または追加のプリプロセッサー定義で wolfSSL ビルドをカスタマイズしたいユーザーの場合、wolfSSL はカスタムの「user\_settings.h」ヘッダー ファイルの使用を推奨します。 + +wolfSSL ソース ファイルのコンパイル時に WOLFSSL\_USER\_SETTINGS が定義されている場合、wolfSSL は「user\_settings.h」と呼ばれるカスタム ヘッダー ファイルを自動的にインクルードします。このヘッダーはユーザーが作成し、インクルードパスに配置する必要があります。 これにより、ユーザーは自分の wolfSSLbuild 用に 1 つのファイルを維持でき、新しいバージョンの wolfSSL への更新がはるかに簡単になります。 + +wolfSSL は、直接の電子メール (info@wolfssl.com) または GitHub プル リクエストを通じて、パッチとコードの変更を提出することを奨励しています。 + + + +図1はwolfSSLライブラリが依存する主なプラットフォームコンポーネントを示しています。ポーティング作業ではこれらの依存コンポーネントについて、ユーザが実際に使用するものと整合をとる必要があります。以下に、主なコンポーネントについて概要をまとめます。詳細については、このユーザガイドの各項を参照してください。 + +![プラットフォーム依存性の概要](./platformDependency.png "プラットフォーム依存性の概要") + + + +- ネットワーク送受信 + +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言語標準関数が使用されます。独自の関数を使用する場合はオプションで指定します。 diff --git a/wolfSSL-Porting/src-ja/section02.md b/wolfSSL-Porting/src-ja/section02.md new file mode 100644 index 00000000..4ffbadce --- /dev/null +++ b/wolfSSL-Porting/src-ja/section02.md @@ -0,0 +1,242 @@ +# 2 wolfSSLのポーティング +## データ型 + +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 +``` + +There are two additional data types used by wolfSSL and wolfCrypt, called “word32” and “word16”. The default type mappings for these are: + +``` +#ifndef WOLFSSL_TYPES +#ifndef byte +typedef unsigned char byte; +#endif + typedef unsigned short word16; +typedef unsigned int word32; +typedef byte word24[3]; +#endif +``` + +「word32」はコンパイラの 32 ビット型に、「word16」はコンパイラの 16 ビット型にマップする必要があります。 これらのデフォルトのマッピングがプラットフォームに対して正しくない場合は、settings.h または user_settings.h で WOLFSSL_TYPES を定義し、word32 および word16 に独自のカスタム typedef を割り当てる必要があります。 + +wolfSSL の fastmath ライブラリは、「fp_digit」および「fp_word」タイプを使用します。 デフォルトでは、これらはビルド構成に応じて にマップされます。 + +「fp_word」は「fp_digit」の 2 倍のサイズにする必要があります。 デフォルトのケースがプラットフォームに当てはまらない場合は、settings.h または user_settings.h で WOLFSSL_BIGINT_TYPES を定義し、fp_word および fp_digit に独自のカスタム typedef を割り当てる必要があります。 + +一部の操作で利用可能な場合、wolfSSL は 64 ビット型を使用します。 wolfSSL ビルドは、SIZEOF_LONG と SIZEOF_LONG_LONG の設定に基づいて、word64 の正しい基本データ型を検出して設定しようとします。 2 つの 32 ビット型が一緒に使用される、真の 64 ビット型を持たない一部のプラットフォームでは、パフォーマンスが低下する可能性があります。 64 ビット型の使用をコンパイルするには、NO_64BIT を定義します。 + +## エンディアン + +Q:このセクションが必要なのはどういう場合?
+ +A: プラットフォームがビッグエンディアンの場合です + +あなたのプラットフォームはビッグエンディアン、リトルエンディアン、どちらですか?
+ wolfSSLはデフォルトではリトルエンディアンシステムです。システムがビッグエンディアンの場合は、wolfSSLをビルドするときにBIG_ENDIAN_ORDERを定義してください。これをsettings.hで設定する例: + + +``` +#ifdef MY_NEW_PLATFORM + ... + #define BIG_ENDIAN_ORDER + ... +#endif +``` + +## writev + +Q:このセクションが必要なのはどういう場合?
+A: が提供されていない場合です + +デフォルトでは、wolfSSL APIはアプリケーションに対してwritev関数のセマンティクスをシミュレートするwolfSSL_writev()を提供します。使用可能なヘッダーを持たないシステムでは、この機能を除外するためにNO_WRITEVを定義してください。 + + +## (ネットワーク) 入出力 + +Q:どういう場合このセクションが必要ですか?
+A:BSDスタイルのソケットAPIが使用できない場合。また、特別なポート層またはTCP/IPスタックを使用したい場合、静的バッファーのみを使用したい場合です。 + +wolfSSLはデフォルトではBSDスタイルのソケットインターフェイスを使用します。トランスポート層がBSDソケットインタフェースを提供する場合、カスタムヘッダが必要な場合を除いて、wolfSSLはそのままの状態で統合する必要があります。 + +wolfSSLは、ユーザーがシステムにwolfSSLのI / O機能を合わせることが可能となるようにカスタムI / O抽象レイヤーを提供しています。詳細は、wolfSSLマニュアルのセクション5.1.2にあります。 + +単に、ビルド時オプションに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バイトです。 + + +## ファイルシステム + +Q:どういう場合このセクションが必要ですか?
+A: 使用可能なファイルシステムがない場合、標準のファイルシステム機能が使用できない場合、または、カスタムファイルシステムを使用する場合です。 + +wolfSSLは鍵と証明書をSSLセッションまたはコンテキストにロードするためにファイルシステムを使用します。 wolfSSLでは、これらをメモリバッファからロードすることもできます。メモリバッファだけを使用する場合、ファイルシステムは必要ありません。 + +ライブラリをビルドするときにNO_FILESYSTEMを定義することにより、ファイルシステムの使用を無効にすることができます。この場合、ファイルではなくメモリバッファから証明書と鍵をロードする必要があります。これをsettings.hで設定する例: + + +``` +#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 +#define XFILE FS_FILE* +#define XFOPEN fs_fopen +#define XFSEEK fs_fseek +#define XFTELL fs_ftell +#define XREWIND fs_rewind +#define XFREAD fs_fread +#define XFCLOSE fs_fclose +#define XSEEK_END FS_SEEK_END +#define XBADFILE NULL +``` + +## スレッド + +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など)を例として検索します。 + + +## 乱数シード + +Q:どういう場合このセクションが必要ですか?
+A:/dev/randomまたは/dev/urandomのいずれかが利用できないか、RNGハードウェアを統合したい場合です。 + +デフォルトでは、wolfSSLは/dev/urandomまたは/dev/randomを使用してRNGシードを生成します。 NO_DEV_RANDOMの定義は、デフォルトのwc_GenerateSeed()関数を無効にするwときにビルド時に指定します。これが指定されている場合は、ターゲットプラットフォームに固有の./wolfcrypt/src/random.cにカスタムwc_GenerateSeed()関数を記述する必要があります。これにより、ハードウェアベースのランダムエントロピーソースがあれば、wolfSSLのPRNGにシードすることができます。 + +Wc_GenerateSeed関数をどのように記述する必要があるかの例については、wolfSSLの既存のwc_GenerateSeed関数の実装を./wolfcrypt/src/random.cで参照してください。 + + + +## メモリー + +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内に定義することができます。 + +XMALLOC_USERの使用方法の詳細については、wolfSSLマニュアルのセクション5.1.1.1を参照してください。 + +https://wolfssl.com/wolfSSL/Docs-wolfssl-manual-5-portability.html + +## 時計       + +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()関数を参照してください。 + + +## C標準ライブラリ +Q:どういう場合このセクションが必要ですか?
+A:C標準ライブラリがない場合、またはカスタムライブラリを使用する場合です。 + +wolfSSLは、C標準ライブラリを使用しなくても、開発者がより高いレベルの移植性と柔軟性を得ることができます。そのようなとき、ユーザーはC標準のものの代わりに使用したい機能をマップする必要があります。 + +上のセクション2.8では、メモリ機能について説明しました。メモリ関数の抽象化に加えて、wolfSSLは文字列関数と数学関数も抽象化します。それぞれの関数は抽象化される関数の名前に対応してXの形で定義されます。 + +詳細については、wolfSSLマニュアルのセクション5.1をお読みください。 + +https://www.wolfssl.com/wolfSSL/Docs-wolfssl-manual-5-portability.html + +## ロギング +Q:どういう場合このセクションが必要ですか?
+A:デバッグメッセージを有効にしたいが、stderrは使用できません。 + +デフォルトでは、wolfSSLはstderrを介してデバッグ出力を提供します。デバッグメッセージを有効にするには、wolfSSLをDEBUG_WOLFSSLでコンパイルし、wolfSSL_Debugging_ON()をアプリケーションコードから呼び出す必要があります。 wolfSSL_Debugging_OFF()は、アプリケーション層がwolfSSLデバッグメッセージをオフにするために使用できます。 + +stdderが利用できない環境や、デバッグメッセージを別の出力ストリームや別の形式で出力したい場合、wolfSSLではアプリケーションはロギングコールバックに登録できます。 + +詳細については、wolfSSLマニュアルの第8.1節をお読みください。 + +https://www.wolfssl.com/wolfSSL/Docs-wolfssl-manual-8-debugging.html + +## 公開鍵演算 + +Q:どういう場合このセクションが必要ですか?
+ +A:wolfSSLで独自の公開鍵実装を使用したいとします。 + +wolfSSLを使用すると、SSL / TLS層が公開鍵操作を行う必要があるときに呼び出される独自の公開鍵コールバックをユーザーが書くことができます。ユーザーはオプションで6つの関数を定義できます。 + +- ECC符号コールバック +- ECC検証コールバック +- RSA署名コールバック +- RSA検証コールバック +- RSA暗号化コールバック +- RSA復号化コールバック + +詳細は、wolfSSLマニュアルのセクション6.4を参照してください。 + +https://www.wolfssl.com/wolfSSL/Docs-wolfssl-manual-6-callbacks.html + +## アトミックレコード層処理 + +Q:どういう場合このセクションが必要ですか?
+A:TLSレコード層の独自の処理、特にMAC /暗号化と解読/検証操作を行いたい場合です。 + +デフォルトでは、wolfSSLは、暗号化ライブラリwolfCryptを使用して、ユーザーのTLSレコード層処理を処理します。 wolfSSLは、MAC /暗号化をより詳細に制御し、SSL / TLS接続を復号/検証したい場合、アトミックレコード処理コールバックを使用します。 + +ユーザーは2つの関数を定義する必要があります: + +MAC /暗号化コールバック関数 +コールバック関数の復号化/検証 + +詳細は、wolfSSLマニュアルのセクション6.3を参照してください。 + +https://www.wolfssl.com/wolfSSL/Docs-wolfssl-manual-6-callbacks.html + +## 機能 + +Q:どういう場合このセクションが必要ですか?
+A:機能を無効にする場合。 + +適切な定義を使用してwolfSSLをビルドするとき、機能を無効にすることができます。利用可能な定義のリストについては、wolfSSL Manualの第2章を参照してください。 + +https://www.wolfssl.com/wolfSSL/Docs-wolfssl-manual-2-building-wolfssl.html diff --git a/wolfSSL-Porting/src-ja/section03.md b/wolfSSL-Porting/src-ja/section03.md new file mode 100644 index 00000000..4545c852 --- /dev/null +++ b/wolfSSL-Porting/src-ja/section03.md @@ -0,0 +1,11 @@ +# 次のステップ +## wolfCryptテストアプリケーション + +wolfSSLをターゲットプラットフォーム上に適切に構築した後、wolfCryptテストアプリケーションには良い次のステップがあります。このアプリケーションをターゲットシステムで実行すると、NISTテストベクタを使用して、すべての暗号アルゴリズムが正しく動作していることが確認されます。 + +この手順をスキップしてSSL接続の確立に直接進むと、基になる暗号化操作が失敗したために発生した問題をデバッグするのがより困難になります。 + +wolfCryptテストアプリケーションは、./wolfcrypt/test/test.cにあります。埋め込みアプリケーションに独自のmain()関数がある場合、./wolfcrypt/test/test.cをコンパイルするときにNO_MAIN_DRIVERを定義することができます。これにより、アプリケーションのmain()はそれぞれの暗号/アルゴリズムテストを個別に呼び出すことができます。 + +組み込みデバイスにwolfCryptテストアプリケーション全体を実行するのに十分なリソースがない場合、個々のテストをtest.cから抜き出して個別にコンパイルすることができます。 test.cから隔離された暗号テストを抽出する際に、ビルドに含まれる特定のテストケースに必要な正しいヘッダファイルがあることを確認してください。 + diff --git a/wolfSSL-Porting/src-ja/section04.md b/wolfSSL-Porting/src-ja/section04.md new file mode 100644 index 00000000..8ffbac25 --- /dev/null +++ b/wolfSSL-Porting/src-ja/section04.md @@ -0,0 +1,30 @@ +# サポート +一般的なサポートに関する質問は、電子メール、サポートフォーラムを介してwolfSSLに直接送信することができます。 + +ウェブサイト:https://www.wolfssl.com, https://www.wolfssl.jp (日本語) +サポートメール:support@wolfssl.com (日本語可) +フォーラム:http://www.wolfssl.com/forums + +wolfSSLは、お客様が新しい環境にwolfSSLを移植できるためのサポートパッケージとコンサルティングサービスを提供しています。 + + +wolfSSLは、お客様が新しい環境にwolfSSLを移植できるためのサポートパッケージとコンサルティングサービスを提供しています。 + +- Support Packages: https://wolfssl.jp/license/support-packages/ +- Consulting Services: https://www.wolfssl.com/wolfSSL/wolfssl-consulting.html +- General Inquiries: info@wolfssl.com + +## Document Revision Log + +| Version | Date | Author | Notes | +| :---: | :--------: | ------------- | ---------------------------------------- | +|1.0|11/13/2012|Chris Conlon|Document Created| +|1.2|10/24/2013|Chris Conlon|Content Update| +|1.4|11/06/2013|Chris Conlon|Name change, clairty on filesystem, RNG, memory usage| +|1.5|12/23/2014|Chris Conlon|Content cleanup| +|1.6|05/05/2015|Chris Conlon|Update URLs| +|1.7|10/02/2015|Chris Conlon|Update CTaoCrypt to wolfCrypt references| +|1.8|01/19/2016|Chris Conlon|Document user\_settings.h| +|1.9|03/02/2016|Chris Conlon|Expand data types, add Consulting Services| +|1.9j|10/01/2018|Takashi Kojo|Japanese version| +|1.10|12/30/2022|John Safranek|Initial markdown revision| From ffb429d60df835904b05ed47218605cd82b7f737 Mon Sep 17 00:00:00 2001 From: Takashi Kojo Date: Mon, 30 Jan 2023 16:26:03 +0900 Subject: [PATCH 2/2] Minor fixes --- wolfSSL-Porting/src-ja/section01.md | 2 +- wolfSSL-Porting/src-ja/section02.md | 10 +++++----- wolfSSL-Porting/src-ja/section04.md | 3 --- 3 files changed, 6 insertions(+), 9 deletions(-) diff --git a/wolfSSL-Porting/src-ja/section01.md b/wolfSSL-Porting/src-ja/section01.md index 6f3dd58d..bd314781 100644 --- a/wolfSSL-Porting/src-ja/section01.md +++ b/wolfSSL-Porting/src-ja/section01.md @@ -8,7 +8,7 @@ wolfSSLマニュアルの第2章の手順とは別に、特定のプラットフ ## 想定する読者 -のガイドは、デフォルトでサポートされていない新しいプラットフォームまたは環境に wolfSSL および wolfCrypt を移植する開発者またはエンジニアを対象としています。 +このガイドは、デフォルトでサポートされていない新しいプラットフォームまたは環境に wolfSSL および wolfCrypt を移植する開発者またはエンジニアを対象としています。 ## 概要 diff --git a/wolfSSL-Porting/src-ja/section02.md b/wolfSSL-Porting/src-ja/section02.md index 4ffbadce..ce2cdaf6 100644 --- a/wolfSSL-Porting/src-ja/section02.md +++ b/wolfSSL-Porting/src-ja/section02.md @@ -15,7 +15,7 @@ wolfSSLは、64ビットタイプが利用可能の場合、スピードに恩 #endif ``` -There are two additional data types used by wolfSSL and wolfCrypt, called “word32” and “word16”. The default type mappings for these are: +「word32」と「word16」と呼ばれる、wolfSSL と wolfCrypt で使用される二つの追加のデータ型があります。 これらのデフォルトのタイプ マッピングは次のとおりです: ``` #ifndef WOLFSSL_TYPES @@ -34,7 +34,7 @@ wolfSSL の fastmath ライブラリは、「fp_digit」および「fp_word」 「fp_word」は「fp_digit」の 2 倍のサイズにする必要があります。 デフォルトのケースがプラットフォームに当てはまらない場合は、settings.h または user_settings.h で WOLFSSL_BIGINT_TYPES を定義し、fp_word および fp_digit に独自のカスタム typedef を割り当てる必要があります。 -一部の操作で利用可能な場合、wolfSSL は 64 ビット型を使用します。 wolfSSL ビルドは、SIZEOF_LONG と SIZEOF_LONG_LONG の設定に基づいて、word64 の正しい基本データ型を検出して設定しようとします。 2 つの 32 ビット型が一緒に使用される、真の 64 ビット型を持たない一部のプラットフォームでは、パフォーマンスが低下する可能性があります。 64 ビット型の使用をコンパイルするには、NO_64BIT を定義します。 +一部の操作で利用可能な場合、wolfSSL は 64 ビット型を使用します。 wolfSSL ビルドは、SIZEOF_LONG と SIZEOF_LONG_LONG の設定に基づいて、word64 の正しい基本データ型を検出して設定しようとします。 2 つの 32 ビット型が一緒に使用される、真の 64 ビット型を持たない一部のプラットフォームでは、パフォーマンスが低下する可能性があります。 64 ビット型を使用しないでコンパイルするには、NO_64BIT を定義します。 ## エンディアン @@ -136,9 +136,9 @@ wolfSSLをマルチスレッド環境で使用する必要がある場合は、w Q:どういう場合このセクションが必要ですか?
A:/dev/randomまたは/dev/urandomのいずれかが利用できないか、RNGハードウェアを統合したい場合です。 -デフォルトでは、wolfSSLは/dev/urandomまたは/dev/randomを使用してRNGシードを生成します。 NO_DEV_RANDOMの定義は、デフォルトのwc_GenerateSeed()関数を無効にするwときにビルド時に指定します。これが指定されている場合は、ターゲットプラットフォームに固有の./wolfcrypt/src/random.cにカスタムwc_GenerateSeed()関数を記述する必要があります。これにより、ハードウェアベースのランダムエントロピーソースがあれば、wolfSSLのPRNGにシードすることができます。 +デフォルトでは、wolfSSLは/dev/urandomまたは/dev/randomを使用してRNGシードを生成します。 NO_DEV_RANDOMの定義は、デフォルトのwc_GenerateSeed()関数を無効にするときにビルド時に指定します。これが指定されている場合は、ターゲットプラットフォームに固有の./wolfcrypt/src/random.cにカスタムwc_GenerateSeed()関数を記述する必要があります。これにより、ハードウェアベースのランダムエントロピーソースがあれば、wolfSSLのPRNGにシードすることができます。 -Wc_GenerateSeed関数をどのように記述する必要があるかの例については、wolfSSLの既存のwc_GenerateSeed関数の実装を./wolfcrypt/src/random.cで参照してください。 +wc_GenerateSeed関数をどのように記述する必要があるかの例については、wolfSSLの既存のwc_GenerateSeed関数の実装を./wolfcrypt/src/random.cで参照してください。 @@ -205,7 +205,7 @@ A:wolfSSLで独自の公開鍵実装を使用したいとします。 wolfSSLを使用すると、SSL / TLS層が公開鍵操作を行う必要があるときに呼び出される独自の公開鍵コールバックをユーザーが書くことができます。ユーザーはオプションで6つの関数を定義できます。 -- ECC符号コールバック +- ECC復号コールバック - ECC検証コールバック - RSA署名コールバック - RSA検証コールバック diff --git a/wolfSSL-Porting/src-ja/section04.md b/wolfSSL-Porting/src-ja/section04.md index 8ffbac25..e50cd978 100644 --- a/wolfSSL-Porting/src-ja/section04.md +++ b/wolfSSL-Porting/src-ja/section04.md @@ -5,9 +5,6 @@ サポートメール:support@wolfssl.com (日本語可) フォーラム:http://www.wolfssl.com/forums -wolfSSLは、お客様が新しい環境にwolfSSLを移植できるためのサポートパッケージとコンサルティングサービスを提供しています。 - - wolfSSLは、お客様が新しい環境にwolfSSLを移植できるためのサポートパッケージとコンサルティングサービスを提供しています。 - Support Packages: https://wolfssl.jp/license/support-packages/