use std::fs::File;
use std::time::Duration;
use sequoia_openpgp as openpgp;
use openpgp::armor;
use openpgp::cert::prelude::*;
use openpgp::types::KeyFlags;
use openpgp::serialize::Serialize;
fn main() -> openpgp::Result<()> {
let args: Vec<String> = std::env::args().collect();
let name = if let Some(n) = args.get(1).cloned() {
n
} else {
return Err(anyhow::anyhow!(
"Missing list address parameter.\n\n\
Usage: {} <LIST-ADDRESS>",
args.get(0).cloned().unwrap_or("generate-group-key".into())));
};
let (cert, revocation) = CertBuilder::new()
.set_validity_period(Duration::new(5 * 365 * 24 * 60 * 60, 0))
.add_userid(format!("<{}>", name))
.add_subkey(KeyFlags::empty()
.set_transport_encryption()
.set_group_key(),
None,
None)
.generate()?;
let n = format!("{}.cert.pgp", name);
eprintln!("Writing certificate to {}", n);
cert.armored().serialize(&mut File::create(n)?)?;
let n = format!("{}.key.pgp", name);
eprintln!("Writing full key to {}", n);
cert.as_tsk().armored().serialize(&mut File::create(n)?)?;
let n = format!("{}.only_subkey.pgp", name);
eprintln!("Writing key with detached primary to {}", n);
cert.as_tsk()
.set_filter(|k| k.fingerprint() != cert.fingerprint())
.emit_secret_key_stubs(true) .armored()
.serialize(&mut File::create(n)?)?;
let n = format!("{}.revocation.pgp", name);
eprintln!("Writing revocation certificate to {}", n);
let mut comments = cert.armor_headers();
comments.insert(0, "Revocation certificate for the following key:".into());
comments.insert(1, "".into());
let mut w = armor::Writer::with_headers(
File::create(n)?,
armor::Kind::PublicKey,
comments.iter().map(|c| ("Comment", c)))?;
openpgp::Packet::from(revocation).serialize(&mut w)?;
w.finalize()?;
Ok(())
}