2
0

wolfio.h 19 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398
  1. /*!
  2. \brief
  3. \return Success この関数は、読み取られたバイト数を返します。
  4. \return WOLFSSL_CBIO_ERR_WANT_READ 最後のエラーがsocket_ewouldbolcokまたはsocket_eagainであれば、メッセージを返されます。
  5. \return WOLFSSL_CBIO_ERR_TIMEOUT "Socket Timeout"メッセージを返しました。
  6. \return WOLFSSL_CBIO_ERR_CONN_RST 最後のエラーがsocket_econnresetの場合、 "Connection Reset"メッセージで返されます。
  7. \return WOLFSSL_CBIO_ERR_ISR 最後のエラーがsocket_eintrの場合、 "Socket Interrupted"メッセージが返されます。
  8. \return WOLFSSL_CBIO_ERR_WANT_READ 最後のエラーがsocket_econneRefusedの場合、「接続拒否」メッセージを返しました。
  9. \return WOLFSSL_CBIO_ERR_CONN_CLOSE 最後のエラーがSOCKET_ECONNABORTEDの場合、「接続中止」メッセージで返されます。
  10. \return WOLFSSL_CBIO_ERR_GENERAL 最後のエラーが指定されていない場合は、「一般的なエラー」メッセージで返されます。
  11. \param ssl wolfssl_new()を使用して作成されたWolfSSL構造へのポインタ。
  12. \param buf バッファのチャーポインタ表現。
  13. \param sz バッファのサイズ。
  14. _Example_
  15. \code
  16. WOLFSSL_CTX* ctx = wolfSSL_CTX_new( protocol method );
  17. WOLFSSL* ssl = wolfSSL_new(ctx);
  18. char* buf;
  19. int sz;
  20. void* ctx;
  21. int bytesRead = EmbedReceive(ssl, buf, sz, ctx);
  22. if(bytesRead <= 0){
  23. // There were no bytes read. Failure case.
  24. }
  25. \endcode
  26. \sa EmbedSend
  27. \sa wolfSSL_CTX_SetIORecv
  28. \sa wolfSSL_SSLSetIORecv
  29. */
  30. int EmbedReceive(WOLFSSL* ssl, char* buf, int sz, void* ctx);
  31. /*!
  32. \brief
  33. \return Success この関数は送信されたバイト数を返します。
  34. \return WOLFSSL_CBIO_ERR_WANT_WRITE 最後のエラーがsocket_ewouldblockまたはsocket_eagainであれば、 "Block"メッセージを返します。
  35. \return WOLFSSL_CBIO_ERR_CONN_RST 最後のエラーがsocket_econnresetの場合、 "Connection Reset"メッセージで返されます。
  36. \return WOLFSSL_CBIO_ERR_ISR 最後のエラーがsocket_eintrの場合、 "Socket Interrupted"メッセージが返されます。
  37. \return WOLFSSL_CBIO_ERR_CONN_CLOSE 最後のエラーがsocket_epipeの場合、 "Socket Epipe"メッセージを返しました。
  38. \return WOLFSSL_CBIO_ERR_GENERAL 最後のエラーが指定されていない場合は、「一般的なエラー」メッセージで返されます。
  39. \param ssl wolfssl_new()を使用して作成されたWolfSSL構造へのポインタ。
  40. \param buf バッファを表す文字ポインタ。
  41. \param sz バッファのサイズ。
  42. _Example_
  43. \code
  44. WOLFSSL* ssl = wolfSSL_new(ctx);
  45. char* buf;
  46. int sz;
  47. void* ctx;
  48. int dSent = EmbedSend(ssl, buf, sz, ctx);
  49. if(dSent <= 0){
  50. // No byes sent. Failure case.
  51. }
  52. \endcode
  53. \sa EmbedReceive
  54. \sa wolfSSL_CTX_SetIOSend
  55. \sa wolfSSL_SSLSetIOSend
  56. */
  57. int EmbedSend(WOLFSSL* ssl, char* buf, int sz, void* ctx);
  58. /*!
  59. \brief
  60. \return Success この関数は、実行が成功した場合に読み込まれたNBバイトを返します。
  61. \return WOLFSSL_CBIO_ERR_WANT_READ 接続が拒否された場合、または「ブロック」エラーが発生した場合は機能にスローされました。
  62. \return WOLFSSL_CBIO_ERR_TIMEOUT ソケットがタイムアウトした場合は返されます。
  63. \return WOLFSSL_CBIO_ERR_CONN_RST 接続がリセットされている場合は返されます。
  64. \return WOLFSSL_CBIO_ERR_ISR ソケットが中断された場合は返されます。
  65. \return WOLFSSL_CBIO_ERR_GENERAL 一般的なエラーがあった場合に返されます。
  66. \param ssl wolfssl_new()を使用して作成されたWolfSSL構造へのポインタ。
  67. \param buf バッファへの定数の文字ポインタ。
  68. \param sz バッファのサイズを表すint型。
  69. _Example_
  70. \code
  71. WOLFSSL_CTX* ctx = wolfSSL_CTX_new( protocol method );
  72. WOLFSSL* ssl = WOLFSSL_new(ctx);
  73. char* buf;
  74. int sz = sizeof(buf)/sizeof(char);
  75. (void*)ctx;
  76. int nb = EmbedReceiveFrom(ssl, buf, sz, ctx);
  77. if(nb > 0){
  78. // nb is the number of bytes written and is positive
  79. }
  80. \endcode
  81. \sa EmbedSendTo
  82. \sa wolfSSL_CTX_SetIORecv
  83. \sa wolfSSL_SSLSetIORecv
  84. \sa wolfSSL_dtls_get_current_timeout
  85. */
  86. int EmbedReceiveFrom(WOLFSSL* ssl, char* buf, int sz, void*);
  87. /*!
  88. \brief
  89. \return Success この関数は送信されたバイト数を返します。
  90. \return WOLFSSL_CBIO_ERR_WANT_WRITE 最後のエラーがsocket_ewouldblockまたはsocket_eagainエラーの場合、 "Block"メッセージを返します。
  91. \return WOLFSSL_CBIO_ERR_CONN_RST 最後のエラーがsocket_econnresetの場合、 "Connection Reset"メッセージで返されます。
  92. \return WOLFSSL_CBIO_ERR_ISR 最後のエラーがsocket_eintrの場合、 "Socket Interrupted"メッセージが返されます。
  93. \return WOLFSSL_CBIO_ERR_CONN_CLOSE 最後のエラーがwolfssl_cbio_err_conn_croseの場合、 "Socket Epipe"メッセージを返しました。
  94. \return WOLFSSL_CBIO_ERR_GENERAL 最後のエラーが指定されていない場合は、「一般的なエラー」メッセージで返されます。
  95. \param ssl wolfssl_new()を使用して作成されたWolfSSL構造へのポインタ。
  96. \param buf バッファを表す文字ポインタ。
  97. \param sz バッファのサイズ。
  98. _Example_
  99. \code
  100. WOLFSSL* ssl;
  101. char* buf;
  102. int sz;
  103. void* ctx;
  104. int sEmbed = EmbedSendto(ssl, buf, sz, ctx);
  105. if(sEmbed <= 0){
  106. // No bytes sent. Failure case.
  107. }
  108. \endcode
  109. \sa EmbedReceiveFrom
  110. \sa wolfSSL_CTX_SetIOSend
  111. \sa wolfSSL_SSLSetIOSend
  112. */
  113. int EmbedSendTo(WOLFSSL* ssl, char* buf, int sz, void* ctx);
  114. /*!
  115. \brief
  116. \return Success この関数は、バッファにコピーされたバイト数を返します。
  117. \return GEN_COOKIE_E getPeernameがEmbedGenerateCookieに失敗した場合に返されます。
  118. \param ssl wolfssl_new()を使用して作成されたWolfSSL構造へのポインタ。
  119. \param buf バッファを表すバイトポインタ。xmemcpy()からの宛先です。
  120. \param sz バッファのサイズ。
  121. _Example_
  122. \code
  123. WOLFSSL_CTX* ctx = wolfSSL_CTX_new( method );
  124. WOLFSSL* ssl = wolfSSL_new(ctx);
  125. byte buffer[BUFFER_SIZE];
  126. int sz = sizeof(buffer)/sizeof(byte);
  127. void* ctx;
  128. int ret = EmbedGenerateCookie(ssl, buffer, sz, ctx);
  129. if(ret > 0){
  130. // EmbedGenerateCookie code block for success
  131. }
  132. \endcode
  133. \sa wolfSSL_CTX_SetGenCookie
  134. */
  135. int EmbedGenerateCookie(WOLFSSL* ssl, unsigned char* buf,
  136. int sz, void*);
  137. /*!
  138. \brief
  139. \return none いいえ返します。
  140. \param ctx ヒープヒントへのvoidポインタ。
  141. _Example_
  142. \code
  143. void* ctx;
  144. byte* resp; // Response buffer.
  145. EmbedOcspRespFree(ctx, resp);
  146. \endcode
  147. \sa wolfSSL_CertManagerSetOCSP_Cb
  148. \sa wolfSSL_CertManagerEnableOCSPStapling
  149. \sa wolfSSL_CertManagerEnableOCSP
  150. */
  151. void EmbedOcspRespFree(void* ctx, byte* resp);
  152. /*!
  153. \brief データ。デフォルトでは、WolfSSLはシステムのTCP RECV()関数を使用するコールバックとしてEmbedReceive()を使用します。ユーザは、メモリ、他のネットワークモジュール、またはどこからでも入力するように機能を登録できます。関数の機能とエラーコードのためのガイドとして、src / io.cの埋め込みReceive()関数を参照してください。特に、データが準備ができていないときに、IO_ERR_WANT_READを非ブロック受信用に返す必要があります。
  154. \return none いいえ返します。
  155. \param ctx wolfssl_ctx_new()で作成されたSSLコンテキストへのポインタ。
  156. _Example_
  157. \code
  158. WOLFSSL_CTX* ctx = 0;
  159. // Receive callback prototype
  160. int MyEmbedReceive(WOLFSSL* ssl, char* buf, int sz, void* ctx);
  161. // Register the custom receive callback with wolfSSL
  162. wolfSSL_CTX_SetIORecv(ctx, MyEmbedReceive);
  163. int MyEmbedReceive(WOLFSSL* ssl, char* buf, int sz, void* ctx)
  164. {
  165. // custom EmbedReceive function
  166. }
  167. \endcode
  168. \sa wolfSSL_CTX_SetIOSend
  169. \sa wolfSSL_SetIOReadCtx
  170. \sa wolfSSL_SetIOWriteCtx
  171. */
  172. void wolfSSL_CTX_SetIORecv(WOLFSSL_CTX* ctx, CallbackIORecv CBIORecv);
  173. /*!
  174. \brief コールバック関数デフォルトでは、WolfSSLは、WolfSSLがシステムのTCPライブラリを使用している場合、wolfssl_set_fd()に渡されたファイル記述子をコンテキストとして設定します。自分の受信コールバックを登録した場合は、セッションの特定のコンテキストを設定することができます。たとえば、メモリバッファを使用している場合、コンテキストは、メモリバッファーのどこにありかを説明する構造へのポインタであり得る。
  175. \return none いいえ返します。
  176. \param ssl wolfssl_new()で作成されたSSLセッションへのポインタ。
  177. _Example_
  178. \code
  179. int sockfd;
  180. WOLFSSL* ssl = 0;
  181. ...
  182. // Manually setting the socket fd as the receive CTX, for example
  183. wolfSSL_SetIOReadCtx(ssl, &sockfd);
  184. ...
  185. \endcode
  186. \sa wolfSSL_CTX_SetIORecv
  187. \sa wolfSSL_CTX_SetIOSend
  188. \sa wolfSSL_SetIOWriteCtx
  189. */
  190. void wolfSSL_SetIOReadCtx( WOLFSSL* ssl, void *ctx);
  191. /*!
  192. \brief コールバック関数デフォルトでは、WolfSSLは、WolfSSLがシステムのTCPライブラリを使用している場合、wolfssl_set_fd()に渡されたファイル記述子をコンテキストとして設定します。独自の送信コールバックを登録した場合は、セッションの特定のコンテキストを設定することができます。たとえば、メモリバッファを使用している場合、コンテキストは、メモリバッファーのどこにありかを説明する構造へのポインタであり得る。
  193. \return none いいえ返します。
  194. \param ssl wolfssl_new()で作成されたSSLセッションへのポインタ。
  195. _Example_
  196. \code
  197. int sockfd;
  198. WOLFSSL* ssl = 0;
  199. ...
  200. // Manually setting the socket fd as the send CTX, for example
  201. wolfSSL_SetIOWriteCtx(ssl, &sockfd);
  202. ...
  203. \endcode
  204. \sa wolfSSL_CTX_SetIORecv
  205. \sa wolfSSL_CTX_SetIOSend
  206. \sa wolfSSL_SetIOReadCtx
  207. */
  208. void wolfSSL_SetIOWriteCtx(WOLFSSL* ssl, void *ctx);
  209. /*!
  210. \ingroup IO
  211. \brief この関数は、WolfSSL構造体のIOCB_READCTXメンバーを返します。
  212. \return pointer この関数は、wolfssl構造体のiocb_readctxメンバーへのvoidポインタを返します。
  213. \return NULL wolfssl構造体がNULLの場合に返されます。
  214. _Example_
  215. \code
  216. WOLFSSL* ssl = wolfSSL_new(ctx);
  217. void* ioRead;
  218. ...
  219. ioRead = wolfSSL_GetIOReadCtx(ssl);
  220. if(ioRead == NULL){
  221. // Failure case. The ssl object was NULL.
  222. }
  223. \endcode
  224. \sa wolfSSL_GetIOWriteCtx
  225. \sa wolfSSL_SetIOReadFlags
  226. \sa wolfSSL_SetIOWriteCtx
  227. \sa wolfSSL_SetIOReadCtx
  228. \sa wolfSSL_CTX_SetIOSend
  229. */
  230. void* wolfSSL_GetIOReadCtx( WOLFSSL* ssl);
  231. /*!
  232. \ingroup IO
  233. \brief この関数は、WolfSSL構造のIOCB_WRITECTXメンバーを返します。
  234. \return pointer この関数は、WolfSSL構造のIOCB_WRITECTXメンバーへのvoidポインタを返します。
  235. \return NULL wolfssl構造体がNULLの場合に返されます。
  236. _Example_
  237. \code
  238. WOLFSSL* ssl;
  239. void* ioWrite;
  240. ...
  241. ioWrite = wolfSSL_GetIOWriteCtx(ssl);
  242. if(ioWrite == NULL){
  243. // The function returned NULL.
  244. }
  245. \endcode
  246. \sa wolfSSL_GetIOReadCtx
  247. \sa wolfSSL_SetIOWriteCtx
  248. \sa wolfSSL_SetIOReadCtx
  249. \sa wolfSSL_CTX_SetIOSend
  250. */
  251. void* wolfSSL_GetIOWriteCtx(WOLFSSL* ssl);
  252. /*!
  253. \brief 与えられたSSLセッション受信コールバックは、デフォルトのwolfssl埋め込み受信コールバック、またはユーザによって指定されたカスタムコールバックであり得る(wolfssl_ctx_setiorecvを参照)。デフォルトのフラグ値は、WolfSSLによってwolfsslによって0の値に設定されます。デフォルトのWolfSSL受信コールバックはRECV()関数を使用してソケットからデータを受信します。 「Recv()」ページから:「Recv()関数へのflags引数は、1つ以上の値をOR処理するか、MSG_OOBプロセス帯域外データ、MSG_PEEK PEEK、MSG_PEEK PEEK、MSG_WAITALLがフルを待っています要求またはエラー。 MSG_OOBフラグは、通常のデータストリームで受信されないであろう帯域外データの受信を要求します。一部のプロトコルは通常のデータキューの先頭に迅速なデータを配置し、このフラグをそのようなプロトコルで使用することはできません。 MSG_PEEKフラグは、受信操作によって受信キューの先頭からのデータをキューから削除することなくデータを返します。したがって、以降の受信呼び出しは同じデータを返します。 MSG_WAITALLフラグは、完全な要求が満たされるまで操作ブロックを要求します。ただし、信号がキャッチされている場合は、呼び出し側よりも少ないデータが少なく、エラーまたは切断が発生するか、または受信されるデータが返されるものとは異なるタイプのデータを返します。
  254. \return none いいえ返します。
  255. \param ssl wolfssl_new()で作成されたSSLセッションへのポインタ。
  256. _Example_
  257. \code
  258. WOLFSSL* ssl = 0;
  259. ...
  260. // Manually setting recv flags to 0
  261. wolfSSL_SetIOReadFlags(ssl, 0);
  262. ...
  263. \endcode
  264. \sa wolfSSL_CTX_SetIORecv
  265. \sa wolfSSL_CTX_SetIOSend
  266. \sa wolfSSL_SetIOReadCtx
  267. */
  268. void wolfSSL_SetIOReadFlags( WOLFSSL* ssl, int flags);
  269. /*!
  270. \brief SSLセッションを考えると送信コールバックは、デフォルトのWolfSSL EmbedEndコールバック、またはユーザーによって指定されたカスタムコールバックのいずれかです(WolfSSL_CTX_SetiosEndを参照)。デフォルトのフラグ値は、wolfsslによって0の値に設定されます。デフォルトのWolfSSL Send Callbackはsend()関数を使用してソケットからデータを送信します。send()manページから: "flagsパラメータには、次のうち1つ以上が含まれていてもよい。フラグMSG_OOBは、この概念(例えばSOCK_STREAM)をサポートするソケットに「帯域外」データを送信するために使用される。基礎となるプロトコルは、「帯域外」のデータもサポートする必要があります。MSG_DONTROUTEは通常、診断プログラムまたはルーティングプログラムによってのみ使用されます。」
  271. \return none いいえ返します。
  272. \param ssl wolfssl_new()で作成されたSSLセッションへのポインタ。
  273. _Example_
  274. \code
  275. WOLFSSL* ssl = 0;
  276. ...
  277. // Manually setting send flags to 0
  278. wolfSSL_SetIOWriteFlags(ssl, 0);
  279. ...
  280. \endcode
  281. \sa wolfSSL_CTX_SetIORecv
  282. \sa wolfSSL_CTX_SetIOSend
  283. \sa wolfSSL_SetIOReadCtx
  284. */
  285. void wolfSSL_SetIOWriteFlags(WOLFSSL* ssl, int flags);
  286. /*!
  287. \ingroup IO
  288. \brief この関数は、wolfssl構造内のnxctx構造体のNxSocketメンバーとNXWAITメンバーを設定します。
  289. \return none いいえ返します。
  290. \param ssl wolfssl_new()を使用して作成されたWolfSSL構造へのポインタ。
  291. \param nxSocket NXCTX構造のNXSOCTOCKメンバーに設定されているNX_TCP_SOCKETを入力するためのポインタ。
  292. _Example_
  293. \code
  294. WOLFSSL* ssl = wolfSSL_new(ctx);
  295. NX_TCP_SOCKET* nxSocket;
  296. ULONG waitOption;
  297. if(ssl != NULL || nxSocket != NULL || waitOption <= 0){
  298. wolfSSL_SetIO_NetX(ssl, nxSocket, waitOption);
  299. } else {
  300. // You need to pass in good parameters.
  301. }
  302. \endcode
  303. \sa set_fd
  304. \sa NetX_Send
  305. \sa NetX_Receive
  306. */
  307. void wolfSSL_SetIO_NetX(WOLFSSL* ssl, NX_TCP_SOCKET* nxsocket,
  308. ULONG waitoption);
  309. /*!
  310. \brief wolfssl_ctx構造CallBackGencookie Typeは関数ポインタで、署名:int(* callbackgencookie)(wolfssl * ssl、unsigned char * buf、int sz、void * ctx)を持っています。
  311. \return none いいえ返します。
  312. \param ssl wolfssl_new()を使用して作成されたWolfSSL構造へのポインタ。
  313. _Example_
  314. \code
  315. WOLFSSL_CTX* ctx = wolfSSL_CTX_new( method );
  316. WOLFSSL* ssl = wolfSSL_new(ctx);
  317. int SetGenCookieCB(WOLFSSL* ssl, unsigned char* buf, int sz, void* ctx){
  318. // Callback function body.
  319. }
  320. wolfSSL_CTX_SetGenCookie(ssl->ctx, SetGenCookieCB);
  321. \endcode
  322. \sa CallbackGenCookie
  323. */
  324. void wolfSSL_CTX_SetGenCookie(WOLFSSL_CTX* ctx, CallbackGenCookie cb);
  325. /*!
  326. \ingroup Setup
  327. \brief この関数は、WolfSSL構造のIOCB_COOKIECTXメンバーを返します。
  328. \return pointer この関数は、iocb_cookiectxに格納されているvoidポインタ値を返します。
  329. \return NULL WolfSSL構造体がNULLの場合
  330. _Example_
  331. \code
  332. WOLFSSL_CTX* ctx = wolfSSL_CTX_new( method );
  333. WOLFSSL* ssl = wolfSSL_new(ctx);
  334. void* cookie;
  335. ...
  336. cookie = wolfSSL_GetCookieCtx(ssl);
  337. if(cookie != NULL){
  338. // You have the cookie
  339. }
  340. \endcode
  341. \sa wolfSSL_SetCookieCtx
  342. \sa wolfSSL_CTX_SetGenCookie
  343. */
  344. void* wolfSSL_GetCookieCtx(WOLFSSL* ssl);
  345. /*!
  346. \ingroup Setup
  347. \brief この関数は、WolfSSLがWolfSSL_ISOTPでコンパイルされている場合に使用する場合は、WolfSSLの場合はISO-TPコンテキストを設定します。
  348. \return 0 成功すると、故障のwolfssl_cbio_err_general
  349. \param ssl wolfsslコンテキスト
  350. \param ctx ユーザーはこの関数が初期化されるISOTPコンテキストを作成しました
  351. \param recv_fn ユーザーはバスを受信できます
  352. \param send_fn ユーザーはバスを送ることができます
  353. \param delay_fn ユーザーマイクロ秒の粒度遅延関数
  354. \param receive_delay 各CANバスパケットを遅らせるためのマイクロ秒のセット数
  355. \param receive_buffer ユーザーがデータを受信するためのバッファーが提供され、ISOTP_DEFAULT_BUFFER_SIZEバイトに割り当てられていることをお勧めします。
  356. \param receive_buffer_size - receive_bufferのサイズ
  357. _Example_
  358. \code
  359. struct can_info can_con_info;
  360. isotp_wolfssl_ctx isotp_ctx;
  361. char *receive_buffer = malloc(ISOTP_DEFAULT_BUFFER_SIZE);
  362. WOLFSSL_CTX* ctx = wolfSSL_CTX_new(method);
  363. WOLFSSL* ssl = wolfSSL_new(ctx);
  364. ...
  365. wolfSSL_SetIO_ISOTP(ssl, &isotp_ctx, can_receive, can_send, can_delay, 0,
  366. receive_buffer, ISOTP_DEFAULT_BUFFER_SIZE, &can_con_info);
  367. \endcode
  368. */
  369. int wolfSSL_SetIO_ISOTP(WOLFSSL *ssl, isotp_wolfssl_ctx *ctx,
  370. can_recv_fn recv_fn, can_send_fn send_fn, can_delay_fn delay_fn,
  371. word32 receive_delay, char *receive_buffer, int receive_buffer_size,
  372. void *arg);