Skip to main content

sha3/
lib.rs

1#![no_std]
2#![doc = include_str!("../README.md")]
3#![doc(
4    html_logo_url = "https://raw.githubusercontent.com/RustCrypto/media/6ee8e381/logo.svg",
5    html_favicon_url = "https://raw.githubusercontent.com/RustCrypto/media/6ee8e381/logo.svg"
6)]
7#![cfg_attr(docsrs, feature(doc_cfg))]
8#![forbid(unsafe_code)]
9#![warn(missing_docs, missing_debug_implementations)]
10#![warn(unreachable_pub)]
11
12pub use digest::{self, CollisionResistance, CustomizedInit, Digest};
13
14/// Block-level types
15pub mod block_api;
16mod cshake;
17mod turbo_shake;
18
19pub use cshake::{CShake128, CShake128Reader, CShake256, CShake256Reader};
20pub use turbo_shake::{TurboShake128, TurboShake128Reader, TurboShake256, TurboShake256Reader};
21
22use block_api::{Sha3HasherCore, Sha3ReaderCore};
23use digest::consts::{U0, U16, U28, U32, U48, U64, U72, U104, U136, U144, U168, U200};
24
25// Paddings
26const KECCAK_PAD: u8 = 0x01;
27const SHA3_PAD: u8 = 0x06;
28const SHAKE_PAD: u8 = 0x1f;
29const CSHAKE_PAD: u8 = 0x04;
30
31digest::buffer_fixed!(
32    /// SHA-3-224 hasher.
33    pub struct Sha3_224(Sha3HasherCore<U144, U28, SHA3_PAD>);
34    oid: "2.16.840.1.101.3.4.2.7";
35    impl: FixedHashTraits;
36);
37digest::buffer_fixed!(
38    /// SHA-3-256 hasher.
39    pub struct Sha3_256(Sha3HasherCore<U136, U32, SHA3_PAD>);
40    oid: "2.16.840.1.101.3.4.2.8";
41    impl: FixedHashTraits;
42);
43digest::buffer_fixed!(
44    /// SHA-3-384 hasher.
45    pub struct Sha3_384(Sha3HasherCore<U104, U48, SHA3_PAD>);
46    oid: "2.16.840.1.101.3.4.2.9";
47    impl: FixedHashTraits;
48);
49digest::buffer_fixed!(
50    /// SHA-3-512 hasher.
51    pub struct Sha3_512(Sha3HasherCore<U72, U64, SHA3_PAD>);
52    oid: "2.16.840.1.101.3.4.2.10";
53    impl: FixedHashTraits;
54);
55digest::buffer_xof!(
56    /// SHAKE128 hasher.
57    pub struct Shake128(Sha3HasherCore<U168, U0, SHAKE_PAD>);
58    oid: "2.16.840.1.101.3.4.2.11";
59    impl: XofHasherTraits;
60    /// SHAKE128 XOF reader.
61    pub struct Shake128Reader(Sha3ReaderCore<U168>);
62    impl: XofReaderTraits;
63);
64digest::buffer_xof!(
65    /// SHAKE256 hasher.
66    pub struct Shake256(Sha3HasherCore<U136, U0, SHAKE_PAD>);
67    oid: "2.16.840.1.101.3.4.2.12";
68    impl: XofHasherTraits;
69    /// SHAKE256 XOF reader.
70    pub struct Shake256Reader(Sha3ReaderCore<U136>);
71    impl: XofReaderTraits;
72);
73
74digest::buffer_fixed!(
75    /// SHA-3 CryptoNight variant.
76    pub struct Keccak256Full(Sha3HasherCore<U136, U200, KECCAK_PAD>);
77    impl: FixedHashTraits;
78);
79digest::buffer_fixed!(
80    /// Keccak-224 hasher.
81    pub struct Keccak224(Sha3HasherCore<U144, U28, KECCAK_PAD>);
82    impl: FixedHashTraits;
83);
84digest::buffer_fixed!(
85    /// Keccak-256 hasher.
86    pub struct Keccak256(Sha3HasherCore<U136, U32, KECCAK_PAD>);
87    impl: FixedHashTraits;
88);
89digest::buffer_fixed!(
90    /// Keccak-384 hasher.
91    pub struct Keccak384(Sha3HasherCore<U104, U48, KECCAK_PAD>);
92    impl: FixedHashTraits;
93);
94digest::buffer_fixed!(
95    /// Keccak-512 hasher.
96    pub struct Keccak512(Sha3HasherCore<U72, U64, KECCAK_PAD>);
97    impl: FixedHashTraits;
98);
99
100impl CollisionResistance for Shake128 {
101    // https://nvlpubs.nist.gov/nistpubs/FIPS/NIST.FIPS.202.pdf#page=31
102    type CollisionResistance = U16;
103}
104
105impl CollisionResistance for Shake256 {
106    // https://nvlpubs.nist.gov/nistpubs/FIPS/NIST.FIPS.202.pdf#page=31
107    type CollisionResistance = U32;
108}