STM32移植使用mbedtls-2.24.0
(1)关于PolarSSL
mbed TLS(之前称为PolarSSL)是TLS和SSL协议的实现,而且须要相应的加密算法和支持代码。这是双重许可与Apache许可证 2.0版(与GPLv2许可也可)。网站上指出,mbed TLS的目标是“易于理解,使用,集成和扩展”。linux
核心SSL库用C编程语言编写,并实现SSL模块,基本加密功能并提供各类实用功能。与OpenSSL和TLS的其余实现不一样,mbed TLS设计为适合小型嵌入式设备,最小完整的TLS堆栈须要60KB的程序空间和64KB的RAM。它也是高度模块化的:每一个组件,如加密函数,能够独立于框架的其他部分使用。版本也可用于Microsoft Windows和Linux。由于mbed TLS是用C编程语言编写的,没有外部依赖,如今叫MbedTSL,PolarSSL源码,也许是最小巧的ssl代码库。高效、便于移植和集成。尤为适合嵌入式应用。git
本章就基于STM32移植mbedtls-2.24.0版本进行测试与使用!github
mbedtls下载地址:https://github.com/ARMmbed/mbedtls算法
本章工程代码下载地址:https://github.com/wowyyy/HAL_STM32_MBEDTLS_DEMO.git编程
(2)mbedtls移植
首先使用STM32CubeMX创建裸机工程,我使用的是STM32F103RB,配置了串口一看成信息输出的端口,这里注意,mbedtls所使用的栈空间是比较大的,因此在STM32CubeMX输出工程的时候将栈空间调大,以下图:网络
下载解压mbedtls源码目录以下:框架
而咱们须要的仅仅是configs(配置头文件)、include(头文件)、library(源码)。编程语言
- configs,该文件夹内的是配置头文件,能够根据不一样需求进行选择,例如咱们本次是在嵌入式系统上使用,资源有限,因此就选择
config-mini-tls1_1.h
这个配置文件,复制该文件内的内容替换mbedtls的默认配置头文件mbedtls/config.h
便可。 - include,全部头文件
- library,全部源代码
首先在STM32 工程目录下创建文件夹mbedtls,并将mbedtls源码目录下的include和library两个文件夹复制过来,复制config-mini-tls1_1.h
文件中的内容替换include/config.h
。(注:include/config.h
文件是只读的,须要先修改权限为读写)。模块化
打开keil工程将源码添加进来:
添加头文件包含:
函数
修改include/config.h
配置文件:
- 注释掉宏定义
MBEDTLS_HAVE_TIME
,由于咱们目前没有用到时间相关的 - 注释掉宏定义
MBEDTLS_NET_C
,由于没有用到网络 - 注释掉宏定义
MBEDTLS_FS_IO
,这是带系统时候须要用到的标准系统调用IO,例如linux下的系统调用函数read、write等,裸机咱们没有用到 - 添加一个宏定义
MBEDTLS_NO_PLATFORM_ENTROPY
,单片机无系统因此须要添加该宏。
而后编译工程便可~!
(3)移植测试
将printf函数重定向到串口一输出:
/// 重定向printf函数到串口一 int fputc(int ch, FILE* fp) { while (__HAL_UART_GET_FLAG(&huart1, UART_FLAG_TXE) != SET); huart1.Instance->DR = (uint8_t)(ch & 0XFF); return ch; }
下面咱们开始编写代码测试,测试两个,一个是base64编码的,另外一个是AES加解密的,
须要添加头文件:
#include "mbedtls/config.h" #include "mbedtls/aes.h" #include "mbedtls/base64.h"
base64编解码测试代码:
void mbedtls_base64_demo(void) { int i = 0; // 原始数据 uint8_t plaintext[16] = { 'A','B','C','D','E','F','G','H','I','J', 'K', 'L', 'M', 'N', 'O', 'P'}; // base64编码和解码输出数据的长度 size_t enclen = 0, declen = 0; // 存放base64编码输出 uint8_t encode[32]; // 存放base64解码输出 uint8_t decode[32]; // 编码 mbedtls_base64_encode(encode, sizeof(encode), &enclen, plaintext, sizeof(plaintext)); // 解码 mbedtls_base64_decode(decode, sizeof(decode), &declen, encode, enclen); printf("- enclen:%d\r\n", enclen); printf("- encode:%s\r\n", encode); printf("- declen:%d\r\n", declen); printf("- decode:"); for(i = 0; i < declen; i++) { printf("%c", (char)decode[i]); } printf("\r\n"); }
AES加解密测试代码(ECB模式):
void mbedtls_aes_ecb_demo(void) { int i = 0; mbedtls_aes_context ctx; // 要加密的数据 uint8_t plaintext[16] = { 'A','B','C','D','E','F','G','H','I','J', 'K', 'L', 'M', 'N', 'O', 'P'}; // 密码 const uint8_t passwd[32] = "AAAAAAAAAABBBBBBBBBBCCCCCCCCCCDD"; // 加密输出 uint8_t encrypt[16]; // 解密输出 uint8_t decrypt[16]; // 初始化 mbedtls_aes_init(&ctx); // 设置加密密钥 mbedtls_aes_setkey_enc(&ctx, passwd, 256); // 加密 mbedtls_aes_crypt_ecb(&ctx, MBEDTLS_AES_ENCRYPT, plaintext, encrypt); // 设置解密密钥 mbedtls_aes_setkey_dec(&ctx, passwd, 256); // 解密 mbedtls_aes_crypt_ecb(&ctx, MBEDTLS_AES_DECRYPT, encrypt, decrypt); // 清理 mbedtls_aes_free(&ctx); printf("encrypt:"); for(i = 0; i < 16; i++) { printf("%02X", encrypt[i]); } printf("\r\n"); printf("decrypt:"); for(i = 0; i < 16; i++) { printf("%c", decrypt[i]); } printf("\r\n"); }
AES加解密测试代码(CBC模式):
void mbedtls_aes_cbc_demo(void) { int i = 0; mbedtls_aes_context ctx; // 密码 uint8_t passwd[16] = "AAAAAAAAAACCCCDD"; // 用于加密的向量表 uint8_t iv_encrypt[16] = { 0X00, 0X01, 0X02, 0X03, 0X10, 0X11, 0X12, 0X13, 0X20, 0X21, 0X22, 0X23, 0X30, 0X31, 0X32, 0X33 }; // 用于解密的向量表 uint8_t iv_decrypt[16] = { 0X00, 0X01, 0X02, 0X03, 0X10, 0X11, 0X12, 0X13, 0X20, 0X21, 0X22, 0X23, 0X30, 0X31, 0X32, 0X33 }; // 待加密的数据 uint8_t plaintext[] = { 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P' }; // 存储加密后的输出 uint8_t encrypt[sizeof(plaintext)]; // 存储解密后的输出 uint8_t decrypt[sizeof(plaintext)]; // 加密 mbedtls_aes_setkey_enc(&ctx, passwd, 128); mbedtls_aes_crypt_cbc(&ctx, MBEDTLS_AES_ENCRYPT, sizeof(plaintext), iv_encrypt, plaintext, encrypt); // 解密 mbedtls_aes_setkey_dec(&ctx, passwd, 128); mbedtls_aes_crypt_cbc(&ctx, MBEDTLS_AES_DECRYPT, sizeof(plaintext), iv_decrypt, encrypt, decrypt); // 打印出加入后的结果 for (i = 0; i < sizeof(plaintext); i++) { printf("%02X", encrypt[i]); } printf("\r\n"); // 打印处解密后的结果 for (i = 0; i < sizeof(plaintext); i++) { printf("%c", decrypt[i]); } printf("\r\n"); }
main函数以下:
程序运行效果:
网上有不少在线AES、BASE64加解密测试平台,能够去作验证移植测试的准确性!
ends…