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}