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}