请选择 进入手机版 | 继续访问电脑版
查看: 1455|回复: 0

如何实现支持AES加密功能的CST工具

[复制链接]
  • TA的每日心情
    开心
    2024-3-26 15:16
  • 签到天数: 266 天

    [LV.8]以坛为家I

    3298

    主题

    6545

    帖子

    0

    管理员

    Rank: 9Rank: 9Rank: 9

    积分
    32003
    最后登录
    2024-4-9
    发表于 2019-7-15 08:56:58 | 显示全部楼层 |阅读模式
    恩智浦的i.MX RT系列处理器集成了许多安全特性,来实现高度安全启动(HAB)机制。作为启动ROM的一个重要功能,高度安全启动(HAB)保证只有通过安全验证的软件才能够运行。


    HAB由HAB库和CST工具两部分组成。前者是i.MX RT芯片的ROM程序的一部分,后者是运行在PC上的一套基于命令行的工具。CST工具用来对运行在RT上的软件进行签名或加密。由于美国政府对AES加密模块的出口控制,CST官方发布包中的CST工具,不包含对软件进行AES加密的功能。但是加密启动要求先对软件进行AES加密。


    本文介绍如何自己编译一个带AES加密功能的CST工具。


    1. CST的组成结构

    CST组成结构如图一所示。可以看出CST由两部分组成:前端(Front End)和后端(Back Ended)。前端是CST工具中恩智浦专有操作部分;后端则包含所有标准的加密操作部分。


    后端利用标准加密协议,允许使用通用的加密库。CST工具使用OpenSSL库来做和数字签名相关的加密操作。


    i.MX RT的加密启动,要求程序映像文件必须采用CCM模式的ASE加密算法,CST工具中的该算法使用的是Brain Gladman的AES库。
    1.png
    图1.        CST工具的组成框图


    恩智浦官网下载的CST工具包中的CST工具,本质上只是一个参考实现,但是它满足绝大多数情况的使用。


    在某些情况下,如果HAB代码签名的密钥要求更高的保护等级,这时标准的CST工具已经无法提供该要求所需的保护等级。客户需要为这样的要求,自行实现新的CST工具。CST工具的两层结构,方便客户根据需要实现自己的CST工具。


    要实现定制化的CST工具,客户需要修改后端组件,不仅包括可以替代OpenSSL命令、OpenSSL库、和AES库,而且特别是后端中的Adaptation Layer必须实现,且能向前端提供和标准的CST工具后端等同的功能。


    CST发布包中包括了CST工具中,恩智浦专有操作部分的前端库。该库文件提供有32位的Linux版本、64位的Linux版本和32位的Windows版本,分别位于/<os>/lib/libfrontend.a。CST工具的NXP标准实现的后端部分,其源代码和头文件则位于/code/back_end中。客户可以以该源码为基础,实现自己定制的后端来代替标准的后端实现。


    2. 编译支持AES加密的CST工具



    由于CST发布包中不包括AES加密功能,因此CST发布包中的CST工具不能加密程序映像文件。如果试图用它对程序加密,会得到如下错误消息。
    2.png
    图2. 默认的CST不支持AES加密


    如果要使CST工具支持对程序映像文件的加密,需要重新编译CST工具,并添加AES加密功能。根据前面对CST结构的描述,带加密功能的CST工具可以通过重新编译后端源代码并连接AES加密库来得到。


    2.1. Windows下编译新的CST工具


    Windows版本的前端库文件是在MinGW32环境中用GCC编译的。预编译的库文件位于/mingw32/lib/libfrontend.a。


    首先,按照下面的步骤建立MinGW32的编译环境。如果你的电脑已有MinGW32编译环境,直接跳到本节的第9步检查并确保当前编译环境满足条件。


    www.msys2.org下载安装文件并根据指示安装,其中x86_64是64位Windows版本的,i686是32位Windows版本的。按照本地Windows系统的版本,选择一个适合的安装文件安装。


    可以在安装过程中选中“Run MSYS2 now”来运行MSYS2,或安装完成后从Windows的开始菜单选择“MSYS2 MSYS”来手动运行MSYS2。


    在MSYS2的Shell窗口中运行下面命令,更新MSYS2的数据包和核心系统包:



        pacman -Syu
    3.png
    输入 y 安装所有的更新。
    4.png
    更新过程中,可能需要关掉MSYS2终端窗口,然后重新运行MSYS2 MSYS。用下面命令继续更新软件包:


          pacman -Su
    5.png

    安装编译操作需要的标准包,在Shell窗口中键入下面命令,按回车键默认选择安装列出的所有包。


        pacman -S –-needed base-devel


    安装32位Windows版本的GCC编译工具,按 y 安装所有的依赖软件包。


        pacman -S mingw-w64-i686-gcc
    6.png
    关掉MSYS2 终端窗口,从Windows开始菜单运行 MSYS2 MinGW 32-bit,启动 32位的Windows编译环境MingGW32。



    检查GCC和Perl版本,满足下图所示的32位Windows编译环境。
    7.png
    接下来需要编译OpenSSL库


    CST工具产生HAB签名私钥和公钥证书要求的OpenSSL的版本是1.0.x版本。下面步骤用来编译OpenSSL库:



    www.openssl.org下载最新的openssl-1.0.x,当前最新版本是openssl-1.0.2o.tar.gz。
    8.png
    将openssl-1.0.2o.tar.gz拷贝到home文件夹。在MSYS2的Shell窗口中运行cd & pwd命令可以返回home文件夹,并得到home文件夹的路径。


    从Windows开始菜单中运行MSYS2 MinGW 32-bit,或者如果MinGW32已经运行,运行cd命令将当前工作目录切换到home目录。


    解压OpenSSL的源代码并编译OpenSSL库,在Shell窗口中依次运行下面命令:


      tar -zxvf openssl-1.0.2o.tar.gz


      cd openssl-1.0.2o


      ./config


      make


    运行下面命令检查libcrypto.a文件是否已经在当前目录中生成:


      ls -al | grep lib


    拷贝ms/applink.c文件到include/openssl目录中:



      cp ms/applink.c include/oppenssl
    9.png
    至此,我们可以重新编译CST工具来添加AES加密功能。


    从恩智浦官网www.nxp.com下载最新版的CST工具。目前最新版是 3.0.1。


    www.nxp.com下载cst-3.0.1.tgz


    拷贝cst-3.0.1.tgz到home目录。


    从Windows开始菜单中运行MSYS2 MinGW 32-bit,或者如果MinGW32已经运行,运行cd命令将当前工作目录切换的到home目录。


    解压CST发布包到home目录,并用下列命令编译新的带AES加密功能的CST工具:


    tar -zxvf cst-3.0.1.tgz


    cd release/code/back_end/src


    gcc *.c -o cst.exe -I ../hdr -I ../../../../openssl-1.0.2o/include -L ../../../mingw32/lib -L ../../../../openssl-1.0.2o -lfrontend -lcrypto -lgdi32 -static


    运行ls | grep cst 命令列出在当前目录中生成的cst.exe文件。
    10.png
    拷贝cst.exe 文件到release/mingw32/bin文件夹覆盖原来的cst.exe。建议覆盖之前,先备份原来的cst.exe文件。


    2.2. Linux下编译新的CST工具


    Linux下编译新的CST工具的步骤和Windows下的步骤类似,只是Linux环境不需要先建立MSYS2环境。


    下面给出的是64位Linux环境下编译新的CST工具的步骤。


    第一步是使用下面的命令来编译生成libcrypto.a库文件:


    tar -zxvf openssl-1.0.2o.tar.gz


    cd openssl-1.0.2o


    ./config


    make


    然后用下面的命令来编译新的CST工具。最后一步产生的cst文件支持AES加密功能,可以替代CST发布包中的cst可执行文件:


    tar -zxvf cst-3.0.1.tgz


    cd release/code/back_end/src


    gcc *.c -o cst -I ../hdr -I ../../../../openssl-1.0.2o/include -L ../../../linux64/lib -L ../../../../openssl-1.0.2o -lfrontend -lcrypto -ldl -no-pie


    如果当前Linux系统是32位版本,编译新CST工具的步骤和命令和上面给出的一样。唯一不同的地方就是最后一条命令中的linux64要换成linux32 。


    3. 结束语


    本文简单介绍了CST加密工具的组成结构,并分别介绍了如何编译生成支持AES加密功能的CST工具。


    关于如何使用CST加密工具,对运行在RT上的软件进行签名或加密,小编将会在后续的文章中介绍。



    i.MX RT内容回顾


    作者:Howard Liu     文章出处:恩智浦MCU加油站

    签到签到
    回复

    使用道具 举报

    您需要登录后才可以回帖 注册/登录

    本版积分规则

    关闭

    站长推荐上一条 /4 下一条

    Archiver|手机版|小黑屋|恩智浦技术社区

    GMT+8, 2024-4-19 08:43 , Processed in 0.111451 second(s), 20 queries , MemCache On.

    Powered by Discuz! X3.4

    Copyright © 2001-2021, Tencent Cloud.

    快速回复 返回顶部 返回列表