コンテンツにスキップ

wolfSSL接続、セッション、I/O

Functions

Name
long wolfSSL_get_verify_depth(WOLFSSL * ssl)
この関数は、有効なセッション(つまり、非NULLのセッションオブジェクト(ssl)が存在する場合)に対して許可される最大チェーン深度を返します。デフォルトは9です。
char * wolfSSL_get_cipher_list(int priority)
渡された優先度レベルでの暗号の名前を取得します。
int wolfSSL_get_ciphers(char * buf, int len)
この関数は、wolfSSLで有効になっている暗号を取得します。
const char * wolfSSL_get_cipher_name(WOLFSSL * ssl)
この関数は、引数をwolfSSL_get_cipher_name_internalに渡すことによって、DHE-RSA形式で暗号名を取得します。
int wolfSSL_get_fd(const WOLFSSL * )
この関数は、SSL接続の入力機能として使用される読み取りファイル記述子(fd)を返します。通常、これはソケットファイル記述子になります。
int wolfSSL_get_wfd(const WOLFSSL * )
この関数は、SSL接続の出力機能として使用される書き込みファイルディスクリプタ(fd)を返します。通常はソケットファイルディスクリプタになります。
int wolfSSL_get_using_nonblock(WOLFSSL * )
この関数により、アプリケーションはwolfSSLがノンブロッキングI/Oを使用しているかどうかを判定できます。wolfSSLがノンブロッキングI/Oを使用している場合、この関数は1を返し、それ以外の場合は0を返します。アプリケーションがWOLFSSLオブジェクトを作成した後、それをノンブロッキングソケットと共に使用する場合は、wolfSSL_set_using_nonblock()を呼び出してください。これにより、WOLFSSLオブジェクトは、EWOULDBLOCKを受け取ることがタイムアウトではなく、recvfrom呼び出しがブロックすることを意味すると認識できます。
int wolfSSL_write(WOLFSSL * ssl, const void * data, int sz)
この関数は、バッファdataからszバイトをSSL接続sslに書き込みます。必要に応じて、wolfSSL_connect()またはwolfSSL_accept()によってハンドシェイクがまだ実行されていない場合、wolfSSL_write()はSSL/TLSセッションをネゴシエートします。(D)TLSv1.3を使用していてearly data機能がコンパイルされている場合、この関数はデータ送信が可能になるまでハンドシェイクを進めます。次のwolfSSL_Connect()、wolfSSL_Accept()、wolfSSL_read()の呼び出しでハンドシェイクが完了します。wolfSSL_write()は、ブロッキングとノンブロッキングの両方のI/Oで動作します。下層のI/Oがノンブロッキングの場合、wolfSSL_write()は、下層のI/OがwolfSSL_write()を継続するために必要な要求を満たせなくなった時点で返されます。この場合、wolfSSL_get_error()を呼び出すと、SSL_ERROR_WANT_READまたはSSL_ERROR_WANT_WRITEのいずれかが返されます。呼び出し側プロセスは、下層のI/Oの準備ができたら、wolfSSL_write()の呼び出しを繰り返す必要があります。下層のI/Oがブロッキングの場合、wolfSSL_write()は、サイズszのバッファデータが完全に書き込まれるか、エラーが発生するまで返されません。
int wolfSSL_read(WOLFSSL * ssl, void * data, int sz)
この関数は、SSLセッション(ssl)の内部読み取りバッファからszバイトをバッファdataに読み込みます。読み取られたバイトは内部受信バッファから削除されます。必要に応じて、wolfSSL_connect()またはwolfSSL_accept()によってハンドシェイクがまだ実行されていない場合、wolfSSL_read()はSSL/TLSセッションをネゴシエートします。SSL/TLSプロトコルは、最大サイズが16kBのSSLレコードを使用します(最大レコードサイズは、/wolfssl/internal.h内のMAX_RECORD_SIZE定義で制御できます)。そのため、wolfSSLは、レコードを処理および復号できるようになる前に、SSLレコード全体を内部的に読み取る必要があります。このため、wolfSSL_read()の呼び出しは、呼び出し時に復号された最大バッファサイズのみを返すことができます。内部wolfSSL受信バッファには、まだ復号されていない追加データが待機している可能性があり、これは次のwolfSSL_read()呼び出しで取得および復号されます。szが内部読み取りバッファ内のバイト数よりも大きい場合、SSL_read()は内部読み取りバッファ内で利用可能なバイトを返します。内部読み取りバッファにまだバイトがバッファリングされていない場合、wolfSSL_read()の呼び出しは次のレコードの処理をトリガします。
int wolfSSL_peek(WOLFSSL * ssl, void * data, int sz)
この関数は、SSLセッション(ssl)の内部読み取りバッファからszバイトをバッファdataにコピーします。この関数は、内部SSLセッション受信バッファ内のデータが削除または変更されない点を除いて、wolfSSL_read()と同じです。wolfSSL_read()と同様に、必要に応じて、wolfSSL_connect()またはwolfSSL_accept()によってハンドシェイクがまだ実行されていない場合、wolfSSL_peek()はSSL/TLSセッションをネゴシエートします。SSL/TLSプロトコルは、最大サイズが16kBのSSLレコードを使用します(最大レコードサイズは、/wolfssl/internal.h内のMAX_RECORD_SIZE定義で制御できます)。そのため、wolfSSLは、レコードを処理および復号できるようになる前に、SSLレコード全体を内部的に読み取る必要があります。このため、wolfSSL_peek()の呼び出しは、呼び出し時に復号された最大バッファサイズのみを返すことができます。内部wolfSSL受信バッファには、まだ復号されていない追加データが待機している可能性があり、これは次のwolfSSL_peek()またはwolfSSL_read()呼び出しで取得および復号されます。szが内部読み取りバッファ内のバイト数よりも大きい場合、SSL_peek()は内部読み取りバッファ内で利用可能なバイトを返します。内部読み取りバッファにまだバイトがバッファリングされていない場合、wolfSSL_peek()の呼び出しは次のレコードの処理をトリガします。
int wolfSSL_accept(WOLFSSL * )
この関数はサーバ側で呼び出され、SSLクライアントがSSL/TLSハンドシェイクを開始するのを待機します。この関数が呼び出されるとき、下層の通信チャネルはすでに設定されています。wolfSSL_accept()は、ブロッキングとノンブロッキングの両方のI/Oで動作します。下層のI/Oがノンブロッキングの場合、wolfSSL_accept()は、下層のI/OがwolfSSL_acceptがハンドシェイクを継続するために必要な要求を満たせなくなった時点で返されます。この場合、wolfSSL_get_error()を呼び出すと、SSL_ERROR_WANT_READまたはSSL_ERROR_WANT_WRITEのいずれかが返されます。呼び出し側プロセスは、データの読み取りが可能になったらwolfSSL_accept()の呼び出しを繰り返す必要があり、wolfSSLは中断した箇所から再開します。ノンブロッキングソケットを使用する場合、何もする必要はありませんが、select()を使用して必要な条件を確認できます。下層のI/Oがブロッキングの場合、wolfSSL_accept()は、ハンドシェイクが完了するか、エラーが発生するまで返されません。
int wolfDTLS_accept_stateless(WOLFSSL * ssl)
この関数はサーバ側で呼び出され、SSLクライアントがDTLSハンドシェイクを開始するのをステートレスに待機します。
int wolfSSL_send(WOLFSSL * ssl, const void * data, int sz, int flags)
この関数は、指定されたフラグを使用して、バッファdataからszバイトをSSL接続sslに書き込みます。必要に応じて、wolfSSL_connect()またはwolfSSL_accept()によってハンドシェイクがまだ実行されていない場合、wolfSSL_send()はSSL/TLSセッションをネゴシエートします。wolfSSL_send()は、ブロッキングI/OとノンブロッキングI/Oの両方で動作します。基盤となるI/Oがノンブロッキングの場合、基盤となるI/OがwolfSSL_sendの継続に必要な要求を満たせなかった場合、wolfSSL_send()は戻ります。この場合、wolfSSL_get_error()を呼び出すと、SSL_ERROR_WANT_READまたはSSL_ERROR_WANT_WRITEのいずれかが返されます。呼び出し側プロセスは、基盤となるI/Oの準備ができたときに、wolfSSL_send()の呼び出しを繰り返す必要があります。基盤となるI/Oがブロッキングの場合、wolfSSL_send()は、サイズszのバッファdataが完全に書き込まれるか、エラーが発生するまで戻りません。
int wolfSSL_recv(WOLFSSL * ssl, void * data, int sz, int flags)
この関数は、指定されたフラグを使用して、SSLセッション(ssl)の内部読み取りバッファからszバイトをバッファdataに読み込みます。読み取られたバイトは、内部受信バッファから削除されます。この関数は、基盤となる読み取り操作のrecvフラグをアプリケーションが設定できる点を除いて、wolfSSL_read()と同じです。必要に応じて、wolfSSL_connect()またはwolfSSL_accept()によってハンドシェイクがまだ実行されていない場合、wolfSSL_recv()はSSL/TLSセッションをネゴシエートします。SSL/TLSプロトコルは、最大サイズ16kBのSSLレコードを使用します(最大レコードサイズは、/wolfssl/internal.hのMAX_RECORD_SIZE定義で制御できます)。そのため、wolfSSLは、レコードを処理および復号する前に、内部でSSLレコード全体を読み取る必要があります。このため、wolfSSL_recv()の呼び出しは、呼び出し時に復号された最大バッファサイズのみを返すことができます。まだ復号されていない追加データが内部wolfSSL受信バッファで待機している可能性があり、次回のwolfSSL_recv()呼び出しで取得および復号されます。szが内部読み取りバッファのバイト数より大きい場合、SSL_recv()は内部読み取りバッファで利用可能なバイトを返します。内部読み取りバッファにまだバッファリングされているバイトがない場合、wolfSSL_recv()の呼び出しは次のレコードの処理をトリガーします。
int wolfSSL_get_alert_history(WOLFSSL * ssl, WOLFSSL_ALERT_HISTORY * h)
この関数はアラート履歴を取得します。
WOLFSSL_SESSION * wolfSSL_get_session(WOLFSSL * ssl)
NO_SESSION_CACHE_REFが定義されている場合、この関数はsslで使用されている現在のセッション(WOLFSSL_SESSION)へのポインタを返します。この関数は、WOLFSSL_SESSIONオブジェクトへの非永続的なポインタを返します。返されたポインタは、wolfSSL_freeが呼び出されたときに解放されます。この呼び出しは、現在のセッションを検査または変更するためにのみ使用する必要があります。セッション再開には、wolfSSL_get1_session()を使用することをお勧めします。後方互換性のため、NO_SESSION_CACHE_REFが定義されていない場合、この関数はローカルキャッシュに格納されている永続的なセッションオブジェクトポインタを返します。キャッシュサイズは有限であり、アプリケーションがwolfSSL_set_session()を呼び出すまでに、別のssl接続によってセッションオブジェクトが上書きされるリスクがあります。アプリケーションでNO_SESSION_CACHE_REFを定義し、セッション再開にwolfSSL_get1_session()を使用することをお勧めします。
void wolfSSL_flush_sessions(WOLFSSL_CTX * ctx, long tm)
この関数は、期限切れのセッションをセッションキャッシュからフラッシュします。時刻tmは、時刻比較に使用されます。wolfSSLは現在セッションに静的テーブルを使用しているため、フラッシュは不要です。そのため、この関数は現在スタブにすぎません。この関数は、wolfSSLがOpenSSL互換レイヤーでコンパイルされている場合、OpenSSL互換性(SSL_flush_sessions)を提供します。
int wolfSSL_GetSessionIndex(WOLFSSL * ssl)
この関数は、WOLFSSL構造体のセッションインデックスを取得します。
int wolfSSL_GetSessionAtIndex(int idx, WOLFSSL_SESSION * session)
この関数はセッションキャッシュの指定されたインデックスにあるセッションを取得し、メモリにコピーします。WOLFSSL_SESSION構造体はセッション情報を保持します。
WOLFSSL_X509_CHAIN * wolfSSL_SESSION_get_peer_chain(WOLFSSL_SESSION * session)
WOLFSSL_SESSION構造体からピア証明書チェーンを返します。
int wolfSSL_pending(WOLFSSL * )
この関数はSSLオブジェクト内でバッファリングされ、wolfSSL_read()によって読み取り可能な利用可能なバイト数を返します。
int wolfSSL_save_session_cache(const char * fname)
この関数は、セッションキャッシュをファイルに永続化します。追加のメモリ使用量のため、memsaveは使用しません。
int wolfSSL_restore_session_cache(const char * fname)
この関数は、永続的なセッションキャッシュをファイルから復元します。追加のメモリ使用量のため、memstoreは使用しません。
int wolfSSL_memsave_session_cache(void * mem, int sz)
この関数は、セッションキャッシュをメモリに永続化します。
int wolfSSL_memrestore_session_cache(const void * mem, int sz)
この関数は、永続的なセッションキャッシュをメモリから復元します。
int wolfSSL_get_session_cache_memsize(void )
この関数は、セッションキャッシュの保存バッファがどのくらい大きくあるべきかを返します。
int wolfSSL_session_reused(WOLFSSL * ssl)
この関数はoptions構造体のresumingメンバを返します。このフラグはセッションを再利用するかどうかを示します。再利用しない場合、新しいセッションを確立する必要があります。
const char * wolfSSL_get_version(WOLFSSL * ssl)
使用されているSSLバージョンを文字列として返します。
int wolfSSL_get_current_cipher_suite(WOLFSSL * ssl)
sslセッションが使用している現在の暗号スイートを返します。
WOLFSSL_CIPHER * wolfSSL_get_current_cipher(WOLFSSL * ssl)
この関数はsslセッション内の現在の暗号へのポインタを返します。
const char * wolfSSL_CIPHER_get_name(const WOLFSSL_CIPHER * cipher)
この関数はSSLオブジェクト内の暗号スイートを利用可能なスイートと照合し、文字列表現を返します。
const char * wolfSSL_get_cipher(WOLFSSL * )
この関数はSSLオブジェクト内の暗号スイートを利用可能なスイートと照合します。
int wolfSSL_BIO_get_mem_data(WOLFSSL_BIO * bio, void * p)
これは、内部メモリバッファの先頭にバイトポインタを設定するために使用されます。
long wolfSSL_BIO_set_fd(WOLFSSL_BIO * b, int fd, int flag)
bioが使用するファイルディスクリプタを設定します。
int wolfSSL_BIO_set_close(WOLFSSL_BIO * b, long flag)
クローズフラグを設定します。これは、BIOが解放される際にI/Oストリームをクローズすべきかを示すために使用されます。
WOLFSSL_BIO_METHOD * wolfSSL_BIO_s_socket(void )
これは、BIO_SOCKETタイプのWOLFSSL_BIO_METHODを取得するために使用されます。
int wolfSSL_BIO_set_write_buf_size(WOLFSSL_BIO * b, long size)
これは、WOLFSSL_BIOの書き込みバッファのサイズを設定するために使用されます。書き込みバッファが以前に設定されていた場合、この関数はサイズをリセットする際にそれを解放します。これは、読み取りと書き込みのインデックスを0にリセットする点でwolfSSL_BIO_resetに似ています。
int wolfSSL_BIO_make_bio_pair(WOLFSSL_BIO * b1, WOLFSSL_BIO * b2)
これは、2つのbioをペアにするために使用されます。ペアになったbioは双方向パイプのように動作し、一方への書き込みはもう一方から読み取ることができ、その逆も同様です。両方のbioが同じスレッドにあることが期待されます。この関数はスレッドセーフではありません。2つのbioのうちの1つを解放すると、両方のペアが解除されます。いずれかのbioに書き込みバッファサイズが以前に設定されていなかった場合、ペアになる前にデフォルトサイズの17000(WOLFSSL_BIO_SIZE)に設定されます。
int wolfSSL_BIO_ctrl_reset_read_request(WOLFSSL_BIO * bio)
これは、読み取り要求フラグを0に戻すために使用されます。
int wolfSSL_BIO_nread0(WOLFSSL_BIO * bio, char ** buf)
これは、読み取り用のバッファポインタを取得するために使用されます。wolfSSL_BIO_nreadとは異なり、内部読み取りインデックスは関数呼び出しから返される数だけ進められません。返される値を超えて読み取ると、配列の境界外を読み取る結果になる可能性があります。
int wolfSSL_BIO_nread(WOLFSSL_BIO * bio, char ** buf, int num)
これは、読み取り用のバッファポインタを取得するために使用されます。内部読み取りインデックスは、関数呼び出しから返される数だけ進められ、bufは読み取るバッファの先頭を指します。読み取りバッファ内のバイト数がnumで要求された値より少ない場合、より小さい値が返されます。返される値を超えて読み取ると、配列の境界外を読み取る結果になる可能性があります。
int wolfSSL_BIO_nwrite(WOLFSSL_BIO * bio, char ** buf, int num)
関数が返す数だけのバイトを書き込むためのバッファへのポインタを取得します。返される値よりも多くのバイトを返されたポインタに書き込むと、境界外への書き込みになる可能性があります。
int wolfSSL_BIO_reset(WOLFSSL_BIO * bio)
bioを初期状態にリセットします。例えば、BIO_BIOタイプの場合、これは読み取りと書き込みのインデックスをリセットします。
int wolfSSL_BIO_seek(WOLFSSL_BIO * bio, int ofs)
この関数は、ファイルポインタを指定されたオフセットに調整します。これはファイルの先頭からのオフセットです。
int wolfSSL_BIO_write_filename(WOLFSSL_BIO * bio, char * name)
ファイルを設定し、書き込むために使用されます。ファイル内の既存データを上書きし、bioが解放される際にファイルを閉じるよう設定されます。
long wolfSSL_BIO_set_mem_eof_return(WOLFSSL_BIO * bio, int v)
ファイル終端値を設定するために使用されます。一般的な値は-1で、期待される正の値と混同しないようにします。
long wolfSSL_BIO_get_mem_ptr(WOLFSSL_BIO * bio, WOLFSSL_BUF_MEM ** m)
WOLFSSL_BIOメモリポインタのgetter関数です。
const char * wolfSSL_lib_version(void )
この関数は現在のライブラリバージョンを返します。
word32 wolfSSL_lib_version_hex(void )
この関数は現在のライブラリバージョンを16進表記で返します。
int wolfSSL_negotiate(WOLFSSL * ssl)
SSLメソッドの側面に基づいて実際の接続または受け入れを実行します。クライアント側から呼び出された場合はwolfSSL_connect()が実行され、サーバー側から呼び出された場合はwolfSSL_accept()が実行されます。
int wolfSSL_connect_cert(WOLFSSL * ssl)
この関数はクライアント側で呼び出され、ピアの証明書チェーンを取得するのに十分な長さだけサーバーとのSSL/TLSハンドシェイクを開始します。この関数が呼び出されるとき、基礎となる通信チャネルはすでに設定されています。wolfSSL_connect_cert()は、ブロッキングI/Oと非ブロッキングI/Oの両方で動作します。基礎となるI/Oが非ブロッキングの場合、wolfSSL_connect_cert()は、基礎となるI/OがwolfSSL_connect_cert()がハンドシェイクを続行するために必要な処理を満たせないときに戻ります。この場合、wolfSSL_get_error()の呼び出しはSSL_ERROR_WANT_READまたはSSL_ERROR_WANT_WRITEのいずれかを生成します。呼び出しプロセスは、基礎となるI/Oが準備できたときにwolfSSL_connect_cert()の呼び出しを繰り返す必要があり、wolfSSLは中断した場所から再開します。非ブロッキングソケットを使用する場合、何もする必要はありませんが、select()を使用して必要な条件をチェックできます。基礎となるI/OがブロッキングI/Oの場合、wolfSSL_connect_cert()はピアの証明書チェーンが受信されたときにのみ戻ります。
int wolfSSL_writev(WOLFSSL * ssl, const struct iovec * iov, int iovcnt)
writevのセマンティクスをシミュレートしますが、SSL_write()の動作とフロント追加が小さい場合があるため、実際には一度にブロック単位では行いません。writevを使用するソフトウェアへの移植を容易にします。
unsigned char wolfSSL_SNI_Status(WOLFSSL * ssl, unsigned char type)
この関数はSNIオブジェクトのステータスを取得します。
int wolfSSL_UseSecureRenegotiation(WOLFSSL * ssl)
この関数は、提供されたWOLFSSL構造体に対して安全な再ネゴシエーションを強制します。これは推奨されません。
int wolfSSL_Rehandshake(WOLFSSL * ssl)
この関数は安全な再ネゴシエーションハンドシェイクを実行します。wolfSSLはこの機能を推奨していないため、これはユーザが強制するものです。
int wolfSSL_UseSessionTicket(WOLFSSL * ssl)
提供されたWOLFSSL構造体にセッションチケットを使用するよう強制します。定数HAVE_SESSION_TICKETが定義されており、定数NO_WOLFSSL_CLIENTが定義されていない必要があります。
int wolfSSL_get_SessionTicket(WOLFSSL * ssl, unsigned char * buf, word32 * bufSz)
この関数は、Session構造体のticketメンバをバッファにコピーします。bufがNULLでbufSzが非NULLの場合、bufSzはチケット長に設定されます。
int wolfSSL_set_SessionTicket(WOLFSSL * ssl, const unsigned char * buf, word32 bufSz)
この関数は、WOLFSSL構造体内のWOLFSSL_SESSION構造体のticketメンバを設定します。関数に渡されたバッファはメモリにコピーされます。
int wolfSSL_PrintSessionStats(void )
この関数は、セッションの統計情報を出力します。
int wolfSSL_get_session_stats(unsigned int * active, unsigned int * total, unsigned int * peak, unsigned int * maxSessions)
この関数は、セッションの統計情報を取得します。
long wolfSSL_BIO_set_fp(WOLFSSL_BIO * bio, XFILE fp, int c)
これは、BIOの内部ファイルポインタを設定するために使用されます。
long wolfSSL_BIO_get_fp(WOLFSSL_BIO * bio, XFILE * fp)
これは、BIOの内部ファイルポインタを取得するために使用されます。
size_t wolfSSL_BIO_ctrl_pending(WOLFSSL_BIO * b)
読み取り保留中のバイト数を取得します。BIOタイプがBIO_BIOの場合、ペアから読み取るバイト数です。BIOがSSLオブジェクトを含む場合、SSLオブジェクトからの保留中のデータです(wolfSSL_pending(ssl))。BIO_MEMORYタイプの場合、メモリバッファのサイズを返します。
int wolfSSL_set_jobject(WOLFSSL * ssl, void * objPtr)
この関数は、WOLFSSL構造体のjObjectRefメンバを設定します。
void * wolfSSL_get_jobject(WOLFSSL * ssl)
この関数は、WOLFSSL構造体のjObjectRefメンバを返します。
int wolfSSL_connect(WOLFSSL * ssl)
この関数はクライアント側で呼び出され、サーバとのSSL/TLSハンドシェイクを開始します。この関数が呼び出されるとき、基礎となる通信チャネルはすでに設定されています。wolfSSL_connect()は、ブロッキングI/Oと非ブロッキングI/Oの両方で動作します。基礎となるI/Oが非ブロッキングの場合、wolfSSL_connect()は、基礎となるI/OがwolfSSL_connect()がハンドシェイクを続行するために必要とするものを満たすことができないときに返されます。この場合、wolfSSL_get_error()の呼び出しはSSL_ERROR_WANT_READまたはSSL_ERROR_WANT_WRITEを返します。呼び出しプロセスは、基礎となるI/Oの準備ができたときにwolfSSL_connect()の呼び出しを繰り返す必要があり、wolfSSLは中断したところから再開します。非ブロッキングソケットを使用する場合、何もする必要はありませんが、select()を使用して必要な条件を確認できます。基礎となるI/Oがブロッキングの場合、wolfSSL_connect()はハンドシェイクが完了するかエラーが発生するまで返されません。wolfSSLは、OpenSSLとは異なるアプローチで証明書検証を行います。クライアントのデフォルトポリシーはサーバを検証することです。つまり、サーバを検証するためのCAを読み込まない場合、接続エラー、検証不可(_155)が発生します。サーバの検証が失敗してもSSL_connectが成功し、セキュリティを低下させるOpenSSLの動作を模倣したい場合は、SSL_new()を呼び出す前にSSL_CTX_set_verify(ctx, SSL_VERIFY_NONE, 0);を呼び出すことでこれを実現できます。ただし、推奨されません。
int wolfSSL_update_keys(WOLFSSL * ssl)
この関数は、鍵のロールオーバーを強制するために、TLS v1.3クライアントまたはサーバwolfSSLで呼び出されます。KeyUpdateメッセージがピアに送信され、暗号化用の新しい鍵が計算されます。ピアはKeyUpdateメッセージを送り返し、その後新しい復号鍵が計算されます。この関数は、ハンドシェイクが完了した後にのみ呼び出すことができます。
int wolfSSL_key_update_response(WOLFSSL * ssl, int * required)
この関数は、鍵のロールオーバーが進行中かどうかを判断するために、TLS v1.3クライアントまたはサーバwolfSSLで呼び出されます。wolfSSL_update_keys()が呼び出されると、KeyUpdateメッセージが送信され、暗号化鍵が更新されます。復号鍵は、応答を受信したときに更新されます。
int wolfSSL_request_certificate(WOLFSSL * ssl)
この関数は、TLS v1.3クライアントからクライアント証明書を要求します。これは、Webサーバがクライアント認証を必要とするページと必要としないページの両方を提供している場合に便利です。接続上で最大256回の要求を送信できます。
int wolfSSL_connect_TLSv13(WOLFSSL * )
この関数はクライアント側で呼び出され、サーバとのTLS v1.3ハンドシェイクを開始します。この関数が呼び出されるとき、基礎となる通信チャネルはすでに設定されています。wolfSSL_connect()はブロッキングI/Oと非ブロッキングI/Oの両方で動作します。基礎となるI/Oが非ブロッキングの場合、基礎となるI/OがwolfSSL_connect()がハンドシェイクを続行するために必要なものを満たせない場合、wolfSSL_connect()は返されます。この場合、wolfSSL_get_error()を呼び出すとSSL_ERROR_WANT_READまたはSSL_ERROR_WANT_WRITEのいずれかが返されます。呼び出し側プロセスは、基礎となるI/Oの準備ができたときにwolfSSL_connect()の呼び出しを繰り返す必要があり、wolfSSLは中断したところから再開します。非ブロッキングソケットを使用する場合、何もする必要はありませんが、select()を使用して必要な条件を確認できます。基礎となるI/OがブロッキングI/Oの場合、wolfSSL_connect()はハンドシェイクが完了するかエラーが発生するまで返されません。wolfSSLは証明書検証にOpenSSLとは異なるアプローチを取ります。クライアントのデフォルトポリシーはサーバを検証することです。つまり、サーバを検証するためのCAをロードしない場合、接続エラー「検証できません(_155)」が発生します。サーバの検証が失敗してもSSL_connectが成功するというOpenSSLの動作を模倣し、セキュリティを低下させたい場合は、SSL_new()を呼び出す前にSSL_CTX_set_verify(ctx, SSL_VERIFY_NONE, 0)を呼び出すことでこれを行うことができます。ただし、これは推奨されません。
wolfSSL_accept_TLSv13(WOLFSSL * ssl)
この関数はサーバ側で呼び出され、SSL/TLSクライアントがSSL/TLSハンドシェイクを開始するのを待ちます。この関数が呼び出されるとき、基礎となる通信チャネルはすでに設定されています。wolfSSL_accept()はブロッキングI/Oと非ブロッキングI/Oの両方で動作します。基礎となるI/Oが非ブロッキングの場合、基礎となるI/OがwolfSSL_accept()がハンドシェイクを続行するために必要なものを満たせない場合、wolfSSL_accept()は返されます。この場合、wolfSSL_get_error()を呼び出すとSSL_ERROR_WANT_READまたはSSL_ERROR_WANT_WRITEのいずれかが返されます。呼び出し側プロセスは、データが読み取り可能になったときにwolfSSL_acceptの呼び出しを繰り返す必要があり、wolfSSLは中断したところから再開します。非ブロッキングソケットを使用する場合、何もする必要はありませんが、select()を使用して必要な条件を確認できます。基礎となるI/OがブロッキングI/Oの場合、wolfSSL_accept()はハンドシェイクが完了するかエラーが発生するまで返されません。TLS v1.3接続を期待する場合にこの関数を呼び出してください。ただし、古いバージョンのClientHelloメッセージもサポートされています。
int wolfSSL_write_early_data(WOLFSSL * ssl, const void * data, int sz, int * outSz)
この関数は再開時にサーバーにアーリーデータを書き込みます。サーバーに接続してハンドシェイクでデータを送信するには、wolfSSL_connect()またはwolfSSL_connect_TLSv13()の代わりにこの関数を呼び出します。この関数はクライアントでのみ使用されます。
int wolfSSL_read_early_data(WOLFSSL * ssl, void * data, int sz, int * outSz)
この関数は再開時にクライアントからのアーリーデータを読み取ります。クライアントを受け入れ、ハンドシェイクでアーリーデータを読み取るには、wolfSSL_accept()またはwolfSSL_accept_TLSv13()の代わりにこの関数を呼び出します。wolfSSL_is_init_finished()がtrueを返すまで関数を呼び出す必要があります。アーリーデータは複数のメッセージでクライアントから送信される場合があります。アーリーデータがない場合、ハンドシェイクは通常通り処理されます。この関数はサーバーでのみ使用されます。
int wolfSSL_inject(WOLFSSL * ssl, const void * data, int sz)
この関数はWOLFSSLオブジェクトにデータを注入するために呼び出されます。これは、データを単一の場所から読み取り、複数の接続に分割する必要がある場合に便利です。呼び出し元はwolfSSL_read()を呼び出してWOLFSSLオブジェクトから平文データを抽出する必要があります。
void * wolfSSL_GetIOReadCtx(WOLFSSL * ssl)
この関数はWOLFSSL構造体のIOCB_ReadCtxメンバーを返します。
void * wolfSSL_GetIOWriteCtx(WOLFSSL * ssl)
この関数はWOLFSSL構造体のIOCB_WriteCtxメンバーを返します。
void wolfSSL_SetIO_NetX(WOLFSSL * ssl, NX_TCP_SOCKET * nxsocket, ULONG waitoption)
この関数は、WOLFSSL構造体内のnxCtx構造体のnxSocketおよびnxWaitメンバーを設定します。

