sdjwt 0.8.1

SD-JWT support for Issuers, Holders, and Verifiers
Documentation
use crate::algorithm::{base64_hash, HashAlgorithm};
use crate::Error;
use rand::{rngs::StdRng, Rng, SeedableRng};

#[derive(Debug, Clone)]
pub struct Decoy {
    digest: String,
    algorithm: HashAlgorithm,
}

impl Decoy {
    const DEFAULT_ALGORITHM: HashAlgorithm = HashAlgorithm::SHA256;

    pub fn new() -> Self {
        Decoy {
            digest: String::new(),
            algorithm: Decoy::DEFAULT_ALGORITHM,
        }
    }

    pub fn build(self) -> Result<Decoy, Error> {
        let seed: [u8; 32] = rand::random();
        let mut rng = StdRng::from_seed(seed);
        let random_number: u32 = rng.gen();

        let digest = base64_hash(self.algorithm, &random_number.to_string());

        Ok(Decoy {
            digest,
            algorithm: self.algorithm,
        })
    }

    pub fn digest(&self) -> &String {
        &self.digest
    }
}

#[cfg(test)]
mod tests {
    use super::*;

    #[test]
    fn test_default_algorothm() {
        let decoy = Decoy::new();
        assert_eq!(decoy.algorithm, HashAlgorithm::SHA256);
    }

    #[test]
    fn test_build() {
        let decoy = Decoy::new().build().unwrap();
        assert!(!decoy.digest.is_empty());
    }

    #[test]
    fn test_random_digest() {
        let decoy1 = Decoy::new().build().unwrap();
        let decoy2 = Decoy::new().build().unwrap();
        assert_ne!(decoy1.digest(), decoy2.digest());
    }
}