1个不稳定版本
使用旧的Rust 2015
0.2.0 | 2018年2月21日 |
---|
在 WebAssembly 中排名第1194
33KB
424 行
WebAssembly模块签名
本存储库描述了WebAssembly模块签名(WAMS)的设计和高级概述
概述
WebAssembly模块签名应证明WebAssembly模块(无论作为文件还是解析)的真实性和完整性。
要求
WebAssembly模块签名应提供以下功能
- 可以在不解析的情况下对WebAssembly模块文件进行签名
- 签名对静止数据和传输中的数据序列化、二进制形式的数据进行签名。
- 模块应完整无损地签名,包括所有自定义部分。
- 模块部分不应重新排序以满足规范形式。
- 所有模块签名应具有相同的字节数。
- 可以在不解析模块的情况下验证签名
- 可以使用简单的工具将WebAssembly模块分割为两部分,签名和签名内容
- 签名应使用ECDSA算法与SHA256。
- 公钥可以公开可用,并且可以使用DNS-TXT记录进行分发。
建议
- WebAssembly模块签名是一个自定义部分,类型ID为0,部分名称必须由9个字符组成,因此所有签名具有相同的字节数
- 模块应只包含一个签名(将来可能扩展)
- 签名对模块的所有部分进行签名,如原样。
- 名为“signature”的自定义部分(9个字符)是默认签名。
- 自定义部分的有效载荷包含ECDSA签名;整个部分具有字节数118。
- 新的签名部分应仅附加到模块末尾。
- 从模块字节码中移除最后118个字节,签名部分将被剪除。
- 工具应支持初始版本的secp256k1,并在未来版本中支持Ed25519和secp384r1(因此预留了末尾的字节)
每个签名部分由118个字节序列组成
字段 | 字节 |
---|---|
部分类型(自定义) | 0 |
部分大小 | 116 |
部分名称长度 | 9 |
部分名称字节[9] | [115, 105, 103, 110, 97, 116, 117, 114, 101] (读作“签名”) |
签名类型 | 0 代表 ECDSA/SHA256,最大摘要长度为 72 字节 |
签名长度 | 单字节值 72 或更少 |
签名 | [...] |
填充字节 | 0..33 填充字节,将摘要长度扩展到最多 104 字节(secp384r1) |
签名始终附加在 WASM 文件的末尾。如果接收到已签名的 WASM 文件,可以截断最后 118 个字符以获取 WASM-Signature 部分。以下索引允许使用命令行工具或 JavaScript 验证签名,而无需解析 WASM 模块字节码
- 索引 0..11 固定字节序列
[0, 116, 9, 115, 105, 103, 110, 97, 116, 117, 114, 101]
- 索引 12 SIGNATURE_TYPE(目前唯一有效的值是 '0',表示曲线 secp256k1/SHA256)
- 索引 13 DIGEST_DATA_LENGTH,可能介于 65..104 之间(如果使用 secp256k1 通常为 70、71 或 72)
- 索引 14 DIGEST_DATA_START,摘要的第一个字节
- 索引 14+DIGEST_DATA_LENGTH,摘要的结尾
如果摘要的字节大小为 72(secp256k1),则前导部分如下(之后是 ECDSA 摘要)
[0, 116, 9, 115, 105, 103, 110, 97, 116, 117, 114, 101, 0, 72 ]
摘要使用 secp256k1/SHA256 密码计算。尾部填充字节填满至总长度 118 字节。
用法
私钥生成
这是必须保密的密钥,用于签名字节码文件。
openssl ecparam -name secp256k1 -genkey -noout -out signerkey.pem
公钥生成
这是应该发布或嵌入到您应用程序中的密钥。
openssl ec -in signerkey.pem -pubout -outform pem -out signerkey.pub.pem
签名 WASM 文件
命令行工具在成功时返回退出码 0,否则返回错误码 1
wasm-sign -k signerkey.pem module.wasm signed-module.wasm
验证 WASM 文件
命令行工具在成功时返回退出码 0,否则返回错误码 1
wasm-sign -v -k signerkey.pub.pem signed-module.wasm
签名示例
输出 hexdump -C signed-module.wasm
00000110
00000120 xx xx xx xx xx xx xx 00 74 09 73 69 67 6e 61 74 |j$......t.signat|
00000130 75 72 65 00 47 30 45 02 20 58 20 79 4b 91 52 39 |ure.G0E. X yK.R9|
00000140 75 52 69 f0 cf dc 81 8a 7c d8 ab 08 1d 49 ab c2 |uRi.....|....I..|
00000150 fa 19 79 f5 03 92 e9 9b 87 02 21 00 8f a0 ad 5a |..y.......!....Z|
00000160 f2 55 ce cf c6 ed 82 15 5a ed 7a 47 43 d9 e5 4e |.U......Z.zGC..N|
00000170 fd 74 79 e8 80 4e 82 9c 08 eb 8e 9a 00 00 00 00 |.ty..N..........|
00000180 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
00000190 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |.............. |
构建
cargo build --release
单元测试
cargo test
使用命令行工具进行端到端测试
make test
依赖项
~4–12MB
~141K SLoC