zff/header/version1/
hash_header.rs1use std::io::{Cursor};
3
4use 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#[derive(Debug,Clone)]
20pub struct HashHeader {
21 version: u8,
22 hashes: Vec<HashValue>,
23}
24
25impl HashHeader {
26 pub fn new(version: u8, hashes: Vec<HashValue>) -> HashHeader {
28 Self {
29 version,
30 hashes,
31 }
32 }
33
34 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); 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#[derive(Debug,Clone)]
89pub struct HashValue {
90 version: u8,
91 hash_type: HashType,
92 hash: Vec<u8>,
93}
94
95impl HashValue {
96 pub fn new(version: u8, hash_type: HashType, hash: Vec<u8>) -> HashValue{
98 Self {
99 version,
100 hash_type,
101 hash
102 }
103 }
104 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 pub fn hash_type(&self) -> &HashType {
116 &self.hash_type
117 }
118
119 pub fn set_hash(&mut self, hash: Vec<u8>) {
121 self.hash = hash
122 }
123
124 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}