zff/header/version1/
hash_header.rs

1// - STD
2use std::io::{Cursor};
3
4// - internal
5use crate::{
6	Result,
7	ValueEncoder,
8	ValueDecoder,
9	HeaderCoding,
10	HashType,
11	ZffError,
12	HEADER_IDENTIFIER_HASH_HEADER,
13	HEADER_IDENTIFIER_HASH_VALUE,
14	ERROR_HEADER_DECODER_UNKNOWN_HASH_TYPE,
15};
16
17/// Header for the hash values of the dumped data stream.
18/// This header is part of the main header and contains 0 or more hash values of the dumped data.\
19#[derive(Debug,Clone)]
20pub struct HashHeader {
21	version: u8,
22	hashes: Vec<HashValue>,
23}
24
25impl HashHeader {
26	/// creates a new HashHeader by given values/hashes.
27	pub fn new(version: u8, hashes: Vec<HashValue>) -> HashHeader {
28		Self {
29			version,
30			hashes,
31		}
32	}
33
34	/// returns a reference to the underlying [HashValue]s.
35	pub fn hash_values(&self) -> &Vec<HashValue> {
36		&self.hashes
37	}
38}
39
40impl HeaderCoding for HashHeader {
41	type Item = HashHeader;
42
43	fn identifier() -> u32 {
44		HEADER_IDENTIFIER_HASH_HEADER
45	}
46
47	fn version(&self) -> u8 {
48		self.version
49	}
50
51	fn encode_header(&self) -> Vec<u8> {
52		let mut vec = vec![self.version];
53
54		vec.append(&mut self.hashes.encode_directly());
55
56		vec
57	}
58
59	fn encode_directly(&self) -> Vec<u8> {
60		let mut vec = Vec::new();
61		let mut encoded_header = self.encode_header();
62		let identifier = Self::identifier();
63		let encoded_header_length = 4 + 8 + (encoded_header.len() as u64); //4 bytes identifier + 8 bytes for length + length itself
64		vec.append(&mut identifier.to_be_bytes().to_vec());
65		vec.append(&mut encoded_header_length.to_le_bytes().to_vec());
66		vec.append(&mut encoded_header);
67
68		vec
69	}
70	fn encode_for_key<K: Into<String>>(&self, key: K) -> Vec<u8> {
71		let mut vec = Vec::new();
72		let mut encoded_key = Self::encode_key(key);
73		vec.append(&mut encoded_key);
74		vec.append(&mut self.encode_directly());
75		vec
76	}
77
78	fn decode_content(data: Vec<u8>) -> Result<HashHeader> {
79		let mut cursor = Cursor::new(data);
80		let header_version = u8::decode_directly(&mut cursor)?;
81		let hashes = Vec::<HashValue>::decode_directly(&mut cursor)?;
82		Ok(HashHeader::new(header_version, hashes))
83	}
84}
85
86/// This is a part of the [HashHeader](struct.HashHeader.html).
87/// The HashValue-struct contains the appropriate hash algorithm and the hash. This struct has a version also.
88#[derive(Debug,Clone)]
89pub struct HashValue {
90	version: u8,
91	hash_type: HashType,
92	hash: Vec<u8>,
93}
94
95impl HashValue {
96	/// creates a new [HashValue](struct.HashValue.html) for the given parameters.
97	pub fn new(version: u8, hash_type: HashType, hash: Vec<u8>) -> HashValue{
98		Self {
99			version,
100			hash_type,
101			hash
102		}
103	}
104	/// creates a new, empty [HashValue](struct.HashValue.html) for a given hashtype.
105	pub fn new_empty(structure_version: u8, hash_type: HashType) -> HashValue {
106		let hash_default_len = hash_type.default_len();
107		Self {
108			version: structure_version,
109			hash_type,
110			hash: vec!(0u8; hash_default_len/8),
111		}
112	}
113
114	/// returns the type of hash as [HashType](enum.HashType.html).
115	pub fn hash_type(&self) -> &HashType {
116		&self.hash_type
117	}
118
119	/// sets the hash value.
120	pub fn set_hash(&mut self, hash: Vec<u8>) {
121		self.hash = hash
122	}
123
124	/// returns the underlying hash value
125	pub fn hash(&self) -> &Vec<u8> {
126		&self.hash
127	}
128}
129
130
131impl HeaderCoding for HashValue {
132	type Item = HashValue;
133
134	fn identifier() -> u32 {
135		HEADER_IDENTIFIER_HASH_VALUE
136	}
137
138	fn version(&self) -> u8 {
139		self.version
140	}
141	
142	fn encode_header(&self) -> Vec<u8> {
143		let mut vec = vec![self.version, self.hash_type.clone() as u8];
144		vec.append(&mut self.hash.encode_directly());
145
146		vec
147	}
148
149	fn decode_content(data: Vec<u8>) -> Result<HashValue> {
150		let mut cursor = Cursor::new(data);
151		let structure_version = u8::decode_directly(&mut cursor)?;
152		let hash_type = match u8::decode_directly(&mut cursor)? {
153			0 => HashType::Blake2b512,
154			1 => HashType::SHA256,
155			2 => HashType::SHA512,
156			3 => HashType::SHA3_256,
157			_ => return Err(ZffError::new_header_decode_error(ERROR_HEADER_DECODER_UNKNOWN_HASH_TYPE)),
158		};
159	 let hash = Vec::<u8>::decode_directly(&mut cursor)?;
160		Ok(HashValue::new(structure_version, hash_type, hash))
161	}
162}