Functions Documentation

function wolfSSL_get_verify_depth

long wolfSSL_get_verify_depth(
    WOLFSSL * ssl
)

この関数は、有効なセッション(つまり、非NULLのセッションオブジェクト(ssl)が存在する場合)に対して許可される最大チェーン深度を返します。デフォルトは9です。

Parameters:

  • ssl wolfSSL_new()を使用して作成されたWOLFSSL構造体へのポインタ。

See: wolfSSL_CTX_get_verify_depth

Return:

  • WOLFSSL構造体がNULLでない場合はMAX_CHAIN_DEPTHが返されます。デフォルトでは値は9です。
  • WOLFSSL構造体がNULLの場合はBAD_FUNC_ARGが返されます。

Example

WOLFSSL_CTX* ctx = wolfSSL_CTX_new( protocol method );
WOLFSSL* ssl = wolfSSL_new(ctx);
...
long sslDep = wolfSSL_get_verify_depth(ssl);

if(sslDep > EXPECTED){
    // 検証された深度は期待値よりも大きい
} else {
    // 検証された深度は期待値以下
}

function wolfSSL_get_cipher_list

char * wolfSSL_get_cipher_list(
    int priority
)

渡された優先度レベルでの暗号の名前を取得します。

Parameters:

  • priority 暗号の優先度レベルを表す整数。

