Kaynağa Gözat

更新文档,调整软件包结构

Signed-off-by: MurphyZhao <d2014zjt@163.com>
MurphyZhao 7 yıl önce
ebeveyn
işleme
7996778c04

+ 99 - 60
README.md

@@ -2,100 +2,139 @@
 
 ## 1、介绍 
 
-mbedTLS(前称PolarSSL)是一个ARM公司授权的开源的SSL库,主要是用于嵌入式产品中的加密和SSL/TLS功能。    
-这个 [mbedtls](https://github.com/RT-Thread-packages/mbedtls) 库是RT-thread针对[ARMmbed/mbedtls](https://github.com/ARMmbed/mbedtls/)库的移植, 有关mbedTLS的更多信息,请参阅[https://tls.mbed.org](https://tls.mbed.org) 。
+**mbedTLS**(前身 PolarSSL)是一个由 ARM 公司开源和维护的 SSL/TLS 算法库。其使用 C 编程语言以最小的编码占用空间实现了 SSL/TLS 功能及各种加密算法,易于理解、使用、集成和扩展,方便开发人员轻松地在嵌入式产品中使用 SSL/TLS 功能。
 
-## 2、获取方式   
+该 [mbedtls](https://github.com/RT-Thread-packages/mbedtls) 软件包是 **RT-Thread** 基于 [ARMmbed/mbedtls](https://github.com/ARMmbed/mbedtls/) 开源库的移植,有关 mbedTLS 的更多信息,请参阅 [https://tls.mbed.org](https://tls.mbed.org) 。
 
--  Git方式获取:
-`git clone https://github.com/RT-Thread-packages/mbedtls`
+### 1.1 目录结构
 
-- env工具辅助下载:
-  menuconfig package path:`RT-Thread online packages/security/mbedtls`
+| 名称            | 说明 |
+| ----            | ---- |
+| docs            | 文档目录 |
+| mbedtls         | ARM mbedtls 源码 |
+| ports           | 移植文件目录 |
+| samples         | 示例文件目录 |
+| LICENSE         | 许可证文件 |
+| README.md       | 软件包使用说明 |
+| SConscript      | RT-Thread 默认的构建脚本 |
 
-## 3、示例介绍
+### 1.2 许可证
 
-### 3.1 获取示例
+Apache License Version 2.0 协议许可。
 
-menuconfig path:`RT-Thread online packages/security/mbedtls/Enable a client example`   
-配置获取示例选项,配置包版本选为最新版`latest_version`,示例代码位置`examples/tls_app_test.c`
+## 2、如何使用
 
+示例程序 `samples/tls_app_test.c`。
+
+### 2.1 启用软件包
+
+- 配置软件包并使能示例
+
+```shell
+RT-Thread online packages --->
+    security packages  --->
+        [*] mbedtls: An portable and flexible SSL/TLS library  ---
+        [*]   Store the AES tables in ROM
+        (2)   Maximum window size used
+        (3584) Maxium fragment length in bytes
+        [*]   Enable a mbedtls client example
+              version (latest)  --->
 ```
-  RT-Thread online packages --->
-      security packages  --->
-          [*] mbedtls:An open source, portable, easy to use, readable and flexible SSL library  ---
-          [*]   Store the AES tables in ROM
-          (2)   Maximum window size used
-          (3584) Maxium fragment length in bytes
-          [ ]   Enable a mbedtls client example
-                version (latest)  --->
-```
 
-### 3.2 运行示例   
-该示例为一个简单的TLS client,与外网建立TLS连接并传输数据。   
-主要流程:client连接外网TLS测试网站`www.howsmyssl.com`-->client和server握手成功-->client发送请求-->server回应请求-->TLS测试成功。   
-使用方式:msh cmd `tls_test`,finsh cmd `tls_test()`
+- 使用 `pkgs --update` 命令下载软件包
+
+### 2.2 运行示例
 
-    msh />tls_test   
-    mbedtls client struct init success...   
-    Loading the CA root certificate success...   
-    mbedtls client context init success...   
-    Connected www.howsmyssl.com:443 success...   
-    Certificate verified success...   
-    Writing HTTP request success...   
-    Getting HTTP response...   
-    (get response data)....   
+该示例程序提供了一个简单的 TLS client,与支持安全连接的网站建立 TLS 连接并获取加密数据。
 
+主要流程:
 
-## 4、常见问题
+- client连接外网 TLS 测试网站 `www.howsmyssl.com`
+- client 和 server 握手成功
+- client 发送请求
+- server 回应请求
+- TLS 测试成功
 
-### 4.1 证书验证失败  
+在 MSH 中使用命令 **`tls_test`** 执行示例程序,如下所示:
+
+```shell
+msh />tls_test
+mbedtls client struct init success...
+Loading the CA root certificate success...
+mbedtls client context init success...
+Connected www.howsmyssl.com:443 success...
+Certificate verified success...
+Writing HTTP request success...
+Getting HTTP response...
+(get response data)....
+```
+
+## 3、常见问题
+
+### 3.1 证书验证失败  
 
     [tls]verification info: ! The CRL is not correctly signed by the trusted CA
 
-原因:mbedtls包中支持多种主流CA机构根证书,部分CA机构未支持   
-解决方法:若测试其他TLS网站证书验证失败,手动获取测试网站根证书(Root Cerificate)添加到`mbedtls/tls_cerificate.c`文件中
+- 原因
+
+    mbedtls包中支持多种主流CA机构根证书,部分CA机构未支持   
 
-### 4.2 证书时间错误:
+- 解决方法
+
+    若测试其他TLS网站证书验证失败,手动获取测试网站根证书(Root Cerificate)添加到`mbedtls/tls_cerificate.c`文件中
+
+### 3.2 证书时间错误
 
     verification info: ! The certificate validity has expired
     verification info: ! The certificate validity starts in the future
 
-原因:TLS握手是证书验证需要时间的验证,本地时间获取有误导致   
-解决方式:检查RTC设备是否支持,检查`RT_USING_RTC`宏是否打开,校准设备时间
+- 原因
+
+    TLS握手是证书验证需要时间的验证,本地时间获取有误导致   
+
+- 解决方式
+
+    检查RTC设备是否支持,检查`RT_USING_RTC`宏是否打开,校准设备时间
 
-### 4.3 证书CN错误:
+### 3.3 证书 CN 错误
 
     verification info: ! The certificate Common Name (CN) does not match with the expected CN
 
-原因:测试其他TLS网站时,若输入域名不符合证书的Common Name(CN)出现CN验证失败问题   
-解决方法:检查输入域名和证书中CN是否匹配或输入IP地址
+- 原因
 
-### 4.4 IAR编译错误
+    测试其他TLS网站时,若输入域名不符合证书的Common Name(CN)出现CN验证失败问题   
 
-    Fatal Error "MBEDTLS_CONFIG_FILE" expected a file name 
+- 解决方法
 
-原因:SConscript中预定义语法IAR编辑器不支持  
-解决方法:拷贝`mbedtls-port/inc/tls_config.h`内容到`mbedtls/include/mbedtls/config.h`中
+    检查输入域名和证书中CN是否匹配或输入IP地址
 
-### 4.5 0x7200 错误
+### 3.4 0x7200 错误
 
-原因: 部分原因是因为 mbedTls 收到了大于缓冲区大小的数据包  
-解决方法: `menuconfig` 配置增加数据帧大小 (`Maxium fragment length in bytes`)
+- 原因
+
+    部分原因是因为 mbedTls 收到了大于缓冲区大小的数据包  
+
+- 解决方法
+
+    `menuconfig` 配置增加数据帧大小 ( `Maxium fragment length in bytes` )
 
 ```
-  RT-Thread online packages --->
-      security packages  --->
-          [*] mbedtls:An open source, portable, easy to use, readable and flexible SSL library  ---
-          [*]   Store the AES tables in ROM
-          (2)   Maximum window size used
-          (6144) Maxium fragment length in bytes
-          [ ]   Enable a mbedtls client example
-                version (latest)  --->
+RT-Thread online packages --->
+    security packages  --->
+        [*] mbedtls: An portable and flexible SSL/TLS library  ---
+        [*]   Store the AES tables in ROM
+        (2)   Maximum window size used
+        (6144) Maxium fragment length in bytes
+        [*]   Enable a mbedtls client example
+              version (latest)  --->
 ```
 
-## 5、参考资料
+## 4、参考资料
 
 - mbedTLS官方网站:https://tls.mbed.org/
-- ARMmbed github:[mbedtls](https://github.com/ARMmbed/mbedtls/tree/72ea31b026e1fc61b01662474aa5125817b968bc)
+- ARMmbed GitHub:[mbedtls](https://github.com/ARMmbed/mbedtls/tree/72ea31b026e1fc61b01662474aa5125817b968bc)
+
+## 5、 联系方式 & 感谢
 
+- 维护: chenyong
+- 主页: https://github.com/RT-Thread-packages/mbedtls

+ 3 - 3
SConscript

@@ -6,7 +6,7 @@ cwd = GetCurrentDir()
 src = Glob('mbedtls/library/*.c')
 SrcRemove(src, 'mbedtls/library/net_sockets.c')
 
-src += Glob('mbedtls-port/src/*.c')
+src += Glob('ports/src/*.c')
 
 if GetDepend(['PKG_USING_MBEDTLS_EXAMPLE']):
     src += Glob('examples/*.c')
@@ -14,14 +14,14 @@ if GetDepend(['PKG_USING_MBEDTLS_EXAMPLE']):
 CPPPATH = [
 cwd + '/mbedtls/include',
 cwd + '/mbedtls/include/mbedtls',
-cwd + '/mbedtls-port/inc',
+cwd + '/ports/inc',
 ]
 
 if rtconfig.CROSS_TOOL == 'gcc' :
     CPPDEFINES = ['MBEDTLS_CONFIG_FILE=\\"tls_config.h\\"']
 elif rtconfig.CROSS_TOOL == 'keil' or rtconfig.CROSS_TOOL == 'iar':
     import shutil
-    cp_src = cwd + '/mbedtls-port/inc/tls_config.h'
+    cp_src = cwd + '/ports/inc/tls_config.h'
     cp_dst = cwd + '/mbedtls/include/mbedtls/config.h'
     shutil.copyfile(cp_src, cp_dst)
     CPPDEFINES = []

+ 12 - 0
docs/README.md

@@ -0,0 +1,12 @@
+# 文档
+
+## 文档列表
+
+|文件名                             |描述|
+|:-----                             |:----|
+|[version.md](version.md)           |版本信息|
+|[introduction.md](introduction.md) |详细介绍|
+|[principle.md](principle.md)       |工作原理|
+|[user-guide.md](user-guide.md)     |使用指南|
+|[api.md](api.md)                   |API 说明|
+|[samples.md](samples.md)           |示例说明|

+ 452 - 0
docs/api.md

@@ -0,0 +1,452 @@
+
+# API 说明
+
+为了方便用户使用,这里列出了常用的 API,并给出了相关的使用说明。
+
+> 注:更多详细 API 内容请参阅 [**ARM mbedtls API 手册**](https://tls.mbed.org/api/)。
+
+## 应用层 API
+
+应用层 API 是提供给用户在 App 中直接使用的 API,这部分 API 屏蔽了 mbedtls 内部具体的操作步骤,简化了用户使用。
+
+### mbedtls 初始化
+
+> int mbedtls_client_init(MbedTLSSession *session, void *entropy, size_t entropyLen);
+
+mbedtls 客户端初始化函数,用于初始化底层网络接口、设置证书、设置 SSL 会话等。
+
+| 参数           | 描述    |
+| :-----         | :-----  |
+| session        | 入参,mbedtls 会话对象 MbedTLSSession |
+| entropy        | 入参,mbedtls 熵字符串 |
+| entropyLen     | 入参,mbedtls 熵字符串长度 |
+| **返回**       | **描述**  |
+| `= 0`          | 成功 |
+| !0             | 失败 |
+
+### 配置 mbedtls 上下文
+
+> int mbedtls_client_context(MbedTLSSession *session);
+
+SSL 层配置,应用程序使用 `mbedtls_client_context` 函数配置客户端上下文信息,包括证书解析、设置主机名、设置默认 SSL 配置、设置认证模式(默认 MBEDTLS_SSL_VERIFY_OPTIONAL)等。
+
+| 参数           | 描述    |
+| :-----         | :-----  |
+| session        | 入参,mbedtls 会话对象 MbedTLSSession |
+| **返回**       | **描述**  |
+| `= 0`          | 成功 |
+| !0             | 失败 |
+
+### 建立 SSL/TLS 连接
+
+> int mbedtls_client_connect(MbedTLSSession *session);
+
+使用 `mbedtls_client_connect` 函数为 SSL/TLS 连接建立通道。这里包含整个的握手连接过程,以及证书校验结果。
+
+| 参数           | 描述    |
+| :-----         | :-----  |
+| session        | 入参,mbedtls 会话对象 MbedTLSSession |
+| **返回**       | **描述**  |
+| `= 0`          | 成功 |
+| !0             | 失败 |
+
+### 读取数据
+
+- **向加密连接写入数据**
+
+> int mbedtls_client_write(MbedTLSSession *session, const unsigned char *buf , size_t len);
+
+| 参数           | 描述    |
+| :-----         | :-----  |
+| session        | 入参,mbedtls 会话对象 MbedTLSSession |
+| buf            | 入参,待写入的数据缓冲区 |
+| len            | 入参,待写入的数据长度 |
+| **返回**       | **描述**  |
+| `= 0`          | 成功 |
+| !0             | 失败 |
+
+- **从加密连接读取数据**
+
+> int mbedtls_client_read(MbedTLSSession *session, unsigned char *buf , size_t len);
+
+| 参数           | 描述    |
+| :-----         | :-----  |
+| session        | 入参,mbedtls 会话对象 MbedTLSSession |
+| buf            | 入参,mbedtls 读取内容的缓冲区 |
+| len            | 入参,mbedtls 待读取内容长度 |
+| **返回**       | **描述**  |
+| `= 0`          | 成功 |
+| !0             | 失败 |
+
+### 关闭 mbedtls 客户端
+
+> int mbedtls_client_close(MbedTLSSession *session);
+
+客户端主动关闭连接或者因为异常错误关闭连接,都需要使用 `mbedtls_client_close` 关闭连接并释放资源。
+
+| 参数           | 描述    |
+| :-----         | :-----  |
+| session        | 入参,mbedtls 会话对象 MbedTLSSession |
+| **返回**       | **描述**  |
+| `= 0`          | 成功 |
+| !0             | 失败 |
+
+## mbedtls 相关 API
+
+### 设置调试级别
+
+> void mbedtls_debug_set_threshold( int threshold );
+
+如果开启了 `MBEDTLS_DEBUG_C`,可以使用该函数设置调试级别,用于控制不同级别的调试日志输出。
+
+| 参数           | 描述    |
+| :-----         | :-----  |
+| threshold      | 入参,Debug 级别,默认为 0 没有调试日志 |
+| **返回**       | **描述**  |
+| 无             | 无 |
+
+mbedtls 定义了 5 种调试级别,如下所示:
+
+| 调试级别        | 描述    |
+| :-----         | :-----  |
+| 0              | No debug |
+| 1              | Error |
+| 2              | State change |
+| 3              | Informational |
+| 4              | Verbose |
+
+### 初始化阶段相关 API
+
+- **网络上下文初始化**
+
+> void mbedtls_net_init( mbedtls_net_context *ctx );
+
+初始化 TLS 网络上下文,目前只有 fd 描述符。
+
+| 参数           | 描述    |
+| :-----         | :-----  |
+| ctx            | 入参,网络上下文对象 |
+| **返回**       | **描述**  |
+| 无             | 无 |
+
+- **SSL 上下文初始化**
+
+> void mbedtls_ssl_init( mbedtls_ssl_context *ssl );
+
+SSL 上下文初始化,主要是清空 SSL 上下文对象,为 SSL 连接做准备。
+
+| 参数           | 描述    |
+| :-----         | :-----  |
+| ssl            | 入参,SSL 上下文对象 |
+| **返回**       | **描述**  |
+| 无             | 无 |
+
+- **初始化 SSL 配置**
+
+> void mbedtls_ssl_config_init( mbedtls_ssl_config *conf );
+
+SSL 配置初始化,主要是清空 SSL 配置结构体对象,为 SSL 连接做准备。
+
+| 参数           | 描述    |
+| :-----         | :-----  |
+| conf            | 入参,SSL 配置结构体对象 |
+| **返回**       | **描述**  |
+| 无             | 无 |
+
+- **初始化 SSL 随机字节发生器**
+
+> void mbedtls_ctr_drbg_init( mbedtls_ctr_drbg_context *ctx );
+
+清空 CTR_DRBG(SSL 随机字节发生器)上下文结构体对象,为 `mbedtls_ctr_drbg_seed` 做准备。
+
+| 参数           | 描述    |
+| :-----         | :-----  |
+| ctx            | 入参,CTR_DRBG 结构体对象 |
+| **返回**       | **描述**  |
+| 无             | 无 |
+
+- **初始化 SSL 熵**
+
+> void mbedtls_entropy_init( mbedtls_entropy_context *ctx );
+
+初始化 SSL 熵结构体对象。
+
+| 参数           | 描述    |
+| :-----         | :-----  |
+| ctx            | 入参,熵结构体对象 |
+| **返回**       | **描述**  |
+| 无             | 无 |
+
+- **设置 SSL/TLS 熵源**
+
+```c
+int mbedtls_ctr_drbg_seed( mbedtls_ctr_drbg_context *ctx,
+                   int (*f_entropy)(void *, unsigned char *, size_t),
+                   void *p_entropy,
+                   const unsigned char *custom,
+                   size_t len );
+```
+
+为 SSL/TLS 熵设置熵源,方便产生子种子。
+
+| 参数           | 描述    |
+| :-----         | :-----  |
+| ctx            | 入参,CTR_DRBG 结构体对象 |
+| f_entropy      | 入参,熵回调 |
+| p_entropy      | 入参,熵结构体(mbedtls_entropy_context)对象 |
+| custom         | 入参,个性化数据(设备特定标识符),可以为空 |
+| len            | 个性化数据长度 |
+| **返回**       | **描述**  |
+| 无             | 无 |
+
+- **设置根证书列表**
+
+> void mbedtls_x509_crt_init( mbedtls_x509_crt *crt );
+
+初始化根证书链表。
+
+| 参数           | 描述    |
+| :-----         | :-----  |
+| crt            | 入参,x509 证书结构体对象 |
+| **返回**       | **描述**  |
+| 无             | 无 |
+
+- **解析根证书**
+
+> int mbedtls_x509_crt_parse( mbedtls_x509_crt *chain, const unsigned char *buf, size_t buflen );
+
+解释性地解析。解析 buf 中一个或多个证书并将其添加到根证书链接列表中。如果可以解析某些证书,则结果是它遇到的失败证书的数量。 如果没有正确完成,则返回第一个错误。
+
+根证书位于 `ports/src/tls_certificate.c` 文件 `mbedtls_root_certificate` 数组中。
+
+| 参数           | 描述    |
+| :-----         | :-----  |
+| chain          | 入参,x509 证书结构体对象 |
+| buf            | 入参,存储根证书的 buffer,`mbedtls_root_certificate` 数组 |
+| buflen         | 入参,存储根证书的 buffer 大小 |
+| **返回**       | **描述** |
+| 无             | 无 |
+
+- **设置主机名**
+
+> int mbedtls_ssl_set_hostname( mbedtls_ssl_context *ssl, const char *hostname );
+
+注意,这里设置的 `hostname` 必须对应服务器证书中的 `common name`,即 CN 字段。
+
+- **加载默认的 SSL 配置**
+
+```c
+int mbedtls_ssl_config_defaults( mbedtls_ssl_config *conf,
+                                 int endpoint, int transport, int preset );
+```
+
+使用前,需要先调用 `mbedtls_ssl_config_init` 函数初始化 SSL 配置结构体对象。
+
+| 参数           | 描述    |
+| :-----         | :-----  |
+| conf           | 入参,SSL 配置结构体对象 |
+| endpoint       | 入参,MBEDTLS_SSL_IS_CLIENT 或者 MBEDTLS_SSL_IS_SERVER |
+| transport      | 入参,TLS: MBEDTLS_SSL_TRANSPORT_STREAM; DTLS: MBEDTLS_SSL_TRANSPORT_DATAGRAM |
+| preset         | 入参, 预定义的 MBEDTLS_SSL_PRESET_XXX 类型值,默认使用 MBEDTLS_SSL_PRESET_DEFAULT |
+| **返回**       | **描述** |
+| 无             | 无 |
+
+- **设置证书验证模式**
+> void mbedtls_ssl_conf_authmode( mbedtls_ssl_config *conf, int authmode );
+
+设置证书验证模式默认值:服务器上为 `MBEDTLS_SSL_VERIFY_NONE`,客户端上为 `MBEDTLS_SSL_VERIFY_REQUIRED` 或者 `MBEDTLS_SSL_VERIFY_OPTIONAL`(默认使用)。
+
+`MBEDTLS_SSL_VERIFY_OPTIONAL` 表示证书验证失败也可以继续通讯。
+
+| 参数           | 描述    |
+| :-----         | :-----  |
+| conf           | 入参,SSL 配置结构体对象 |
+| authmode       | 入参,证书验证模式 |
+| **返回**       | **描述** |
+| 无             | 无 |
+
+- **设置验证对等证书所需的数据**
+
+```c
+void mbedtls_ssl_conf_ca_chain( mbedtls_ssl_config *conf,
+                                mbedtls_x509_crt *ca_chain,
+                                mbedtls_x509_crl *ca_crl );
+```
+
+将受信的证书链配置到 SSL 配置结构体对象中。
+
+| 参数           | 描述    |
+| :-----         | :-----  |
+| conf           | 入参,SSL 配置结构体对象 |
+| ca_chain       | 入参,受信的 CA 证书链,存储在 MbedTLSSession 的成员对象 cacert 中 |
+| ca_crl         | 入参,受信的 CA CRLs,可为空|
+| **返回**       | **描述** |
+| 无             | 无 |
+
+- **设置随机数生成器回调**
+
+```c
+void mbedtls_ssl_conf_rng( mbedtls_ssl_config *conf,
+                           int (*f_rng)(void *, unsigned char *, size_t),
+                           void *p_rng );
+```
+
+| 参数           | 描述    |
+| :-----         | :-----  |
+| conf           | 入参,SSL 配置结构体对象 |
+| f_rng          | 入参,随机数生成器函数 |
+| p_rng          | 入参,随机数生成器函数参数 |
+| **返回**       | **描述** |
+| 无             | 无 |
+
+- **设置 SSL 上下文**
+
+```c
+int mbedtls_ssl_setup( mbedtls_ssl_context *ssl,
+                       const mbedtls_ssl_config *conf );
+```
+
+将 SSL 配置结构体对象设置到 SSL 上下文中。
+
+| 参数           | 描述    |
+| :-----         | :-----  |
+| ssl            | 入参,SSL 上下文结构体对象 |
+| conf           | 入参,SSL 配置结构体对象 |
+| **返回**       | **描述** |
+| `= 0`          | 成功 |
+| - 0x7F00       | 内存分配失败 |
+
+### 连接阶段相关 API
+
+```c
+int mbedtls_net_connect( mbedtls_net_context *ctx,
+                         const char *host, const char *port,
+                         int proto );
+```
+
+与给定的 `host`、`port` 及 `proto` 协议建立网络连接。
+
+| 参数           | 描述    |
+| :-----         | :-----  |
+| ctx            | 入参,NET 网络配置结构体对象 |
+| host           | 入参,指定的待连接主机名 |
+| port           | 入参,指定的主机端口号 |
+| proto          | 入参,指定的协议类型,MBEDTLS_NET_PROTO_TCP 或者 MBEDTLS_NET_PROTO_UDP |
+| **返回**       | **描述** |
+| `= 0`          | 成功 |
+| - 0x0042       | socket 创建失败 |
+| - 0x0052       | 未知的主机名,DNS 解析失败 |
+| - 0x0044       | 网络连接失败 |
+
+- **设置网络层读写接口**
+
+```c
+void mbedtls_ssl_set_bio( mbedtls_ssl_context *ssl,
+                          void *p_bio,
+                          mbedtls_ssl_send_t *f_send,
+                          mbedtls_ssl_recv_t *f_recv,
+                          mbedtls_ssl_recv_timeout_t *f_recv_timeout );
+```
+
+为网络层设置读写函数,被 `mbedtls_ssl_read` 和 `mbedtls_ssl_write` 函数调用。
+
+- 对于 TLS,用户提供 f_recv 和 f_recv_timeout 其中之一即可,如果都有提供,默认使用 `f_recv_timeout` 回调
+- 对于 DTLS,用户需要提供 `f_recv_timeout` 回调函数
+
+| 参数           | 描述    |
+| :-----         | :-----  |
+| ssl            | 入参,SSL 上下文结构体对象 |
+| p_bio          | 入参,socket 描述符 |
+| f_send          | 入参,网络层写回调函数 |
+| f_recv          | 入参,网络层读回调函数 |
+| f_recv_timeout          | 入参,网络层非阻塞带超时读回调函数 |
+| **返回**       | **描述** |
+| 无             | 无 |
+
+- **SSL/TLS 握手接口**
+
+> int mbedtls_ssl_handshake( mbedtls_ssl_context *ssl );
+
+执行 SSL/TLS 握手操作。
+
+| 参数           | 描述    |
+| :-----         | :-----  |
+| ssl            | 入参,SSL 上下文结构体对象 |
+| **返回**       | **描述** |
+| `= 0`          | 成功 |
+| - 0x6900       | SSL 客户端需要读取调用 |
+| - 0x6880       | SSL 客户端需要写入调用 |
+| - 0x6A80       | DTLS 客户端必须重试才能进行 hello 验证 |
+| 其它            | 其它 SSL 指定的错误码 |
+
+注意,如果您使用的是 DTLS,你需要单独处理 `- 0x6A80` 错误,因为它是预期的返回值而不是实际错误。
+
+- **获取证书验证结果**
+
+> uint32_t mbedtls_ssl_get_verify_result( const mbedtls_ssl_context *ssl );
+
+| 参数           | 描述    |
+| :-----         | :-----  |
+| ssl            | 入参,SSL 上下文结构体对象 |
+| **返回**       | **描述** |
+| `= 0`          | 成功 |
+| - 1            | 返回结果不可用 |
+| 其它           | BADCERT_xxx 和 BADCRL_xxx 标志的组合,请参阅 x509.h |
+
+或者证书验证结果的 API 接口,具体的错误信息需要使用 `mbedtls_x509_crt_verify_info` 接口获取。
+
+```c
+int mbedtls_x509_crt_verify_info( char *buf, size_t size,
+                                  const char *prefix,
+                                  uint32_t flags );
+```
+
+使用 `mbedtls_x509_crt_verify_info` 函数获取有关证书验证状态的信息字符串,存储在 MbedTLSSession 的对象的 buffer 成员中。
+
+| 参数           | 描述    |
+| :-----         | :-----  |
+| buf            | 入参,存储验证状态信息字符串的缓冲区 |
+| size           | 入参,缓冲区大小 |
+| prefix         | 入参,行前缀 |
+| flags          | 入参,由 mbedtls_x509_crt_verify_info 函数返回的值 |
+| **返回**       | **描述** |
+| 整数           | 写入的字符串的长度(不包括结束符)或负的错误代码 |
+
+### 读写 API
+
+**SSL/TLS 写函数**
+
+> int mbedtls_ssl_read( mbedtls_ssl_context *ssl, unsigned char *buf, size_t len );
+
+从 SLL/TLS 读取数据,最多读取 'len' 字节长度数据字节。
+
+| 参数           | 描述    |
+| :-----         | :-----  |
+| ssl            | 入参,SSL 上下文结构体对象 |
+| buf            | 入参,接收读取数据的缓冲区 |
+| len            | 入参,要读取的数据长度 |
+| **返回**       | **描述** |
+| > 0            | 读取到的数据长度 |
+| = 0 | 读取到结束符 |
+| - 0x6900       | SSL 客户端需要读取调用 |
+| - 0x6880       | SSL 客户端需要写入调用 |
+| - 0x6780       | SSL 客户端需要重连 |
+| 其它           | 其它 SSL 指定的错误码 |
+
+**SSL/TLS 读函数**
+
+> int mbedtls_ssl_write( mbedtls_ssl_context *ssl, const unsigned char *buf, size_t len );
+
+向 SSL/TLS 写入数据,最多写入 'len' 字节长度数据。
+
+| 参数           | 描述    |
+| :-----         | :-----  |
+| ssl            | 入参,SSL 上下文结构体对象 |
+| buf            | 入参,待写入数据的缓冲区 |
+| len            | 入参,待写入数据的长度 |
+| **返回**       | **描述** |
+| > 0            | 实际写入的数据长度 |
+| = 0 | 读取到结束符 |
+| - 0x6900       | SSL 客户端需要读取调用 |
+| - 0x6880       | SSL 客户端需要写入调用 |
+| 其它           | 其它 SSL 指定的错误码 |

BIN
docs/figures/CA1.png


BIN
docs/figures/mbeddtlsHandShake.png


BIN
docs/figures/mbedtlsComponentsDependencies.png


BIN
docs/figures/mbedtlsHandShake.png


BIN
docs/figures/rtthread.png


BIN
docs/figures/rtthreadcer1.png


BIN
docs/figures/rtthreadcer2.png


BIN
docs/figures/rtthreadcer3.png


BIN
docs/figures/rtthreadcer4.png


BIN
docs/figures/rtthreadcer5.png


BIN
docs/image/mbedtls.jpg


+ 47 - 0
docs/introduction.md

@@ -0,0 +1,47 @@
+# 软件包介绍
+
+> [**mbedtls**](https://github.com/RT-Thread-packages/mbedtls) 软件包是 **RT-Thread** 基于 [ARMmbed/mbedtls](https://github.com/ARMmbed/mbedtls/) 开源库的移植。
+
+**mbedTLS**(前身 PolarSSL)是一个由 ARM 公司开源和维护的 SSL/TLS 算法库。其使用 C 编程语言以最小的编码占用空间实现了 SSL/TLS 功能及各种加密算法,易于理解、使用、集成和扩展,方便开发人员轻松地在嵌入式产品中使用 SSL/TLS 功能。
+
+**mbedTLS** 软件包提供了如下的能力:
+
+- 完整的 **SSL v3**、**TLS v1.0**、**TLS v1.1** 和 **TLS v1.2** 协议实现
+- **X.509** 证书处理
+- 基于 TCP 的 TLS 传输加密
+- 基于 UDP 的 DTLS(Datagram TLS)传输加密
+- 其它加解密库实现
+
+> 有关 mbedTLS 的更多信息,请参阅 [https://tls.mbed.org](https://tls.mbed.org)。
+
+## 软件框架图
+
+mbedTLS 软件包提供了一组可以单独使用和编译的加密组件,各组件及其可能的依赖关系如下图所示:
+
+![mbedtls 软件框架图](./figures/mbedtlsComponentsDependencies.png)
+
+## 软件包目录结构
+
+**ports** 目录是 RT-Thread 移植 mbedtls 软件包时所涉及到的移植文件,使用 scons 进行重新构建。
+
+```shell
+mbedtls
+|   LICENSE                         // 软件包许可协议
+|   README.md                       // 软件包使用说明
+|   SConscript                      // RT-Thread 默认的构建脚本
++---docs
+|   +---figures                     // 文档使用图片
+|   |   api.md                      // API 使用说明
+|   |   introduction.md             // 软件包详细介绍
+|   |   LICENSE                     // 许可证文件
+|   |   principle.md                // 实现原理
+|   |   README.md                   // 文档结构说明
+|   |   samples.md                  // 软件包示例
+|   |   user-guide.md               // 使用说明
+|   +---version.md                  // 版本说明
++---ports                           // 移植文件
+|   +---inc
+|   +---src
++---samples                         // 示例程序
++---mbedtls                         // ARM mbedtls 源码
+```

+ 20 - 0
docs/principle.md

@@ -0,0 +1,20 @@
+# 工作原理
+
+**mbedtls** 软件包是对 SSL/TLS 协议的实现。SSL(安全套接层)和 TLS(传输安全层)均是为了保证传输过程中信息的安全,是在明文传输基础上进行的加密,然后以密文的形式传输数据。
+
+mbedTLS 建立安全通信连接需要经过以下几个步骤:
+
+- 初始化 SSL/TLS 上下文
+- 建立 SSL/TLS 握手
+- 发送、接收数据
+- 交互完成,关闭连接
+
+其中,最关键的步骤就是 **SSL/TLS 握手** 连接的建立,这里需要进行证书校验。
+
+## SSL/TLS 握手流程
+
+![SSL/TLS 握手交互流程](./figures/mbedtlsHandShake.png)
+
+## DTLS 握手流程
+
+![DTLS 握手流程](./figures/mbeddtlsHandShake.png)

+ 123 - 0
docs/samples.md

@@ -0,0 +1,123 @@
+# 示例程序
+
+该示例程序提供了一个简单的 TLS client,与测试网站建立 TLS 连接并获取加密数据。
+
+**示例文件**
+
+| 示例程序路径                   | 说明 |
+| ----                          | ---- |
+| samples/tls_app_test.c        | TLS 测试例程 |
+
+## 例程工作流程
+
+本例程使用了 TLS 测试网站 `www.howsmyssl.com`,使用 `mbedtls_client_write` 函数发送 HTTP 测试请求,成功后,该网站会返回一段加密数据,测试例程将解析后的数据输出到控制台。
+
+- 例程使用的 HTTP 请求数据如下所示
+
+```c
+"GET https://www.howsmyssl.com/a/check HTTP/1.0\r\n"
+"Host: www.howsmyssl.com\r\n"
+"User-Agent: rtthread/3.1 rtt\r\n"
+"\r\n";
+```
+
+- mbedTLS 测试例程的基本工作流程如下所示
+
+    - client连接外网 TLS 测试网站 `www.howsmyssl.com`
+    - client 和 server 握手成功
+    - client 发送请求
+    - server 回应请求
+    - TLS 测试成功/失败
+
+## 准备工作
+
+### 获取软件包
+
+- menuconfig 配置软件包
+
+    打开 RT-Thread 提供的 ENV 工具,使用 **menuconfig** 配置软件包。
+
+    启用 mbedtls 软件包,并配置使能测试例程(Enable a mbedtls client example),如下所示:
+
+    ```shell
+    RT-Thread online packages --->
+        security packages  --->
+            [*] mbedtls: An portable and flexible SSL/TLS library  ---
+            [*]   Store the AES tables in ROM
+            (2)   Maximum window size used
+            (3584) Maxium fragment length in bytes
+            [*]   Enable a mbedtls client example
+                  version (latest)  --->
+    ```
+
+- 使用 `pkgs --update` 命令下载软件包
+- 编译下载
+
+### 同步设备时间
+
+SSL/TLS 服务器进行证书校验的过程中,会对当前发起校验请求的时间进行认证,如果时间不满足服务器的要求,就会校验证书失败。因此,我们需要为设备同步本地时间。
+
+- 方式一: 使用 **`date`** 命令
+
+    未同步过时间的设备输入 **`date`** 命令后如下所示:
+
+    ```shell
+    msh />date
+    Thu Jan  1 00:00:06 1970
+    ```
+
+    使用 **`date`** 设置当前时间,如下所示:
+
+    ```shell
+    msh />date 2018 08 02 12 23 00
+    msh />date
+    Thu Aug  2 12:23:01 2018
+    msh />
+    ```
+
+- 方式二: 使用 NTP 同步网络时间
+
+    该方式需要依赖 NTP 工具包,使用 `menuconfig` 配置获取,如下所示:
+
+    ```shell
+    RT-Thread online packages --->
+        IoT - internet of things  --->
+            -*- netutils: Networking utilities for RT-Thread  --->
+                -*-   Enable NTP(Network Time Protocol) client
+                (8)     Timezone for calculate local time
+                (cn.ntp.org.cn) NTP server name
+    ```
+
+    使用命令 **`ntp_sync`** 同步网络时间
+
+    ```shell
+    msh />ntp_sync
+    Get local time from NTP server: Thu Aug  2 14:31:30 2018
+    The system time is updated. Timezone is 8.
+    msh />date
+    Thu Aug  2 14:31:34 2018
+    ```
+
+## 启动例程
+
+在 MSH 中使用命令 **`tls_test`** 执行示例程序,成功建立 TLS 连接后,设备会从服务器拿到一组密码套件,设备 log 如下所示:
+
+```shell
+msh />tls_test
+[tls]mbedtls client struct init success...
+[tls]Loading the CA root certificate success...
+[tls]mbedtls client context init success...
+[tls]Connected www.howsmyssl.com:443 success...
+[tls]Certificate verified success...
+Writing HTTP request success...
+Getting HTTP response...
+HTTP/1.0 200 OK
+Content-Length: 6672
+Access-Control-Allow-Origin: *
+Content-Type: application/json
+Date: Thu, 02 Aug 2018 03:43:52 GMT
+Strict-Transport-Security: max-age=631138519; includeSubdomains; preload
+
+{"given_cipher_suites":["TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384","TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384","TLS_DHE_RSA_WITH_AES_256_GCM_SHA384",}
+mbedlts_client_entry close!
+```

+ 267 - 0
docs/user-guide.md

@@ -0,0 +1,267 @@
+# 使用指南
+
+这里主要介绍 mbedtls 程序的基本使用流程,并针对使用过程中经常涉及到的结构体和重要 API 进行简要说明。
+
+- 初始化 SSL/TLS 上下文
+- 建立 SSL/TLS 握手
+- 发送、接收数据
+- 交互完成,关闭连接
+
+## 功能配置文件
+
+> mbedtls/config.h 和 ports/inc/tls_config.h
+
+`mbedtls/config.h` 是 mbedtls 源码里提供的配置文件,`ports/inc/tls_config.h` 是 RT-Thread 基于 mbedtls 源码中的配置文件进行的裁剪和适配。
+
+最终,用户使用的是 RT-Thread 提供的配置文件 **`ports/inc/tls_config.h`**。
+
+用户可以通过文件中的宏来使能或失能部分不需要使用的功能模块,从而将 mbedtls 配置到合适的尺寸。
+
+## 证书配置文件
+
+> ports/src/tls_certificate.c
+
+该证书文件中已经包含了大多数 CA 根证书,如果您使用的根证书不在该文件内,需要您手动添加根证书文件到 `tls_certificate.c` 文件内。
+
+### 根证书样式
+
+通常,根证书以 `root.cer` 的样式进行命名,双击打开证书文件(Windows系统)可以看到证书的签发机构和有效期,如下图所示:
+
+![根证书信息](./figures/CA1.png)
+
+根证书文件有多种保存格式,我们需要 **`base64 编码 X.509`** 格式的证书文件。该类证书文件使用文本编辑器打后内容样式如下所示:
+
+```
+-----BEGIN CERTIFICATE-----
+MIIDdTCCAl2gAwIBAgILBAAAAAABFUtaw5QwDQYJKoZIhvcNAQEFBQAwVzELMAkG
+A1UEBhMCQkUxGTAXBgNVBAoTEEdsb2JhbFNpZ24gbnYtc2ExEDAOBgNVBAsTB1Jv
+b3QgQ0ExGzAZBgNVBAMTEkdsb2JhbFNpZ24gUm9vdCBDQTAeFw05ODA5MDExMjAw
+MDBaFw0yODAxMjgxMjAwMDBaMFcxCzAJBgNVBAYTAkJFMRkwFwYDVQQKExBHbG9i
+YWxTaWduIG52LXNhMRAwDgYDVQQLEwdSb290IENBMRswGQYDVQQDExJHbG9iYWxT
+aWduIFJvb3QgQ0EwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDaDuaZ
+jc6j40+Kfvvxi4Mla+pIH/EqsLmVEQS98GPR4mdmzxzdzxtIK+6NiY6arymAZavp
+xy0Sy6scTHAHoT0KMM0VjU/43dSMUBUc71DuxC73/OlS8pF94G3VNTCOXkNz8kHp
+1Wrjsok6Vjk4bwY8iGlbKk3Fp1S4bInMm/k8yuX9ifUSPJJ4ltbcdG6TRGHRjcdG
+snUOhugZitVtbNV4FpWi6cgKOOvyJBNPc1STE4U6G7weNLWLBYy5d4ux2x8gkasJ
+U26Qzns3dLlwR5EiUWMWea6xrkEmCMgZK9FGqkjWZCrXgzT/LCrBbBlDSgeF59N8
+9iFo7+ryUp9/k5DPAgMBAAGjQjBAMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8E
+BTADAQH/MB0GA1UdDgQWBBRge2YaRQ2XyolQL30EzTSo//z9SzANBgkqhkiG9w0B
+AQUFAAOCAQEA1nPnfE920I2/7LqivjTFKDK1fPxsnCwrvQmeU79rXqoRSLblCKOz
+yj1hTdNGCbM+w6DjY1Ub8rrvrTnhQ7k4o+YviiY776BQVvnGCv04zcQLcFGUl5gE
+38NflNUVyRRBnMRddWQVDf9VMOyGj/8N7yy5Y0b2qvzfvGn9LhJIZJrglfCm7ymP
+AbEVtQwdpf5pLGkkeB6zpxxxYu7KyJesF12KwvhHhm4qxFYxldBniYUr+WymXUad
+DKqC5JlR3XC321Y9YeRq4VzW9v493kHMB65jUr9TU/Qr6cf9tveCX4XSQRjbgbME
+HMUfpIBvFSDJ3gyICh3WZlXi/EjJKSZp4A==
+-----END CERTIFICATE-----
+```
+
+### 如何获取根证书
+
+- 直接向服务商索取
+
+  向服务商索取 **`base64 编码 X.509`** 格式的证书文件。
+
+- 从服务商网站导出
+
+    - 浏览器打开服务商网站,以 `https://www.rt-thread.org/` 为例
+    - 点击浏览器地址栏的 **`安全`**,然后点击证书
+
+    ![获取网站根证书](./figures/rtthread.png)
+
+    ![查看证书详细信息](./figures/rtthreadcer1.png)
+
+    ![导出根证书向导](./figures/rtthreadcer2.png)
+
+    ![选择根证书编码格式](./figures/rtthreadcer3.png)
+
+    ![选择根证书存储位置](./figures/rtthreadcer4.png)
+
+    ![完成根证书导出](./figures/rtthreadcer5.png)
+
+## 初始化 TLS 会话
+
+```c
+typedef struct MbedTLSSession
+{
+    char* host;
+    char* port;
+
+    unsigned char *buffer;               // 其它内容缓冲区
+    size_t buffer_len;                   // 缓冲区大小
+
+    mbedtls_ssl_context ssl;             // 保存 ssl 基本数据
+    mbedtls_ssl_config conf;             // 保存 ssl 配置信息
+    mbedtls_entropy_context entropy;     // 保存 ssl 熵配置
+    mbedtls_ctr_drbg_context ctr_drbg;   // 保存随机字节发生器配置
+    mbedtls_net_context server_fd;       // 保存文件描述符
+    mbedtls_x509_crt cacert;             // 保存认证信息
+} MbedTLSSession;
+```
+
+`MbedTLSSession` 用于保存建立 TLS 会话连接时的配置信息,在 TLS 上下文中传递使用。用户在使用建立 TLS 会话前,必须定义一个存储会话内容的结构体,如下所示:
+
+```c
+static MbedTLSSession *tls_session = RT_NULL;
+tls_session = (MbedTLSSession *)malloc(sizeof(MbedTLSSession));
+```
+
+这里需要设置 SSL/TLS 服务器的 host 和 port,以及数据接收 buffer 等配置。
+
+## 初始化 TLS 客户端
+
+> int mbedtls_client_init(MbedTLSSession *session, void *entropy, size_t entropyLen);
+
+应用程序使用 `mbedtls_client_init` 函数初始化 TLS 客户端。
+
+初始化阶段按照 API 参数定义传入相关参数即可,主要用来初始化网络接口、证书、SSL 会话配置等 SSL 交互必须的一些配置,以及设置相关的回调函数。
+
+实际调用的 mbedtls 库函数如下所示:
+
+```c
+mbedtls_net_init(&session->server_fd);
+mbedtls_ssl_init(&session->ssl);
+mbedtls_ssl_config_init(&session->conf);
+mbedtls_ctr_drbg_init(&session->ctr_drbg);
+mbedtls_entropy_init(&session->entropy);
+mbedtls_x509_crt_init(&session->cacert);
+ret = mbedtls_ctr_drbg_seed(&session->ctr_drbg, mbedtls_entropy_func, 
+&session->entropy, (unsigned char *)entropy, entropyLen));
+
+
+mbedtls_ctr_drbg_seed // 可以指定熵函数。如果回调使用默认 bedtls_entropy_func 的话,可以传入一个初始的熵 seed,也可以 NULL
+```
+
+## 配置 SSL/TLS 客户端上下文
+
+> int mbedtls_client_context(MbedTLSSession *session);
+
+SSL 层配置,应用程序使用 `mbedtls_client_context` 函数配置客户端上下文信息,包括证书解析、设置主机名、设置默认 SSL 配置、设置认证模式(默认 MBEDTLS_SSL_VERIFY_OPTIONAL)等。
+
+实际调用的 mbedtls 库函数如下所示:
+
+```c
+// 解析 mbedtls_root_certificate 缓冲区中存储的根证书,并添加到链表
+ret = mbedtls_x509_crt_parse(&session->cacert,
+                             (const unsigned char *)mbedtls_root_certificate,
+                             mbedtls_root_certificate_len);
+// 设置主机名称
+ret = mbedtls_ssl_set_hostname(&session->ssl, session->host));
+// 设置 SSL 默认配置,选择 SSL 为客户端,使用 TCP
+ret = mbedtls_ssl_config_defaults(&session->conf,
+                                  MBEDTLS_SSL_IS_CLIENT,
+                                  MBEDTLS_SSL_TRANSPORT_STREAM,
+                                  MBEDTLS_SSL_PRESET_DEFAULT));
+// 设置认证模式,这里默认配置为可选,即认证失败也可以继续通讯
+mbedtls_ssl_conf_authmode(&session->conf, MBEDTLS_SSL_VERIFY_OPTIONAL);
+// 初始化根证书链表
+mbedtls_ssl_conf_ca_chain(&session->conf, &session->cacert, NULL);
+// 配置随机数发生器
+mbedtls_ssl_conf_rng(&session->conf, mbedtls_ctr_drbg_random, &session->ctr_drbg);
+ret = mbedtls_ssl_setup(&session->ssl, &session->conf));
+```
+
+## 建立 SSL/TLS 连接
+
+> int mbedtls_client_connect(MbedTLSSession *session);
+
+使用 `mbedtls_client_connect` 函数为 SSL/TLS 连接建立通道。这里包含整个的握手连接过程,以及证书校验结果。
+
+实际调用的 mbedtls 库函数如下所示:
+
+```c
+// 创建 socket 描述符
+ret = mbedtls_net_connect(&session->server_fd, session->host,
+                          session->port, MBEDTLS_NET_PROTO_TCP));
+// 设置 socket 输入输出接口
+mbedtls_ssl_set_bio(&session->ssl, &session->server_fd,
+                    mbedtls_net_send, mbedtls_net_recv, NULL);
+// 建立握手连接,这里执行完整的 SSL/TLS 握手认证
+ret = mbedtls_ssl_handshake(&session->ssl));
+// 获取认证结果
+ret = mbedtls_ssl_get_verify_result(&session->ssl));
+mbedtls_x509_crt_verify_info((char *)session->buffer,
+                             session->buffer_len, "  ! ", ret);
+```
+
+## 读写数据
+
+> int mbedtls_client_read(MbedTLSSession *session, unsigned char *buf , size_t len);
+
+> int mbedtls_client_write(MbedTLSSession *session, const unsigned char *buf , size_t len);
+
+注意,如果读写接口返回了一个错误,必须关闭连接。
+
+## 关闭 SSL/TLS 客户端连接
+
+> int mbedtls_client_close(MbedTLSSession *session);
+
+客户端主动关闭连接或者因为异常错误关闭连接,都需要使用 `mbedtls_client_close` 关闭连接并释放资源。
+
+## mbedtls 使用范式
+
+参考示例程序 `samples/tls_app_test.c`。
+
+## 常见问题
+
+### 证书验证失败  
+
+    [tls]verification info: ! The CRL is not correctly signed by the trusted CA
+
+- 原因
+
+    mbedtls 包中支持多种主流 CA 机构根证书,部分 CA 机构未支持
+
+- 解决方法
+
+    若测试其他 TLS 网站证书验证失败,手动获取测试网站根证书(Root Cerificate)添加到`mbedtls/tls_cerificate.c`文件中
+
+### 证书时间错误
+
+    [tls]verify peer certificate fail....
+    [tls]verification info:   ! The certificate validity starts in the future
+
+- 原因
+
+    TLS 握手是证书验证需要时间的验证,本地时间获取有误导致
+
+- 解决方式
+
+    检查 RTC 设备是否支持,检查 `RT_USING_RTC` 宏是否打开,校准设备时间。建议使用 NTP 同步本地时间。
+
+### 证书 CN 错误
+
+    verification info: ! The certificate Common Name (CN) does not match with the expected CN
+
+- 原因
+
+    测试其他 TLS 网站时,若输入域名不符合证书的 Common Name(CN)出现 CN 验证失败问题
+
+- 解决方法
+
+    检查输入域名和证书中 CN 是否匹配或输入 IP 地址
+
+### 0x7200 错误
+
+- 原因
+
+    部分原因是因为 mbedTls 收到了大于缓冲区大小的数据包  
+
+- 解决方法
+
+    `menuconfig` 配置增加数据帧大小 ( `Maxium fragment length in bytes` )
+
+```shell
+RT-Thread online packages --->
+    security packages  --->
+        [*] mbedtls: An portable and flexible SSL/TLS library  ---
+        [*]   Store the AES tables in ROM
+        (2)   Maximum window size used
+        (6144) Maxium fragment length in bytes
+        [*]   Enable a mbedtls client example
+              version (latest)  --->
+```
+
+## 参考
+
+- mbedTLS官方网站:https://tls.mbed.org/
+- ARMmbed GitHub:[mbedtls](https://github.com/ARMmbed/mbedtls/tree/72ea31b026e1fc61b01662474aa5125817b968bc)

+ 5 - 0
docs/version.md

@@ -0,0 +1,5 @@
+# 版本和修订 #
+
+| Date       | Version   |  Author    | Note  |
+| --------   | :-----:   | :----      | :---- |
+| 2018-08-01 | v0.1      | MurphyZhao | 初始版本 |

+ 0 - 0
mbedtls-port/inc/timing_alt.h → ports/inc/timing_alt.h


+ 0 - 0
mbedtls-port/inc/tls_certificate.h → ports/inc/tls_certificate.h


+ 0 - 0
mbedtls-port/inc/tls_client.h → ports/inc/tls_client.h


+ 0 - 0
mbedtls-port/inc/tls_config.h → ports/inc/tls_config.h


+ 0 - 0
mbedtls-port/inc/tls_net.h → ports/inc/tls_net.h


+ 0 - 0
mbedtls-port/src/timing_alt.c → ports/src/timing_alt.c


+ 0 - 0
mbedtls-port/src/tls_certificate.c → ports/src/tls_certificate.c


+ 9 - 1
mbedtls-port/src/tls_client.c → ports/src/tls_client.c

@@ -32,11 +32,19 @@
 #endif
 
 #define rt_kprintf rt_kprintf("[tls]");rt_kprintf
- 
+
+#if defined(MBEDTLS_DEBUG_C)
+#define DEBUG_LEVEL (10)
+#endif
+
 int mbedtls_client_init(MbedTLSSession *session, void *entropy, size_t entropyLen)
 {
     int ret = 0;
 
+#if defined(MBEDTLS_DEBUG_C)
+    mbedtls_debug_set_threshold((int)DEBUG_LEVEL);
+#endif
+
     mbedtls_net_init(&session->server_fd);
     mbedtls_ssl_init(&session->ssl);
     mbedtls_ssl_config_init(&session->conf);

+ 0 - 0
mbedtls-port/src/tls_hardware.c → ports/src/tls_hardware.c


+ 0 - 0
mbedtls-port/src/tls_net.c → ports/src/tls_net.c


+ 0 - 0
examples/tls_app_test.c → samples/tls_app_test.c