1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
//! Multihash implementation.
//!
//! Feature Flags
//! -------------
//!
//! Multihash has lots of [feature flags], by default a table with
//! cryptographically secure hashers is created.
//!
//! Some of the features are about specific hash functions, these are ("default"
//! marks the hashers that are enabled by default):
//!
//!  - `blake2b`: (default) Enable Blake2b hashers
//!  - `blake2s`: (default) Enable Blake2s hashers
//!  - `identity`: Enable the Identity hashers (using it is discouraged as it's
//!    not a hash function in the sense that it produces a fixed sized output
//!    independent of the input size)
//!  - `sha1`: Enable SHA-1 hasher
//!  - `sha2`: (default) Enable SHA-2 hashers
//!  - `sha3`: (default) Enable SHA-3 hashers
//!  - `strobe`: Enable Strobe hashers
//!
//! In order to enable all cryptographically secure hashers, you can set the
//! `secure-hashes` feature flag (enabled by default).
//!
//! The library has support for `no_std`, if you disable the `std` feature flag.
//!
//! The `multihash-impl` feature flag (enabled by default) enables a default
//! Multihash implementation that contains some of the bundled hashers. If you
//! want a different set of hash algorithms you can change this with enabled the
//! corresponding features.
//!
//! For example if you only need SHA2 hasher, you could set the features in the
//! `multihash` dependency like this:
//!
//! ```toml
//! multihash = { version = …, default-features = false, features = ["std", "multihash-impl", "sha2"] }
//! ```
//!
//! If you want to customize your code table even more, for example you want
//! only one specific hash digest size and not whole family, you would only
//! enable the `derive` feature (enabled by default), which enables the
//! [`Multihash` derive], together with the hashers you want.
//!
//! The `arb` feature flag enables the quickcheck arbitrary implementation for
//! property based testing.
//!
//! For serializing the multihash there is support for [Serde] via the
//! `serde-codec` feature and the [SCALE Codec] via the `scale-codec` feature.
//!
//! [feature flags]: https://doc.rust-lang.org/cargo/reference/manifest.html#the-features-section
//! [`Multihash` derive]: crate::derive
//! [Serde]: https://serde.rs
//! [SCALE Codec]: https://github.com/paritytech/parity-scale-codec

#![deny(missing_docs, unsafe_code)]
#![cfg_attr(not(any(feature = "std", test)), no_std)]

#[cfg(any(test, feature = "arb"))]
mod arb;
mod error;
mod hasher;
mod hasher_impl;
mod multihash;
#[cfg(feature = "multihash-impl")]
mod multihash_impl;

pub use crate::{
  error::{
    Error,
    Result,
  },
  hasher::{
    Digest,
    Hasher,
    StatefulHasher,
  },
  multihash::{
    Multihash as MultihashGeneric,
    MultihashDigest,
  },
};
#[cfg(feature = "derive")]
pub use sp_multihash_derive as derive;

#[cfg(feature = "multihash-impl")]
pub use crate::multihash_impl::{
  Code,
  Multihash,
};

#[cfg(feature = "blake2b")]
pub use crate::hasher_impl::blake2b::{
  Blake2b256,
  Blake2b512,
  Blake2bDigest,
  Blake2bHasher,
};
#[cfg(feature = "blake2s")]
pub use crate::hasher_impl::blake2s::{
  Blake2s128,
  Blake2s256,
  Blake2sDigest,
  Blake2sHasher,
};
#[cfg(feature = "blake3")]
pub use crate::hasher_impl::blake3::{
  Blake3Digest,
  Blake3Hasher,
  Blake3_256,
};
#[cfg(feature = "sha1")]
pub use crate::hasher_impl::sha1::{
  Sha1,
  Sha1Digest,
};
#[cfg(feature = "sha2")]
pub use crate::hasher_impl::sha2::{
  Sha2Digest,
  Sha2_256,
  Sha2_512,
};
#[cfg(feature = "sha3")]
pub use crate::hasher_impl::sha3::{
  Keccak224,
  Keccak256,
  Keccak384,
  Keccak512,
  KeccakDigest,
};
#[cfg(feature = "sha3")]
pub use crate::hasher_impl::sha3::{
  Sha3Digest,
  Sha3_224,
  Sha3_256,
  Sha3_384,
  Sha3_512,
};
#[cfg(feature = "strobe")]
pub use crate::hasher_impl::strobe::{
  Strobe256,
  Strobe512,
  StrobeDigest,
  StrobeHasher,
};
pub use crate::hasher_impl::{
  identity::{
    Identity256,
    IdentityDigest,
    IdentityHasher,
  },
  unknown::UnknownDigest,
};