See:

Return:

  • string 成功
  • 0 優先度が範囲外または無効です。

Example

printf("The cipher at 1 is %s", wolfSSL_get_cipher_list(1));

function wolfSSL_get_ciphers

int wolfSSL_get_ciphers(
    char * buf,
    int len
)

この関数は、wolfSSLで有効になっている暗号を取得します。

Parameters:

  • buf バッファを表すcharポインタ。
  • len バッファの長さ。

See:

Return:

  • SSL_SUCCESS 関数がエラーなく実行された場合に返されます。
  • BAD_FUNC_ARG bufパラメータがNULLまたはlen引数がゼロ以下の場合に返されます。
  • BUFFER_E バッファが十分に大きくなくオーバーフローする場合に返されます。

Example

static void ShowCiphers(void){
    char* ciphers;
    int ret = wolfSSL_get_ciphers(ciphers, (int)sizeof(ciphers));

    if(ret == SSL_SUCCESS){
        printf("%s\n", ciphers);
    }
}

function wolfSSL_get_cipher_name

const char * wolfSSL_get_cipher_name(
    WOLFSSL * ssl
)

この関数は、引数をwolfSSL_get_cipher_name_internalに渡すことによって、DHE-RSA形式で暗号名を取得します。

Parameters:

  • ssl wolfSSL_new()を使用して作成されたWOLFSSL構造体へのポインタ。

See:

Return:

  • string この関数は、マッチした暗号スイートの文字列表現を返します。
  • NULL エラーまたは暗号が見つかりません。

Example

WOLFSSL_CTX* ctx = wolfSSL_CTX_new( protocol method );
WOLFSSL* ssl = wolfSSL_new(ctx);
…
char* cipher = wolfSSL_get_cipher_name(ssl);

if(cipher == NULL){
    // 暗号スイートがマッチしませんでした
} else {
    // 暗号スイートがマッチしました
    printf("%s\n", cipherS);
}

function wolfSSL_get_fd

int wolfSSL_get_fd(
    const WOLFSSL * 
)

この関数は、SSL接続の入力機能として使用される読み取りファイル記述子(fd)を返します。通常、これはソケットファイル記述子になります。

Parameters:

  • ssl wolfSSL_new()で作成されたSSLセッションへのポインタ。

See:

Return: fd 成功した場合、この関数はSSLセッションファイルディスクリプタを返します。

Example

int sockfd;
WOLFSSL* ssl = 0;
...
sockfd = wolfSSL_get_fd(ssl);
...

function wolfSSL_get_wfd

int wolfSSL_get_wfd(
    const WOLFSSL * 
)

この関数は、SSL接続の出力機能として使用される書き込みファイルディスクリプタ(fd)を返します。通常はソケットファイルディスクリプタになります。

Parameters:

  • ssl wolfSSL_new()で作成されたSSLセッションへのポインタ。

See:

Return: fd 成功した場合、この関数はSSLセッションファイルディスクリプタを返します。

Example

int sockfd;
WOLFSSL* ssl = 0;
...
sockfd = wolfSSL_get_wfd(ssl);
...

function wolfSSL_get_using_nonblock

int wolfSSL_get_using_nonblock(
    WOLFSSL * 
)

この関数により、アプリケーションはwolfSSLがノンブロッキングI/Oを使用しているかどうかを判定できます。wolfSSLがノンブロッキングI/Oを使用している場合、この関数は1を返し、それ以外の場合は0を返します。アプリケーションがWOLFSSLオブジェクトを作成した後、それをノンブロッキングソケットと共に使用する場合は、wolfSSL_set_using_nonblock()を呼び出してください。これにより、WOLFSSLオブジェクトは、EWOULDBLOCKを受け取ることがタイムアウトではなく、recvfrom呼び出しがブロックすることを意味すると認識できます。

Parameters:

  • ssl wolfSSL_new()で作成されたSSLセッションへのポインタ。

See: wolfSSL_set_session

Return:

  • 0 下層のI/Oがブロッキングです。
  • 1 下層のI/Oがノンブロッキングです。

Example

int ret = 0;
WOLFSSL* ssl = 0;
...
ret = wolfSSL_get_using_nonblock(ssl);
if (ret == 1) {
    // 下層のI/Oはノンブロッキング
}
...

function wolfSSL_write

int wolfSSL_write(
    WOLFSSL * ssl,
    const void * data,
    int sz
)

この関数は、バッファdataからszバイトをSSL接続sslに書き込みます。必要に応じて、wolfSSL_connect()またはwolfSSL_accept()によってハンドシェイクがまだ実行されていない場合、wolfSSL_write()はSSL/TLSセッションをネゴシエートします。(D)TLSv1.3を使用していてearly data機能がコンパイルされている場合、この関数はデータ送信が可能になるまでハンドシェイクを進めます。次のwolfSSL_Connect()、wolfSSL_Accept()、wolfSSL_read()の呼び出しでハンドシェイクが完了します。wolfSSL_write()は、ブロッキングとノンブロッキングの両方のI/Oで動作します。下層のI/Oがノンブロッキングの場合、wolfSSL_write()は、下層のI/OがwolfSSL_write()を継続するために必要な要求を満たせなくなった時点で返されます。この場合、wolfSSL_get_error()を呼び出すと、SSL_ERROR_WANT_READまたはSSL_ERROR_WANT_WRITEのいずれかが返されます。呼び出し側プロセスは、下層のI/Oの準備ができたら、wolfSSL_write()の呼び出しを繰り返す必要があります。下層のI/Oがブロッキングの場合、wolfSSL_write()は、サイズszのバッファデータが完全に書き込まれるか、エラーが発生するまで返されません。

Parameters:

  • ssl wolfSSL_new()で作成されたSSLセッションへのポインタ。
  • data ピアに送信されるデータバッファ。
  • sz ピアに送信するデータ(data)のサイズ(バイト単位)。

See:

Return:

  • >0 成功時に書き込まれたバイト数。
  • 0 失敗時に返されます。具体的なエラーコードについては、wolfSSL_get_error()を呼び出してください。
  • SSL_FATAL_ERROR エラーが発生した場合、またはノンブロッキングソケットを使用している場合にSSL_ERROR_WANT_READまたはSSL_ERROR_WANT_WRITEエラーを受け取り、アプリケーションがwolfSSL_write()を再度呼び出す必要がある場合に返されます。具体的なエラーコードを取得するには、wolfSSL_get_error()を使用してください。

Example

WOLFSSL* ssl = 0;
char msg[64] = "hello wolfssl!";
int msgSz = (int)strlen(msg);
int flags;
int ret;
...

ret = wolfSSL_write(ssl, msg, msgSz);
if (ret <= 0) {
    // wolfSSL_write()が失敗、wolfSSL_get_error()を呼び出す
}

function wolfSSL_read

int wolfSSL_read(
    WOLFSSL * ssl,
    void * data,
    int sz
)

この関数は、SSLセッション(ssl)の内部読み取りバッファからszバイトをバッファdataに読み込みます。読み取られたバイトは内部受信バッファから削除されます。必要に応じて、wolfSSL_connect()またはwolfSSL_accept()によってハンドシェイクがまだ実行されていない場合、wolfSSL_read()はSSL/TLSセッションをネゴシエートします。SSL/TLSプロトコルは、最大サイズが16kBのSSLレコードを使用します(最大レコードサイズは、/wolfssl/internal.h内のMAX_RECORD_SIZE定義で制御できます)。そのため、wolfSSLは、レコードを処理および復号できるようになる前に、SSLレコード全体を内部的に読み取る必要があります。このため、wolfSSL_read()の呼び出しは、呼び出し時に復号された最大バッファサイズのみを返すことができます。内部wolfSSL受信バッファには、まだ復号されていない追加データが待機している可能性があり、これは次のwolfSSL_read()呼び出しで取得および復号されます。szが内部読み取りバッファ内のバイト数よりも大きい場合、SSL_read()は内部読み取りバッファ内で利用可能なバイトを返します。内部読み取りバッファにまだバイトがバッファリングされていない場合、wolfSSL_read()の呼び出しは次のレコードの処理をトリガします。

Parameters:

  • ssl wolfSSL_new()で作成されたSSLセッションへのポインタ。
  • data wolfSSL_read()が読み取ったデータを格納するバッファ。
  • sz dataに読み込むバイト数。

See:

Return:

  • >0 成功時に読み取られたバイト数。
  • 0 失敗時に返されます。これは、クリーンシャットダウン(close notifyアラート)またはピアが接続を閉じたことが原因である可能性があります。具体的なエラーコードについては、wolfSSL_get_error()を呼び出してください。
  • SSL_FATAL_ERROR エラーが発生した場合、またはノンブロッキングソケットを使用している場合にSSL_ERROR_WANT_READまたはSSL_ERROR_WANT_WRITEエラーを受け取り、アプリケーションがwolfSSL_read()を再度呼び出す必要がある場合に返されます。具体的なエラーコードを取得するには、wolfSSL_get_error()を使用してください。

Example

WOLFSSL* ssl = 0;
char reply[1024];
...

input = wolfSSL_read(ssl, reply, sizeof(reply));
if (input > 0) {
    // バッファ"reply"に"input"バイトが返された
}

wolfSSL_read()のより完全な例については、wolfSSLの例(client、server、echoclient、echoserver)を参照してください。

function wolfSSL_peek

int wolfSSL_peek(
    WOLFSSL * ssl,
    void * data,
    int sz
)

この関数は、SSLセッション(ssl)の内部読み取りバッファからszバイトをバッファdataにコピーします。この関数は、内部SSLセッション受信バッファ内のデータが削除または変更されない点を除いて、wolfSSL_read()と同じです。wolfSSL_read()と同様に、必要に応じて、wolfSSL_connect()またはwolfSSL_accept()によってハンドシェイクがまだ実行されていない場合、wolfSSL_peek()はSSL/TLSセッションをネゴシエートします。SSL/TLSプロトコルは、最大サイズが16kBのSSLレコードを使用します(最大レコードサイズは、/wolfssl/internal.h内のMAX_RECORD_SIZE定義で制御できます)。そのため、wolfSSLは、レコードを処理および復号できるようになる前に、SSLレコード全体を内部的に読み取る必要があります。このため、wolfSSL_peek()の呼び出しは、呼び出し時に復号された最大バッファサイズのみを返すことができます。内部wolfSSL受信バッファには、まだ復号されていない追加データが待機している可能性があり、これは次のwolfSSL_peek()またはwolfSSL_read()呼び出しで取得および復号されます。szが内部読み取りバッファ内のバイト数よりも大きい場合、SSL_peek()は内部読み取りバッファ内で利用可能なバイトを返します。内部読み取りバッファにまだバイトがバッファリングされていない場合、wolfSSL_peek()の呼び出しは次のレコードの処理をトリガします。

Parameters:

  • ssl wolfSSL_new()で作成されたSSLセッションへのポインタ。
  • data wolfSSL_peek()が読み取ったデータを格納するバッファ。
  • sz dataに読み込むバイト数。

See: wolfSSL_read

Return:

  • >0 成功時に読み取られたバイト数。
  • 0 失敗時に返されます。これは、クリーンシャットダウン(close notifyアラート)またはピアが接続を閉じたことが原因である可能性があります。具体的なエラーコードについては、wolfSSL_get_error()を呼び出してください。
  • SSL_FATAL_ERROR エラーが発生した場合、またはノンブロッキングソケットを使用している場合にSSL_ERROR_WANT_READまたはSSL_ERROR_WANT_WRITEエラーを受け取り、アプリケーションがwolfSSL_peek()を再度呼び出す必要がある場合に返されます。具体的なエラーコードを取得するには、wolfSSL_get_error()を使用してください。

Example

WOLFSSL* ssl = 0;
char reply[1024];
...

input = wolfSSL_peek(ssl, reply, sizeof(reply));
if (input > 0) {
    // バッファ"reply"に"input"バイトが返された
}

function wolfSSL_accept

int wolfSSL_accept(
    WOLFSSL * 
)

この関数はサーバ側で呼び出され、SSLクライアントがSSL/TLSハンドシェイクを開始するのを待機します。この関数が呼び出されるとき、下層の通信チャネルはすでに設定されています。wolfSSL_accept()は、ブロッキングとノンブロッキングの両方のI/Oで動作します。下層のI/Oがノンブロッキングの場合、wolfSSL_accept()は、下層のI/OがwolfSSL_acceptがハンドシェイクを継続するために必要な要求を満たせなくなった時点で返されます。この場合、wolfSSL_get_error()を呼び出すと、SSL_ERROR_WANT_READまたはSSL_ERROR_WANT_WRITEのいずれかが返されます。呼び出し側プロセスは、データの読み取りが可能になったらwolfSSL_accept()の呼び出しを繰り返す必要があり、wolfSSLは中断した箇所から再開します。ノンブロッキングソケットを使用する場合、何もする必要はありませんが、select()を使用して必要な条件を確認できます。下層のI/Oがブロッキングの場合、wolfSSL_accept()は、ハンドシェイクが完了するか、エラーが発生するまで返されません。

