跳转到主要内容

微控制器安全起动 (Secure Boot) 的软硬件整合作法 – 以NuMicro M2351系列为例

cathy 提交于

Secure Bootloader 是一段被写在 Mask ROM 内无法被存取和更改的可开机程序代码。系统经由配置区设定为从 Secure Bootloader 启动后,便会启动 Secure Boot 验证机制,对存放在Flash Memory安全区域内的程序代码做开发者身分认证和代码完整性的验证。当 Secure 区域代码通过 Secure Boot 验证后,系统才会跳至 Secure 区域内执行被验证过的受保护代码,例如下图所示。

<center><img src="http://mcu.eetrend.com/files/2022-04/wen_zhang_/100559753-251068-1.png&…; alt=“微控制器安全起动 (Secure Boot) 的软硬件整合作法 – 以NuMicro M2351系列为例"></center>

如果下一阶段的启动代码没通过 Secure Boot 验证的检测,此时 Secure Bootloader 会执行USB/UART1 command 模式,等待接收并处理从 Secure ISPTool USB/UART1 接口送进来的 command。

另外在 Secure Bootloader 内有开放部分的 API,让程序开发人员可以直接使用这些已经在Secure Bootloader 代码内有提供的功能。

<center><img src="http://mcu.eetrend.com/files/2022-04/wen_zhang_/100559753-251069-2.png&…; alt=“微控制器安全起动 (Secure Boot) 的软硬件整合作法 – 以NuMicro M2351系列为例"></center>

本文将以M2351为范例介绍Secure Bootloader 和整个 M2351 内存之间的关系开始,之后会说明如何配置启动 Secure Bootloader、Secure Bootloader 工作频率、如何启动 Secure Boot 验证以及Secure Boot 验证时必要的配置和验证流程。最后会介绍 USB/UART1 command 模式的功能和特性。

<strong><font color="#38447a">位置和属性</font> </strong>

Secure Bootloader 代码被预写在 32KB Mask ROM 内,位置落在 0x0080_0000 ~ 0x0080_7FFF 间的 Secure 区域内,并被配置为 Execute-only memory (XOM) 属性,因此这段代码是无法被更改以及存取的。另外在 Secure Bootloader 运行过程中,会需要用到位于 0x2000_C000 至 0x2000_FFFF 共 16KB 的 Secure 内存。

<center><img src="http://mcu.eetrend.com/files/2022-04/wen_zhang_/100559753-251070-3.png&…; alt=“微控制器安全起动 (Secure Boot) 的软硬件整合作法 – 以NuMicro M2351系列为例"></center>

<strong><font color="#38447a">起始开机区选择</font> </strong>

M2351 User Configuration Block 是可以配置和系统启动选项相关的配置区块。在芯片上电后,CPU 执行任何代码之前,可以预先执行照配置区内所设定的动作。

因此透过更改配置区内 CBS (CONFIG0[7]) 和 MBS (CONFIG0[5]) 的设定,便可决定 M2351 在上电后的起始开机区域为何。

如要规划从 Secure Bootloader 启动开机,则只需将 MBS 配置为 0 后再做系统重置即可。否则系统起始开机区会由 CBS 的设定值来决定从 APROM 或 LDROM 启动。

<center><img src="http://mcu.eetrend.com/files/2022-04/wen_zhang_/100559753-251071-4.png&…; alt=“微控制器安全起动 (Secure Boot) 的软硬件整合作法 – 以NuMicro M2351系列为例"></center>

<strong><font color="#38447a">Bootloader 工作频率</font> </strong>

当起始开机区运行在 Secure Bootloader 时,系统的工作频率会切换为 48MHz。

如为有支持 USB 功能的芯片型号时,Secure Bootloader 启动后会先检测外部 HXT-12MHz 频率误差是否有小于 6% 后,再决定系统工作频率的时钟源。如外部 HXT-12MHz 频率误差小于 6%,则优先以此 HXT-12MHz 来产生 PLL-48MHz 的时钟源,并将此 PLL-48MHz 当作系统工作频率和 USB 装置的工作时钟源。

如果芯片没有支持 USB 功能,或是外部 HXT-12MHz 频率误差过大,则会转换成以内部 HIRC-12MHz 当作 PLL-48MHz 的时钟源,来当作是系统工作频率或是 USB 装置的工作时钟源。

<strong><font color="#38447a">启动 Secure Boot 验证</font> </strong>

