@@ -4,13 +4,13 @@ use crate::{
44 trace:: * ,
55} ;
66use ecdsa:: {
7- elliptic_curve:: { PublicKey as EcPublicKey , SecretKey as EcSecretKey , sec1:: ToEncodedPoint } ,
7+ elliptic_curve:: { PublicKey as EcPublicKey , SecretKey as EcSecretKey , sec1:: ToSec1Point } ,
88 signature:: { DigestSigner , DigestVerifier } ,
99} ;
1010use ed25519_compact:: { PublicKey as Ed25519PublicKey , SecretKey as Ed25519SecretKey } ;
1111use p256:: NistP256 ;
1212use p384:: NistP384 ;
13- use pkcs8:: { Document , PrivateKeyInfo , der:: Decode } ;
13+ use pkcs8:: { Document , PrivateKeyInfoRef , der:: Decode } ;
1414use sha2:: { Digest , Sha256 , Sha384 } ;
1515use spki:: SubjectPublicKeyInfoRef ;
1616
@@ -66,12 +66,12 @@ impl SecretKey {
6666 match alg {
6767 AlgorithmName :: EcdsaP256Sha256 => {
6868 debug ! ( "Read P256 private key" ) ;
69- let sk = EcSecretKey :: from_bytes ( bytes. into ( ) ) . map_err ( |e| HttpSigError :: ParsePrivateKeyError ( e. to_string ( ) ) ) ?;
69+ let sk = EcSecretKey :: from_slice ( bytes) . map_err ( |e| HttpSigError :: ParsePrivateKeyError ( e. to_string ( ) ) ) ?;
7070 Ok ( Self :: EcdsaP256Sha256 ( sk) )
7171 }
7272 AlgorithmName :: EcdsaP384Sha384 => {
7373 debug ! ( "Read P384 private key" ) ;
74- let sk = EcSecretKey :: from_bytes ( bytes. into ( ) ) . map_err ( |e| HttpSigError :: ParsePrivateKeyError ( e. to_string ( ) ) ) ?;
74+ let sk = EcSecretKey :: from_slice ( bytes) . map_err ( |e| HttpSigError :: ParsePrivateKeyError ( e. to_string ( ) ) ) ?;
7575 Ok ( Self :: EcdsaP384Sha384 ( sk) )
7676 }
7777 AlgorithmName :: Ed25519 => {
@@ -101,7 +101,7 @@ impl SecretKey {
101101 /// parse der
102102 /// Derive secret key from der bytes
103103 pub fn from_der ( alg : & AlgorithmName , der : & [ u8 ] ) -> HttpSigResult < Self > {
104- let pki = PrivateKeyInfo :: from_der ( der) . map_err ( |e| HttpSigError :: ParsePrivateKeyError ( e. to_string ( ) ) ) ?;
104+ let pki = PrivateKeyInfoRef :: from_der ( der) . map_err ( |e| HttpSigError :: ParsePrivateKeyError ( e. to_string ( ) ) ) ?;
105105
106106 let sk_bytes = match pki. algorithm . oid . to_string ( ) . as_ref ( ) {
107107 // ec
@@ -119,18 +119,17 @@ impl SecretKey {
119119 if algorithm_name != * alg {
120120 return Err ( HttpSigError :: ParsePrivateKeyError ( "Algorithm mismatch" . to_string ( ) ) ) ;
121121 }
122- let sk_bytes = sec1:: EcPrivateKey :: try_from ( pki. private_key )
122+ sec1:: EcPrivateKey :: try_from ( pki. private_key . as_bytes ( ) )
123123 . map_err ( |e| HttpSigError :: ParsePrivateKeyError ( format ! ( "Error decoding EcPrivateKey: {e}" ) ) ) ?
124- . private_key ;
125- sk_bytes
124+ . private_key
126125 }
127126 // ed25519
128127 algorithm_oids:: Ed25519 => {
129128 // assert algorithm
130129 if AlgorithmName :: Ed25519 != * alg {
131130 return Err ( HttpSigError :: ParsePrivateKeyError ( "Algorithm mismatch" . to_string ( ) ) ) ;
132131 }
133- & pki. private_key [ 2 ..]
132+ & pki. private_key . as_bytes ( ) [ 2 ..]
134133 }
135134 // rsa
136135 #[ cfg( feature = "rsa-signature" ) ]
@@ -140,7 +139,7 @@ impl SecretKey {
140139 AlgorithmName :: RsaV1_5Sha256 | AlgorithmName :: RsaPssSha512 => { }
141140 _ => return Err ( HttpSigError :: ParsePrivateKeyError ( "Algorithm mismatch" . to_string ( ) ) ) ,
142141 }
143- pki. private_key
142+ pki. private_key . as_bytes ( )
144143 }
145144 _ => return Err ( HttpSigError :: ParsePrivateKeyError ( "Unsupported algorithm" . to_string ( ) ) ) ,
146145 } ;
@@ -178,17 +177,13 @@ impl super::SigningKey for SecretKey {
178177 Self :: EcdsaP256Sha256 ( sk) => {
179178 debug ! ( "Sign EcdsaP256Sha256" ) ;
180179 let sk = ecdsa:: SigningKey :: from ( sk) ;
181- let mut digest = <Sha256 as Digest >:: new ( ) ;
182- digest. update ( data) ;
183- let sig: ecdsa:: Signature < NistP256 > = sk. sign_digest ( digest) ;
180+ let sig: ecdsa:: Signature < NistP256 > = sk. sign_digest ( |digest : & mut Sha256 | digest. update ( data) ) ;
184181 Ok ( sig. to_bytes ( ) . to_vec ( ) )
185182 }
186183 Self :: EcdsaP384Sha384 ( sk) => {
187184 debug ! ( "Sign EcdsaP384Sha384" ) ;
188185 let sk = ecdsa:: SigningKey :: from ( sk) ;
189- let mut digest = <Sha384 as Digest >:: new ( ) ;
190- digest. update ( data) ;
191- let sig: ecdsa:: Signature < NistP384 > = sk. sign_digest ( digest) ;
186+ let sig: ecdsa:: Signature < NistP384 > = sk. sign_digest ( |digest : & mut Sha384 | digest. update ( data) ) ;
192187 Ok ( sig. to_bytes ( ) . to_vec ( ) )
193188 }
194189 Self :: Ed25519 ( sk) => {
@@ -359,23 +354,31 @@ impl super::VerifyingKey for PublicKey {
359354 match self {
360355 Self :: EcdsaP256Sha256 ( pk) => {
361356 debug ! ( "Verify EcdsaP256Sha256" ) ;
362- let signature = ecdsa :: Signature :: < NistP256 > :: from_bytes ( signature . into ( ) )
363- . map_err ( |e| HttpSigError :: ParseSignatureError ( e. to_string ( ) ) ) ?;
357+ let signature =
358+ ecdsa :: Signature :: < NistP256 > :: from_slice ( signature ) . map_err ( |e| HttpSigError :: ParseSignatureError ( e. to_string ( ) ) ) ?;
364359 let vk = ecdsa:: VerifyingKey :: from ( pk) ;
365- let mut digest = <Sha256 as Digest >:: new ( ) ;
366- digest. update ( data) ;
367- vk. verify_digest ( digest, & signature)
368- . map_err ( |e| HttpSigError :: InvalidSignature ( e. to_string ( ) ) )
360+ vk. verify_digest (
361+ |digest : & mut Sha256 | {
362+ digest. update ( data) ;
363+ Ok ( ( ) )
364+ } ,
365+ & signature,
366+ )
367+ . map_err ( |e| HttpSigError :: InvalidSignature ( e. to_string ( ) ) )
369368 }
370369 Self :: EcdsaP384Sha384 ( pk) => {
371370 debug ! ( "Verify EcdsaP384Sha384" ) ;
372- let signature = ecdsa :: Signature :: < NistP384 > :: from_bytes ( signature . into ( ) )
373- . map_err ( |e| HttpSigError :: ParseSignatureError ( e. to_string ( ) ) ) ?;
371+ let signature =
372+ ecdsa :: Signature :: < NistP384 > :: from_slice ( signature ) . map_err ( |e| HttpSigError :: ParseSignatureError ( e. to_string ( ) ) ) ?;
374373 let vk = ecdsa:: VerifyingKey :: from ( pk) ;
375- let mut digest = <Sha384 as Digest >:: new ( ) ;
376- digest. update ( data) ;
377- vk. verify_digest ( digest, & signature)
378- . map_err ( |e| HttpSigError :: InvalidSignature ( e. to_string ( ) ) )
374+ vk. verify_digest (
375+ |digest : & mut Sha384 | {
376+ digest. update ( data) ;
377+ Ok ( ( ) )
378+ } ,
379+ & signature,
380+ )
381+ . map_err ( |e| HttpSigError :: InvalidSignature ( e. to_string ( ) ) )
379382 }
380383 Self :: Ed25519 ( pk) => {
381384 debug ! ( "Verify Ed25519" ) ;
@@ -409,8 +412,8 @@ impl super::VerifyingKey for PublicKey {
409412 use base64:: { Engine as _, engine:: general_purpose} ;
410413
411414 let bytes = match self {
412- Self :: EcdsaP256Sha256 ( vk) => vk. to_encoded_point ( true ) . as_bytes ( ) . to_vec ( ) ,
413- Self :: EcdsaP384Sha384 ( vk) => vk. to_encoded_point ( true ) . as_bytes ( ) . to_vec ( ) ,
415+ Self :: EcdsaP256Sha256 ( vk) => vk. to_sec1_point ( true ) . as_bytes ( ) . to_vec ( ) ,
416+ Self :: EcdsaP384Sha384 ( vk) => vk. to_sec1_point ( true ) . as_bytes ( ) . to_vec ( ) ,
414417 Self :: Ed25519 ( vk) => vk. as_ref ( ) . to_vec ( ) ,
415418 #[ cfg( feature = "rsa-signature" ) ]
416419 Self :: RsaV1_5Sha256 ( vk) => vk
@@ -447,7 +450,7 @@ impl super::VerifyingKey for PublicKey {
447450
448451#[ cfg( test) ]
449452mod tests {
450- use p256:: elliptic_curve:: group:: GroupEncoding ;
453+ use p256:: elliptic_curve:: { Generate , group:: GroupEncoding } ;
451454
452455 use super :: * ;
453456 use std:: matches;
@@ -537,8 +540,7 @@ tQIDAQAB
537540 let pk = PublicKey :: from_bytes ( & AlgorithmName :: Ed25519 , ed25519_pk) . unwrap ( ) ;
538541 assert ! ( matches!( pk, PublicKey :: Ed25519 ( _) ) ) ;
539542
540- let mut rng = rand_085:: thread_rng ( ) ;
541- let es256_sk = p256:: ecdsa:: SigningKey :: random ( & mut rng) ;
543+ let es256_sk = p256:: ecdsa:: SigningKey :: generate_from_rng ( & mut rand:: rng ( ) ) ;
542544 let es256_pk = es256_sk. verifying_key ( ) ;
543545 let sk = SecretKey :: from_bytes ( & AlgorithmName :: EcdsaP256Sha256 , es256_sk. to_bytes ( ) . as_ref ( ) ) . unwrap ( ) ;
544546 assert ! ( matches!( sk, SecretKey :: EcdsaP256Sha256 ( _) ) ) ;
0 commit comments