Skip to main content

dns_update/
crypto.rs

1/*
2 * Copyright Stalwart Labs LLC See the COPYING
3 * file at the top-level directory of this distribution.
4 *
5 * Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
6 * https://www.apache.org/licenses/LICENSE-2.0> or the MIT license
7 * <LICENSE-MIT or https://opensource.org/licenses/MIT>, at your
8 * option. This file may not be copied, modified, or distributed
9 * except according to those terms.
10 */
11
12#[inline(always)]
13pub fn sha1_digest(data: &[u8]) -> Vec<u8> {
14    #[cfg(feature = "aws-lc-rs")]
15    return aws_lc_rs::digest::digest(&aws_lc_rs::digest::SHA1_FOR_LEGACY_USE_ONLY, data)
16        .as_ref()
17        .to_vec();
18
19    #[cfg(all(feature = "ring", not(feature = "aws-lc-rs")))]
20    return ring::digest::digest(&ring::digest::SHA1_FOR_LEGACY_USE_ONLY, data)
21        .as_ref()
22        .to_vec();
23
24    #[cfg(not(any(feature = "aws-lc-rs", feature = "ring")))]
25    unimplemented!();
26}
27
28#[inline(always)]
29pub fn sha256_digest(data: &[u8]) -> Vec<u8> {
30    #[cfg(feature = "aws-lc-rs")]
31    return aws_lc_rs::digest::digest(&aws_lc_rs::digest::SHA256, data)
32        .as_ref()
33        .to_vec();
34
35    #[cfg(all(feature = "ring", not(feature = "aws-lc-rs")))]
36    return ring::digest::digest(&ring::digest::SHA256, data)
37        .as_ref()
38        .to_vec();
39
40    #[cfg(not(any(feature = "aws-lc-rs", feature = "ring")))]
41    unimplemented!();
42}
43
44pub fn hmac_sha256(key: &[u8], data: &[u8]) -> Vec<u8> {
45    #[cfg(feature = "aws-lc-rs")]
46    {
47        let key = aws_lc_rs::hmac::Key::new(aws_lc_rs::hmac::HMAC_SHA256, key);
48        let tag = aws_lc_rs::hmac::sign(&key, data);
49        tag.as_ref().to_vec()
50    }
51
52    #[cfg(all(feature = "ring", not(feature = "aws-lc-rs")))]
53    {
54        let key = ring::hmac::Key::new(ring::hmac::HMAC_SHA256, key);
55        let tag = ring::hmac::sign(&key, data);
56        tag.as_ref().to_vec()
57    }
58
59    #[cfg(not(any(feature = "aws-lc-rs", feature = "ring")))]
60    unimplemented!();
61}
62
63#[cfg(test)]
64mod tests {
65    use super::*;
66
67    #[test]
68    fn test_sha1_digest() {
69        let data = b"hello world";
70        let digest = sha1_digest(data);
71        let hex_digest = digest
72            .iter()
73            .map(|b| format!("{:02x}", b))
74            .collect::<String>();
75
76        assert_eq!(hex_digest, "2aae6c35c94fcfb415dbe95f408b9ce91ee846ed");
77    }
78}