15个版本 (6个重大更新)

0.7.1 2024年6月21日
0.6.0 2024年3月10日
0.3.0 2023年10月28日
0.2.1 2023年7月17日
0.1.0 2022年12月16日

#176密码学

Download history 11/week @ 2024-04-19 2/week @ 2024-05-24 1/week @ 2024-05-31 127/week @ 2024-06-21 3/week @ 2024-06-28 14/week @ 2024-07-05 74/week @ 2024-07-26 6/week @ 2024-08-02

每月80次下载

MIT/Apache

160KB
3.5K SLoC

安全帧(SFrame)

build version Crates.io license documentation maintenance

该库实现了draft-ietf-sframe-enc-09,并提供了一个适用于WebRTC会议的全端加密机制。它从原始的goto-opensource/secure-frame-rs分叉而来,并在此继续。

支持的加密库

目前支持两种加密库

  • ring
    • 默认启用,通过ring功能
    • 支持编译到Wasm32
    • 不支持Aes-CTR模式加密
  • openssl
    • 通过openssl功能启用
      • 例如,使用cargo build --features openssl --no-default-features
    • 使用Rust绑定到OpenSSL。
    • 默认情况下,OpenSSL库是在本地编译后静态链接的。构建过程需要一个C编译器,perl(以及perl-core),和make。有关其他选项,请参阅openssl crate文档
    • 编译到Wasm32尚未支持

两者不能同时启用,因此在冲突时sframe会引发编译器错误。

用法

根据您的用例,此库提供了两种不同的API。

发送器/接收器API

此API提供了一个易于使用的接口,用于访问Sframe实现。发送器/接收器

  • 模型数据路径中的sframe加密/解密块,见sframe草案09 4.1
  • 推导并存储必要的Sframe密钥
  • 保持一个内部、动态的缓冲区,一次加密/解密一个帧
  • 提供自sframe草案09 5.1以来的拉链支持
  • 可选的帧验证(在解密前)
  • 例如,您可以使用它们这样做
...

let key_id = 123;
let key_material = "pw123";
let skipped_payload = 1; // payload bytes which are skipped for encryption
let media_frame = b"SOME DATA";

let mut sender = Sender::new(key_id);
sender.set_encryption_key(key_material).unwrap();
let encrypted_frame = sender
  .encrypt(media_frame, skipped_payload)
  .unwrap();

let mut receiver = Receiver::default();
receiver
    .set_encryption_key(key_id, key_material)
    .unwrap();
let decrypted_frame = receiver.decrypt(encrypted_frame, skipped_payload).unwrap();

assert_eq!(media_frame, decrypted_frame);

有关更多选项,请参阅加密解密示例

基于帧的API

此API提供了对帧级别的加密和解密的低级访问,提供了细粒度的控制。它允许使用任意缓冲区,从而创建视图以避免不必要的复制

  • MediaFrameView用于未加密数据
  • EncryptedFrameView用于加密数据

对于加密和解密,必须提供一个实现了FrameBuffer特质的缓冲区以分配必要的内存。为了方便起见,这个特质已经为Vec<u8>实现了。例如

...

let key_id = 42u64;
let enc_key = EncryptionKey::derive_from(CipherSuiteVariant::AesGcm256Sha512, key_id, "pw123").unwrap();
let dec_key = DecryptionKey::derive_from(CipherSuiteVariant::AesGcm256Sha512, key_id, "pw123").unwrap();

let frame_count = 1u8;
let payload = "Something secret";

let mut encrypt_buffer = Vec::new();
let mut decrypt_buffer = Vec::new();
let media_frame = MediaFrameView::new(frame_count, payload);

let encrypted_frame = media_frame.encrypt_into(&enc_key, &mut encrypt_buffer).unwrap();

let decrypted_media_frame = encrypted_frame
  .decrypt_into(&mut dec_key, &mut decrypt_buffer)
  .unwrap();

assert_eq!(decrypted_media_frame, media_frame);

  • MediaFrame用于未加密数据
  • EncryptedFrame用于加密数据

要查看API如何与另一种缓冲区类型一起使用,您可以查看bip_frame_buffer示例

基准测试

位于./benchescriterion基准测试目前测试

  • 使用所有可用的密码套件和不同帧大小的加密/解密
  • 使用所有可用的密码套件进行密钥推导
  • 头部(反)序列化

它们使用Bencher Perf Page持续跟踪:sframe-rs的解密 - Bencher sframe-rs的加密 - Bencher sframe-rs的密钥推导 - Bencher

贡献

欢迎以描述性和友好性的问题或全面的拉取请求的形式提供任何帮助!

本库的变更日志是由其提交日志生成的,任何提交消息都必须符合 https://www.conventionalcommits.org/en/v1.0.0/。为了简化,您可以使用 convco 来提交您的提交。

许可证

根据您选择的Apache许可证2.0版或MIT许可证。
除非您明确声明,否则您根据Apache-2.0许可证定义的任何有意提交以包含在本项目中的贡献,将按上述方式双重许可,不附加任何额外条款或条件。

依赖项

~6–15MB
~270K SLoC