wolfTips:BSDソケット非互換APIを使いたい

wolfSSL本体は、ネットワークトランスポート層の実装には依存しない構成になっています。
BSDソケットAPI以外のネットワークトランスポートAPIを使用する場合は、WOLFSSL_USER_IOオプションをdefineして、他のトランスポートAPIを使った送受信のコールバック関数を定義します。
コールバック関数の設定は、受信処理はwolfSSL_SetIORecv(ctx, IO_callback_Recv)、送信処理はwolfSSL_SetIOSend(ctx, IO_callback_Send)でwolfSSLに、実行時に設定します。
送受信コールバック関数の中で例えば使用するソケットなどコンテクスト依存の値を必要とする場合があります。そのような場合は、wolfSSL_SetIOWriteCtxとwolfSSL_SetIOReadCtx 関数で使用するコンテクストへのポインタを登録します。また、ソケットfdのような送受信共通の整数値の場合はwolfSSL_set_fd関数を使って登録することもできます。

コーディングイメージ:
user_settings.h

#define WOLFSSL_USER_IO

送信処理コールバックの定義
int MyTransSend(WOLFSSL* ssl, char* msg, int sz, void* ctx){
int sockfd = *(int*)ctx;
if((ret = xxxx_write(sockfd, msg, sz)) < 0){
switch (errno) {
case XXX:

default:
return WOLFSSL_CBIO_ERR_GENERAL;
}
else return ret;
}
int MyTransRecv(WOLFSSL* ssl, char* msg, int sz, void* ctx){
int sockfd = *(int*)ctx;
if((ret = xxxx_read(sockfd, msg, sz) < 0){
switch (errno) {
case XXX:

default:
return WOLFSSL_CBIO_ERR_GENERAL;
}
else return ret;
}

実行部
ctx = wolfSSL_CTX_new( … );
/* コールバック登録 */
wolfSSL_SetIOSend(ctx, MyTransSend);
wolfSSL_SetIORecv(ctx, MyTransRecv);
ssl = wolfSSL_new(ctx);
/* 送受信時のコンテクストの登録 */
wolfSSL_SetIOWriteCtx(WOLFSSL* ssl, (void *)wctx)
wolfSSL_SetIOReadCtx (WOLFSSL* ssl, (void *)rctx);
/* 送受信時のコンテクストの登録(ソケットfd) */
wolfSSL_set_fd(ssl, fd);
===
wolfSSLユーザーズマニュアルの「5.1.2 カスタム入出力抽象化レイヤー」やサンプルプログラムもご参照ください。
wolfSSLユーザーズマニュアル
https://wolfssl.jp/wordpress/wolfsite/fwd_wolfSSL_UserManual-jp-3_9_0/
簡単なTLSサーバ、クライアントでの使用例:
https://github.com/wolfSSL/wolfssl-examples/blob/master/tls/server-tls-callback.c
https://github.com/wolfSSL/wolfssl-examples/blob/master/tls/client-tls-callback.c
さらに詳しい情報は弊社問い合わせ窓口info@wolfssl.jpまでお問い合わせください。
wolfSSLホーム:www.wolfssl.jp (English:www.wolfssl.com)