#event-streaming #cesr #key-events #keri #acdc #signing-key

cesride

用于与可组合事件流表示(CESR)一起使用的密码学原语

7个不稳定版本

0.6.4 2024年3月6日
0.6.2 2023年10月20日
0.6.1 2023年5月23日
0.5.0 2023年4月14日
0.1.3 2023年1月20日

#151密码学

Download history 55/week @ 2024-03-15 43/week @ 2024-03-22 32/week @ 2024-03-29 28/week @ 2024-04-05 17/week @ 2024-04-12 16/week @ 2024-04-19 66/week @ 2024-04-26 41/week @ 2024-05-03 96/week @ 2024-05-10 52/week @ 2024-05-17 34/week @ 2024-05-24 45/week @ 2024-05-31 35/week @ 2024-06-07 18/week @ 2024-06-14 18/week @ 2024-06-21 6/week @ 2024-06-28

83 每月下载量
parside 中使用

Apache-2.0

455KB
11K SLoC

cesride

cesride codecov

用于与可组合事件流表示(CESR)一起使用的密码学原语。

这个库目前处于建设中。如果您想帮忙构建,请查看下面的贡献

重要参考资料

贡献

如果您想贡献,请查看问题。标签提供了一些指导。

在开始新问题时,确保没有人正在做同样的事情,以避免重复工作(尽管总是欢迎和考虑替代实现)

  • 检查是否没有开放拉取请求
  • 确保没有人给自己分配了任务
  • 查看问题上的评论
  • 查看开发集成(“链接了一个可能由这个拉取请求关闭的问题”)

当您找到想要承担的问题时

  • 如果可能,为自己分配一个任务
  • 在您创建的分支上打开一个拉取请求 - 即使是空的
  • 在您正在处理的问题上的评论中粘贴PR链接以供可见

为了更好的协调,请使用本文档底部的链接加入#cesr-dev Slack频道。

开发

安装依赖项

cargo install cargo-audit
cargo install cargo-tarpaulin

更改一些代码然后自动修复它

make fix

在本地提交更改并运行这些自动化测试

make clean preflight

您现在可以打开一个拉取请求了!

术语

cesride 由命名清晰简洁的密码学原语构建。话虽如此,那些不熟悉命名策略但对密码学熟悉的人可能会在第一次使用cesride时感到有些困惑。实现已从KERIpy迁移过来,术语也随代码一起携带。基本内容

  • Diger - 表示摘要的原始类型。它具有验证输入哈希值是否与其原始值匹配的能力。
  • Verfer - 表示公钥的原始类型。它具有验证数据签名的功能。
  • Signer - 表示私钥的原始类型。它具有创建 SigersCigars(签名)的功能。
  • Siger - 一种 索引签名。当与标识符关联的多个当前密钥存在时,KERI会使用它。
  • Cigar - 一种 非索引签名。
  • Salter - 表示种子的原始类型。它具有生成新 Signers 的能力。

每个原始类型都将附加方法,允许用户生成和解析合格的基础2或基础64表示。常见的方

  • .qb64() - 将加密材料作为字符串的合格基础64表示
  • .qb64b() - 将加密材料作为字节(八位组)的合格基础64表示
  • .qb2() - 将加密材料作为字节(八位组)的合格基础2表示
  • .code() - 限定代码(描述加密材料类型)
  • .raw() - 原始加密材料(非限定)作为字节(八位组)

限定

Q: 你说的“限定加密材料”是什么意思?

A: 有类似表格的代码表,类似于TLV表,但几乎在所有情况下省略了长度字段(因为原始类型大小固定)。在CESR的术语中,类型或代码传达了足够的信息,以便应用程序可以解析嵌入限定加密材料的数据。

这里是什么意思

DKxy2sgzfplyr-tgwIxS19f2OchFHtLwPWD3v4oYimBx - 这个前缀是D。如果我们查看上面答案中链接的表格中的这个代码,我们会发现这是一个可转移的(可旋转的)Ed25519公钥。

ELEjyRTtmfyp4VpTBTkv_b6KONMS1V8-EW-aGJ5P_QMo - 这个前缀是E。再次,咨询表格,我们了解到这是一个Blake3 256摘要。

