sphincs_plus_cry4/
lib.rs

1mod hash;
2mod address;
3mod wots;
4mod configurations;
5mod utils;
6mod xmss;
7mod hypertree;
8mod fors;
9mod sphincs_plus;
10
11pub use configurations::{
12    Spx128sShakeS, Spx128sShakeR, Spx128sShaS, Spx128sShaR, Spx128sBlakeS, Spx128sBlakeR,
13    Spx128fShakeS, Spx128fShakeR, Spx128fShaS, Spx128fShaR, Spx128fBlakeS, Spx128fBlakeR,
14    
15    Spx192sShakeS, Spx192sShakeR, Spx192sShaS, Spx192sShaR,
16    Spx192fShakeS, Spx192fShakeR, Spx192fShaS, Spx192fShaR,
17    
18    Spx256sShakeS, Spx256sShakeR, Spx256sShaS, Spx256sShaR,
19    Spx256fShakeS, Spx256fShakeR, Spx256fShaS, Spx256fShaR,
20};
21
22pub use sphincs_plus::{SpxPK, SpxSK, SpxSig};
23pub use configurations::{SpxTweak, SpxConfig};
24
25use crate::sphincs_plus::{spx_keygen, spx_sign, spx_verify};
26use std::{marker::PhantomData};
27
28pub struct Spx<SC: SpxConfig + SpxTweak> {
29    randomness: bool,
30    p: PhantomData<SC>,
31}
32
33impl<SC: SpxConfig + SpxTweak> Spx<SC> {
34    pub fn new(randomness: bool) -> Spx<SC> {
35        Spx{
36            randomness,
37            p: PhantomData,
38        }
39    }
40
41    pub fn keygen(&self) -> (SpxSK, SpxPK) {
42        spx_keygen::<SC>()
43    }
44
45    pub fn sign(&self, message: &[u8], sk: &SpxSK) -> SpxSig {
46        spx_sign::<SC>(message, sk, self.randomness)
47    }
48
49    pub fn verify(&self, message: &[u8], sig: SpxSig, pk: &SpxPK) -> bool {
50        spx_verify::<SC>(message, sig, pk)
51    }
52}
53
54#[cfg(test)]
55mod test {
56    use super::*;
57
58    #[test]
59    fn test_key_size_128() {
60        let spx = Spx::<Spx128fShaS>::new(true);
61        let (sk, pk) = spx.keygen();
62
63        assert_eq!(64, sk.size());
64        assert_eq!(32, pk.size());
65    }
66
67    #[test]
68    fn test_key_size_192() {
69        let spx = Spx::<Spx192fShaS>::new(true);
70        let (sk, pk) = spx.keygen();
71
72        assert_eq!(96, sk.size());
73        assert_eq!(48, pk.size());
74    }
75
76    #[test]
77    fn test_key_size_256() {
78        let spx = Spx::<Spx256fShaS>::new(true);
79        let (sk, pk) = spx.keygen();
80
81        assert_eq!(128, sk.size());
82        assert_eq!(64, pk.size());
83    }
84
85    #[test]
86    fn test_size_128s() {
87        let spx = Spx::<Spx128sShaS>::new(true);
88        let (sk, _) = spx.keygen();
89
90        let sig = spx.sign(b"lulz", &sk);
91        assert_eq!(7856, sig.size());
92    }
93
94    #[test]
95    fn test_size_128f() {
96        let spx = Spx::<Spx128fShaS>::new(true);
97        let (sk, _) = spx.keygen();
98
99        let sig = spx.sign(b"lulz", &sk);
100        assert_eq!(17088, sig.size());
101    }
102
103    #[test]
104    fn test_size_192s() {
105        let spx = Spx::<Spx192sShaS>::new(true);
106        let (sk, _) = spx.keygen();
107
108        let sig = spx.sign(b"lulz", &sk);
109        assert_eq!(16224, sig.size());
110    }
111
112    #[test]
113    fn test_size_192f() {
114        let spx = Spx::<Spx192fShaS>::new(true);
115        let (sk, _) = spx.keygen();
116
117        let sig = spx.sign(b"lulz", &sk);
118        assert_eq!(35664, sig.size());
119    }
120
121    #[test]
122    fn test_size_256s() {
123        let spx = Spx::<Spx256sShaS>::new(true);
124        let (sk, _) = spx.keygen();
125
126        let sig = spx.sign(b"lulz", &sk);
127        assert_eq!(29792, sig.size());
128    }
129
130    #[test]
131    fn test_size_256f() {
132        let spx = Spx::<Spx256fShaS>::new(true);
133        let (sk, _) = spx.keygen();
134
135        let sig = spx.sign(b"lulz", &sk);
136        assert_eq!(49856, sig.size());
137    }
138}