系统从 Secure Bootloader 启动后,可以开启 Secure Boot 验证的机制。这目的主要是验证下一阶段要被执行的 Secure 代码是否有通过代码开发者身分认证和代码完整性的验证。如果要启动 Secure Boot 验证,除了设定从 Secure Bootloader 开机外,还需透过设置 Secure Region Lock 或者是 All Region Lock 来对系统的 Secure 区域做保护。

在 Secure 区域没有受到保护的情况下,Secure Bootloader 启动后是不会执行 Secure Boot 验证机制的。此时系统将会跳到 Secure Bootloader 内的 USB/UART1 command 模式,等待接收并处理 USB/UART1 command,而不会跳到其他区域内的代码作执行。

当启动 Secure Boot 验证下一阶段要被执行的 Secure 区域代码无误后,Secure Bootloader 将会参照配置区内 CBS (CONFIG0[7]) 的设定值来决定 CPU重启之后是要执行 Secure APROM 或是 Secure LDROM 内的代码。

如果 Secure Boot 验证过程中有错误产生,则系统也一样会跳到 Secure Bootloader内 的USB/UART1 command模式,等待接收并处理 USB/UART1 command。

下面表格为 MBS、SCRLOCK、ARLOCK、CBS 和系统起始开机区的关系表:

<center><img src="http://mcu.eetrend.com/files/2022-04/wen_zhang_/100559753-251072-5.png&…; alt=“微控制器安全起动 (Secure Boot) 的软硬件整合作法 – 以NuMicro M2351系列为例"></center>

<strong><font color="#38447a">Secure Boot 配置说明</font> </strong>

前面章节大致说明了如何将系统配置从 M2351 Secure Bootloader 启动,并开启 Secure Boot验证的功能。

下面的子章节将说明执行 Secure Boot 验证时的必要配置。

<strong><font color="#38447a">SBK – Secure Boot Key</font> </strong>

Secure Boot Key (SBK) 是一把对被 Secure Boot 验证的 Secure 区域代码 SHA-256 Hash 值做加密的 AES 加密安全密钥。

<ul>
<li>
<p>SBK安全密钥有效长度为 256-bits,只能被写入一次,无法被读出</p>
</li>
<li>
<p>如要更新此SBK安全密钥,只能做全芯片擦除后再做更新的操作</p>
</li>
</ul>

一定要有配置过SBK,后续的Secure Boot验证流程才可能会成功

<strong><font color="#38447a">IB – Information Block</font> </strong>

Information Block (IB) 为一块被写在 Secure APROM 后面的数据区块。

区块内容记录着被 Secure Boot 验证的受保护代码存放位置,以及一组 256-bits 的数字检查码。此 256-bits 数字检查码为受保护代码的 SHA-256 Hash 值再使用 Secure Boot Key (SBK) 做 AES-256 加密后的结果。

<ul>
<li>
<p>IB被记录在 Secure APROM 最后的 144 bytes</p>
</li>
<li>
<p>最多可配置 6 组受Secure Boot验证的代码区域,</p>
</li>
<li>
<p>IB内容内有一组checksum数据,可让Secure Bootloaer判断这组IB数据的正确性</p>
</li>
</ul>

如果没有正确的IB数据区块,Secure Bootloader将不会执行 Secure Boot验证流程

<strong><font color="#38447a">Secure Region Lock</font> </strong>

当系统安全属性有被配置为开启 Secure 区域保护时,Secure Bootloader 才会执行Secure Boot 验证。此时系统内的 Secure 区域代码将不能经由 ICE 界面被存取。

<ul>
<li>
<p>将SCRLOCK[7:0] 或是 ARLOCK[7:0] 任一组配置区改为非 0x5A后,Secure 区域代码将无法被 ICE 界面存取</p>
</li>
<li>
<p>只能做全芯片擦除后才可以解除Secure区域的保护</p>
</li>
<li>
<p>在没有开启Secure区域保护的系统里, Secure Bootloader将不会执行 Secure Boot验证流程</p>
</li>
</ul>

<strong><font color="#38447a">Secure Boot 验证流程</font> </strong>

下列步骤会说明 Secure Bootloader 执行 Secure Boot 验证的流程。

<ol>
<li>
<p>判断是否有开启 Secure 区域保护功能</p>
</li>
<li>
<p>判断是否有正确的IB 区块</p>
</li>
<li>
<p>依据 IB区块内的资料,判断要被保护代码的SHA-256 Hash值是否正确</p>
</li>
<li>
<p>如果代码的SHA-256 Hash值比对正确,CPU将会跳去执行这段代码。如果Hash值比对错误,则Secure Bootloader会进入USB/UART1 command模式,等待接收并处理 USB/UART1 command。</p>
</li>
</ol>

