aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorJesse Luehrs <doy@tozt.net>2021-04-17 22:45:29 -0400
committerJesse Luehrs <doy@tozt.net>2021-04-17 23:50:43 -0400
commit38f0cd43f2cb2f294c7d195481f78e58b35dfb44 (patch)
tree67f0a40bf002c088896ed330e7008939a7b0e483 /src
parentc627737dfa6a30b71e3f7c32cca05675cc7e9b97 (diff)
downloadrbw-38f0cd43f2cb2f294c7d195481f78e58b35dfb44.tar.gz
rbw-38f0cd43f2cb2f294c7d195481f78e58b35dfb44.zip
stop using openssl
Diffstat (limited to 'src')
-rw-r--r--src/cipherstring.rs34
-rw-r--r--src/error.rs7
2 files changed, 23 insertions, 18 deletions
diff --git a/src/cipherstring.rs b/src/cipherstring.rs
index 72681f8..fc63ac9 100644
--- a/src/cipherstring.rs
+++ b/src/cipherstring.rs
@@ -1,8 +1,10 @@
use crate::prelude::*;
use block_modes::BlockMode as _;
+use block_padding::Padding as _;
use hmac::{Mac as _, NewMac as _};
use rand::RngCore as _;
+use zeroize::Zeroize as _;
pub enum CipherString {
Symmetric {
@@ -181,24 +183,24 @@ impl CipherString {
) -> Result<crate::locked::Vec> {
match self {
Self::Asymmetric { ciphertext } => {
- let pkey = openssl::pkey::PKey::private_key_from_pkcs8(
- private_key.private_key(),
- )
- .map_err(|source| Error::OpenSsl { source })?;
- let rsa =
- pkey.rsa().map_err(|source| Error::OpenSsl { source })?;
-
- let mut res = crate::locked::Vec::new();
- res.extend(std::iter::repeat(0).take(rsa.size() as usize));
-
- let bytes = rsa
- .private_decrypt(
+ let privkey_data = private_key.private_key();
+ let privkey_data = block_padding::Pkcs7::unpad(privkey_data)
+ .map_err(|_| Error::Padding)?;
+ let pkey = rsa::RSAPrivateKey::from_pkcs8(privkey_data)
+ .map_err(|source| Error::Rsa { source })?;
+ let mut bytes = pkey
+ .decrypt(
+ rsa::padding::PaddingScheme::new_oaep::<sha1::Sha1>(),
ciphertext,
- res.data_mut(),
- openssl::rsa::Padding::PKCS1_OAEP,
)
- .map_err(|source| Error::OpenSsl { source })?;
- res.truncate(bytes);
+ .map_err(|source| Error::Rsa { source })?;
+
+ // XXX it'd be great if the rsa crate would let us decrypt
+ // into a preallocated buffer directly to avoid the
+ // intermediate vec that needs to be manually zeroized, etc
+ let mut res = crate::locked::Vec::new();
+ res.extend(bytes.iter().copied());
+ bytes.zeroize();
Ok(res)
}
diff --git a/src/error.rs b/src/error.rs
index 7544e76..82fdb49 100644
--- a/src/error.rs
+++ b/src/error.rs
@@ -102,8 +102,8 @@ pub enum Error {
file: std::path::PathBuf,
},
- #[error("openssl error")]
- OpenSsl { source: openssl::error::ErrorStack },
+ #[error("invalid padding")]
+ Padding,
#[error("failed to parse match type {s}")]
ParseMatchType { s: String },
@@ -138,6 +138,9 @@ pub enum Error {
#[error("error making api request")]
Reqwest { source: reqwest::Error },
+ #[error("failed to decrypt")]
+ Rsa { source: rsa::errors::Error },
+
#[error("failed to save config to {}", .file.display())]
SaveConfig {
source: std::io::Error,