1
- use alloc:: boxed:: Box ;
2
1
use alloc:: vec;
3
2
use alloc:: vec:: Vec ;
4
3
5
4
use core:: fmt:: { Debug , Display , Formatter , LowerHex , UpperHex } ;
6
- use digest:: DynDigest ;
5
+ use core:: marker:: PhantomData ;
6
+ use digest:: { Digest , DynDigest } ;
7
7
use rand_core:: { CryptoRng , RngCore } ;
8
8
use signature:: { RandomizedSigner , Signature as SignSignature , Verifier } ;
9
9
use subtle:: ConstantTimeEq ;
@@ -317,149 +317,196 @@ fn emsa_pss_verify(
317
317
}
318
318
}
319
319
320
- pub struct SigningKey {
320
+ pub struct SigningKey < D >
321
+ where
322
+ D : Digest + DynDigest ,
323
+ {
321
324
inner : RsaPrivateKey ,
322
325
salt_len : Option < usize > ,
323
- digest : Box < dyn DynDigest > ,
326
+ phantom : PhantomData < D > ,
324
327
}
325
328
326
- impl SigningKey {
329
+ impl < D > SigningKey < D >
330
+ where
331
+ D : Digest + DynDigest ,
332
+ {
327
333
pub ( crate ) fn key ( & self ) -> & RsaPrivateKey {
328
334
& self . inner
329
335
}
330
336
331
- pub ( crate ) fn digest ( & self ) -> Box < dyn DynDigest > {
332
- self . digest . box_clone ( )
337
+ pub fn new ( key : RsaPrivateKey ) -> Self {
338
+ Self {
339
+ inner : key,
340
+ salt_len : None ,
341
+ phantom : Default :: default ( ) ,
342
+ }
333
343
}
334
344
335
- pub fn new ( key : RsaPrivateKey , digest : Box < dyn DynDigest > ) -> Self {
345
+ pub fn new_with_salt_len ( key : RsaPrivateKey , salt_len : usize ) -> Self {
336
346
Self {
337
347
inner : key,
338
- salt_len : None ,
339
- digest : digest ,
348
+ salt_len : Some ( salt_len ) ,
349
+ phantom : Default :: default ( ) ,
340
350
}
341
351
}
342
352
}
343
353
344
- impl RandomizedSigner < Signature > for SigningKey {
354
+ impl < D > RandomizedSigner < Signature > for SigningKey < D >
355
+ where
356
+ D : Digest + DynDigest ,
357
+ {
345
358
fn try_sign_with_rng (
346
359
& self ,
347
360
mut rng : impl CryptoRng + RngCore ,
348
- digest : & [ u8 ] ,
361
+ msg : & [ u8 ] ,
349
362
) -> signature:: Result < Signature > {
350
363
sign (
351
364
& mut rng,
352
365
false ,
353
366
& self . inner ,
354
- digest,
367
+ & D :: digest ( msg ) ,
355
368
self . salt_len ,
356
- self . digest . box_clone ( ) . as_mut ( ) ,
369
+ & mut D :: new ( ) ,
357
370
)
358
371
. map ( |v| v. into ( ) )
359
372
. map_err ( |e| e. into ( ) )
360
373
}
361
374
}
362
375
363
- pub struct BlindedSigningKey {
376
+ pub struct BlindedSigningKey < D >
377
+ where
378
+ D : Digest + DynDigest ,
379
+ {
364
380
inner : RsaPrivateKey ,
365
381
salt_len : Option < usize > ,
366
- digest : Box < dyn DynDigest > ,
382
+ phantom : PhantomData < D > ,
367
383
}
368
384
369
- impl BlindedSigningKey {
385
+ impl < D > BlindedSigningKey < D >
386
+ where
387
+ D : Digest + DynDigest ,
388
+ {
370
389
pub ( crate ) fn key ( & self ) -> & RsaPrivateKey {
371
390
& self . inner
372
391
}
373
392
374
- pub ( crate ) fn digest ( & self ) -> Box < dyn DynDigest > {
375
- self . digest . box_clone ( )
393
+ pub fn new ( key : RsaPrivateKey ) -> Self {
394
+ Self {
395
+ inner : key,
396
+ salt_len : None ,
397
+ phantom : Default :: default ( ) ,
398
+ }
376
399
}
377
400
378
- pub fn new ( key : RsaPrivateKey , digest : Box < dyn DynDigest > ) -> Self {
401
+ pub fn new_with_salt_len ( key : RsaPrivateKey , salt_len : usize ) -> Self {
379
402
Self {
380
403
inner : key,
381
- salt_len : None ,
382
- digest : digest ,
404
+ salt_len : Some ( salt_len ) ,
405
+ phantom : Default :: default ( ) ,
383
406
}
384
407
}
385
408
}
386
409
387
- impl RandomizedSigner < Signature > for BlindedSigningKey {
410
+ impl < D > RandomizedSigner < Signature > for BlindedSigningKey < D >
411
+ where
412
+ D : Digest + DynDigest ,
413
+ {
388
414
fn try_sign_with_rng (
389
415
& self ,
390
416
mut rng : impl CryptoRng + RngCore ,
391
- digest : & [ u8 ] ,
417
+ msg : & [ u8 ] ,
392
418
) -> signature:: Result < Signature > {
393
419
sign (
394
420
& mut rng,
395
421
true ,
396
422
& self . inner ,
397
- digest,
423
+ & D :: digest ( msg ) ,
398
424
self . salt_len ,
399
- self . digest . box_clone ( ) . as_mut ( ) ,
425
+ & mut D :: new ( ) ,
400
426
)
401
427
. map ( |v| v. into ( ) )
402
428
. map_err ( |e| e. into ( ) )
403
429
}
404
430
}
405
431
406
- pub struct VerifyingKey {
432
+ pub struct VerifyingKey < D >
433
+ where
434
+ D : Digest + DynDigest ,
435
+ {
407
436
inner : RsaPublicKey ,
408
- digest : Box < dyn DynDigest > ,
437
+ phantom : PhantomData < D > ,
409
438
}
410
439
411
- impl VerifyingKey {
412
- pub fn new ( key : RsaPublicKey , digest : Box < dyn DynDigest > ) -> Self {
440
+ impl < D > VerifyingKey < D >
441
+ where
442
+ D : Digest + DynDigest ,
443
+ {
444
+ pub fn new ( key : RsaPublicKey ) -> Self {
413
445
Self {
414
446
inner : key,
415
- digest : digest ,
447
+ phantom : Default :: default ( ) ,
416
448
}
417
449
}
418
450
}
419
451
420
- impl From < SigningKey > for VerifyingKey {
421
- fn from ( key : SigningKey ) -> Self {
452
+ impl < D > From < SigningKey < D > > for VerifyingKey < D >
453
+ where
454
+ D : Digest + DynDigest ,
455
+ {
456
+ fn from ( key : SigningKey < D > ) -> Self {
422
457
Self {
423
458
inner : key. key ( ) . into ( ) ,
424
- digest : key . digest ( ) ,
459
+ phantom : Default :: default ( ) ,
425
460
}
426
461
}
427
462
}
428
463
429
- impl From < & SigningKey > for VerifyingKey {
430
- fn from ( key : & SigningKey ) -> Self {
464
+ impl < D > From < & SigningKey < D > > for VerifyingKey < D >
465
+ where
466
+ D : Digest + DynDigest ,
467
+ {
468
+ fn from ( key : & SigningKey < D > ) -> Self {
431
469
Self {
432
470
inner : key. key ( ) . into ( ) ,
433
- digest : key . digest ( ) ,
471
+ phantom : Default :: default ( ) ,
434
472
}
435
473
}
436
474
}
437
475
438
- impl From < BlindedSigningKey > for VerifyingKey {
439
- fn from ( key : BlindedSigningKey ) -> Self {
476
+ impl < D > From < BlindedSigningKey < D > > for VerifyingKey < D >
477
+ where
478
+ D : Digest + DynDigest ,
479
+ {
480
+ fn from ( key : BlindedSigningKey < D > ) -> Self {
440
481
Self {
441
482
inner : key. key ( ) . into ( ) ,
442
- digest : key . digest ( ) ,
483
+ phantom : Default :: default ( ) ,
443
484
}
444
485
}
445
486
}
446
487
447
- impl From < & BlindedSigningKey > for VerifyingKey {
448
- fn from ( key : & BlindedSigningKey ) -> Self {
488
+ impl < D > From < & BlindedSigningKey < D > > for VerifyingKey < D >
489
+ where
490
+ D : Digest + DynDigest ,
491
+ {
492
+ fn from ( key : & BlindedSigningKey < D > ) -> Self {
449
493
Self {
450
494
inner : key. key ( ) . into ( ) ,
451
- digest : key . digest ( ) ,
495
+ phantom : Default :: default ( ) ,
452
496
}
453
497
}
454
498
}
455
499
456
- impl Verifier < Signature > for VerifyingKey {
500
+ impl < D > Verifier < Signature > for VerifyingKey < D >
501
+ where
502
+ D : Digest + DynDigest ,
503
+ {
457
504
fn verify ( & self , msg : & [ u8 ] , signature : & Signature ) -> signature:: Result < ( ) > {
458
505
verify (
459
506
& self . inner ,
460
- msg,
507
+ & D :: digest ( msg) ,
461
508
signature. as_ref ( ) ,
462
- self . digest . box_clone ( ) . as_mut ( ) ,
509
+ & mut D :: new ( ) ,
463
510
)
464
511
. map_err ( |e| e. into ( ) )
465
512
}
@@ -470,7 +517,6 @@ mod test {
470
517
use crate :: pss:: { BlindedSigningKey , SigningKey , VerifyingKey } ;
471
518
use crate :: { PaddingScheme , PublicKey , RsaPrivateKey , RsaPublicKey } ;
472
519
473
- use alloc:: boxed:: Box ;
474
520
use hex_literal:: hex;
475
521
use num_bigint:: BigUint ;
476
522
use num_traits:: { FromPrimitive , Num } ;
@@ -561,11 +607,11 @@ mod test {
561
607
) ,
562
608
] ;
563
609
let pub_key: RsaPublicKey = priv_key. into ( ) ;
564
- let verifying_key: VerifyingKey = VerifyingKey :: new ( pub_key, Box :: new ( Sha1 :: new ( ) ) ) ;
610
+ let verifying_key: VerifyingKey < Sha1 > = VerifyingKey :: new ( pub_key) ;
565
611
566
612
for ( text, sig, expected) in & tests {
567
- let digest = Sha1 :: digest ( text . as_bytes ( ) ) . to_vec ( ) ;
568
- let result = verifying_key. verify ( & digest , & Signature :: from_bytes ( sig) . unwrap ( ) ) ;
613
+ let result =
614
+ verifying_key. verify ( text . as_bytes ( ) , & Signature :: from_bytes ( sig) . unwrap ( ) ) ;
569
615
match expected {
570
616
true => result. expect ( "failed to verify" ) ,
571
617
false => {
@@ -620,14 +666,13 @@ mod test {
620
666
621
667
let tests = [ "test\n " ] ;
622
668
let mut rng = ChaCha8Rng :: from_seed ( [ 42 ; 32 ] ) ;
623
- let signing_key = SigningKey :: new ( priv_key , Box :: new ( Sha1 :: new ( ) ) ) ;
624
- let verifying_key: VerifyingKey = ( & signing_key) . into ( ) ;
669
+ let signing_key = SigningKey :: < Sha1 > :: new ( priv_key ) ;
670
+ let verifying_key = VerifyingKey :: from ( & signing_key) ;
625
671
626
672
for test in & tests {
627
- let digest = Sha1 :: digest ( test. as_bytes ( ) ) . to_vec ( ) ;
628
- let sig = signing_key. sign_with_rng ( & mut rng, & digest) ;
673
+ let sig = signing_key. sign_with_rng ( & mut rng, test. as_bytes ( ) ) ;
629
674
verifying_key
630
- . verify ( & digest , & sig)
675
+ . verify ( test . as_bytes ( ) , & sig)
631
676
. expect ( "failed to verify" ) ;
632
677
}
633
678
}
@@ -638,14 +683,13 @@ mod test {
638
683
639
684
let tests = [ "test\n " ] ;
640
685
let mut rng = ChaCha8Rng :: from_seed ( [ 42 ; 32 ] ) ;
641
- let signing_key = BlindedSigningKey :: new ( priv_key , Box :: new ( Sha1 :: new ( ) ) ) ;
642
- let verifying_key: VerifyingKey = ( & signing_key) . into ( ) ;
686
+ let signing_key = BlindedSigningKey :: < Sha1 > :: new ( priv_key ) ;
687
+ let verifying_key = VerifyingKey :: from ( & signing_key) ;
643
688
644
689
for test in & tests {
645
- let digest = Sha1 :: digest ( test. as_bytes ( ) ) . to_vec ( ) ;
646
- let sig = signing_key. sign_with_rng ( & mut rng, & digest) ;
690
+ let sig = signing_key. sign_with_rng ( & mut rng, test. as_bytes ( ) ) ;
647
691
verifying_key
648
- . verify ( & digest , & sig)
692
+ . verify ( test . as_bytes ( ) , & sig)
649
693
. expect ( "failed to verify" ) ;
650
694
}
651
695
}
0 commit comments