use ant_protocol::storage::Chunk;
use bytes::{BufMut, Bytes, BytesMut};
use rayon::prelude::*;
use self_encryption::DataMap;
use self_encryption_old::DataMap as OldDataMap;
use serde::{Deserialize, Serialize};
#[derive(Debug, thiserror::Error)]
pub enum Error {
#[error(transparent)]
Encoding(#[from] rmp_serde::encode::Error),
#[error(transparent)]
SelfEncryption(#[from] self_encryption::Error),
}
#[derive(Serialize, Deserialize)]
pub enum DataMapLevel {
First(OldDataMap),
Additional(OldDataMap),
}
pub fn encrypt(data: Bytes) -> Result<(Chunk, Vec<Chunk>), Error> {
let (data_map, chunks) = self_encryption::encrypt(data)?;
let data_map_chunk = pack_data_map(data_map)?;
let chunks: Vec<Chunk> = chunks
.into_par_iter()
.map(|c| Chunk::new(c.content.clone()))
.collect();
Ok((data_map_chunk, chunks))
}
fn pack_data_map(data_map: DataMap) -> Result<Chunk, Error> {
let chunk_content = wrap_data_map(&data_map)?;
Ok(Chunk::new(chunk_content))
}
fn wrap_data_map(data_map: &DataMap) -> Result<Bytes, rmp_serde::encode::Error> {
let mut bytes = BytesMut::with_capacity(300).writer();
let mut serialiser = rmp_serde::Serializer::new(&mut bytes);
data_map
.serialize(&mut serialiser)
.inspect_err(|err| error!("Failed to serialize datamap: {err:?}"))?;
Ok(bytes.into_inner().freeze())
}