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 互換ビルド時
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 を定義して、これを行うことができます。
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
注意: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のいずれかを使用するには、上記の手順
と同じ手順を実行しますが、「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番目のパラメータは最終的なダイジェストサイズにする必要がありま す。 ダイジェストには、バッファ内のハッシュされたデータのダイジェストが含まれるよ うになりました。
使用例は、blake2b_test() 関数内のwolfCryptテスト・アプリケーション(wolfcrypt / test / test.c)にあります。