每个原始类型都可以用Base64或二进制表示,并且可以从这两种格式进行处理。

示例

use cesride::{common::Tierage, Salter};
// in this example we sign some data and ensure the signature verifies

let authentic = b"abcdefg";
let forgery = b"abcdefgh";
let mut sigers: Vec<Siger> = vec![];

// delay creating sensitive material until the last moment so it is resident in memory for shorter
let salter = Salter::new_with_defaults(Some(Tierage::med))?;

// generate a set of 3 signing keys. the fourth argument here is the code, and when we specify
// none we'll be given an Ed25519 key. the path here (third argument) will be input during key
// stretching so that the same seed can be used for a number of keys with differing paths
let signers = salter.signers(Some(3), None, Some("my-key"), None, None, None, None)?;

// sign some data
for i in 0..signers.len() {
    sigers.push(signers[i].sign_indexed(authentic, false, i as u32, None)?);
}

// verify the signatures
for i in 0..signers.len() {
    // check that verification works if the data and signature match
    assert!(signers[i].verfer().verify(&sigers[i].raw(), authentic)?);
    // verification fails if the data (or signature) does not match
    assert!(!signers[i].verfer().verify(&sigers[i].raw(), forgery)?);
}
use cesride::{Signer, Indexer, Matter};
// here we verify that a cigar primitive and a siger primitive have the same underlying
// cryptographic material

let data = b"abcdefg";

// defaults to Ed25519
let signer = Signer::new_with_defaults(None, None)?;

// create our signatures
let cigar = signer.sign_unindexed(data)?;
let siger = signer.sign_indexed(data, false, 0, None)?;

// compare the raw signatures
assert_eq!(cigar.raw(), siger.raw());
use cesride::{Diger, Matter, matter};
// here we simply print a qualified digest in base64 to stdout after hashing serialized data
// hash digests underpin core concepts of the KERI ecosystem

let data = b"abcdefg";

// derive the digest, opting this time to specify the algorithm
let diger = Diger::new_with_ser(data, Some(matter::Codex::SHA3_512))?;

// output the digest
println!("Blake3 256 digest: #{d}", d=diger.qb64()?);

有关此阶段的更多实现细节,请参阅KERIpy

我们使用两种OsRng实现来获取我们的随机数据。我们的私钥有时来自底层库中的标准方法,这就是为什么我们目前包括两种实现(两个签名模块依赖于不兼容的特性)。

当使用Salter时,可以从相同的种子材料产生许多确定性和可重现的结果(如密钥),或者使用随机种子材料。在后一种情况下,我们直接使用较新的OsRng实现来填充缓冲区。

外部依赖项(crates)

密钥拉伸

  • Argon2 (argon2) - Salter 使用 argon2id 将种子拉伸成密钥材料。这是我们选择的密钥层级和参数,以保持与参考 Python 实现 (KERIpy) 的兼容性。
    • min:在 cesride 上下文外部不可用,除非直接将 temp 参数传递给 stretch() 以执行手动拉伸。**决不要**在生产环境中使用此安全层级。argon2id 参数
      • m: 8
      • t: 1
      • p: 1
    • low:默认层级,适用于低风险在线交互
      • m: 65536
      • t: 2
      • p: 1
    • med:适用于高风险在线交互
      • m: 262144
      • t: 3
      • p: 1
    • high:抵抗离线攻击(用于备份)
      • m: 1048576
      • t: 4
      • p: 1

我们使用来自 OsRng 的 16 字节熵量在 rand_core 中对 argon2 进行种子。有关选择合适的 argon2 参数的更多详细信息,请参阅此文档

哈希

cesride 支持以下哈希算法

由于性能优于其他算法,建议大多数应用程序使用 Blake3。

签名

cesride 支持以下签名算法

我们计划支持 Ed448。

ECDSA 曲线(Secp256k1 和 Secp256r1)使用随机签名。Ed25519 总是确定性的。这意味着如果您需要避免关联并想使用 Ed25519,您需要为每个不希望关联的用例对数据进行盐化。例如,ACDC 考虑了这一点,允许通过在待签名数据中注入含盐的随机数来配置使用 Ed25519,其中隐私是一个问题。

社区

双周会议

信息在这里

Discord

依赖项

~11–20MB
~279K SLoC