<?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>Tls on Hacper&#39;s Blog</title>
    <link>https://hacperme.com/tags/tls/</link>
    <description>Recent content in Tls 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/tls/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>
    <item>
      <title>mbedtls tls 客户端应用详解</title>
      <link>https://hacperme.com/posts/series/cryptography/20230702_mbedtls_tls_notes/</link>
      <pubDate>Sun, 02 Jul 2023 17:52:56 +0800</pubDate>
      <guid>https://hacperme.com/posts/series/cryptography/20230702_mbedtls_tls_notes/</guid>
      <description>介绍如何使用 mbedtls 建立 tls client 连接，以及常见连接参数配置和含义</description>
      <content:encoded><![CDATA[<p>介绍 mbedtls 的 tls client 的使用方法，常见的功能参数配置和含义。
当前使用的 mbedtls 版本是： mbedtls-3.4.0。</p>
<h2 id="功能参数配置">功能参数配置</h2>
<p>需要配置的功能选项</p>
<ul>
<li>设置 tls 协议版本: 配置 tls 1.2, tls 1.3, 还是二者都支持。</li>
<li>认证方式设置：单向认证、双向认证、还是 psk。</li>
<li>握手时的校验等级设置：不校验证书合法性，仅加密；校验，但如果失败也继续执行后面的握手流程；校验不通过则终止握手流程。</li>
<li>服务器ca证书设置</li>
<li>客户端证书和密钥设置</li>
<li>预定义共享密钥设置</li>
</ul>
<h2 id="编译配置">编译配置</h2>
<p>使用 mbedtls_config.h 配置文件，tls 1.2 默认打开，不需要修改，但 tls 1.3 未开启，需要特别设置。</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></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">//mbedtls_config.h 
</span></span></span><span class="line"><span class="cl"><span class="c1"></span><span class="cp">#define MBEDTLS_SSL_PROTO_TLS1_3
</span></span></span><span class="line"><span class="cl"><span class="cp">#define MBEDTLS_SSL_TLS1_3_COMPATIBILITY_MODE
</span></span></span><span class="line"><span class="cl"><span class="cp">#define MBEDTLS_USE_PSA_CRYPTO
</span></span></span><span class="line"><span class="cl"><span class="cp">#define MBEDTLS_PSA_CRYPTO_CONFIG
</span></span></span></code></pre></td></tr></table>
</div>
</div><p>解决 mps_common.h 中的编译问题，替换 MBEDTLS_MPS_STORED_SIZE_MAX 和 MBEDTLS_MPS_SIZE_MAX 宏定义。</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></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">//mps_common.h
</span></span></span><span class="line"><span class="cl"><span class="c1"></span><span class="cp">#define MBEDTLS_MPS_STORED_SIZE_MAX  (SIZE_MAX)
</span></span></span><span class="line"><span class="cl"><span class="cp">#define MBEDTLS_MPS_SIZE_MAX  (SIZE_MAX)
</span></span></span></code></pre></td></tr></table>
</div>
</div><h2 id="api-设计和实现">API 设计和实现</h2>
<p>接口处理的事情，主要是连接参数配置、打开和关闭连接，接收和发送数据。</p>
<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><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></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></span><span class="line"><span class="cl"><span class="k">typedef</span> <span class="k">enum</span>
</span></span><span class="line"><span class="cl"><span class="p">{</span>
</span></span><span class="line"><span class="cl">    <span class="n">QTF_TLS_AUTH_MODE_CERT</span> <span class="o">=</span> <span class="mi">0</span><span class="p">,</span> <span class="c1">// 校验证书
</span></span></span><span class="line"><span class="cl"><span class="c1"></span>    <span class="n">QTF_TLS_AUTH_MODE_PSK</span><span class="p">,</span> <span class="c1">// 预定义共享密钥
</span></span></span><span class="line"><span class="cl"><span class="c1"></span>    <span class="n">QTF_TLS_AUTH_MODE_MAX</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span><span class="kt">qtf_tls_auth_mode_t</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="k">typedef</span> <span class="k">enum</span>
</span></span><span class="line"><span class="cl"><span class="p">{</span>
</span></span><span class="line"><span class="cl">    <span class="n">QTF_TLS_VERSION_TLS1_2</span> <span class="o">=</span> <span class="mi">0</span><span class="p">,</span>     <span class="c1">// TLS v1.2
</span></span></span><span class="line"><span class="cl"><span class="c1"></span>    <span class="n">QTF_TLS_VERSION_TLS1_3</span><span class="p">,</span>         <span class="c1">// TLS v1.3
</span></span></span><span class="line"><span class="cl"><span class="c1"></span>    <span class="n">QTF_TLS_VERSION_TLS1_2_1_3</span><span class="p">,</span>     <span class="c1">// TLS v1.2 and TLS v1.3
</span></span></span><span class="line"><span class="cl"><span class="c1"></span>    <span class="n">QTF_TLS_VERSION_MAX</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span><span class="kt">qtf_tls_version_t</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="k">typedef</span> <span class="k">enum</span>
</span></span><span class="line"><span class="cl"><span class="p">{</span>
</span></span><span class="line"><span class="cl">    <span class="n">QTF_TLS_VERIFY_MODE_NONE</span> <span class="o">=</span> <span class="mi">0</span><span class="p">,</span> <span class="c1">// 不校验证书是否合法
</span></span></span><span class="line"><span class="cl"><span class="c1"></span>    <span class="n">QTF_TLS_VERIFY_MODE_OPTIONAL</span><span class="p">,</span> <span class="c1">// 证书校验失败，继续执行握手
</span></span></span><span class="line"><span class="cl"><span class="c1"></span>    <span class="n">QTF_TLS_VERIFY_MODE_REQUIRED</span><span class="p">,</span> <span class="c1">// 证书校验失败终止握手，推荐配置
</span></span></span><span class="line"><span class="cl"><span class="c1"></span>    <span class="n">QTF_TLS_VERIFY_MODE_MAX</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span><span class="kt">qtf_tls_verify_mode_t</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="k">typedef</span> <span class="k">enum</span>
</span></span><span class="line"><span class="cl"><span class="p">{</span>
</span></span><span class="line"><span class="cl">    <span class="n">QTF_TLS_DEBUG_LEVEL_NONE</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">QTF_TLS_DEBUG_LEVEL_ERROR</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">    <span class="n">QTF_TLS_DEBUG_LEVEL_STATE</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">    <span class="n">QTF_TLS_DEBUG_LEVEL_INFO</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">    <span class="n">QTF_TLS_DEBUG_LEVEL_VERBOSE</span><span class="p">,</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span><span class="kt">qtf_tls_debug_level_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">// tls 报文分片大小设置
</span></span></span><span class="line"><span class="cl"><span class="c1"></span><span class="k">typedef</span> <span class="k">enum</span>
</span></span><span class="line"><span class="cl"><span class="p">{</span>
</span></span><span class="line"><span class="cl">    <span class="n">QTF_TLS_MAX_FRAG_LEN_NO_USE</span> <span class="o">=</span> <span class="mi">0</span><span class="p">,</span> <span class="c1">// 不设置
</span></span></span><span class="line"><span class="cl"><span class="c1"></span>    <span class="n">QTF_TLS_MAX_FRAG_LEN_512</span><span class="p">,</span> <span class="c1">// 设置 tls 报文分片大小 512 字节
</span></span></span><span class="line"><span class="cl"><span class="c1"></span>    <span class="n">QTF_TLS_MAX_FRAG_LEN_1024</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">    <span class="n">QTF_TLS_MAX_FRAG_LEN_2048</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">    <span class="n">QTF_TLS_MAX_FRAG_LEN_4096</span><span class="p">,</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span><span class="kt">qtf_tls_max_frag_len_t</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">
</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="kt">qtf_tls_auth_mode_t</span> <span class="n">auth_mode</span><span class="p">;</span> <span class="c1">// 认证方式
</span></span></span><span class="line"><span class="cl"><span class="c1"></span>    <span class="kt">qtf_tls_verify_mode_t</span> <span class="n">verify_mode</span><span class="p">;</span> <span class="c1">// 握手校验等级
</span></span></span><span class="line"><span class="cl"><span class="c1"></span>    <span class="kt">qtf_tls_version_t</span> <span class="n">tls_version</span><span class="p">;</span> <span class="c1">// tls 协议版本设置
</span></span></span><span class="line"><span class="cl"><span class="c1"></span>    <span class="kt">qtf_tls_debug_level_t</span> <span class="n">debug_level</span><span class="p">;</span> <span class="c1">// 调试日志等级设置
</span></span></span><span class="line"><span class="cl"><span class="c1"></span>    <span class="kt">qtf_tls_max_frag_len_t</span> <span class="n">max_frag_len</span><span class="p">;</span> <span class="c1">// 报文分片大小设置
</span></span></span><span class="line"><span class="cl"><span class="c1"></span>    <span class="kt">uint32_t</span> <span class="n">hanshake_timeout_ms</span><span class="p">;</span> <span class="c1">// 握手超时时间设置
</span></span></span><span class="line"><span class="cl"><span class="c1"></span>    <span class="k">const</span> <span class="kt">char</span> <span class="o">*</span><span class="n">ca_cert</span><span class="p">;</span> 	<span class="c1">// 服务器ca 证书
</span></span></span><span class="line"><span class="cl"><span class="c1"></span>    <span class="kt">uint32_t</span> <span class="n">ca_cert_len</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">client_cert</span><span class="p">;</span> <span class="c1">// 客户端证书
</span></span></span><span class="line"><span class="cl"><span class="c1"></span>    <span class="kt">uint32_t</span> <span class="n">client_cert_len</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">client_key</span><span class="p">;</span> <span class="c1">// 客户端密钥
</span></span></span><span class="line"><span class="cl"><span class="c1"></span>    <span class="kt">uint32_t</span> <span class="n">client_key_len</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">client_key_passwd</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">    <span class="kt">uint32_t</span> <span class="n">client_key_passwd_len</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">psk</span><span class="p">;</span> <span class="c1">// 预定义共享密钥
</span></span></span><span class="line"><span class="cl"><span class="c1"></span>    <span class="kt">uint32_t</span> <span class="n">psk_len</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">psk_id</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span><span class="kt">qtf_tls_conn_param_t</span><span class="p">;</span>
</span></span></code></pre></td></tr></table>
</div>
</div><p>连接参数配置说明：</p>
<ul>
<li>
<p>auth_mode：认证方式设置。</p>
<p>一是通过证书认证，另一个是通过预定义密钥 PSK。</p>
</li>
<li>
<p>verify_mode：握手的校验等级。</p>
<p>推荐配置为 QTF_TLS_VERIFY_MODE_REQUIRED。如果只是想加密而不校验，可以配置 QTF_TLS_VERIFY_MODE_NONE 或 QTF_TLS_VERIFY_MODE_OPTIONAL。</p>
</li>
<li>
<p>tls_version：tls 协议版本。</p>
<p>推荐配置成 tls 1.2 或 tls 1.3，tls 1.2 以下的版本不安全，tls 1.3 版本 mbedtls 没有完整支持。</p>
</li>
<li>
<p>debug_level：日志等级。</p>
<p>推荐设置 QTF_TLS_DEBUG_LEVEL_NONE 关闭日志输出。排查问题时可以将日志打开 QTF_TLS_DEBUG_LEVEL_VERBOSE（注意会打印密钥和收发数据的明文内容）。</p>
</li>
<li>
<p>max_frag_len： 数据分片大小设置。</p>
<p>在客户端侧设置，用于协商数据分片大小，设置这个参数应该是出于对使用内存大小和带宽的考虑。</p>
<p>设置太小，可能会出现服务器证书接收不完整导致握手失败问题，但最大值也不能设置超过接收缓冲区的大小。</p>
</li>
<li>
<p>hanshake_timeout_ms：握手超时时间。</p>
</li>
<li>
<p>ca_cert：服务器的 ca 证书。</p>
<p>如果要求校验证书，则必须设置。客户端校验服务器是否合法，单向认证。</p>
</li>
<li>
<p>client_cert：客户端证书。</p>
<p>要求双向认证的时候必须设置，用于服务器校验客户端是否合法。同时还要设置 client_key。</p>
</li>
<li>
<p>psk ：预定义共享密钥。</p>
<p>psk 不需要证书认证，减少握手数据交互流程，但需要指定 psk_id 身份标识和指定加密套件。</p>
</li>
</ul>
<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></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>
<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><span class="lnt">332
</span><span class="lnt">333
</span><span class="lnt">334
</span><span class="lnt">335
</span><span class="lnt">336
</span><span class="lnt">337
</span><span class="lnt">338
</span><span class="lnt">339
</span><span class="lnt">340
</span><span class="lnt">341
</span><span class="lnt">342
</span><span class="lnt">343
</span><span class="lnt">344
</span><span class="lnt">345
</span><span class="lnt">346
</span><span class="lnt">347
</span><span class="lnt">348
</span><span class="lnt">349
</span><span class="lnt">350
</span><span class="lnt">351
</span><span class="lnt">352
</span><span class="lnt">353
</span><span class="lnt">354
</span><span class="lnt">355
</span><span class="lnt">356
</span><span class="lnt">357
</span><span class="lnt">358
</span><span class="lnt">359
</span><span class="lnt">360
</span><span class="lnt">361
</span><span class="lnt">362
</span><span class="lnt">363
</span><span class="lnt">364
</span><span class="lnt">365
</span><span class="lnt">366
</span><span class="lnt">367
</span><span class="lnt">368
</span><span class="lnt">369
</span><span class="lnt">370
</span><span class="lnt">371
</span><span class="lnt">372
</span><span class="lnt">373
</span><span class="lnt">374
</span><span class="lnt">375
</span><span class="lnt">376
</span><span class="lnt">377
</span><span class="lnt">378
</span><span class="lnt">379
</span><span class="lnt">380
</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">&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;dlg/dlg.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">&#34;mbedtls/net_sockets.h&#34;</span><span class="cp">
</span></span></span><span class="line"><span class="cl"><span class="cp">#include</span> <span class="cpf">&#34;mbedtls/ssl.h&#34;</span><span class="cp">
</span></span></span><span class="line"><span class="cl"><span class="cp">#include</span> <span class="cpf">&#34;mbedtls/ctr_drbg.h&#34;</span><span class="cp">
</span></span></span><span class="line"><span class="cl"><span class="cp">#include</span> <span class="cpf">&#34;mbedtls/debug.h&#34;</span><span class="cp">
</span></span></span><span class="line"><span class="cl"><span class="cp">#include</span> <span class="cpf">&#34;mbedtls/platform.h&#34;</span><span class="cp">
</span></span></span><span class="line"><span class="cl"><span class="cp">#include</span> <span class="cpf">&#34;mbedtls/timing.h&#34;</span><span class="cp">
</span></span></span><span class="line"><span class="cl"><span class="cp">#include</span> <span class="cpf">&#34;mbedtls/entropy.h&#34;</span><span class="cp">
</span></span></span><span class="line"><span class="cl"><span class="cp">#include</span> <span class="cpf">&#34;mbedtls/error.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="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">mbedtls_net_context</span>      <span class="n">socket_fd</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">    <span class="n">mbedtls_entropy_context</span>  <span class="n">entropy</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">    <span class="n">mbedtls_ctr_drbg_context</span> <span class="n">ctr_drbg</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">    <span class="n">mbedtls_ssl_context</span>      <span class="n">ssl</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">    <span class="n">mbedtls_ssl_config</span>       <span class="n">ssl_conf</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">    <span class="n">mbedtls_x509_crt</span>         <span class="n">ca_cert</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">    <span class="n">mbedtls_x509_crt</span>         <span class="n">client_cert</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">    <span class="n">mbedtls_pk_context</span>       <span class="n">private_key</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="cp">#if defined(MBEDTLS_DEBUG_C)
</span></span></span><span class="line"><span class="cl"><span class="cp"></span><span class="k">static</span> <span class="kt">void</span> <span class="nf">_ssl_debug</span><span class="p">(</span><span class="kt">void</span> <span class="o">*</span><span class="n">ctx</span><span class="p">,</span> <span class="kt">int</span> <span class="n">level</span><span class="p">,</span> <span class="k">const</span> <span class="kt">char</span> <span class="o">*</span><span class="n">file</span><span class="p">,</span> <span class="kt">int</span> <span class="n">line</span><span class="p">,</span> <span class="k">const</span> <span class="kt">char</span> <span class="o">*</span><span class="n">str</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">printf</span><span class="p">(</span><span class="s">&#34;[mbedTLS]:[%s]:[%d]: %s</span><span class="se">\r\n</span><span class="s">&#34;</span><span class="p">,</span> <span class="p">(</span><span class="n">file</span><span class="p">),</span> <span class="n">line</span><span class="p">,</span> <span class="p">(</span><span class="n">str</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="cp">#endif
</span></span></span><span class="line"><span class="cl"><span class="cp"></span>
</span></span><span class="line"><span class="cl"><span class="k">static</span> <span class="kt">int</span> <span class="nf">_mbedtls_tcp_connect</span><span class="p">(</span><span class="n">mbedtls_net_context</span> <span class="o">*</span><span class="n">ctx</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></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">char</span> <span class="n">port_str</span><span class="p">[</span><span class="mi">6</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></span><span class="line"><span class="cl">    <span class="nf">snprintf</span><span class="p">(</span><span class="n">port_str</span><span class="p">,</span> <span class="k">sizeof</span><span class="p">(</span><span class="n">port_str</span><span class="p">),</span> <span class="s">&#34;%d&#34;</span><span class="p">,</span> <span class="n">port</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">mbedtls_net_connect</span><span class="p">(</span><span class="n">ctx</span><span class="p">,</span> <span class="n">host</span><span class="p">,</span> <span class="n">port_str</span><span class="p">,</span> <span class="n">MBEDTLS_NET_PROTO_TCP</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;mbedtls_net_connect connect failed returned 0x%04x errno: %d&#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 class="n">errno</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><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">mbedtls_net_set_block</span><span class="p">(</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="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;mbedtls_net_set_block failed returned 0x%04x errno: %d&#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 class="n">errno</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 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="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="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">mbedtls_net_init</span><span class="p">(</span><span class="o">&amp;</span><span class="p">(</span><span class="n">handle</span><span class="o">-&gt;</span><span class="n">socket_fd</span><span class="p">));</span>
</span></span><span class="line"><span class="cl">    <span class="nf">mbedtls_ssl_init</span><span class="p">(</span><span class="o">&amp;</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">mbedtls_ssl_config_init</span><span class="p">(</span><span class="o">&amp;</span><span class="p">(</span><span class="n">handle</span><span class="o">-&gt;</span><span class="n">ssl_conf</span><span class="p">));</span>
</span></span><span class="line"><span class="cl">    <span class="nf">mbedtls_ctr_drbg_init</span><span class="p">(</span><span class="o">&amp;</span><span class="p">(</span><span class="n">handle</span><span class="o">-&gt;</span><span class="n">ctr_drbg</span><span class="p">));</span>
</span></span><span class="line"><span class="cl">    
</span></span><span class="line"><span class="cl">    <span class="nf">mbedtls_entropy_init</span><span class="p">(</span><span class="o">&amp;</span><span class="p">(</span><span class="n">handle</span><span class="o">-&gt;</span><span class="n">entropy</span><span class="p">));</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="cp">#if defined(MBEDTLS_DEBUG_C)
</span></span></span><span class="line"><span class="cl"><span class="cp"></span>    <span class="nf">mbedtls_debug_set_threshold</span><span class="p">(</span><span class="n">param</span><span class="o">-&gt;</span><span class="n">debug_level</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">    <span class="nf">mbedtls_ssl_conf_dbg</span><span class="p">(</span><span class="o">&amp;</span><span class="n">handle</span><span class="o">-&gt;</span><span class="n">ssl_conf</span><span class="p">,</span> <span class="n">_ssl_debug</span><span class="p">,</span> <span class="nb">NULL</span><span class="p">);</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"></span>
</span></span><span class="line"><span class="cl"><span class="cp">#if defined(MBEDTLS_USE_PSA_CRYPTO) || defined(MBEDTLS_SSL_PROTO_TLS1_3)
</span></span></span><span class="line"><span class="cl"><span class="cp"></span>    <span class="c1">// tls 1.3 需要调用 psa_crypto_init
</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">psa_crypto_init</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">PSA_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;psa_crypto_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 class="cp">#endif
</span></span></span><span class="line"><span class="cl"><span class="cp"></span>
</span></span><span class="line"><span class="cl">    <span class="n">ret</span> <span class="o">=</span> <span class="nf">mbedtls_ssl_conf_max_frag_len</span><span class="p">(</span><span class="o">&amp;</span><span class="p">(</span><span class="n">handle</span><span class="o">-&gt;</span><span class="n">ssl_conf</span><span class="p">),</span> <span class="n">param</span><span class="o">-&gt;</span><span class="n">max_frag_len</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;mbedtls_ssl_conf_max_frag_len 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></span><span class="line"><span class="cl">    <span class="n">ret</span> <span class="o">=</span> <span class="nf">mbedtls_ctr_drbg_seed</span><span class="p">(</span><span class="o">&amp;</span><span class="p">(</span><span class="n">handle</span><span class="o">-&gt;</span><span class="n">ctr_drbg</span><span class="p">),</span> <span class="n">mbedtls_entropy_func</span><span class="p">,</span> <span class="o">&amp;</span><span class="p">(</span><span class="n">handle</span><span class="o">-&gt;</span><span class="n">entropy</span><span class="p">),</span> <span class="nb">NULL</span><span class="p">,</span> <span class="mi">0</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;mbedtls_ctr_drbg_seed 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="c1">// 证书认证方式
</span></span></span><span class="line"><span class="cl"><span class="c1"></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_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="nf">mbedtls_x509_crt_init</span><span class="p">(</span><span class="o">&amp;</span><span class="p">(</span><span class="n">handle</span><span class="o">-&gt;</span><span class="n">ca_cert</span><span class="p">));</span>
</span></span><span class="line"><span class="cl">            <span class="n">ret</span> <span class="o">=</span> <span class="nf">mbedtls_x509_crt_parse</span><span class="p">(</span><span class="o">&amp;</span><span class="p">(</span><span class="n">handle</span><span class="o">-&gt;</span><span class="n">ca_cert</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="o">+</span><span class="mi">1</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;mbedtls_x509_crt_parse 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="nf">mbedtls_ssl_conf_ca_chain</span><span class="p">(</span><span class="o">&amp;</span><span class="p">(</span><span class="n">handle</span><span class="o">-&gt;</span><span class="n">ssl_conf</span><span class="p">),</span> <span class="o">&amp;</span><span class="p">(</span><span class="n">handle</span><span class="o">-&gt;</span><span class="n">ca_cert</span><span class="p">),</span> <span class="nb">NULL</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">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="c1">// 双向认证
</span></span></span><span class="line"><span class="cl"><span class="c1"></span>            <span class="nf">mbedtls_x509_crt_init</span><span class="p">(</span><span class="o">&amp;</span><span class="p">(</span><span class="n">handle</span><span class="o">-&gt;</span><span class="n">client_cert</span><span class="p">));</span>
</span></span><span class="line"><span class="cl">            <span class="nf">mbedtls_pk_init</span><span class="p">(</span><span class="o">&amp;</span><span class="p">(</span><span class="n">handle</span><span class="o">-&gt;</span><span class="n">private_key</span><span class="p">));</span>
</span></span><span class="line"><span class="cl">            <span class="n">ret</span> <span class="o">=</span> <span class="nf">mbedtls_x509_crt_parse</span><span class="p">(</span><span class="o">&amp;</span><span class="p">(</span><span class="n">handle</span><span class="o">-&gt;</span><span class="n">client_cert</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="o">+</span> <span class="mi">1</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;mbedtls_x509_crt_parse 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">mbedtls_pk_parse_key</span><span class="p">(</span><span class="o">&amp;</span><span class="p">(</span><span class="n">handle</span><span class="o">-&gt;</span><span class="n">private_key</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></span><span class="line"><span class="cl">                                       <span class="n">param</span><span class="o">-&gt;</span><span class="n">client_key_len</span> <span class="o">+</span> <span class="mi">1</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_passwd</span><span class="p">,</span> <span class="n">param</span><span class="o">-&gt;</span><span class="n">client_key_passwd_len</span> <span class="o">+</span> <span class="mi">1</span><span class="p">,</span> <span class="nb">NULL</span><span class="p">,</span> <span class="nb">NULL</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;mbedtls_pk_parse_key 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="n">ret</span> <span class="o">=</span> <span class="nf">mbedtls_ssl_conf_own_cert</span><span class="p">(</span><span class="o">&amp;</span><span class="p">(</span><span class="n">handle</span><span class="o">-&gt;</span><span class="n">ssl_conf</span><span class="p">),</span> <span class="o">&amp;</span><span class="p">(</span><span class="n">handle</span><span class="o">-&gt;</span><span class="n">client_cert</span><span class="p">),</span> <span class="o">&amp;</span><span class="p">(</span><span class="n">handle</span><span class="o">-&gt;</span><span class="n">private_key</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;mbedtls_ssl_conf_own_cert 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="c1">// psk 认证
</span></span></span><span class="line"><span class="cl"><span class="c1"></span>    <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 class="k">if</span><span class="p">(</span><span class="n">param</span><span class="o">-&gt;</span><span class="n">psk</span> <span class="o">&amp;&amp;</span> <span class="n">param</span><span class="o">-&gt;</span><span class="n">psk_len</span> <span class="o">&amp;&amp;</span> <span class="n">param</span><span class="o">-&gt;</span><span class="n">psk_id</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">mbedtls_ssl_conf_psk</span><span class="p">(</span><span class="o">&amp;</span><span class="p">(</span><span class="n">handle</span><span class="o">-&gt;</span><span class="n">ssl_conf</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">psk</span><span class="p">,</span> <span class="n">param</span><span class="o">-&gt;</span><span class="n">psk_len</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">                                       <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">psk_id</span><span class="p">,</span> <span class="nf">strlen</span><span class="p">(</span><span class="n">param</span><span class="o">-&gt;</span><span class="n">psk_id</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;mbedtls_ssl_conf_psk 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="nf">dlg_error</span><span class="p">(</span><span class="s">&#34;invalid psk&#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="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 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">mbedtls_net_free</span><span class="p">(</span><span class="o">&amp;</span><span class="p">(</span><span class="n">handle</span><span class="o">-&gt;</span><span class="n">socket_fd</span><span class="p">));</span>
</span></span><span class="line"><span class="cl">    <span class="nf">mbedtls_ssl_free</span><span class="p">(</span><span class="o">&amp;</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">mbedtls_ssl_config_free</span><span class="p">(</span><span class="o">&amp;</span><span class="p">(</span><span class="n">handle</span><span class="o">-&gt;</span><span class="n">ssl_conf</span><span class="p">));</span>
</span></span><span class="line"><span class="cl">    <span class="nf">mbedtls_ctr_drbg_free</span><span class="p">(</span><span class="o">&amp;</span><span class="p">(</span><span class="n">handle</span><span class="o">-&gt;</span><span class="n">ctr_drbg</span><span class="p">));</span>
</span></span><span class="line"><span class="cl">    <span class="nf">mbedtls_entropy_free</span><span class="p">(</span><span class="o">&amp;</span><span class="p">(</span><span class="n">handle</span><span class="o">-&gt;</span><span class="n">entropy</span><span class="p">));</span>
</span></span><span class="line"><span class="cl">    <span class="nf">mbedtls_x509_crt_free</span><span class="p">(</span><span class="o">&amp;</span><span class="p">(</span><span class="n">handle</span><span class="o">-&gt;</span><span class="n">ca_cert</span><span class="p">));</span>
</span></span><span class="line"><span class="cl">    <span class="nf">mbedtls_x509_crt_free</span><span class="p">(</span><span class="o">&amp;</span><span class="p">(</span><span class="n">handle</span><span class="o">-&gt;</span><span class="n">client_cert</span><span class="p">));</span>
</span></span><span class="line"><span class="cl">    <span class="nf">mbedtls_pk_free</span><span class="p">(</span><span class="o">&amp;</span><span class="p">(</span><span class="n">handle</span><span class="o">-&gt;</span><span class="n">private_key</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="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="c1">// 配置 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">_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">ret</span> <span class="o">=</span> <span class="nf">_mbedtls_tcp_connect</span><span class="p">(</span><span class="o">&amp;</span><span class="p">(</span><span class="n">handle</span><span class="o">-&gt;</span><span class="n">socket_fd</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">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;mbedtls_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></span><span class="line"><span class="cl">    <span class="c1">// 设置 tls 客户端
</span></span></span><span class="line"><span class="cl"><span class="c1"></span>    <span class="nf">mbedtls_ssl_config_defaults</span><span class="p">(</span><span class="o">&amp;</span><span class="p">(</span><span class="n">handle</span><span class="o">-&gt;</span><span class="n">ssl_conf</span><span class="p">),</span> <span class="n">MBEDTLS_SSL_IS_CLIENT</span><span class="p">,</span> <span class="n">MBEDTLS_SSL_TRANSPORT_STREAM</span><span class="p">,</span> <span class="n">MBEDTLS_SSL_PRESET_DEFAULT</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">    <span class="nf">mbedtls_ssl_conf_read_timeout</span><span class="p">(</span><span class="o">&amp;</span><span class="p">(</span><span class="n">handle</span><span class="o">-&gt;</span><span class="n">ssl_conf</span><span class="p">),</span> <span class="n">param</span><span class="o">-&gt;</span><span class="n">hanshake_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="c1">// 配置认证等级
</span></span></span><span class="line"><span class="cl"><span class="c1"></span>    <span class="nf">mbedtls_ssl_conf_authmode</span><span class="p">(</span><span class="o">&amp;</span><span class="p">(</span><span class="n">handle</span><span class="o">-&gt;</span><span class="n">ssl_conf</span><span class="p">),</span> <span class="n">param</span><span class="o">-&gt;</span><span class="n">verify_mode</span><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">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="nf">mbedtls_ssl_conf_max_tls_version</span><span class="p">(</span><span class="o">&amp;</span><span class="p">(</span><span class="n">handle</span><span class="o">-&gt;</span><span class="n">ssl_conf</span><span class="p">),</span> <span class="n">MBEDTLS_SSL_VERSION_TLS1_2</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">        <span class="nf">mbedtls_ssl_conf_min_tls_version</span><span class="p">(</span><span class="o">&amp;</span><span class="p">(</span><span class="n">handle</span><span class="o">-&gt;</span><span class="n">ssl_conf</span><span class="p">),</span> <span class="n">MBEDTLS_SSL_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="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="nf">mbedtls_ssl_conf_max_tls_version</span><span class="p">(</span><span class="o">&amp;</span><span class="p">(</span><span class="n">handle</span><span class="o">-&gt;</span><span class="n">ssl_conf</span><span class="p">),</span> <span class="n">MBEDTLS_SSL_VERSION_TLS1_3</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">        <span class="nf">mbedtls_ssl_conf_min_tls_version</span><span class="p">(</span><span class="o">&amp;</span><span class="p">(</span><span class="n">handle</span><span class="o">-&gt;</span><span class="n">ssl_conf</span><span class="p">),</span> <span class="n">MBEDTLS_SSL_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="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">mbedtls_ssl_conf_max_tls_version</span><span class="p">(</span><span class="o">&amp;</span><span class="p">(</span><span class="n">handle</span><span class="o">-&gt;</span><span class="n">ssl_conf</span><span class="p">),</span> <span class="n">MBEDTLS_SSL_VERSION_TLS1_3</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">        <span class="nf">mbedtls_ssl_conf_min_tls_version</span><span class="p">(</span><span class="o">&amp;</span><span class="p">(</span><span class="n">handle</span><span class="o">-&gt;</span><span class="n">ssl_conf</span><span class="p">),</span> <span class="n">MBEDTLS_SSL_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></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">    <span class="nf">mbedtls_ssl_conf_rng</span><span class="p">(</span><span class="o">&amp;</span><span class="p">(</span><span class="n">handle</span><span class="o">-&gt;</span><span class="n">ssl_conf</span><span class="p">),</span> <span class="n">mbedtls_ctr_drbg_random</span><span class="p">,</span> <span class="o">&amp;</span><span class="p">(</span><span class="n">handle</span><span class="o">-&gt;</span><span class="n">ctr_drbg</span><span class="p">));</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">    <span class="c1">// todo: config ciphersuites
</span></span></span><span class="line"><span class="cl"><span class="c1"></span>
</span></span><span class="line"><span class="cl">    <span class="n">ret</span> <span class="o">=</span> <span class="nf">mbedtls_ssl_setup</span><span class="p">(</span><span class="o">&amp;</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="o">&amp;</span><span class="p">(</span><span class="n">handle</span><span class="o">-&gt;</span><span class="n">ssl_conf</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;mbedtls_ssl_setup 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="c1">// 配置 tcp 收发函数，可自定义也可使用 mbedtls 的实现
</span></span></span><span class="line"><span class="cl"><span class="c1"></span>    <span class="nf">mbedtls_ssl_set_bio</span><span class="p">(</span><span class="o">&amp;</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="o">&amp;</span><span class="p">(</span><span class="n">handle</span><span class="o">-&gt;</span><span class="n">socket_fd</span><span class="p">),</span> <span class="n">mbedtls_net_send</span><span class="p">,</span> <span class="n">mbedtls_net_recv</span><span class="p">,</span> <span class="n">mbedtls_net_recv_timeout</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">	
</span></span><span class="line"><span class="cl">    <span class="c1">// 设置服务器域名，目的是配置 SNI （Server Name Indication） 扩展。
</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">mbedtls_ssl_set_hostname</span><span class="p">(</span><span class="o">&amp;</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">host</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;mbedtls_ssl_set_hostname 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="c1">// 执行握手流程
</span></span></span><span class="line"><span class="cl"><span class="c1"></span>    <span class="k">while</span> <span class="p">((</span><span class="n">ret</span> <span class="o">=</span> <span class="nf">mbedtls_ssl_handshake</span><span class="p">(</span><span class="o">&amp;</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="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">if</span> <span class="p">(</span><span class="n">ret</span> <span class="o">!=</span> <span class="n">MBEDTLS_ERR_SSL_WANT_READ</span> <span class="o">&amp;&amp;</span> <span class="n">ret</span> <span class="o">!=</span> <span class="n">MBEDTLS_ERR_SSL_WANT_WRITE</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;mbedtls_ssl_handshake 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">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></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">ret</span> <span class="o">=</span> <span class="nf">mbedtls_ssl_get_verify_result</span><span class="p">(</span><span class="o">&amp;</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">&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;mbedtls_ssl_get_verify_result  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">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="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></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 class="c1">// 发送数据
</span></span></span><span class="line"><span class="cl"><span class="c1"></span>    <span class="k">while</span> <span class="p">((</span><span class="n">ret</span> <span class="o">=</span> <span class="nf">mbedtls_ssl_write</span><span class="p">(</span><span class="o">&amp;</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="p">,</span> <span class="n">len</span><span class="p">))</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="k">if</span> <span class="p">(</span><span class="n">ret</span> <span class="o">!=</span> <span class="n">MBEDTLS_ERR_SSL_WANT_READ</span> <span class="o">&amp;&amp;</span> <span class="n">ret</span> <span class="o">!=</span> <span class="n">MBEDTLS_ERR_SSL_WANT_WRITE</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;mbedtls_ssl_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">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="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="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></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 class="c1">// 接收数据
</span></span></span><span class="line"><span class="cl"><span class="c1"></span>    <span class="k">while</span> <span class="p">((</span><span class="n">ret</span> <span class="o">=</span> <span class="nf">mbedtls_ssl_read</span><span class="p">(</span><span class="o">&amp;</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="p">,</span> <span class="n">len</span><span class="p">))</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="k">if</span> <span class="p">(</span><span class="n">ret</span> <span class="o">!=</span> <span class="n">MBEDTLS_ERR_SSL_WANT_READ</span> <span class="o">&amp;&amp;</span> <span class="n">ret</span> <span class="o">!=</span> <span class="n">MBEDTLS_ERR_SSL_WANT_WRITE</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;mbedtls_ssl_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">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="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="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></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="c1">// 关闭连接，释放资源
</span></span></span><span class="line"><span class="cl"><span class="c1"></span>    <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">mbedtls_ssl_close_notify</span><span class="p">(</span><span class="o">&amp;</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></span><span class="line"><span class="cl">    <span class="p">}</span> <span class="k">while</span> <span class="p">(</span><span class="n">ret</span> <span class="o">==</span> <span class="n">MBEDTLS_ERR_SSL_WANT_READ</span> <span class="o">||</span> <span class="n">ret</span> <span class="o">==</span> <span class="n">MBEDTLS_ERR_SSL_WANT_WRITE</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">
</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="mi">0</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>测试代码，连接 https 测试服务器 httpbin.org，发送一个 get 请求，并接收服务器回复。</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></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="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></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:250 qtf_tls_connect<span class="o">]</span> Connecting to httpbin.org:443...
</span></span><span class="line"><span class="cl"><span class="o">[</span>mbedTLS<span class="o">]</span>:<span class="o">[</span>D:/workspace/QT/qt_idf/components/mbedtls/library/ssl_client.c<span class="o">]</span>:<span class="o">[</span>258<span class="o">]</span>: got supported group<span class="o">(</span>001d<span class="o">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="o">[</span>mbedTLS<span class="o">]</span>:<span class="o">[</span>D:/workspace/QT/qt_idf/components/mbedtls/library/ssl_client.c<span class="o">]</span>:<span class="o">[</span>258<span class="o">]</span>: got supported group<span class="o">(</span>0017<span class="o">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="o">[</span>mbedTLS<span class="o">]</span>:<span class="o">[</span>D:/workspace/QT/qt_idf/components/mbedtls/library/ssl_client.c<span class="o">]</span>:<span class="o">[</span>258<span class="o">]</span>: got supported group<span class="o">(</span>0018<span class="o">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="o">[</span>mbedTLS<span class="o">]</span>:<span class="o">[</span>D:/workspace/QT/qt_idf/components/mbedtls/library/ssl_client.c<span class="o">]</span>:<span class="o">[</span>258<span class="o">]</span>: got supported group<span class="o">(</span>001e<span class="o">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="o">[</span>mbedTLS<span class="o">]</span>:<span class="o">[</span>D:/workspace/QT/qt_idf/components/mbedtls/library/ssl_client.c<span class="o">]</span>:<span class="o">[</span>258<span class="o">]</span>: got supported group<span class="o">(</span>0019<span class="o">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="o">[</span>mbedTLS<span class="o">]</span>:<span class="o">[</span>D:/workspace/QT/qt_idf/components/mbedtls/library/ssl_client.c<span class="o">]</span>:<span class="o">[</span>258<span class="o">]</span>: got supported group<span class="o">(</span>001a<span class="o">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="o">[</span>mbedTLS<span class="o">]</span>:<span class="o">[</span>D:/workspace/QT/qt_idf/components/mbedtls/library/ssl_client.c<span class="o">]</span>:<span class="o">[</span>258<span class="o">]</span>: got supported group<span class="o">(</span>001b<span class="o">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="o">[</span>mbedTLS<span class="o">]</span>:<span class="o">[</span>D:/workspace/QT/qt_idf/components/mbedtls/library/ssl_client.c<span class="o">]</span>:<span class="o">[</span>258<span class="o">]</span>: got supported group<span class="o">(</span>001c<span class="o">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="o">[</span>mbedTLS<span class="o">]</span>:<span class="o">[</span>D:/workspace/QT/qt_idf/components/mbedtls/library/ssl_tls.c<span class="o">]</span>:<span class="o">[</span>7384<span class="o">]</span>: x509_verify_cert<span class="o">()</span> returned -9984 <span class="o">(</span>-0x2700<span class="o">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="o">[</span>mbedTLS<span class="o">]</span>:<span class="o">[</span>D:/workspace/QT/qt_idf/components/mbedtls/library/ssl_tls12_client.c<span class="o">]</span>:<span class="o">[</span>2762<span class="o">]</span>: Perform PSA-based ECDH computation.
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">tls connect success
</span></span><span class="line"><span class="cl">tls send success
</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">02</span> Jul <span class="m">2023</span> 12:02:04 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">220</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-64a1673a-5197ca4a2ff801443ac81bc6&#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.183&#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></code></pre></td></tr></table>
</div>
</div><h2 id="参考文档">参考文档</h2>
<ul>
<li><a href="https://mbed-tls.readthedocs.io/en/latest/kb/how-to/use-sni/">https://mbed-tls.readthedocs.io/en/latest/kb/how-to/use-sni/</a></li>
<li><a href="https://github.com/Mbed-TLS/mbedtls/issues/6254">Wrong macros in mps_common.h https://github.com/Mbed-TLS/mbedtls/issues/6254</a></li>
<li><a href="https://github.com/Mbed-TLS/mbedtls/blob/development/tests/configs/tls13-only.h">https://github.com/Mbed-TLS/mbedtls/blob/development/tests/configs/tls13-only.h</a></li>
</ul>
]]></content:encoded>
    </item>
  </channel>
</rss>
