7 个不稳定版本 (3 个破坏性更新)
0.4.2 | 2024年6月20日 |
---|---|
0.4.1 | 2024年6月4日 |
0.4.0 | 2024年5月17日 |
0.3.1 | 2024年4月9日 |
0.1.0 | 2024年3月4日 |
#2225 in 加密学
587 monthly downloads
用于 4 个crate (3 直接使用)
200KB
4K SLoC
此crate包含与 GnuPG 的 gpg-agent
交互的功能。
gpg-agent
是一个密钥存储库,作为 GnuPG 的一部分提供。它用于管理密钥材料,以及包含密钥材料的硬件设备。它提供了一个使用 Assuan 协议 的 RPC 接口。
这是 GnuPG 的主要命令行界面 gpg
如何与之通信的。
此crate提供了与 gpg-agent
交互的 Rust API。
注意:此crate直接与 gpg-agent
通信;它不通过 gpg
进行。
lib.rs
:
此crate包含与 GnuPG 的 gpg-agent
交互的功能。
gpg-agent
是一个密钥存储库,作为 GnuPG 的一部分提供。它用于管理密钥材料,以及包含密钥材料的硬件设备。它提供了一个使用 Assuan 协议 的 RPC 接口。
这是 GnuPG 的主要命令行界面 gpg
如何与之通信的。
此crate提供了与 gpg-agent
交互的 Rust API。
注意:此crate直接与 gpg-agent
通信;它不通过 gpg
进行。
示例
导入密钥材料,列出密钥并签名消息
use std::io::{Read, Write};
use sequoia_openpgp as openpgp;
use openpgp::Cert;
use openpgp::packet::signature;
use openpgp::parse::Parse;
use openpgp::policy::StandardPolicy;
use openpgp::serialize::stream::{Message, Signer, LiteralWriter};
use openpgp::types::HashAlgorithm;
use openpgp::types::SignatureType;
use sequoia_gpg_agent as gpg_agent;
use gpg_agent::KeyPair;
const P: &StandardPolicy = &StandardPolicy::new();
#
// Load a TSK, i.e., a certificate with secret key material.
let key = // ...
#
let cert = Cert::from_bytes(key)?;
assert!(cert.is_tsk());
// Connect to a temporary GnuPG home directory. Usually,
// you'll want to connect to the default home directory using
// Agent::connect_to_default.
let mut agent = gpg_agent::Agent::connect_to_ephemeral().await?;
// Import the secret key material into gpg-agent.
for k in cert.keys().secret() {
agent.import(P,
&cert, k.parts_as_secret().expect("have secret"),
true, true).await?;
}
// List the keys.
let list = agent.list_keys().await?;
println!("gpg agent manages {} keys:", list.len());
for k in list.iter() {
eprintln!(" - {}", k.keygrip());
}
// Sign a message using the signing key we just imported.
let signing_key = cert.with_policy(P, None)?
.keys().for_signing()
.next().expect("Have a signing-capable subkey.");
let mut keypair = agent.keypair(&signing_key)?;
let mut signed_message = Vec::new();
let message = Message::new(&mut signed_message);
let message = Signer::new(message, keypair).build()?;
let mut message = LiteralWriter::new(message).build()?;
message.write_all(b"I love you!")?;
message.finalize()?;
依赖项
~25–37MB
~481K SLoC