STM32 基础系列教程 50 – MbedTls

前言

      mbed TLS(以前称为PolarSSL)是TLS和SSL协议的实现,并且需要相应的加密算法和支持代码。这是双重许可Apache许可证 2.0版(与GPLv2许可也可)。网站上指出,mbed TLS的目标是“易于理解,使用,集成和扩展,核心SSL C编程语言编写,并实现SSL模块,基本加密功能并提供各种实用功能。与OpenSSL和TLS的其他实现不同,mbed TLS设计为适合小型嵌入式设备,最小完整的TLS堆栈需要60KB的程序空间和64KB的RAM。它也是高度模块化的:每个组件,如加密函数,可以独立于框架的其余部分使用。因为mbedTLS是用C编程语言编写的,没有外部依赖,也就是说,无论是嵌入式还是桌面软件版的编程,只要你用的到AES,RSA等加密算法,你都可以直接拿过来源码放进你的工程中,进行编译管理,不用带着DLL,或者必须安装一些不必要的库,并且算法是标准库,所以你懂得。并且开源。

STM32CUBE里已经集成了MBEDTLS, MBEDTLS是ARM公司的开源加密库,遵守APACHE协议,大家可以随便使用MBEDTLS到开源和闭源项目上。其次,除了ECC,MBEDTLS还支持AES系列对称加密,支持基于AES的NONCE生成,支持SHA系列摘要算法等,可以应用在各种加密场景。

 

示例详解

基于硬件平台: 正点源子的stm32f4 探索者开发板,MCU 的型号是 STM32F4ZET6, 使用stm32cubemx 工具自动产生的配置工程,使用KEIL5编译代码。本示例所用的开发板及部分原理图:

STM32 基础系列教程 50 – MbedTls

STM32 基础系列教程 50 – MbedTls

 

    1. 关于CUBEMX工具及KEIL工具的操作将不再细讲,如果还有不熟悉的可以查看之前的教程文档。下面直接介绍工程配置:

 

      1. 系统时钟树

STM32 基础系列教程 50 – MbedTls

 

      1. 串口配置(用于程序调试)

STM32 基础系列教程 50 – MbedTls

 

      1. RCC配置

STM32 基础系列教程 50 – MbedTls

      1. SYS配置

STM32 基础系列教程 50 – MbedTlsRNG配置(非必需),MbedTls库要用到随机数,刚好在本实例用到的MCU有RNG处理器,我们这里为MbedTls选择硬件RNG,当然如果MCU不支持的话,这里可以不用管,在MbedTls配置时选用 软件RNG即可。

STM32 基础系列教程 50 – MbedTls

      1. Rtc配置(非必需),MbedTls库用到时有时候需要时间支持,当然也可以在配置时不定义MBEDTLS_HAVE_TIME或用户在实现time函数时来个空实现。本例我们将定义MbedTls库的MBEDTLS_HAVE_TIME特性,并利用RTC来实现时间获取。

STM32 基础系列教程 50 – MbedTls

 

      1. MbedTls库配置(也可以用KEIL MDK自带的库,操作方式类似于第48,49讲中的CJSON和Jansson库的使用)

STM32 基础系列教程 50 – MbedTls

特性支持》

STM32 基础系列教程 50 – MbedTls

模块(本例会演示SHA1算法,所以要高启对应用支持)》

STM32 基础系列教程 50 – MbedTls

 

      1. 引脚配置,用到引脚极少

STM32 基础系列教程 50 – MbedTls

      1. 堆栈配置(堆要大些):

STM32 基础系列教程 50 – MbedTls

 

    1. 工程代码
      1. 找到mbedtls.c文件,按下图所示在对应区域加入代码(演示EC非对称加密公钥导入):

STM32 基础系列教程 50 – MbedTls

STM32 基础系列教程 50 – MbedTls

 

      1. 在main.c 中main函数中USER CODE BEGIN Includes、USER CODE0, USER CODE1、USER CODE 2, USER CODE 4 区域加入如下图所示代码:

STM32 基础系列教程 50 – MbedTls

STM32 基础系列教程 50 – MbedTls

 

STM32 基础系列教程 50 – MbedTls

STM32 基础系列教程 50 – MbedTls

STM32 基础系列教程 50 – MbedTls

STM32 基础系列教程 50 – MbedTls

c) 编译工程,调试程序, (注:在使用探索者F4调试时,下载或仿真调试时先不要PC串口工具连接上开发板的USB_232接口,有可能导致程序运行不了--boot0引脚电平不对,可以先跑起来再在PC串口工具上连接相应端口!!,可按下面的具体操作步骤来操作—>>  )

 

STM32 基础系列教程 50 – MbedTls

STM32 基础系列教程 50 – MbedTls

STM32 基础系列教程 50 – MbedTls

串口已打开,程序全速运行(F5或单击全速运行图标)相看运行结果:

STM32 基础系列教程 50 – MbedTls

 

这个时候可以在串口中看到如下程序运行结果(成功打印出JSON数据并成功解析):

STM32 基础系列教程 50 – MbedTls

为了验证算法执行结果是否正确,我们可以到在线hash计算网站上验证一下吉果,浏览器开打 http://www.kjson.com/encrypt/hash/?fm=map 输入文本“HeLLo ZhangShiSan!!”查看结果与我们程序中串口输出的一致!!

STM32 基础系列教程 50 – MbedTls

STM32 基础系列教程 50 – MbedTls

到此本次的基于MbedTls库的简单演示操作就完成了,本实例演示了非对称加密ECC算法的公钥导入操作,对称加密算法 AES 的加密码与解密,HASH算法,sha1,sha256/224的使用,MbedTls库还支持非常对的加密算法如RAS等,有兴趣的同学或有实际应用案例的同学可以好好研究与利用一下。

OK,本期实验完成!下期见!同时如果大家有什么疑问或是有想了解的其它内容,也欢迎大家留言!!最后喜欢这个公众号的同学们记得加关注了,会有不定期技术干货推出!!

 

文中源码资料下载,在公众号里给十三发消息:

下载|STM32基础系列教程50

STM32 基础系列教程 50 – MbedTls

 

关注十三公众号

STM32 基础系列教程 50 – MbedTls