#firmware #signing #manifest #verification #specification #applications #packaging

no-std bin+lib fwsig

固件签名/验证的规范(和工具)

3个不稳定版本

0.2.1 2023年1月9日
0.2.0 2023年1月9日
0.1.0 2023年1月2日

#40 in #packaging

MPL-2.0 许可证

45KB
841

fwsig,简单的固件签名和验证

fwsig 提供了一个简单的规范,用于支持固件清单的签名和验证,包括签名和验证这些清单的工具,以及用于解析和使用这些清单的库。

状态

由于初始规范尚待审查/实际应用,稳定性尚未保证。如果您有问题/建议/需求,请打开问题!

ci Crates.io Docs.rs

用法

签名固件

待办事项

使用 fwsig

待办事项

设计

fwsig 提供了一个简单的常长度清单,描述了一个应用程序以及(可选的)相关元数据和签名密钥对的公钥,并对整个对象进行了签名。

元数据支持允许将相关元信息打包到应用程序中,以便加载和执行,例如应用程序名称和版本、支持的设备以及设备配置。由于应用程序需求不同,元数据编码未指定,但可能提供特定格式(如JSON或CBOR)的帮助器。

有关实现细节,请参阅rust 参考实现

打包应用程序

通常首先生成和签名一个清单,然后将二进制固件、元数据和清单对象连接起来(尽管这些组件可能根据需要分别分发)。

  ┌───────────────────────────────────────────────┐
  │ Application                                   │
  │  ┌──────────┐   ┌──────────┐   ┌──────────┐   │
  │  │ Firmware │ + │ Metadata │ + │ Manifest │   │
  │  └──────────┘   └──────────┘   └──────────┘   │
  └───────────────────────────────────────────────┘

要加载应用程序包,首先使用文件末尾的常长度作为偏移量解析清单,确保对清单对象的签名有效,验证签名密钥[^1],然后使用清单中的长度和校验和来加载固件和元数据组件

[^1]:生产固件包含一个受信任密钥列表,以及一种信任用户密钥的机制,以便进行安全最终用户自定义。开发固件也可能允许未受信任的临时密钥。

清单格式

清单是一个212字节的常长度小端对象,包括清单信息、应用程序名称和版本字符串、应用程序和元数据的长度和校验和以及签名密钥和签名。

有关详细布局,请参阅文档

为了简化解析,清单对象总是进行签名。如果没有提供受信任的密钥,将生成一个临时密钥用于签名操作,并设置 TRANSIENT_KEY 标志。

依赖项

~5–13MB
~153K SLoC