aboutsummaryrefslogtreecommitdiff
path: root/src/fingerprint.rs
blob: ba06e62e819b1aed7d54748167291f287156ba74 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
//! SPKI fingerprint support.

use der::Writer;
use sha2::{Digest, Sha256};

/// Size of a SHA-256 SPKI fingerprint in bytes.
pub(crate) const SIZE: usize = 32;

/// Raw bytes of a SPKI fingerprint i.e. SHA-256 digest of
/// `SubjectPublicKeyInfo`'s DER encoding.
///
/// See [RFC7469 § 2.1.1] for more information.
///
/// [RFC7469 § 2.1.1]: https://datatracker.ietf.org/doc/html/rfc7469#section-2.1.1
pub type FingerprintBytes = [u8; SIZE];

/// Writer newtype which accepts DER being serialized on-the-fly and computes a
/// hash of the contents.
#[derive(Clone, Default)]
pub(crate) struct Builder {
    /// In-progress digest being computed from streaming DER.
    digest: Sha256,
}

impl Builder {
    /// Create a new fingerprint builder.
    pub fn new() -> Self {
        Self::default()
    }

    /// Finish computing a fingerprint, returning the computed digest.
    pub fn finish(self) -> FingerprintBytes {
        self.digest.finalize().into()
    }
}

impl Writer for Builder {
    fn write(&mut self, der_bytes: &[u8]) -> der::Result<()> {
        self.digest.update(der_bytes);
        Ok(())
    }
}