#signature #fips #key-pair #hash #generate-keys #send-message

无std fips205

FIPS 205(草案):无状态基于哈希的数字签名标准

3个版本

0.1.2 2024年3月15日
0.1.1 2024年2月10日
0.1.0 2023年12月30日

#725 in 密码学

MIT/Apache

420KB
1.5K SLoC

IntegrityChain: FIPS 205无状态基于哈希的数字签名标准

crate Docs Build Status Apache2/MIT licensed Rust Version

FIPS 205(初始公开草案)是专为服务器、桌面、浏览器和嵌入式应用程序编写的纯Rust实现的FIPS 205无状态基于哈希的数字签名标准。代码仓库包括C FFI和Python绑定。

这个crate使用纯Rust实现了FIPS 205 草案标准,具有最小和主流依赖。所有十二组(!)安全参数集都是完全功能的。该实现不需要标准库,例如,不需要#[no_std],没有堆分配,例如不需要alloc,并公开了RNG,因此适用于从服务器到裸机的所有应用程序。API已稳定,代码偏向于安全性和正确性;随着标准的成熟,将实现进一步的性能优化。此crate将迅速跟踪FIPS 205的任何更改。

有关目标功能的完整描述,请参阅https://nvlpubs.nist.gov/nistpubs/FIPS/NIST.FIPS.205.ipd.pdf

功能非常简单易用,如下例所示。

use fips205::slh_dsa_shake_128s; // Could use any of the twelve security parameter sets. 
use fips205::traits::{SerDes, Signer, Verifier};
# use std::error::Error;
#
# fn main() -> Result<(), Box<dyn Error>> {

let msg_bytes = [0u8, 1, 2, 3, 4, 5, 6, 7];

// Generate key pair and signature
let (pk1, sk) = slh_dsa_shake_128s::try_keygen_vt()?;  // Generate both public and secret keys
let sig_bytes = sk.try_sign_ct(&msg_bytes, true)?;  // Use the secret key to generate signature

// Serialize the public key, and send with message and signature bytes
let (pk_send, msg_send, sig_send) = (pk1.into_bytes(), msg_bytes, sig_bytes);
let (pk_recv, msg_recv, sig_recv) = (pk_send, msg_send, sig_send);

// Deserialize the public key, then use it to verify the msg signature
let pk2 = slh_dsa_shake_128s::PublicKey::try_from_bytes(&pk_recv)?;
let v = pk2.try_verify_vt(&msg_recv, &sig_recv)?;
assert!(v); 
# Ok(())
# }

详细的Rust 文档位于以下每个对应于所需安全参数模块下。

注意

  • 这个crate完全功能齐全,与FIPS 205的第一个初始公开草案相对应。
  • 恒时保证仅针对源代码级别,并且是正在进行的工作。
  • 请注意,FIPS 205在第3.1节中对随机性有具体要求,因此公开了RNG
  • 需要Rust 1.70或更高版本。最低支持的Rust版本可能会在未来更改,但将以次要版本号的增加方式进行。
  • 此库的所有默认功能均受SemVer保护。
  • 此软件是实验性的,仍在积极开发中 - 使用风险自负!

许可证

内容根据您的选择,受Apache License 2.0或MIT许可证的许可。

贡献

除非您明确说明,否则根据Apache-2.0许可证定义,您有意提交以包含在本工作中的任何贡献,将双重许可如上所述,没有任何额外条款或条件。

依赖项

~1.5-2.2MB
~31K SLoC