stm32 lwip 如何发送不出_mbedtls | 移植mbedtls库到STM32裸机的两种方法
一、mbedtls 開源庫(kù)
1. mbedtls是什么
Mbed TLS是一個(gè)開源、可移植、易于使用、代碼可讀性高的SSL庫(kù)。可實(shí)現(xiàn)加密原語(yǔ),X.509證書操作以及SSL / TLS和 DTLS 協(xié)議,它的代碼占用空間小,非常適合用于嵌入式系統(tǒng)。
mbedtls遵循 Apache 2.0 開源許可協(xié)議,目前由 TrustedFirmware 維護(hù)(Linaro主持的一個(gè)治理開放社區(qū)項(xiàng)目),在Github上已收獲 2.6k star,目前Github上發(fā)布的最新版本為 2.24.0 版本,開源倉(cāng)庫(kù)地址為:
“https://github.com/ARMmbed/mbedtls
”2. mbedtls有何用
mbedtls庫(kù)提供了 TLS / DTLS協(xié)議的實(shí)現(xiàn),有了mbedtls庫(kù)之后意味著:
- TCP + TLS = TCP(S)
- MQTT + TLS = MQTT(S)
- HTTP + TLS = HTTP(S)
- COAP + DTLS = COAP(S)
目前的物聯(lián)網(wǎng)操作系統(tǒng)+各種通信模組方式可以很好的實(shí)現(xiàn)TCP/UDP通信,進(jìn)而提供一些HTTP、MQTT、COAP之類的上層協(xié)議,這些協(xié)議最大的特點(diǎn)是“明文傳輸”,一旦有中間人想要截獲篡改數(shù)據(jù),非常容易。
要想物聯(lián)網(wǎng)設(shè)備和服務(wù)器之間具備高安全性,mbedtls庫(kù)不可或缺。
3. 下載mbedtls庫(kù)
在github release頁(yè)面下載:
4. STM32移植方法
移植mbedtls開源庫(kù)到stm32有兩種方法:
① 針對(duì)STM32CubeMX中Middleware下面已經(jīng)提供mbedtks庫(kù)的情況:直接使用cubeMX配置即可;
② 針對(duì)STM32CubeMX中沒有提供mbedtls庫(kù)的情況:手動(dòng)移植。
接下來(lái)分別演示如何移植。
二、使用STM32CubeMX移植
此小節(jié)中我使用的是正點(diǎn)原子STM32F407探索者開發(fā)板,首先準(zhǔn)備一份可以正常使用printf打印到串口的工程。
1. 開啟RNG外設(shè)支持(可選)
一些STM32系列中有RNG外設(shè)(隨機(jī)數(shù)發(fā)生器),如果有的話就開啟,沒有就不用開啟,接著后面的步驟就好。
2. RTC支持和網(wǎng)絡(luò)支持(可選)
網(wǎng)絡(luò)支持需要提供一套TCP/IP協(xié)議棧,比如基于AT模組的SAL層、lwip協(xié)議棧等,這里我們不使用網(wǎng)絡(luò)連接功能,后續(xù)在帶操作系統(tǒng)移植時(shí)講解。
RTC支持是為了校驗(yàn)CA證書有效期提供時(shí)間支持,這里我們不使用時(shí)間功能,后續(xù)在帶操作系統(tǒng)移植時(shí)講解。
3. 開啟mbedtls庫(kù)
在Middleware下開啟mbedtls庫(kù)支持:
4. 配置mbedtls
mebdtls庫(kù)提供的算法非常多,全都通過(guò)宏定義來(lái)配置。
① 特性配置:保持默認(rèn)即可。② 使用功能模塊配置(重點(diǎn)):
5. 編寫測(cè)試代碼
生成工程,在middleware文件夾下即可看到mbedtls庫(kù):打開工程,在main.c中包含頭文件:
/*?Private?includes?----------------------------------------------------------*//*?USER?CODE?BEGIN?Includes?*/
#include?
#include?"mbedtls/sha1.h"??//使用sha1相關(guān)加密函數(shù)
#include?"string.h"????//使用到了strlen函數(shù)
/*?USER?CODE?END?Includes?*/
然后在main函數(shù)中編寫如下測(cè)試代碼:
/*?USER?CODE?BEGIN?2?*/printf("mbedtls?port?on?ATK-STM32F407?board?by?mculover666\r\n");
/*?sha1?test?*/
char?*source_cxt?=?"mculover666";
char?encrypt_cxt[64];
printf("source?context?is:%s\r\n",?source_cxt);
mbedtls_sha1_context?sha1_ctx;
mbedtls_sha1_init(&sha1_ctx);
mbedtls_sha1_starts(&sha1_ctx);
mbedtls_sha1_update(&sha1_ctx,?(unsigned?char?*)source_cxt,?strlen(source_cxt));
mbedtls_sha1_finish(&sha1_ctx,?(unsigned?char?*)encrypt_cxt);
mbedtls_sha1_free(&sha1_ctx);
int?i?=?0;
printf("sha1?encrypt?context?is:[");
while?(encrypt_cxt[i])?{
??printf("%02x",?encrypt_cxt[i]);
??i++;
}
printf("]\r\n");
/*?USER?CODE?END?2?*/
“
特別注意:Keil-MDK需要改為ANSI 編碼,否則因?yàn)樽址幋a問題,會(huì)導(dǎo)致加密結(jié)果出錯(cuò)。
”編譯,下載到開發(fā)板中,在串口助手中查看加密結(jié)果:
6. 驗(yàn)證加密結(jié)果
可以使用一些在線工具計(jì)算出結(jié)果進(jìn)行對(duì)比,如圖,加密無(wú)誤:
“https://1024tools.com/hash
”三、手動(dòng)移植mbedtls庫(kù)
這里我以STM32L431RCT6小熊派開發(fā)板為例,首先準(zhǔn)備一份可以正常使用printf打印的裸機(jī)工程,其中沒有開啟硬件RNG外設(shè)。
1. 復(fù)制mbedtls相關(guān)文件
① 從mbedtls庫(kù)中復(fù)制mbedtls源碼文件到工程中:② 再?gòu)?fù)制mbedtls示例配置文件:
2. 添加mbedtls文件到MDK中
① 添加 mbedtls\library 文件夾中所有的c文件:再將配置文件也添加到工程目錄,方便修改:
② 添加頭文件路徑:
③ 在宏定義中指定mbedconfig配置文件:
MBEDTLS_CONFIG_FILE=3. 修改mbedtls配置
編輯 config-mini-tls1_1.h 文件。
① 配置mbedtls系統(tǒng)支持:② 配置功能模塊③ 屏蔽功能測(cè)試,添加一個(gè)宏定義,表示沒有平臺(tái)支持:
4. 編寫測(cè)試代碼
打開工程,在main.c中包含頭文件:
/*?Private?includes?----------------------------------------------------------*//*?USER?CODE?BEGIN?Includes?*/
#include?
#include?"mbedtls/sha1.h"
#include?"string.h"
/*?USER?CODE?END?Includes?*/
然后在main函數(shù)中編寫如下測(cè)試代碼:
/*?USER?CODE?BEGIN?2?*/printf("mbedtls?port?on?BearPi-STM32L431RC?board?by?mculover666\r\n");
/*?sha1?test?*/
char?*source_cxt?=?"mculover666";
char?encrypt_cxt[64];
printf("source?context?is:%s\r\n",?source_cxt);
mbedtls_sha1_context?sha1_ctx;
mbedtls_sha1_init(&sha1_ctx);
mbedtls_sha1_starts(&sha1_ctx);
mbedtls_sha1_update(&sha1_ctx,?(unsigned?char?*)source_cxt,?strlen(source_cxt));
mbedtls_sha1_finish(&sha1_ctx,?(unsigned?char?*)encrypt_cxt);
mbedtls_sha1_free(&sha1_ctx);
int?i?=?0;
printf("sha1?encrypt?context?is:[");
while?(encrypt_cxt[i])?{
printf("%02x",?encrypt_cxt[i]);
i++;
}
printf("]\r\n");
/*?USER?CODE?END?2?*/
“
特別注意:Keil-MDK需要改為ANSI 編碼,否則因?yàn)樽址幋a問題,會(huì)導(dǎo)致加密結(jié)果出錯(cuò)。
”編譯,下載到開發(fā)板中,在串口助手中查看加密結(jié)果:
5. 測(cè)試加密結(jié)果
同第二節(jié)第 6 小節(jié)。
四、移植總結(jié)
mbedtls可以說(shuō)是一個(gè)牛逼的開源庫(kù),其功能可以靈活的通過(guò)宏定義來(lái)選擇,整個(gè)移植過(guò)程比較簡(jiǎn)單。
而且mbedtls庫(kù)對(duì)于我們的配置文件會(huì)做檢查,一般在配置文件的最后一句:
#include?"mbedtls/check_config.h"如果對(duì)應(yīng)某些功能我們開啟了,但是沒有開啟它的依賴功能,編譯器會(huì)直接報(bào)錯(cuò),根據(jù)報(bào)錯(cuò)修改對(duì)應(yīng)定義即可。
總之,這么好的東西,不玩一下可是睡不著的~
接收精彩文章及資源推送,請(qǐng)訂閱我的微信公眾號(hào):『mculover666』。
總結(jié)
以上是生活随笔為你收集整理的stm32 lwip 如何发送不出_mbedtls | 移植mbedtls库到STM32裸机的两种方法的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 易企秀如何生成图片_易企秀可以导出图片吗
- 下一篇: gc日志一般关注什么_GC日志说明