STM32移植使用mbedtls-2.24.0

2023-05-16

STM32移植使用mbedtls-2.24.0


目录

  • STM32移植使用mbedtls-2.24.0
    • (1)关于PolarSSL
    • (2)mbedtls移植
    • (3)移植测试

扫描以下二维码,关注公众号雍正不秃头获取更多STM32资源及干货!
在这里插入图片描述



(1)关于PolarSSL

mbed TLS(以前称为PolarSSL)是TLS和SSL协议的实现,并且需要相应的加密算法和支持代码。这是双重许可与Apache许可证 2.0版(与GPLv2许可也可)。
核心SSL库用C编程语言编写,并实现SSL模块,基本加密功能并提供各种实用功能。与OpenSSL和TLS的其他实现不同,mbed TLS设计为适合小型嵌入式设备,最小完整的TLS堆栈需要60KB的程序空间和64KB的RAM。它也是高度模块化的:每个组件,如加密函数,可以独立于框架的其余部分使用。因为mbed TLS是用C编程语言编写的,没有外部依赖,现在叫MbedTSL,PolarSSL源码,也许是最小巧的ssl代码库。高效、便于移植和集成。尤其适合嵌入式应用。

本章就基于STM32移植mbedtls-2.24.0版本进行测试与使用!

mbedtls下载地址:https://github.com/ARMmbed/mbedtls

本章工程代码下载地址:https://github.com/wowyyy/HAL_STM32_MBEDTLS_DEMO.git

注意:因为本章节只是用了加解密的API,没有使用网络进行SSL认证操作,如果要使用mbedtls的SSL认证,最低的硬件环境最低需要60K的FLASH以及64K的SRAM(内存),如果你使用的比较低端的STM32,那么无解,没法用embedtls。。。


