关键字:安全启动、签名、OTP
1. 引言
官方WIKI中对安全启动的描述比较晦涩难懂,客户常常不能很好地理解如何开启安全启动。
本篇应用笔记将以尽量简洁的语言介绍如何基于Developer Package来开启这一功能。
2. 基本概念
所谓安全启动,通常包含两个层面的安全保证:
- 签名的安全保证:就是确保运行在板子上的软件是被特定用户授权过的软件,如果篡改过的
软件或者其他调试软件在没有获取用户签名的情况下,是不能运行在板子上的。
- 加密的安全保证:这是一个更高的安全启动,就是软件被加密了,板子上运行的软件是不能
被外界看到的,同时没有签名他们也不能运行未经签名的软件。目前MP15x只支持签名的安全保
证。
3. 硬件需求

如上图所示,STM32MP15x包含多种型号,只有STM32MP15xC/F系列的芯片才能支持安
全启动。
4. 开启安全启动
主要分为5个步骤:
-
生成authentication keys;
-
把 Hash (SHA256) of the ECC Public Key 烧录到 OTP中;
-
close 板子(这一步可以放到最后来做,为了测试方便,尽量先不要close板子);
-
准备签名的软件;
-
烧录软件验证
❖ 生成 authentication keys 文件(KeyGen tool - stm32mpu)
STM32MP15x需要的是ECC公钥的Hash值(PKH),ROM code会先用这个公钥的Hash
值来对比存在TF-A的STM32Header里面的公钥。

运用如下命令生成authentication keys,这几个key一定要保存好,将来bin文件的签名都
要依赖这一组keys,也要牢记保护密码。
STM32MP_KeyGen_CLI -pubk ./public.pem -prvk ./private.pem -hash ./pubKeyHash.bin -pwd test123
该工具需要通过安装STM32CubeProgrommer获取。
❖ 烧录公共keys的hash值到OTP
有以下几种烧录方式:
-
U-Boot stm32key command(link)
-
STM32CubeProgrammer(link)
-
U-Boot fuse command(link)
-
Secure Secret Provisioning

❖ 编译并生成带签名的TF-A文件(link1)
mbedTLS这个库是必须的。
获取mbedTLS库的方式有两种:
一是直接从github获取:https://github.com/Mbed-TLS/mbedtls 版本 2.28.1,然后
编译;
二是通过yocto 获取源码,然后编译,devtool modify mbedtls;devtool build
mbedtls。
PC $> MBEDTLS_DIR=<mbedtls path> make -f ../Makefile.sdk TRUSTED_BOARD_BOOT=1
TF_A_DEVICETREE= <board name> TF_A_CONFIG="optee sdcard emmc usb"
DEPLOYDIR=$FIP_DEPLOYDIR_ROOT/arm-trusted-firmware stm32
生成带签名的FSBL image:
PC $ > STM32_SigningTool_CLI -pubk <path to meta-st-stm32mp>key/stm32mp15/publicKey.pem
prvk <path to meta-st-stm32mp>key/stm32mp15/privateKey.pem -pwd <password> -t fsbl -bin arm
trusted-firmware/tf-a-<board name>-sdcard.stm32 -o arm-trusted-firmware/tf-a-<board name>
sdcard_Signed.stm32
带签名的tfa生成后烧录,重启板子,可以看到如下打印:

❖ 编译并生成带有签名的FIP文件(link2)
这个操作可以在TF-A源码目录下进行,文档可以参考(docs/plat/stm32mp1.rst)。
注:TF-A v2.8 版本以后TF-A源码目录下tools/cert_create/中将没有 cert_create工具
直接供用户使用,需要使用如下指令先生成 cert_create 工具。
PC $> cd <TF-A source code>
PC \> make OPENSSL_DIR=OECORE_NATIVE_SYSROOT/bin PLAT=stm32mp2 DEBUG=1
V=1 certtool
编译完毕后, tools/cert_create/路径下将会出现cert_create可执行文件。
再通过如下脚本生成各种证书:

然后通过如下脚本生成fip文件:

注意,该脚本缺少如下两个证书,需要手动添加:

编译成功后,把对应的FIP文件烧录到对应的分区,重启盒子能看到如下的打印:

❖ close板子
最后都验证成功后,可以close板子,参考这个wiki:
https://wiki.st.com/stm32mpu/wiki/How_to_secure_STM32_MPU#Close_the_device
意法半导体公司及其子公司 ("ST")保留随时对 ST 产品和 / 或本文档进行变更的权利,恕不另行通知。买方在订货之前应获取关于 ST 产品 的最新信息。 ST 产品的销售依照订单确认时的相关 ST 销售条款。 买方自行负责对 ST 产品的选择和使用, ST 概不承担与应用协助或买方产品设计相关的任何责任。 ST 不对任何知识产权进行任何明示或默示的授权或许可。 转售的 ST 产品如有不同于此处提供的信息的规定,将导致 ST 针对该产品授予的任何保证失效。 ST 和 ST 徽标是 ST 的商标。若需 ST 商标的更多信息,请参考 www.st.com/trademarks。所有其他产品或服务名称均为其 各自所有者的财 产。 本文档是ST中国本地团队的技术性文章,旨在交流与分享,并期望借此给予客户产品应用上足够的帮助或提醒。若文中内容存有局限或与ST 官网资料不一致,请以实际应用验证结果和ST官网最新发布的内容为准。您拥有完全自主权是否采纳本文档(包括代码,电路图等)信息,我 们也不承担因使用或采纳本文档内容而导致的任何风险。 本文档中的信息取代本文档所有早期版本中提供的信息。 © 2020 STMicroelectronics - 保留所有权利