pgp: replace custom PgpKeygenError with anyhow

This commit is contained in:
link2xt
2022-05-28 16:27:10 +00:00
parent 0f34ca8962
commit 8cee14fa3a

View File

@@ -110,27 +110,6 @@ pub fn split_armored_data(buf: &[u8]) -> Result<(BlockType, BTreeMap<String, Str
Ok((typ, headers, bytes)) Ok((typ, headers, bytes))
} }
/// Error with generating a PGP keypair.
///
/// Most of these are likely coding errors rather than user errors
/// since all variability is hardcoded.
#[derive(Debug, thiserror::Error)]
#[error("PgpKeygenError: {message}")]
pub struct PgpKeygenError {
message: String,
#[source]
cause: anyhow::Error,
}
impl PgpKeygenError {
fn new(message: impl Into<String>, cause: impl Into<anyhow::Error>) -> Self {
Self {
message: message.into(),
cause: cause.into(),
}
}
}
/// A PGP keypair. /// A PGP keypair.
/// ///
/// This has it's own struct to be able to keep the public and secret /// This has it's own struct to be able to keep the public and secret
@@ -143,10 +122,7 @@ pub struct KeyPair {
} }
/// Create a new key pair. /// Create a new key pair.
pub(crate) fn create_keypair( pub(crate) fn create_keypair(addr: EmailAddress, keygen_type: KeyGenType) -> Result<KeyPair> {
addr: EmailAddress,
keygen_type: KeyGenType,
) -> std::result::Result<KeyPair, PgpKeygenError> {
let (secret_key_type, public_key_type) = match keygen_type { let (secret_key_type, public_key_type) = match keygen_type {
KeyGenType::Rsa2048 => (PgpKeyType::Rsa(2048), PgpKeyType::Rsa(2048)), KeyGenType::Rsa2048 => (PgpKeyType::Rsa(2048), PgpKeyType::Rsa(2048)),
KeyGenType::Ed25519 | KeyGenType::Default => (PgpKeyType::EdDSA, PgpKeyType::ECDH), KeyGenType::Ed25519 | KeyGenType::Default => (PgpKeyType::EdDSA, PgpKeyType::ECDH),
@@ -181,30 +157,32 @@ pub(crate) fn create_keypair(
.can_encrypt(true) .can_encrypt(true)
.passphrase(None) .passphrase(None)
.build() .build()
.map_err(|err| { .map_err(|e| format_err!("{}", e))
PgpKeygenError::new("failed to build subkey parameters", format_err!("{}", err)) .context("failed to build subkey parameters")?,
})?,
) )
.build() .build()
.map_err(|err| PgpKeygenError::new("invalid key params", format_err!("{}", err)))?; .map_err(|e| format_err!("{}", e))
let key = key_params .context("invalid key params")?;
.generate() let key = key_params.generate().context("invalid params")?;
.map_err(|err| PgpKeygenError::new("invalid params", err))?;
let private_key = key let private_key = key
.sign(|| "".into()) .sign(|| "".into())
.map_err(|err| PgpKeygenError::new("failed to sign secret key", err))?; .map_err(|e| format_err!("{}", e))
.context("failed to sign secret key")?;
let public_key = private_key.public_key(); let public_key = private_key.public_key();
let public_key = public_key let public_key = public_key
.sign(&private_key, || "".into()) .sign(&private_key, || "".into())
.map_err(|err| PgpKeygenError::new("failed to sign public key", err))?; .map_err(|e| format_err!("{}", e))
.context("failed to sign public key")?;
private_key private_key
.verify() .verify()
.map_err(|err| PgpKeygenError::new("invalid private key generated", err))?; .map_err(|e| format_err!("{}", e))
.context("invalid private key generated")?;
public_key public_key
.verify() .verify()
.map_err(|err| PgpKeygenError::new("invalid public key generated", err))?; .map_err(|e| format_err!("{}", e))
.context("invalid public key generated")?;
Ok(KeyPair { Ok(KeyPair {
addr, addr,