《密码技术与物联网安全:mbedtls开发实战》 —2.9 Zephyr mbedtls 示例
2.9 Zephyr mbedtls 示例
上一节已经说明了如何构建Zephyr应用,本节将在此基础上增加mbedtls相关的内容。在2.8节介绍了编写CMakeLists.txt和prj.conf的方法,这些方法在本节依然适用。与前面的示例不同,为了构建mbedtls相关示例,本节将修改prj.conf文件,并在该文件中增加mbedtls的编译选项。另外本节还将增加一个名为mbedtls_config.h的mbedtls配置文件。本节示例中的CMakeLists.txt、prj.conf和mbedtls_config.h文件都是不错的模板文件,后续章的示例都将以这些文件为基础。
2.9.1 Base64示例
让我们再次回到mbedtls的讨论中,之前的Zephyr示例中并没有mbedtls部分的内容,下面通过一个Base64示例说明如何在Zephyr环境下中使用mbedtls。与大多数Zephyr示例相似,此处包括CMakeLists.txt、prj.conf和src/main.c,除此之外还包括mbedtls_config.h配置文件。该示例目录结构如下,各文件描述如表2-7所示。
# 进入示例路径
$ cd 02_start/zephyr/base64
# 查看示例结构
$ tree -L 2
├── CMakeLists.txt
├── prj.conf
└── src
├── main.c
└── mbedtls_config.h
表2-7 Zephyr应用示例相关文件描述
1.示例代码
代码清单2-8与之前的Linux平台实现代码几乎相同,示例描述及接口描述在这里不做重复介绍。
代码清单2-8 main.c Base64编码与解码
#include <zephyr.h>
#include <stdio.h>
#include <string.h>
#include <stdint.h>
#include "mbedtls/base64.h"
#include "mbedtls/platform.h"
// 省略部分中间代码
int main(void)
{
size_t len;
uint8_t rst[512];
mbedtls_platform_set_printf(printf);
len = sizeof(msg);
dump_buf("\n base64 message: ", msg, len);
mbedtls_base64_encode(rst, sizeof(rst), &len, msg, len);
mbedtls_printf(" base64 encode : %s\n", rst);
mbedtls_base64_decode(rst, sizeof(rst), &len, rst, len);
dump_buf(" base64 decode : ", rst, len);
printf("\n");
return 0;
}
2.编写 mbedtls_config.h
该示例中增加一个名为mbedtls_config.h的mbedtls配置文件,该文件是一个典型的模板文件,在其他示例中将被反复使用。该模板文件可分为以下3部分。
Zephyr系统支持:保证mbedtls在Zephyr操作系统中正确运行,该部分一般保持不变,本书的其他示例也将沿用该部分定义;
mbedtls组件:此处增加了Base64支持,建议按需增加;
mbedtls配置文件检查:一般情况下需引入mbedtls/check_config.h,用于检查mbedtls配置参数之间的依赖关系,见代码清单2-9。该部分一般保持不变。
代码清单2-9 mbedtls_config.h
#define MBEDTLS_PLATFORM_C
#define MBEDTLS_PLATFORM_MEMORY
#define MBEDTLS_MEMORY_BUFFER_ALLOC_C
#define MBEDTLS_PLATFORM_NO_STD_FUNCTIONS
#define MBEDTLS_PLATFORM_EXIT_ALT
#define MBEDTLS_NO_PLATFORM_ENTROPY
#define MBEDTLS_NO_DEFAULT_ENTROPY_SOURCES
#define MBEDTLS_PLATFORM_PRINTF_ALT
#define MBEDTLS_BASE64_C
1)MBEDTLS_PLATFORM_C 启用平台抽象接口,使能该参数后,用户可重新定义calloc/free等接口。
2)MBEDTLS_PLATFORM_MEMORY 启用内存分配接口,使能该参数后用户可以自己实现calloc/free接口,并通过宏定义替换或通过接口设置方式进行替换。
3)MBEDTLS_MEMORY_BUFFER_ALLOC_C 启用mbedtls自带的内存分配接口,该参数适用于那些没有动态内存分配功能的嵌入式平台。
4)MBEDTLS_PLATFORM_NO_STD_FUNCTIONS 不使用标准库函数,如calloc/free等接口。
5)MBEDTLS_PLATFORM_EXIT_ALT 使能exit接口替换,使能后允许平台设置exit接口。
6)MBEDTLS_NO_PLATFORM_ENTROPY不使用内置的熵源,开启该宏定义后需要通过接口添加自定义熵源接口。
7)MBEDTLS_NO_DEFAULT_ENTROPY_SOURCES 取消默认熵源功能,用户可通过接口添加自定义熵源接口。
8)MBEDTLS_PLATFORM_PRINTF_ALT使能printf接口替换,使能后允许用户使用mbedtls_platform_set_printf接口设置自定义printf函数。
9)MBEDTLS_BASE64_C 启用Base64功能。
3.编写 prj.conf
为了在Zephyr应用中集成mbedtls,需要在prj.conf配置文件中启用CONFIG_MBEDTLS和CONFIG_MBEDTLS_BUILTIN。默认情况下,Zephyr使用的mbedtls配置文件为{zephyr代码仓库}/ext/lib/crypto/mbedtls/configs config-mini-tls1_2.h,此处示例使用了自定义的配置文件mbedtls_config.h,所以还需要在prj.conf中定义CONFIG_MBEDTLS_CFG_FILE为mbedtls_config.h。此处的prj.conf文件也是一个典型的模板文件,其他章的示例将会在此模板文件上进行修改。
CONFIG_STDOUT_CONSOLE=y
CONFIG_MBEDTLS=y
CONFIG_MBEDTLS_BUILTIN=y
CONFIG_MBEDTLS_CFG_FILE="mbedtls_config.h"
4.编写 CMakeLists.txt文件
CMakeLists.txt和之前的构建文件大致相同,由于启用了mbedtls,并指定了自定义的mbedtls配置文件,所以还需要通过CMake的target_include_directories指令引入mbedtls配置文件所在的路径,否则在编译过程中将提示无法找到mbedtls_config.h。
cmake_minimum_required(VERSION 3.8.2)
include($ENV{ZEPHYR_BASE}/cmake/app/boilerplate.cmake NO_POLICY_SCOPE)
project(NONE)
if (CONFIG_MBEDTLS)
target_include_directories(mbedTLS INTERFACE ${PROJECT_SOURCE_DIR}/src)
endif()
target_sources(app PRIVATE src/main.c)
5.编译与运行
基础示例默认会运行在necluo_f429zi 平台,若需要运行在仿真平台只需将-DBOARD参数指定为native_posix即可,具体过程可回顾2.8.4节。编译过程完成时控制台将输出Flash和RAM的消耗情况,此时Base64示例仅消耗STM32F429ZI约14KB Flash空间和约4KB RAM空间。在后续章的示例中,我们还将关注mbedtls应用的Flash和RAM消耗情况。
应用程序将把运行结果输出至串口控制台,所以应用程序下载至开发板运行之前需新建终端,并通过minicom工具打开指定串口。操作指令如下:
# 请根据实际情况修改串口名称
$ sudo minicom -b 115200 -D /dev/ttyACM0
编译与运行过程如下:
# 进入示例代码文件夹
$ cd 02_start/zephyr/base64
# 新建一个build目录,用于存放临时文件
$ mkdir -p build && cd build
# 通过cmake指令生成nucleo_f429zi平台makefile文件
$ cmake -DBOARD=nucleo_f429zi ..
# 编译并查看资源消耗情况
$ make
Memory region Used Size Region Size %age Used
FLASH: 14400 B 2 MB 0.69%
CCM: 0 GB 64 KB 0.00%
SRAM: 4356 B 256 KB 1.66%
IDT_LIST: 200 B 2 KB 9.77%
# 下载到开发板运行
$ make flash
# 串口控制台输出
base64 message: 14 fb 9c 03 d9 7e
base64 encode : FPucA9l+
base64 decode : 14 fb 9c 03 d9 7e
- 点赞
- 收藏
- 关注作者
评论(0)