1#![allow(
10 clippy::too_many_arguments,
11 clippy::needless_range_loop,
12 clippy::uninlined_format_args,
13 clippy::must_use_candidate,
14 clippy::cast_precision_loss,
15 clippy::cast_lossless,
16 clippy::manual_clamp,
17 clippy::unused_self,
18 clippy::unnecessary_wraps,
19 clippy::let_and_return,
20 clippy::identity_op,
21 clippy::erasing_op,
22 clippy::struct_excessive_bools,
23 clippy::doc_markdown
24)]
25#![cfg_attr(not(feature = "std"), no_std)]
78#![deny(unsafe_code)]
79#![deny(unused_qualifications)]
80
81extern crate alloc;
82
83#[cfg(not(feature = "std"))]
84use alloc::vec;
85#[cfg(feature = "alloc")]
87use alloc::vec::Vec;
88use core::marker::PhantomData;
89
90pub use fn_dsa::{
92 DOMAIN_NONE,
93 FN_DSA_LOGN_512,
94 FN_DSA_LOGN_1024,
95 HASH_ID_RAW,
96 KeyPairGenerator,
97 KeyPairGeneratorStandard,
98 SigningKey,
99 SigningKeyStandard,
100 VerifyingKey,
101 VerifyingKeyStandard,
102 sign_key_size,
103 signature_size,
104 vrfy_key_size,
105};
106pub use lib_q_core::{
107 Error,
108 Result,
109 SigKeypair,
110 SigPublicKey,
111 SigSecretKey,
112 Signature,
113};
114use rand_core::CryptoRng;
116
117fn get_rng() -> impl CryptoRng {
119 lib_q_random::FnDsaRng::new()
120}
121
122#[derive(Debug, Clone, Copy, PartialEq, Eq)]
124pub enum FnDsaSecurityLevel {
125 Level1,
127 Level5,
129}
130
131impl FnDsaSecurityLevel {
132 pub fn logn(&self) -> u32 {
134 match self {
135 FnDsaSecurityLevel::Level1 => FN_DSA_LOGN_512,
136 FnDsaSecurityLevel::Level5 => FN_DSA_LOGN_1024,
137 }
138 }
139
140 pub fn key_sizes(&self) -> (usize, usize, usize) {
142 let logn = self.logn();
143 (
144 sign_key_size(logn),
145 vrfy_key_size(logn),
146 signature_size(logn),
147 )
148 }
149}
150
151pub trait FnDsaImpl {
153 fn security_level(&self) -> FnDsaSecurityLevel;
155
156 fn logn(&self) -> u32;
158}
159
160pub struct FnDsa512 {
162 _phantom: PhantomData<()>,
163}
164
165impl FnDsa512 {
166 pub fn new() -> Self {
168 Self {
169 _phantom: PhantomData,
170 }
171 }
172}
173
174impl FnDsaImpl for FnDsa512 {
175 fn security_level(&self) -> FnDsaSecurityLevel {
176 FnDsaSecurityLevel::Level1
177 }
178
179 fn logn(&self) -> u32 {
180 FN_DSA_LOGN_512
181 }
182}
183
184impl Signature for FnDsa512 {
185 fn generate_keypair(&self) -> Result<SigKeypair> {
186 let mut kg = KeyPairGeneratorStandard::default();
188 let mut sign_key = {
189 let v = vec![0; sign_key_size(self.logn())];
190 v
191 };
192 let mut vrfy_key = {
193 let v = vec![0; vrfy_key_size(self.logn())];
194 v
195 };
196
197 let mut rng = get_rng();
199
200 kg.keygen(self.logn(), &mut rng, &mut sign_key, &mut vrfy_key);
201
202 Ok(SigKeypair::new(vrfy_key, sign_key))
203 }
204
205 fn sign(&self, secret_key: &SigSecretKey, message: &[u8]) -> Result<Vec<u8>> {
206 let mut sk = SigningKeyStandard::decode(secret_key.as_bytes()).ok_or_else(|| {
208 Error::InvalidKeySize {
209 expected: sign_key_size(self.logn()),
210 actual: secret_key.as_bytes().len(),
211 }
212 })?;
213
214 let mut signature = {
216 let v = vec![0; signature_size(self.logn())];
217 v
218 };
219
220 let mut rng = get_rng();
222
223 sk.sign(
225 &mut rng,
226 &DOMAIN_NONE,
227 &HASH_ID_RAW,
228 message,
229 &mut signature,
230 );
231
232 Ok(signature)
233 }
234
235 fn verify(&self, public_key: &SigPublicKey, message: &[u8], signature: &[u8]) -> Result<bool> {
236 let expected_sig_size = signature_size(self.logn());
238 if signature.len() != expected_sig_size {
239 return Err(Error::InvalidSignatureSize {
240 expected: expected_sig_size,
241 actual: signature.len(),
242 });
243 }
244
245 let vk = VerifyingKeyStandard::decode(public_key.as_bytes()).ok_or_else(|| {
247 Error::InvalidKeySize {
248 expected: vrfy_key_size(self.logn()),
249 actual: public_key.as_bytes().len(),
250 }
251 })?;
252
253 let is_valid = vk.verify(signature, &DOMAIN_NONE, &HASH_ID_RAW, message);
255
256 Ok(is_valid)
257 }
258}
259
260impl Default for FnDsa512 {
261 fn default() -> Self {
262 Self::new()
263 }
264}
265
266pub struct FnDsa1024 {
268 _phantom: PhantomData<()>,
269}
270
271impl FnDsa1024 {
272 pub fn new() -> Self {
274 Self {
275 _phantom: PhantomData,
276 }
277 }
278}
279
280impl FnDsaImpl for FnDsa1024 {
281 fn security_level(&self) -> FnDsaSecurityLevel {
282 FnDsaSecurityLevel::Level5
283 }
284
285 fn logn(&self) -> u32 {
286 FN_DSA_LOGN_1024
287 }
288}
289
290impl Signature for FnDsa1024 {
291 fn generate_keypair(&self) -> Result<SigKeypair> {
292 let mut kg = KeyPairGeneratorStandard::default();
294 let mut sign_key = {
295 let v = vec![0; sign_key_size(self.logn())];
296 v
297 };
298 let mut vrfy_key = {
299 let v = vec![0; vrfy_key_size(self.logn())];
300 v
301 };
302
303 let mut rng = get_rng();
305
306 kg.keygen(self.logn(), &mut rng, &mut sign_key, &mut vrfy_key);
307
308 Ok(SigKeypair::new(vrfy_key, sign_key))
309 }
310
311 fn sign(&self, secret_key: &SigSecretKey, message: &[u8]) -> Result<Vec<u8>> {
312 let mut sk = SigningKeyStandard::decode(secret_key.as_bytes()).ok_or_else(|| {
314 Error::InvalidKeySize {
315 expected: sign_key_size(self.logn()),
316 actual: secret_key.as_bytes().len(),
317 }
318 })?;
319
320 let mut signature = {
322 let v = vec![0; signature_size(self.logn())];
323 v
324 };
325
326 let mut rng = get_rng();
328
329 sk.sign(
331 &mut rng,
332 &DOMAIN_NONE,
333 &HASH_ID_RAW,
334 message,
335 &mut signature,
336 );
337
338 Ok(signature)
339 }
340
341 fn verify(&self, public_key: &SigPublicKey, message: &[u8], signature: &[u8]) -> Result<bool> {
342 let expected_sig_size = signature_size(self.logn());
344 if signature.len() != expected_sig_size {
345 return Err(Error::InvalidSignatureSize {
346 expected: expected_sig_size,
347 actual: signature.len(),
348 });
349 }
350
351 let vk = VerifyingKeyStandard::decode(public_key.as_bytes()).ok_or_else(|| {
353 Error::InvalidKeySize {
354 expected: vrfy_key_size(self.logn()),
355 actual: public_key.as_bytes().len(),
356 }
357 })?;
358
359 let is_valid = vk.verify(signature, &DOMAIN_NONE, &HASH_ID_RAW, message);
361
362 Ok(is_valid)
363 }
364}
365
366impl Default for FnDsa1024 {
367 fn default() -> Self {
368 Self::new()
369 }
370}
371
372pub struct FnDsa {
374 security_level: FnDsaSecurityLevel,
375}
376
377impl FnDsa {
378 pub fn new(security_level: FnDsaSecurityLevel) -> Self {
380 Self { security_level }
381 }
382
383 pub fn level1() -> Self {
385 Self::new(FnDsaSecurityLevel::Level1)
386 }
387
388 pub fn level5() -> Self {
390 Self::new(FnDsaSecurityLevel::Level5)
391 }
392
393 pub fn security_level(&self) -> FnDsaSecurityLevel {
395 self.security_level
396 }
397
398 pub fn logn(&self) -> u32 {
400 self.security_level.logn()
401 }
402}
403
404impl Signature for FnDsa {
405 fn generate_keypair(&self) -> Result<SigKeypair> {
406 let mut kg = KeyPairGeneratorStandard::default();
408 let mut sign_key = {
409 let v = vec![0; sign_key_size(self.logn())];
410 v
411 };
412 let mut vrfy_key = {
413 let v = vec![0; vrfy_key_size(self.logn())];
414 v
415 };
416
417 let mut rng = get_rng();
419
420 kg.keygen(self.logn(), &mut rng, &mut sign_key, &mut vrfy_key);
421
422 Ok(SigKeypair::new(vrfy_key, sign_key))
423 }
424
425 fn sign(&self, secret_key: &SigSecretKey, message: &[u8]) -> Result<Vec<u8>> {
426 let mut sk = SigningKeyStandard::decode(secret_key.as_bytes()).ok_or_else(|| {
428 Error::InvalidKeySize {
429 expected: sign_key_size(self.logn()),
430 actual: secret_key.as_bytes().len(),
431 }
432 })?;
433
434 let mut signature = {
436 let v = vec![0; signature_size(self.logn())];
437 v
438 };
439
440 let mut rng = get_rng();
442
443 sk.sign(
445 &mut rng,
446 &DOMAIN_NONE,
447 &HASH_ID_RAW,
448 message,
449 &mut signature,
450 );
451
452 Ok(signature)
453 }
454
455 fn verify(&self, public_key: &SigPublicKey, message: &[u8], signature: &[u8]) -> Result<bool> {
456 let expected_sig_size = signature_size(self.logn());
458 if signature.len() != expected_sig_size {
459 return Err(Error::InvalidSignatureSize {
460 expected: expected_sig_size,
461 actual: signature.len(),
462 });
463 }
464
465 let vk = VerifyingKeyStandard::decode(public_key.as_bytes()).ok_or_else(|| {
467 Error::InvalidKeySize {
468 expected: vrfy_key_size(self.logn()),
469 actual: public_key.as_bytes().len(),
470 }
471 })?;
472
473 let is_valid = vk.verify(signature, &DOMAIN_NONE, &HASH_ID_RAW, message);
475
476 Ok(is_valid)
477 }
478}
479
480impl Default for FnDsa {
481 fn default() -> Self {
482 Self::level1()
483 }
484}
485
486pub mod utils {
488 use super::*;
489
490 pub fn get_key_sizes(security_level: FnDsaSecurityLevel) -> (usize, usize, usize) {
492 security_level.key_sizes()
493 }
494
495 pub fn validate_key_sizes(
497 security_level: FnDsaSecurityLevel,
498 sign_key_size: usize,
499 vrfy_key_size: usize,
500 signature_size: usize,
501 ) -> Result<()> {
502 let (expected_sign, expected_vrfy, expected_sig) = security_level.key_sizes();
503
504 if sign_key_size != expected_sign {
505 return Err(Error::InvalidKeySize {
506 expected: expected_sign,
507 actual: sign_key_size,
508 });
509 }
510
511 if vrfy_key_size != expected_vrfy {
512 return Err(Error::InvalidKeySize {
513 expected: expected_vrfy,
514 actual: vrfy_key_size,
515 });
516 }
517
518 if signature_size != expected_sig {
519 return Err(Error::InvalidKeySize {
520 expected: expected_sig,
521 actual: signature_size,
522 });
523 }
524
525 Ok(())
526 }
527}
528
529#[cfg(test)]
530mod tests {
531 use super::*;
532
533 type TestResult = std::result::Result<(), Box<dyn std::error::Error>>;
534
535 #[test]
536 fn test_fn_dsa512_creation() {
537 let fn_dsa = FnDsa512::new();
538 assert_eq!(fn_dsa.security_level(), FnDsaSecurityLevel::Level1);
539 assert_eq!(fn_dsa.logn(), FN_DSA_LOGN_512);
540 }
541
542 #[test]
543 fn test_fn_dsa1024_creation() {
544 let fn_dsa = FnDsa1024::new();
545 assert_eq!(fn_dsa.security_level(), FnDsaSecurityLevel::Level5);
546 assert_eq!(fn_dsa.logn(), FN_DSA_LOGN_1024);
547 }
548
549 #[test]
550 fn test_fn_dsa_generic_creation() {
551 let fn_dsa1 = FnDsa::level1();
552 assert_eq!(fn_dsa1.security_level(), FnDsaSecurityLevel::Level1);
553
554 let fn_dsa5 = FnDsa::level5();
555 assert_eq!(fn_dsa5.security_level(), FnDsaSecurityLevel::Level5);
556 }
557
558 #[test]
559 fn test_key_sizes() {
560 let (sign_size_512, vrfy_size_512, sig_size_512) = FnDsaSecurityLevel::Level1.key_sizes();
561 let (sign_size_1024, vrfy_size_1024, sig_size_1024) =
562 FnDsaSecurityLevel::Level5.key_sizes();
563
564 assert!(sign_size_1024 > sign_size_512);
566 assert!(vrfy_size_1024 > vrfy_size_512);
567 assert!(sig_size_1024 > sig_size_512);
568
569 assert_eq!(sign_size_512, 1281);
571 assert_eq!(vrfy_size_512, 897);
572 assert_eq!(sig_size_512, 666);
573
574 assert_eq!(sign_size_1024, 2305);
575 assert_eq!(vrfy_size_1024, 1793);
576 assert_eq!(sig_size_1024, 1280);
577 }
578
579 #[test]
580 fn test_utils_validation() {
581 let result = utils::validate_key_sizes(FnDsaSecurityLevel::Level1, 1281, 897, 666);
583 assert!(result.is_ok());
584
585 let result = utils::validate_key_sizes(
587 FnDsaSecurityLevel::Level1,
588 1280,
589 897,
590 666, );
592 assert!(result.is_err());
593 }
594
595 #[test]
596 fn test_keypair_generation() -> TestResult {
597 let fn_dsa = FnDsa512::new();
598 let keypair = fn_dsa.generate_keypair()?;
599
600 assert_eq!(
601 keypair.public_key().as_bytes().len(),
602 vrfy_key_size(FN_DSA_LOGN_512)
603 );
604 assert_eq!(
605 keypair.secret_key().as_bytes().len(),
606 sign_key_size(FN_DSA_LOGN_512)
607 );
608
609 let message = b"coverage keypair generation message";
611 let signature = fn_dsa.sign(&keypair.secret_key, message)?;
612 assert_eq!(signature.len(), signature_size(FN_DSA_LOGN_512));
613 assert!(fn_dsa.verify(&keypair.public_key, message, &signature)?);
614
615 let invalid_signature = vec![0_u8; signature.len().saturating_sub(1)];
617 let verify_err = fn_dsa.verify(&keypair.public_key, message, &invalid_signature);
618 assert!(matches!(
619 verify_err,
620 Err(Error::InvalidSignatureSize {
621 expected,
622 actual
623 }) if expected == signature_size(FN_DSA_LOGN_512) && actual + 1 == expected
624 ));
625
626 let invalid_secret_key = SigSecretKey::new(vec![0_u8; sign_key_size(FN_DSA_LOGN_512) - 1]);
628 let sign_err = fn_dsa.sign(&invalid_secret_key, b"invalid secret key");
629 assert!(matches!(
630 sign_err,
631 Err(Error::InvalidKeySize {
632 expected,
633 actual
634 }) if expected == sign_key_size(FN_DSA_LOGN_512)
635 && actual == sign_key_size(FN_DSA_LOGN_512) - 1
636 ));
637
638 let invalid_public_key = SigPublicKey::new(vec![0_u8; vrfy_key_size(FN_DSA_LOGN_512) - 1]);
640 let verify_key_err = fn_dsa.verify(&invalid_public_key, message, &signature);
641 assert!(matches!(
642 verify_key_err,
643 Err(Error::InvalidKeySize {
644 expected,
645 actual
646 }) if expected == vrfy_key_size(FN_DSA_LOGN_512)
647 && actual == vrfy_key_size(FN_DSA_LOGN_512) - 1
648 ));
649 Ok(())
650 }
651
652 #[test]
653 fn test_sign_and_verify() -> TestResult {
654 let fn_dsa = FnDsa512::new();
655 let keypair = fn_dsa.generate_keypair()?;
656
657 let message = b"Hello, FN-DSA!";
658 let signature = fn_dsa.sign(&keypair.secret_key, message)?;
659
660 let is_valid = fn_dsa.verify(&keypair.public_key, message, &signature)?;
661 assert!(is_valid, "Signature should be valid");
662
663 let wrong_message = b"Wrong message";
664 let is_valid = fn_dsa.verify(&keypair.public_key, wrong_message, &signature)?;
665 assert!(!is_valid, "Signature should be invalid for wrong message");
666 Ok(())
667 }
668
669 #[test]
670 fn test_sign_and_verify_1024() -> TestResult {
671 let fn_dsa = FnDsa1024::new();
672 let keypair = fn_dsa.generate_keypair()?;
673
674 let message = b"Hello, FN-DSA 1024!";
675 let signature = fn_dsa.sign(&keypair.secret_key, message)?;
676
677 let is_valid = fn_dsa.verify(&keypair.public_key, message, &signature)?;
678 assert!(is_valid, "Signature should be valid");
679 Ok(())
680 }
681}