pq_msg/signatures/
keypair.rs1use pqcrypto_falcon::{
2 falconpadded1024, falconpadded1024_keypair,
3 ffi::{
4 PQCLEAN_FALCONPADDED1024_CLEAN_CRYPTO_BYTES,
5 PQCLEAN_FALCONPADDED1024_CLEAN_CRYPTO_PUBLICKEYBYTES,
6 PQCLEAN_FALCONPADDED1024_CLEAN_CRYPTO_SECRETKEYBYTES,
7 },
8};
9use pqcrypto_traits::sign::{PublicKey, SecretKey, SignedMessage};
10
11use crate::errors::CryptoError;
12
13pub type PublicKeyBytes = [u8; PQCLEAN_FALCONPADDED1024_CLEAN_CRYPTO_PUBLICKEYBYTES];
15pub type SecretKeyBytes = [u8; PQCLEAN_FALCONPADDED1024_CLEAN_CRYPTO_SECRETKEYBYTES];
17
18pub trait ViewOperations {
23 fn pub_key(&self) -> &falconpadded1024::PublicKey;
25
26 fn pub_key_bytes(&self) -> &[u8; PQCLEAN_FALCONPADDED1024_CLEAN_CRYPTO_PUBLICKEYBYTES] {
28 let id = unsafe {
29 &*(self.pub_key().as_bytes().as_ptr()
30 as *const [u8; PQCLEAN_FALCONPADDED1024_CLEAN_CRYPTO_PUBLICKEYBYTES])
31 };
32 id
33 }
34
35 fn verify_comp(&self, msg: &[u8], sig: &[u8]) -> Result<bool, CryptoError> {
45 if sig.len() != PQCLEAN_FALCONPADDED1024_CLEAN_CRYPTO_BYTES + msg.len() {
46 return Err(CryptoError::InvalidSignature);
47 }
48
49 let sm = falconpadded1024::SignedMessage::from_bytes(sig)?;
50 let v_result = falconpadded1024::open(&sm, self.pub_key());
51 if let Err(e) = v_result {
52 if e.to_string().contains("verification failed") {
53 return Ok(false);
54 }
55
56 return Err(CryptoError::UnknownVerificationError);
57 }
58
59 Ok(v_result.unwrap() == msg)
61 }
62
63 fn verify_message_bytes(&self, sig: &[u8]) -> Result<Vec<u8>, CryptoError> {
71 if sig.len() < PQCLEAN_FALCONPADDED1024_CLEAN_CRYPTO_BYTES {
72 return Err(CryptoError::InvalidSignature);
73 }
74
75 let sm = falconpadded1024::SignedMessage::from_bytes(sig)?;
76 match falconpadded1024::open(&sm, self.pub_key()) {
77 Ok(msg) => Ok(msg),
78 Err(e) => {
79 if e.to_string().contains("verification failed") {
80 return Err(CryptoError::InvalidSignature);
81 }
82 return Err(CryptoError::UnknownVerificationError);
83 }
84 }
85 }
86
87 fn verify_message(&self, sm: &falconpadded1024::SignedMessage) -> Result<Vec<u8>, CryptoError> {
95 match falconpadded1024::open(&sm, self.pub_key()) {
96 Ok(msg) => Ok(msg),
97 Err(e) => {
98 if e.to_string().contains("verification failed") {
99 return Err(CryptoError::InvalidSignature);
100 }
101 return Err(CryptoError::UnknownVerificationError);
102 }
103 }
104 }
105}
106
107pub struct VerifierPair {
112 pub_key: falconpadded1024::PublicKey,
113}
114
115impl VerifierPair {
116 #[must_use]
124 pub fn new(pub_key: &[u8]) -> Result<Self, CryptoError> {
125 let pub_key = falconpadded1024::PublicKey::from_bytes(pub_key)?;
126 Ok(Self { pub_key })
127 }
128
129 pub fn from_bytes(pub_key: &[u8]) -> Result<Self, CryptoError> {
137 let pub_key = falconpadded1024::PublicKey::from_bytes(pub_key)?;
138 Ok(Self { pub_key })
139 }
140
141 pub fn to_bytes(&self) -> Vec<u8> {
146 self.pub_key.as_bytes().to_vec()
147 }
148}
149
150impl ViewOperations for VerifierPair {
151 fn pub_key(&self) -> &falconpadded1024::PublicKey {
152 &self.pub_key
153 }
154}
155
156#[derive(Clone)]
162pub struct SignerPair {
163 pub_key: falconpadded1024::PublicKey,
164 sec_key: falconpadded1024::SecretKey,
165}
166
167impl SignerPair {
168 pub fn create() -> Self {
173 let (pk, sk) = falconpadded1024_keypair();
174 Self {
175 pub_key: pk,
176 sec_key: sk,
177 }
178 }
179
180 pub fn sign(&self, msg: &[u8]) -> falconpadded1024::SignedMessage {
188 falconpadded1024::sign(msg, &self.sec_key)
189 }
190
191 pub fn from_bytes(pub_key: &[u8], sec_key: &[u8]) -> Result<Self, CryptoError> {
200 let pub_key = falconpadded1024::PublicKey::from_bytes(pub_key)?;
201 let sec_key = falconpadded1024::SecretKey::from_bytes(sec_key)?;
202 Ok(Self { pub_key, sec_key })
203 }
204
205 pub fn to_bytes(
211 &self,
212 ) -> Result<
213 (
214 [u8; PQCLEAN_FALCONPADDED1024_CLEAN_CRYPTO_PUBLICKEYBYTES],
215 [u8; PQCLEAN_FALCONPADDED1024_CLEAN_CRYPTO_SECRETKEYBYTES],
216 ),
217 CryptoError,
218 > {
219 Ok((
220 self.pub_key.as_bytes().try_into()?,
221 self.sec_key.as_bytes().try_into()?,
222 ))
223 }
224
225 pub fn to_bytes_uniform(&self) -> Vec<u8> {
230 let mut bytes = Vec::new();
231 bytes.extend_from_slice(self.pub_key.as_bytes());
232 bytes.extend_from_slice(self.sec_key.as_bytes());
233 bytes
234 }
235
236 pub fn from_bytes_uniform(bytes: &[u8]) -> Result<Self, CryptoError> {
244 if bytes.len()
245 != PQCLEAN_FALCONPADDED1024_CLEAN_CRYPTO_PUBLICKEYBYTES
246 + PQCLEAN_FALCONPADDED1024_CLEAN_CRYPTO_SECRETKEYBYTES
247 {
248 return Err(CryptoError::IncongruentLength(
249 PQCLEAN_FALCONPADDED1024_CLEAN_CRYPTO_PUBLICKEYBYTES
250 + PQCLEAN_FALCONPADDED1024_CLEAN_CRYPTO_SECRETKEYBYTES,
251 bytes.len(),
252 ));
253 }
254 let pub_key = falconpadded1024::PublicKey::from_bytes(
255 &bytes[..PQCLEAN_FALCONPADDED1024_CLEAN_CRYPTO_PUBLICKEYBYTES],
256 )?;
257 let sec_key = falconpadded1024::SecretKey::from_bytes(
258 &bytes[PQCLEAN_FALCONPADDED1024_CLEAN_CRYPTO_PUBLICKEYBYTES..],
259 )?;
260 Ok(Self { pub_key, sec_key })
261 }
262}
263
264impl ViewOperations for SignerPair {
265 fn pub_key(&self) -> &falconpadded1024::PublicKey {
266 &self.pub_key
267 }
268}
269
270#[cfg(test)]
271mod tests {
272 use super::*;
273
274 #[test]
275 fn test_signer_sign() {
276 let signer = SignerPair::create();
277 let msg = b"Hello, World!";
278 let sig = signer.sign(msg);
279
280 assert!(signer.verify_comp(msg, &sig.as_bytes().to_vec()).unwrap());
281 }
282
283 #[test]
284 fn test_verifier_verify() {
285 let signer = SignerPair::create();
286 let msg = b"Hello, World!";
287 let sig = signer.sign(msg);
288
289 let verifier = VerifierPair::new(signer.pub_key().as_bytes()).unwrap();
290 assert!(verifier.verify_comp(msg, &sig.as_bytes().to_vec()).unwrap());
291 }
292
293 #[test]
294 fn test_verify_message() {
295 let signer = SignerPair::create();
296 let msg = b"Hello, World!";
297 let sig = signer.sign(msg);
298
299 let verifier = VerifierPair::new(signer.pub_key().as_bytes()).unwrap();
300 let verified_msg = verifier.verify_message(&sig).unwrap();
301
302 assert_eq!(msg.to_vec(), verified_msg);
303 }
304
305 #[test]
306 fn test_signer_bytes() {
307 let signer = SignerPair::create();
308 let (pub_key, sec_key) = signer.to_bytes().unwrap();
309
310 let signer2 = SignerPair::from_bytes(&pub_key, &sec_key).unwrap();
311 assert_eq!(signer.pub_key().as_bytes(), signer2.pub_key().as_bytes());
312 }
313
314 #[test]
315 fn test_verifier_bytes() {
316 let signer = SignerPair::create();
317 let verifier = VerifierPair::new(signer.pub_key().as_bytes()).unwrap();
318 let pub_key = verifier.to_bytes();
319
320 let verifier2 = VerifierPair::from_bytes(&pub_key).unwrap();
321 assert_eq!(
322 verifier.pub_key().as_bytes(),
323 verifier2.pub_key().as_bytes()
324 );
325 }
326}