@@ -133,6 +133,103 @@ pub trait MessageSignatureRes {
133133 ) -> Result < IndexMap < SignatureName , ( HttpSignatureBase , HttpSignatureHeaders ) > , Self :: Error > ;
134134}
135135
136+ /* --------------------------------------- */
137+ #[ cfg( feature = "blocking" ) ]
138+ /// Synchronous counterpart of [`MessageSignatureReq`].
139+ ///
140+ /// Every method delegates to the corresponding async method via `futures::executor::block_on`.
141+ ///
142+ /// # Panics
143+ ///
144+ /// All methods will panic if called from within an async runtime (e.g. a `tokio` task).
145+ /// Use the async [`MessageSignatureReq`] methods instead when you are already in an async context.
146+ pub trait MessageSignatureReqSync : MessageSignatureReq {
147+ fn set_message_signature_sync < T > (
148+ & mut self ,
149+ signature_params : & HttpSignatureParams ,
150+ signing_key : & T ,
151+ signature_name : Option < & str > ,
152+ ) -> Result < ( ) , Self :: Error >
153+ where
154+ Self : Sized ,
155+ T : SigningKey + Sync ;
156+
157+ fn set_message_signatures_sync < T > (
158+ & mut self ,
159+ params_key_name : & [ ( & HttpSignatureParams , & T , Option < & str > ) ] ,
160+ ) -> Result < ( ) , Self :: Error >
161+ where
162+ Self : Sized ,
163+ T : SigningKey + Sync ;
164+
165+ fn verify_message_signature_sync < T > ( & self , verifying_key : & T , key_id : Option < & str > ) -> Result < SignatureName , Self :: Error >
166+ where
167+ Self : Sized ,
168+ T : VerifyingKey + Sync ;
169+
170+ fn verify_message_signatures_sync < T > (
171+ & self ,
172+ key_and_id : & [ ( & T , Option < & str > ) ] ,
173+ ) -> Result < Vec < Result < SignatureName , Self :: Error > > , Self :: Error >
174+ where
175+ Self : Sized ,
176+ T : VerifyingKey + Sync ;
177+ }
178+
179+ #[ cfg( feature = "blocking" ) ]
180+ /// Synchronous counterpart of [`MessageSignatureRes`].
181+ ///
182+ /// Every method delegates to the corresponding async method via `futures::executor::block_on`.
183+ ///
184+ /// # Panics
185+ ///
186+ /// All methods will panic if called from within an async runtime (e.g. a `tokio` task).
187+ /// Use the async [`MessageSignatureRes`] methods instead when you are already in an async context.
188+ pub trait MessageSignatureResSync : MessageSignatureRes {
189+ fn set_message_signature_sync < T , B > (
190+ & mut self ,
191+ signature_params : & HttpSignatureParams ,
192+ signing_key : & T ,
193+ signature_name : Option < & str > ,
194+ req_for_param : Option < & Request < B > > ,
195+ ) -> Result < ( ) , Self :: Error >
196+ where
197+ Self : Sized ,
198+ T : SigningKey + Sync ,
199+ B : Sync ;
200+
201+ fn set_message_signatures_sync < T , B > (
202+ & mut self ,
203+ params_key_name : & [ ( & HttpSignatureParams , & T , Option < & str > ) ] ,
204+ req_for_param : Option < & Request < B > > ,
205+ ) -> Result < ( ) , Self :: Error >
206+ where
207+ Self : Sized ,
208+ T : SigningKey + Sync ,
209+ B : Sync ;
210+
211+ fn verify_message_signature_sync < T , B > (
212+ & self ,
213+ verifying_key : & T ,
214+ key_id : Option < & str > ,
215+ req_for_param : Option < & Request < B > > ,
216+ ) -> Result < SignatureName , Self :: Error >
217+ where
218+ Self : Sized ,
219+ T : VerifyingKey + Sync ,
220+ B : Sync ;
221+
222+ fn verify_message_signatures_sync < T , B > (
223+ & self ,
224+ key_and_id : & [ ( & T , Option < & str > ) ] ,
225+ req_for_param : Option < & Request < B > > ,
226+ ) -> Result < Vec < Result < SignatureName , Self :: Error > > , Self :: Error >
227+ where
228+ Self : Sized ,
229+ T : VerifyingKey + Sync ,
230+ B : Sync ;
231+ }
232+
136233/* --------------------------------------- */
137234impl < D > MessageSignature for Request < D >
138235where
@@ -378,6 +475,117 @@ where
378475 }
379476}
380477
478+ /* --------------------------------------- */
479+ #[ cfg( feature = "blocking" ) ]
480+ impl < D > MessageSignatureReqSync for Request < D >
481+ where
482+ D : Send + Body + Sync ,
483+ {
484+ fn set_message_signature_sync < T > (
485+ & mut self ,
486+ signature_params : & HttpSignatureParams ,
487+ signing_key : & T ,
488+ signature_name : Option < & str > ,
489+ ) -> Result < ( ) , Self :: Error >
490+ where
491+ Self : Sized ,
492+ T : SigningKey + Sync ,
493+ {
494+ futures:: executor:: block_on ( self . set_message_signature ( signature_params, signing_key, signature_name) )
495+ }
496+
497+ fn set_message_signatures_sync < T > (
498+ & mut self ,
499+ params_key_name : & [ ( & HttpSignatureParams , & T , Option < & str > ) ] ,
500+ ) -> Result < ( ) , Self :: Error >
501+ where
502+ Self : Sized ,
503+ T : SigningKey + Sync ,
504+ {
505+ futures:: executor:: block_on ( self . set_message_signatures ( params_key_name) )
506+ }
507+
508+ fn verify_message_signature_sync < T > ( & self , verifying_key : & T , key_id : Option < & str > ) -> Result < SignatureName , Self :: Error >
509+ where
510+ Self : Sized ,
511+ T : VerifyingKey + Sync ,
512+ {
513+ futures:: executor:: block_on ( self . verify_message_signature ( verifying_key, key_id) )
514+ }
515+
516+ fn verify_message_signatures_sync < T > (
517+ & self ,
518+ key_and_id : & [ ( & T , Option < & str > ) ] ,
519+ ) -> Result < Vec < Result < SignatureName , Self :: Error > > , Self :: Error >
520+ where
521+ Self : Sized ,
522+ T : VerifyingKey + Sync ,
523+ {
524+ futures:: executor:: block_on ( self . verify_message_signatures ( key_and_id) )
525+ }
526+ }
527+
528+ #[ cfg( feature = "blocking" ) ]
529+ impl < D > MessageSignatureResSync for Response < D >
530+ where
531+ D : Send + Body + Sync ,
532+ {
533+ fn set_message_signature_sync < T , B > (
534+ & mut self ,
535+ signature_params : & HttpSignatureParams ,
536+ signing_key : & T ,
537+ signature_name : Option < & str > ,
538+ req_for_param : Option < & Request < B > > ,
539+ ) -> Result < ( ) , Self :: Error >
540+ where
541+ Self : Sized ,
542+ T : SigningKey + Sync ,
543+ B : Sync ,
544+ {
545+ futures:: executor:: block_on ( self . set_message_signature ( signature_params, signing_key, signature_name, req_for_param) )
546+ }
547+
548+ fn set_message_signatures_sync < T , B > (
549+ & mut self ,
550+ params_key_name : & [ ( & HttpSignatureParams , & T , Option < & str > ) ] ,
551+ req_for_param : Option < & Request < B > > ,
552+ ) -> Result < ( ) , Self :: Error >
553+ where
554+ Self : Sized ,
555+ T : SigningKey + Sync ,
556+ B : Sync ,
557+ {
558+ futures:: executor:: block_on ( self . set_message_signatures ( params_key_name, req_for_param) )
559+ }
560+
561+ fn verify_message_signature_sync < T , B > (
562+ & self ,
563+ verifying_key : & T ,
564+ key_id : Option < & str > ,
565+ req_for_param : Option < & Request < B > > ,
566+ ) -> Result < SignatureName , Self :: Error >
567+ where
568+ Self : Sized ,
569+ T : VerifyingKey + Sync ,
570+ B : Sync ,
571+ {
572+ futures:: executor:: block_on ( self . verify_message_signature ( verifying_key, key_id, req_for_param) )
573+ }
574+
575+ fn verify_message_signatures_sync < T , B > (
576+ & self ,
577+ key_and_id : & [ ( & T , Option < & str > ) ] ,
578+ req_for_param : Option < & Request < B > > ,
579+ ) -> Result < Vec < Result < SignatureName , Self :: Error > > , Self :: Error >
580+ where
581+ Self : Sized ,
582+ T : VerifyingKey + Sync ,
583+ B : Sync ,
584+ {
585+ futures:: executor:: block_on ( self . verify_message_signatures ( key_and_id, req_for_param) )
586+ }
587+ }
588+
381589/* --------------------------------------- */
382590// inner functions
383591/// has message signature inner function
@@ -1026,4 +1234,36 @@ ii+31DW+YulmysZKQKDvuk96TARuWMO/vDbhk777a2QF3bgNoIj8UPMwnw==
10261234 assert ! ( verification_res[ 0 ] . as_ref( ) . unwrap( ) == "eddsa_sig" ) ;
10271235 assert ! ( verification_res[ 1 ] . as_ref( ) . unwrap( ) == "p256_sig" ) ;
10281236 }
1237+
1238+ #[ cfg( feature = "blocking" ) ]
1239+ #[ test]
1240+ fn test_blocking_set_verify_message_signature_req ( ) {
1241+ let mut req = futures:: executor:: block_on ( build_request ( ) ) ;
1242+ let secret_key = SecretKey :: from_pem ( EDDSA_SECRET_KEY ) . unwrap ( ) ;
1243+ let mut signature_params = HttpSignatureParams :: try_new ( & build_covered_components_req ( ) ) . unwrap ( ) ;
1244+ signature_params. set_key_info ( & secret_key) ;
1245+
1246+ req. set_message_signature_sync ( & signature_params, & secret_key, None ) . unwrap ( ) ;
1247+
1248+ let public_key = PublicKey :: from_pem ( EDDSA_PUBLIC_KEY ) . unwrap ( ) ;
1249+ let verification_res = req. verify_message_signature_sync ( & public_key, None ) ;
1250+ assert ! ( verification_res. is_ok( ) ) ;
1251+ }
1252+
1253+ #[ cfg( feature = "blocking" ) ]
1254+ #[ test]
1255+ fn test_blocking_set_verify_message_signature_res ( ) {
1256+ let req = futures:: executor:: block_on ( build_request ( ) ) ;
1257+ let mut res = futures:: executor:: block_on ( build_response ( ) ) ;
1258+ let secret_key = SecretKey :: from_pem ( EDDSA_SECRET_KEY ) . unwrap ( ) ;
1259+ let mut signature_params = HttpSignatureParams :: try_new ( & build_covered_components_res ( ) ) . unwrap ( ) ;
1260+ signature_params. set_key_info ( & secret_key) ;
1261+ res
1262+ . set_message_signature_sync ( & signature_params, & secret_key, None , Some ( & req) )
1263+ . unwrap ( ) ;
1264+
1265+ let public_key = PublicKey :: from_pem ( EDDSA_PUBLIC_KEY ) . unwrap ( ) ;
1266+ let verification_res = res. verify_message_signature_sync ( & public_key, None , Some ( & req) ) ;
1267+ assert ! ( verification_res. is_ok( ) ) ;
1268+ }
10291269}
0 commit comments