From 50bb7546b0d3d3192489421f3f671335275615a6 Mon Sep 17 00:00:00 2001 From: Jesse Luehrs Date: Thu, 28 May 2020 23:11:03 -0400 Subject: improve cipherstring parsing errors --- src/cipherstring.rs | 37 ++++++++++++++++++++++++++++++------- src/error.rs | 7 +++++-- 2 files changed, 35 insertions(+), 9 deletions(-) (limited to 'src') diff --git a/src/cipherstring.rs b/src/cipherstring.rs index 94284d5..7aaaf9f 100644 --- a/src/cipherstring.rs +++ b/src/cipherstring.rs @@ -20,12 +20,16 @@ impl CipherString { pub fn new(s: &str) -> Result { let parts: Vec<&str> = s.split('.').collect(); if parts.len() != 2 { - return Err(Error::InvalidCipherString); + return Err(Error::InvalidCipherString { + reason: "couldn't find type".to_string(), + }); } let ty = parts[0].as_bytes(); if ty.len() != 1 { - return Err(Error::InvalidCipherString); + return Err(Error::UnimplementedCipherStringType { + ty: parts[0].to_string(), + }); } let ty = ty[0] - b'0'; @@ -35,7 +39,12 @@ impl CipherString { 2 => { let parts: Vec<&str> = contents.split('|').collect(); if parts.len() < 2 || parts.len() > 3 { - return Err(Error::InvalidCipherString); + return Err(Error::InvalidCipherString { + reason: format!( + "type 2 cipherstring with {} parts", + parts.len() + ), + }); } let iv = base64::decode(parts[0]) @@ -62,7 +71,9 @@ impl CipherString { .context(crate::error::InvalidBase64)?; Ok(Self::Asymmetric { ciphertext }) } - _ => Err(Error::InvalidCipherString), + _ => Err(Error::UnimplementedCipherStringType { + ty: ty.to_string(), + }), } } @@ -115,7 +126,11 @@ impl CipherString { .decrypt_vec(ciphertext) .context(crate::error::Decrypt) } - _ => Err(Error::InvalidCipherString), + _ => Err(Error::InvalidCipherString { + reason: + "found an asymmetric cipherstring, expecting symmetric" + .to_string(), + }), } } @@ -142,7 +157,11 @@ impl CipherString { .context(crate::error::Decrypt)?; Ok(res) } - _ => Err(Error::InvalidCipherString), + _ => Err(Error::InvalidCipherString { + reason: + "found an asymmetric cipherstring, expecting symmetric" + .to_string(), + }), } } @@ -175,7 +194,11 @@ impl CipherString { Ok(res) } - _ => Err(Error::InvalidCipherString), + _ => Err(Error::InvalidCipherString { + reason: + "found a symmetric cipherstring, expecting asymmetric" + .to_string(), + }), } } } diff --git a/src/error.rs b/src/error.rs index 5a95fec..131d5b9 100644 --- a/src/error.rs +++ b/src/error.rs @@ -40,8 +40,8 @@ pub enum Error { #[snafu(display("invalid base64"))] InvalidBase64 { source: base64::DecodeError }, - #[snafu(display("invalid cipherstring"))] - InvalidCipherString, + #[snafu(display("invalid cipherstring: {}", reason))] + InvalidCipherString { reason: String }, #[snafu(display("invalid value for $EDITOR: {}", editor.to_string_lossy()))] InvalidEditor { editor: std::ffi::OsString }, @@ -164,6 +164,9 @@ pub enum Error { providers: Vec, }, + #[snafu(display("unimplemented cipherstring type: {}", ty))] + UnimplementedCipherStringType { ty: String }, + #[snafu(display("error writing to pinentry stdin"))] WriteStdin { source: tokio::io::Error }, } -- cgit v1.2.3-54-g00ecf