use crate::{
Error,
packet::{
self,
Packet,
SEIP,
},
Result,
types::{
AEADAlgorithm,
SymmetricAlgorithm,
},
};
#[derive(Clone, Debug, PartialEq, Eq, Hash)]
pub struct SEIP2 {
pub(crate) common: packet::Common,
sym_algo: SymmetricAlgorithm,
aead: AEADAlgorithm,
chunk_size: u64,
salt: [u8; 32],
container: packet::Container,
}
assert_send_and_sync!(SEIP2);
impl SEIP2 {
pub fn new(sym_algo: SymmetricAlgorithm,
aead: AEADAlgorithm,
chunk_size: u64,
salt: [u8; 32])
-> Result<Self>
{
if chunk_size.count_ones() != 1 {
return Err(Error::InvalidArgument(
format!("chunk size is not a power of two: {}", chunk_size))
.into());
}
if chunk_size < 64 {
return Err(Error::InvalidArgument(
format!("chunk size is too small: {}", chunk_size))
.into());
}
Ok(SEIP2 {
common: Default::default(),
sym_algo,
aead,
chunk_size,
salt,
container: Default::default(),
})
}
pub fn symmetric_algo(&self) -> SymmetricAlgorithm {
self.sym_algo
}
pub fn set_symmetric_algo(&mut self, sym_algo: SymmetricAlgorithm)
-> SymmetricAlgorithm {
std::mem::replace(&mut self.sym_algo, sym_algo)
}
pub fn aead(&self) -> AEADAlgorithm {
self.aead
}
pub fn set_aead(&mut self, aead: AEADAlgorithm) -> AEADAlgorithm {
std::mem::replace(&mut self.aead, aead)
}
pub fn chunk_size(&self) -> u64 {
self.chunk_size
}
pub fn set_chunk_size(&mut self, chunk_size: u64) -> Result<()> {
if chunk_size.count_ones() != 1 {
return Err(Error::InvalidArgument(
format!("chunk size is not a power of two: {}", chunk_size))
.into());
}
if chunk_size < 64 {
return Err(Error::InvalidArgument(
format!("chunk size is too small: {}", chunk_size))
.into());
}
self.chunk_size = chunk_size;
Ok(())
}
pub fn chunk_digest_size(&self) -> Result<u64> {
Ok(self.chunk_size + self.aead.digest_size()? as u64)
}
pub fn salt(&self) -> &[u8; 32] {
&self.salt
}
pub fn set_salt(&mut self, salt: [u8; 32]) -> [u8; 32] {
std::mem::replace(&mut self.salt, salt)
}
}
impl_processed_body_forwards!(SEIP2);
impl From<SEIP2> for SEIP {
fn from(p: SEIP2) -> Self {
SEIP::V2(p)
}
}
impl From<SEIP2> for Packet {
fn from(s: SEIP2) -> Self {
Packet::SEIP(s.into())
}
}