Parameters:

  • ssl wolfSSL_new()を使用して作成されたWOLFSSL構造体へのポインタ。

See:

Return:

  • SSL_SUCCESS 成功時。
  • SSL_FATAL_ERROR エラーが発生した場合に返されます。より詳細なエラーコードを取得するには、wolfSSL_get_error()を呼び出してください。

Example

int ret = 0;
int err = 0;
WOLFSSL* ssl;
char buffer[80];
...

ret = wolfSSL_accept(ssl);
if (ret != SSL_SUCCESS) {
    err = wolfSSL_get_error(ssl, ret);
    printf("error = %d, %s\n", err, wolfSSL_ERR_error_string(err, buffer));
}

function wolfDTLS_accept_stateless

int wolfDTLS_accept_stateless(
    WOLFSSL * ssl
)

この関数はサーバ側で呼び出され、SSLクライアントがDTLSハンドシェイクを開始するのをステートレスに待機します。

Parameters:

  • ssl wolfSSL_new()を使用して作成されたWOLFSSL構造体へのポインタ。

See:

Return:

  • WOLFSSL_SUCCESS 有効なクッキーを含むClientHelloが受信されました。wolfSSL_accept()で接続を続行できます。
  • WOLFSSL_FAILURE I/O層がWANT_READを返しました。これは、読み取るデータがなくノンブロッキングソケットを使用しているか、クッキーリクエストを送信して応答を待っているためです。ユーザは、I/O層でデータが利用可能になった後、wolfDTLS_accept_statelessを再度呼び出す必要があります。
  • WOLFSSL_FATAL_ERROR 致命的なエラーが発生しました。sslオブジェクトを解放して再割り当てしてから続行する必要があります。

Example

int ret = 0;
int err = 0;
WOLFSSL* ssl;
...
do {
    ret = wolfDTLS_accept_stateless(ssl);
    if (ret == WOLFSSL_FATAL_ERROR)
        // wolfSSL_free()とwolfSSL_new()でsslオブジェクトを再割り当て
} while (ret != WOLFSSL_SUCCESS);
ret = wolfSSL_accept(ssl);
if (ret != SSL_SUCCESS) {
    err = wolfSSL_get_error(ssl, ret);
    printf("error = %d, %s\n", err, wolfSSL_ERR_error_string(err, buffer));
}

function wolfSSL_send

int wolfSSL_send(
    WOLFSSL * ssl,
    const void * data,
    int sz,
    int flags
)

この関数は、指定されたフラグを使用して、バッファdataからszバイトをSSL接続sslに書き込みます。必要に応じて、wolfSSL_connect()またはwolfSSL_accept()によってハンドシェイクがまだ実行されていない場合、wolfSSL_send()はSSL/TLSセッションをネゴシエートします。wolfSSL_send()は、ブロッキングI/OとノンブロッキングI/Oの両方で動作します。基盤となるI/Oがノンブロッキングの場合、基盤となるI/OがwolfSSL_sendの継続に必要な要求を満たせなかった場合、wolfSSL_send()は戻ります。この場合、wolfSSL_get_error()を呼び出すと、SSL_ERROR_WANT_READまたはSSL_ERROR_WANT_WRITEのいずれかが返されます。呼び出し側プロセスは、基盤となるI/Oの準備ができたときに、wolfSSL_send()の呼び出しを繰り返す必要があります。基盤となるI/Oがブロッキングの場合、wolfSSL_send()は、サイズszのバッファdataが完全に書き込まれるか、エラーが発生するまで戻りません。

Parameters:

  • ssl wolfSSL_new()で作成されたSSLセッションへのポインタ。
  • data ピアに送信するデータバッファ。
  • sz ピアに送信するデータのサイズ(バイト単位)。
  • flags 基盤となる送信操作に使用する送信フラグ。

See:

Return:

  • >0は、成功時に書き込まれたバイト数です。
  • 0は、失敗時に返されます。具体的なエラーコードについては、wolfSSL_get_error()を呼び出してください。
  • SSL_FATAL_ERRORは、エラーが発生した場合、またはノンブロッキングソケットを使用している場合にSSL_ERROR_WANT_READまたはSSL_ERROR_WANT_WRITEエラーが発生し、アプリケーションがwolfSSL_send()を再度呼び出す必要がある場合に返されます。具体的なエラーコードを取得するには、wolfSSL_get_error()を使用してください。

Example

WOLFSSL* ssl = 0;
char msg[64] = "hello wolfssl!";
int msgSz = (int)strlen(msg);
int flags = ... ;
...

input = wolfSSL_send(ssl, msg, msgSz, flags);
if (input != msgSz) {
    // wolfSSL_send()が失敗しました
}

function wolfSSL_recv

int wolfSSL_recv(
    WOLFSSL * ssl,
    void * data,
    int sz,
    int flags
)

この関数は、指定されたフラグを使用して、SSLセッション(ssl)の内部読み取りバッファからszバイトをバッファdataに読み込みます。読み取られたバイトは、内部受信バッファから削除されます。この関数は、基盤となる読み取り操作のrecvフラグをアプリケーションが設定できる点を除いて、wolfSSL_read()と同じです。必要に応じて、wolfSSL_connect()またはwolfSSL_accept()によってハンドシェイクがまだ実行されていない場合、wolfSSL_recv()はSSL/TLSセッションをネゴシエートします。SSL/TLSプロトコルは、最大サイズ16kBのSSLレコードを使用します(最大レコードサイズは、/wolfssl/internal.hのMAX_RECORD_SIZE定義で制御できます)。そのため、wolfSSLは、レコードを処理および復号する前に、内部でSSLレコード全体を読み取る必要があります。このため、wolfSSL_recv()の呼び出しは、呼び出し時に復号された最大バッファサイズのみを返すことができます。まだ復号されていない追加データが内部wolfSSL受信バッファで待機している可能性があり、次回のwolfSSL_recv()呼び出しで取得および復号されます。szが内部読み取りバッファのバイト数より大きい場合、SSL_recv()は内部読み取りバッファで利用可能なバイトを返します。内部読み取りバッファにまだバッファリングされているバイトがない場合、wolfSSL_recv()の呼び出しは次のレコードの処理をトリガーします。

Parameters:

  • ssl wolfSSL_new()で作成されたSSLセッションへのポインタ。
  • data wolfSSL_recv()が読み取ったデータを配置するバッファ。
  • sz dataに読み込むバイト数。
  • flags 基盤となる受信操作に使用する受信フラグ。

See:

Return:

  • >0は、成功時に読み取られたバイト数です。
  • 0は、失敗時に返されます。これは、クリーンな(close notifyアラート)シャットダウンによって引き起こされる場合もあれば、単にピアが接続を閉じた場合もあります。具体的なエラーコードについては、wolfSSL_get_error()を呼び出してください。
  • SSL_FATAL_ERRORは、エラーが発生した場合、またはノンブロッキングソケットを使用している場合にSSL_ERROR_WANT_READまたはSSL_ERROR_WANT_WRITEエラーが発生し、アプリケーションがwolfSSL_recv()を再度呼び出す必要がある場合に返されます。具体的なエラーコードを取得するには、wolfSSL_get_error()を使用してください。

Example

WOLFSSL* ssl = 0;
char reply[1024];
int flags = ... ;
...

input = wolfSSL_recv(ssl, reply, sizeof(reply), flags);
if (input > 0) {
    // バッファ"reply"に"input"バイトが返されました
}

function wolfSSL_get_alert_history

int wolfSSL_get_alert_history(
    WOLFSSL * ssl,
    WOLFSSL_ALERT_HISTORY * h
)

この関数はアラート履歴を取得します。

Parameters:

  • ssl wolfSSL_new()を使用して作成されたWOLFSSL構造体へのポインタ。
  • h WOLFSSL構造体のalert_historyメンバーの値を保持するWOLFSSL_ALERT_HISTORY構造体へのポインタ。

See: wolfSSL_get_error

Return: SSL_SUCCESSは、関数が正常に完了したときに返されます。アラート履歴があってもなくても、いずれの場合も戻り値はSSL_SUCCESSです。

Example

WOLFSSL_CTX* ctx = wolfSSL_CTX_new(protocol method);
WOLFSSL* ssl = wolfSSL_new(ctx);
WOLFSSL_ALERT_HISTORY* h;
...
wolfSSL_get_alert_history(ssl, h);
// hにssl->alert_historyの内容のコピーが格納されました

function wolfSSL_get_session

WOLFSSL_SESSION * wolfSSL_get_session(
    WOLFSSL * ssl
)

NO_SESSION_CACHE_REFが定義されている場合、この関数はsslで使用されている現在のセッション(WOLFSSL_SESSION)へのポインタを返します。この関数は、WOLFSSL_SESSIONオブジェクトへの非永続的なポインタを返します。返されたポインタは、wolfSSL_freeが呼び出されたときに解放されます。この呼び出しは、現在のセッションを検査または変更するためにのみ使用する必要があります。セッション再開には、wolfSSL_get1_session()を使用することをお勧めします。後方互換性のため、NO_SESSION_CACHE_REFが定義されていない場合、この関数はローカルキャッシュに格納されている永続的なセッションオブジェクトポインタを返します。キャッシュサイズは有限であり、アプリケーションがwolfSSL_set_session()を呼び出すまでに、別のssl接続によってセッションオブジェクトが上書きされるリスクがあります。アプリケーションでNO_SESSION_CACHE_REFを定義し、セッション再開にwolfSSL_get1_session()を使用することをお勧めします。

Parameters:

  • ssl wolfSSL_new()で作成されたSSLセッションへのポインタ。

See:

Return:

  • pointer 呼び出しが成功した場合、現在のSSLセッションオブジェクトへのポインタを返します。
  • NULLは、sslがNULLの場合、SSLセッションキャッシュが無効になっている場合、wolfSSLがセッションIDを利用できない場合、またはミューテックス関数が失敗した場合に返されます。

Example

WOLFSSL* ssl;
WOLFSSL_SESSION* session;
...
session = wolfSSL_get_session(ssl);
if (session == NULL) {
    // セッションポインタの取得に失敗しました
}
...

function wolfSSL_flush_sessions

void wolfSSL_flush_sessions(
    WOLFSSL_CTX * ctx,
    long tm
)

この関数は、期限切れのセッションをセッションキャッシュからフラッシュします。時刻tmは、時刻比較に使用されます。wolfSSLは現在セッションに静的テーブルを使用しているため、フラッシュは不要です。そのため、この関数は現在スタブにすぎません。この関数は、wolfSSLがOpenSSL互換レイヤーでコンパイルされている場合、OpenSSL互換性(SSL_flush_sessions)を提供します。

Parameters:

  • ctx wolfSSL_CTX_new()を使用して作成されたWOLFSSL_CTX構造体へのポインタ。
  • tm セッション有効期限比較に使用される時刻。

See:

Return: none 戻り値はありません。

Example

WOLFSSL_CTX* ssl;
...
wolfSSL_flush_sessions(ctx, time(0));

function wolfSSL_GetSessionIndex

int wolfSSL_GetSessionIndex(
    WOLFSSL * ssl
)

この関数は、WOLFSSL構造体のセッションインデックスを取得します。

Parameters:

  • ssl wolfSSL_new()を使用して作成されたWOLFSSL構造体へのポインタ。

See: wolfSSL_GetSessionAtIndex

Return: int この関数は、WOLFSSL構造体内のsessionIndexを表すint型を返します。

Example

WOLFSSL_CTX_new( protocol method );
WOLFSSL* ssl = WOLFSSL_new(ctx);
...
int sesIdx = wolfSSL_GetSessionIndex(ssl);

if(sesIdx < 0 || sesIdx > sizeof(ssl->sessionIndex)/sizeof(int)){
    // インデックス番号が範囲外であり、何かが正しくありません。
}

function wolfSSL_GetSessionAtIndex

int wolfSSL_GetSessionAtIndex(
    int idx,
    WOLFSSL_SESSION * session
)

この関数はセッションキャッシュの指定されたインデックスにあるセッションを取得し、メモリにコピーします。WOLFSSL_SESSION構造体はセッション情報を保持します。

Parameters:

  • idx セッションインデックスを表すint型。
  • session WOLFSSL_SESSION構造体へのポインタ。

See:

Return:

  • SSL_SUCCESS 関数が正常に実行され、エラーが発生しなかった場合に返されます。
  • BAD_MUTEX_E mutexのアンロックまたはロックエラーがあった場合に返されます。
  • SSL_FAILURE 関数が正常に実行されなかった場合に返されます。

Example

int idx; // セッションを特定するインデックス。
WOLFSSL_SESSION* session;  // コピー先のバッファ。
...
if(wolfSSL_GetSessionAtIndex(idx, session) != SSL_SUCCESS){
    // 失敗ケース。
}

function wolfSSL_SESSION_get_peer_chain

WOLFSSL_X509_CHAIN * wolfSSL_SESSION_get_peer_chain(
    WOLFSSL_SESSION * session
)

WOLFSSL_SESSION構造体からピア証明書チェーンを返します。

Parameters:

  • session WOLFSSL_SESSION構造体へのポインタ。

See:

Return: pointer ピア証明書チェーンを含むWOLFSSL_X509_CHAIN構造体へのポインタ。

Example

WOLFSSL_SESSION* session;
WOLFSSL_X509_CHAIN* chain;
...
chain = wolfSSL_SESSION_get_peer_chain(session);
if(!chain){
    // チェーンがありませんでした。失敗ケース。
}

function wolfSSL_pending

int wolfSSL_pending(
    WOLFSSL * 
)

この関数はSSLオブジェクト内でバッファリングされ、wolfSSL_read()によって読み取り可能な利用可能なバイト数を返します。

Parameters:

  • ssl wolfSSL_new()で作成されたSSLセッションへのポインタ。

See:

Return: int この関数は保留中のバイト数を返します。

Example

int pending = 0;
WOLFSSL* ssl = 0;
...

pending = wolfSSL_pending(ssl);
printf("バッファリングされ読み取り可能な%dバイトがあります", pending);

function wolfSSL_save_session_cache

int wolfSSL_save_session_cache(
    const char * fname
)

この関数は、セッションキャッシュをファイルに永続化します。追加のメモリ使用量のため、memsaveは使用しません。

Parameters:

  • fname 書き込み用ファイルを指す定数char型ポインタ。

See:

