10个版本

0.1.9 2024年4月12日
0.1.8 2024年4月12日

#2285 in 密码学

Download history 5/week @ 2024-04-17 1/week @ 2024-04-24 6/week @ 2024-05-29 4/week @ 2024-06-05 1/week @ 2024-06-12

330 每月下载量
用于 tangy

MIT/Apache

29KB
556

Tangy Lib

描述

Tangy-lib是Tang服务器的一个库实现,用Rust编写。

Tang协议允许客户端存储只有在访问Tang服务器时才能恢复的秘密。例如,Clevis工具允许当加密设备连接到Tang可访问的本地网络时自动解密LUKS分区。

有关完整描述,请参阅原始Tang项目:https://github.com/latchset/tang

Fraser Tweedale于2020年在澳大利亚Linux会议上的关于“Clevis和Tang:保护您的静态秘密”的演讲是一个很好的资源

Clevis and Tang: securing your secrets at rest

安装

通过cargo安装

cargo add tangy-lib

或直接在Cargo.toml的依赖项部分使用

[dependencies]
tangy-lib = "0.1"

用法

Tangy-lib有一个初始化方法,可以接受本地目录或JWK字符串向量的输入

use tangy_lib::{KeySource, TangyLib};
let mut tangy = TangyLib::init(KeySource::LocalDir(&dir_path)).unwrap();
// or
let mut tangy = TangyLib::init(KeySource::Vector(&vec_of_keys)).unwrap();

如果LocalDir不包含密钥集,则会生成一个新的密钥集并将其保存到该文件夹。

本地目录和向量加载方法将处理密钥,并在无法加载JWK或某些密钥缺少std::io::Error时返回错误,其kind设置为std::io::ErrorKind::Unsupportedstd::io::ErrorKind::NotFound

如果init返回Ok,则其他所有内容都应该正常工作。

Tang使用advertiserecovery阶段,以生成对抗响应然后恢复响应

use tangy_lib::{KeySource, TangyLib};
let mut tangy = TangyLib::init(KeySource::LocalDir(&dir_path));
let adv = tangy.adv(None).unwrap();
let rec = tangy.rec(&kid, &data).unwrap();

传递给 adv 的参数是用于签名的密钥指纹,通常设置为 None,表示使用所有签名密钥。如果设置了签名密钥但未找到,adv 将返回带有 ErrorKind 设置为 std::io::ErrorKind::NotFound 的 Err(std::io::Error)

用于恢复的椭圆曲线消息恢复(ECMR)密钥指纹,以及数据是客户端以 JWK 格式生成的公钥。

提供了一种密钥创建机制

let keys : Vec<String> = tangy_lib::create_new_key_set();

它创建 ES512 和 ECMR 密钥。

致谢

Tang 的原始作者是 Latchset。Tang 基于Nathaniel McCallum和Robert Relyea描述的协议(https://marc.info/?m=144173814525805)。

许可证

Apache-2.0 或 MIT - 由你决定!

如何贡献

除非你明确声明,否则任何有意提交以包含在你的作品中的贡献,根据 Apache-2.0 许可证定义,将双重许可(Apache-2.0 和 MIT),不附加任何额外的条款或条件。

依赖项

约 4.5MB
约 92K SLoC