tiny_multihash/
multihash_impl.rs

1use tiny_multihash_derive::Multihash;
2
3/// Default (cryptographically secure) Multihash implementation.
4///
5/// This is a default set of hashing algorithms. Usually applications would use their own subset of
6/// algorithms. See the [`Multihash` derive] for more information.
7///
8/// [`Multihash` derive]: crate::derive
9#[derive(Copy, Clone, Debug, Eq, Multihash, PartialEq)]
10#[mh(alloc_size = crate::U64)]
11pub enum Code {
12    /// SHA-1 (20-byte hash size)
13    #[cfg(feature = "sha1")]
14    #[mh(code = 0x11, hasher = crate::Sha1, digest = crate::Sha1Digest<crate::U20>)]
15    Sha1,
16    /// SHA-256 (32-byte hash size)
17    #[cfg(feature = "sha2")]
18    #[mh(code = 0x12, hasher = crate::Sha2_256, digest = crate::Sha2Digest<crate::U32>)]
19    Sha2_256,
20    /// SHA-512 (64-byte hash size)
21    #[cfg(feature = "sha2")]
22    #[mh(code = 0x13, hasher = crate::Sha2_512, digest = crate::Sha2Digest<crate::U64>)]
23    Sha2_512,
24    /// SHA3-224 (28-byte hash size)
25    #[cfg(feature = "sha3")]
26    #[mh(code = 0x17, hasher = crate::Sha3_224, digest = crate::Sha3Digest<crate::U28>)]
27    Sha3_224,
28    /// SHA3-256 (32-byte hash size)
29    #[cfg(feature = "sha3")]
30    #[mh(code = 0x16, hasher = crate::Sha3_256, digest = crate::Sha3Digest<crate::U32>)]
31    Sha3_256,
32    /// SHA3-384 (48-byte hash size)
33    #[cfg(feature = "sha3")]
34    #[mh(code = 0x15, hasher = crate::Sha3_384, digest = crate::Sha3Digest<crate::U48>)]
35    Sha3_384,
36    /// SHA3-512 (64-byte hash size)
37    #[cfg(feature = "sha3")]
38    #[mh(code = 0x14, hasher = crate::Sha3_512, digest = crate::Sha3Digest<crate::U64>)]
39    Sha3_512,
40    /// Keccak-224 (28-byte hash size)
41    #[cfg(feature = "sha3")]
42    #[mh(code = 0x1a, hasher = crate::Keccak224, digest = crate::KeccakDigest<crate::U28>)]
43    Keccak224,
44    /// Keccak-256 (32-byte hash size)
45    #[cfg(feature = "sha3")]
46    #[mh(code = 0x1b, hasher = crate::Keccak256, digest = crate::KeccakDigest<crate::U32>)]
47    Keccak256,
48    /// Keccak-384 (48-byte hash size)
49    #[cfg(feature = "sha3")]
50    #[mh(code = 0x1c, hasher = crate::Keccak384, digest = crate::KeccakDigest<crate::U48>)]
51    Keccak384,
52    /// Keccak-512 (64-byte hash size)
53    #[cfg(feature = "sha3")]
54    #[mh(code = 0x1d, hasher = crate::Keccak512, digest = crate::KeccakDigest<crate::U64>)]
55    Keccak512,
56    /// BLAKE2b-256 (32-byte hash size)
57    #[cfg(feature = "blake2b")]
58    #[mh(code = 0xb220, hasher = crate::Blake2b256, digest = crate::Blake2bDigest<crate::U32>)]
59    Blake2b256,
60    /// BLAKE2b-512 (64-byte hash size)
61    #[cfg(feature = "blake2b")]
62    #[mh(code = 0xb240, hasher = crate::Blake2b512, digest = crate::Blake2bDigest<crate::U64>)]
63    Blake2b512,
64    /// BLAKE2s-128 (16-byte hash size)
65    #[cfg(feature = "blake2s")]
66    #[mh(code = 0xb250, hasher = crate::Blake2s128, digest = crate::Blake2sDigest<crate::U16>)]
67    Blake2s128,
68    /// BLAKE2s-256 (32-byte hash size)
69    #[cfg(feature = "blake2s")]
70    #[mh(code = 0xb260, hasher = crate::Blake2s256, digest = crate::Blake2sDigest<crate::U32>)]
71    Blake2s256,
72    /// BLAKE3-256 (32-byte hash size)
73    #[cfg(feature = "blake3")]
74    #[mh(code = 0x1e, hasher = crate::Blake3_256, digest = crate::Blake3Digest<crate::U32>)]
75    Blake3_256,
76}
77
78#[cfg(test)]
79mod tests {
80    use super::*;
81    use crate::hasher::Hasher;
82    use crate::hasher_impl::sha3::{Sha3_256, Sha3_512};
83    use crate::multihash::MultihashCode;
84
85    #[test]
86    fn test_hasher_256() {
87        let digest = Sha3_256::digest(b"hello world");
88        let hash = Code::multihash_from_digest(&digest);
89        let hash2 = Code::Sha3_256.digest(b"hello world");
90        assert_eq!(hash.code(), u64::from(Code::Sha3_256));
91        assert_eq!(hash.size(), 32);
92        assert_eq!(hash.digest(), &digest.as_ref()[..]);
93        assert_eq!(hash, hash2);
94    }
95
96    #[test]
97    fn test_hasher_512() {
98        let digest = Sha3_512::digest(b"hello world");
99        let hash = Code::multihash_from_digest(&digest);
100        let hash2 = Code::Sha3_512.digest(b"hello world");
101        assert_eq!(hash.code(), u64::from(Code::Sha3_512));
102        assert_eq!(hash.size(), 64);
103        assert_eq!(hash.digest(), &digest.as_ref()[..]);
104        assert_eq!(hash, hash2);
105    }
106}