22个版本

0.10.0 2024年7月24日
0.8.1 2022年10月10日
0.7.1 2022年2月13日
0.7.0 2021年12月29日
0.3.4 2018年7月7日

#1 in #strobe

Download history 28751/week @ 2024-04-21 20929/week @ 2024-04-28 20665/week @ 2024-05-05 26512/week @ 2024-05-12 23335/week @ 2024-05-19 32007/week @ 2024-05-26 25768/week @ 2024-06-02 20796/week @ 2024-06-09 22698/week @ 2024-06-16 15504/week @ 2024-06-23 5937/week @ 2024-06-30 6388/week @ 2024-07-07 5076/week @ 2024-07-14 5399/week @ 2024-07-21 5009/week @ 2024-07-28 4388/week @ 2024-08-04

每月20,550次下载
用于23个crate(14个直接使用)

MIT/Apache

65KB
927

strobe-rs

CI Version Docs

这是一个纯Rust、no_std的Strobe协议框架实现。设计者的描述

Strobe是一种新的加密协议框架。它也可以用于常规加密。其目标是使加密协议的开发、部署和分析更加简单;并且能够适应非常小的物联网设备。为此,它仅使用一个块函数——Keccak-f——来加密和验证消息。

此实现目前仅支持Keccak-f[1600](最高安全级别)作为内部排列函数。

示例

一个简单的示例,执行认证加密和解密

use strobe_rs::{SecParam, Strobe};

use rand::RngCore;

// NOTE: This is just a simple authenticated encryption scheme. For a robust AEAD construction,
// see the example at https://strobe.sourceforge.io/examples/aead/

fn main() {
    let mut rng = rand::thread_rng();

    // Sender and receiver
    let mut tx = Strobe::new(b"correctnesstest", SecParam::B256);
    let mut rx = Strobe::new(b"correctnesstest", SecParam::B256);

    // Key both sides with a predetermined key
    let k = b"the-combination-on-my-luggage";
    tx.key(k, false);
    rx.key(k, false);

    // Have the transmitter sample and send a nonce (192 bits) in the clear
    let mut nonce = [0u8; 24];
    rng.fill_bytes(&mut nonce);
    rx.recv_clr(&nonce, false);
    tx.send_clr(&nonce, false);

    // Have the transmitter send an authenticated ciphertext (with a 256 bit MAC)
    let orig_msg = b"groceries: kaymac, ajvar, cream, diced onion, red pepper, grilled meat";
    let mut msg_buf = *orig_msg;
    tx.send_enc(&mut msg_buf, false);
    let mut mac = [0u8; 32];
    tx.send_mac(&mut mac, false);

    // Rename for clarity. `msg_buf` has been encrypted in-place.
    let mut ciphertext = msg_buf;

    // Have the receiver receive the ciphertext and MAC
    rx.recv_enc(ciphertext.as_mut_slice(), false);
    let res = rx.recv_mac(&mac);

    // Check that the MAC verifies
    assert!(res.is_ok());
    // Check that the decrypted ciphertext equals the original plaintext
    let round_trip_msg = ciphertext;
    assert_eq!(&round_trip_msg, orig_msg);
}

功能

默认功能标志:

功能标志列表

  • std — 为AuthError实现std::error::Error
  • asm — 如果可用,则启用Keccak排列的优化汇编。汇编目前仅存在于ARMv8。
  • serialize_secret_state — 为Strobe结构实现serdeSerializeDeserialize特性。安全提示:序列化Strobe状态会输出安全敏感数据,这些数据必须保密。将这些数据视为您会处理的私有加密/解密密钥。

有关如何省略或包含功能标志的信息,请参阅cargo功能文档

MSRV

当前最低支持的Rust版本(MSRV)是1.60.0(2022-04-04)。

测试

要运行测试,请执行

cargo test --features "std"

这包括已知答案测试,这些测试针对kat/目录中的JSON编码测试向量。要验证这些测试向量与参考Python实现的一致性,请先切换到kat/目录,然后运行python2 verify_test_vector.py,并遵循包含的说明。

基准测试

要执行基准测试,请运行

cargo bench

这将生成一个包含图表的总结,图表位于 target/crieteron/report/index.html。由于STROBE中的几乎所有函数都具有相同的运行时间,所以这些图表可能不会很有趣。

许可证

许可方式任选其一

由您自行选择。

警告

此代码在任何意义上均未经过审计。请自行判断是否使用。

依赖项

~0.5–1.1MB
~25K SLoC