《密码技术与物联网安全:mbedtls开发实战》 —2.9 Zephyr mbedtls 示例

举报
华章计算机 发表于 2019/12/16 14:37:18 2019/12/16
【摘要】 本节书摘来自华章计算机《密码技术与物联网安全:mbedtls开发实战》 一书中第2章,第2.9.1节,作者是徐 凯 崔红鹏 。

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应用示例相关文件描述

image.png

 

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


【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。