<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/">
  <channel>
    <title>Wolfssl on Hacper&#39;s Blog</title>
    <link>https://hacperme.com/tags/wolfssl/</link>
    <description>Recent content in Wolfssl on Hacper&#39;s Blog</description>
    <generator>Hugo -- gohugo.io</generator>
    <language>zh</language>
    <lastBuildDate>Sun, 09 Jul 2023 14:02:11 +0800</lastBuildDate>
    <atom:link href="https://hacperme.com/tags/wolfssl/index.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>使用 wolfssl 实现 tls 通信示例</title>
      <link>https://hacperme.com/posts/series/cryptography/20230709_wolfssl_tls_notes/</link>
      <pubDate>Sun, 09 Jul 2023 14:02:11 +0800</pubDate>
      <guid>https://hacperme.com/posts/series/cryptography/20230709_wolfssl_tls_notes/</guid>
      <description>介绍使用 wolfssl 实现 tls 加密通信的应用流程。</description>
      <content:encoded><![CDATA[<h2 id="wolfssl-介绍">wolfssl 介绍</h2>
<p>wolfssl 是一个轻量级的 ssl/tls 实现，可作为嵌入式设备上实现 tls 安全通信的另一个选择。</p>
<h2 id="api-设计和实现">API 设计和实现</h2>
<p>API 定义还是按照 <a href="https://hacperme.com/posts/series/cryptography/20230702_mbedtls_tls_notes/">mbedtls tls 客户端应用详解</a>中的设计，内部实现换成 wolfssl 的使用流程。</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span><span class="lnt">3
</span><span class="lnt">4
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-c" data-lang="c"><span class="line"><span class="cl"><span class="kt">void</span> <span class="o">*</span><span class="nf">qtf_tls_connect</span><span class="p">(</span><span class="k">const</span> <span class="kt">char</span> <span class="o">*</span><span class="n">host</span><span class="p">,</span> <span class="kt">uint16_t</span> <span class="n">port</span><span class="p">,</span> <span class="kt">qtf_tls_conn_param_t</span> <span class="o">*</span><span class="n">param</span><span class="p">);</span>
</span></span><span class="line"><span class="cl"><span class="kt">int</span> <span class="nf">qtf_tls_send</span><span class="p">(</span><span class="kt">void</span> <span class="o">*</span><span class="n">handle</span><span class="p">,</span> <span class="k">const</span> <span class="kt">void</span> <span class="o">*</span><span class="n">buf</span><span class="p">,</span> <span class="kt">uint32_t</span> <span class="n">len</span><span class="p">,</span> <span class="kt">uint32_t</span> <span class="n">timeout_ms</span><span class="p">);</span>
</span></span><span class="line"><span class="cl"><span class="kt">int</span> <span class="nf">qtf_tls_recv</span><span class="p">(</span><span class="kt">void</span> <span class="o">*</span><span class="n">handle</span><span class="p">,</span> <span class="kt">void</span> <span class="o">*</span><span class="n">buf</span><span class="p">,</span> <span class="kt">uint32_t</span> <span class="n">len</span><span class="p">,</span> <span class="kt">uint32_t</span> <span class="n">timeout_ms</span><span class="p">);</span>
</span></span><span class="line"><span class="cl"><span class="kt">int</span> <span class="nf">qtf_tls_close</span><span class="p">(</span><span class="kt">void</span> <span class="o">*</span><span class="n">handle</span><span class="p">);</span>
</span></span></code></pre></td></tr></table>
</div>
</div><p>接口实现：</p>
<p>实现 tls client 主要使用到 wolfssl 下面的这几个 api，相比较于 mbedtls，wolfssl 是使用流程更加简洁。</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt"> 1
</span><span class="lnt"> 2
</span><span class="lnt"> 3
</span><span class="lnt"> 4
</span><span class="lnt"> 5
</span><span class="lnt"> 6
</span><span class="lnt"> 7
</span><span class="lnt"> 8
</span><span class="lnt"> 9
</span><span class="lnt">10
</span><span class="lnt">11
</span><span class="lnt">12
</span><span class="lnt">13
</span><span class="lnt">14
</span><span class="lnt">15
</span><span class="lnt">16
</span><span class="lnt">17
</span><span class="lnt">18
</span><span class="lnt">19
</span><span class="lnt">20
</span><span class="lnt">21
</span><span class="lnt">22
</span><span class="lnt">23
</span><span class="lnt">24
</span><span class="lnt">25
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-c" data-lang="c"><span class="line"><span class="cl"><span class="c1">// 初始化和配置
</span></span></span><span class="line"><span class="cl"><span class="c1"></span><span class="n">wolfSSL_Init</span>
</span></span><span class="line"><span class="cl"><span class="n">wolfTLSv1_2_client_method</span>
</span></span><span class="line"><span class="cl"><span class="n">wolfTLSv1_3_client_method</span>
</span></span><span class="line"><span class="cl"><span class="n">wolfSSLv23_client_method</span>
</span></span><span class="line"><span class="cl"><span class="n">wolfSSL_SetIORecv</span>
</span></span><span class="line"><span class="cl"><span class="n">wolfSSL_SetIOSend</span>
</span></span><span class="line"><span class="cl"><span class="n">wolfSSL_CTX_set_verify</span>
</span></span><span class="line"><span class="cl"><span class="n">wolfSSL_CTX_load_verify_buffer</span>
</span></span><span class="line"><span class="cl"><span class="n">wolfSSL_CTX_use_certificate_buffer</span>
</span></span><span class="line"><span class="cl"><span class="n">wolfSSL_CTX_use_PrivateKey_buffer</span>
</span></span><span class="line"><span class="cl"><span class="n">wolfSSL_set_fd</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1">// 创建和释放资源
</span></span></span><span class="line"><span class="cl"><span class="c1"></span><span class="n">wolfSSL_CTX_new</span>
</span></span><span class="line"><span class="cl"><span class="n">wolfSSL_new</span>    
</span></span><span class="line"><span class="cl"><span class="n">wolfSSL_free</span>
</span></span><span class="line"><span class="cl"><span class="n">wolfSSL_CTX_free</span>
</span></span><span class="line"><span class="cl"><span class="n">wolfSSL_Cleanup</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1">// 连接关闭和收发数据
</span></span></span><span class="line"><span class="cl"><span class="c1"></span><span class="n">wolfSSL_connect</span>
</span></span><span class="line"><span class="cl"><span class="n">wolfSSL_shutdown</span>
</span></span><span class="line"><span class="cl"><span class="n">wolfSSL_write</span>
</span></span><span class="line"><span class="cl"><span class="n">wolfSSL_read</span>   
</span></span></code></pre></td></tr></table>
</div>
</div><div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">  1
</span><span class="lnt">  2
</span><span class="lnt">  3
</span><span class="lnt">  4
</span><span class="lnt">  5
</span><span class="lnt">  6
</span><span class="lnt">  7
</span><span class="lnt">  8
</span><span class="lnt">  9
</span><span class="lnt"> 10
</span><span class="lnt"> 11
</span><span class="lnt"> 12
</span><span class="lnt"> 13
</span><span class="lnt"> 14
</span><span class="lnt"> 15
</span><span class="lnt"> 16
</span><span class="lnt"> 17
</span><span class="lnt"> 18
</span><span class="lnt"> 19
</span><span class="lnt"> 20
</span><span class="lnt"> 21
</span><span class="lnt"> 22
</span><span class="lnt"> 23
</span><span class="lnt"> 24
</span><span class="lnt"> 25
</span><span class="lnt"> 26
</span><span class="lnt"> 27
</span><span class="lnt"> 28
</span><span class="lnt"> 29
</span><span class="lnt"> 30
</span><span class="lnt"> 31
</span><span class="lnt"> 32
</span><span class="lnt"> 33
</span><span class="lnt"> 34
</span><span class="lnt"> 35
</span><span class="lnt"> 36
</span><span class="lnt"> 37
</span><span class="lnt"> 38
</span><span class="lnt"> 39
</span><span class="lnt"> 40
</span><span class="lnt"> 41
</span><span class="lnt"> 42
</span><span class="lnt"> 43
</span><span class="lnt"> 44
</span><span class="lnt"> 45
</span><span class="lnt"> 46
</span><span class="lnt"> 47
</span><span class="lnt"> 48
</span><span class="lnt"> 49
</span><span class="lnt"> 50
</span><span class="lnt"> 51
</span><span class="lnt"> 52
</span><span class="lnt"> 53
</span><span class="lnt"> 54
</span><span class="lnt"> 55
</span><span class="lnt"> 56
</span><span class="lnt"> 57
</span><span class="lnt"> 58
</span><span class="lnt"> 59
</span><span class="lnt"> 60
</span><span class="lnt"> 61
</span><span class="lnt"> 62
</span><span class="lnt"> 63
</span><span class="lnt"> 64
</span><span class="lnt"> 65
</span><span class="lnt"> 66
</span><span class="lnt"> 67
</span><span class="lnt"> 68
</span><span class="lnt"> 69
</span><span class="lnt"> 70
</span><span class="lnt"> 71
</span><span class="lnt"> 72
</span><span class="lnt"> 73
</span><span class="lnt"> 74
</span><span class="lnt"> 75
</span><span class="lnt"> 76
</span><span class="lnt"> 77
</span><span class="lnt"> 78
</span><span class="lnt"> 79
</span><span class="lnt"> 80
</span><span class="lnt"> 81
</span><span class="lnt"> 82
</span><span class="lnt"> 83
</span><span class="lnt"> 84
</span><span class="lnt"> 85
</span><span class="lnt"> 86
</span><span class="lnt"> 87
</span><span class="lnt"> 88
</span><span class="lnt"> 89
</span><span class="lnt"> 90
</span><span class="lnt"> 91
</span><span class="lnt"> 92
</span><span class="lnt"> 93
</span><span class="lnt"> 94
</span><span class="lnt"> 95
</span><span class="lnt"> 96
</span><span class="lnt"> 97
</span><span class="lnt"> 98
</span><span class="lnt"> 99
</span><span class="lnt">100
</span><span class="lnt">101
</span><span class="lnt">102
</span><span class="lnt">103
</span><span class="lnt">104
</span><span class="lnt">105
</span><span class="lnt">106
</span><span class="lnt">107
</span><span class="lnt">108
</span><span class="lnt">109
</span><span class="lnt">110
</span><span class="lnt">111
</span><span class="lnt">112
</span><span class="lnt">113
</span><span class="lnt">114
</span><span class="lnt">115
</span><span class="lnt">116
</span><span class="lnt">117
</span><span class="lnt">118
</span><span class="lnt">119
</span><span class="lnt">120
</span><span class="lnt">121
</span><span class="lnt">122
</span><span class="lnt">123
</span><span class="lnt">124
</span><span class="lnt">125
</span><span class="lnt">126
</span><span class="lnt">127
</span><span class="lnt">128
</span><span class="lnt">129
</span><span class="lnt">130
</span><span class="lnt">131
</span><span class="lnt">132
</span><span class="lnt">133
</span><span class="lnt">134
</span><span class="lnt">135
</span><span class="lnt">136
</span><span class="lnt">137
</span><span class="lnt">138
</span><span class="lnt">139
</span><span class="lnt">140
</span><span class="lnt">141
</span><span class="lnt">142
</span><span class="lnt">143
</span><span class="lnt">144
</span><span class="lnt">145
</span><span class="lnt">146
</span><span class="lnt">147
</span><span class="lnt">148
</span><span class="lnt">149
</span><span class="lnt">150
</span><span class="lnt">151
</span><span class="lnt">152
</span><span class="lnt">153
</span><span class="lnt">154
</span><span class="lnt">155
</span><span class="lnt">156
</span><span class="lnt">157
</span><span class="lnt">158
</span><span class="lnt">159
</span><span class="lnt">160
</span><span class="lnt">161
</span><span class="lnt">162
</span><span class="lnt">163
</span><span class="lnt">164
</span><span class="lnt">165
</span><span class="lnt">166
</span><span class="lnt">167
</span><span class="lnt">168
</span><span class="lnt">169
</span><span class="lnt">170
</span><span class="lnt">171
</span><span class="lnt">172
</span><span class="lnt">173
</span><span class="lnt">174
</span><span class="lnt">175
</span><span class="lnt">176
</span><span class="lnt">177
</span><span class="lnt">178
</span><span class="lnt">179
</span><span class="lnt">180
</span><span class="lnt">181
</span><span class="lnt">182
</span><span class="lnt">183
</span><span class="lnt">184
</span><span class="lnt">185
</span><span class="lnt">186
</span><span class="lnt">187
</span><span class="lnt">188
</span><span class="lnt">189
</span><span class="lnt">190
</span><span class="lnt">191
</span><span class="lnt">192
</span><span class="lnt">193
</span><span class="lnt">194
</span><span class="lnt">195
</span><span class="lnt">196
</span><span class="lnt">197
</span><span class="lnt">198
</span><span class="lnt">199
</span><span class="lnt">200
</span><span class="lnt">201
</span><span class="lnt">202
</span><span class="lnt">203
</span><span class="lnt">204
</span><span class="lnt">205
</span><span class="lnt">206
</span><span class="lnt">207
</span><span class="lnt">208
</span><span class="lnt">209
</span><span class="lnt">210
</span><span class="lnt">211
</span><span class="lnt">212
</span><span class="lnt">213
</span><span class="lnt">214
</span><span class="lnt">215
</span><span class="lnt">216
</span><span class="lnt">217
</span><span class="lnt">218
</span><span class="lnt">219
</span><span class="lnt">220
</span><span class="lnt">221
</span><span class="lnt">222
</span><span class="lnt">223
</span><span class="lnt">224
</span><span class="lnt">225
</span><span class="lnt">226
</span><span class="lnt">227
</span><span class="lnt">228
</span><span class="lnt">229
</span><span class="lnt">230
</span><span class="lnt">231
</span><span class="lnt">232
</span><span class="lnt">233
</span><span class="lnt">234
</span><span class="lnt">235
</span><span class="lnt">236
</span><span class="lnt">237
</span><span class="lnt">238
</span><span class="lnt">239
</span><span class="lnt">240
</span><span class="lnt">241
</span><span class="lnt">242
</span><span class="lnt">243
</span><span class="lnt">244
</span><span class="lnt">245
</span><span class="lnt">246
</span><span class="lnt">247
</span><span class="lnt">248
</span><span class="lnt">249
</span><span class="lnt">250
</span><span class="lnt">251
</span><span class="lnt">252
</span><span class="lnt">253
</span><span class="lnt">254
</span><span class="lnt">255
</span><span class="lnt">256
</span><span class="lnt">257
</span><span class="lnt">258
</span><span class="lnt">259
</span><span class="lnt">260
</span><span class="lnt">261
</span><span class="lnt">262
</span><span class="lnt">263
</span><span class="lnt">264
</span><span class="lnt">265
</span><span class="lnt">266
</span><span class="lnt">267
</span><span class="lnt">268
</span><span class="lnt">269
</span><span class="lnt">270
</span><span class="lnt">271
</span><span class="lnt">272
</span><span class="lnt">273
</span><span class="lnt">274
</span><span class="lnt">275
</span><span class="lnt">276
</span><span class="lnt">277
</span><span class="lnt">278
</span><span class="lnt">279
</span><span class="lnt">280
</span><span class="lnt">281
</span><span class="lnt">282
</span><span class="lnt">283
</span><span class="lnt">284
</span><span class="lnt">285
</span><span class="lnt">286
</span><span class="lnt">287
</span><span class="lnt">288
</span><span class="lnt">289
</span><span class="lnt">290
</span><span class="lnt">291
</span><span class="lnt">292
</span><span class="lnt">293
</span><span class="lnt">294
</span><span class="lnt">295
</span><span class="lnt">296
</span><span class="lnt">297
</span><span class="lnt">298
</span><span class="lnt">299
</span><span class="lnt">300
</span><span class="lnt">301
</span><span class="lnt">302
</span><span class="lnt">303
</span><span class="lnt">304
</span><span class="lnt">305
</span><span class="lnt">306
</span><span class="lnt">307
</span><span class="lnt">308
</span><span class="lnt">309
</span><span class="lnt">310
</span><span class="lnt">311
</span><span class="lnt">312
</span><span class="lnt">313
</span><span class="lnt">314
</span><span class="lnt">315
</span><span class="lnt">316
</span><span class="lnt">317
</span><span class="lnt">318
</span><span class="lnt">319
</span><span class="lnt">320
</span><span class="lnt">321
</span><span class="lnt">322
</span><span class="lnt">323
</span><span class="lnt">324
</span><span class="lnt">325
</span><span class="lnt">326
</span><span class="lnt">327
</span><span class="lnt">328
</span><span class="lnt">329
</span><span class="lnt">330
</span><span class="lnt">331
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-c" data-lang="c"><span class="line"><span class="cl"><span class="cp">#include</span> <span class="cpf">&#34;qt_idf_config.h&#34;</span><span class="cp">
</span></span></span><span class="line"><span class="cl"><span class="cp"></span>
</span></span><span class="line"><span class="cl"><span class="cp">#include</span> <span class="cpf">&lt;stdio.h&gt;</span><span class="cp">
</span></span></span><span class="line"><span class="cl"><span class="cp">#include</span> <span class="cpf">&lt;stdlib.h&gt;</span><span class="cp">
</span></span></span><span class="line"><span class="cl"><span class="cp">#include</span> <span class="cpf">&lt;string.h&gt;</span><span class="cp">
</span></span></span><span class="line"><span class="cl"><span class="cp"></span>
</span></span><span class="line"><span class="cl"><span class="cp">#include</span> <span class="cpf">&#34;qt_idf_tls.h&#34;</span><span class="cp">
</span></span></span><span class="line"><span class="cl"><span class="cp">#include</span> <span class="cpf">&#34;qt_idf_tcp.h&#34;</span><span class="cp">
</span></span></span><span class="line"><span class="cl"><span class="cp">#include</span> <span class="cpf">&#34;dlg/dlg.h&#34;</span><span class="cp">
</span></span></span><span class="line"><span class="cl"><span class="cp">#include</span> <span class="cpf">&#34;utils_timer.h&#34;</span><span class="cp">
</span></span></span><span class="line"><span class="cl"><span class="cp">#ifndef WOLFSSL_USER_SETTINGS
</span></span></span><span class="line"><span class="cl"><span class="cp"></span>    <span class="cp">#include</span> <span class="cpf">&lt;wolfssl/options.h&gt;</span><span class="cp">
</span></span></span><span class="line"><span class="cl"><span class="cp">#endif
</span></span></span><span class="line"><span class="cl"><span class="cp">#include</span> <span class="cpf">&lt;wolfssl/wolfcrypt/settings.h&gt;</span><span class="cp">
</span></span></span><span class="line"><span class="cl"><span class="cp">#include</span> <span class="cpf">&lt;wolfssl/ssl.h&gt;</span><span class="cp">
</span></span></span><span class="line"><span class="cl"><span class="cp">#include</span> <span class="cpf">&lt;wolfssl/wolfcrypt/wc_port.h&gt;</span><span class="cp">
</span></span></span><span class="line"><span class="cl"><span class="cp"></span>
</span></span><span class="line"><span class="cl"><span class="k">typedef</span> <span class="k">struct</span>
</span></span><span class="line"><span class="cl"><span class="p">{</span>
</span></span><span class="line"><span class="cl">    <span class="n">WOLFSSL_CTX</span><span class="o">*</span> <span class="n">ctx</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">    <span class="n">WOLFSSL</span><span class="o">*</span>     <span class="n">ssl</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">    <span class="n">WOLFSSL_METHOD</span><span class="o">*</span> <span class="n">method</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">    <span class="kt">int</span> <span class="n">fd</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span><span class="kt">qtf_tls_handle_t</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1">// 自定义tcp 发送函数
</span></span></span><span class="line"><span class="cl"><span class="c1"></span><span class="k">static</span>  <span class="kt">int</span> <span class="nf">my_IOSend</span><span class="p">(</span><span class="n">WOLFSSL</span><span class="o">*</span> <span class="n">ssl</span><span class="p">,</span> <span class="kt">char</span><span class="o">*</span> <span class="n">buff</span><span class="p">,</span> <span class="kt">int</span> <span class="n">sz</span><span class="p">,</span> <span class="kt">void</span><span class="o">*</span> <span class="n">ctx</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="p">{</span>
</span></span><span class="line"><span class="cl">    <span class="kt">int</span> <span class="n">ret</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">    <span class="kt">int</span> <span class="n">fd</span> <span class="o">=</span> <span class="o">*</span><span class="p">(</span><span class="kt">int</span><span class="o">*</span><span class="p">)</span><span class="n">ctx</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">    <span class="n">ret</span> <span class="o">=</span> <span class="nf">qtf_tcp_send</span><span class="p">((</span><span class="kt">void</span> <span class="o">*</span><span class="p">)</span><span class="n">fd</span><span class="p">,</span> <span class="p">(</span><span class="k">const</span> <span class="kt">char</span> <span class="o">*</span><span class="p">)</span><span class="n">buff</span><span class="p">,</span> <span class="n">sz</span><span class="p">,</span> <span class="mi">1000</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">    <span class="k">if</span> <span class="p">(</span><span class="n">ret</span> <span class="o">&lt;</span> <span class="mi">0</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">    <span class="p">{</span>
</span></span><span class="line"><span class="cl">        <span class="nf">dlg_error</span><span class="p">(</span><span class="s">&#34;qtf_tcp_send failed&#34;</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">        <span class="k">return</span> <span class="n">WOLFSSL_CBIO_ERR_GENERAL</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">    <span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">    <span class="k">return</span> <span class="n">ret</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span><span class="line"><span class="cl"><span class="c1">// 自定义tcp 接收函数
</span></span></span><span class="line"><span class="cl"><span class="c1"></span><span class="k">static</span> <span class="kt">int</span> <span class="nf">my_IORecv</span><span class="p">(</span><span class="n">WOLFSSL</span><span class="o">*</span> <span class="n">ssl</span><span class="p">,</span> <span class="kt">char</span><span class="o">*</span> <span class="n">buff</span><span class="p">,</span> <span class="kt">int</span> <span class="n">sz</span><span class="p">,</span> <span class="kt">void</span><span class="o">*</span> <span class="n">ctx</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="p">{</span>
</span></span><span class="line"><span class="cl">    <span class="kt">int</span> <span class="n">ret</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">    <span class="kt">int</span> <span class="n">fd</span> <span class="o">=</span> <span class="o">*</span><span class="p">(</span><span class="kt">int</span><span class="o">*</span><span class="p">)</span><span class="n">ctx</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">    <span class="n">ret</span> <span class="o">=</span> <span class="nf">qtf_tcp_recv</span><span class="p">((</span><span class="kt">void</span> <span class="o">*</span><span class="p">)</span><span class="n">fd</span><span class="p">,</span> <span class="p">(</span><span class="kt">char</span> <span class="o">*</span><span class="p">)</span><span class="n">buff</span><span class="p">,</span> <span class="n">sz</span><span class="p">,</span> <span class="mi">1000</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">    <span class="k">if</span> <span class="p">(</span><span class="n">ret</span> <span class="o">&lt;</span> <span class="mi">0</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">    <span class="p">{</span>
</span></span><span class="line"><span class="cl">        <span class="nf">dlg_error</span><span class="p">(</span><span class="s">&#34;qtf_tcp_recv failed&#34;</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">        <span class="k">return</span> <span class="n">WOLFSSL_CBIO_ERR_GENERAL</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">    <span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">    <span class="k">return</span> <span class="n">ret</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1">// 初始化和配置参数
</span></span></span><span class="line"><span class="cl"><span class="c1"></span><span class="k">static</span> <span class="kt">int</span> <span class="nf">_tls_net_init</span><span class="p">(</span><span class="kt">qtf_tls_handle_t</span> <span class="o">*</span><span class="n">handle</span><span class="p">,</span> <span class="kt">qtf_tls_conn_param_t</span> <span class="o">*</span><span class="n">param</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="p">{</span>
</span></span><span class="line"><span class="cl">    <span class="kt">int</span> <span class="n">ret</span> <span class="o">=</span> <span class="o">-</span><span class="mi">1</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">    <span class="nf">wolfSSL_Init</span><span class="p">();</span>
</span></span><span class="line"><span class="cl">    
</span></span><span class="line"><span class="cl">    <span class="k">if</span><span class="p">(</span><span class="n">param</span><span class="o">-&gt;</span><span class="n">tls_version</span> <span class="o">==</span> <span class="n">QTF_TLS_VERSION_TLS1_2</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">    <span class="p">{</span>
</span></span><span class="line"><span class="cl">        <span class="n">handle</span><span class="o">-&gt;</span><span class="n">method</span> <span class="o">=</span> <span class="nf">wolfTLSv1_2_client_method</span><span class="p">();</span>
</span></span><span class="line"><span class="cl">    <span class="p">}</span>
</span></span><span class="line"><span class="cl">    <span class="k">else</span> <span class="k">if</span><span class="p">(</span><span class="n">param</span><span class="o">-&gt;</span><span class="n">tls_version</span> <span class="o">==</span> <span class="n">QTF_TLS_VERSION_TLS1_3</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">    <span class="p">{</span>
</span></span><span class="line"><span class="cl">        <span class="n">handle</span><span class="o">-&gt;</span><span class="n">method</span> <span class="o">=</span> <span class="nf">wolfTLSv1_3_client_method</span><span class="p">();</span>
</span></span><span class="line"><span class="cl">    <span class="p">}</span>
</span></span><span class="line"><span class="cl">    <span class="k">else</span> <span class="k">if</span><span class="p">(</span><span class="n">param</span><span class="o">-&gt;</span><span class="n">tls_version</span> <span class="o">==</span> <span class="n">QTF_TLS_VERSION_TLS1_2_1_3</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">    <span class="p">{</span>
</span></span><span class="line"><span class="cl">        <span class="n">handle</span><span class="o">-&gt;</span><span class="n">method</span> <span class="o">=</span> <span class="nf">wolfSSLv23_client_method</span><span class="p">();</span>
</span></span><span class="line"><span class="cl">    <span class="p">}</span>
</span></span><span class="line"><span class="cl">    <span class="k">else</span>
</span></span><span class="line"><span class="cl">    <span class="p">{</span>
</span></span><span class="line"><span class="cl">        <span class="nf">dlg_error</span><span class="p">(</span><span class="s">&#34;not support tls version&#34;</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">        <span class="k">goto</span> <span class="n">error</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">    <span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">    <span class="n">handle</span><span class="o">-&gt;</span><span class="n">ctx</span> <span class="o">=</span> <span class="nf">wolfSSL_CTX_new</span><span class="p">(</span><span class="n">handle</span><span class="o">-&gt;</span><span class="n">method</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">    <span class="k">if</span><span class="p">(</span><span class="o">!</span><span class="n">handle</span><span class="o">-&gt;</span><span class="n">ctx</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">    <span class="p">{</span>
</span></span><span class="line"><span class="cl">        <span class="nf">dlg_error</span><span class="p">(</span><span class="s">&#34;wolfSSL_CTX_new failed&#34;</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">        <span class="k">goto</span> <span class="n">error</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">    <span class="p">}</span>
</span></span><span class="line"><span class="cl">	<span class="c1">// 注册收发函数回调，使用自定义tcp收发的实现
</span></span></span><span class="line"><span class="cl"><span class="c1"></span>    <span class="nf">wolfSSL_SetIORecv</span><span class="p">(</span><span class="n">handle</span><span class="o">-&gt;</span><span class="n">ctx</span><span class="p">,</span> <span class="n">my_IORecv</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">    <span class="nf">wolfSSL_SetIOSend</span><span class="p">(</span><span class="n">handle</span><span class="o">-&gt;</span><span class="n">ctx</span><span class="p">,</span> <span class="n">my_IOSend</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">    <span class="k">if</span><span class="p">(</span><span class="n">param</span><span class="o">-&gt;</span><span class="n">verify_mode</span> <span class="o">==</span> <span class="n">QTF_TLS_VERIFY_MODE_NONE</span> <span class="o">||</span> <span class="n">param</span><span class="o">-&gt;</span><span class="n">verify_mode</span> <span class="o">==</span> <span class="n">QTF_TLS_VERIFY_MODE_OPTIONAL</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">    <span class="p">{</span>
</span></span><span class="line"><span class="cl">        <span class="nf">wolfSSL_CTX_set_verify</span><span class="p">(</span><span class="n">handle</span><span class="o">-&gt;</span><span class="n">ctx</span><span class="p">,</span> <span class="n">SSL_VERIFY_NONE</span><span class="p">,</span> <span class="nb">NULL</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">    <span class="p">}</span>
</span></span><span class="line"><span class="cl">    <span class="k">else</span> <span class="k">if</span> <span class="p">(</span><span class="n">param</span><span class="o">-&gt;</span><span class="n">verify_mode</span> <span class="o">==</span> <span class="n">QTF_TLS_VERIFY_MODE_REQUIRED</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">    <span class="p">{</span>
</span></span><span class="line"><span class="cl">        <span class="nf">wolfSSL_CTX_set_verify</span><span class="p">(</span><span class="n">handle</span><span class="o">-&gt;</span><span class="n">ctx</span><span class="p">,</span> <span class="n">SSL_VERIFY_PEER</span><span class="p">,</span> <span class="nb">NULL</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">    <span class="p">}</span>
</span></span><span class="line"><span class="cl">    <span class="k">else</span>
</span></span><span class="line"><span class="cl">    <span class="p">{</span>
</span></span><span class="line"><span class="cl">        <span class="nf">dlg_error</span><span class="p">(</span><span class="s">&#34;invalid verify mode&#34;</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">        <span class="k">goto</span> <span class="n">error</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">    <span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">   
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">    <span class="k">if</span><span class="p">(</span><span class="n">param</span><span class="o">-&gt;</span><span class="n">auth_mode</span> <span class="o">==</span> <span class="n">QTF_TLS_AUTH_MODE_CERT</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">    <span class="p">{</span>
</span></span><span class="line"><span class="cl">        <span class="k">if</span><span class="p">(</span><span class="n">param</span><span class="o">-&gt;</span><span class="n">ca_cert</span> <span class="o">&amp;&amp;</span> <span class="n">param</span><span class="o">-&gt;</span><span class="n">ca_cert_len</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">        <span class="p">{</span>
</span></span><span class="line"><span class="cl">            <span class="c1">// 加载ca证书
</span></span></span><span class="line"><span class="cl"><span class="c1"></span>            <span class="n">ret</span> <span class="o">=</span> <span class="nf">wolfSSL_CTX_load_verify_buffer</span><span class="p">(</span><span class="n">handle</span><span class="o">-&gt;</span><span class="n">ctx</span><span class="p">,</span> <span class="p">(</span><span class="k">const</span> <span class="kt">unsigned</span> <span class="kt">char</span> <span class="o">*</span><span class="p">)</span><span class="n">param</span><span class="o">-&gt;</span><span class="n">ca_cert</span><span class="p">,</span> <span class="n">param</span><span class="o">-&gt;</span><span class="n">ca_cert_len</span><span class="p">,</span> <span class="n">SSL_FILETYPE_PEM</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">            <span class="k">if</span> <span class="p">(</span><span class="n">ret</span> <span class="o">!=</span> <span class="n">SSL_SUCCESS</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">            <span class="p">{</span>
</span></span><span class="line"><span class="cl">                <span class="nf">dlg_error</span><span class="p">(</span><span class="s">&#34;wolfSSL_CTX_load_verify_buffer failed&#34;</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">                <span class="k">goto</span> <span class="n">error</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">            <span class="p">}</span>
</span></span><span class="line"><span class="cl">        <span class="p">}</span>
</span></span><span class="line"><span class="cl">        <span class="k">else</span>
</span></span><span class="line"><span class="cl">        <span class="p">{</span>
</span></span><span class="line"><span class="cl">            <span class="k">if</span><span class="p">(</span><span class="n">param</span><span class="o">-&gt;</span><span class="n">verify_mode</span> <span class="o">!=</span> <span class="n">QTF_TLS_VERIFY_MODE_NONE</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">            <span class="p">{</span>
</span></span><span class="line"><span class="cl">                <span class="nf">dlg_error</span><span class="p">(</span><span class="s">&#34;invalid ca cert&#34;</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">                <span class="k">goto</span> <span class="n">error</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">            <span class="p">}</span>
</span></span><span class="line"><span class="cl">            <span class="nf">dlg_info</span><span class="p">(</span><span class="s">&#34;verify mode is none&#34;</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">        <span class="p">}</span>
</span></span><span class="line"><span class="cl">        
</span></span><span class="line"><span class="cl">        <span class="k">if</span> <span class="p">(</span><span class="n">param</span><span class="o">-&gt;</span><span class="n">client_cert</span> <span class="o">&amp;&amp;</span> <span class="n">param</span><span class="o">-&gt;</span><span class="n">client_cert_len</span> <span class="o">&amp;&amp;</span> <span class="n">param</span><span class="o">-&gt;</span><span class="n">client_key</span> <span class="o">&amp;&amp;</span> <span class="n">param</span><span class="o">-&gt;</span><span class="n">client_key_len</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">        <span class="p">{</span>
</span></span><span class="line"><span class="cl">            <span class="n">ret</span> <span class="o">=</span> <span class="nf">wolfSSL_CTX_use_certificate_buffer</span><span class="p">(</span><span class="n">handle</span><span class="o">-&gt;</span><span class="n">ctx</span><span class="p">,</span> <span class="p">(</span><span class="k">const</span> <span class="kt">unsigned</span> <span class="kt">char</span> <span class="o">*</span><span class="p">)</span><span class="n">param</span><span class="o">-&gt;</span><span class="n">client_cert</span><span class="p">,</span> <span class="n">param</span><span class="o">-&gt;</span><span class="n">client_cert_len</span><span class="p">,</span> <span class="n">SSL_FILETYPE_PEM</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">            <span class="k">if</span> <span class="p">(</span><span class="n">ret</span> <span class="o">!=</span> <span class="n">SSL_SUCCESS</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">            <span class="p">{</span>
</span></span><span class="line"><span class="cl">                <span class="nf">dlg_error</span><span class="p">(</span><span class="s">&#34;wolfSSL_CTX_use_certificate_buffer failed&#34;</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">                <span class="k">goto</span> <span class="n">error</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">            <span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">            <span class="n">ret</span> <span class="o">=</span> <span class="nf">wolfSSL_CTX_use_PrivateKey_buffer</span><span class="p">(</span><span class="n">handle</span><span class="o">-&gt;</span><span class="n">ctx</span><span class="p">,</span> <span class="p">(</span><span class="k">const</span> <span class="kt">unsigned</span> <span class="kt">char</span> <span class="o">*</span><span class="p">)</span><span class="n">param</span><span class="o">-&gt;</span><span class="n">client_key</span><span class="p">,</span> <span class="n">param</span><span class="o">-&gt;</span><span class="n">client_key_len</span><span class="p">,</span> <span class="n">SSL_FILETYPE_PEM</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">            <span class="k">if</span> <span class="p">(</span><span class="n">ret</span> <span class="o">!=</span> <span class="n">SSL_SUCCESS</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">            <span class="p">{</span>
</span></span><span class="line"><span class="cl">                <span class="nf">dlg_error</span><span class="p">(</span><span class="s">&#34;wolfSSL_CTX_use_PrivateKey_buffer failed&#34;</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">                <span class="k">goto</span> <span class="n">error</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">            <span class="p">}</span>
</span></span><span class="line"><span class="cl">        <span class="p">}</span>
</span></span><span class="line"><span class="cl">    <span class="p">}</span>
</span></span><span class="line"><span class="cl">    <span class="k">else</span> <span class="k">if</span><span class="p">(</span><span class="n">param</span><span class="o">-&gt;</span><span class="n">auth_mode</span> <span class="o">==</span> <span class="n">QTF_TLS_AUTH_MODE_PSK</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">    <span class="p">{</span>
</span></span><span class="line"><span class="cl">        
</span></span><span class="line"><span class="cl">    <span class="p">}</span>
</span></span><span class="line"><span class="cl">    <span class="k">else</span>
</span></span><span class="line"><span class="cl">    <span class="p">{</span>
</span></span><span class="line"><span class="cl">        <span class="nf">dlg_error</span><span class="p">(</span><span class="s">&#34;invalid auth mode&#34;</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">        <span class="k">goto</span> <span class="n">error</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">    <span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">    <span class="n">handle</span><span class="o">-&gt;</span><span class="n">ssl</span> <span class="o">=</span> <span class="nf">wolfSSL_new</span><span class="p">(</span><span class="n">handle</span><span class="o">-&gt;</span><span class="n">ctx</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">    <span class="k">if</span><span class="p">(</span><span class="o">!</span><span class="n">handle</span><span class="o">-&gt;</span><span class="n">ssl</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">    <span class="p">{</span>
</span></span><span class="line"><span class="cl">        <span class="nf">dlg_error</span><span class="p">(</span><span class="s">&#34;wolfSSL_new failed&#34;</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">        <span class="k">goto</span> <span class="n">error</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">    <span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">    <span class="n">ret</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">    <span class="k">return</span> <span class="n">ret</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="nl">error</span><span class="p">:</span>
</span></span><span class="line"><span class="cl">    
</span></span><span class="line"><span class="cl">    <span class="k">return</span> <span class="n">ret</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="k">static</span> <span class="kt">int</span> <span class="nf">__tls_net_deinit</span><span class="p">(</span><span class="kt">qtf_tls_handle_t</span> <span class="o">*</span><span class="n">handle</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="p">{</span>
</span></span><span class="line"><span class="cl">    <span class="nf">wolfSSL_shutdown</span><span class="p">(</span><span class="n">handle</span><span class="o">-&gt;</span><span class="n">ssl</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">    <span class="nf">wolfSSL_free</span><span class="p">(</span><span class="n">handle</span><span class="o">-&gt;</span><span class="n">ssl</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">    <span class="nf">wolfSSL_CTX_free</span><span class="p">(</span><span class="n">handle</span><span class="o">-&gt;</span><span class="n">ctx</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">    <span class="nf">wolfSSL_Cleanup</span><span class="p">();</span>
</span></span><span class="line"><span class="cl">    <span class="c1">// 断开tcp连接
</span></span></span><span class="line"><span class="cl"><span class="c1"></span>    <span class="nf">qtf_tcp_close</span><span class="p">((</span><span class="kt">void</span> <span class="o">*</span><span class="p">)</span><span class="n">handle</span><span class="o">-&gt;</span><span class="n">fd</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">    <span class="k">return</span> <span class="mi">0</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kt">void</span> <span class="o">*</span><span class="nf">qtf_tls_connect</span><span class="p">(</span><span class="k">const</span> <span class="kt">char</span> <span class="o">*</span><span class="n">host</span><span class="p">,</span> <span class="kt">uint16_t</span> <span class="n">port</span><span class="p">,</span> <span class="kt">qtf_tls_conn_param_t</span> <span class="o">*</span><span class="n">param</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="p">{</span>
</span></span><span class="line"><span class="cl">    <span class="kt">qtf_tls_handle_t</span> <span class="o">*</span><span class="n">handle</span> <span class="o">=</span> <span class="nb">NULL</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">    <span class="kt">int</span> <span class="n">ret</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">    <span class="k">if</span><span class="p">(</span><span class="o">!</span><span class="n">host</span> <span class="o">||</span> <span class="o">!</span><span class="n">param</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">    <span class="p">{</span>
</span></span><span class="line"><span class="cl">        <span class="nf">dlg_error</span><span class="p">(</span><span class="s">&#34;invalid param&#34;</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">        <span class="k">goto</span> <span class="n">error</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">    <span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">    <span class="n">handle</span> <span class="o">=</span> <span class="p">(</span><span class="kt">qtf_tls_handle_t</span> <span class="o">*</span><span class="p">)</span><span class="nf">malloc</span><span class="p">(</span><span class="k">sizeof</span><span class="p">(</span><span class="kt">qtf_tls_handle_t</span><span class="p">));</span>
</span></span><span class="line"><span class="cl">    <span class="k">if</span><span class="p">(</span><span class="o">!</span><span class="n">handle</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">    <span class="p">{</span>
</span></span><span class="line"><span class="cl">        <span class="nf">dlg_error</span><span class="p">(</span><span class="s">&#34;malloc failed&#34;</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">        <span class="k">goto</span> <span class="n">error</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">    <span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">    <span class="n">ret</span> <span class="o">=</span> <span class="nf">_tls_net_init</span><span class="p">(</span><span class="n">handle</span><span class="p">,</span> <span class="n">param</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">    <span class="k">if</span><span class="p">(</span><span class="n">ret</span> <span class="o">!=</span> <span class="mi">0</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">    <span class="p">{</span>
</span></span><span class="line"><span class="cl">        <span class="nf">dlg_error</span><span class="p">(</span><span class="s">&#34;tls net init failed&#34;</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">        <span class="k">goto</span> <span class="n">error</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">    <span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">    <span class="nf">dlg_info</span><span class="p">(</span><span class="s">&#34;Connecting to %s:%d...&#34;</span><span class="p">,</span> <span class="n">host</span><span class="p">,</span> <span class="n">port</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">    <span class="c1">// 先创建 tcp 连接
</span></span></span><span class="line"><span class="cl"><span class="c1"></span>    <span class="n">handle</span><span class="o">-&gt;</span><span class="n">fd</span> <span class="o">=</span> <span class="p">(</span><span class="kt">int</span><span class="p">)</span><span class="nf">qtf_tcp_connect</span><span class="p">(</span><span class="n">host</span><span class="p">,</span> <span class="n">port</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">    <span class="k">if</span> <span class="p">(</span><span class="n">handle</span><span class="o">-&gt;</span><span class="n">fd</span> <span class="o">&lt;=</span> <span class="mi">0</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">    <span class="p">{</span>
</span></span><span class="line"><span class="cl">        <span class="nf">dlg_error</span><span class="p">(</span><span class="s">&#34;qtf_tcp_connect failed&#34;</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">        <span class="k">goto</span> <span class="n">error</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">    <span class="p">}</span>
</span></span><span class="line"><span class="cl">    <span class="c1">// 将套接字 fd 绑定到 ssl 操作句柄 
</span></span></span><span class="line"><span class="cl"><span class="c1"></span>    <span class="nf">wolfSSL_set_fd</span><span class="p">(</span><span class="n">handle</span><span class="o">-&gt;</span><span class="n">ssl</span><span class="p">,</span> <span class="n">handle</span><span class="o">-&gt;</span><span class="n">fd</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">	
</span></span><span class="line"><span class="cl">    <span class="c1">// 调用 wolfSSL_connect tls 连接
</span></span></span><span class="line"><span class="cl"><span class="c1"></span>    <span class="n">ret</span> <span class="o">=</span> <span class="nf">wolfSSL_connect</span><span class="p">(</span><span class="n">handle</span><span class="o">-&gt;</span><span class="n">ssl</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">    <span class="k">if</span> <span class="p">(</span><span class="n">ret</span> <span class="o">!=</span> <span class="n">SSL_SUCCESS</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">    <span class="p">{</span>
</span></span><span class="line"><span class="cl">        <span class="n">ret</span> <span class="o">=</span> <span class="nf">wolfSSL_get_error</span><span class="p">(</span><span class="n">handle</span><span class="o">-&gt;</span><span class="n">ssl</span><span class="p">,</span> <span class="n">ret</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">        <span class="nf">dlg_error</span><span class="p">(</span><span class="s">&#34;wolfSSL_connect failed ret:%d, 0x%04x&#34;</span><span class="p">,</span><span class="n">ret</span><span class="p">,</span> <span class="n">ret</span> <span class="o">&lt;</span> <span class="mi">0</span> <span class="o">?</span> <span class="o">-</span><span class="nl">ret</span> <span class="p">:</span> <span class="n">ret</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">        <span class="k">goto</span> <span class="n">error</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">    <span class="p">}</span>
</span></span><span class="line"><span class="cl">    <span class="k">return</span> <span class="n">handle</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="nl">error</span><span class="p">:</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">    <span class="k">if</span><span class="p">(</span><span class="n">handle</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">    <span class="p">{</span>
</span></span><span class="line"><span class="cl">        <span class="nf">__tls_net_deinit</span><span class="p">(</span><span class="n">handle</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">        <span class="nf">free</span><span class="p">(</span><span class="n">handle</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">    <span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">    <span class="k">return</span> <span class="nb">NULL</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kt">int</span> <span class="nf">qtf_tls_send</span><span class="p">(</span><span class="kt">void</span> <span class="o">*</span><span class="n">handle</span><span class="p">,</span> <span class="k">const</span> <span class="kt">void</span> <span class="o">*</span><span class="n">buf</span><span class="p">,</span> <span class="kt">uint32_t</span> <span class="n">len</span><span class="p">,</span> <span class="kt">uint32_t</span> <span class="n">timeout_ms</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="p">{</span>
</span></span><span class="line"><span class="cl">    <span class="kt">qtf_tls_handle_t</span> <span class="o">*</span><span class="n">tls_handle</span> <span class="o">=</span> <span class="p">(</span><span class="kt">qtf_tls_handle_t</span> <span class="o">*</span><span class="p">)</span><span class="n">handle</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">    <span class="kt">int</span> <span class="n">ret</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">    <span class="kt">int</span> <span class="n">send_len</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">    <span class="kt">timer_t</span> <span class="n">timer</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">    <span class="k">if</span><span class="p">(</span><span class="o">!</span><span class="n">handle</span> <span class="o">||</span> <span class="o">!</span><span class="n">buf</span> <span class="o">||</span> <span class="o">!</span><span class="n">len</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">    <span class="p">{</span>
</span></span><span class="line"><span class="cl">        <span class="nf">dlg_error</span><span class="p">(</span><span class="s">&#34;invalid param&#34;</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">        <span class="k">return</span> <span class="o">-</span><span class="mi">1</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">    <span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">    <span class="nf">qtf_timer_init</span><span class="p">(</span><span class="o">&amp;</span><span class="n">timer</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">    <span class="nf">qtf_timer_countdown_ms</span><span class="p">(</span><span class="o">&amp;</span><span class="n">timer</span><span class="p">,</span> <span class="n">timeout_ms</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">    <span class="k">do</span>
</span></span><span class="line"><span class="cl">    <span class="p">{</span>
</span></span><span class="line"><span class="cl">        <span class="n">ret</span> <span class="o">=</span> <span class="nf">wolfSSL_write</span><span class="p">(</span><span class="n">tls_handle</span><span class="o">-&gt;</span><span class="n">ssl</span><span class="p">,</span> <span class="p">(</span><span class="k">const</span> <span class="kt">unsigned</span> <span class="kt">char</span> <span class="o">*</span><span class="p">)</span><span class="n">buf</span> <span class="o">+</span> <span class="n">send_len</span><span class="p">,</span> <span class="n">len</span> <span class="o">-</span> <span class="n">send_len</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">        <span class="k">if</span> <span class="p">(</span><span class="n">ret</span> <span class="o">&gt;=</span> <span class="mi">0</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">        <span class="p">{</span>
</span></span><span class="line"><span class="cl">            <span class="n">send_len</span> <span class="o">+=</span> <span class="n">ret</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">        <span class="p">}</span>
</span></span><span class="line"><span class="cl">        <span class="k">else</span>
</span></span><span class="line"><span class="cl">        <span class="p">{</span>
</span></span><span class="line"><span class="cl">            <span class="nf">dlg_error</span><span class="p">(</span><span class="s">&#34;wolfSSL_write failed 0x%04x&#34;</span><span class="p">,</span> <span class="n">ret</span> <span class="o">&lt;</span> <span class="mi">0</span> <span class="o">?</span> <span class="o">-</span><span class="nl">ret</span> <span class="p">:</span> <span class="n">ret</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">            <span class="k">break</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">        <span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">    <span class="p">}</span> <span class="k">while</span> <span class="p">(</span><span class="n">send_len</span> <span class="o">&lt;</span> <span class="n">len</span> <span class="o">&amp;&amp;</span> <span class="o">!</span><span class="nf">qtf_timer_expired</span><span class="p">(</span><span class="o">&amp;</span><span class="n">timer</span><span class="p">));</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">    <span class="k">if</span><span class="p">(</span><span class="n">send_len</span> <span class="o">==</span> <span class="mi">0</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">    <span class="p">{</span>
</span></span><span class="line"><span class="cl">        <span class="k">return</span> <span class="o">-</span><span class="mi">1</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">    <span class="p">}</span>
</span></span><span class="line"><span class="cl">    
</span></span><span class="line"><span class="cl">    <span class="k">return</span> <span class="n">send_len</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span><span class="line"><span class="cl"><span class="kt">int</span> <span class="nf">qtf_tls_recv</span><span class="p">(</span><span class="kt">void</span> <span class="o">*</span><span class="n">handle</span><span class="p">,</span> <span class="kt">void</span> <span class="o">*</span><span class="n">buf</span><span class="p">,</span> <span class="kt">uint32_t</span> <span class="n">len</span><span class="p">,</span> <span class="kt">uint32_t</span> <span class="n">timeout_ms</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="p">{</span>
</span></span><span class="line"><span class="cl">    <span class="kt">qtf_tls_handle_t</span> <span class="o">*</span><span class="n">tls_handle</span> <span class="o">=</span> <span class="p">(</span><span class="kt">qtf_tls_handle_t</span> <span class="o">*</span><span class="p">)</span><span class="n">handle</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">    <span class="kt">int</span> <span class="n">ret</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">    <span class="kt">timer_t</span> <span class="n">timer</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">    <span class="kt">int</span> <span class="n">recv_len</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">    <span class="k">if</span><span class="p">(</span><span class="o">!</span><span class="n">handle</span> <span class="o">||</span> <span class="o">!</span><span class="n">buf</span> <span class="o">||</span> <span class="o">!</span><span class="n">len</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">    <span class="p">{</span>
</span></span><span class="line"><span class="cl">        <span class="nf">dlg_error</span><span class="p">(</span><span class="s">&#34;invalid param&#34;</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">        <span class="k">return</span> <span class="o">-</span><span class="mi">1</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">    <span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">    <span class="nf">qtf_timer_init</span><span class="p">(</span><span class="o">&amp;</span><span class="n">timer</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">    <span class="nf">qtf_timer_countdown_ms</span><span class="p">(</span><span class="o">&amp;</span><span class="n">timer</span><span class="p">,</span> <span class="n">timeout_ms</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">    <span class="k">do</span>
</span></span><span class="line"><span class="cl">    <span class="p">{</span>
</span></span><span class="line"><span class="cl">        <span class="n">ret</span> <span class="o">=</span> <span class="nf">wolfSSL_read</span><span class="p">(</span><span class="n">tls_handle</span><span class="o">-&gt;</span><span class="n">ssl</span><span class="p">,</span> <span class="p">(</span><span class="kt">unsigned</span> <span class="kt">char</span> <span class="o">*</span><span class="p">)</span><span class="n">buf</span> <span class="o">+</span> <span class="n">recv_len</span><span class="p">,</span> <span class="n">len</span> <span class="o">-</span> <span class="n">recv_len</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">        <span class="k">if</span> <span class="p">(</span><span class="n">ret</span> <span class="o">&gt;=</span> <span class="mi">0</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">        <span class="p">{</span>
</span></span><span class="line"><span class="cl">            <span class="n">recv_len</span> <span class="o">+=</span> <span class="n">ret</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">        <span class="p">}</span>
</span></span><span class="line"><span class="cl">        <span class="k">else</span>
</span></span><span class="line"><span class="cl">        <span class="p">{</span>
</span></span><span class="line"><span class="cl">            <span class="nf">dlg_error</span><span class="p">(</span><span class="s">&#34;wolfSSL_read failed 0x%04x&#34;</span><span class="p">,</span> <span class="n">ret</span> <span class="o">&lt;</span> <span class="mi">0</span> <span class="o">?</span> <span class="o">-</span><span class="nl">ret</span> <span class="p">:</span> <span class="n">ret</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">            <span class="k">break</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">        <span class="p">}</span>
</span></span><span class="line"><span class="cl">    <span class="p">}</span> <span class="k">while</span> <span class="p">(</span><span class="n">recv_len</span> <span class="o">&lt;</span> <span class="n">len</span> <span class="o">&amp;&amp;</span> <span class="o">!</span><span class="nf">qtf_timer_expired</span><span class="p">(</span><span class="o">&amp;</span><span class="n">timer</span><span class="p">));</span>
</span></span><span class="line"><span class="cl">    
</span></span><span class="line"><span class="cl">    <span class="k">if</span><span class="p">(</span><span class="n">recv_len</span> <span class="o">==</span> <span class="mi">0</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">    <span class="p">{</span>
</span></span><span class="line"><span class="cl">        <span class="k">return</span> <span class="o">-</span><span class="mi">1</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">    <span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">    <span class="k">return</span> <span class="n">recv_len</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kt">int</span> <span class="nf">qtf_tls_close</span><span class="p">(</span><span class="kt">void</span> <span class="o">*</span><span class="n">handle</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="p">{</span>
</span></span><span class="line"><span class="cl">    <span class="kt">int</span> <span class="n">ret</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">    <span class="kt">qtf_tls_handle_t</span> <span class="o">*</span><span class="n">tls_handle</span> <span class="o">=</span> <span class="p">(</span><span class="kt">qtf_tls_handle_t</span> <span class="o">*</span><span class="p">)</span><span class="n">handle</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">    <span class="k">if</span> <span class="p">(</span><span class="o">!</span><span class="n">handle</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">    <span class="p">{</span>
</span></span><span class="line"><span class="cl">        <span class="nf">dlg_error</span><span class="p">(</span><span class="s">&#34;invalid param&#34;</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">        <span class="k">return</span> <span class="o">-</span><span class="mi">1</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">    <span class="p">}</span>
</span></span><span class="line"><span class="cl">    <span class="nf">__tls_net_deinit</span><span class="p">(</span><span class="n">tls_handle</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">    <span class="nf">free</span><span class="p">(</span><span class="n">tls_handle</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">    <span class="k">return</span> <span class="n">ret</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span></code></pre></td></tr></table>
</div>
</div><h2 id="示例">示例</h2>
<p>上层封装的接口没有变，测试例子可以直接使用之前测试 mbedtls tls 连接的例子。</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt"> 1
</span><span class="lnt"> 2
</span><span class="lnt"> 3
</span><span class="lnt"> 4
</span><span class="lnt"> 5
</span><span class="lnt"> 6
</span><span class="lnt"> 7
</span><span class="lnt"> 8
</span><span class="lnt"> 9
</span><span class="lnt">10
</span><span class="lnt">11
</span><span class="lnt">12
</span><span class="lnt">13
</span><span class="lnt">14
</span><span class="lnt">15
</span><span class="lnt">16
</span><span class="lnt">17
</span><span class="lnt">18
</span><span class="lnt">19
</span><span class="lnt">20
</span><span class="lnt">21
</span><span class="lnt">22
</span><span class="lnt">23
</span><span class="lnt">24
</span><span class="lnt">25
</span><span class="lnt">26
</span><span class="lnt">27
</span><span class="lnt">28
</span><span class="lnt">29
</span><span class="lnt">30
</span><span class="lnt">31
</span><span class="lnt">32
</span><span class="lnt">33
</span><span class="lnt">34
</span><span class="lnt">35
</span><span class="lnt">36
</span><span class="lnt">37
</span><span class="lnt">38
</span><span class="lnt">39
</span><span class="lnt">40
</span><span class="lnt">41
</span><span class="lnt">42
</span><span class="lnt">43
</span><span class="lnt">44
</span><span class="lnt">45
</span><span class="lnt">46
</span><span class="lnt">47
</span><span class="lnt">48
</span><span class="lnt">49
</span><span class="lnt">50
</span><span class="lnt">51
</span><span class="lnt">52
</span><span class="lnt">53
</span><span class="lnt">54
</span><span class="lnt">55
</span><span class="lnt">56
</span><span class="lnt">57
</span><span class="lnt">58
</span><span class="lnt">59
</span><span class="lnt">60
</span><span class="lnt">61
</span><span class="lnt">62
</span><span class="lnt">63
</span><span class="lnt">64
</span><span class="lnt">65
</span><span class="lnt">66
</span><span class="lnt">67
</span><span class="lnt">68
</span><span class="lnt">69
</span><span class="lnt">70
</span><span class="lnt">71
</span><span class="lnt">72
</span><span class="lnt">73
</span><span class="lnt">74
</span><span class="lnt">75
</span><span class="lnt">76
</span><span class="lnt">77
</span><span class="lnt">78
</span><span class="lnt">79
</span><span class="lnt">80
</span><span class="lnt">81
</span><span class="lnt">82
</span><span class="lnt">83
</span><span class="lnt">84
</span><span class="lnt">85
</span><span class="lnt">86
</span><span class="lnt">87
</span><span class="lnt">88
</span><span class="lnt">89
</span><span class="lnt">90
</span><span class="lnt">91
</span><span class="lnt">92
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-c" data-lang="c"><span class="line"><span class="cl"><span class="kt">void</span> <span class="nf">shell_tlstest_cmd</span><span class="p">(</span><span class="kt">int</span> <span class="n">argc</span><span class="p">,</span> <span class="kt">char</span> <span class="o">*</span><span class="n">argv</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="p">{</span>
</span></span><span class="line"><span class="cl">	<span class="kt">qtf_tls_conn_param_t</span> <span class="n">tls_param</span> <span class="o">=</span> <span class="p">{</span><span class="mi">0</span><span class="p">};</span>
</span></span><span class="line"><span class="cl">	<span class="kt">void</span> <span class="o">*</span><span class="n">tls_handle</span> <span class="o">=</span> <span class="nb">NULL</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">	<span class="kt">char</span> <span class="n">recv_buf</span><span class="p">[</span><span class="mi">1024</span><span class="p">]</span> <span class="o">=</span> <span class="p">{</span><span class="mi">0</span><span class="p">};</span>
</span></span><span class="line"><span class="cl">	<span class="kt">int</span> <span class="n">ret</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">	<span class="k">const</span> <span class="kt">char</span> <span class="n">request</span><span class="p">[]</span> <span class="o">=</span> <span class="s">&#34;GET /get?a=1 HTTP/1.1</span><span class="se">\r\n</span><span class="s">&#34;</span>
</span></span><span class="line"><span class="cl">		<span class="s">&#34;Host: httpbin.org</span><span class="se">\r\n</span><span class="s">&#34;</span>
</span></span><span class="line"><span class="cl">		<span class="s">&#34;Connection: close</span><span class="se">\r\n</span><span class="s">&#34;</span>
</span></span><span class="line"><span class="cl">		<span class="s">&#34;</span><span class="se">\r\n</span><span class="s">&#34;</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">	<span class="k">const</span> <span class="kt">char</span> <span class="o">*</span><span class="n">test_ca_cert</span> <span class="o">=</span>
</span></span><span class="line"><span class="cl">		<span class="p">{</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">			<span class="s">&#34;-----BEGIN CERTIFICATE-----</span><span class="se">\r\n</span><span class="s">&#34;</span>
</span></span><span class="line"><span class="cl">			<span class="s">&#34;MIIDdTCCAl2gAwIBAgILBAAAAAABFUtaw5QwDQYJKoZIhvcNAQEFBQAwVzELMAkG</span><span class="se">\r\n</span><span class="s">&#34;</span>
</span></span><span class="line"><span class="cl">			<span class="s">&#34;A1UEBhMCQkUxGTAXBgNVBAoTEEdsb2JhbFNpZ24gbnYtc2ExEDAOBgNVBAsTB1Jv</span><span class="se">\r\n</span><span class="s">&#34;</span>
</span></span><span class="line"><span class="cl">			<span class="s">&#34;b3QgQ0ExGzAZBgNVBAMTEkdsb2JhbFNpZ24gUm9vdCBDQTAeFw05ODA5MDExMjAw</span><span class="se">\r\n</span><span class="s">&#34;</span>
</span></span><span class="line"><span class="cl">			<span class="s">&#34;MDBaFw0yODAxMjgxMjAwMDBaMFcxCzAJBgNVBAYTAkJFMRkwFwYDVQQKExBHbG9i</span><span class="se">\r\n</span><span class="s">&#34;</span>
</span></span><span class="line"><span class="cl">			<span class="s">&#34;YWxTaWduIG52LXNhMRAwDgYDVQQLEwdSb290IENBMRswGQYDVQQDExJHbG9iYWxT</span><span class="se">\r\n</span><span class="s">&#34;</span>
</span></span><span class="line"><span class="cl">			<span class="s">&#34;aWduIFJvb3QgQ0EwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDaDuaZ</span><span class="se">\r\n</span><span class="s">&#34;</span>
</span></span><span class="line"><span class="cl">			<span class="s">&#34;jc6j40+Kfvvxi4Mla+pIH/EqsLmVEQS98GPR4mdmzxzdzxtIK+6NiY6arymAZavp</span><span class="se">\r\n</span><span class="s">&#34;</span>
</span></span><span class="line"><span class="cl">			<span class="s">&#34;xy0Sy6scTHAHoT0KMM0VjU/43dSMUBUc71DuxC73/OlS8pF94G3VNTCOXkNz8kHp</span><span class="se">\r\n</span><span class="s">&#34;</span>
</span></span><span class="line"><span class="cl">			<span class="s">&#34;1Wrjsok6Vjk4bwY8iGlbKk3Fp1S4bInMm/k8yuX9ifUSPJJ4ltbcdG6TRGHRjcdG</span><span class="se">\r\n</span><span class="s">&#34;</span>
</span></span><span class="line"><span class="cl">			<span class="s">&#34;snUOhugZitVtbNV4FpWi6cgKOOvyJBNPc1STE4U6G7weNLWLBYy5d4ux2x8gkasJ</span><span class="se">\r\n</span><span class="s">&#34;</span>
</span></span><span class="line"><span class="cl">			<span class="s">&#34;U26Qzns3dLlwR5EiUWMWea6xrkEmCMgZK9FGqkjWZCrXgzT/LCrBbBlDSgeF59N8</span><span class="se">\r\n</span><span class="s">&#34;</span>
</span></span><span class="line"><span class="cl">			<span class="s">&#34;9iFo7+ryUp9/k5DPAgMBAAGjQjBAMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8E</span><span class="se">\r\n</span><span class="s">&#34;</span>
</span></span><span class="line"><span class="cl">			<span class="s">&#34;BTADAQH/MB0GA1UdDgQWBBRge2YaRQ2XyolQL30EzTSo//z9SzANBgkqhkiG9w0B</span><span class="se">\r\n</span><span class="s">&#34;</span>
</span></span><span class="line"><span class="cl">			<span class="s">&#34;AQUFAAOCAQEA1nPnfE920I2/7LqivjTFKDK1fPxsnCwrvQmeU79rXqoRSLblCKOz</span><span class="se">\r\n</span><span class="s">&#34;</span>
</span></span><span class="line"><span class="cl">			<span class="s">&#34;yj1hTdNGCbM+w6DjY1Ub8rrvrTnhQ7k4o+YviiY776BQVvnGCv04zcQLcFGUl5gE</span><span class="se">\r\n</span><span class="s">&#34;</span>
</span></span><span class="line"><span class="cl">			<span class="s">&#34;38NflNUVyRRBnMRddWQVDf9VMOyGj/8N7yy5Y0b2qvzfvGn9LhJIZJrglfCm7ymP</span><span class="se">\r\n</span><span class="s">&#34;</span>
</span></span><span class="line"><span class="cl">			<span class="s">&#34;AbEVtQwdpf5pLGkkeB6zpxxxYu7KyJesF12KwvhHhm4qxFYxldBniYUr+WymXUad</span><span class="se">\r\n</span><span class="s">&#34;</span>
</span></span><span class="line"><span class="cl">			<span class="s">&#34;DKqC5JlR3XC321Y9YeRq4VzW9v493kHMB65jUr9TU/Qr6cf9tveCX4XSQRjbgbME</span><span class="se">\r\n</span><span class="s">&#34;</span>
</span></span><span class="line"><span class="cl">			<span class="s">&#34;HMUfpIBvFSDJ3gyICh3WZlXi/EjJKSZp4A==</span><span class="se">\r\n</span><span class="s">&#34;</span>
</span></span><span class="line"><span class="cl">			<span class="s">&#34;-----END CERTIFICATE-----&#34;</span><span class="p">};</span>
</span></span><span class="line"><span class="cl">	<span class="n">tls_param</span><span class="p">.</span><span class="n">auth_mode</span> <span class="o">=</span> <span class="n">QTF_TLS_AUTH_MODE_CERT</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">	<span class="n">tls_param</span><span class="p">.</span><span class="n">verify_mode</span> <span class="o">=</span> <span class="n">QTF_TLS_VERIFY_MODE_OPTIONAL</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">	<span class="n">tls_param</span><span class="p">.</span><span class="n">hanshake_timeout_ms</span> <span class="o">=</span> <span class="mi">10000</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">	<span class="n">tls_param</span><span class="p">.</span><span class="n">ca_cert</span> <span class="o">=</span> <span class="n">test_ca_cert</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">	<span class="n">tls_param</span><span class="p">.</span><span class="n">ca_cert_len</span> <span class="o">=</span> <span class="nf">strlen</span><span class="p">(</span><span class="n">test_ca_cert</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">	<span class="n">tls_param</span><span class="p">.</span><span class="n">client_cert</span> <span class="o">=</span> <span class="nb">NULL</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">	<span class="n">tls_param</span><span class="p">.</span><span class="n">client_cert_len</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">	<span class="n">tls_param</span><span class="p">.</span><span class="n">client_key</span> <span class="o">=</span> <span class="nb">NULL</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">	<span class="n">tls_param</span><span class="p">.</span><span class="n">client_key_len</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">	<span class="n">tls_param</span><span class="p">.</span><span class="n">client_key_passwd</span> <span class="o">=</span> <span class="nb">NULL</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">	<span class="n">tls_param</span><span class="p">.</span><span class="n">client_key_passwd_len</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">	<span class="n">tls_param</span><span class="p">.</span><span class="n">psk</span> <span class="o">=</span> <span class="nb">NULL</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">	<span class="n">tls_param</span><span class="p">.</span><span class="n">psk_len</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">	<span class="n">tls_param</span><span class="p">.</span><span class="n">psk_id</span> <span class="o">=</span> <span class="nb">NULL</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">	<span class="n">tls_param</span><span class="p">.</span><span class="n">debug_level</span> <span class="o">=</span> <span class="n">QTF_TLS_DEBUG_LEVEL_ERROR</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">	<span class="n">tls_param</span><span class="p">.</span><span class="n">tls_version</span> <span class="o">=</span> <span class="n">QTF_TLS_VERSION_TLS1_2</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">	<span class="n">tls_param</span><span class="p">.</span><span class="n">max_frag_len</span> <span class="o">=</span> <span class="n">QTF_TLS_MAX_FRAG_LEN_NO_USE</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">	<span class="n">tls_handle</span> <span class="o">=</span> <span class="nf">qtf_tls_connect</span><span class="p">(</span><span class="s">&#34;httpbin.org&#34;</span><span class="p">,</span> <span class="mi">443</span><span class="p">,</span> <span class="o">&amp;</span><span class="n">tls_param</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">	<span class="k">if</span><span class="p">(</span><span class="n">tls_handle</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">	<span class="p">{</span>
</span></span><span class="line"><span class="cl">		<span class="nf">shell_printf</span><span class="p">(</span><span class="s">&#34;tls connect success</span><span class="se">\r\n</span><span class="s">&#34;</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">	<span class="p">}</span>
</span></span><span class="line"><span class="cl">	<span class="k">else</span>
</span></span><span class="line"><span class="cl">	<span class="p">{</span>
</span></span><span class="line"><span class="cl">		<span class="nf">shell_printf</span><span class="p">(</span><span class="s">&#34;tls connect failed</span><span class="se">\r\n</span><span class="s">&#34;</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">		<span class="k">return</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">	<span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">	<span class="n">ret</span> <span class="o">=</span> <span class="nf">qtf_tls_send</span><span class="p">(</span><span class="n">tls_handle</span><span class="p">,</span> <span class="n">request</span><span class="p">,</span> <span class="nf">strlen</span><span class="p">(</span><span class="n">request</span><span class="p">),</span> <span class="mi">1000</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">	<span class="k">if</span><span class="p">(</span><span class="n">ret</span> <span class="o">&gt;</span> <span class="mi">0</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">	<span class="p">{</span>
</span></span><span class="line"><span class="cl">		<span class="nf">shell_printf</span><span class="p">(</span><span class="s">&#34;tls send success</span><span class="se">\r\n</span><span class="s">&#34;</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">	<span class="p">}</span>
</span></span><span class="line"><span class="cl">	<span class="k">else</span>
</span></span><span class="line"><span class="cl">	<span class="p">{</span>
</span></span><span class="line"><span class="cl">		<span class="nf">shell_printf</span><span class="p">(</span><span class="s">&#34;tls send failed</span><span class="se">\r\n</span><span class="s">&#34;</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">		<span class="nf">qtf_tls_close</span><span class="p">(</span><span class="n">tls_handle</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">		<span class="k">return</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">	<span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">	<span class="n">ret</span> <span class="o">=</span> <span class="nf">qtf_tls_recv</span><span class="p">(</span><span class="n">tls_handle</span><span class="p">,</span> <span class="n">recv_buf</span><span class="p">,</span> <span class="k">sizeof</span><span class="p">(</span><span class="n">recv_buf</span><span class="p">),</span> <span class="mi">1000</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">	<span class="k">if</span><span class="p">(</span><span class="n">ret</span> <span class="o">&gt;</span> <span class="mi">0</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">	<span class="p">{</span>
</span></span><span class="line"><span class="cl">		<span class="nf">shell_printf</span><span class="p">(</span><span class="s">&#34;tls recv success</span><span class="se">\r\n</span><span class="s">&#34;</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">		<span class="nf">shell_printf</span><span class="p">(</span><span class="s">&#34;recv:%s</span><span class="se">\r\n</span><span class="s">&#34;</span><span class="p">,</span> <span class="n">recv_buf</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">	<span class="p">}</span>
</span></span><span class="line"><span class="cl">	<span class="k">else</span>
</span></span><span class="line"><span class="cl">	<span class="p">{</span>
</span></span><span class="line"><span class="cl">		<span class="nf">shell_printf</span><span class="p">(</span><span class="s">&#34;tls recv failed</span><span class="se">\r\n</span><span class="s">&#34;</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">		<span class="nf">qtf_tls_close</span><span class="p">(</span><span class="n">tls_handle</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">		<span class="k">return</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">	<span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">	<span class="nf">qtf_tls_close</span><span class="p">(</span><span class="n">tls_handle</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span></code></pre></td></tr></table>
</div>
</div><p>测试日志：</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt"> 1
</span><span class="lnt"> 2
</span><span class="lnt"> 3
</span><span class="lnt"> 4
</span><span class="lnt"> 5
</span><span class="lnt"> 6
</span><span class="lnt"> 7
</span><span class="lnt"> 8
</span><span class="lnt"> 9
</span><span class="lnt">10
</span><span class="lnt">11
</span><span class="lnt">12
</span><span class="lnt">13
</span><span class="lnt">14
</span><span class="lnt">15
</span><span class="lnt">16
</span><span class="lnt">17
</span><span class="lnt">18
</span><span class="lnt">19
</span><span class="lnt">20
</span><span class="lnt">21
</span><span class="lnt">22
</span><span class="lnt">23
</span><span class="lnt">24
</span><span class="lnt">25
</span><span class="lnt">26
</span><span class="lnt">27
</span><span class="lnt">28
</span><span class="lnt">29
</span><span class="lnt">30
</span><span class="lnt">31
</span><span class="lnt">32
</span><span class="lnt">33
</span><span class="lnt">34
</span><span class="lnt">35
</span><span class="lnt">36
</span><span class="lnt">37
</span><span class="lnt">38
</span><span class="lnt">39
</span><span class="lnt">40
</span><span class="lnt">41
</span><span class="lnt">42
</span><span class="lnt">43
</span><span class="lnt">44
</span><span class="lnt">45
</span><span class="lnt">46
</span><span class="lnt">47
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl"><span class="o">[</span>qt_idf_tls.c:457 qtf_tls_connect<span class="o">]</span> Connecting to httpbin.org:443...
</span></span><span class="line"><span class="cl"><span class="o">[</span>qt_idf_tcp.c:95 qtf_tcp_connect<span class="o">]</span> connect to httpbin.org:443 success fd:744
</span></span><span class="line"><span class="cl"><span class="o">[</span>qt_idf_tcp.c:176 qtf_tcp_send<span class="o">]</span> send <span class="m">242</span> bytes
</span></span><span class="line"><span class="cl"><span class="o">[</span>qt_idf_tcp.c:267 qtf_tcp_recv<span class="o">]</span> recv <span class="m">5</span> bytes
</span></span><span class="line"><span class="cl"><span class="o">[</span>qt_idf_tcp.c:267 qtf_tcp_recv<span class="o">]</span> recv <span class="m">86</span> bytes
</span></span><span class="line"><span class="cl"><span class="o">[</span>qt_idf_tcp.c:267 qtf_tcp_recv<span class="o">]</span> recv <span class="m">5</span> bytes
</span></span><span class="line"><span class="cl"><span class="o">[</span>qt_idf_tcp.c:267 qtf_tcp_recv<span class="o">]</span> recv <span class="m">4953</span> bytes
</span></span><span class="line"><span class="cl"><span class="o">[</span>qt_idf_tcp.c:267 qtf_tcp_recv<span class="o">]</span> recv <span class="m">5</span> bytes
</span></span><span class="line"><span class="cl"><span class="o">[</span>qt_idf_tcp.c:267 qtf_tcp_recv<span class="o">]</span> recv <span class="m">333</span> bytes
</span></span><span class="line"><span class="cl"><span class="o">[</span>qt_idf_tcp.c:267 qtf_tcp_recv<span class="o">]</span> recv <span class="m">5</span> bytes
</span></span><span class="line"><span class="cl"><span class="o">[</span>qt_idf_tcp.c:267 qtf_tcp_recv<span class="o">]</span> recv <span class="m">4</span> bytes
</span></span><span class="line"><span class="cl"><span class="o">[</span>qt_idf_tcp.c:176 qtf_tcp_send<span class="o">]</span> send <span class="m">126</span> bytes
</span></span><span class="line"><span class="cl"><span class="o">[</span>qt_idf_tcp.c:267 qtf_tcp_recv<span class="o">]</span> recv <span class="m">5</span> bytes
</span></span><span class="line"><span class="cl"><span class="o">[</span>qt_idf_tcp.c:267 qtf_tcp_recv<span class="o">]</span> recv <span class="m">1</span> bytes
</span></span><span class="line"><span class="cl"><span class="o">[</span>qt_idf_tcp.c:267 qtf_tcp_recv<span class="o">]</span> recv <span class="m">5</span> bytes
</span></span><span class="line"><span class="cl"><span class="o">[</span>qt_idf_tcp.c:267 qtf_tcp_recv<span class="o">]</span> recv <span class="m">40</span> bytes
</span></span><span class="line"><span class="cl">tls connect success
</span></span><span class="line"><span class="cl"><span class="o">[</span>qt_idf_tcp.c:176 qtf_tcp_send<span class="o">]</span> send <span class="m">92</span> bytes
</span></span><span class="line"><span class="cl">tls send success
</span></span><span class="line"><span class="cl"><span class="o">[</span>qt_idf_tcp.c:267 qtf_tcp_recv<span class="o">]</span> recv <span class="m">5</span> bytes
</span></span><span class="line"><span class="cl"><span class="o">[</span>qt_idf_tcp.c:267 qtf_tcp_recv<span class="o">]</span> recv <span class="m">468</span> bytes
</span></span><span class="line"><span class="cl"><span class="o">[</span>qt_idf_tcp.c:267 qtf_tcp_recv<span class="o">]</span> recv <span class="m">5</span> bytes
</span></span><span class="line"><span class="cl"><span class="o">[</span>qt_idf_tcp.c:267 qtf_tcp_recv<span class="o">]</span> recv <span class="m">26</span> bytes
</span></span><span class="line"><span class="cl"><span class="o">[</span>qt_idf_tls.c:651 qtf_tls_recv<span class="o">]</span> wolfSSL_read failed 0x0001
</span></span><span class="line"><span class="cl">tls recv success
</span></span><span class="line"><span class="cl">recv:HTTP/1.1 <span class="m">200</span> OK
</span></span><span class="line"><span class="cl">Date: Sun, <span class="m">09</span> Jul <span class="m">2023</span> 06:51:29 GMT
</span></span><span class="line"><span class="cl">Content-Type: application/json
</span></span><span class="line"><span class="cl">Content-Length: <span class="m">219</span>
</span></span><span class="line"><span class="cl">Connection: close
</span></span><span class="line"><span class="cl">Server: gunicorn/19.9.0
</span></span><span class="line"><span class="cl">Access-Control-Allow-Origin: *
</span></span><span class="line"><span class="cl">Access-Control-Allow-Credentials: <span class="nb">true</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="o">{</span>
</span></span><span class="line"><span class="cl">  <span class="s2">&#34;args&#34;</span>: <span class="o">{</span>
</span></span><span class="line"><span class="cl">    <span class="s2">&#34;a&#34;</span>: <span class="s2">&#34;1&#34;</span>
</span></span><span class="line"><span class="cl">  <span class="o">}</span>,
</span></span><span class="line"><span class="cl">  <span class="s2">&#34;headers&#34;</span>: <span class="o">{</span>
</span></span><span class="line"><span class="cl">    <span class="s2">&#34;Host&#34;</span>: <span class="s2">&#34;httpbin.org&#34;</span>,
</span></span><span class="line"><span class="cl">    <span class="s2">&#34;X-Amzn-Trace-Id&#34;</span>: <span class="s2">&#34;Root=1-64aa58f1-17ce1f42274e9e4e44d6ea95&#34;</span>
</span></span><span class="line"><span class="cl">  <span class="o">}</span>,
</span></span><span class="line"><span class="cl">  <span class="s2">&#34;origin&#34;</span>: <span class="s2">&#34;223.73.211.53&#34;</span>,
</span></span><span class="line"><span class="cl">  <span class="s2">&#34;url&#34;</span>: <span class="s2">&#34;https://httpbin.org/get?a=1&#34;</span>
</span></span><span class="line"><span class="cl"><span class="o">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="o">[</span>qt_idf_tcp.c:176 qtf_tcp_send<span class="o">]</span> send <span class="m">31</span> bytes
</span></span></code></pre></td></tr></table>
</div>
</div><h2 id="参考资料">参考资料</h2>
<ul>
<li><a href="https://github.com/wolfSSL/wolfssl">https://github.com/wolfSSL/wolfssl</a></li>
<li><a href="https://github.com/wolfSSL/wolfssl-examples/tree/master/tls">https://github.com/wolfSSL/wolfssl-examples/tree/master/tls</a></li>
<li><a href="https://hacperme.com/posts/series/cryptography/20230702_mbedtls_tls_notes/">https://hacperme.com/posts/series/cryptography/20230702_mbedtls_tls_notes/</a></li>
</ul>
]]></content:encoded>
    </item>
  </channel>
</rss>
