Skip to main content

libcrux_digest/
lib.rs

1//! This crate provides digest implementations.
2//!
3//! - Blake2
4//! - Sha2
5//! - Sha3
6//!
7//! These can be used directly, using the `blake2`, `sha2` and `sha3` submodules.
8//!
9//! ## Basic API
10//!
11//! For example, to hash a payload using Blake2b (with [`Hash`]):
12//! ```
13//! fn main() {
14//!     use libcrux_digest::blake2::*;
15//!     use libcrux_digest::Hash as _;
16//!     let mut digest = [0; 32];
17//!     Blake2b::hash(&mut digest, b"test data").unwrap();
18//! }
19//!
20//! ```
21
22//! Or to hash a payload using Blake2b (with [`HashOwned`]):
23//! ```
24//! fn main() {
25//!     use libcrux_digest::blake2::*;
26//!     use libcrux_digest::HashOwned as _;
27//!     let digest: [u8; 32] = Blake2b::hash(b"test data").unwrap();
28//! }
29//!
30//! ```
31//!
32//! ## Incremental digest API
33//!
34//! To hash a payload using Blake2b:
35//! ```
36//! fn main() {
37//!     use libcrux_digest::blake2::*;
38//!     let mut digest = [0; 32];
39//!     let mut hasher = Blake2bHasher::new();
40//!     hasher.update(b"test data").unwrap();
41//!     hasher.finish(&mut digest);
42//! }
43//!
44//! ```
45
46#[cfg(any(feature = "sha2", feature = "sha3", feature = "blake2"))]
47pub use libcrux_traits::digest::{arrayref::Hash, owned::Hash as HashOwned, Hasher};
48
49#[cfg(feature = "blake2")]
50pub mod blake2 {
51    //! Blake2 digest implementations.
52    //!
53    //! Usage example for [`Blake2b`] with [`Hash`](crate::Hash):
54    //! ```rust
55    //! use libcrux_digest::blake2::*;
56    //! use libcrux_digest::Hash as _;
57    //! let mut digest = [0; 32];
58    //! Blake2b::hash(&mut digest, b"test data").unwrap();
59    //! ```
60    //!
61    //! Usage example for [`Blake2bHasher`]:
62    //! ```rust
63    //! use libcrux_digest::blake2::*;
64    //! let mut digest = [0; 32];
65    //! let mut hasher = Blake2bHasher::new();
66    //! hasher.update(b"test data").unwrap();
67    //! hasher.finish(&mut digest);
68    //! ```
69    //!
70    //! The structs in this module are re-exported from [`libcrux_blake2`].
71    pub use libcrux_blake2::{
72        Blake2bHash as Blake2b, Blake2bHasher, Blake2sHash as Blake2s, Blake2sHasher,
73    };
74}
75
76#[cfg(feature = "sha2")]
77pub mod sha2 {
78    //! Sha2 digest implementations.
79    //!
80    //! Usage example for [`Sha2_224`] with [`Hash`](crate::Hash):
81    //! ```rust
82    //! use libcrux_digest::sha2::*;
83    //! use libcrux_digest::Hash as _;
84    //! let mut digest = [0; 28];
85    //! Sha2_224::hash(&mut digest, b"test data").unwrap();
86    //! ```
87    //!
88    //! Usage example for [`Sha2_224Hasher`]:
89    //! ```rust
90    //! use libcrux_digest::sha2::Sha2_224Hasher;
91    //! let mut digest = [0; 28];
92    //! let mut hasher = Sha2_224Hasher::default();
93    //! hasher.update(b"test data").unwrap();
94    //! hasher.finish(&mut digest);
95    //! ```
96    //!
97    //! The structs in this module are re-exported from [`libcrux_sha2`].
98    pub use libcrux_sha2::{
99        Sha224Hash as Sha2_224, Sha224Hasher as Sha2_224Hasher, Sha256Hash as Sha2_256,
100        Sha256Hasher as Sha2_256Hasher, Sha384Hash as Sha2_384, Sha384Hasher as Sha2_384Hasher,
101        Sha512Hash as Sha2_512, Sha512Hasher as Sha2_512Hasher,
102    };
103}
104
105#[cfg(feature = "sha3")]
106pub mod sha3 {
107    //! Sha3 digest implementations.
108    //!
109    //! Usage example for [`Sha3_224`] with [`Hash`](crate::Hash):
110    //! ```rust
111    //! use libcrux_digest::sha3::*;
112    //! use libcrux_digest::Hash as _;
113    //! let mut digest = [0; 28];
114    //! Sha3_224::hash(&mut digest, b"test data").unwrap();
115    //! ```
116    //!
117    //! The structs in this module are re-exported from [`libcrux_sha3`].
118
119    pub use libcrux_sha3::{Sha3_224, Sha3_256, Sha3_384, Sha3_512};
120}