11use super :: { sign_digest, Signature , VerifyingKey } ;
22use crate :: { Result , RsaPrivateKey } ;
33use core:: marker:: PhantomData ;
4- use digest:: { Digest , FixedOutputReset } ;
4+ use digest:: { Digest , FixedOutputReset , Update } ;
55use rand_core:: { CryptoRng , TryCryptoRng } ;
66use signature:: {
77 hazmat:: RandomizedPrehashSigner , Keypair , RandomizedDigestSigner , RandomizedMultipartSigner ,
88 RandomizedSigner ,
99} ;
1010use zeroize:: ZeroizeOnDrop ;
11+
1112#[ cfg( feature = "serde" ) ]
1213use {
1314 pkcs8:: DecodePrivateKey ,
2526 AssociatedAlgorithmIdentifier , DynSignatureAlgorithmIdentifier ,
2627 } ,
2728} ;
29+
2830#[ cfg( feature = "os_rng" ) ]
2931use {
3032 rand_core:: OsRng ,
@@ -95,13 +97,18 @@ where
9597
9698impl < D > RandomizedDigestSigner < D , Signature > for SigningKey < D >
9799where
98- D : Digest + FixedOutputReset ,
100+ D : Digest + FixedOutputReset + Update ,
99101{
100- fn try_sign_digest_with_rng < R : TryCryptoRng + ?Sized > (
102+ fn try_sign_digest_with_rng <
103+ R : TryCryptoRng + ?Sized ,
104+ F : Fn ( & mut D ) -> signature:: Result < ( ) > ,
105+ > (
101106 & self ,
102107 rng : & mut R ,
103- digest : D ,
108+ f : F ,
104109 ) -> signature:: Result < Signature > {
110+ let mut digest = D :: new ( ) ;
111+ f ( & mut digest) ?;
105112 sign_digest :: < _ , D > ( rng, false , & self . inner , & digest. finalize ( ) , self . salt_len ) ?
106113 . as_slice ( )
107114 . try_into ( )
@@ -110,36 +117,39 @@ where
110117
111118impl < D > RandomizedSigner < Signature > for SigningKey < D >
112119where
113- D : Digest + FixedOutputReset ,
120+ D : Digest + FixedOutputReset + Update ,
114121{
115122 fn try_sign_with_rng < R : TryCryptoRng + ?Sized > (
116123 & self ,
117124 rng : & mut R ,
118125 msg : & [ u8 ] ,
119126 ) -> signature:: Result < Signature > {
120- self . try_sign_digest_with_rng ( rng, D :: new_with_prefix ( msg) )
127+ self . try_sign_digest_with_rng ( rng, |digest : & mut D | {
128+ Update :: update ( digest, msg) ;
129+ Ok ( ( ) )
130+ } )
121131 }
122132}
123133
124134impl < D > RandomizedMultipartSigner < Signature > for SigningKey < D >
125135where
126- D : Digest + FixedOutputReset ,
136+ D : Digest + FixedOutputReset + Update ,
127137{
128138 fn try_multipart_sign_with_rng < R : TryCryptoRng + ?Sized > (
129139 & self ,
130140 rng : & mut R ,
131141 msg : & [ & [ u8 ] ] ,
132142 ) -> signature:: Result < Signature > {
133- let mut digest = D :: new ( ) ;
134- msg. iter ( )
135- . for_each ( |slice| < D as Digest > :: update ( & mut digest , slice ) ) ;
136- self . try_sign_digest_with_rng ( rng , digest )
143+ self . try_sign_digest_with_rng ( rng , | digest : & mut D | {
144+ msg. iter ( ) . for_each ( |slice| Update :: update ( digest , slice ) ) ;
145+ Ok ( ( ) )
146+ } )
137147 }
138148}
139149
140150impl < D > RandomizedPrehashSigner < Signature > for SigningKey < D >
141151where
142- D : Digest + FixedOutputReset ,
152+ D : Digest + FixedOutputReset + Update ,
143153{
144154 fn sign_prehash_with_rng < R : TryCryptoRng + ?Sized > (
145155 & self ,
0 commit comments