#wasm-module #signature #webasm #security

wasm-sign

WebAssembly模块签名和验证工具,用于证明WebAssembly字节的真实性和完整性。签名作为自定义部分附加到模块的末尾。签名模块可以通过网络传输。解析签名模块的接收者将“看到”一个类型为0、名称为“signature”的额外自定义部分。签名增加了118字节的额外开销。

2个不稳定版本

使用旧的Rust 2015

0.2.0 2018年2月21日
0.1.0 2018年2月14日

#978 in WebAssembly


wasm-sign-cli中使用

Apache-2.0

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