@@ -707,13 +707,17 @@ void oauth2_jose_jwk_list_free(oauth2_log_t *log, oauth2_jose_jwk_list_t *keys)
707
707
708
708
static oauth2_jose_jwk_list_t *
709
709
oauth2_jose_jwks_list_resolve (oauth2_log_t * , oauth2_jose_jwks_provider_t * ,
710
- bool * );
710
+ bool * , const cjose_header_t * );
711
711
static oauth2_jose_jwk_list_t *
712
712
oauth2_jose_jwks_uri_resolve (oauth2_log_t * , oauth2_jose_jwks_provider_t * ,
713
- bool * );
713
+ bool * , const cjose_header_t * );
714
714
static oauth2_jose_jwk_list_t *
715
715
oauth2_jose_jwks_eckey_url_resolve (oauth2_log_t * ,
716
- oauth2_jose_jwks_provider_t * , bool * );
716
+ oauth2_jose_jwks_provider_t * , bool * ,
717
+ const cjose_header_t * );
718
+ static oauth2_jose_jwk_list_t *
719
+ oauth2_jose_jwks_aws_alb_resolve (oauth2_log_t * , oauth2_jose_jwks_provider_t * ,
720
+ bool * , const cjose_header_t * );
717
721
718
722
static oauth2_jose_jwks_provider_t *
719
723
_oauth2_jose_jwks_provider_init (oauth2_log_t * log ,
@@ -737,6 +741,10 @@ _oauth2_jose_jwks_provider_init(oauth2_log_t *log,
737
741
provider -> jwks_uri = oauth2_uri_ctx_init (log );
738
742
provider -> resolve = oauth2_jose_jwks_eckey_url_resolve ;
739
743
break ;
744
+ case OAUTH2_JOSE_JWKS_PROVIDER_AWS_ALB :
745
+ provider -> resolve = oauth2_jose_jwks_aws_alb_resolve ;
746
+ provider -> alb_arn = NULL ;
747
+ break ;
740
748
}
741
749
742
750
return provider ;
@@ -765,6 +773,9 @@ _oauth2_jose_jwks_provider_clone(oauth2_log_t *log,
765
773
case OAUTH2_JOSE_JWKS_PROVIDER_ECKEY_URI :
766
774
dst -> jwks_uri = oauth2_uri_ctx_clone (log , src -> jwks_uri );
767
775
break ;
776
+ case OAUTH2_JOSE_JWKS_PROVIDER_AWS_ALB :
777
+ dst -> alb_arn = oauth2_strdup (src -> alb_arn );
778
+ break ;
768
779
}
769
780
770
781
end :
@@ -790,6 +801,10 @@ _oauth2_jose_jwks_provider_free(oauth2_log_t *log,
790
801
if (provider -> jwks_uri )
791
802
oauth2_uri_ctx_free (log , provider -> jwks_uri );
792
803
break ;
804
+ case OAUTH2_JOSE_JWKS_PROVIDER_AWS_ALB :
805
+ if (provider -> alb_arn )
806
+ oauth2_mem_free (provider -> alb_arn );
807
+ break ;
793
808
}
794
809
795
810
oauth2_mem_free (provider );
@@ -1292,7 +1307,7 @@ bool oauth2_jose_jwt_verify(oauth2_log_t *log,
1292
1307
if (jwt_verify_ctx ) {
1293
1308
1294
1309
keys = jwt_verify_ctx -> jwks_provider -> resolve (
1295
- log , jwt_verify_ctx -> jwks_provider , & refresh );
1310
+ log , jwt_verify_ctx -> jwks_provider , & refresh , hdr );
1296
1311
1297
1312
ctx .jws = jws ;
1298
1313
ctx .kid = cjose_header_get (hdr , "kid" , & err );
@@ -1309,7 +1324,7 @@ bool oauth2_jose_jwt_verify(oauth2_log_t *log,
1309
1324
if (keys )
1310
1325
oauth2_jose_jwk_list_free (log , keys );
1311
1326
keys = jwt_verify_ctx -> jwks_provider -> resolve (
1312
- log , jwt_verify_ctx -> jwks_provider , & refresh );
1327
+ log , jwt_verify_ctx -> jwks_provider , & refresh , hdr );
1313
1328
_oauth2_jose_verification_keys_loop (
1314
1329
log , keys , _oauth2_jose_jwt_verify_jwk , & ctx );
1315
1330
@@ -1846,8 +1861,38 @@ _OAUTH_CFG_CTX_CALLBACK(oauth2_jose_verify_options_jwk_set_eckey_uri)
1846
1861
"eckey_uri" );
1847
1862
}
1848
1863
1849
- static oauth2_jose_jwk_list_t * oauth2_jose_jwks_list_resolve (
1850
- oauth2_log_t * log , oauth2_jose_jwks_provider_t * provider , bool * refresh )
1864
+ _OAUTH_CFG_CTX_CALLBACK (oauth2_jose_verify_options_jwk_set_aws_alb )
1865
+ {
1866
+ oauth2_cfg_token_verify_t * verify = (oauth2_cfg_token_verify_t * )ctx ;
1867
+ char * rv = NULL ;
1868
+ oauth2_jose_jwt_verify_ctx_t * ptr = NULL ;
1869
+
1870
+ oauth2_debug (log , "enter" );
1871
+
1872
+ verify -> callback = _oauth2_jose_jwt_verify_callback ;
1873
+ verify -> ctx -> callbacks = & oauth2_jose_jwt_verify_ctx_funcs ;
1874
+ verify -> ctx -> ptr = verify -> ctx -> callbacks -> init (log );
1875
+ ptr = (oauth2_jose_jwt_verify_ctx_t * )verify -> ctx -> ptr ;
1876
+
1877
+ if (oauth2_jose_jwt_verify_set_options (
1878
+ log , ptr , OAUTH2_JOSE_JWKS_PROVIDER_AWS_ALB , params ) == false) {
1879
+ rv = oauth2_strdup ("oauth2_jose_jwt_verify_set_options failed" );
1880
+ goto end ;
1881
+ }
1882
+
1883
+ ptr -> jwks_provider -> alb_arn = oauth2_strdup (value );
1884
+
1885
+ end :
1886
+
1887
+ oauth2_debug (log , "leave: %s" , rv );
1888
+
1889
+ return rv ;
1890
+ }
1891
+
1892
+ static oauth2_jose_jwk_list_t *
1893
+ oauth2_jose_jwks_list_resolve (oauth2_log_t * log ,
1894
+ oauth2_jose_jwks_provider_t * provider ,
1895
+ bool * refresh , const cjose_header_t * hdr )
1851
1896
{
1852
1897
* refresh = false;
1853
1898
return oauth2_jose_jwk_list_clone (log , provider -> jwks );
@@ -2171,22 +2216,55 @@ static oauth2_jose_jwk_list_t *_oauth2_jose_jwks_resolve_from_uri(
2171
2216
return dst ;
2172
2217
}
2173
2218
2174
- static oauth2_jose_jwk_list_t * oauth2_jose_jwks_uri_resolve (
2175
- oauth2_log_t * log , oauth2_jose_jwks_provider_t * provider , bool * refresh )
2219
+ static oauth2_jose_jwk_list_t *
2220
+ oauth2_jose_jwks_uri_resolve (oauth2_log_t * log ,
2221
+ oauth2_jose_jwks_provider_t * provider ,
2222
+ bool * refresh , const cjose_header_t * hdr )
2176
2223
{
2177
2224
return _oauth2_jose_jwks_resolve_from_uri (
2178
2225
log , provider , refresh ,
2179
2226
_oauth2_jose_jwks_uri_resolve_response_callback );
2180
2227
}
2181
2228
2182
- static oauth2_jose_jwk_list_t * oauth2_jose_jwks_eckey_url_resolve (
2183
- oauth2_log_t * log , oauth2_jose_jwks_provider_t * provider , bool * refresh )
2229
+ static oauth2_jose_jwk_list_t *
2230
+ oauth2_jose_jwks_eckey_url_resolve (oauth2_log_t * log ,
2231
+ oauth2_jose_jwks_provider_t * provider ,
2232
+ bool * refresh , const cjose_header_t * hdr )
2184
2233
{
2185
2234
return _oauth2_jose_jwks_resolve_from_uri (
2186
2235
log , provider , refresh ,
2187
2236
_oauth2_jose_jwks_eckey_url_resolve_response_callback );
2188
2237
}
2189
2238
2239
+ static oauth2_jose_jwk_list_t *
2240
+ oauth2_jose_jwks_aws_alb_resolve (oauth2_log_t * log ,
2241
+ oauth2_jose_jwks_provider_t * provider ,
2242
+ bool * refresh , const cjose_header_t * hdr )
2243
+ {
2244
+ /*
2245
+ * 1. pull the 'signer' and `kid` claims from the header (a typedef-ed
2246
+ * JSON object)
2247
+ * 2. check it against the configured provider->arb_arn value, and if
2248
+ * they match:
2249
+ * 3. construct the EC keys URL:
2250
+ * https://public-keys.auth.elb.<region from
2251
+ * ALB_ARN>.amazonaws.com/<kid>
2252
+ * TODO: make the base URL configurable in
2253
+ * oauth2_jose_verify_options_jwk_set_aws_alb and add a member
2254
+ * alb_arn_base_url to oauth2_jose_jwks_provider_t
2255
+ * 4. construct a temporary provider->jwks_uri
2256
+ * 5. call:
2257
+ * _oauth2_jose_jwks_resolve_from_uri(log, provider, refresh,
2258
+ * oauth2_jose_jwks_eckey_url_resolve_response_callback);
2259
+ * and save the result (oauth2_jose_jwk_list_t *)
2260
+ * 6. free the temporary provider->jwks_uri (TODO: caching?)
2261
+ * 7. return the result
2262
+ *
2263
+ * add unit tests
2264
+ */
2265
+ return NULL ;
2266
+ }
2267
+
2190
2268
/*
2191
2269
oauth2_jose_jwk_list_t *
2192
2270
oauth2_jose_jwks_resolve(oauth2_log_t *log, oauth2_cfg_token_verify_t *verify,
0 commit comments