Return:

  • SSL_SUCCESS 関数がエラーなく実行された場合に返されます。セッションキャッシュがファイルに書き込まれました。
  • SSL_BAD_FILE fnameを開くことができないか、またはそれ以外の理由で破損している場合に返されます。
  • FWRITE_ERROR XFWRITEがファイルへの書き込みに失敗した場合に返されます。
  • BAD_MUTEX_E mutexロックの失敗があった場合に返されます。

Example

const char* fname;
...
if(wolfSSL_save_session_cache(fname) != SSL_SUCCESS){
    // ファイルへの書き込みに失敗しました。
}

function wolfSSL_restore_session_cache

int wolfSSL_restore_session_cache(
    const char * fname
)

この関数は、永続的なセッションキャッシュをファイルから復元します。追加のメモリ使用量のため、memstoreは使用しません。

Parameters:

  • fname 読み取られる定数char型ポインタファイル入力。

See:

  • XFREAD
  • XFOPEN

Return:

  • SSL_SUCCESS 関数がエラーなく実行された場合に返されます。
  • SSL_BAD_FILE 関数に渡されたファイルが破損しており、XFOPENで開くことができなかった場合に返されます。
  • FREAD_ERROR ファイルがXFREADからの読み取りエラーを持っていた場合に返されます。
  • CACHE_MATCH_ERROR セッションキャッシュヘッダのマッチングに失敗した場合に返されます。
  • BAD_MUTEX_E mutexロックの失敗があった場合に返されます。

Example

const char *fname;
...
if(wolfSSL_restore_session_cache(fname) != SSL_SUCCESS){
    // 失敗ケースです。関数はSSL_SUCCESSを返しませんでした。
}

function wolfSSL_memsave_session_cache

int wolfSSL_memsave_session_cache(
    void * mem,
    int sz
)

この関数は、セッションキャッシュをメモリに永続化します。

Parameters:

  • mem メモリコピーXMEMCPY()の宛先を表すvoid型ポインタ。
  • sz memのサイズを表すint型。

See:

Return:

  • SSL_SUCCESS 関数がエラーなく実行された場合に返されます。セッションキャッシュがメモリに正常に永続化されました。
  • BAD_MUTEX_E mutexロックエラーがあった場合に返されます。
  • BUFFER_E バッファサイズが小さすぎた場合に返されます。

Example

void* mem;
int sz; // メモリバッファの最大サイズ。
…
if(wolfSSL_memsave_session_cache(mem, sz) != SSL_SUCCESS){
    // 失敗ケースです。セッションキャッシュをメモリに永続化できませんでした。
}

function wolfSSL_memrestore_session_cache

int wolfSSL_memrestore_session_cache(
    const void * mem,
    int sz
)

この関数は、永続的なセッションキャッシュをメモリから復元します。

Parameters:

  • mem 復元のソースを含む定数void型ポインタ。
  • sz メモリバッファのサイズを表す整数。

See: wolfSSL_save_session_cache

Return:

  • SSL_SUCCESS 関数がエラーなく実行された場合に返されます。
  • BUFFER_E メモリバッファが小さすぎる場合に返されます。
  • BAD_MUTEX_E セッションキャッシュのmutexロックに失敗した場合に返されます。
  • CACHE_MATCH_ERROR セッションキャッシュヘッダのマッチングに失敗した場合に返されます。

Example

const void* memoryFile;
int szMf;
...
if(wolfSSL_memrestore_session_cache(memoryFile, szMf) != SSL_SUCCESS){
    // 失敗ケースです。SSL_SUCCESSが返されませんでした。
}

function wolfSSL_get_session_cache_memsize

int wolfSSL_get_session_cache_memsize(
    void 
)

この関数は、セッションキャッシュの保存バッファがどのくらい大きくあるべきかを返します。

Parameters:

  • none パラメータなし。

See: wolfSSL_memrestore_session_cache

Return: int この関数は、セッションキャッシュの保存バッファのサイズを表す整数を返します。

Example

int sz = // エラーチェックのための最小サイズ;
...
if(sz < wolfSSL_get_session_cache_memsize()){
    // メモリバッファが小さすぎます。
}

function wolfSSL_session_reused

int wolfSSL_session_reused(
    WOLFSSL * ssl
)

この関数はoptions構造体のresumingメンバを返します。このフラグはセッションを再利用するかどうかを示します。再利用しない場合、新しいセッションを確立する必要があります。

Parameters:

  • ssl wolfSSL_new()を使用して作成されたWOLFSSL構造体へのポインタ。

See:

Return: この関数はセッション再利用のフラグを表すOptions構造体に保持されたint型を返します。

Example

WOLFSSL* ssl = wolfSSL_new(ctx);
…
if(!wolfSSL_session_reused(sslResume)){
    // セッション再利用は許可されていません。
}

function wolfSSL_get_version

const char * wolfSSL_get_version(
    WOLFSSL * ssl
)

使用されているSSLバージョンを文字列として返します。

Parameters:

  • ssl wolfSSL_new()を使用して作成されたWOLFSSL構造体へのポインタ。

See: wolfSSL_lib_version

Return:

  • "SSLv3" SSLv3を使用しています
  • "TLSv1" TLSv1を使用しています
  • "TLSv1.1" TLSv1.1を使用しています
  • "TLSv1.2" TLSv1.2を使用しています
  • "TLSv1.3" TLSv1.3を使用しています
  • "DTLS" DTLSを使用しています
  • "DTLSv1.2" DTLSv1.2を使用しています
  • "unknown" 使用されているTLSのバージョンを判定する際に問題が発生しました。

Example

wolfSSL_Init();
WOLFSSL_CTX* ctx;
WOLFSSL* ssl;
WOLFSSL_METHOD method = // 何らかのwolfSSLメソッド
ctx = wolfSSL_CTX_new(method);
ssl = wolfSSL_new(ctx);
printf(wolfSSL_get_version("Using version: %s", ssl));

function wolfSSL_get_current_cipher_suite

int wolfSSL_get_current_cipher_suite(
    WOLFSSL * ssl
)

sslセッションが使用している現在の暗号スイートを返します。

Parameters:

  • ssl チェックするSSLセッション。

See:

Return:

  • ssl->options.cipherSuite 現在の暗号スイートを表す整数。
  • 0 提供されたsslセッションがnullです。

Example

wolfSSL_Init();
WOLFSSL_CTX* ctx;
WOLFSSL* ssl;
WOLFSSL_METHOD method = // 何らかのwolfSSLメソッド
ctx = wolfSSL_CTX_new(method);
ssl = wolfSSL_new(ctx);

if(wolfSSL_get_current_cipher_suite(ssl) == 0)
{
    // 暗号スイートの取得エラー
}

function wolfSSL_get_current_cipher

WOLFSSL_CIPHER * wolfSSL_get_current_cipher(
    WOLFSSL * ssl
)

この関数はsslセッション内の現在の暗号へのポインタを返します。

Parameters:

  • ssl wolfSSL_new()を使用して作成されたWOLFSSL構造体へのポインタ。

See:

Return:

  • この関数はWOLFSSL構造体のcipherメンバのアドレスを返します。これはWOLFSSL_CIPHER構造体へのポインタです。
  • NULL WOLFSSL構造体がNULLの場合に返されます。

Example

WOLFSSL_CTX* ctx = wolfSSL_CTX_new( protocol method );
WOLFSSL* ssl = wolfSSL_new(ctx);
…
WOLFSSL_CIPHER* cipherCurr = wolfSSL_get_current_cipher;

if(!cipherCurr){
    // 失敗ケース。
} else {
    // 暗号がcipherCurrに返されました
}

function wolfSSL_CIPHER_get_name

const char * wolfSSL_CIPHER_get_name(
    const WOLFSSL_CIPHER * cipher
)

この関数はSSLオブジェクト内の暗号スイートを利用可能なスイートと照合し、文字列表現を返します。

Parameters:

  • cipher WOLFSSL_CIPHER構造体への定数ポインタ。

See:

Return:

  • string この関数は一致した暗号スイートの文字列表現を返します。
  • none 一致するスイートがない場合は"None"を返します。

Example

