use crate::network::NetworkError;
use crate::storage::ScratchpadAddress;
use blsttc::SecretKey;
use crc::{Crc, CRC_32_ISCSI};
use serde::{Deserialize, Serialize};
#[derive(Serialize, Deserialize, Debug, Clone, PartialEq, Eq, Copy)]
pub enum PadStatus {
Generated,
Free,
Written,
Confirmed,
}
#[derive(Serialize, Deserialize, Clone, Debug, PartialEq, Eq)]
pub struct PadInfo {
pub address: ScratchpadAddress,
pub size: usize,
#[serde(default)] pub chunk_index: usize,
pub status: PadStatus,
#[serde(default)] pub last_known_counter: u64,
pub sk_bytes: Vec<u8>,
pub checksum: usize,
}
impl PadInfo {
pub fn secret_key(&self) -> SecretKey {
let mut secret_key_bytes: [u8; 32] = [0; 32];
secret_key_bytes.copy_from_slice(&self.sk_bytes);
SecretKey::from_bytes(secret_key_bytes)
.map_err(|e| NetworkError::InternalError(format!("Failed to reconstruct SK: {}", e)))
.unwrap()
}
}
impl PadInfo {
pub fn new(data: &[u8], chunk_index: usize) -> Self {
let secret_key = SecretKey::random();
let sk_bytes = secret_key.to_bytes().to_vec();
let address = ScratchpadAddress::new(secret_key.public_key());
Self {
address,
sk_bytes,
size: data.len(),
status: PadStatus::Generated,
last_known_counter: 0,
chunk_index,
checksum: Self::checksum(data),
}
}
pub fn update_data(mut self, data: &[u8], chunk_index: usize) -> Self {
self.size = data.len();
self.checksum = Self::checksum(data);
self.last_known_counter += 1;
self.chunk_index = chunk_index;
self
}
pub fn update_status(&mut self, status: PadStatus) {
self.status = status;
}
pub fn checksum(data: &[u8]) -> usize {
Crc::<u32>::new(&CRC_32_ISCSI).checksum(data) as usize
}
}