Skip to main content

securedrop_protocol_minimal/keys/
newsroom.rs

1use rand_core::{CryptoRng, RngCore};
2
3use crate::sign::{DomainTag, Signature, SigningKey, VerifyingKey};
4
5/// Newsroom keypair used for signing.
6pub struct NewsroomKeyPair {
7    vk: VerifyingKey,
8    sk: SigningKey,
9}
10
11impl core::fmt::Debug for NewsroomKeyPair {
12    fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result {
13        // Redacts secret key
14        f.debug_struct("NewsroomKeyPair")
15            .field("vk", &self.vk)
16            .finish_non_exhaustive()
17    }
18}
19
20impl NewsroomKeyPair {
21    pub fn new<R: RngCore + CryptoRng>(mut rng: R) -> Result<Self, anyhow::Error> {
22        let sk = SigningKey::new(&mut rng)?;
23        let vk = sk.vk;
24        Ok(Self { sk, vk })
25    }
26
27    /// Returns the verification key.
28    pub fn verifying_key(&self) -> VerifyingKey {
29        self.vk
30    }
31
32    /// Sign `msg` in domain `D` using the newsroom signing key.
33    pub fn sign<D: DomainTag>(&self, msg: &[u8]) -> Signature<D> {
34        self.sk.sign(msg)
35    }
36}