sp_multihash/
multihash_impl.rs

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