wolfSSL/wolfBoot
GitHub: wolfSSL/wolfBoot
wolfBoot 是一个安全引导加载程序,用于微控制器固件的安全更新。
Stars: 497 | Forks: 150
# wolfBoot
wolfSSL 安全引导加载程序 ([主页](https://www.wolfssl.com/products/wolfboot/),[手册](https://www.wolfssl.com/documentation/manuals/wolfboot/),[wolfBoot-examples](https://github.com/wolfSSL/wolfBoot-examples))
wolfBoot 是一个可移植的、与操作系统无关的安全引导加载程序解决方案,适用于 32 位微控制器,
依赖于 wolfCrypt 进行固件认证,提供固件更新机制。
由于引导加载程序的设计简约以及微小的 HAL API,wolfBoot 完全独立
于任何操作系统或裸机应用程序,并且可以轻松地移植和集成到现有的嵌入式软件
项目中,以提供安全的固件更新机制。
基于 [RFC 9019](https://datatracker.ietf.org/doc/rfc9019/) 设计 - 物联网固件更新架构。
## 功能
- 闪存设备的多槽分区
- 固件映像(们)的完整性验证
- 使用 wolfCrypt 的数字签名算法(DSA)对固件映像(们)进行真实性验证
- 最小化硬件抽象层(HAL)接口,以促进跨不同供应商/微控制器的可移植性
- 从辅助槽复制/交换映像到主槽以同意固件更新操作
- 在主槽中就地链式加载固件映像
- 支持可信平台模块(TPM)
- 支持测量引导,将固件映像哈希存储到 TPM 平台配置寄存器(PCR)
## 组件
此存储库包含以下组件:
- wolfBoot 引导加载程序
- 密钥生成和映像签名工具(需要 python 3.x 和 wolfcrypt-py https://github.com/wolfSSL/wolfcrypt-py)
- 裸机测试应用程序
### wolfBoot 引导加载程序
wolfBoot 是一个内存安全的独立裸机应用程序,设计用于在通用微控制器上运行,
没有动态内存分配机制或与任何标准 C 库(除了 wolfCrypt)的链接。
引导加载程序由以下组件组成:
- wolfCrypt,用于验证映像的签名
- 一个最小化的硬件抽象层,为支持的特定目标提供实现,负责 IAP 闪存访问和特定 MCU 上的时钟设置
- 核心引导加载程序
- 一个小型应用程序库,由应用程序用于与引导加载程序交互 [src/libwolfboot.c](src/libwolfboot.c)
## 要求
确保已安装适当的工具链。有关特定平台的详细信息,请参阅 [docs](./docs/README.md)。
## 在现有项目中集成 wolfBoot
### 必需步骤
- 查看 `docs/Targets.md` 以获取参考实现示例。
- 为目标平台提供 HAL 实现(请参阅 [硬件抽象层](docs/HAL.md))
- 决定闪存分区策略,并相应地修改 `include/target.h`(请参阅 [闪存分区](docs/flash_partitions.md))
- 更改固件映像的入口点以考虑引导加载程序的存在
- 为应用程序配备 [wolfBoot 库](docs/API.md) 以与引导加载程序交互
- [配置和编译](docs/compile.md) 一个可引导映像,只需一个 "make" 命令
- 有关签名固件的帮助,请参阅 [wolfBoot 签名](docs/Signing.md)
- 有关启用测量引导,请参阅 [wolfBoot 测量引导](docs/measured_boot.md)
### 提供的示例
在 GitHub wolfBoot-examples 存储库中提供更多示例 [此处](https://github.com/wolfSSL/wolfBoot-examples)。
以下步骤在默认的 `Makefile` 目标中自动执行,使用裸机测试
应用程序作为示例来创建工厂映像。通过运行 `make`,构建系统将:
- 使用 `ed25519_keygen` 工具创建 Ed25519 密钥对
- 编译引导加载程序。在上面的步骤中生成的公钥包含在构建中
- 编译测试应用程序中的固件映像 [test\_app](test-app/)
- 将固件重新链接以更改入口点为主分区起始地址
- 使用 `ed25519_sign` 工具对固件映像进行签名
- 通过连接引导加载程序和固件映像来创建工厂映像
工厂映像可以闪存到目标设备。它包含引导加载程序和签名的初始
固件在闪存中指定的地址。
`sign.py` 工具将可引导固件映像转换为符合引导加载程序所需的固件映像格式。
有关固件映像格式的详细信息,请参阅 [固件映像](docs/firmware_image.md)
有关目标系统配置选项的详细信息,请参阅 [编译 wolfBoot](docs/compile.md)
### 升级固件
- 编译新的固件映像,并将其链接到主分区起始地址
- 使用为工厂映像生成的私钥使用 `sign.py` 工具对固件进行签名
- 使用安全连接传输映像,并将其存储到辅助固件槽
- 使用 libwolfboot `wolfBoot_update_trigger()` 函数触发映像交换。有关操作的说明,请参阅 [wolfBoot 库 API](docs/API.md)
- 重新启动以让引导加载程序开始映像交换
- 使用 libwolfboot `wolfBoot_success()` 函数确认更新的成功。有关操作的说明,请参阅 [wolfBoot 库 API](docs/API.md)
- 有关固件更新实现的更多详细信息,请参阅 [固件更新](docs/firmware_update.md)
### 其他功能
- [远程外部闪存接口](docs/remote_flash.md)
- [外部加密分区](docs/encrypted_partitions.md)
- [Delta 更新](docs/firmware_update.md#incremental-updates-aka-delta-updates)
## 构建
### Git 子模块(仅 GitHub 克隆)
如果您从 GitHub 克隆了 wolfBoot(而不是使用发布包),您需要首先初始化和更新 git 子模块:
```
git submodule update --init
```
此步骤是在构建之前拉取必要依赖项所必需的。
### Makefile
要使用 Makefile 构建,请在 wolfBoot 根目录中创建一个 `.config` 文件,其中包含您的构建规范。您可以在 [config/examples](config/examples) 中找到许多可以使用的示例。然后运行 `make keytools` 以生成签名
和密钥生成工具。如果您已安装 wolfCrypt-py 并希望使用它,您可以跳过此步骤。
有关 `.config` 中使用的闪存配置选项的文档,请参阅 [docs/compile.md](docs/compile.md)。
例如,要使用我们提供的 `stm32h7.config` 构建:
```
cp config/examples/stm32h7.config .config
make keytools
make
```
## CMake
请参阅 [docs/CMake](./docs/CMake.md) 和 [cmake includes](./cmake/README.md)。
## 故障排除
1. 签名密钥时出现 Python 错误:
```
Traceback (most recent call last):
File "tools/keytools/keygen.py", line 135, in
rsa = ciphers.RsaPrivate.make_key(2048)
AttributeError: type object 'RsaPrivate' has no attribute 'make_key'
```
```
Traceback (most recent call last):
File "tools/keytools/sign.py", line 189, in
r, s = ecc.sign_raw(digest)
AttributeError: 'EccPrivate' object has no attribute 'sign_raw'
```
您需要在此处安装最新的 wolfcrypt-py:https://github.com/wolfSSL/wolfcrypt-py
使用 `pip3 install wolfcrypt`。
或者,要基于本地 wolfSSL 安装进行安装,请使用:
```
cd wolfssl
./configure --enable-keygen --enable-rsa --enable-ecc --enable-ed25519 --enable-des3 CFLAGS="-DFP_MAX_BITS=8192 -DWOLFSSL_PUBLIC_MP"
make
sudo make install
cd wolfcrypt-py
USE_LOCAL_WOLFSSL=/usr/local pip3 install .
```
2. 密钥算法不匹配:
错误 `Key algorithm mismatch. Remove old keys via 'make keysclean'` 表示当前 `.config` `SIGN` 算法与生成的 `src/keystore.c` 文件中的内容不匹配。
使用 `make keysclean` 删除密钥并重新生成。
3. 无法打开编译器生成的文件 ... 权限被拒绝
这可能是由于同时打开多个环境,或者防病毒软件引起的。
尝试手动删除相应的构建目录,或重新启动您的 IDE。
```
sp_c32.c : fatal error C1083: Cannot open compiler generated file: '... sp_c32.obj': Permission denied
```
4. unresolved external symbol __imp____acrt_iob_fun
```
unresolved external symbol __imp____acrt_iob_func referenced in function _main
```
5. expected expression before ';' around WOLFBOOT_PARTITION_BOOT_ADDRESS
搜索 `#define WOLFBOOT_PARTITION_BOOT_ADDRESS` 无值。
有时失败的配置会生成一个坏文件。(通常是 `target.h`)
将文件重命名为 `.bak` 扩展名,并让构建过程生成一个新的。
考虑删除整个构建目录。
```
/src/libwolfboot.c:724:64: error: expected expression before ';' token
724 | address = (uint32_t)WOLFBOOT_PARTITION_BOOT_ADDRESS;
```
6. 'stdint.h': No such file or directory
检查 `PREFERRED_HOST_CC_NAME_LIST` 中的编译器顺序。
请参阅日志中的 `HOST_CC`。
对于 Visual Studio,需要激活开发人员命令提示符。
```
\wolfBoot\tools\keytools\sign.c(33): fatal error C1083: Cannot open include file: 'stdio.h': No such file or directory
```
## 发布说明
### v1.0 (2018-12-04)
* 初始发布,具有故障安全更新,HAL 支持STM32 和 nRF52
### V1.1 (2019-03-27)
* 添加了对 ECC-256 DSA 的支持
* 添加了对外部(例如 SPI)闪存的更新/交换支持
* 通过版本号提供防回滚保护
* 硬件支持
* 添加了对 Cortex-M0 的编译选项
* 新 HAL:Atmel SamR21
* 新 HAL:TI cc26x2
* 新 HAL:NXP/Freescale Kinetis SDK
* 改进了签名/更新工具的兼容性(Windows)
### V1.2 (2019-07-30)
* 添加了对多个架构的支持
* 密钥生成和签名工具用 python 重新编写,以提高可移植性
* 添加了将闪存写入函数移动到 RAM 的编译时选项
* 引入了引导加载程序可以更新自己的可能性
* 修复了 macOS 和 WSL 上的编译问题
* 硬件支持
* 添加了 RV32 RISC-V 架构
* 添加了对 STM32F76x/77x 上的硬件辅助双银行支持
* 新 HAL:RV32 FE310(SiFive HiFive-1)
* 新 HAL:STM32L0
* 新 HAL:STM32G0
* 新 HAL:STM32F7
### V1.3 (2019-11-13)
* 基于 `make config` 的新配置机制,有助于创建和存储特定目标的配置
* 提供了多个现有平台的配置示例
* 修复了在使用 SPI 闪存时自我更新机制中的错误
* 引入了对硬件辅助签名验证的支持,使用公钥硬件加速器
* 添加了对 STM32 PKA(例如 STM32WB55)的支持
* 添加了对 Kinetis/Freescale PKHA(例如 Kinetis K82F)的支持
### V1.4 (2020-01-06)
* TPM2.0 支持
* 与 wolfTPM 集成
* 扩展了 STM32 SPI 驱动程序以支持双 TPM/FLASH 通信
* 在 STM32 上测试了 Infineon 9670
* RSA 2048 位数字签名验证
* 硬件支持
* 新 HAL:STM32H7
### V1.5 (2020-04-28)
* RSA 4096 位数字签名验证
* SHA3
* 可移植的 C 密钥管理工具
* 改进了与 Microsoft Windows 的集成
* Visual Studio 解决方案用于密钥管理工具
* 支持使用 IAR 编译
* 修复了不兼容的代码
* 添加了 IAR 示例项目
* 新架构:ARMv8(64 位)
* ARM Cortex-A 引导代码与 TrustZone 兼容
* Linux 阶段和设备树支持
* 外部闪存抽象
* 通过 UART 访问的远程更新分区
* 硬件支持
* 新 HAL:raspberry-pi
* 新 HAL:Xilinx Zynq+
* 新 HAL:NXP LPC54xx
### V1.6 (2020-08-25)
* 支持加密外部分区
* 支持在 ARM Cortex-M 平台上使用 MPU
* 支持使用包含 ASN.1 编码头部的 RSA 签名
* 支持从外部闪存更新引导加载程序:SPI 函数可以从 RAM 运行
* 添加了 TPM RSA 验证支持
* 添加了使用软件 SHA 与 TPM 结合使用的选项
* 修复了紧急更新中的逻辑
* 修复了引导加载程序更新中的循环逻辑
* 修复了映像头边界检查(防止解析溢出)
* 改进了映像头中对齐字段的健康检查
* 添加了对映像头解析器的单元测试
* 修复了 Ed25519 签名工具
* 修复了 RSA keygen 工具
* wolfTPM 集成:改进和错误修复
* 修复了 STM32WB 的配置和文档
* 修复了 NVM_FLASH_WRITEONCE 模式中的尾随器的对齐
* 修复了在具有非常小的闪存页面的平台上 uint16_t 索引溢出
* 修复了在 Windows 上构建 C 密钥工具的问题
* 修复了 LPC 驱动程序:在闪存写入中正确对齐页面
* 硬件支持
* 新 HAL:Cypress psoc6
* 支持 psoc6 硬件加密加速器
* SPI 驱动程序:Nordic nRF52
### V1.7.1 (2021-02-03)
* 添加了对通过 TPM 进行测量引导的支持
* 支持在 Cortex-m33 上的 TZEN
* 添加了禁用备份/回滚的选项
* 添加了 `FLAGS_HOME` 选项以将 UPDATE 标志存储在 BOOT 分区中
* Zynq:添加了对 eFuse 的支持
* Zynq:改进了调试
* Xilinx:支持 BSP QSPI 驱动程序
* 更新了用户文档
* 扩展了在 Jenkins 上运行的自动非回归测试的覆盖范围
* 修复了 wolfTPM 集成:使用自定义设置
* 修复了启用加密时的回滚操作
* 修复了 STM32L5xx 上的 DUALBANK 模式
* 修复了最大映像大小检查
* 修复了 STM32H7 驱动程序中的错误纠正闪存写入的绕过
* 硬件支持
* 新 ARCH:ARMv8-m(Cortex-m33)
* 新 HAL:STM32L5xx
* 新 HAL:NXP iMX-RT1060
* SPI 驱动程序:STM32L0x3
* Uart 驱动程序:STM32L0x3
### V1.8 (2021-07-19)
* 使用 SP进行 RSA4096
* 更新 RSA 以使用内联操作并禁用 OAEP 填充
* 内存模型:删除了 ECC 和 RSA 操作对 XMALLOC/XFREE 的依赖
* 添加了 `WOLFBOOT_SMALL_STACK` 编译时选项,以使用硬编码的缓冲区
* 添加了 `SIGN=NONE` 选项以在编译时禁用安全引导
* 修复了自我更新文档
* 添加了配置选项组合的测试用例
* 硬件支持
* 新 ARCH:PowerPC
* 新 ARCH:ARM Cortex-R
* 新 HAL:NXP T2080
* 新 HAL:TI TMS570LC435
* STM32H7:更正 BANK2 偏移
### V1.9 (2021-11-09)
* Delta/增量更新
* 修复了密钥工具
* 更新 IAR IDE 项目
* 文档更新和修复
* API 函数名称与代码匹配
* STM32L5 更新
* 硬件支持
* 新 HAL:STM32L4
* TMS570LC43xx:使用 `NVM_FLASH_WRITEONCE` 更新进度和
修复堆栈指针初始化
### V1.10 (2022-01-10)
* Delta 更新:扩展文档 + 错误修复
* 支持 Ed448 签名验证
* 硬件支持:
* STM32G0 的安全内存模式
* 修复了 STM32L5 在双银行模式下的错误
* UEFI 支持:wolfBoot 作为 x86_64 上的 EFI 应用程序
* 修复了 Cortex-R5 中的自我更新
* 修复了 PSOC-6 构建中的 HW 支持回归
### V1.11 (2022-04-05)
* 针对故障注入和 glitching 攻击的缓解措施
(https://www.wolfssl.com/secure-boot-glitching-attacks/)
* 支持 AES128 和 AES256 用于更新加密
* 支持 ECC384 签名验证
* 支持 SHA2-384 用于映像哈希
* 修复了 delta 更新中字段在清单中的对齐
* 将映像大小传播到签名工具
* 基于 renode.io 和 github actions 添加了测试自动化
* 硬件支持
* 新 HAL:STM32U5
* 新 HAL:NXP i.MX-RT1050
* 修复 risc-V 32位端口(缺少包含)
* 修复 STM32L4(VTOR 对齐;libwolfboot 中的时钟设置冲突)
* STM32H7:改进 HAL 和文档
### V1.12 (2022-07-26)
* 加密 delta 更新
* 支持 RSA3072 签名验证
* 支持分区 ID 以包括自定义附加映像
* 新格式以存储多个公钥,使用密钥库
* 对密钥工具和 IDE 支持进行了多项修复
* 添加了新的测试用例
* 硬件支持
* 新 HAL:模拟目标,用于快速测试
### V1.13 (2022-11-08)
* 修复了 IAR 签名脚本
* 添加了对加密自我更新的支持
* 支持 NAII 68PPC2 与 NXP T2080 在 DEOS 上
* 修复了 Xilinx QSPI 支持
* 修复了 API 在外部闪存支持中的使用
* 修复了加密 delta 更新中的错误
* 将 wolfCrypt 更新到 wolfSSL 子模块 v5.5.3
### V1.14 (2022-12-30)
* 添加了对 CMake 构建的支持
* STM32U5:支持外部闪存
* STM32H7:支持 QSPI 闪存
* 支持 NXP QoriQ P1021
* 清理和改进 DEOS 在 t2080 上的支持
* Docker 测试:重构
* Github Actions:添加了大多数可用配置的构建检查
* 将 wolfTPM 更新到 v.2.7.0
* 将 wolfCrypt 更新到 wolfSSL v.5.5.4
### V1.15 (2023-
标签:CVE, DNS解析, RFC 9019, TPM支持, wolfCrypt, wolfSSL, 固件分区, 固件更新, 固件更新架构, 固件认证, 安全启动, 安全启动机制, 完整性验证, 客户端加密, 嵌入式系统, 开源项目, 微控制器, 数字签名, 测量启动, 物联网, 硬件抽象层