use vck_common::VolumeCipher;
pub struct CryptoPipeline<'a> {
cipher: &'a dyn VolumeCipher,
}
impl<'a> CryptoPipeline<'a> {
pub fn new(cipher: &'a dyn VolumeCipher) -> Self {
Self { cipher }
}
pub fn decrypt_read(
&self,
first_rel_sector: u64,
encrypted_offset: u64,
buf: &mut [u8],
sector_size: usize,
) {
let total = buf.len() / sector_size;
let n = if encrypted_offset <= first_rel_sector {
0
} else {
((encrypted_offset - first_rel_sector) as usize).min(total)
};
if n > 0 {
self.cipher
.decrypt_area(&mut buf[..n * sector_size], sector_size, first_rel_sector);
}
}
pub fn encrypt_write(
&self,
first_rel_sector: u64,
encrypted_offset: u64,
buf: &mut [u8],
sector_size: usize,
) {
let total = buf.len() / sector_size;
let n = if encrypted_offset <= first_rel_sector {
0
} else {
((encrypted_offset - first_rel_sector) as usize).min(total)
};
if n > 0 {
self.cipher
.encrypt_area(&mut buf[..n * sector_size], sector_size, first_rel_sector);
}
}
}