use crate::{aes, get_pad_key_and_iv, xor, EncryptedChunk, Error, Result};
use bytes::Bytes;
use std::io::Cursor;
use xor_name::XorName;
pub fn decrypt_sorted_set(
src_hashes: Vec<XorName>,
encrypted_chunks: &[&EncryptedChunk],
) -> Result<Bytes> {
let mut all_bytes = Vec::new();
for (chunk_index, chunk) in encrypted_chunks.iter().enumerate() {
let decrypted = decrypt_chunk(chunk_index, &chunk.content, &src_hashes)?;
all_bytes.extend_from_slice(&decrypted);
}
Ok(Bytes::from(all_bytes))
}
pub fn decrypt_chunk(chunk_index: usize, content: &Bytes, src_hashes: &[XorName]) -> Result<Bytes> {
let pki = get_pad_key_and_iv(chunk_index, src_hashes);
let (pad, key, iv) = pki;
let xored = xor(content, &pad);
let decrypted = aes::decrypt(xored, &key, &iv)?;
let mut decompressed = Vec::new();
let mut cursor = Cursor::new(&decrypted);
brotli::BrotliDecompress(&mut cursor, &mut decompressed).map_err(|_| Error::Compression)?;
Ok(Bytes::from(decompressed))
}