use std::mem;
#[cfg(feature = "serde")]
use serde::{Deserialize, Serialize};
#[cfg(feature = "directprint")]
use crate::utils::MagicNumberDecoder;
use crate::{
add_space,
signing_block::algorithms::Algorithms,
utils::{MyReader, print_hexe, print_string},
};
#[derive(Debug, Clone, PartialEq, Eq)]
#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
pub struct Digest {
pub size: usize,
pub signature_algorithm_id: Algorithms,
pub digest: Vec<u8>,
}
impl Digest {
pub const fn new(signature_algorithm_id: Algorithms, digest: Vec<u8>) -> Self {
let size = mem::size_of::<u32>() + mem::size_of::<u32>() + digest.len();
Self {
size,
signature_algorithm_id,
digest,
}
}
pub fn parse(data: &mut MyReader) -> Result<Self, String> {
let size = data.read_size()?;
add_space!(16);
#[cfg(feature = "directprint")]
print_string!("digest_size: {}", size);
let signature_algorithm_id = data.read_u32()?;
let algo = Algorithms::from(signature_algorithm_id);
add_space!(20);
#[cfg(feature = "directprint")]
print_string!(
"signature_algorithm_id: {} {}",
signature_algorithm_id,
algo
);
let digest_size = data.read_size()?;
add_space!(20);
#[cfg(feature = "directprint")]
print_string!("digest_size: {}", digest_size);
let digest = data.get_to(digest_size)?.to_vec();
add_space!(20);
#[cfg(feature = "directprint")]
print_hexe("digest", &digest);
Ok(Self {
size,
signature_algorithm_id: algo,
digest,
})
}
pub fn to_u8(&self) -> Vec<u8> {
let content = [
u32::from(&self.signature_algorithm_id)
.to_le_bytes()
.to_vec(),
(self.digest.len() as u32).to_le_bytes().to_vec(),
self.digest.to_vec(),
]
.concat();
let padding = self
.size
.checked_sub(content.len())
.map_or_else(std::vec::Vec::new, |calculated_size| {
vec![0; calculated_size]
});
[(self.size as u32).to_le_bytes().to_vec(), content, padding].concat()
}
}
#[derive(Debug, Clone, PartialEq, Eq)]
#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
pub struct Digests {
pub size: usize,
pub digests_data: Vec<Digest>,
}
impl Digests {
pub fn new(digests_data: Vec<Digest>) -> Self {
let size = digests_data
.iter()
.fold(0, |acc, d| acc + d.size + mem::size_of::<u32>());
Self { size, digests_data }
}
pub fn parse(data: &mut MyReader) -> Result<Self, String> {
let size_digests = data.read_size()?;
let mut digests = Self {
size: size_digests,
digests_data: Vec::new(),
};
add_space!(12);
#[cfg(feature = "directprint")]
print_string!("size_digests: {}", size_digests);
let data = &mut data.as_slice(size_digests)?;
let max_pos_digests = data.get_pos() + size_digests;
while data.get_pos() < max_pos_digests {
digests.digests_data.push(Digest::parse(data)?);
}
Ok(digests)
}
pub fn to_u8(&self) -> Vec<u8> {
let content = self
.digests_data
.iter()
.flat_map(|d| d.to_u8())
.collect::<Vec<u8>>();
let padding = self
.size
.checked_sub(content.len())
.map_or_else(std::vec::Vec::new, |calculated_size| {
vec![0; calculated_size]
});
[(self.size as u32).to_le_bytes().to_vec(), content, padding].concat()
}
}
#[derive(Debug, Clone, PartialEq, Eq)]
#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
pub struct Certificates {
pub size: usize,
pub certificates_data: Vec<Certificate>,
}
impl Certificates {
pub fn new(certificates_data: Vec<Certificate>) -> Self {
let size = certificates_data
.iter()
.fold(0, |acc, c| acc + c.size + mem::size_of::<u32>());
Self {
size,
certificates_data,
}
}
pub fn parse(data: &mut MyReader) -> Result<Self, String> {
let size_certificates = data.read_size()?;
let mut certificates = Self {
size: size_certificates,
certificates_data: Vec::new(),
};
add_space!(12);
print_string!("size_certificates: {}", size_certificates);
let pos_max_cert = data.get_pos() + size_certificates;
while data.get_pos() < pos_max_cert {
certificates
.certificates_data
.push(Certificate::parse(data)?);
}
Ok(certificates)
}
pub fn to_u8(&self) -> Vec<u8> {
let content = self
.certificates_data
.iter()
.flat_map(|c| c.to_u8())
.collect::<Vec<u8>>();
let padding = self
.size
.checked_sub(content.len())
.map_or_else(std::vec::Vec::new, |calculated_size| {
vec![0; calculated_size]
});
[(self.size as u32).to_le_bytes().to_vec(), content, padding].concat()
}
}
#[derive(Debug, Clone, PartialEq, Eq)]
#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
pub struct Certificate {
pub size: usize,
pub certificate: Vec<u8>,
}
impl Certificate {
pub const fn new(certificate: Vec<u8>) -> Self {
Self {
size: certificate.len(),
certificate,
}
}
#[cfg(feature = "hash")]
pub fn sha256_cert(&self) -> Vec<u8> {
use sha2::{Digest, Sha256};
let mut hasher = Sha256::new();
hasher.update(&self.certificate);
hasher.finalize().to_vec()
}
#[cfg(feature = "hash")]
pub fn md5_cert(&self) -> Vec<u8> {
use md5::{Digest, Md5};
let mut hasher = Md5::new();
hasher.update(&self.certificate);
hasher.finalize().to_vec()
}
#[cfg(feature = "hash")]
pub fn sha1_cert(&self) -> Vec<u8> {
use sha1::{Digest, Sha1};
let mut hasher = Sha1::new();
hasher.update(&self.certificate);
hasher.finalize().to_vec()
}
pub fn parse(data: &mut MyReader) -> Result<Self, String> {
let size = data.read_size()?;
add_space!(16);
print_string!("certificate_size: {}", size);
let certificate = data.get_to(size)?.to_vec();
add_space!(16);
print_hexe("certificate", &certificate);
Ok(Self { size, certificate })
}
pub fn to_u8(&self) -> Vec<u8> {
let content = self.certificate.to_vec();
let padding = self
.size
.checked_sub(content.len())
.map_or_else(std::vec::Vec::new, |calculated_size| {
vec![0; calculated_size]
});
[(self.size as u32).to_le_bytes().to_vec(), content, padding].concat()
}
}
#[derive(Debug, Clone, PartialEq, Eq)]
#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
pub struct Signatures {
pub size: usize,
pub signatures_data: Vec<Signature>,
}
impl Signatures {
pub fn new(signatures_data: Vec<Signature>) -> Self {
let size = signatures_data
.iter()
.fold(0, |acc, s| acc + s.size + mem::size_of::<u32>());
Self {
size,
signatures_data,
}
}
pub fn parse(data: &mut MyReader) -> Result<Self, String> {
let size = data.read_size()?;
add_space!(8);
print_string!("signatures_size: {}", size);
let mut signatures = Self {
size,
signatures_data: Vec::new(),
};
if size == 0 {
return Ok(signatures);
}
let max_signatures = data.get_pos() + size;
while data.get_pos() < max_signatures {
signatures.signatures_data.push(Signature::parse(data)?);
}
Ok(signatures)
}
pub fn to_u8(&self) -> Vec<u8> {
let content = self
.signatures_data
.iter()
.flat_map(|s| s.to_u8())
.collect::<Vec<u8>>();
let padding = self
.size
.checked_sub(content.len())
.map_or_else(std::vec::Vec::new, |calculated_size| {
vec![0; calculated_size]
});
[(self.size as u32).to_le_bytes().to_vec(), content, padding].concat()
}
}
#[derive(Debug, Clone, PartialEq, Eq)]
#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
pub struct Signature {
pub size: usize,
pub signature_algorithm_id: Algorithms,
pub signature: Vec<u8>,
}
impl Signature {
pub const fn new(signature_algorithm_id: Algorithms, signature: Vec<u8>) -> Self {
let size = mem::size_of::<u32>() + mem::size_of::<u32>() + signature.len();
Self {
size,
signature_algorithm_id,
signature,
}
}
pub fn parse(data: &mut MyReader) -> Result<Self, String> {
let size = data.read_size()?;
add_space!(12);
print_string!("signature_size: {}", size);
let signature_algorithm_id = data.read_u32()?;
let algo = Algorithms::from(signature_algorithm_id);
add_space!(12);
print_string!(
"signature_algorithm_id: {} {}",
signature_algorithm_id,
algo
);
let signature_size = data.read_size()?;
add_space!(12);
print_string!("signature_size: {}", signature_size);
let signature = data.get_to(signature_size)?.to_vec();
add_space!(12);
print_hexe("signature", &signature);
Ok(Self {
size,
signature_algorithm_id: algo,
signature,
})
}
pub fn to_u8(&self) -> Vec<u8> {
let content = [
(u32::from(&self.signature_algorithm_id))
.to_le_bytes()
.to_vec(),
(self.signature.len() as u32).to_le_bytes().to_vec(),
self.signature.to_vec(),
]
.concat();
let padding = self
.size
.checked_sub(content.len())
.map_or_else(std::vec::Vec::new, |calculated_size| {
vec![0; calculated_size]
});
[(self.size as u32).to_le_bytes().to_vec(), content, padding].concat()
}
}
#[derive(Debug, Clone, PartialEq, Eq)]
#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
pub struct AdditionalAttributes {
pub size: usize,
pub additional_attributes_data: Vec<AdditionalAttribute>,
}
impl AdditionalAttributes {
pub fn new(additional_attributes_data: Vec<AdditionalAttribute>) -> Self {
let size = additional_attributes_data
.iter()
.fold(0, |acc, a| acc + a.size + mem::size_of::<u32>());
Self {
size,
additional_attributes_data,
}
}
pub fn parse(data: &mut MyReader) -> Result<Self, String> {
let size_additional_attributes = data.read_size()?;
let mut additional_attributes = Self {
size: size_additional_attributes,
additional_attributes_data: Vec::new(),
};
add_space!(12);
print_string!("size_additional_attributes: {}", size_additional_attributes);
let max_pos_attributes = data.get_pos() + size_additional_attributes;
while data.get_pos() < max_pos_attributes {
additional_attributes
.additional_attributes_data
.push(AdditionalAttribute::parse(data)?);
}
Ok(additional_attributes)
}
pub fn to_u8(&self) -> Vec<u8> {
let content = self
.additional_attributes_data
.iter()
.flat_map(|a| a.to_u8())
.collect::<Vec<u8>>();
let padding = self
.size
.checked_sub(content.len())
.map_or_else(std::vec::Vec::new, |calculated_size| {
vec![0; calculated_size]
});
[(self.size as u32).to_le_bytes().to_vec(), content, padding].concat()
}
}
#[derive(Debug, Clone, PartialEq, Eq)]
#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
pub struct AdditionalAttribute {
pub size: usize,
pub id: u32,
pub data: Vec<u8>,
}
impl AdditionalAttribute {
pub fn parse(data: &mut MyReader) -> Result<Self, String> {
let size = data.read_size()?;
add_space!(16);
print_string!("tiny_raw_data_size: {}", size);
let id = data.read_u32()?;
add_space!(20);
print_string!("id: {} {}", id, MagicNumberDecoder::Normal(id));
let data_size = match size.checked_sub(4) {
Some(size) => size,
None => return Err("Invalid size".to_string()),
};
let data = data.get_to(data_size)?.to_vec();
add_space!(20);
print_hexe("data", &data);
Ok(Self { size, id, data })
}
pub fn to_u8(&self) -> Vec<u8> {
let content = [self.id.to_le_bytes().to_vec(), self.data.to_vec()].concat();
let padding = self
.size
.checked_sub(content.len())
.map_or_else(std::vec::Vec::new, |calculated_size| {
vec![0; calculated_size]
});
[(self.size as u32).to_le_bytes().to_vec(), content, padding].concat()
}
}
#[derive(Debug, Clone, PartialEq, Eq)]
#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
pub struct PubKey {
pub size: usize,
pub data: Vec<u8>,
}
impl PubKey {
pub const fn new(data: Vec<u8>) -> Self {
Self {
size: data.len(),
data,
}
}
pub fn parse(data: &mut MyReader) -> Result<Self, String> {
let size = data.read_size()?;
add_space!(8);
print_string!("pub_key_length: {}", size);
add_space!(12);
let data = data.get_to(size)?.to_vec();
print_hexe("pub_key", &data);
Ok(Self { size, data })
}
pub fn to_u8(&self) -> Vec<u8> {
let content = self.data.to_vec();
let padding = self
.size
.checked_sub(content.len())
.map_or_else(std::vec::Vec::new, |calculated_size| {
vec![0; calculated_size]
});
[(self.size as u32).to_le_bytes().to_vec(), content, padding].concat()
}
}