@@ -145,8 +145,10 @@ where
145145 Scalar < C > : Invert < Output = CtOption < Scalar < C > > > ,
146146 SignatureSize < C > : ArraySize ,
147147{
148- fn try_sign_digest ( & self , msg_digest : D ) -> Result < Signature < C > > {
149- self . sign_prehash ( & msg_digest. finalize_fixed ( ) )
148+ fn try_sign_digest < F : Fn ( & mut D ) -> Result < ( ) > > ( & self , f : F ) -> Result < Signature < C > > {
149+ let mut digest = D :: new ( ) ;
150+ f ( & mut digest) ?;
151+ self . sign_prehash ( & digest. finalize_fixed ( ) )
150152 }
151153}
152154
@@ -188,9 +190,10 @@ where
188190 SignatureSize < C > : ArraySize ,
189191{
190192 fn try_multipart_sign ( & self , msg : & [ & [ u8 ] ] ) -> core:: result:: Result < Signature < C > , Error > {
191- let mut digest = C :: Digest :: new ( ) ;
192- msg. iter ( ) . for_each ( |slice| digest. update ( slice) ) ;
193- self . try_sign_digest ( digest)
193+ self . try_sign_digest ( |digest : & mut C :: Digest | {
194+ msg. iter ( ) . for_each ( |slice| digest. update ( slice) ) ;
195+ Ok ( ( ) )
196+ } )
194197 }
195198}
196199
@@ -201,12 +204,14 @@ where
201204 Scalar < C > : Invert < Output = CtOption < Scalar < C > > > ,
202205 SignatureSize < C > : ArraySize ,
203206{
204- fn try_sign_digest_with_rng < R : TryCryptoRng + ?Sized > (
207+ fn try_sign_digest_with_rng < R : TryCryptoRng + ?Sized , F : Fn ( & mut D ) -> Result < ( ) > > (
205208 & self ,
206209 rng : & mut R ,
207- msg_digest : D ,
210+ f : F ,
208211 ) -> Result < Signature < C > > {
209- self . sign_prehash_with_rng ( rng, & msg_digest. finalize_fixed ( ) )
212+ let mut digest = D :: new ( ) ;
213+ f ( & mut digest) ?;
214+ self . sign_prehash_with_rng ( rng, & digest. finalize_fixed ( ) )
210215 }
211216}
212217
@@ -264,9 +269,10 @@ where
264269 rng : & mut R ,
265270 msg : & [ & [ u8 ] ] ,
266271 ) -> Result < Signature < C > > {
267- let mut digest = C :: Digest :: new ( ) ;
268- msg. iter ( ) . for_each ( |slice| digest. update ( slice) ) ;
269- self . try_sign_digest_with_rng ( rng, digest)
272+ self . try_sign_digest_with_rng ( rng, |digest : & mut C :: Digest | {
273+ msg. iter ( ) . for_each ( |slice| digest. update ( slice) ) ;
274+ Ok ( ( ) )
275+ } )
270276 }
271277}
272278
@@ -277,8 +283,8 @@ where
277283 Scalar < C > : Invert < Output = CtOption < Scalar < C > > > ,
278284 SignatureSize < C > : ArraySize ,
279285{
280- fn try_sign_digest ( & self , msg_digest : D ) -> Result < SignatureWithOid < C > > {
281- let signature: Signature < C > = self . try_sign_digest ( msg_digest ) ?;
286+ fn try_sign_digest < F : Fn ( & mut D ) -> Result < ( ) > > ( & self , f : F ) -> Result < SignatureWithOid < C > > {
287+ let signature: Signature < C > = self . try_sign_digest ( f ) ?;
282288 let oid = ecdsa_oid_for_digest ( D :: OID ) . ok_or_else ( Error :: new) ?;
283289 SignatureWithOid :: new ( signature, oid)
284290 }
@@ -304,9 +310,10 @@ where
304310 SignatureSize < C > : ArraySize ,
305311{
306312 fn try_multipart_sign ( & self , msg : & [ & [ u8 ] ] ) -> Result < SignatureWithOid < C > > {
307- let mut digest = C :: Digest :: new ( ) ;
308- msg. iter ( ) . for_each ( |slice| digest. update ( slice) ) ;
309- self . try_sign_digest ( digest)
313+ self . try_sign_digest ( |digest : & mut C :: Digest | {
314+ msg. iter ( ) . for_each ( |slice| digest. update ( slice) ) ;
315+ Ok ( ( ) )
316+ } )
310317 }
311318}
312319
@@ -348,12 +355,12 @@ where
348355 der:: MaxSize < C > : ArraySize ,
349356 <FieldBytesSize < C > as Add >:: Output : Add < der:: MaxOverhead > + ArraySize ,
350357{
351- fn try_sign_digest_with_rng < R : TryCryptoRng + ?Sized > (
358+ fn try_sign_digest_with_rng < R : TryCryptoRng + ?Sized , F : Fn ( & mut D ) -> Result < ( ) > > (
352359 & self ,
353360 rng : & mut R ,
354- msg_digest : D ,
361+ f : F ,
355362 ) -> Result < der:: Signature < C > > {
356- RandomizedDigestSigner :: < D , Signature < C > > :: try_sign_digest_with_rng ( self , rng, msg_digest )
363+ RandomizedDigestSigner :: < D , Signature < C > > :: try_sign_digest_with_rng ( self , rng, f )
357364 . map ( Into :: into)
358365 }
359366}
@@ -387,8 +394,8 @@ where
387394 der:: MaxSize < C > : ArraySize ,
388395 <FieldBytesSize < C > as Add >:: Output : Add < der:: MaxOverhead > + ArraySize ,
389396{
390- fn try_sign_digest ( & self , msg_digest : D ) -> Result < der:: Signature < C > > {
391- DigestSigner :: < D , Signature < C > > :: try_sign_digest ( self , msg_digest ) . map ( Into :: into)
397+ fn try_sign_digest < F : Fn ( & mut D ) -> Result < ( ) > > ( & self , f : F ) -> Result < der:: Signature < C > > {
398+ DigestSigner :: < D , Signature < C > > :: try_sign_digest ( self , f ) . map ( Into :: into)
392399 }
393400}
394401
0 commit comments