#[cfg(test)]
use quickcheck::{Arbitrary, Gen};
use crate::Result;
use crate::crypto::{
Password,
SessionKey,
};
use crate::types::{
SymmetricAlgorithm,
};
use crate::Packet;
mod v4;
pub use v4::SKESK4;
mod v6;
pub use v6::SKESK6;
#[non_exhaustive]
#[derive(PartialEq, Eq, Hash, Clone, Debug)]
pub enum SKESK {
V4(self::SKESK4),
V6(self::SKESK6),
}
assert_send_and_sync!(SKESK);
impl SKESK {
pub fn version(&self) -> u8 {
match self {
SKESK::V4(_) => 4,
SKESK::V6(_) => 6,
}
}
pub fn decrypt(&self, password: &Password)
-> Result<(Option<SymmetricAlgorithm>, SessionKey)>
{
match self {
SKESK::V4(s) => s.decrypt(password)
.map(|(algo, sk)| (Some(algo), sk)),
SKESK::V6(ref s) =>
Ok((None, s.decrypt(password)?)),
}
}
}
impl From<SKESK> for Packet {
fn from(p: SKESK) -> Self {
Packet::SKESK(p)
}
}
#[cfg(test)]
impl Arbitrary for SKESK {
fn arbitrary(g: &mut Gen) -> Self {
if bool::arbitrary(g) {
SKESK::V4(SKESK4::arbitrary(g))
} else {
SKESK::V6(SKESK6::arbitrary(g))
}
}
}