(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…

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

STM32移植使用mbedtls-2.24.0 的相关文章

  • Lua 变量

    Lua 变量 参考至菜鸟教程 变量在使用前 xff0c 需要在代码中进行声明 xff0c 即创建该变量 变量需要标识类型是因为编译程序执行代码之前需要知道如何给语句变量开辟存储区 xff0c 用于存储变量的值 Lua变量有三种类型 xff1
  • Lua 函数 - 可变参数

    Lua 函数 可变参数 参考至菜鸟教程 Lua函数可以接收可变数目的参数 xff0c 和C语言类似 xff0c 在函数参数列表中使用三点 表示函数有可变的参数 span class token keyword function span s
  • Lua 运算符 - 较为特殊部分

    Lua 运算符 较为特殊部分 参考至菜鸟教程 算术运算符 操作符描述实例 乘幂A 2 输出结果 100 负号 A 输出结果 10 整除运算符 gt 61 lua5 3 5 2 输出结果 2 在 lua 中 xff0c 用作除法运算 xff0
  • python(9):python循环打印进度条

    1 while 循环 Python的while循环可以打印进度条 xff0c 可以使用tqdm这个库来实现 tqdm是一个用于在Python中添加进度条的库 xff0c 它可以很容易地集成到while循环中 下面是一个简单的示例 xff0c
  • 平衡车直立PID调节总结

    苦战一周 xff0c 终于使平衡小车站了起来 xff0c PID无疑是我从学习板子至今遇到最困难的东西了 xff0c 并不是说它原理有多么复杂 xff0c 只是想让小车的效果更佳 xff0c 调参的过程无疑是漫长而艰难的 连续调了俩天的参数
  • Lua 字符串

    Lua 字符串 参考至菜鸟教程 字符串或串 String 是由数字 字母 下划线组成的一串字符 Lua 语言中字符串可以使用以下三种方式来表示 xff1a 单引号间的一串字符 双引号间的一串字符 与 间的一串字符 以上三种方式的字符串实例如
  • Lua 迭代器

    Lua 迭代器 参考文章 xff1a 菜鸟教程 https cloud tencent com developer article 2203215 迭代器 xff08 iterator xff09 是一种对象 xff0c 它能够用来遍历标准
  • Lua table(表)

    Lua table 表 参考至菜鸟教程 Lua table 使用关联型数组 xff0c 你可以用任意类型的值来作数组的索引 xff0c 但这个值不能是 nil Lua table 是不固定大小的 xff0c 你可以根据自己需要进行扩容 Lu
  • Lua 模块与包

    Lua 模块与包 参考至菜鸟教程 模块类似于一个封装库 xff0c 从 Lua 5 1 开始 xff0c Lua 加入了标准的模块管理机制 xff0c 可以把一些公用的代码放在一个文件里 xff0c 以 API 接口的形式在其他地方调用 x
  • Lua 文件I/O

    Lua 文件I O 参考至菜鸟教程 Lua I O 库用于读取和处理文件 分为简单模式 xff08 和C一样 xff09 完全模式 简单模式 xff08 simple model xff09 拥有一个当前输入文件和一个当前输出文件 xff0
  • Lua 错误处理

    Lua 错误处理 参考至菜鸟教程 程序运行中错误处理是必要的 xff0c 在我们进行文件操作 xff0c 数据转移及web service 调用过程中都会出现不可预期的错误 如果不注重错误信息的处理 xff0c 就会造成信息泄露 xff0c
  • Lua 调试(Debug)

    Lua 调试 Debug 参考至菜鸟教程 Lua 提供了 debug 库用于提供创建我们自定义调试器的功能 Lua 本身并未有内置的调试器 xff0c 但很多开发者共享了他们的 Lua 调试器代码 Lua 中 debug 库包含以下函数 x
  • Lua 垃圾回收

    Lua 垃圾回收 参考至菜鸟教程 Lua 采用了自动内存管理 这意味着你不用操心新创建的对象需要的内存如何分配出来 xff0c 也不用考虑在对象不再被使用后怎样释放它们所占用的内存 Lua运行了一个垃圾收集器来收集所有死对象 xff08 即
  • Lua 面向对象(详解)

    Lua 面向对象 xff08 详解 xff09 参考文章 xff1a https blog csdn net linxinfa article details 103254828 https zhuanlan zhihu com p 115
  • Lua实现矩阵的加减乘除

    Lua实现矩阵的加减乘除 参考文章 xff1a https blog csdn net qq 54180412 article details 122943327 https www bilibili com video BV1434y18
  • ubuntu系统配置大恒相机驱动并读取ros话题

    文章目录 0 说明1 安装大恒相机sdk1 1 下载1 2 安装sdk 用于配置ip和调试相机参数 1 电脑网卡配置 网卡固定ip 2 查看相机图像以及配置相机参数 2 安装ros驱动包 注 xff1a 大恒相机官方没ros驱动 2 0 正
  • C++类对象与Lua之间的交互

    C 43 43 类对象与Lua之间的交互 C语言与Lua进行交互 xff0c 我们可以相对轻易的做到 xff0c 但在实际应用中我们更加偏向于使用C 43 43 与Lua进行交互 xff0c 面向对象编程 关于C语言与Lua之间的调用交互实
  • C++与Lua交互实例 -- 矩阵的加减乘除(版本一)

    C 43 43 与Lua交互实例 矩阵的加减乘除 xff08 版本一 xff09 关于lua中封装的类模板以及相关知识可参考以下链接 xff1a https ufgnix0802 blog csdn net article details
  • C++与Lua交互实例 -- 矩阵的加减乘除(版本二)

    C 43 43 与Lua交互实例 矩阵的加减乘除 xff08 版本二 xff09 TIPS xff1a 关于使用矩阵的加减乘除测试C 43 43 与Lua的交互以及下面没讲述到的知识点可以阅读第一版 xff1a https blog csd
  • Windows下LuaBridge2.8的环境配置及简单应用

    Windows下LuaBridge2 8的环境配置及简单应用 LuaBridge2 8下载链接 xff1a https github com vinniefalco LuaBridge tags 关于Lua的环境配置可参考以下链接 xff0

随机推荐

  • Lua 开发过程中常见坑

    Lua 开发过程中常见坑 Lua next span class token keyword return span G span class token punctuation span span class token function
  • 私网与公网地址转换

    私网与公网地址转换 NAT概述NAT功能静态NAT动态NATEASYIP xff08 多个内网地址对一个接口 xff09 PAT端口多路复用 NAT概述 NAT xff08 Network Address Translation xff0c
  • VWmare安装CentOS7及连接Xshell超详细过程(图文)

    VWmare安装CentOS7及连接Xshell超详细过程 xff08 图文 xff09 前言一 准备工作二 安装虚拟机过程 1 选择文件 xff0c 新建虚拟机 2 选择配置类型 3 自定义硬件配置 4 进入系统安装界面 二 连接Xshe
  • rpm与yum

    rpm与yum 前言一 应用程序与命令系统的关系二 典型应用程序的目录结构三 常见的软件封装类型四 rpm 1 概述 2 命令概述 3 查询rpm软件包信息 查询已安装的rpm软件信息 查询未安装的rpm软件包文件中的信息 安装 升级 卸载
  • Linux用户与权限管理

    Linux用户与权限管理 前言一 管理用户账号 1 用户账号概述 用户标识UID xff08 User IDentity xff0c 用户标识号 xff09 用户账号文件 2 用户账号管理 添加用户账号 xff08 useradd xff0
  • yum源仓库

    yum源仓库 前言一 yum介绍一 yum源的提供方式 1 配置本地仓库 2 配置ftp源 三 yum命令 1 yum常用的操作 2 搜索软件包命令 3 安装升级 4 软件卸载 5 yun history命令 总结 前言 yum相对与rpm
  • C++常见问题的总结

    1 C语言跟C 43 43 的关系 xff1a xff08 1 xff09 C语言跟C 43 43 的本质区别 xff1a 1 xff09 c更倾向于面向过程 xff0c c 43 43 是面向过程 43 面向对象 43 泛型编程 2 xf
  • Nginx Rewrite

    Nginx Rewrite 前言一 nginx rewrite概述 1 概述 2 跳转场景 3 跳转实现 4 rewrite实际场景 nginx跳转需要的实现方式 rewrite放在server if location 段中 对域名或参数字
  • Dockerfile概念简介

    Dockerfile概念简介 前言一 dockerfile概念二 Docker镜像的创建 1 基于现有镜像创建 2 基于本地模板创建 3 基于dockerfile创建 dockerfile结构 xff08 四部分 xff09 构建镜像命令
  • 【云原生之k8s】k8s基础详解

    云原生之k8s k8s基础详解 前言一 kubernetes介绍 1 kubernetes简介 2 应用部署方式的演变 二 kubernetes组件 1 kubernetes架构 2 master组件 apiserver controlle
  • 【云原生之k8s】kubeadm搭建k8s集群

    云原生之k8s kubeadm搭建k8s集群 前言一 集群介绍 1 集群搭建方法 2 集群架构 二 集群部署 1 环境部署 所有节点 xff0c 关闭防火墙规则 xff0c 关闭selinux xff0c 关闭swap交换 修改主机名 xf
  • 【云原生之k8s】k8s管理工具kubectl详解

    云原生之k8s k8s管理工具kubectl详解 前言一 陈述式管理 1 陈述式资源管理方法 2 k8s相关信息查看 查看版本信息 查看节点信息 查看资源对象简写 查看集群信息 配置kubectl自动补全 查看日志 基本信息查看1 查看ma
  • 关于结构体指针与STM32外设的笔记

    96 define RCC RCC TypeDef RCC BASE xff09 96 逐步分解这句代码的含义 RCC TypeDef RCC BAS 其中 RCC BAS定义为 define RCC BASE AHBPERIPH BASE
  • visual studio与visual c++ 6.0的区别

    xfeff xfeff Visual Studio支持多种语言 xff0c Visual C 43 43 6 0 只支持C和C 43 43 Visual C 43 43 6 0 是Visual Studio 6 0的一个组成部分 xff0c
  • GD32F303 移植 FreeRTOS

    文章目录 1 准备工作1 1 软件版本1 2 源码下载1 3 基础工程 3 FreeRTOS 移植3 1 复制需要的内核文件3 2 添加文件到 Keil 工程3 3 添加 FreeRTOSConfig h 内核配置文件3 4 配置任务调度相
  • FreeRTOS 之 heap_4 踩坑之路

    参考博文连接 xff1a FreeRTOS系列 heap 4 c 内存管理分析FreeRTOS Heap 1 2 3 4 5 比较 示例工程代码库地址如下 xff1a GiteeGit 1 问题描述 博主在使用 heap 4 的 pvPor
  • GD32F30x Keil 环境下在 FreeRTOS 任务中使用浮点运算报 HardFault 异常的问题(二)

    文章目录 1 问题描述1 1 环境1 2 问题 2 参考资料3 来龙去脉3 1 定位问题3 2 xPortPendSVHandler3 3 EXC RETURN3 4 寄存器3 5 探索真像3 5 1 浮点任务切换到空闲任务3 5 2 空闲
  • 辛勤劳作

    本文只有在12月27日可以学习到 我对敬业的体会是 xff1a 正在从事的工作就是自己的生命 xff0c 它意味着每周7天 xff0c 每年52周一心扑在上面 写下上面这句话 xff0c 我的泪水差一点儿就涌了出来 14年的寿险生涯 xff
  • 无人机开发资料推荐

    作者 xff1a BlueSky 链接 xff1a https www zhihu com question 30084079 answer 52762050 来源 xff1a 知乎 著作权归作者所有 商业转载请联系作者获得授权 xff0c
  • STM32移植使用mbedtls-2.24.0

    STM32移植使用mbedtls 2 24 0 目录 STM32移植使用mbedtls 2 24 0 xff08 1 xff09 关于PolarSSL xff08 2 xff09 mbedtls移植 xff08 3 xff09 移植测试 扫