1
- use alloc:: vec ;
1
+ use alloc:: boxed :: Box ;
2
2
use alloc:: vec:: Vec ;
3
3
use core:: fmt:: { Debug , Display , Formatter , LowerHex , UpperHex } ;
4
4
use core:: marker:: PhantomData ;
5
- use core:: ops:: Deref ;
6
5
use digest:: Digest ;
7
6
use pkcs8:: { AssociatedOid , Document , EncodePrivateKey , EncodePublicKey , SecretDocument } ;
8
7
use rand_core:: { CryptoRng , RngCore } ;
9
8
#[ cfg( feature = "hazmat" ) ]
10
9
use signature:: hazmat:: { PrehashSigner , PrehashVerifier } ;
11
10
use signature:: {
12
- DigestSigner , DigestVerifier , RandomizedDigestSigner , RandomizedSigner ,
13
- Signature as SignSignature , Signer , Verifier ,
11
+ DigestSigner , DigestVerifier , RandomizedDigestSigner , RandomizedSigner , SignatureEncoding ,
12
+ Signer , Verifier ,
14
13
} ;
15
14
use subtle:: { Choice , ConditionallySelectable , ConstantTimeEq } ;
16
15
use zeroize:: Zeroizing ;
@@ -20,60 +19,52 @@ use crate::errors::{Error, Result};
20
19
use crate :: key:: { self , PrivateKey , PublicKey } ;
21
20
use crate :: { RsaPrivateKey , RsaPublicKey } ;
22
21
23
- #[ derive( Clone ) ]
22
+ #[ derive( Clone , PartialEq , Eq ) ]
24
23
pub struct Signature {
25
- bytes : Vec < u8 > ,
24
+ bytes : Box < [ u8 ] > ,
26
25
}
27
26
28
- impl signature:: Signature for Signature {
29
- fn from_bytes ( bytes : & [ u8 ] ) -> signature:: Result < Self > {
30
- Ok ( Signature {
31
- bytes : bytes. into ( ) ,
32
- } )
33
- }
34
-
35
- fn as_bytes ( & self ) -> & [ u8 ] {
36
- self . bytes . as_slice ( )
37
- }
27
+ impl SignatureEncoding for Signature {
28
+ type Repr = Box < [ u8 ] > ;
38
29
}
39
30
40
- impl From < Vec < u8 > > for Signature {
41
- fn from ( bytes : Vec < u8 > ) -> Self {
31
+ impl From < Box < [ u8 ] > > for Signature {
32
+ fn from ( bytes : Box < [ u8 ] > ) -> Self {
42
33
Self { bytes }
43
34
}
44
35
}
45
36
46
- impl Deref for Signature {
47
- type Target = [ u8 ] ;
37
+ impl < ' a > TryFrom < & ' a [ u8 ] > for Signature {
38
+ type Error = signature :: Error ;
48
39
49
- fn deref ( & self ) -> & Self :: Target {
50
- self . as_bytes ( )
40
+ fn try_from ( bytes : & ' a [ u8 ] ) -> signature:: Result < Self > {
41
+ Ok ( Self {
42
+ bytes : bytes. into ( ) ,
43
+ } )
51
44
}
52
45
}
53
46
54
- impl PartialEq for Signature {
55
- fn eq ( & self , other : & Self ) -> bool {
56
- self . as_bytes ( ) == other . as_bytes ( )
47
+ impl From < Signature > for Box < [ u8 ] > {
48
+ fn from ( signature : Signature ) -> Box < [ u8 ] > {
49
+ signature . bytes
57
50
}
58
51
}
59
52
60
- impl Eq for Signature { }
61
-
62
- impl Debug for Signature {
63
- fn fmt ( & self , fmt : & mut Formatter < ' _ > ) -> core:: result:: Result < ( ) , core:: fmt:: Error > {
64
- fmt. debug_list ( ) . entries ( self . as_bytes ( ) . iter ( ) ) . finish ( )
53
+ impl AsRef < [ u8 ] > for Signature {
54
+ fn as_ref ( & self ) -> & [ u8 ] {
55
+ self . bytes . as_ref ( )
65
56
}
66
57
}
67
58
68
- impl AsRef < [ u8 ] > for Signature {
69
- fn as_ref ( & self ) -> & [ u8 ] {
70
- self . as_bytes ( )
59
+ impl Debug for Signature {
60
+ fn fmt ( & self , fmt : & mut Formatter < ' _ > ) -> core :: result :: Result < ( ) , core :: fmt :: Error > {
61
+ fmt . debug_list ( ) . entries ( self . bytes . iter ( ) ) . finish ( )
71
62
}
72
63
}
73
64
74
65
impl LowerHex for Signature {
75
66
fn fmt ( & self , f : & mut Formatter < ' _ > ) -> core:: fmt:: Result {
76
- for byte in self . as_bytes ( ) {
67
+ for byte in self . bytes . iter ( ) {
77
68
write ! ( f, "{:02x}" , byte) ?;
78
69
}
79
70
Ok ( ( ) )
@@ -82,7 +73,7 @@ impl LowerHex for Signature {
82
73
83
74
impl UpperHex for Signature {
84
75
fn fmt ( & self , f : & mut Formatter < ' _ > ) -> core:: fmt:: Result {
85
- for byte in self . as_bytes ( ) {
76
+ for byte in self . bytes . iter ( ) {
86
77
write ! ( f, "{:02X}" , byte) ?;
87
78
}
88
79
Ok ( ( ) )
@@ -391,7 +382,7 @@ where
391
382
{
392
383
fn try_sign ( & self , msg : & [ u8 ] ) -> signature:: Result < Signature > {
393
384
sign :: < DummyRng , _ > ( None , & self . inner , & self . prefix , & D :: digest ( msg) )
394
- . map ( |v| v. into ( ) )
385
+ . map ( |v| v. into_boxed_slice ( ) . into ( ) )
395
386
. map_err ( |e| e. into ( ) )
396
387
}
397
388
}
@@ -406,7 +397,7 @@ where
406
397
msg : & [ u8 ] ,
407
398
) -> signature:: Result < Signature > {
408
399
sign ( Some ( & mut rng) , & self . inner , & self . prefix , & D :: digest ( msg) )
409
- . map ( |v| v. into ( ) )
400
+ . map ( |v| v. into_boxed_slice ( ) . into ( ) )
410
401
. map_err ( |e| e. into ( ) )
411
402
}
412
403
}
@@ -417,7 +408,7 @@ where
417
408
{
418
409
fn try_sign_digest ( & self , digest : D ) -> signature:: Result < Signature > {
419
410
sign :: < DummyRng , _ > ( None , & self . inner , & self . prefix , & digest. finalize ( ) )
420
- . map ( |v| v. into ( ) )
411
+ . map ( |v| v. into_boxed_slice ( ) . into ( ) )
421
412
. map_err ( |e| e. into ( ) )
422
413
}
423
414
}
@@ -437,7 +428,7 @@ where
437
428
& self . prefix ,
438
429
& digest. finalize ( ) ,
439
430
)
440
- . map ( |v| v. into ( ) )
431
+ . map ( |v| v. into_boxed_slice ( ) . into ( ) )
441
432
. map_err ( |e| e. into ( ) )
442
433
}
443
434
}
@@ -449,7 +440,7 @@ where
449
440
{
450
441
fn sign_prehash ( & self , prehash : & [ u8 ] ) -> signature:: Result < Signature > {
451
442
sign :: < DummyRng , _ > ( None , & self . inner , & self . prefix , prehash)
452
- . map ( |v| v. into ( ) )
443
+ . map ( |v| v. into_boxed_slice ( ) . into ( ) )
453
444
. map_err ( |e| e. into ( ) )
454
445
}
455
446
}
@@ -604,7 +595,7 @@ mod tests {
604
595
use sha1:: { Digest , Sha1 } ;
605
596
use sha2:: Sha256 ;
606
597
use sha3:: Sha3_256 ;
607
- use signature:: { RandomizedSigner , Signature , Signer , Verifier } ;
598
+ use signature:: { RandomizedSigner , Signer , Verifier } ;
608
599
609
600
use crate :: { PaddingScheme , PublicKey , PublicKeyParts , RsaPrivateKey , RsaPublicKey } ;
610
601
@@ -898,8 +889,10 @@ mod tests {
898
889
let verifying_key = VerifyingKey :: < Sha1 > :: new_with_prefix ( pub_key) ;
899
890
900
891
for ( text, sig, expected) in & tests {
901
- let result =
902
- verifying_key. verify ( text. as_bytes ( ) , & Signature :: from_bytes ( sig) . unwrap ( ) ) ;
892
+ let result = verifying_key. verify (
893
+ text. as_bytes ( ) ,
894
+ & Signature :: try_from ( sig. as_slice ( ) ) . unwrap ( ) ,
895
+ ) ;
903
896
match expected {
904
897
true => result. expect ( "failed to verify" ) ,
905
898
false => {
@@ -937,7 +930,8 @@ mod tests {
937
930
for ( text, sig, expected) in & tests {
938
931
let mut digest = Sha1 :: new ( ) ;
939
932
digest. update ( text. as_bytes ( ) ) ;
940
- let result = verifying_key. verify_digest ( digest, & Signature :: from_bytes ( sig) . unwrap ( ) ) ;
933
+ let result =
934
+ verifying_key. verify_digest ( digest, & Signature :: try_from ( sig. as_slice ( ) ) . unwrap ( ) ) ;
941
935
match expected {
942
936
true => result. expect ( "failed to verify" ) ,
943
937
false => {
@@ -976,7 +970,7 @@ mod tests {
976
970
977
971
let verifying_key: VerifyingKey < _ > = ( & signing_key) . into ( ) ;
978
972
verifying_key
979
- . verify_prehash ( msg, & Signature :: from_bytes ( & expected_sig) . unwrap ( ) )
973
+ . verify_prehash ( msg, & Signature :: from_bytes ( & expected_sig. into_boxed_slice ( ) ) . unwrap ( ) )
980
974
. expect ( "failed to verify" ) ;
981
975
}
982
976
}
0 commit comments