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 密码学
100 每月下载量
用于 3 crates
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.rs
和src/mainv.rs
,如下所示
fn main() {
sop::cli::main(&MySOPImplementation::default());
}
注意:如果您不需要调整SOP验证子集的实现,您也可以从同一源构建两个二进制文件。
打包者注意事项:由于Rust中的功能是累加的,在一个cargo调用中(即cargo build --features=cli,cliv
)构建两个二进制文件将启用SOPV二进制文件中的完整SOP功能。为了避免这种情况,请单独构建这两个目标。
依赖项
~0.3–12MB
~107K SLoC