1个不稳定版本

0.1.0 2022年7月23日

#1866 in 加密学

自定义许可证

1.5MB
27K SLoC

C 16K SLoC // 0.3% comments GNU Style Assembly 9K SLoC // 0.0% comments Rust 1.5K SLoC // 0.0% comments Bitbake 1K SLoC // 0.0% comments Rusty Object Notation 27 SLoC

dilithium-raw 许可证 dilithium-raw on crates.io dilithium-raw on docs.rs

后量子签名方案dilithium的低级库。

使用经过轻微修改的C代码(由构建脚本编译)作为实际实现,API已修改以将用户对所需随机性的控制权放在首位。

该库具有最小化的依赖关系:在默认配置(不包含serde支持)下,仅包含cty

安全性

警告:此crate旨在作为实现原语并暴露“不易误用”的API的低级crate,以提供用户最大控制。仅在您了解自己在做什么的情况下使用!始终阅读文档中的安全部分。否则请使用高级包装器。

警告:此crate尚未经过正确性审计。C代码是从备受推崇的pqclean项目复制的,但自那时起已进行了修改。

自行承担风险!

使用方法

API位于dilithiumX模块中,其中X为{2,3,5}。要生成密钥对,请使用generate_keypair。注意:它需要一个填充有加密安全随机字节的缓冲区。随机缓冲区不会被修改,因此零化留给用户。示例

use dilithium_raw::dilithium5::generate_keypair;
use rand::rngs::OsRng;
use rand::Rng;
use zeroize::Zeroize;

// fill buffer of 128 bytes with secure random data
let mut random = [0; 128];
OsRng.fill(&mut random[..]);

// generate keypair
let (pubkey, seckey) = generate_keypair(&mut random);

// zeroize the buffer with random data
random.zeroize();

要使用私钥签名消息,请使用sign,要使用公钥验证它,请使用verifyverify对于有效签名返回Ok,对于无效签名返回Err。示例

use dilithium_raw::dilithium5::{sign, verify};

// snip, get a `pubkey` and `seckey` with the public and secret key respectively

let msg = "hello world";
let sig = sign(msg, &seckey);
assert!(verify(msg, &sig, &pubkey).is_ok());

依赖项