@@ -5,10 +5,10 @@ use httpsig::prelude::{
55 message_component:: {
66 DerivedComponentName , HttpMessageComponent , HttpMessageComponentId , HttpMessageComponentName , HttpMessageComponentParam ,
77 } ,
8- HttpSignatureBase , HttpSignatureHeaders , HttpSignatureHeadersMap , HttpSignatureParams , SigningKey , VerifyingKey ,
8+ AlgorithmName , HttpSignatureBase , HttpSignatureHeaders , HttpSignatureHeadersMap , HttpSignatureParams , SigningKey , VerifyingKey ,
99} ;
1010use indexmap:: { IndexMap , IndexSet } ;
11- use std:: future:: Future ;
11+ use std:: { future:: Future , str :: FromStr } ;
1212
1313/// A type alias for the signature name
1414type SignatureName = String ;
@@ -24,7 +24,7 @@ pub trait MessageSignature {
2424 fn has_message_signature ( & self ) -> bool ;
2525
2626 /// Extract all key ids for signature bases contained in the request headers
27- fn get_key_ids ( & self ) -> Result < IndexMap < SignatureName , KeyId > , Self :: Error > ;
27+ fn get_alg_key_ids ( & self ) -> Result < IndexMap < SignatureName , ( AlgorithmName , KeyId ) > , Self :: Error > ;
2828
2929 /// Extract all signature params used to generate signature bases contained in the request headers
3030 fn get_signature_params ( & self ) -> Result < IndexMap < SignatureName , HttpSignatureParams > , Self :: Error > ;
@@ -243,9 +243,9 @@ where
243243 }
244244
245245 /// Extract all signature bases contained in the request headers
246- fn get_key_ids ( & self ) -> HyperSigResult < IndexMap < SignatureName , KeyId > > {
246+ fn get_alg_key_ids ( & self ) -> HyperSigResult < IndexMap < SignatureName , ( AlgorithmName , KeyId ) > > {
247247 let req_or_res = RequestOrResponse :: Request ( self ) ;
248- get_key_ids_inner ( & req_or_res)
248+ get_alg_key_ids_inner ( & req_or_res)
249249 }
250250
251251 /// Extract all signature params used to generate signature bases contained in the request headers
@@ -358,9 +358,9 @@ where
358358 }
359359
360360 /// Extract all key ids for signature bases contained in the response headers
361- fn get_key_ids ( & self ) -> Result < IndexMap < SignatureName , KeyId > , Self :: Error > {
361+ fn get_alg_key_ids ( & self ) -> Result < IndexMap < SignatureName , ( AlgorithmName , KeyId ) > , Self :: Error > {
362362 let req_or_res = RequestOrResponse :: Response ( self ) ;
363- get_key_ids_inner ( & req_or_res)
363+ get_alg_key_ids_inner ( & req_or_res)
364364 }
365365
366366 /// Extract all signature params used to generate signature bases contained in the response headers
@@ -594,11 +594,28 @@ fn has_message_signature_inner(headers: &HeaderMap) -> bool {
594594}
595595
596596/// get key ids inner function
597- fn get_key_ids_inner < B > ( req_or_res : & RequestOrResponse < B > ) -> HyperSigResult < IndexMap < SignatureName , KeyId > > {
597+ fn get_alg_key_ids_inner < B > (
598+ req_or_res : & RequestOrResponse < B > ,
599+ ) -> HyperSigResult < IndexMap < SignatureName , ( AlgorithmName , KeyId ) > > {
598600 let signature_headers_map = extract_signature_headers_with_name ( req_or_res) ?;
599601 let res = signature_headers_map
600602 . iter ( )
601- . filter_map ( |( name, headers) | headers. signature_params ( ) . keyid . clone ( ) . map ( |key_id| ( name. clone ( ) , key_id) ) )
603+ . filter_map ( |( name, headers) | {
604+ let alg = headers
605+ . signature_params ( )
606+ . alg
607+ . clone ( )
608+ . map ( |a| AlgorithmName :: from_str ( & a) )
609+ . transpose ( )
610+ . ok ( )
611+ . flatten ( ) ;
612+ let key_id = headers. signature_params ( ) . keyid . clone ( ) ;
613+ if let ( Some ( alg) , Some ( key_id) ) = ( alg, key_id) {
614+ Some ( ( name. clone ( ) , ( alg, key_id) ) )
615+ } else {
616+ None
617+ }
618+ } )
602619 . collect ( ) ;
603620 Ok ( res)
604621}
@@ -904,7 +921,7 @@ mod tests {
904921 * ,
905922 } ;
906923 use http_body_util:: Full ;
907- use httpsig:: prelude:: { PublicKey , SecretKey , SharedKey } ;
924+ use httpsig:: prelude:: { AlgorithmName , PublicKey , SecretKey , SharedKey } ;
908925
909926 type BoxBody = http_body_util:: combinators:: BoxBody < bytes:: Bytes , HyperDigestError > ;
910927
@@ -1053,7 +1070,7 @@ MCowBQYDK2VwAyEA1ixMQcxO46PLlgQfYS46ivFd+n0CcDHSKUnuhm3i1O0=
10531070 #[ tokio:: test]
10541071 async fn test_set_verify_message_signature_req ( ) {
10551072 let mut req = build_request ( ) . await ;
1056- let secret_key = SecretKey :: from_pem ( EDDSA_SECRET_KEY ) . unwrap ( ) ;
1073+ let secret_key = SecretKey :: from_pem ( & AlgorithmName :: Ed25519 , EDDSA_SECRET_KEY ) . unwrap ( ) ;
10571074 let mut signature_params = HttpSignatureParams :: try_new ( & build_covered_components_req ( ) ) . unwrap ( ) ;
10581075 signature_params. set_key_info ( & secret_key) ;
10591076
@@ -1062,7 +1079,7 @@ MCowBQYDK2VwAyEA1ixMQcxO46PLlgQfYS46ivFd+n0CcDHSKUnuhm3i1O0=
10621079 assert ! ( signature_input. starts_with( r##"sig=("@method" "date" "content-type" "content-digest")"## ) ) ;
10631080 // let signature = req.headers().get("signature").unwrap().to_str().unwrap();
10641081
1065- let public_key = PublicKey :: from_pem ( EDDSA_PUBLIC_KEY ) . unwrap ( ) ;
1082+ let public_key = PublicKey :: from_pem ( & AlgorithmName :: Ed25519 , EDDSA_PUBLIC_KEY ) . unwrap ( ) ;
10661083 let verification_res = req. verify_message_signature ( & public_key, None ) . await ;
10671084 assert ! ( verification_res. is_ok( ) ) ;
10681085 }
@@ -1072,7 +1089,7 @@ MCowBQYDK2VwAyEA1ixMQcxO46PLlgQfYS46ivFd+n0CcDHSKUnuhm3i1O0=
10721089 let req = build_request ( ) . await ;
10731090 let mut res = build_response ( ) . await ;
10741091
1075- let secret_key = SecretKey :: from_pem ( EDDSA_SECRET_KEY ) . unwrap ( ) ;
1092+ let secret_key = SecretKey :: from_pem ( & AlgorithmName :: Ed25519 , EDDSA_SECRET_KEY ) . unwrap ( ) ;
10761093
10771094 let mut signature_params = HttpSignatureParams :: try_new ( & build_covered_components_res ( ) ) . unwrap ( ) ;
10781095 signature_params. set_key_info ( & secret_key) ;
@@ -1090,15 +1107,15 @@ MCowBQYDK2VwAyEA1ixMQcxO46PLlgQfYS46ivFd+n0CcDHSKUnuhm3i1O0=
10901107 assert ! ( signature_input. starts_with( r##"sig=("@status" "@method";req "date" "content-type" "content-digest";req)"## ) ) ;
10911108 // let signature = req.headers().get("signature").unwrap().to_str().unwrap();
10921109
1093- let public_key = PublicKey :: from_pem ( EDDSA_PUBLIC_KEY ) . unwrap ( ) ;
1110+ let public_key = PublicKey :: from_pem ( & AlgorithmName :: Ed25519 , EDDSA_PUBLIC_KEY ) . unwrap ( ) ;
10941111 let verification_res = res. verify_message_signature ( & public_key, None , Some ( & req) ) . await ;
10951112 assert ! ( verification_res. is_ok( ) ) ;
10961113 }
10971114
10981115 #[ tokio:: test]
10991116 async fn test_expired_signature ( ) {
11001117 let mut req = build_request ( ) . await ;
1101- let secret_key = SecretKey :: from_pem ( EDDSA_SECRET_KEY ) . unwrap ( ) ;
1118+ let secret_key = SecretKey :: from_pem ( & AlgorithmName :: Ed25519 , EDDSA_SECRET_KEY ) . unwrap ( ) ;
11021119 let mut signature_params = HttpSignatureParams :: try_new ( & build_covered_components_req ( ) ) . unwrap ( ) ;
11031120 signature_params. set_key_info ( & secret_key) ;
11041121 let created = signature_params. created . unwrap ( ) ;
@@ -1107,15 +1124,15 @@ MCowBQYDK2VwAyEA1ixMQcxO46PLlgQfYS46ivFd+n0CcDHSKUnuhm3i1O0=
11071124
11081125 req. set_message_signature ( & signature_params, & secret_key, None ) . await . unwrap ( ) ;
11091126
1110- let public_key = PublicKey :: from_pem ( EDDSA_PUBLIC_KEY ) . unwrap ( ) ;
1127+ let public_key = PublicKey :: from_pem ( & AlgorithmName :: Ed25519 , EDDSA_PUBLIC_KEY ) . unwrap ( ) ;
11111128 let verification_res = req. verify_message_signature ( & public_key, None ) . await ;
11121129 assert ! ( verification_res. is_err( ) ) ;
11131130 }
11141131
11151132 #[ tokio:: test]
11161133 async fn test_set_verify_with_signature_name ( ) {
11171134 let mut req = build_request ( ) . await ;
1118- let secret_key = SecretKey :: from_pem ( EDDSA_SECRET_KEY ) . unwrap ( ) ;
1135+ let secret_key = SecretKey :: from_pem ( & AlgorithmName :: Ed25519 , EDDSA_SECRET_KEY ) . unwrap ( ) ;
11191136 let mut signature_params = HttpSignatureParams :: try_new ( & build_covered_components_req ( ) ) . unwrap ( ) ;
11201137 signature_params. set_key_info ( & secret_key) ;
11211138
@@ -1129,21 +1146,21 @@ MCowBQYDK2VwAyEA1ixMQcxO46PLlgQfYS46ivFd+n0CcDHSKUnuhm3i1O0=
11291146 assert_eq ! ( signature_headers_map. len( ) , 1 ) ;
11301147 assert_eq ! ( signature_headers_map[ 0 ] . signature_name( ) , "custom_sig_name" ) ;
11311148
1132- let public_key = PublicKey :: from_pem ( EDDSA_PUBLIC_KEY ) . unwrap ( ) ;
1149+ let public_key = PublicKey :: from_pem ( & AlgorithmName :: Ed25519 , EDDSA_PUBLIC_KEY ) . unwrap ( ) ;
11331150 let verification_res = req. verify_message_signature ( & public_key, None ) . await ;
11341151 assert ! ( verification_res. is_ok( ) ) ;
11351152 }
11361153
11371154 #[ tokio:: test]
11381155 async fn test_set_verify_with_key_id ( ) {
11391156 let mut req = build_request ( ) . await ;
1140- let secret_key = SecretKey :: from_pem ( EDDSA_SECRET_KEY ) . unwrap ( ) ;
1157+ let secret_key = SecretKey :: from_pem ( & AlgorithmName :: Ed25519 , EDDSA_SECRET_KEY ) . unwrap ( ) ;
11411158 let mut signature_params = HttpSignatureParams :: try_new ( & build_covered_components_req ( ) ) . unwrap ( ) ;
11421159 signature_params. set_key_info ( & secret_key) ;
11431160
11441161 req. set_message_signature ( & signature_params, & secret_key, None ) . await . unwrap ( ) ;
11451162
1146- let public_key = PublicKey :: from_pem ( EDDSA_PUBLIC_KEY ) . unwrap ( ) ;
1163+ let public_key = PublicKey :: from_pem ( & AlgorithmName :: Ed25519 , EDDSA_PUBLIC_KEY ) . unwrap ( ) ;
11471164 let key_id = public_key. key_id ( ) ;
11481165 let verification_res = req. verify_message_signature ( & public_key, Some ( & key_id) ) . await ;
11491166 assert ! ( verification_res. is_ok( ) ) ;
@@ -1158,33 +1175,37 @@ MCowBQYDK2VwAyEA1ixMQcxO46PLlgQfYS46ivFd+n0CcDHSKUnuhm3i1O0=
11581175 #[ tokio:: test]
11591176 async fn test_set_verify_with_key_id_hmac_sha256 ( ) {
11601177 let mut req = build_request ( ) . await ;
1161- let secret_key = SharedKey :: from_base64 ( HMACSHA256_SECRET_KEY ) . unwrap ( ) ;
1178+ let secret_key = SharedKey :: from_base64 ( & AlgorithmName :: HmacSha256 , HMACSHA256_SECRET_KEY ) . unwrap ( ) ;
11621179 let mut signature_params = HttpSignatureParams :: try_new ( & build_covered_components_req ( ) ) . unwrap ( ) ;
11631180 signature_params. set_key_info ( & secret_key) ;
11641181 // Random nonce is highly recommended for HMAC
11651182 signature_params. set_random_nonce ( ) ;
11661183
11671184 req. set_message_signature ( & signature_params, & secret_key, None ) . await . unwrap ( ) ;
11681185
1169- let key_id = VerifyingKey :: key_id ( & secret_key) ;
1170- let verification_res = req. verify_message_signature ( & secret_key, Some ( & key_id) ) . await ;
1186+ let org_key_id = VerifyingKey :: key_id ( & secret_key) ;
1187+ let ( alg, key_id) = req. get_alg_key_ids ( ) . unwrap ( ) . into_iter ( ) . next ( ) . unwrap ( ) . 1 ;
1188+ assert_eq ! ( org_key_id, * key_id) ;
1189+ let verification_key = SharedKey :: from_base64 ( & alg, HMACSHA256_SECRET_KEY ) . unwrap ( ) ;
1190+ let verification_res = req. verify_message_signature ( & verification_key, Some ( & key_id) ) . await ;
11711191 assert ! ( verification_res. is_ok( ) ) ;
11721192
1173- let verification_res = req. verify_message_signature ( & secret_key , Some ( "NotFoundKeyId" ) ) . await ;
1193+ let verification_res = req. verify_message_signature ( & verification_key , Some ( "NotFoundKeyId" ) ) . await ;
11741194 assert ! ( verification_res. is_err( ) ) ;
11751195 }
11761196
11771197 #[ tokio:: test]
1178- async fn test_get_key_ids ( ) {
1198+ async fn test_get_alg_key_ids ( ) {
11791199 let mut req = build_request ( ) . await ;
1180- let secret_key = SecretKey :: from_pem ( EDDSA_SECRET_KEY ) . unwrap ( ) ;
1200+ let secret_key = SecretKey :: from_pem ( & AlgorithmName :: Ed25519 , EDDSA_SECRET_KEY ) . unwrap ( ) ;
11811201 let mut signature_params = HttpSignatureParams :: try_new ( & build_covered_components_req ( ) ) . unwrap ( ) ;
11821202 signature_params. set_key_info ( & secret_key) ;
11831203
11841204 req. set_message_signature ( & signature_params, & secret_key, None ) . await . unwrap ( ) ;
1185- let key_ids = req. get_key_ids ( ) . unwrap ( ) ;
1205+ let key_ids = req. get_alg_key_ids ( ) . unwrap ( ) ;
11861206 assert_eq ! ( key_ids. len( ) , 1 ) ;
1187- assert_eq ! ( key_ids[ 0 ] , "gjrE7ACMxgzYfFHgabgf4kLTg1eKIdsJ94AiFTFj1is=" ) ;
1207+ assert_eq ! ( key_ids[ 0 ] . 0 , AlgorithmName :: Ed25519 ) ;
1208+ assert_eq ! ( key_ids[ 0 ] . 1 , "gjrE7ACMxgzYfFHgabgf4kLTg1eKIdsJ94AiFTFj1is=" ) ;
11881209 }
11891210
11901211 const P256_SECERT_KEY : & str = r##"-----BEGIN PRIVATE KEY-----
@@ -1202,11 +1223,11 @@ ii+31DW+YulmysZKQKDvuk96TARuWMO/vDbhk777a2QF3bgNoIj8UPMwnw==
12021223 async fn test_set_verify_multiple_signatures ( ) {
12031224 let mut req = build_request ( ) . await ;
12041225
1205- let secret_key_eddsa = SecretKey :: from_pem ( EDDSA_SECRET_KEY ) . unwrap ( ) ;
1226+ let secret_key_eddsa = SecretKey :: from_pem ( & AlgorithmName :: Ed25519 , EDDSA_SECRET_KEY ) . unwrap ( ) ;
12061227 let mut signature_params_eddsa = HttpSignatureParams :: try_new ( & build_covered_components_req ( ) ) . unwrap ( ) ;
12071228 signature_params_eddsa. set_key_info ( & secret_key_eddsa) ;
12081229
1209- let secret_key_p256 = SecretKey :: from_pem ( P256_SECERT_KEY ) . unwrap ( ) ;
1230+ let secret_key_p256 = SecretKey :: from_pem ( & AlgorithmName :: EcdsaP256Sha256 , P256_SECERT_KEY ) . unwrap ( ) ;
12101231 let mut signature_params_hmac = HttpSignatureParams :: try_new ( & build_covered_components_req ( ) ) . unwrap ( ) ;
12111232 signature_params_hmac. set_key_info ( & secret_key_p256) ;
12121233
@@ -1217,8 +1238,8 @@ ii+31DW+YulmysZKQKDvuk96TARuWMO/vDbhk777a2QF3bgNoIj8UPMwnw==
12171238
12181239 req. set_message_signatures ( params_key_name) . await . unwrap ( ) ;
12191240
1220- let public_key_eddsa = PublicKey :: from_pem ( EDDSA_PUBLIC_KEY ) . unwrap ( ) ;
1221- let public_key_p256 = PublicKey :: from_pem ( P256_PUBLIC_KEY ) . unwrap ( ) ;
1241+ let public_key_eddsa = PublicKey :: from_pem ( & AlgorithmName :: Ed25519 , EDDSA_PUBLIC_KEY ) . unwrap ( ) ;
1242+ let public_key_p256 = PublicKey :: from_pem ( & AlgorithmName :: EcdsaP256Sha256 , P256_PUBLIC_KEY ) . unwrap ( ) ;
12221243 let key_id_eddsa = public_key_eddsa. key_id ( ) ;
12231244 let key_id_p256 = public_key_p256. key_id ( ) ;
12241245
@@ -1239,13 +1260,13 @@ ii+31DW+YulmysZKQKDvuk96TARuWMO/vDbhk777a2QF3bgNoIj8UPMwnw==
12391260 #[ test]
12401261 fn test_blocking_set_verify_message_signature_req ( ) {
12411262 let mut req = futures:: executor:: block_on ( build_request ( ) ) ;
1242- let secret_key = SecretKey :: from_pem ( EDDSA_SECRET_KEY ) . unwrap ( ) ;
1263+ let secret_key = SecretKey :: from_pem ( & AlgorithmName :: Ed25519 , EDDSA_SECRET_KEY ) . unwrap ( ) ;
12431264 let mut signature_params = HttpSignatureParams :: try_new ( & build_covered_components_req ( ) ) . unwrap ( ) ;
12441265 signature_params. set_key_info ( & secret_key) ;
12451266
12461267 req. set_message_signature_sync ( & signature_params, & secret_key, None ) . unwrap ( ) ;
12471268
1248- let public_key = PublicKey :: from_pem ( EDDSA_PUBLIC_KEY ) . unwrap ( ) ;
1269+ let public_key = PublicKey :: from_pem ( & AlgorithmName :: Ed25519 , EDDSA_PUBLIC_KEY ) . unwrap ( ) ;
12491270 let verification_res = req. verify_message_signature_sync ( & public_key, None ) ;
12501271 assert ! ( verification_res. is_ok( ) ) ;
12511272 }
@@ -1255,14 +1276,14 @@ ii+31DW+YulmysZKQKDvuk96TARuWMO/vDbhk777a2QF3bgNoIj8UPMwnw==
12551276 fn test_blocking_set_verify_message_signature_res ( ) {
12561277 let req = futures:: executor:: block_on ( build_request ( ) ) ;
12571278 let mut res = futures:: executor:: block_on ( build_response ( ) ) ;
1258- let secret_key = SecretKey :: from_pem ( EDDSA_SECRET_KEY ) . unwrap ( ) ;
1279+ let secret_key = SecretKey :: from_pem ( & AlgorithmName :: Ed25519 , EDDSA_SECRET_KEY ) . unwrap ( ) ;
12591280 let mut signature_params = HttpSignatureParams :: try_new ( & build_covered_components_res ( ) ) . unwrap ( ) ;
12601281 signature_params. set_key_info ( & secret_key) ;
12611282 res
12621283 . set_message_signature_sync ( & signature_params, & secret_key, None , Some ( & req) )
12631284 . unwrap ( ) ;
12641285
1265- let public_key = PublicKey :: from_pem ( EDDSA_PUBLIC_KEY ) . unwrap ( ) ;
1286+ let public_key = PublicKey :: from_pem ( & AlgorithmName :: Ed25519 , EDDSA_PUBLIC_KEY ) . unwrap ( ) ;
12661287 let verification_res = res. verify_message_signature_sync ( & public_key, None , Some ( & req) ) ;
12671288 assert ! ( verification_res. is_ok( ) ) ;
12681289 }
0 commit comments