13个不稳定版本

0.7.2 2024年7月11日
0.7.0 2023年8月17日
0.5.0 2023年4月4日
0.4.2 2023年1月18日
0.2.0 2021年6月16日

#1243 in 密码学

Download history 29/week @ 2024-04-29 21/week @ 2024-05-13 17/week @ 2024-05-20 72/week @ 2024-05-27 265/week @ 2024-06-03 28/week @ 2024-06-10 67/week @ 2024-06-17 15/week @ 2024-06-24 38/week @ 2024-07-01 149/week @ 2024-07-08 28/week @ 2024-07-15 16/week @ 2024-07-22 37/week @ 2024-07-29 45/week @ 2024-08-12

100 每月下载量
用于 3 crates

MIT 许可证

100KB
1.5K SLoC

Rust对无状态OpenPGP接口的接口

一组类型和特质,用于形式化无状态OpenPGP协议。目前,SOP仅定义为命令行界面,但我们正在开发C接口。此接口是尚未定义的C API的Rust等价物。

要将其用作消费者,您需要一个接口的具体实现,例如sequoia-sop

示例用法

给定对[SOP]实现的引用,这是每个SOP操作的入口点,生成密钥、提取证书、签名、验证、加密和解密

let alice_sec = sop.generate_key()?
    .userid("Alice Lovelace <[email protected]>")
    .generate()?;
let alice_pgp = sop.extract_cert()?
    .keys(&alice_sec)?;

let bob_sec = sop.generate_key()?
    .userid("Bob Babbage <[email protected]>")
    .generate()?;
let bob_pgp = sop.extract_cert()?
    .keys(&bob_sec)?;

let statement = b"Hello World :)";
let mut data = Cursor::new(&statement);
let (_micalg, signature) = sop.sign()?
    .mode(ops::SignAs::Text)
    .keys(&alice_sec)?
    .data(&mut data)?;

let verifications = sop.verify()?
    .certs(&alice_pgp)?
    .signatures(&signature)?
    .data(&mut Cursor::new(&statement))?;
assert_eq!(verifications.len(), 1);

let mut statement_cur = Cursor::new(&statement);
let (_session_key, ciphertext) = sop.encrypt()?
    .sign_with_keys(&alice_sec)?
    .with_certs(&bob_pgp)?
    .plaintext(&mut statement_cur)?
    .to_vec()?;

let mut ciphertext_cur = Cursor::new(&ciphertext);
let (_, plaintext) = sop.decrypt()?
    .with_keys(&bob_sec)?
    .ciphertext(&mut ciphertext_cur)?
    .to_vec()?;
assert_eq!(&plaintext, statement);

上述片段相当于SOP规范中的以下SOP命令行示例

$ sop generate-key "Alice Lovelace <[email protected]>" > alice.sec
$ sop extract-cert < alice.sec > alice.pgp

$ sop sign --as=text alice.sec < statement.txt > statement.txt.asc
$ sop verify announcement.txt.asc alice.pgp < announcement.txt

$ sop encrypt --sign-with=alice.sec bob.pgp < msg.eml > encrypted.asc
$ sop decrypt alice.sec < ciphertext.asc > cleartext.out

SOP实现者的注意事项

本节是为那些使用某些OpenPGP实现实现接口的人而设。

命令行界面

此crate包含了一个使用Rust类型和特质实现的无状态OpenPGP命令行界面的实现。一旦实现了特质,通过将此片段添加到您的Cargo.toml,您就可以免费获得命令行界面。

[[bin]]
path = "src/main.rs"
required-features = ["cli"]

[[bin]]
path = "src/mainv.rs"
required-features = ["cliv"]

[features]
cli = ["sop/cli"]
cliv = ["sop/cliv"]

并创建src/main.rssrc/mainv.rs,如下所示

fn main() {
    sop::cli::main(&MySOPImplementation::default());
}

注意:如果您不需要调整SOP验证子集的实现,您也可以从同一源构建两个二进制文件。

打包者注意事项:由于Rust中的功能是累加的,在一个cargo调用中(即cargo build --features=cli,cliv)构建两个二进制文件将启用SOPV二进制文件中的完整SOP功能。为了避免这种情况,请单独构建这两个目标。

依赖项

~0.3–12MB
~107K SLoC