// DHE_RSA ...の形式で暗号名を取得します
const char* wolfSSL_get_cipher_name_internal(WOLFSSL* ssl){
WOLFSSL_CIPHER* cipher;
const char* fullName;
…
cipher = wolfSSL_get_curent_cipher(ssl);
fullName = wolfSSL_CIPHER_get_name(cipher);

if(fullName){
    // 返された暗号の健全性チェック
}

function wolfSSL_get_cipher

const char * wolfSSL_get_cipher(
    WOLFSSL * 
)

この関数はSSLオブジェクト内の暗号スイートを利用可能なスイートと照合します。

Parameters:

  • ssl wolfSSL_new()を使用して作成されたWOLFSSL構造体へのポインタ。

See:

Return: この関数は一致したスイートの文字列値を返します。一致するスイートがない場合は"None"を返します。

Example

#ifdef WOLFSSL_DTLS
…
// 有効なスイートが使用されていることを確認
if(wolfSSL_get_cipher(ssl) == NULL){
    WOLFSSL_MSG("インポートされた暗号スイートと一致しません");
    return MATCH_SUITE_ERROR;
}
…
#endif // WOLFSSL_DTLS

function wolfSSL_BIO_get_mem_data

int wolfSSL_BIO_get_mem_data(
    WOLFSSL_BIO * bio,
    void * p
)

これは、内部メモリバッファの先頭にバイトポインタを設定するために使用されます。

Parameters:

  • bio メモリバッファを取得するWOLFSSL_BIO構造体。
  • p メモリバッファに設定するバイトポインタ。

See:

Return:

  • size 成功時、バッファのサイズが返されます。
  • SSL_FATAL_ERROR エラーケースが発生した場合。

Example

WOLFSSL_BIO* bio;
const byte* p;
int ret;
bio  = wolfSSL_BIO_new(wolfSSL_BIO_s_mem());
ret  = wolfSSL_BIO_get_mem_data(bio, &p);
// ret値を確認

function wolfSSL_BIO_set_fd

long wolfSSL_BIO_set_fd(
    WOLFSSL_BIO * b,
    int fd,
    int flag
)

bioが使用するファイルディスクリプタを設定します。

Parameters:

  • bio fdを設定するWOLFSSL_BIO構造体。
  • fd 使用するファイルディスクリプタ。
  • closeF fdをクローズする際の動作フラグ。

See:

  • wolfSSL_BIO_new
  • wolfSSL_BIO_free

Return: SSL_SUCCESS(1) 成功時。

Example

WOLFSSL_BIO* bio;
int fd;
// bioをセットアップ
wolfSSL_BIO_set_fd(bio, fd, BIO_NOCLOSE);

function wolfSSL_BIO_set_close

int wolfSSL_BIO_set_close(
    WOLFSSL_BIO * b,
    long flag
)

クローズフラグを設定します。これは、BIOが解放される際にI/Oストリームをクローズすべきかを示すために使用されます。

Parameters:

  • bio WOLFSSL_BIO構造体。
  • flag I/Oストリームをクローズする際の動作フラグ。

See:

  • wolfSSL_BIO_new
  • wolfSSL_BIO_free

Return: SSL_SUCCESS(1) 成功時。

Example

WOLFSSL_BIO* bio;
// bioをセットアップ
wolfSSL_BIO_set_close(bio, BIO_NOCLOSE);

function wolfSSL_BIO_s_socket

WOLFSSL_BIO_METHOD * wolfSSL_BIO_s_socket(
    void 
)

これは、BIO_SOCKETタイプのWOLFSSL_BIO_METHODを取得するために使用されます。

Parameters:

  • none パラメータなし。

See:

  • wolfSSL_BIO_new
  • wolfSSL_BIO_s_mem

Return: WOLFSSL_BIO_METHOD ソケットタイプであるWOLFSSL_BIO_METHOD構造体へのポインタ。

Example

WOLFSSL_BIO* bio;
bio = wolfSSL_BIO_new(wolfSSL_BIO_s_socket);

function wolfSSL_BIO_set_write_buf_size

int wolfSSL_BIO_set_write_buf_size(
    WOLFSSL_BIO * b,
    long size
)

これは、WOLFSSL_BIOの書き込みバッファのサイズを設定するために使用されます。書き込みバッファが以前に設定されていた場合、この関数はサイズをリセットする際にそれを解放します。これは、読み取りと書き込みのインデックスを0にリセットする点でwolfSSL_BIO_resetに似ています。

Parameters:

  • bio fdを設定するWOLFSSL_BIO構造体。
  • size 割り当てるバッファのサイズ。

See:

  • wolfSSL_BIO_new
  • wolfSSL_BIO_s_mem
  • wolfSSL_BIO_free

Return:

  • SSL_SUCCESS 書き込みバッファの設定に成功した場合。
  • SSL_FAILURE エラーケースが発生した場合。

Example

WOLFSSL_BIO* bio;
int ret;
bio = wolfSSL_BIO_new(wolfSSL_BIO_s_mem());
ret = wolfSSL_BIO_set_write_buf_size(bio, 15000);
// 戻り値を確認

function wolfSSL_BIO_make_bio_pair

int wolfSSL_BIO_make_bio_pair(
    WOLFSSL_BIO * b1,
    WOLFSSL_BIO * b2
)

これは、2つのbioをペアにするために使用されます。ペアになったbioは双方向パイプのように動作し、一方への書き込みはもう一方から読み取ることができ、その逆も同様です。両方のbioが同じスレッドにあることが期待されます。この関数はスレッドセーフではありません。2つのbioのうちの1つを解放すると、両方のペアが解除されます。いずれかのbioに書き込みバッファサイズが以前に設定されていなかった場合、ペアになる前にデフォルトサイズの17000(WOLFSSL_BIO_SIZE)に設定されます。

Parameters:

  • b1 ペアを設定するWOLFSSL_BIO構造体。
  • b2 ペアを完成させる2番目のWOLFSSL_BIO構造体。

See:

  • wolfSSL_BIO_new
  • wolfSSL_BIO_s_mem
  • wolfSSL_BIO_free

Return:

  • SSL_SUCCESS 2つのbioのペア化に成功した場合。
  • SSL_FAILURE エラーケースが発生した場合。

Example

WOLFSSL_BIO* bio;
WOLFSSL_BIO* bio2;
int ret;
bio  = wolfSSL_BIO_new(wolfSSL_BIO_s_bio());
bio2 = wolfSSL_BIO_new(wolfSSL_BIO_s_bio());
ret = wolfSSL_BIO_make_bio_pair(bio, bio2);
// ret値を確認

function wolfSSL_BIO_ctrl_reset_read_request

int wolfSSL_BIO_ctrl_reset_read_request(
    WOLFSSL_BIO * bio
)

これは、読み取り要求フラグを0に戻すために使用されます。

Parameters:

  • bio 読み取り要求フラグを設定するWOLFSSL_BIO構造体。

See:

  • wolfSSL_BIO_new, wolfSSL_BIO_s_mem
  • wolfSSL_BIO_new, wolfSSL_BIO_free

Return:

  • SSL_SUCCESS 値の設定に成功した場合。
  • SSL_FAILURE エラーケースが発生した場合。

Example

WOLFSSL_BIO* bio;
int ret;
...
ret = wolfSSL_BIO_ctrl_reset_read_request(bio);
// ret値を確認

function wolfSSL_BIO_nread0

int wolfSSL_BIO_nread0(
    WOLFSSL_BIO * bio,
    char ** buf
)

これは、読み取り用のバッファポインタを取得するために使用されます。wolfSSL_BIO_nreadとは異なり、内部読み取りインデックスは関数呼び出しから返される数だけ進められません。返される値を超えて読み取ると、配列の境界外を読み取る結果になる可能性があります。

Parameters:

  • bio 読み取るWOLFSSL_BIO構造体。
  • buf 読み取り配列の先頭に設定するポインタ。

See:

  • wolfSSL_BIO_new
  • wolfSSL_BIO_nwrite0

Return: >=0 成功時、読み取るバイト数を返します。

Example

WOLFSSL_BIO* bio;
char* bufPt;
int ret;
// bioをセットアップ
ret = wolfSSL_BIO_nread0(bio, &bufPt); // 可能な限り多くのバイトを読み取り
// 負のret値を確認
// bufPtからretバイトを読み取り

function wolfSSL_BIO_nread

int wolfSSL_BIO_nread(
    WOLFSSL_BIO * bio,
    char ** buf,
    int num
)

これは、読み取り用のバッファポインタを取得するために使用されます。内部読み取りインデックスは、関数呼び出しから返される数だけ進められ、bufは読み取るバッファの先頭を指します。読み取りバッファ内のバイト数がnumで要求された値より少ない場合、より小さい値が返されます。返される値を超えて読み取ると、配列の境界外を読み取る結果になる可能性があります。

Parameters:

  • bio 読み取るWOLFSSL_BIO構造体。
  • buf 読み取り配列の先頭に設定するポインタ。
  • num 読み取りを試みるバイト数。

See:

Return:

  • >=0 成功時、読み取るバイト数を返します。
  • WOLFSSL_BIO_ERROR(-1) 読み取るものがない場合のエラーケースで-1を返します。

Example

WOLFSSL_BIO* bio;
char* bufPt;
int ret;

// bioをセットアップ
ret = wolfSSL_BIO_nread(bio, &bufPt, 10); // 10バイトの読み取りを試行
// 負のret値を確認
// bufPtからretバイトを読み取り

function wolfSSL_BIO_nwrite

int wolfSSL_BIO_nwrite(
    WOLFSSL_BIO * bio,
    char ** buf,
    int num
)

関数が返す数だけのバイトを書き込むためのバッファへのポインタを取得します。返される値よりも多くのバイトを返されたポインタに書き込むと、境界外への書き込みになる可能性があります。

Parameters:

  • bio 書き込むWOLFSSL_BIO構造体。
  • buf 書き込むバッファへのポインタ。
  • num 書き込みたいバイト数。

See:

Return:

  • int バッファポインタに書き込むことができるバイト数を返します。
  • WOLFSSL_BIO_UNSET(-2) bioペアの一部ではない場合。
  • WOLFSSL_BIO_ERROR(-1) 書き込むスペースがこれ以上ない場合。

Example

WOLFSSL_BIO* bio;
char* bufPt;
int ret;
// bioをセットアップ
ret = wolfSSL_BIO_nwrite(bio, &bufPt, 10); // 10バイトの書き込みを試行
// 負のret値を確認
// bufPtにretバイトを書き込み

function wolfSSL_BIO_reset

int wolfSSL_BIO_reset(
    WOLFSSL_BIO * bio
)

bioを初期状態にリセットします。例えば、BIO_BIOタイプの場合、これは読み取りと書き込みのインデックスをリセットします。

Parameters:

  • bio リセットするWOLFSSL_BIO構造体。

See:

  • wolfSSL_BIO_new
  • wolfSSL_BIO_free

Return:

  • 0 bioのリセットに成功した場合。
  • WOLFSSL_BIO_ERROR(-1) 不正な入力またはリセットに失敗した場合に返されます。

Example

WOLFSSL_BIO* bio;
// bioをセットアップ
wolfSSL_BIO_reset(bio);
//ptを使用

function wolfSSL_BIO_seek

int wolfSSL_BIO_seek(
    WOLFSSL_BIO * bio,
    int ofs
)

この関数は、ファイルポインタを指定されたオフセットに調整します。これはファイルの先頭からのオフセットです。

Parameters:

  • bio 設定するWOLFSSL_BIO構造体。
  • ofs ファイルへのオフセット。

See:

Return:

  • 0 シークに成功した場合。
  • -1 エラーケースが発生した場合。

Example

WOLFSSL_BIO* bio;
XFILE fp;
int ret;
bio  = wolfSSL_BIO_new(wolfSSL_BIO_s_file());
ret  = wolfSSL_BIO_set_fp(bio, &fp);
// ret値を確認
ret  = wolfSSL_BIO_seek(bio, 3);
// ret値を確認

function wolfSSL_BIO_write_filename

int wolfSSL_BIO_write_filename(
    WOLFSSL_BIO * bio,
    char * name
)

ファイルを設定し、書き込むために使用されます。ファイル内の既存データを上書きし、bioが解放される際にファイルを閉じるよう設定されます。

Parameters:

  • bio ファイルを設定するWOLFSSL_BIO構造体。
  • name 書き込み先のファイル名。

See:

Return:

  • SSL_SUCCESS ファイルのオープンと設定が成功した場合。
  • SSL_FAILURE エラーが発生した場合。

Example

WOLFSSL_BIO* bio;
int ret;
bio  = wolfSSL_BIO_new(wolfSSL_BIO_s_file());
ret  = wolfSSL_BIO_write_filename(bio, "test.txt");
// ret値を確認

function wolfSSL_BIO_set_mem_eof_return

long wolfSSL_BIO_set_mem_eof_return(
    WOLFSSL_BIO * bio,
    int v
)

ファイル終端値を設定するために使用されます。一般的な値は-1で、期待される正の値と混同しないようにします。

Parameters:

  • bio ファイル終端値を設定するWOLFSSL_BIO構造体。
  • v bioに設定する値。

See:

Return: 0 完了時に返されます。

Example

WOLFSSL_BIO* bio;
int ret;
bio  = wolfSSL_BIO_new(wolfSSL_BIO_s_mem());
ret  = wolfSSL_BIO_set_mem_eof_return(bio, -1);
// ret値を確認

function wolfSSL_BIO_get_mem_ptr

long wolfSSL_BIO_get_mem_ptr(
    WOLFSSL_BIO * bio,
    WOLFSSL_BUF_MEM ** m
)

WOLFSSL_BIOメモリポインタのgetter関数です。

Parameters:

  • bio メモリポインタを取得するためのWOLFSSL_BIO構造体へのポインタ。
  • ptr 現在char*である構造体。bioのメモリを指すように設定されます。

See:

  • wolfSSL_BIO_new
  • wolfSSL_BIO_s_mem

Return:

  • SSL_SUCCESS ポインタの取得に成功した場合、SSL_SUCCESSが返されます(現在の値は1)。
  • SSL_FAILURE NULL引数が渡された場合に返されます(現在の値は0)。

Example

WOLFSSL_BIO* bio;
WOLFSSL_BUF_MEM* pt;
// bioをセットアップ
wolfSSL_BIO_get_mem_ptr(bio, &pt);
// ptを使用

function wolfSSL_lib_version

const char * wolfSSL_lib_version(
    void 
)

この関数は現在のライブラリバージョンを返します。

Parameters:

  • none パラメータなし。

See: word32_wolfSSL_lib_version_hex

Return: LIBWOLFSSL_VERSION_STRING バージョンを定義するconst charポインタ。

Example

char version[MAXSIZE];
version = wolfSSL_KeepArrays();
…
if(version != ExpectedVersion){
    // 不一致ケースを処理
}

function wolfSSL_lib_version_hex

word32 wolfSSL_lib_version_hex(
    void 
)

この関数は現在のライブラリバージョンを16進表記で返します。

Parameters:

  • none パラメータなし。

See: wolfSSL_lib_version

Return: LILBWOLFSSL_VERSION_HEX wolfssl/version.hで定義された16進バージョンを返します。

Example

word32 libV;
libV = wolfSSL_lib_version_hex();

if(libV != EXPECTED_HEX){
    // 予期しない値の処理方法
} else {
    // libVの期待される結果
}

function wolfSSL_negotiate

int wolfSSL_negotiate(
    WOLFSSL * ssl
)

SSLメソッドの側面に基づいて実際の接続または受け入れを実行します。クライアント側から呼び出された場合はwolfSSL_connect()が実行され、サーバー側から呼び出された場合はwolfSSL_accept()が実行されます。

Parameters:

  • ssl wolfSSL_new()で作成されたSSLセッションへのポインタ。

See:

  • SSL_connect
  • SSL_accept

Return:

  • SSL_SUCCESS 成功した場合に返されます(注:古いバージョンでは0が返されます)。
  • SSL_FATAL_ERROR 基礎となる呼び出しがエラーになった場合に返されます。特定のエラーコードを取得するにはwolfSSL_get_error()を使用してください。

Example

int ret = SSL_FATAL_ERROR;
WOLFSSL* ssl = 0;
...
ret = wolfSSL_negotiate(ssl);
if (ret == SSL_FATAL_ERROR) {
    // SSL確立に失敗しました
    int error_code = wolfSSL_get_error(ssl);
    ...
}
...

function wolfSSL_connect_cert

int wolfSSL_connect_cert(
    WOLFSSL * ssl
)

この関数はクライアント側で呼び出され、ピアの証明書チェーンを取得するのに十分な長さだけサーバーとのSSL/TLSハンドシェイクを開始します。この関数が呼び出されるとき、基礎となる通信チャネルはすでに設定されています。wolfSSL_connect_cert()は、ブロッキングI/Oと非ブロッキングI/Oの両方で動作します。基礎となるI/Oが非ブロッキングの場合、wolfSSL_connect_cert()は、基礎となるI/OがwolfSSL_connect_cert()がハンドシェイクを続行するために必要な処理を満たせないときに戻ります。この場合、wolfSSL_get_error()の呼び出しはSSL_ERROR_WANT_READまたはSSL_ERROR_WANT_WRITEのいずれかを生成します。呼び出しプロセスは、基礎となるI/Oが準備できたときにwolfSSL_connect_cert()の呼び出しを繰り返す必要があり、wolfSSLは中断した場所から再開します。非ブロッキングソケットを使用する場合、何もする必要はありませんが、select()を使用して必要な条件をチェックできます。基礎となるI/OがブロッキングI/Oの場合、wolfSSL_connect_cert()はピアの証明書チェーンが受信されたときにのみ戻ります。

Parameters:

  • ssl wolfSSL_new()を使用して作成されたWOLFSSL構造体へのポインタ。

See:

Return:

  • SSL_SUCCESS 成功時。
  • SSL_FAILURE SSLセッションパラメータがNULLの場合に返されます。
  • SSL_FATAL_ERROR エラーが発生した場合に返されます。より詳細なエラーコードを取得するには、wolfSSL_get_error()を呼び出してください。

Example

int ret = 0;
int err = 0;
WOLFSSL* ssl;
char buffer[80];
...
ret = wolfSSL_connect_cert(ssl);
if (ret != SSL_SUCCESS) {
    err = wolfSSL_get_error(ssl, ret);
    printf("error = %d, %s\n", err, wolfSSL_ERR_error_string(err, buffer));
}

function wolfSSL_writev

int wolfSSL_writev(
    WOLFSSL * ssl,
    const struct iovec * iov,
    int iovcnt
)

writevのセマンティクスをシミュレートしますが、SSL_write()の動作とフロント追加が小さい場合があるため、実際には一度にブロック単位では行いません。writevを使用するソフトウェアへの移植を容易にします。

Parameters:

  • ssl wolfSSL_new()で作成されたSSLセッションへのポインタ。
  • iov 書き込むI/Oベクトルの配列。
  • iovcnt iov配列内のベクトル数。

See: wolfSSL_write

Return:

  • >0 成功時、書き込まれたバイト数。
  • 0 失敗時に返されます。wolfSSL_get_error()を呼び出して特定のエラーコードを取得してください。
  • MEMORY_ERROR メモリエラーが発生した場合に返されます。
  • SSL_FATAL_ERROR エラーが発生した場合、またはノンブロッキングソケットを使用しているときにSSL_ERROR_WANT_READまたはSSL_ERROR_WANT_WRITEエラーを受信し、アプリケーションがwolfSSL_write()を再度呼び出す必要がある場合に返されます。wolfSSL_get_error()を使用して特定のエラーコードを取得してください。

Example

WOLFSSL* ssl = 0;
char *bufA = "hello\n";
char *bufB = "hello world\n";
int iovcnt;
struct iovec iov[2];

iov[0].iov_base = buffA;
iov[0].iov_len = strlen(buffA);
iov[1].iov_base = buffB;
iov[1].iov_len = strlen(buffB);
iovcnt = 2;
...
ret = wolfSSL_writev(ssl, iov, iovcnt);
// "ret"バイトを書き込みました。または<=0の場合はエラー

function wolfSSL_SNI_Status

unsigned char wolfSSL_SNI_Status(
    WOLFSSL * ssl,
    unsigned char type
)

この関数はSNIオブジェクトのステータスを取得します。

Parameters:

  • ssl wolfSSL_new()を使用して作成されたWOLFSSL構造体へのポインタ。
  • type SNIタイプ。

See:

  • TLSX_SNI_Status
  • TLSX_SNI_find
  • TLSX_Find

Return:

  • value SNIがNULLでない場合、この関数はSNI構造体のstatusメンバーのバイト値を返します。
  • 0 SNIオブジェクトがNULLの場合。

Example

WOLFSSL_CTX* ctx = wolfSSL_CTX_new( protocol method );
WOLFSSL* ssl = wolfSSL_new(ctx);
…
#define AssertIntEQ(x, y) AssertInt(x, y, ==, !=)
…
Byte type = WOLFSSL_SNI_HOST_NAME;
char* request = (char*)&type;
AssertIntEQ(WOLFSSL_SNI_NO_MATCH, wolfSSL_SNI_Status(ssl, type));
…

function wolfSSL_UseSecureRenegotiation

int wolfSSL_UseSecureRenegotiation(
    WOLFSSL * ssl
)

この関数は、提供されたWOLFSSL構造体に対して安全な再ネゴシエーションを強制します。これは推奨されません。

Parameters:

  • ssl wolfSSL_new()を使用して作成されたWOLFSSL構造体へのポインタ。

See:

  • TLSX_Find
  • TLSX_UseSecureRenegotiation

Return:

  • SSL_SUCCESS 安全な再ネゴシエーションの設定に成功しました。
  • BAD_FUNC_ARG sslがNULLの場合にエラーを返します。
  • MEMORY_E 安全な再ネゴシエーション用のメモリを割り当てできない場合にエラーを返します。

Example

wolfSSL_Init();
WOLFSSL_CTX* ctx;
WOLFSSL* ssl;
WOLFSSL_METHOD method = // 何らかのwolfSSLメソッド
ctx = wolfSSL_CTX_new(method);
ssl = wolfSSL_new(ctx);

if(wolfSSL_UseSecureRenegotiation(ssl) != SSL_SUCCESS)
{
    // 安全な再ネゴシエーションの設定エラー
}

function wolfSSL_Rehandshake

int wolfSSL_Rehandshake(
    WOLFSSL * ssl
)

この関数は安全な再ネゴシエーションハンドシェイクを実行します。wolfSSLはこの機能を推奨していないため、これはユーザが強制するものです。

Parameters:

  • ssl wolfSSL_new()を使用して作成されたWOLFSSL構造体へのポインタ。

See:

Return:

  • SSL_SUCCESS 関数がエラーなく実行された場合に返されます。
  • BAD_FUNC_ARG WOLFSSL構造体がNULLの場合、またはサブルーチンで受け入れられない引数が渡された場合に返されます。
  • SECURE_RENEGOTIATION_E ハンドシェイクの再ネゴシエーションでエラーがあった場合に返されます。
  • SSL_FATAL_ERROR サーバまたはクライアント設定にエラーがあり、再ネゴシエーションを完了できなかった場合に返されます。wolfSSL_negotiate()を参照してください。

Example

WOLFSSL* ssl = wolfSSL_new(ctx);
...
if(wolfSSL_Rehandshake(ssl) != SSL_SUCCESS){
    // エラーが発生し、再ハンドシェイクは成功しませんでした。
}

function wolfSSL_UseSessionTicket

int wolfSSL_UseSessionTicket(
    WOLFSSL * ssl
)

提供されたWOLFSSL構造体にセッションチケットを使用するよう強制します。定数HAVE_SESSION_TICKETが定義されており、定数NO_WOLFSSL_CLIENTが定義されていない必要があります。

Parameters:

  • ssl wolfSSL_new()を使用して作成されたWOLFSSL構造体へのポインタ。

See: TLSX_UseSessionTicket

Return:

  • SSL_SUCCESS セッションチケットの使用設定に成功しました。
  • BAD_FUNC_ARG sslがNULLの場合に返されます。
  • MEMORY_E セッションチケット設定のためのメモリ割り当てエラー。

Example

wolfSSL_Init();
WOLFSSL_CTX* ctx;
WOLFSSL* ssl;
WOLFSSL_METHOD method = // 何らかのwolfSSLメソッド
ctx = wolfSSL_CTX_new(method);
ssl = wolfSSL_new(ctx);

if(wolfSSL_UseSessionTicket(ssl) != SSL_SUCCESS)
{
    // セッションチケットの設定エラー
}

function wolfSSL_get_SessionTicket

int wolfSSL_get_SessionTicket(
    WOLFSSL * ssl,
    unsigned char * buf,
    word32 * bufSz
)

この関数は、Session構造体のticketメンバをバッファにコピーします。bufがNULLでbufSzが非NULLの場合、bufSzはチケット長に設定されます。

Parameters:

  • ssl wolfSSL_new()を使用して作成されたWOLFSSL構造体へのポインタ。
  • buf メモリバッファを表すbyteポインタ。
  • bufSz バッファサイズを表すword32ポインタ。

See:

Return:

  • SSL_SUCCESS 関数がエラーなく実行された場合に返されます。
  • BAD_FUNC_ARG sslまたはbufSzがNULLの場合、またはbufSzが非NULLでbufがNULLの場合に返されます。

Example

WOLFSSL_CTX* ctx = wolfSSL_CTX_new( protocol method );
WOLFSSL* ssl = wolfSSL_new(ctx);
byte* buf;
word32 bufSz;  // bufサイズで初期化
…
if(wolfSSL_get_SessionTicket(ssl, buf, bufSz) <= 0){
    // バッファに何も書き込まれませんでした。
} else {
    // バッファはssl->session->ticketの内容を保持しています。
}

function wolfSSL_set_SessionTicket

int wolfSSL_set_SessionTicket(
    WOLFSSL * ssl,
    const unsigned char * buf,
    word32 bufSz
)

この関数は、WOLFSSL構造体内のWOLFSSL_SESSION構造体のticketメンバを設定します。関数に渡されたバッファはメモリにコピーされます。

Parameters:

  • ssl wolfSSL_new()を使用して作成されたWOLFSSL構造体へのポインタ。
  • buf セッション構造体のticketメンバに読み込まれるbyteポインタ。
  • bufSz バッファのサイズを表すword32型。

See: wolfSSL_set_SessionTicket_cb

Return:

  • SSL_SUCCESS 関数の実行が成功した場合に返されます。関数はエラーなく返されました。
  • BAD_FUNC_ARG WOLFSSL構造体がNULLの場合に返されます。bufSz引数がゼロでないのにbuf引数がNULLの場合にも返されます。

Example

WOLFSSL_CTX* ctx = wolfSSL_CTX_new( protocol method );
WOLFSSL* ssl = wolfSSL_new(ctx);
byte* buffer; // 読み込むファイル
word32 bufSz;
...
if(wolfSSL_KeepArrays(ssl, buffer, bufSz) != SSL_SUCCESS){
    // バッファをメモリに読み込む際にエラーが発生しました。
}

function wolfSSL_PrintSessionStats

int wolfSSL_PrintSessionStats(
    void 
)

この関数は、セッションの統計情報を出力します。

Parameters:

  • none パラメータなし。

See: wolfSSL_get_session_stats

Return:

  • SSL_SUCCESS 関数とサブルーチンがエラーなしで返された場合に返されます。セッション統計が正常に取得され、出力されました。
  • BAD_FUNC_ARG サブルーチンwolfSSL_get_session_stats()に許容できない引数が渡された場合に返されます。
  • BAD_MUTEX_E サブルーチンでmutexエラーが発生した場合に返されます。

Example

// 統計を取得するためのセッションオブジェクトが必要です
if(wolfSSL_PrintSessionStats(void) != SSL_SUCCESS){
    // セッション統計を出力しませんでした
}

function wolfSSL_get_session_stats

int wolfSSL_get_session_stats(
    unsigned int * active,
    unsigned int * total,
    unsigned int * peak,
    unsigned int * maxSessions
)

この関数は、セッションの統計情報を取得します。

Parameters:

  • active 総現在セッション数を表すword32ポインタ。
  • total 総セッション数を表すword32ポインタ。
  • peak ピークセッション数を表すword32ポインタ。
  • maxSessions 最大セッション数を表すword32ポインタ。

See: wolfSSL_PrintSessionStats

Return:

  • SSL_SUCCESS 関数とサブルーチンがエラーなしで返された場合に返されます。セッション統計が正常に取得され、出力されました。
  • BAD_FUNC_ARG サブルーチンwolfSSL_get_session_stats()に許容できない引数が渡された場合に返されます。
  • BAD_MUTEX_E サブルーチンでmutexエラーが発生した場合に返されます。

Example

int wolfSSL_PrintSessionStats(void){
…
ret = wolfSSL_get_session_stats(&totalSessionsNow,
    &totalSessionsSeen, &peak, &maxSessions);
…
return ret;

function wolfSSL_BIO_set_fp

long wolfSSL_BIO_set_fp(
    WOLFSSL_BIO * bio,
    XFILE fp,
    int c
)

これは、BIOの内部ファイルポインタを設定するために使用されます。

Parameters:

  • bio ペアを設定するWOLFSSL_BIO構造体。
  • fp bioに設定するファイルポインタ。
  • c ファイルクローズ動作フラグ。

See:

Return:

  • SSL_SUCCESS ファイルポインタの設定に成功した場合。
  • SSL_FAILURE エラーケースが発生した場合。

Example

WOLFSSL_BIO* bio;
XFILE fp;
int ret;
bio  = wolfSSL_BIO_new(wolfSSL_BIO_s_file());
ret  = wolfSSL_BIO_set_fp(bio, fp, BIO_CLOSE);
// ret値を確認

function wolfSSL_BIO_get_fp

long wolfSSL_BIO_get_fp(
    WOLFSSL_BIO * bio,
    XFILE * fp
)

これは、BIOの内部ファイルポインタを取得するために使用されます。

Parameters:

  • bio ペアを設定するWOLFSSL_BIO構造体。
  • fp bioに設定するファイルポインタ。

See:

Return:

  • SSL_SUCCESS ファイルポインタの取得に成功した場合。
  • SSL_FAILURE エラーケースが発生した場合。

Example

WOLFSSL_BIO* bio;
XFILE fp;
int ret;
bio  = wolfSSL_BIO_new(wolfSSL_BIO_s_file());
ret  = wolfSSL_BIO_get_fp(bio, &fp);
// ret値を確認

function wolfSSL_BIO_ctrl_pending

size_t wolfSSL_BIO_ctrl_pending(
    WOLFSSL_BIO * b
)

読み取り保留中のバイト数を取得します。BIOタイプがBIO_BIOの場合、ペアから読み取るバイト数です。BIOがSSLオブジェクトを含む場合、SSLオブジェクトからの保留中のデータです(wolfSSL_pending(ssl))。BIO_MEMORYタイプの場合、メモリバッファのサイズを返します。

Parameters:

  • bio すでに作成されているWOLFSSL_BIO構造体へのポインタ。

See:

Return: >=0 保留中のバイト数。

Example

WOLFSSL_BIO* bio;    int pending;
bio = wolfSSL_BIO_new();
…
pending = wolfSSL_BIO_ctrl_pending(bio);

function wolfSSL_set_jobject

int wolfSSL_set_jobject(
    WOLFSSL * ssl,
    void * objPtr
)

この関数は、WOLFSSL構造体のjObjectRefメンバを設定します。

Parameters:

  • ssl wolfSSL_new()を使用して作成されたWOLFSSL構造体へのポインタ。
  • objPtr jObjectRefに設定されるvoidポインタ。

See: wolfSSL_get_jobject

Return:

  • SSL_SUCCESS jObjectRefがobjPtrに適切に設定された場合に返されます。
  • SSL_FAILURE 関数が適切に実行されず、jObjectRefが設定されていない場合に返されます。

Example

WOLFSSL_CTX* ctx = wolfSSL_CTX_new( protocol method );
WOLFSSL* ssl = WOLFSSL_new();
void* objPtr = &obj;
...
if(wolfSSL_set_jobject(ssl, objPtr)){
    // 成功ケース
}

function wolfSSL_get_jobject

void * wolfSSL_get_jobject(
    WOLFSSL * ssl
)

この関数は、WOLFSSL構造体のjObjectRefメンバを返します。

Parameters:

  • ssl wolfSSL_new()を使用して作成されたWOLFSSL構造体へのポインタ。

See: wolfSSL_set_jobject

Return:

  • value WOLFSSL構造体がNULLでない場合、関数はjObjectRef値を返します。
  • NULL WOLFSSL構造体がNULLの場合に返されます。

Example

WOLFSSL_CTX* ctx = wolfSSL_CTX_new( protocol method );
WOLFSSL* ssl = wolfSSL(ctx);
...
void* jobject = wolfSSL_get_jobject(ssl);

if(jobject != NULL){
    // 成功ケース
}

function wolfSSL_connect

int wolfSSL_connect(
    WOLFSSL * ssl
)

この関数はクライアント側で呼び出され、サーバとのSSL/TLSハンドシェイクを開始します。この関数が呼び出されるとき、基礎となる通信チャネルはすでに設定されています。wolfSSL_connect()は、ブロッキングI/Oと非ブロッキングI/Oの両方で動作します。基礎となるI/Oが非ブロッキングの場合、wolfSSL_connect()は、基礎となるI/OがwolfSSL_connect()がハンドシェイクを続行するために必要とするものを満たすことができないときに返されます。この場合、wolfSSL_get_error()の呼び出しはSSL_ERROR_WANT_READまたはSSL_ERROR_WANT_WRITEを返します。呼び出しプロセスは、基礎となるI/Oの準備ができたときにwolfSSL_connect()の呼び出しを繰り返す必要があり、wolfSSLは中断したところから再開します。非ブロッキングソケットを使用する場合、何もする必要はありませんが、select()を使用して必要な条件を確認できます。基礎となるI/Oがブロッキングの場合、wolfSSL_connect()はハンドシェイクが完了するかエラーが発生するまで返されません。wolfSSLは、OpenSSLとは異なるアプローチで証明書検証を行います。クライアントのデフォルトポリシーはサーバを検証することです。つまり、サーバを検証するためのCAを読み込まない場合、接続エラー、検証不可(-155)が発生します。サーバの検証が失敗してもSSL_connectが成功し、セキュリティを低下させるOpenSSLの動作を模倣したい場合は、SSL_new()を呼び出す前にSSL_CTX_set_verify(ctx, SSL_VERIFY_NONE, 0);を呼び出すことでこれを実現できます。ただし、推奨されません。

Parameters:

  • ssl wolfSSL_new()を使用して作成されたWOLFSSL構造体へのポインタ。

See:

Return:

  • SSL_SUCCESS 成功した場合。
  • SSL_FATAL_ERROR エラーが発生した場合に返されます。より詳細なエラーコードを取得するには、wolfSSL_get_error()を呼び出してください。

Example

int ret = 0;
int err = 0;
WOLFSSL* ssl;
char buffer[80];
...
ret = wolfSSL_connect(ssl);
if (ret != SSL_SUCCESS) {
    err = wolfSSL_get_error(ssl, ret);
    printf("error = %d, %s\n", err, wolfSSL_ERR_error_string(err, buffer));
}

function wolfSSL_update_keys

int wolfSSL_update_keys(
    WOLFSSL * ssl
)

この関数は、鍵のロールオーバーを強制するために、TLS v1.3クライアントまたはサーバwolfSSLで呼び出されます。KeyUpdateメッセージがピアに送信され、暗号化用の新しい鍵が計算されます。ピアはKeyUpdateメッセージを送り返し、その後新しい復号鍵が計算されます。この関数は、ハンドシェイクが完了した後にのみ呼び出すことができます。

Parameters:

  • ssl wolfSSL_new()を使用して作成されたWOLFSSL構造体へのポインタ。

See: wolfSSL_write

Return:

  • BAD_FUNC_ARG sslがNULLまたはTLS v1.3を使用していない場合。
  • WANT_WRITE 書き込みの準備ができていない場合。
  • WOLFSSL_SUCCESS 成功した場合。

Example

int ret;
WOLFSSL* ssl;
...
ret = wolfSSL_update_keys(ssl);
if (ret == WANT_WRITE) {
    // I/Oの準備ができたら再度呼び出す必要があります。
}
else if (ret != WOLFSSL_SUCCESS) {
    // 鍵更新の送信に失敗しました。
}

function wolfSSL_key_update_response

int wolfSSL_key_update_response(
    WOLFSSL * ssl,
    int * required
)

この関数は、鍵のロールオーバーが進行中かどうかを判断するために、TLS v1.3クライアントまたはサーバwolfSSLで呼び出されます。wolfSSL_update_keys()が呼び出されると、KeyUpdateメッセージが送信され、暗号化鍵が更新されます。復号鍵は、応答を受信したときに更新されます。

Parameters:

  • ssl wolfSSL_new()を使用して作成されたWOLFSSL構造体へのポインタ。
  • required 鍵更新応答が不要な場合は0。鍵更新応答が必要な場合は1。

See: wolfSSL_update_keys

Return:

  • 0 成功した場合。
  • BAD_FUNC_ARG sslがNULLまたはTLS v1.3を使用していない場合。

Example

int ret;
WOLFSSL* ssl;
int required;
...
ret = wolfSSL_key_update_response(ssl, &required);
if (ret != 0) {
    // 不正なパラメータ
}
if (required) {
    // 暗号化鍵が更新され、復号鍵を変更するための応答を待っています。
}

function wolfSSL_request_certificate

int wolfSSL_request_certificate(
    WOLFSSL * ssl
)

この関数は、TLS v1.3クライアントからクライアント証明書を要求します。これは、Webサーバがクライアント認証を必要とするページと必要としないページの両方を提供している場合に便利です。接続上で最大256回の要求を送信できます。

Parameters:

  • ssl wolfSSL_new()を使用して作成されたWOLFSSL構造体へのポインタ。

See:

Return:

  • BAD_FUNC_ARG sslがNULLの場合、またはTLS v1.3を使用していない場合。
  • WANT_WRITE 書き込みの準備ができていない場合。
  • SIDE_ERROR クライアントで呼び出された場合。
  • NOT_READY_ERROR ハンドシェイクが完了していないときに呼び出された場合。
  • POST_HAND_AUTH_ERROR ポストハンドシェイク認証が許可されていない場合。
  • MEMORY_E 動的メモリ割り当てが失敗した場合。
  • WOLFSSL_SUCCESS 成功時。

Example

int ret;
WOLFSSL* ssl;
...
ret = wolfSSL_request_certificate(ssl);
if (ret == WANT_WRITE) {
    // I/Oの準備ができたら再度呼び出す必要があります
}
else if (ret != WOLFSSL_SUCCESS) {
    // クライアント証明書の要求に失敗しました
}

function wolfSSL_connect_TLSv13

int wolfSSL_connect_TLSv13(
    WOLFSSL * 
)

この関数はクライアント側で呼び出され、サーバとのTLS v1.3ハンドシェイクを開始します。この関数が呼び出されるとき、基礎となる通信チャネルはすでに設定されています。wolfSSL_connect()はブロッキングI/Oと非ブロッキングI/Oの両方で動作します。基礎となるI/Oが非ブロッキングの場合、基礎となるI/OがwolfSSL_connect()がハンドシェイクを続行するために必要なものを満たせない場合、wolfSSL_connect()は返されます。この場合、wolfSSL_get_error()を呼び出すとSSL_ERROR_WANT_READまたはSSL_ERROR_WANT_WRITEのいずれかが返されます。呼び出し側プロセスは、基礎となるI/Oの準備ができたときにwolfSSL_connect()の呼び出しを繰り返す必要があり、wolfSSLは中断したところから再開します。非ブロッキングソケットを使用する場合、何もする必要はありませんが、select()を使用して必要な条件を確認できます。基礎となるI/OがブロッキングI/Oの場合、wolfSSL_connect()はハンドシェイクが完了するかエラーが発生するまで返されません。wolfSSLは証明書検証にOpenSSLとは異なるアプローチを取ります。クライアントのデフォルトポリシーはサーバを検証することです。つまり、サーバを検証するためのCAをロードしない場合、接続エラー「検証できません(-155)」が発生します。サーバの検証が失敗してもSSL_connectが成功するというOpenSSLの動作を模倣し、セキュリティを低下させたい場合は、SSL_new()を呼び出す前にSSL_CTX_set_verify(ctx, SSL_VERIFY_NONE, 0)を呼び出すことでこれを行うことができます。ただし、これは推奨されません。

Parameters:

  • ssl wolfSSL_new()を使用して作成されたWOLFSSL構造体へのポインタ。

See:

Return:

  • SSL_SUCCESS 成功時。
  • SSL_FATAL_ERROR エラーが発生した場合に返されます。より詳細なエラーコードを取得するには、wolfSSL_get_error()を呼び出してください。

Example

int ret = 0;
int err = 0;
WOLFSSL* ssl;
char buffer[80];
...

ret = wolfSSL_connect_TLSv13(ssl);
if (ret != SSL_SUCCESS) {
    err = wolfSSL_get_error(ssl, ret);
    printf("error = %d, %s\n", err, wolfSSL_ERR_error_string(err, buffer));
}

function wolfSSL_accept_TLSv13

wolfSSL_accept_TLSv13(
    WOLFSSL * ssl
)

この関数はサーバ側で呼び出され、SSL/TLSクライアントがSSL/TLSハンドシェイクを開始するのを待ちます。この関数が呼び出されるとき、基礎となる通信チャネルはすでに設定されています。wolfSSL_accept()はブロッキングI/Oと非ブロッキングI/Oの両方で動作します。基礎となるI/Oが非ブロッキングの場合、基礎となるI/OがwolfSSL_accept()がハンドシェイクを続行するために必要なものを満たせない場合、wolfSSL_accept()は返されます。この場合、wolfSSL_get_error()を呼び出すとSSL_ERROR_WANT_READまたはSSL_ERROR_WANT_WRITEのいずれかが返されます。呼び出し側プロセスは、データが読み取り可能になったときにwolfSSL_acceptの呼び出しを繰り返す必要があり、wolfSSLは中断したところから再開します。非ブロッキングソケットを使用する場合、何もする必要はありませんが、select()を使用して必要な条件を確認できます。基礎となるI/OがブロッキングI/Oの場合、wolfSSL_accept()はハンドシェイクが完了するかエラーが発生するまで返されません。TLS v1.3接続を期待する場合にこの関数を呼び出してください。ただし、古いバージョンのClientHelloメッセージもサポートされています。

Parameters:

  • ssl wolfSSL_new()を使用して作成されたWOLFSSL構造体へのポインタ。

See:

Return:

  • SSL_SUCCESS 成功時。
  • SSL_FATAL_ERROR エラーが発生した場合に返されます。より詳細なエラーコードを取得するには、wolfSSL_get_error()を呼び出してください。

Example

int ret = 0;
int err = 0;
WOLFSSL* ssl;
char buffer[80];
...

ret = wolfSSL_accept_TLSv13(ssl);
if (ret != SSL_SUCCESS) {
    err = wolfSSL_get_error(ssl, ret);
    printf("error = %d, %s\n", err, wolfSSL_ERR_error_string(err, buffer));
}

function wolfSSL_write_early_data

int wolfSSL_write_early_data(
    WOLFSSL * ssl,
    const void * data,
    int sz,
    int * outSz
)

この関数は再開時にサーバーにアーリーデータを書き込みます。サーバーに接続してハンドシェイクでデータを送信するには、wolfSSL_connect()またはwolfSSL_connect_TLSv13()の代わりにこの関数を呼び出します。この関数はクライアントでのみ使用されます。

Parameters:

  • ssl wolfSSL_new()を使用して作成されたWOLFSSL構造体へのポインタ。
  • data サーバーに書き込むアーリーデータを保持するバッファ。
  • sz 書き込むアーリーデータの量(バイト単位)。
  • outSz 書き込まれたアーリーデータの量(バイト単位)。

See:

Return:

  • BAD_FUNC_ARG ポインタパラメータがNULL、szが0未満、またはTLSv1.3を使用していない場合。
  • SIDE_ERROR サーバーで呼び出された場合。
  • WOLFSSL_FATAL_ERROR 接続が確立されなかった場合。
  • WOLFSSL_SUCCESS 成功した場合。

Example

int ret = 0;
int err = 0;
WOLFSSL* ssl;
byte earlyData[] = { early data };
int outSz;
char buffer[80];
...

ret = wolfSSL_write_early_data(ssl, earlyData, sizeof(earlyData), &outSz);
if (ret != WOLFSSL_SUCCESS) {
    err = wolfSSL_get_error(ssl, ret);
    printf("error = %d, %s\n", err, wolfSSL_ERR_error_string(err, buffer));
    goto err_label;
}
if (outSz < sizeof(earlyData)) {
    // すべてのアーリーデータが送信されませんでした
}
ret = wolfSSL_connect_TLSv13(ssl);
if (ret != SSL_SUCCESS) {
    err = wolfSSL_get_error(ssl, ret);
    printf("error = %d, %s\n", err, wolfSSL_ERR_error_string(err, buffer));
}

function wolfSSL_read_early_data

int wolfSSL_read_early_data(
    WOLFSSL * ssl,
    void * data,
    int sz,
    int * outSz
)

この関数は再開時にクライアントからのアーリーデータを読み取ります。クライアントを受け入れ、ハンドシェイクでアーリーデータを読み取るには、wolfSSL_accept()またはwolfSSL_accept_TLSv13()の代わりにこの関数を呼び出します。wolfSSL_is_init_finished()がtrueを返すまで関数を呼び出す必要があります。アーリーデータは複数のメッセージでクライアントから送信される場合があります。アーリーデータがない場合、ハンドシェイクは通常通り処理されます。この関数はサーバーでのみ使用されます。

Parameters:

  • ssl wolfSSL_new()を使用して作成されたWOLFSSL構造体へのポインタ。
  • data クライアントから読み取ったアーリーデータを保持するバッファ。
  • sz バッファのサイズ(バイト単位)。
  • outSz 読み取ったアーリーデータのバイト数。

See:

Return:

  • BAD_FUNC_ARG ポインタパラメータがNULL、szが0未満、またはTLSv1.3を使用していない場合。
  • SIDE_ERROR クライアントで呼び出された場合。
  • WOLFSSL_FATAL_ERROR 接続の受け入れが失敗した場合。
  • 読み取ったアーリーデータのバイト数(ゼロの場合もあります)。

Example

int ret = 0;
int err = 0;
WOLFSSL* ssl;
byte earlyData[128];
int outSz;
char buffer[80];
...

do {
    ret = wolfSSL_read_early_data(ssl, earlyData, sizeof(earlyData), &outSz);
    if (ret < 0) {
        err = wolfSSL_get_error(ssl, ret);
        printf("error = %d, %s\n", err, wolfSSL_ERR_error_string(err, buffer));
    }
    if (outSz > 0) {
        // アーリーデータが利用可能
    }
} while (!wolfSSL_is_init_finished(ssl));

function wolfSSL_inject

int wolfSSL_inject(
    WOLFSSL * ssl,
    const void * data,
    int sz
)

この関数はWOLFSSLオブジェクトにデータを注入するために呼び出されます。これは、データを単一の場所から読み取り、複数の接続に分割する必要がある場合に便利です。呼び出し元はwolfSSL_read()を呼び出してWOLFSSLオブジェクトから平文データを抽出する必要があります。

Parameters:

  • ssl wolfSSL_new()を使用して作成されたWOLFSSL構造体へのポインタ。
  • data sslオブジェクトに注入するデータ。
  • sz 注入するデータのバイト数。

See: wolfSSL_read

Return:

  • BAD_FUNC_ARG いずれかのポインタパラメータがNULLまたはsz <= 0の場合。
  • APP_DATA_READY 読み取るべきアプリケーションデータが残っている場合。
  • MEMORY_E 割り当てが失敗した場合。
  • WOLFSSL_SUCCESS 成功時。

Example

byte buf[2000]
sz = recv(fd, buf, sizeof(buf), 0);
if (sz <= 0)
    // エラー
if (wolfSSL_inject(ssl, buf, sz) != WOLFSSL_SUCCESS)
    // エラー
sz = wolfSSL_read(ssl, buf, sizeof(buf);

function wolfSSL_GetIOReadCtx

void * wolfSSL_GetIOReadCtx(
    WOLFSSL * ssl
)

この関数はWOLFSSL構造体のIOCB_ReadCtxメンバーを返します。

Parameters:

  • ssl wolfSSL_new()を使用して作成されたWOLFSSL構造体へのポインタ。

See:

Return:

  • pointer この関数はWOLFSSL構造体のIOCB_ReadCtxメンバーへのvoid型ポインタを返します。
  • NULL WOLFSSL構造体がNULLの場合に返されます。

Example

WOLFSSL* ssl = wolfSSL_new(ctx);
void* ioRead;
...
ioRead = wolfSSL_GetIOReadCtx(ssl);
if(ioRead == NULL){
    // 失敗ケース。sslオブジェクトがNULLでした。
}

function wolfSSL_GetIOWriteCtx

void * wolfSSL_GetIOWriteCtx(
    WOLFSSL * ssl
)

この関数はWOLFSSL構造体のIOCB_WriteCtxメンバーを返します。

Parameters:

  • ssl wolfSSL_new()を使用して作成されたWOLFSSL構造体へのポインタ。

See:

Return:

  • pointer この関数はWOLFSSL構造体のIOCB_WriteCtxメンバーへのvoid型ポインタを返します。
  • NULL WOLFSSL構造体がNULLの場合に返されます。

Example

WOLFSSL* ssl;
void* ioWrite;
...
ioWrite = wolfSSL_GetIOWriteCtx(ssl);
if(ioWrite == NULL){
    // 関数がNULLを返しました。
}

function wolfSSL_SetIO_NetX

void wolfSSL_SetIO_NetX(
    WOLFSSL * ssl,
    NX_TCP_SOCKET * nxsocket,
    ULONG waitoption
)

この関数は、WOLFSSL構造体内のnxCtx構造体のnxSocketおよびnxWaitメンバーを設定します。

Parameters:

  • ssl wolfSSL_new()を使用して作成されたWOLFSSL構造体へのポインタ。
  • nxSocket nxCTX構造体のnxSocketメンバーに設定されるNX_TCP_SOCKET型へのポインタ。
  • waitOption nxCtx構造体のnxWaitメンバーに設定されるULONG型。

See:

  • set_fd
  • NetX_Send
  • NetX_Receive

Return: none 戻り値なし。

Example

WOLFSSL* ssl = wolfSSL_new(ctx);
NX_TCP_SOCKET* nxSocket;
ULONG waitOption;
…
if(ssl != NULL || nxSocket != NULL || waitOption <= 0){
wolfSSL_SetIO_NetX(ssl, nxSocket, waitOption);
} else {
    // 適切なパラメータを渡す必要があります。
}

Updated on 2025-12-12 at 03:08:16 +0000