1
2pub mod easy_hasher {
4 type _Byte = u8;
5 type _Data = Vec<_Byte>;
6 type _Input<'a> = &'a String;
7 use sha3::Digest;
8 use sha1::Sha1;
9 use std::borrow::Borrow;
10
11 mod filedata {
12 use std::fs;
13 use std::io::Read;
14 use crate::easy_hasher::_Data;
15
16 pub(crate) struct FileData {
17 fp: fs::File,
18 fm: fs::Metadata,
19 }
20
21 impl FileData {
22 pub fn open<P: AsRef<std::path::Path>>(p: P) -> Result<FileData, String> {
23 let _fp = fs::File::open(p);
24 let _file: fs::File;
25 match _fp {
26 Ok(f) => _file = f,
27 Err(e) => return Err(e.to_string())
28 };
29
30 let _fm = _file.metadata();
31 let _meta: fs::Metadata;
32 match _fm {
33 Ok(m) => _meta = m,
34 Err(e) => return Err(e.to_string())
35 }
36
37 Ok(
38 FileData {
39 fp: _file,
40 fm: _meta,
41 }
42 )
43 }
44
45 pub fn to_vec(mut self) -> Result<_Data, String> {
46 let mut vec = vec![0; self.fm.len() as usize];
47 let _res = self.fp.read(&mut vec);
48 match _res {
49 Ok(r) => if vec.len() == r {
50 Ok(vec)
51 } else {
52 Err("error reading from file".to_string())
53 },
54 Err(e) => Err(e.to_string()),
55 }
56 }
57
58 #[allow(dead_code)]
59 pub fn file(self) -> fs::File {
60 self.fp
61 }
62
63 #[allow(dead_code)]
64 pub fn metadata(self) -> fs::Metadata {
65 self.fm
66 }
67 }
68 }
69
70 pub struct Hash {
71 hash: _Data,
72 length: usize
73 }
74
75 impl Hash {
76 pub fn hex_string(data: &_Data) -> String {
78 data
79 .iter()
80 .map(|byte| format!("{:02x}", byte))
81 .collect()
82 }
83
84 pub fn from_vec(data: &_Data) -> Hash {
85 Hash {
86 hash: data.clone(),
87 length: data.len()
88 }
89 }
90
91 pub fn to_hex_string(&self) -> String {
93 Hash::hex_string(&self.hash)
94 }
95
96 pub fn to_vec(&self) -> _Data {
98 self.hash.clone()
99 }
100
101 pub fn len(&self) -> usize {
102 self.length
103 }
104 }
105
106 fn sha3<T>(mut hasher: T, data: _Data) -> Hash where T: Digest {
108 hasher.input(data.as_slice());
109 let result = hasher
110 .result()
111 .to_vec();
112 Hash::from_vec(&result)
113 }
114
115 fn sha(data: _Data) -> Hash {
116 let mut hasher = Sha1::new();
117 hasher.update(data.as_slice());
118 let result = hasher
119 .digest()
120 .bytes()
121 .to_vec();
122 Hash::from_vec(&result)
123 }
124
125 fn md2n<T>(mut hasher: T, data: _Data) -> Hash where T: Digest {
126 hasher.input(data.as_slice());
127 let result = hasher
128 .result()
129 .to_vec();
130 Hash::from_vec(&result)
131 }
132
133 pub fn param_crc8(data: _Data, poly: u8, init: u8) -> Hash {
135 let mut crc8 = crc8::Crc8::create_msb(poly);
136 let result = vec![crc8.calc(data.as_slice(), data.len() as i32, init)];
137 Hash::from_vec(&result)
138 }
139
140 pub fn file_hash(hasher: fn(_Data) -> Hash, filename: _Input) -> Result<Hash, String> {
142 use filedata::*;
143 let rfd = FileData::open(filename);
144 let fd: FileData;
145
146 match rfd {
147 Ok(data) => {
148 fd = data
149 },
150 Err(e) => {
151 println!("{}", e);
152 return Err(e)
153 },
154 }
155
156 let rcont = fd.to_vec();
157 let cont: _Data;
158
159 match rcont {
160 Ok(bytes) => cont = bytes,
161 Err(e) => return Err(e),
162 }
163
164 Ok(hasher(cont))
165 }
166
167 pub fn file_crc8(filename: _Input) -> Result<Hash, String> {
172 file_hash(raw_crc8, filename)
173 }
174
175 pub fn file_crc16(filename: _Input) -> Result<Hash, String> {
177 file_hash(raw_crc16, filename)
178 }
179
180 pub fn file_crc32(filename: _Input) -> Result<Hash, String> {
182 file_hash(raw_crc32, filename)
183 }
184
185 pub fn file_crc64(filename: _Input) -> Result<Hash, String> {
187 file_hash(raw_crc64, filename)
188 }
189
190 pub fn file_md5(filename: _Input) -> Result<Hash, String> {
192 file_hash(raw_md5, filename)
193 }
194
195 pub fn file_sha1(filename: _Input) -> Result<Hash, String> {
197 file_hash(raw_sha1, filename)
198 }
199
200 pub fn file_sha224(filename: _Input) -> Result<Hash, String> {
202 file_hash(raw_sha224, filename)
203 }
204
205 pub fn file_sha256(filename: String) -> Result<Hash, String> {
207 file_hash(raw_sha256, filename.borrow())
208 }
209
210 pub fn file_sha384(filename: _Input) -> Result<Hash, String> {
212 file_hash(raw_sha384, filename)
213 }
214
215 pub fn file_sha512(filename: _Input) -> Result<Hash, String> {
217 file_hash(raw_sha512, filename)
218 }
219
220 pub fn file_sha512_224(filename: _Input) -> Result<Hash, String> {
222 file_hash(raw_sha512_224, filename)
223 }
224
225 pub fn file_sha512_256(filename: _Input) -> Result<Hash, String> {
227 file_hash(raw_sha512_256, filename)
228 }
229
230 pub fn file_sha3_224(filename: _Input) -> Result<Hash, String> {
232 file_hash(raw_sha3_224, filename)
233 }
234
235 pub fn file_sha3_256(filename: _Input) -> Result<Hash, String> {
237 file_hash(raw_sha3_256, filename)
238 }
239
240 pub fn file_sha3_384(filename: _Input) -> Result<Hash, String> {
242 file_hash(raw_sha3_384, filename)
243 }
244
245 pub fn file_sha3_512(filename: _Input) -> Result<Hash, String> {
247 file_hash(raw_sha3_512, filename)
248 }
249
250 pub fn file_keccak_224(filename: _Input) -> Result<Hash, String> {
252 file_hash(raw_keccak224, filename)
253 }
254
255 pub fn file_keccak_256(filename: _Input) -> Result<Hash, String> {
257 file_hash(raw_keccak256, filename)
258 }
259
260 pub fn file_keccak_384(filename: _Input) -> Result<Hash, String> {
262 file_hash(raw_keccak384, filename)
263 }
264
265 pub fn file_keccak_512(filename: _Input) -> Result<Hash, String> {
267 file_hash(raw_keccak512, filename)
268 }
269
270
271 pub fn raw_crc8(d: _Data) -> Hash {
276 param_crc8(d, 0x7, 0x0)
277 }
278
279 pub fn raw_crc16(d: _Data) -> Hash {
281 let result = crc16::State::<crc16::ARC>::calculate(d.as_slice())
282 .to_be_bytes()
283 .to_vec()
284 .clone();
285 Hash::from_vec(&result)
286 }
287
288 pub fn raw_crc32(d: _Data) -> Hash {
290 let result = crc::crc32::checksum_ieee(d.as_slice())
291 .to_be_bytes()
292 .to_vec()
293 .clone();
294 Hash::from_vec(&result)
295 }
296
297 pub fn raw_crc64(d: _Data) -> Hash {
299 let result = crc::crc64::checksum_ecma(d.as_slice())
300 .to_be_bytes()
301 .to_vec()
302 .clone();
303 Hash::from_vec(&result)
304 }
305
306 pub fn raw_md2(d: _Data) -> Hash {
308 use md2::Md2;
309 md2n(Md2::new(), d)
310 }
311
312 pub fn raw_md4(d: _Data) -> Hash {
314 use md4::Md4;
315 md2n(Md4::new(), d)
316 }
317
318 pub fn raw_md5(d: _Data) -> Hash {
320 let result = md5::compute(d)
321 .0
322 .to_vec();
323 Hash::from_vec(&result)
324 }
325
326 pub fn raw_sha1(d: _Data) -> Hash {
328 sha(d)
329 }
330
331 pub fn raw_sha224(d: _Data) -> Hash {
333 sha3(sha2::Sha224::new(), d)
334 }
335
336 pub fn raw_sha256(d: _Data) -> Hash {
338 sha3(sha2::Sha256::new(), d)
339 }
340
341 pub fn raw_sha384(d: _Data) -> Hash {
343 sha3(sha2::Sha384::new(), d)
344 }
345
346 pub fn raw_sha512(d: _Data) -> Hash {
348 sha3(sha2::Sha512::new(), d)
349 }
350
351 pub fn raw_sha512_224(d: _Data) -> Hash {
353 sha3(sha2::Sha512Trunc224::new(), d)
354 }
355
356 pub fn raw_sha512_256(d: _Data) -> Hash {
358 sha3(sha2::Sha512Trunc256::new(), d)
359 }
360
361 pub fn raw_sha3_224(d: _Data) -> Hash {
363 sha3(sha3::Sha3_224::new(), d)
364 }
365
366 pub fn raw_sha3_256(d: _Data) -> Hash {
368 sha3(sha3::Sha3_256::new(), d)
369 }
370
371 pub fn raw_sha3_384(d: _Data) -> Hash {
373 sha3(sha3::Sha3_384::new(), d)
374 }
375
376 pub fn raw_sha3_512(d: _Data) -> Hash {
378 sha3(sha3::Sha3_512::new(), d)
379 }
380
381 pub fn raw_keccak224(d: _Data) -> Hash {
383 sha3(sha3::Keccak224::new(), d)
384 }
385
386 pub fn raw_keccak256(d: _Data) -> Hash {
388 sha3(sha3::Keccak256::new(), d)
389 }
390
391 pub fn raw_keccak384(d: _Data) -> Hash {
393 sha3(sha3::Keccak384::new(), d)
394 }
395
396 pub fn raw_keccak512(d: _Data) -> Hash {
398 sha3(sha3::Keccak512::new(), d)
399 }
400
401 pub fn crc8(s: _Input) -> Hash {
406 raw_crc8(s.clone().into_bytes())
407 }
408
409 pub fn crc16(s: _Input) -> Hash {
411 raw_crc16(s.clone().into_bytes())
412 }
413
414 pub fn crc32(s: _Input) -> Hash {
416 raw_crc32(s.clone().into_bytes())
417 }
418
419 pub fn crc64(s: _Input) -> Hash {
421 raw_crc64(s.clone().into_bytes())
422 }
423
424 pub fn md2(s: _Input) -> Hash {
426 raw_md2(s.clone().into_bytes())
427 }
428
429 pub fn md4(s: _Input) -> Hash {
431 raw_md4(s.clone().into_bytes())
432 }
433
434 pub fn md5(s: _Input) -> Hash {
436 raw_md5(s.clone().into_bytes())
437 }
438
439 pub fn sha1(s: _Input) -> Hash {
441 raw_sha1(s.clone().into_bytes())
442 }
443
444 pub fn sha224(s: _Input) -> Hash {
446 raw_sha224(s.clone().into_bytes())
447 }
448
449 pub fn sha256(s: _Input) -> Hash {
451 raw_sha256(s.clone().into_bytes())
452 }
453
454 pub fn sha384(s: _Input) -> Hash {
456 raw_sha384(s.clone().into_bytes())
457 }
458
459 pub fn sha512(s: _Input) -> Hash {
461 raw_sha512(s.clone().into_bytes())
462 }
463
464 pub fn sha512_224(s: _Input) -> Hash {
466 raw_sha512_224(s.clone().into_bytes())
467 }
468
469 pub fn sha512_256(s: _Input) -> Hash {
471 raw_sha512_256(s.clone().into_bytes())
472 }
473
474 pub fn sha3_224(s: _Input) -> Hash {
476 raw_sha3_224(s.clone().into_bytes())
477 }
478
479 pub fn sha3_256(s: _Input) -> Hash {
481 raw_sha3_256(s.clone().into_bytes())
482 }
483
484 pub fn sha3_384(s: _Input) -> Hash {
486 raw_sha3_384(s.clone().into_bytes())
487 }
488
489 pub fn sha3_512(s: _Input) -> Hash {
491 raw_sha3_512(s.clone().into_bytes())
492 }
493
494 pub fn keccak224(s: _Input) -> Hash {
496 raw_keccak224(s.clone().into_bytes())
497 }
498
499 pub fn keccak256(s: _Input) -> Hash {
501 raw_keccak256(s.clone().into_bytes())
502 }
503
504 pub fn keccak384(s: _Input) -> Hash {
506 raw_keccak384(s.clone().into_bytes())
507 }
508
509 pub fn keccak512(s: _Input) -> Hash {
511 raw_keccak512(s.clone().into_bytes())
512 }
513}