3个不稳定版本
0.2.1 | 2023年1月9日 |
---|---|
0.2.0 | 2023年1月9日 |
0.1.0 | 2023年1月2日 |
#40 in #packaging
45KB
841 行
fwsig,简单的固件签名和验证
fwsig
提供了一个简单的规范,用于支持固件清单的签名和验证,包括签名和验证这些清单的工具,以及用于解析和使用这些清单的库。
状态
由于初始规范尚待审查/实际应用,稳定性尚未保证。如果您有问题/建议/需求,请打开问题!
用法
签名固件
待办事项
使用 fwsig
待办事项
设计
fwsig
提供了一个简单的常长度清单,描述了一个应用程序以及(可选的)相关元数据和签名密钥对的公钥,并对整个对象进行了签名。
元数据支持允许将相关元信息打包到应用程序中,以便加载和执行,例如应用程序名称和版本、支持的设备以及设备配置。由于应用程序需求不同,元数据编码未指定,但可能提供特定格式(如JSON或CBOR)的帮助器。
有关实现细节,请参阅rust 参考实现。
打包应用程序
通常首先生成和签名一个清单,然后将二进制固件、元数据和清单对象连接起来(尽管这些组件可能根据需要分别分发)。
┌───────────────────────────────────────────────┐
│ Application │
│ ┌──────────┐ ┌──────────┐ ┌──────────┐ │
│ │ Firmware │ + │ Metadata │ + │ Manifest │ │
│ └──────────┘ └──────────┘ └──────────┘ │
└───────────────────────────────────────────────┘
要加载应用程序包,首先使用文件末尾的常长度作为偏移量解析清单,确保对清单对象的签名有效,验证签名密钥[^1],然后使用清单中的长度和校验和来加载固件和元数据组件
[^1]:生产固件应包含一个受信任密钥列表,以及一种信任用户密钥的机制,以便进行安全最终用户自定义。开发固件也可能允许未受信任的临时密钥。
清单格式
清单是一个212字节的常长度小端对象,包括清单信息、应用程序名称和版本字符串、应用程序和元数据的长度和校验和以及签名密钥和签名。
有关详细布局,请参阅文档。
为了简化解析,清单对象总是进行签名。如果没有提供受信任的密钥,将生成一个临时密钥用于签名操作,并设置 TRANSIENT_KEY
标志。
依赖项
~5–13MB
~153K SLoC