#noise #disco #strobe #secret-key #no-std

nightly no-std disco-rs

无标准库的纯 Rust 实现 Disco 噪声协议扩展

6 个版本 (重大更改)

0.6.0 2022年9月1日
0.4.1 2022年8月14日
0.3.0 2022年8月4日
0.2.0 2022年1月30日
0.1.1 2022年1月26日

#1288 in 加密学

每月下载 24 次

Apache-2.0

170KB
2.5K SLoC

Disco-rs

这个软件包是一个无标准库的纯 Rust 实现 Disco 噪声协议扩展。它以完全通用方式实现,以便集成者(也就是您)可以插入底层加密库。这项功能尚未经过正式审计,因此应被视为实验性的,不适合生产使用。

这个实现的一个显著特点是支持了噪声规范第11节中列出的某些 高级特性。具体来说,这个软件包支持通道绑定、重新密钥和乱序传输消息。乱序传输消息的主要困难是跟踪已看到的非随机数以防御重放攻击。对于会话中的少量消息,这很简单,但长期会话中数百万或数十亿条消息使跟踪非随机数变得极其困难。在 test 文件夹中的示例实现使用简单的滑动窗口方法跟踪非随机数以供演示。

这个实现中的另一个创新细节是在每条消息的开始处使用“通道状态”作为32字节会话标识符。这个软件包使用 serde 进行完全支持以将会话序列化和反序列化到磁盘。因为序列化存储了完整的内部 keccak 状态,所以您必须将其视为密钥或其他类似秘密数据。在将会话序列化到持久存储之前,请调用 get_channel_state(true) 函数来获取32字节的入站通道状态,并使用它来索引存储的会话数据。然后,当您收到加密的 disco 消息时,您可以读取前32字节并知道从存储中反序列化哪个 Disco 会话以处理该消息。

这不是一个即插即用型解决方案。您需要编写一些代码来使其为您工作。这个crate中有五个特性,您必须使用自己选择的密码学库来实现。它们可以在src/tag.rs中找到:TagTaggedData,在src/key.rs中:KeyTypeKeyGeneratorKeyAgreement,以及在src/nonce.rs中:NonceGenerator。话虽如此,对于一些不耐烦的人来说,tests文件夹中有一个使用常见的x25519_dalek crate的这些特性的示例实现和测试。将您喜欢的密码学库连接起来并不困难,但这也不是一件微不足道的事情。如果您对Noise和Disco没有很好的理解,那么您可能需要另寻他处。

握手

这个crate支持在Disco扩展文档中列出的所有握手模式:N、K、X、KK、XX、IK、NK、NX和NNpsk2。它还支持许多其他常用的握手模式:Npsk0、Kpsk0、Xpsk1、NN、IX、XK1和KK1。您可以通过编辑src/params.rs来包含您喜欢的握手,以将其添加到crate中。该文件有很好的文档,我认为使用现有代码定义新的握手是很容易的。请确保在tests/one_way.rstests/two_way.rs中添加任何新握手的测试,具体取决于您添加的握手类型。

反馈

如果您正在使用这个crate,我鼓励您给我发邮件,并给我任何反馈。如果您发现任何问题或有功能请求,请发送PR或提交Issue。

依赖关系

~1.9–2.9MB
~57K SLoC