コールバック
ハンドシェイクコールバック
wolfSSL(以前のCyassl)には、ハンドシェイクコールバックが接続または待受に設定できるようにする拡張子があります。これは、別のデバッガが利用できず、スニッフィングが実用的でない場合に、組み込みシステムでのデバックに役立ちます。wolfSSLハンドシェイクコールバックを使用するには、拡張機能、wolfSSL_connect_ex()
およびwolfSSL_accept_ex()
を使用します。
int wolfSSL_connect_ex(WOLFSSL*, HandShakeCallBack, TimeoutCallBack,
Timeval)
int wolfSSL_accept_ex(WOLFSSL*, HandShakeCallBack, TimeoutCallBack,
Timeval)
HandShakeCallBack
は次のように定義されています。
typedef int (*HandShakeCallBack)(HandShakeInfo*);
HandShakeInfo
はwolfssl/callbacks.h
で定義されています(標準以外のビルドに追加する必要があります):
typedef struct handShakeInfo_st {
char cipherName[MAX_CIPHERNAME_SZ + 1]; /*negotiated name */
char packetNames[MAX_PACKETS_HANDSHAKE][MAX_PACKETNAME_SZ+1];
/* SSL packet names */
int numberPackets; /*actual # of packets */
int negotiationError; /*cipher/parameter err */
} HandShakeInfo;
ハンドシェーク中のSSLパケットの最大数がわかっているため、動的メモリは使用されません。パケット名には、packetNames[idx]
から numberPackets
までアクセスできます。コールバックは、ハンドシェイクエラーが発生したかどうかを呼び出します。使用法の例がクライアントのサンプルプログラムにあります。
タイムアウトコールバック
wolfSSLハンドシェイクコールバックで使用されているのと同じ拡張機能をwolfSSLタイムアウトコールバックにも使用できます。これらの拡張機能は、コールバック (Handshake および/または Timeout) のいずれか、両方、またはどちらも使用せずに呼び出すことができます。TimeoutCallback
は次のように定義されています。
typedef int (*TimeoutCallBack)(TimeoutInfo*);
TimeoutInfo
は次のようになります。
typedef struct timeoutInfo_st {
char timeoutName[MAX_TIMEOUT_NAME_SZ +1]; /*timeout Name*/
int flags; /* for future use*/
int numberPackets; /*actual # of packets */
PacketInfo packets[MAX_PACKETS_HANDSHAKE]; /*list of packets */
Timeval timeoutValue; /*timer that caused it */
} TimeoutInfo;
やはり、最大数のSSLパケットがハンドシェイクでわかっているので、この構造に動的メモリは使用されません。Timeval
は、struct timevalのtypedefです。
PacketInfo
は次のように定義されています。
typedef struct packetInfo_st {
char packetName[MAX_PACKETNAME_SZ + 1]; /* SSL name */
Timeval timestamp; /* when it occured */
unsigned char value[MAX_VALUE_SZ]; /* if fits, it's here */
unsigned char* bufferValue; /* otherwise here (non 0) */
int valueSz; /* sz of value or buffer */
} PacketInfo;
ここでは、動的メモリを用いてもよい。SSLパケットがvalue
に収まることができる場合、それが配置されている場所です。valueSz
は長さとbufferValue
を保持します。パケットがvalue
で大きすぎる場合は、証明書パケットのみがこれを引き起こすはずです.valueSz
にはSIZEを保持します。
証明書パケットにメモリが割り当てられている場合は、コールバックが返された後に回収されます。タイムアウトはシグナル、具体的には SIGALRM
を使用して実装され、スレッドセーフです。以前のアラームがタイプITIMER_REAL
のセットである場合、その後、正しいハンドラーとともにリセットされます。古いタイマーは、wolfSSL が処理に費やす時間に合わせて調整されます。既存のタイマーが渡されたタイマーよりも短い場合、既存のタイマー値が使用されます。その後はまだリセットされます。期限切れになる既存のタイマーは、それに関連付けられた間隔がある場合、リセットされます。コールバックは、タイムアウトが発生した場合にのみ発行されます。
使用法についてはクライアントの例を参照してください。
ユーザーアトミックレコードレイヤー処理
wolfSSLは、SSL/TLS接続中にMAC/暗号化、復号化/検証などの機能をより制御したユーザーにアトミックレコード処理コールバックを提供します。
ユーザーは2つの関数を定義する必要があります。
-
Mac/暗号化コールバック関数
-
復号化/検証コールバック関数
これらの2つの関数は、ssl.h
のCallbackMacEncrypt
およびCallbackDecryptVerify
によってプロトタイプ化されています。
typedef int (*CallbackMacEncrypt)(WOLFSSL* ssl,
unsigned char* macOut,const unsigned char* macIn,
unsigned int macInSz,int macContent, int macVerify,
unsigned char* encOut, const unsigned char* encIn,
unsigned int encSz,void* ctx);
typedef int (*CallbackDecryptVerify)(WOLFSSL* ssl,
unsigned char* decOut, const unsigned char* decIn,
unsigned int decSz, int content, int verify,
unsigned int* padSz, void* ctx);
ユーザーは、wolfSSL_CTX_SetMacEncryptCb()
および[wolfSSL_CTX_SetDecryptVerifyCb()
](ssl_8h.md#function-wolfssl_ctx_setdecryptverifycb()でwolfSSLコンテキスト(WOLFSSL_CTX
)ごとにこれらの機能を書いて登録する必要があります。
ユーザーは、wolfSSL_SetMacEncryptCtx()
とwolfSSL_SetDecryptVerifyCtx()
でwolfSSLオブジェクト(セッション)ごとにコンテキストを設定できます。このコンテキストは、ユーザー指定のコンテキストへのポインタであり得ます。これは次にMac/EncryptおよびDecrypt/Decrypt/Decrypt/Verify Callbacksに渡されます。void* ctx
パラメータ。
- コールバックの例は、
-U
コマンドラインオプションを使用する場合、wolfssl/test.h
、myMacEncryptCb()
およびmyDecryptVerifyCb()
の下で、wolfSSLの例クライアント(examples/client/client.c
)で使用できます。
Atomic Record Layer Callbacksを使用するには、wolfSSLを--enable-atomicuser
Configureオプションを使用してコンパイルする必要があります。
公開キーのコールバック
wolfSSLは、SSL/TLS接続中にRSAの署名/検証機能をもっと多くの制御を希望するユーザーのための公開鍵コールバックを提供します。
ユーザーはオプションで7つの関数を定義できます。
-
ECCサインコールバック
-
ECCの確認コールバック
-
ECCはシークレットコールバックを共有しました
-
RSAサインコールバック
-
RSAはコールバックを検証します
-
RSA暗号化コールバック
-
RSA復号化コールバック
これら2つの機能はssl.h
にCallbackRsaSign
,CallbackEccVerify
,CallbackRsaSign
,CallbackRsaSign
,CallbackRsaEnc
、CallbackRsaEnc
、CallbackRsaEnc
、CallbackRsaSign
、CallbackRsaEnc
、CallbackRsaDec
、CallbackRsaDec
、CallbackRsaDec
typedef int (*CallbackEccSign)(WOLFSSL* ssl, const unsigned
char* in, unsigned int inSz, unsigned char* out,
unsigned int* outSz, const unsigned char* keyDer,
unsigned int keySz, void* ctx);
typedef int (*CallbackEccVerify)(WOLFSSL* ssl,
const unsigned char* sig, unsigned int sigSz,
const unsigned char* hash, unsigned int hashSz,
const unsigned char* keyDer, unsigned int keySz,
int* result, void* ctx);
typedef int (*CallbackEccSharedSecret)(WOLFSSL* ssl,
struct ecc_key* otherKey,
unsigned char* pubKeyDer, unsigned int* pubKeySz,
unsigned char* out, unsigned int* outlen,
int side, void* ctx);
typedef int (*CallbackRsaSign)(WOLFSSL* ssl,
const unsigned char* in, unsigned int inSz,
unsigned char* out, unsigned int* outSz,
const unsigned char* keyDer, unsigned int keySz,
void* ctx);
typedef int (*CallbackRsaVerify)(WOLFSSL* ssl,
unsigned char* sig, unsigned int sigSz,
unsigned char** out, const unsigned char* keyDer,
unsigned int keySz, void* ctx);
typedef int (*CallbackRsaEnc)(WOLFSSL* ssl,
const unsigned char* in, unsigned int inSz,
Unsigned char* out, unsigned int* outSz,
const unsigned char* keyDer,
unsigned int keySz, void* ctx);
typedef int (*CallbackRsaDec)(WOLFSSL* ssl, unsigned char* in,
unsigned int inSz, unsigned char** out,
const unsigned char* keyDer, unsigned int keySz,
void* ctx);
ユーザーはwolfSSLコンテキストごとにこれらの機能を書いて登録する必要があります(WOLFSSL_CTX
)。
-
wolfSSL_CTX_SetEccSharedSecretCb()
ユーザーは、次のようにWOLFSSL
オブジェクト(セッション)ごとにコンテキストを設定できます。
-
wolfSSL_SetEccSharedSecretCtx()
これらのコンテキストは、ユーザー指定のコンテキストへのポインターである場合があります。これにより、void* ctx
パラメーターを介してそれぞれの公開キーコールバックに渡されます。
コールバックの例は、wolfssl/test.h
、myEccSign()
、myEccVerify()
、myEccSharedSecret()
、myRsaSign()
、myRsaVerify()
、myRsaEnc()
、およびmyRsaDec()
に基づいて見つけることができます。
Atomic Record Layer Callbacksを使用するには、wolfSSLを--enable-pkcallbacks
Configureオプションを使用してコンパイルする必要があります。