@@ -707,13 +707,17 @@ void oauth2_jose_jwk_list_free(oauth2_log_t *log, oauth2_jose_jwk_list_t *keys)
707707
708708static oauth2_jose_jwk_list_t *
709709oauth2_jose_jwks_list_resolve (oauth2_log_t * , oauth2_jose_jwks_provider_t * ,
710- bool * );
710+ bool * , const cjose_header_t * );
711711static oauth2_jose_jwk_list_t *
712712oauth2_jose_jwks_uri_resolve (oauth2_log_t * , oauth2_jose_jwks_provider_t * ,
713- bool * );
713+ bool * , const cjose_header_t * );
714714static oauth2_jose_jwk_list_t *
715715oauth2_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 * );
717721
718722static oauth2_jose_jwks_provider_t *
719723_oauth2_jose_jwks_provider_init (oauth2_log_t * log ,
@@ -737,6 +741,10 @@ _oauth2_jose_jwks_provider_init(oauth2_log_t *log,
737741 provider -> jwks_uri = oauth2_uri_ctx_init (log );
738742 provider -> resolve = oauth2_jose_jwks_eckey_url_resolve ;
739743 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 ;
740748 }
741749
742750 return provider ;
@@ -765,6 +773,9 @@ _oauth2_jose_jwks_provider_clone(oauth2_log_t *log,
765773 case OAUTH2_JOSE_JWKS_PROVIDER_ECKEY_URI :
766774 dst -> jwks_uri = oauth2_uri_ctx_clone (log , src -> jwks_uri );
767775 break ;
776+ case OAUTH2_JOSE_JWKS_PROVIDER_AWS_ALB :
777+ dst -> alb_arn = oauth2_strdup (src -> alb_arn );
778+ break ;
768779 }
769780
770781end :
@@ -790,6 +801,10 @@ _oauth2_jose_jwks_provider_free(oauth2_log_t *log,
790801 if (provider -> jwks_uri )
791802 oauth2_uri_ctx_free (log , provider -> jwks_uri );
792803 break ;
804+ case OAUTH2_JOSE_JWKS_PROVIDER_AWS_ALB :
805+ if (provider -> alb_arn )
806+ oauth2_mem_free (provider -> alb_arn );
807+ break ;
793808 }
794809
795810 oauth2_mem_free (provider );
@@ -1292,7 +1307,7 @@ bool oauth2_jose_jwt_verify(oauth2_log_t *log,
12921307 if (jwt_verify_ctx ) {
12931308
12941309 keys = jwt_verify_ctx -> jwks_provider -> resolve (
1295- log , jwt_verify_ctx -> jwks_provider , & refresh );
1310+ log , jwt_verify_ctx -> jwks_provider , & refresh , hdr );
12961311
12971312 ctx .jws = jws ;
12981313 ctx .kid = cjose_header_get (hdr , "kid" , & err );
@@ -1309,7 +1324,7 @@ bool oauth2_jose_jwt_verify(oauth2_log_t *log,
13091324 if (keys )
13101325 oauth2_jose_jwk_list_free (log , keys );
13111326 keys = jwt_verify_ctx -> jwks_provider -> resolve (
1312- log , jwt_verify_ctx -> jwks_provider , & refresh );
1327+ log , jwt_verify_ctx -> jwks_provider , & refresh , hdr );
13131328 _oauth2_jose_verification_keys_loop (
13141329 log , keys , _oauth2_jose_jwt_verify_jwk , & ctx );
13151330
@@ -1846,8 +1861,38 @@ _OAUTH_CFG_CTX_CALLBACK(oauth2_jose_verify_options_jwk_set_eckey_uri)
18461861 "eckey_uri" );
18471862}
18481863
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 )
18511896{
18521897 * refresh = false;
18531898 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(
21712216 return dst ;
21722217}
21732218
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 )
21762223{
21772224 return _oauth2_jose_jwks_resolve_from_uri (
21782225 log , provider , refresh ,
21792226 _oauth2_jose_jwks_uri_resolve_response_callback );
21802227}
21812228
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 )
21842233{
21852234 return _oauth2_jose_jwks_resolve_from_uri (
21862235 log , provider , refresh ,
21872236 _oauth2_jose_jwks_eckey_url_resolve_response_callback );
21882237}
21892238
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+
21902268/*
21912269oauth2_jose_jwk_list_t *
21922270oauth2_jose_jwks_resolve(oauth2_log_t *log, oauth2_cfg_token_verify_t *verify,
0 commit comments