use crate::crypto::{
signature::{self, SigningKey, VerifyingKey},
symmetric::SymmetricKey,
};
pub fn pack(
key: &mut SymmetricKey,
signing_key: &mut SigningKey,
message: &Vec<u8>,
salt: Option<&Vec<u8>>,
) -> Option<Vec<u8>> {
let mut encrypted = key.encrypt(message)?;
if let Some(salt) = salt {
encrypted.extend(signature::sign(
signing_key,
&message.iter().chain(salt).cloned().collect(),
)?);
} else {
encrypted.extend(signature::sign(signing_key, message)?);
}
Some(encrypted)
}
pub fn unpack(
key: &mut SymmetricKey,
verifying_key: &VerifyingKey,
ciphertext: &Vec<u8>,
salt: Option<&Vec<u8>>,
) -> Option<Vec<u8>> {
if ciphertext.len() <= signature::SIGNATURE_LEN {
return None;
}
let (ciphertext, signed) = ciphertext.split_at(ciphertext.len() - signature::SIGNATURE_LEN);
let decrypted = key.decrypt(&ciphertext.to_vec())?;
if let Some(salt) = salt {
if !signature::verify(
verifying_key,
&decrypted.iter().chain(salt.iter()).cloned().collect(),
&signed.to_vec(),
)? {
return None;
}
} else {
if !signature::verify(verifying_key, &decrypted, &signed.to_vec())? {
return None;
}
}
return Some(decrypted);
}