@@ -32,42 +32,53 @@ impl std::fmt::Debug for EcdsaSigningKey {
3232}
3333
3434impl SigningKeyTrait for EcdsaSigningKey {
35- fn sign ( & mut self , data : & [ u8 ] , out : & mut Buf ) -> Result < ( ) , String > {
35+ fn sign ( & mut self , data : & [ u8 ] , hash_alg : HashAlgorithm , out : & mut Buf ) -> Result < ( ) , String > {
36+ use ecdsa:: signature:: hazmat:: PrehashSigner ;
37+ use sha2:: Digest ;
38+
3639 match self {
3740 EcdsaSigningKey :: P256 ( key) => {
38- use ecdsa:: signature:: hazmat:: PrehashSigner ;
39- use sha2:: { Digest , Sha256 } ;
40-
41- // Hash the data before signing (PrehashSigner expects a hash digest)
42- let mut hasher = Sha256 :: new ( ) ;
43- hasher. update ( data) ;
44- let hash = hasher. finalize ( ) ;
45-
46- let signature: Signature < NistP256 > = key
47- . sign_prehash ( & hash)
48- . map_err ( |_| "Signing failed" . to_string ( ) ) ?;
49- let sig_der = signature. to_der ( ) ;
50- let sig_bytes = sig_der. as_bytes ( ) ;
41+ let signature: Signature < NistP256 > = match hash_alg {
42+ HashAlgorithm :: SHA256 => {
43+ let hash = sha2:: Sha256 :: digest ( data) ;
44+ key. sign_prehash ( & hash)
45+ }
46+ HashAlgorithm :: SHA384 => {
47+ let hash = sha2:: Sha384 :: digest ( data) ;
48+ key. sign_prehash ( & hash)
49+ }
50+ _ => {
51+ return Err ( format ! (
52+ "P-256 key does not support hash algorithm {:?}" ,
53+ hash_alg
54+ ) ) ;
55+ }
56+ }
57+ . map_err ( |_| "Signing failed" . to_string ( ) ) ?;
5158 out. clear ( ) ;
52- out. extend_from_slice ( sig_bytes ) ;
59+ out. extend_from_slice ( signature . to_der ( ) . as_bytes ( ) ) ;
5360 Ok ( ( ) )
5461 }
5562 EcdsaSigningKey :: P384 ( key) => {
56- use ecdsa:: signature:: hazmat:: PrehashSigner ;
57- use sha2:: { Digest , Sha384 } ;
58-
59- // Hash the data before signing (PrehashSigner expects a hash digest)
60- let mut hasher = Sha384 :: new ( ) ;
61- hasher. update ( data) ;
62- let hash = hasher. finalize ( ) ;
63-
64- let signature: Signature < NistP384 > = key
65- . sign_prehash ( & hash)
66- . map_err ( |_| "Signing failed" . to_string ( ) ) ?;
67- let sig_der = signature. to_der ( ) ;
68- let sig_bytes = sig_der. as_bytes ( ) ;
63+ let signature: Signature < NistP384 > = match hash_alg {
64+ HashAlgorithm :: SHA256 => {
65+ let hash = sha2:: Sha256 :: digest ( data) ;
66+ key. sign_prehash ( & hash)
67+ }
68+ HashAlgorithm :: SHA384 => {
69+ let hash = sha2:: Sha384 :: digest ( data) ;
70+ key. sign_prehash ( & hash)
71+ }
72+ _ => {
73+ return Err ( format ! (
74+ "P-384 key does not support hash algorithm {:?}" ,
75+ hash_alg
76+ ) ) ;
77+ }
78+ }
79+ . map_err ( |_| "Signing failed" . to_string ( ) ) ?;
6980 out. clear ( ) ;
70- out. extend_from_slice ( sig_bytes ) ;
81+ out. extend_from_slice ( signature . to_der ( ) . as_bytes ( ) ) ;
7182 Ok ( ( ) )
7283 }
7384 }
@@ -83,6 +94,11 @@ impl SigningKeyTrait for EcdsaSigningKey {
8394 EcdsaSigningKey :: P384 ( _) => HashAlgorithm :: SHA384 ,
8495 }
8596 }
97+
98+ fn supported_hash_algorithms ( & self ) -> & [ HashAlgorithm ] {
99+ // PrehashSigner accepts any hash digest, so both work for either curve.
100+ & [ HashAlgorithm :: SHA256 , HashAlgorithm :: SHA384 ]
101+ }
86102}
87103
88104/// Key provider implementation.
0 commit comments