#wasi #nodejs

crypto-wasi

使用 nodejs 的 crypto 风格的 wasi-crypto 包装器

2 个版本

0.1.1 2024年1月24日
0.1.0 2022年12月22日

#492WebAssembly

MIT 许可证

245KB
3.5K SLoC

crypto-wasi

crypto-wasi 是 nodejs 的 crypto 模块在 wasm32-wasi 上的 api 子集,使用 rust 实现,由 WASI 密码学 API 提供支持。


lib.rs:

crypto-wasi 是 nodejs 的 crypto 模块在 wasm32-wasi 上的 api 子集,使用 rust 实现,由 WASI 密码学 API 提供支持。此库在 WasmEdge 运行时开发和测试

注意:此库的 api 与 nodejs 的 api 不完全一致。

目前实现的子集

  • [Hash] (sha256, sha512, sha512-256)
  • [Hmac] (sha256, sha512)
  • [hkdf] (sha256, sha512)
  • [pbkdf2] (sha256, sha512)
  • scrypt
  • [Cipheriv] & [Decipheriv] (aes-128-gcm, aes-256-gcm, chacha20-poly1305)
  • [generate_key_pair] (rsa-[2048, 3072, 4096], rsa-pss-[2048, 3072, 4096], ecdsa-[prime256v1, secp256k1, secp384r1], ed25519, x25519)
  • 密钥对象 ([PublicKey] & [PrivateKey])
  • [sign] & [verify]
  • [diffie_hellman]

正在工作中

  • create_public_key & create_private_key
  • ECDH (可以使用 generate_key_pair 和 diffie_hellman 作为替代)

未实现

  • createCipher & createDecipher:此函数对所有支持的加密方式都是语义上不安全的,对于计数器模式(如 CTR、GCM 或 CCM)中的加密方式则是致命的缺陷。
  • generateKey & createSecretKey:在 nodejs 中,SecretKey 只存储原始密钥数据。在 wasi-crypto 中,SymmetricKey 等同于 SecretKey,在 WasmEdge 的实现中也只是存储原始密钥数据。但在 wasi-crypto 中,每个密钥都需要绑定到一种算法,这在使用密钥和密钥重用时造成了一些复杂性。因此,我们不打算实现 SecretKey

已知问题

  • ECDSA_P384_SHA384 密钥作为 Jwk 导出:椭圆曲线例程:ec_GFp_simple_point2oct:缓冲区太小
  • ECDSA_P384_SHA384 在 sign & verify 中实际上使用 sha256 作为摘要

依赖关系

~1MB
~18K SLoC