13 个版本

0.1.14 2023 年 9 月 19 日
0.1.13 2023 年 8 月 12 日
0.1.11 2023 年 7 月 24 日
0.1.9 2022 年 11 月 15 日
0.1.4 2021 年 1 月 22 日

#352 in WebAssembly


用于 2 crates

自定义许可证

245KB
6.5K SLoC

WASI-Crypto 宿主函数示例实现(Rust 版本)

这是一个 WebAssembly 加密扩展的 Rust 实现。

它旨在与 WasmEdge 实现 兼容。

这些扩展显著提高了 WebAssembly 中加密操作效率,同时利用内存隔离、旁路攻击保护和专用硬件支持。

这些 API 是稳定的,并且被设计得简单易用,任何编程语言都可以轻松使用。它们还最大限度地减少了使用加密原语不安全的风险。

当前实现专注于 WebAssembly 中加密最常见的用例。它们将加密操作的速度提高了 100 倍,以及如 JWT 和 Passkeys 这样的认证系统。它们为任何应用都提供了即时和实质性的好处。

计划添加新的功能,但我们预计这些将是渐进式的添加,不需要对使用当前 API 的应用进行任何更改。

API 文档

主要文档在此: WASI 加密 API

它包括 规范 以及各种格式中的所有类型和函数原型。

为了自动生成代码和文档,目前提供了 WITX 0.9 和 WITX 0.10 格式的接口描述。WAI 和 WIT 的翻译将随后进行。

wasi-crypto crate

此目录中的代码也可以在 crates.io 上找到: wasi-crypto

建议将其用作依赖项

wasi-crypto = "0.1"

crate 文档可以在线阅读: wasi-crypto 文档

CryptoCtx 是定义所有函数的地方。它们与规范紧密匹配,充当文档。

wasi-crypto crate 可以在原生应用程序中使用,就像常规加密库一样。

以下是一个使用示例

use wasi_crypto::{CryptoCtx, CryptoError};
use ct_codecs::{Encoder, Hex};

fn main() -> Result<(), CryptoError> {
    let ctx = CryptoCtx::new();
    let h = ctx.symmetric_state_open("SHA-256", None, None)?;
    ctx.symmetric_state_absorb(h, b"Hello, world!")?;
    let mut digest = [0u8; 32];
    ctx.symmetric_state_squeeze(h, &mut digest)?;
    println!("SHA-256 digest: {}", Hex::encode_to_string(digest).unwrap());
    Ok(())
}

使用 WebAssembly 时,可以在以下模块中找到完全相同的功能和相同的接口

  • wasi_ephemeral_crypto_common
  • wasi_ephemeral_crypto_asymmetric_common
  • wasi_ephemeral_crypto_asymmetric_kx
  • wasi_ephemeral_crypto_asymmetric_signatures
  • wasi_ephemeral_crypto_asymmetric_symmetric

例如,包括 Rust 的抽象层可以在以下位置找到:[WASI-Crypto 的语言绑定](https://github.com/wasm-crypto/wasi-crypto-bindings)。

与 Wasmtime 一起使用

wasi-crypto 库在 CryptoCtx 命名空间中公开了标准的 Rust API。

但 WebAssembly 运行时需要不同的 API。

这就是为什么该库还实现了 Rust API 和其他 API 之间的粘合层("接口")。

已实现的第一层粘合层是为 Wasmtime 运行时。为了编译它,在编译库时添加 wasmtime cargo 功能。

wasi-crypto = { version = "0.1", features = ["wasmtime"] }

当在用 Rust 编写的项目中使用 wasmtime 时,可以通过类似核心 WASI 函数的方式启用加密扩展,使用 add_to_linker() 函数。

在此处可以找到使用 Rust 中的 wasmtime、WASI 和 WASI-Crypto 的示例代码:[wasmtime 库使用示例](https://github.com/wasm-crypto/wasmtime-crypto/tree/wasi-crypto/wasmtime-crate-usage-example)。

由于 Wasmtime 还不支持插件,因此无法将新宿主函数添加到命令行工具或 libwasmtime 库中,该库用于非 Rust 编写的项目。

为了方便,[wasmtime-crypto](https://github.com/wasm-crypto/wasmtime-crypto) 是支持 wasi-cryptowasmtime 的稳定版本。

这包括 wasmtime 命令以及 libwasmtime 库。

对于 wasmtime 的每个主要版本都需要不同的粘合层(wiggle 库不是独立维护的),并且相同的库在 Rust 中不很好地支持多个版本。这就是为什么我们只为 wasmtime 的稳定版本提供代码,因为它们发布到 crates.io

依赖关系

~34–53MB
~1M SLoC