2个不稳定版本
使用旧的Rust 2015
0.2.0 | 2018年2月21日 |
---|---|
0.1.0 | 2018年2月14日 |
#978 in WebAssembly
在wasm-sign-cli中使用
19KB
243 行
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 ]
摘要使用 ciphers secp256k1/SHA256 计算。尾部填充字节填充到总长度为 118 字节。
用法
私钥生成
这是必须保密的密钥,用于签您的 WASM 文件。
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–13MB
~140K SLoC