use pgp::{
composed::{
EncryptionCaps, KeyType, SecretKeyParamsBuilder, SignedPublicKey, SignedSecretKey,
SubkeyParamsBuilder, SubkeyParamsBuilderError,
},
crypto::ecc_curve::ECCCurve,
ser::Serialize,
types::KeyDetails,
};
use rand::thread_rng;
fn main() {
let secret_key = keygen(
KeyType::Ed25519Legacy, KeyType::Ed25519Legacy, KeyType::ECDH(ECCCurve::Curve25519), KeyType::Ed25519Legacy, "John Doe <jdoe@example.com>", )
.expect("failed during keygen");
println!(
"Generated key with fingerprint: {}",
secret_key.fingerprint()
);
let mut priv_file =
std::fs::File::create("example-key.priv").expect("failed to create 'example-key.priv'");
secret_key
.to_writer(&mut priv_file)
.expect("failed to write to 'example-key.priv'");
let public_key = SignedPublicKey::from(secret_key.clone());
let mut pub_file =
std::fs::File::create("example-key.pub").expect("failed to create 'example-key.pub'");
public_key
.to_writer(&mut pub_file)
.expect("failed to write to 'example-key.pub'");
}
fn keygen(
primary_key_type: KeyType,
signing_key_type: KeyType,
encryption_key_type: KeyType,
auth_key_type: KeyType,
uid: &str,
) -> Result<SignedSecretKey, SubkeyParamsBuilderError> {
let mut signkey = SubkeyParamsBuilder::default();
signkey
.key_type(signing_key_type)
.can_sign(true)
.can_encrypt(EncryptionCaps::None)
.can_authenticate(false);
let mut encryptkey = SubkeyParamsBuilder::default();
encryptkey
.key_type(encryption_key_type)
.can_sign(false)
.can_encrypt(EncryptionCaps::All)
.can_authenticate(false);
let mut authkey = SubkeyParamsBuilder::default();
authkey
.key_type(auth_key_type)
.can_sign(false)
.can_encrypt(EncryptionCaps::None)
.can_authenticate(true);
let mut key_params = SecretKeyParamsBuilder::default();
key_params
.key_type(primary_key_type)
.can_certify(true)
.can_sign(false)
.can_encrypt(EncryptionCaps::None)
.primary_user_id(uid.into())
.subkeys(vec![
signkey.build()?,
encryptkey.build()?,
authkey.build()?,
]);
let secret_key_params = key_params.build().expect("Build secret_key_params");
let signed = secret_key_params
.generate(thread_rng())
.expect("Generate plain key");
Ok(signed)
}