use crate::crypto::{
asymmetric::{self, PublicKey, SecretKey},
signature::{self, SigningKey, VerifyingKey},
};
pub fn pack(
public_key: &PublicKey,
signing_key: &mut SigningKey,
message: &Vec<u8>,
salt: Option<&Vec<u8>>,
) -> Option<Vec<u8>> {
let mut encrypted = asymmetric::encrypt(public_key, 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(
secret_key: &SecretKey,
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 = asymmetric::decrypt(&secret_key, &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);
}