encryption/hash/
streebog.rs1use streebog::{Streebog256, Streebog512};
7
8use crate::hash::{NamedDigest, hasher};
9
10hasher!(
11 Streebog256Hasher,
12 "streebog-256",
13 "Streebog-256 哈希器(无状态,可复用)。"
14);
15hasher!(
16 Streebog512Hasher,
17 "streebog-512",
18 "Streebog-512 哈希器(无状态,可复用)。"
19);
20
21impl NamedDigest for Streebog256Hasher {
22 type Core = Streebog256;
23}
24
25impl NamedDigest for Streebog512Hasher {
26 type Core = Streebog512;
27}
28
29#[cfg(test)]
30mod tests {
31 use super::*;
32 use crate::contract::Hasher;
33
34 const M1: &[u8; 63] = b"012345678901234567890123456789012345678901234567890123456789012";
39
40 #[test]
41 fn matches_standard_m1_vector() {
42 assert_eq!(
43 Streebog256Hasher::new().digest_hex(M1).unwrap(),
44 "9d151eefd8590b89daa6ba6cb74af9275dd051026bb149a452fd84e5e57b5500"
45 );
46 assert_eq!(
47 Streebog512Hasher::new().digest_hex(M1).unwrap(),
48 "1b54d01a4af5b9d5cc3d86d68d285462b19abc2475222f35c085122be4ba1ffa\
49 00ad30f8767b3a82384c6574f024c311e2a481332b08ef7f41797891c1646f48"
50 );
51 assert_eq!(Streebog256Hasher::new().digest(M1).unwrap().len(), 32);
52 assert_eq!(Streebog512Hasher::new().digest(M1).unwrap().len(), 64);
53 }
54
55 #[test]
57 fn digest_hex_is_lowercase_hex() {
58 let hex = Streebog256Hasher::new().digest_hex(b"abc").unwrap();
59 assert_eq!(hex.len(), 64);
60 assert!(
61 hex.bytes()
62 .all(|b| b.is_ascii_hexdigit() && !b.is_ascii_uppercase())
63 );
64
65 let hex = Streebog512Hasher::new().digest_hex(b"abc").unwrap();
66 assert_eq!(hex.len(), 128);
67 assert!(
68 hex.bytes()
69 .all(|b| b.is_ascii_hexdigit() && !b.is_ascii_uppercase())
70 );
71 }
72
73 #[test]
75 fn distinct_inputs_distinct_digests() {
76 let hasher = Streebog256Hasher::new();
77 assert_ne!(hasher.digest(M1).unwrap(), hasher.digest(b"abc").unwrap());
78
79 let hasher = Streebog512Hasher::new();
80 assert_ne!(hasher.digest(M1).unwrap(), hasher.digest(b"abc").unwrap());
81 }
82}