use aes::*;
use ssh_key::PrivateKey;
use super::Encryption;
use crate::keys::Error;
pub fn decode_pkcs5(
secret: &[u8],
password: Option<&str>,
enc: Encryption,
) -> Result<PrivateKey, Error> {
use aes::cipher::{BlockDecryptMut, KeyIvInit};
use block_padding::Pkcs7;
if let Some(pass) = password {
let sec = match enc {
Encryption::Aes128Cbc(ref iv) => {
let mut c = md5::Context::new();
c.consume(pass.as_bytes());
c.consume(&iv[..8]);
let md5 = c.compute();
#[allow(clippy::unwrap_used)] let c = cbc::Decryptor::<Aes128>::new_from_slices(&md5.0, &iv[..]).unwrap();
let mut dec = secret.to_vec();
c.decrypt_padded_mut::<Pkcs7>(&mut dec)?.to_vec()
}
Encryption::Aes256Cbc(_) => unimplemented!(),
};
#[cfg(feature = "rsa")]
{
super::decode_rsa_pkcs1_der(&sec).map(Into::into)
}
#[cfg(not(feature = "rsa"))]
{
Err(Error::UnsupportedKeyType {
key_type_string: "RSA".to_string(),
key_type_raw: vec![],
})
}
} else {
Err(Error::KeyIsEncrypted)
}
}