下列流程图将说明 Secure Bootloader启动后执行 Secure Boot 验证到最终执行 Trusted Boot Code 的过程,以及在 Secure Boot 验证过程中出现错误时的处理方式。

<center><img src="http://mcu.eetrend.com/files/2022-04/wen_zhang_/100559753-251073-6.png&…; alt=“微控制器安全起动 (Secure Boot) 的软硬件整合作法 – 以NuMicro M2351系列为例"></center>

<strong><font color="#38447a">USB/UART1 Command 模式说明</font> </strong>

M2351 Secure Bootloader 除了可执行 Secure Boot 验证外,另一个功能为进入 USB/UART1 command 模式做代码的更新和配置区的设定。

透过 PC 端的 Nuvoton NuMicro<sup>®</sup> Secure ISPTool 即可和 Secure Bootloader 内的 USB/UART1 command 模式做传输。

本章节将会对 USB/UART1 command 模式做基本的介绍。

<strong><font color="#38447a">USB 界面</font> </strong>

在 M2351 Secure Bootloader 提供的 USB command 模式内,用户无需做任何事先的配置,只要透过 USB 线和 PC 端的 Secure ISPTool 做连接后即可正常工作。

<strong><font color="#38447a">UART1 界面</font> </strong>

在使用 M2351 Secure Bootloader 提供的 UART1 command 模式前,则需将目前芯片 UART1 的脚位和 PC 串口做连接,之后便可和 Secure ISPTool 做正常联机。

<ul>
<li>
<p>可透过更改配置区CONFIG3[2:0] 来决定 UART1  command模式的脚位:</p>
</li>
<ul>
<li>
<p>000:UART1_TXD (PB.7),UART1_RXD (PB.6)</p>
</li>
<li>
<p>001:UART1_TXD (PA.9),UART1_RXD (PA.8)</p>
</li>
<li>
<p>010:UART1_TXD (PF.0), UART1_RXD (PF.1)</p>
</li>
<li>
<p>011:UART1_TXD (PB.3),UART1_RXD (PB.2)</p>
</li>
</ul>
</ul>

Others:UART1_TXD (PA.3),UART1_RXD (PA.2)

<strong><font color="#38447a">UART1/USB Command 流程</font> </strong>

下列流程图说明在 Secure Bootloader 程序内的 UART1/USB Command 模式和 PC 端的 Secure ISPTool 联机后的主要处理流程。

<center><img src="http://mcu.eetrend.com/files/2022-04/wen_zhang_/100559753-251074-7.png&…; alt=“微控制器安全起动 (Secure Boot) 的软硬件整合作法 – 以NuMicro M2351系列为例"></center>

以上透过 M2351 Secure Boot 验证的程序为例,详细解释系统开发商如何确保必须要受到保护的开机代码没有被更改,意即可以确认系统启动后的行为都在程序开发者的规划内,进而可以达到数据不被窃取的目的。另由于M2351系列为带TrustZone功能,对Non-secure 程序开发者而言,另可以使用 Secure Bootloader 提供的 Non-secure callable API 来实现对 Non-secure 内存的读写和其他配置区的设定。不需要 Secure 程序开发者额外提供这些应用的 API 给 Non-secure 程序开发者使用。

而终端产品的应用可能是没有预留 ICE 脚位的。此时如果有需要做代码的更新,即可以执行 Secure Bootloader Non-secure callable API 所提供的 USB/UART1 command模式和 PC 端的Nuvoton NuMicro<sup>®</sup> Secure ISPTool 来实现代码的更新。

欢迎关注新唐的产品官网以获取更多的讯息,我们也会继续介绍M2354系列的安全启动做法。

<strong><font color="#38447a">资源</font> </strong>

Nuvoton NuMicro M2351 和 M2354 系列资源:

M2351:<a href="https://www.nuvoton.com/products/microcontrollers/arm-cortex-m23-mcus/m…;

M2354:<a href="https://www.nuvoton.com/products/microcontrollers/arm-cortex-m23-mcus/m…;

来源:<a href="https://mp.weixin.qq.com/s/-c72TtPt9hkR4QXWLLbGfQ">新唐MCU</a&gt;
免责声明:本文为转载文章,转载此文目的在于传递更多信息,版权归原作者所有。本文所用视频、图片、文字如涉及作品版权问题,请联系小编进行处理(联系邮箱:cathy@eetrend.com)。