1
//! Digests and XOFs used to implement the Tor protocol.
2
//!
3
//! In various places, for legacy reasons, Tor uses SHA1, SHA2, SHA3,
4
//! and SHAKE.  We re-export them all here, in forms implementing the
5
//! the [`digest::Digest`] traits.
6
//!
7
//! Other code should access these digests via the traits in the
8
//! [`digest`] crate.
9

            
10
#[cfg(feature = "with-openssl")]
11
pub use openssl_compat::Sha1;
12
#[cfg(not(feature = "with-openssl"))]
13
pub use sha1::Sha1;
14

            
15
pub use sha2::{Sha256, Sha512};
16
pub use sha3::{Sha3_256, Shake128, Shake256, Shake256Reader};
17

            
18
/// Compatibility layer between OpenSSL and `digest`
19
#[cfg(feature = "with-openssl")]
20
mod openssl_compat {
21
    use openssl::sha::Sha1 as OpenSslSha1;
22

            
23
    use digest::{FixedOutput, HashMarker, Output, OutputSizeUser, Update};
24

            
25
    /// Wrapper around OpenSSL Sha1 to make it compatible with `digest`
26
    #[derive(Default, Clone)]
27
    pub struct Sha1(OpenSslSha1);
28

            
29
    impl Update for Sha1 {
30
74239094
        fn update(&mut self, data: &[u8]) {
31
74239094
            self.0.update(data);
32
74239094
        }
33
    }
34

            
35
    impl OutputSizeUser for Sha1 {
36
        type OutputSize = typenum::consts::U20;
37
    }
38

            
39
    impl FixedOutput for Sha1 {
40
124690
        fn finalize_into(self, out: &mut Output<Self>) {
41
124690
            *out = self.0.finish().into();
42
124690
        }
43
    }
44

            
45
    impl HashMarker for Sha1 {}
46
}