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 加密学

Download history 226/week @ 2024-04-23 73/week @ 2024-04-30 71/week @ 2024-05-07 383/week @ 2024-05-14 447/week @ 2024-05-21 223/week @ 2024-05-28 700/week @ 2024-06-04 550/week @ 2024-06-11 451/week @ 2024-06-18 110/week @ 2024-06-25 256/week @ 2024-07-02 65/week @ 2024-07-09 342/week @ 2024-07-16 37/week @ 2024-07-23 133/week @ 2024-07-30 66/week @ 2024-08-06

587 monthly downloads
用于 4 个crate (3 直接使用)

LGPL-2.0-or-later

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