@@ -400,6 +400,131 @@ START_TEST(test_jwk_json_parse_and_jwks) {
400400}
401401END_TEST
402402
403+ START_TEST (test_jwk_json_x5c_parse ) {
404+ apr_pool_t * pool = oidc_test_pool_get ();
405+ oidc_jwk_t * jwk = NULL ;
406+ oidc_jose_error_t err = {{'\0' }, 0 , {'\0' }, {'\0' }};
407+ json_error_t json_err = {0 , 0 , 0 , {'\0' }, {'\0' }};
408+
409+ // https://datatracker.ietf.org/doc/html/rfc7517#appendix-, n and e removed
410+ const char * s_json =
411+ "{\"kty\":\"RSA\",\"use\":\"sig\",\"kid\":\"1b94c\",\"x5c\":[\"MIIDQjCCAiqgAwIBAgIGATz/"
412+ "FuLiMA0GCSqGSIb3DQEBBQUAMGIxCzAJBgNVBAYTAlVTMQswCQYDVQQIEwJDTzEPMA0GA1UEBxMGRGVudmVyMRwwGgYDVQQKExNQaW5nIE"
413+ "lkZW50aXR5IENvcnAuMRcwFQYDVQQDEw5CcmlhbiBDYW1wYmVsbDAeFw0xMzAyMjEyMzI5MTVaFw0xODA4MTQyMjI5MTVaMGIxCzAJBgNV"
414+ "BAYTAlVTMQswCQYDVQQIEwJDTzEPMA0GA1UEBxMGRGVudmVyMRwwGgYDVQQKExNQaW5nIElkZW50aXR5IENvcnAuMRcwFQYDVQQDEw5Ccm"
415+ "lhbiBDYW1wYmVsbDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAL64zn8/QnHYMeZ0LncoXaEde1fiLm1jHjmQsF/"
416+ "449IYALM9if6amFtPDy2yvz3YlRij66s5gyLCyO7ANuVRJx1NbgizcAblIgjtdf/u3WG7K+IiZhtELto/"
417+ "A7Fck9Ws6SQvzRvOE8uSirYbgmj6He4iO8NCyvaK0jIQRMMGQwsU1quGmFgHIXPLfnpnfajr1rVTAwtgV5LEZ4Iel+W1GC8ugMhyr4/"
418+ "p1MtcIM42EA8BzE6ZQqC7VPqPvEjZ2dbZkaBhPbiZAS3YeYBRDWm1p1OZtWamT3cEvqqPpnjL1XyW+"
419+ "oyVVkaZdklLQp2Btgt9qr21m42f4wTw+"
420+ "Xrp6rCKNb0CAwEAATANBgkqhkiG9w0BAQUFAAOCAQEAh8zGlfSlcI0o3rYDPBB07aXNswb4ECNIKG0CETTUxmXl9KUL+"
421+ "9gGlqCz5iWLOgWsnrcKcY0vXPG9J1r9AqBNTqNgHq2G03X09266X5CpOe1zFo+"
422+ "Owb1zxtp3PehFdfQJ610CDLEaS9V9Rqp17hCyybEpOGVwe8fnk+fbEL2Bo3UPGrpsHzUoaGpDftmWssZkhpBJKVMJyf/"
423+ "RuP2SmmaIzmnw9JiSlYhzo4tpzd5rFXhjRbg4zW9C+2qok+2+qDM1iJ684gPHMIY8aLWrdgQTxkumGmTqgawR+"
424+ "N5MDtdPTEQ0XfIBc2cJEUyMTY5MPvACWpkA6SdS4xSvdXK3IVfOWA==\"]}" ;
425+
426+ json_t * j = json_loads (s_json , 0 , & json_err );
427+ ck_assert_ptr_nonnull (j );
428+ ck_assert_int_eq (oidc_is_jwk (j ), TRUE);
429+
430+ jwk = oidc_jwk_parse (pool , j , & err );
431+ ck_assert_msg (jwk != NULL , "oidc_jwk_parse failed: %s" , oidc_jose_e2s (pool , err ));
432+ ck_assert_ptr_nonnull (jwk -> kid );
433+ ck_assert_int_eq (jwk -> x5c -> nelts , 1 );
434+
435+ json_decref (j );
436+ oidc_jwk_destroy (jwk );
437+ }
438+ END_TEST
439+
440+ START_TEST (test_jwk_public_key_parse ) {
441+ apr_pool_t * pool = oidc_test_pool_get ();
442+ oidc_jose_error_t err = {{'\0' }, 0 , {'\0' }, {'\0' }};
443+ oidc_jwk_t * jwk , * jwkCert = NULL ;
444+ BIO * input , * inputCert = NULL ;
445+ char * json = NULL ;
446+ apr_byte_t isPrivateKey = FALSE;
447+
448+ const char publicKeyFile [512 ];
449+ const char certificateFile [512 ];
450+ const char ecCertificateFile [512 ];
451+ char * dir = getenv ("srcdir" ) ? getenv ("srcdir" ) : "." ;
452+ snprintf ((char * )publicKeyFile , 512 , "%s/%s" , dir , "/public.pem" );
453+ snprintf ((char * )certificateFile , 512 , "%s/%s" , dir , "/certificate.pem" );
454+ snprintf ((char * )ecCertificateFile , 512 , "%s/%s" , dir , "/eccert.pem" );
455+
456+ input = BIO_new (BIO_s_file ());
457+ ck_assert_ptr_nonnull (input );
458+ ck_assert_int_eq (BIO_read_filename (input , publicKeyFile ), 1 );
459+ ck_assert_int_eq (oidc_jwk_pem_bio_to_jwk (pool , input , NULL , & jwk , isPrivateKey , & err ), TRUE);
460+ BIO_free (input );
461+
462+ inputCert = BIO_new (BIO_s_file ());
463+ ck_assert_ptr_nonnull (inputCert );
464+ ck_assert_int_eq (BIO_read_filename (inputCert , certificateFile ), 1 );
465+ apr_byte_t rv = oidc_jwk_pem_bio_to_jwk (pool , inputCert , NULL , & jwkCert , isPrivateKey , & err );
466+ ck_assert_msg (rv == TRUE, "oidc_jwk_pem_bio_to_jwk failed: %s\n" , oidc_jose_e2s (pool , err ));
467+ BIO_free (inputCert );
468+
469+ ck_assert_int_eq (oidc_jwk_to_json (pool , jwk , & json , & err ), TRUE);
470+ ck_assert_str_eq (
471+ json ,
472+ "{\"kty\":\"RSA\",\"kid\":\"IbLjLR7-C1q0-ypkueZxGIJwBQNaLg46DZMpnPW1kps\",\"e\":\"AQAB\",\"n\":"
473+ "\"iGeTXbfV5bMppx7o7qMLCuVIKqbBa_qOzBiNNpe0K8rjg7-1z9GCuSlqbZtM0_5BQ6bGonnSPD--"
474+ "PowhFdivS4WNA33O0Kl1tQ0wdH3TOnwueIO9ahfW4q0BGFvMObneK-tjwiNMj1l-cZt8pvuS-3LtTWIzC-"
475+ "hTZM4caUmy5olm5PVdmru6C6V5rxkbYBPITFSzl5mpuo_C6RV_MYRwAh60ghs2OEvIWDrJkZnYaF7sjHC9j-"
476+ "4kfcM5oY7Zhg8KuHyloudYNzlqjVAPd0MbkLkh1pa8fmHsnN6cgfXYtFK7Z8WjYDUAhTH1JjZCVSFN55A-51dgD4cQNzieLEEkJw\"}" );
477+ oidc_jwk_destroy (jwk );
478+
479+ ck_assert_int_eq (oidc_jwk_to_json (pool , jwkCert , & json , & err ), TRUE);
480+ ck_assert_str_eq (
481+ json , "{\"kty\":\"RSA\",\"kid\":\"IbLjLR7-C1q0-ypkueZxGIJwBQNaLg46DZMpnPW1kps\",\"e\":\"AQAB\",\"n\":"
482+ "\"iGeTXbfV5bMppx7o7qMLCuVIKqbBa_qOzBiNNpe0K8rjg7-1z9GCuSlqbZtM0_5BQ6bGonnSPD--"
483+ "PowhFdivS4WNA33O0Kl1tQ0wdH3TOnwueIO9ahfW4q0BGFvMObneK-tjwiNMj1l-cZt8pvuS-3LtTWIzC-"
484+ "hTZM4caUmy5olm5PVdmru6C6V5rxkbYBPITFSzl5mpuo_C6RV_MYRwAh60ghs2OEvIWDrJkZnYaF7sjHC9j-"
485+ "4kfcM5oY7Zhg8KuHyloudYNzlqjVAPd0MbkLkh1pa8fmHsnN6cgfXYtFK7Z8WjYDUAhTH1JjZCVSFN55A-"
486+ "51dgD4cQNzieLEEkJw\",\"x5c\":[\"MIICnTCCAYUCBgFuk1+"
487+ "FLDANBgkqhkiG9w0BAQsFADASMRAwDgYDVQQDDAd2aW5jZW50MB4XDTE5MTEyMjEzNDcyMVoXDTI5MTEyMjEzNDkwMVowEj"
488+ "EQMA4GA1UEAwwHdmluY2VudDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAIhnk1231eWzKace6O6jCwrlSCqmw"
489+ "Wv6jswYjTaXtCvK44O/tc/Rgrkpam2bTNP+QUOmxqJ50jw/"
490+ "vj6MIRXYr0uFjQN9ztCpdbUNMHR90zp8LniDvWoX1uKtARhbzDm53ivrY8IjTI9ZfnGbfKb7kvty7U1iMwvoU2TOHGlJsua"
491+ "JZuT1XZq7ugulea8ZG2ATyExUs5eZqbqPwukVfzGEcAIetIIbNjhLyFg6yZGZ2Ghe7IxwvY/"
492+ "uJH3DOaGO2YYPCrh8paLnWDc5ao1QD3dDG5C5IdaWvH5h7JzenIH12LRSu2fFo2A1AIUx9SY2QlUhTeeQPudXYA+"
493+ "HEDc4nixBJCcCAwEAATANBgkqhkiG9w0BAQsFAAOCAQEAfAo40il4qw7DfOkke0p1ZFAgLQQS3J5hYNDSRvVv+vxkk9o/"
494+ "N++zTMoHbfcDcU5BdVH6Qsr/12PXPX7Ur5WYDq+bWGAK3MAaGtZlmycFeVhoVRfab4TUWUy43H3VyFUNqjGRAVJ/"
495+ "VD1RW3fJ18KrQTN2fcKSd88Jqt5TvjROKghq95+8BQtlhrR/"
496+ "sQVrjgYwc+eU9ljWI56MQXbpHstl9IewMXnusSPxKRTbutjaxzKaoXRTUncPL6ga0SSxOTdKksM4ZYpPnq0B93silb+"
497+ "0qs8aJraGzjAmLE30opfufP+roth19VJxAfYsW5mgAmXP9kEAF+iWB8FB4/"
498+ "Q4noNG8Q==\"],\"x5t#S256\":\"hMVJ55Mqi4uAQIztPKUmL2MSfy6iN1Lr3J1CNGAIBms\",\"x5t\":\"0oN6Bx-"
499+ "eh6VAmNw1I7o3Dd9JPwE\"}" );
500+ oidc_jwk_destroy (jwkCert );
501+
502+ inputCert = BIO_new (BIO_s_file ());
503+ ck_assert_ptr_nonnull (inputCert );
504+ ck_assert_int_eq (BIO_read_filename (inputCert , ecCertificateFile ), 1 );
505+ ck_assert_int_eq (oidc_jwk_pem_bio_to_jwk (pool , inputCert , NULL , & jwkCert , isPrivateKey , & err ), TRUE);
506+ BIO_free (inputCert );
507+
508+ ck_assert_int_eq (oidc_jwk_to_json (pool , jwkCert , & json , & err ), TRUE);
509+ ck_assert_str_eq (
510+ json ,
511+ "{\"kty\":\"EC\",\"kid\":\"-THDTumMGazABrYTb8xJoYOK2OPiWmho3D-nPC1dSYg\",\"crv\":\"P-521\",\"x\":"
512+ "\"AR6Eh9VhdLEA-rm5WR0_T0LjKysJuBkSoXaR8GjphHvoOTrljcACRsVlTES9FMkbxbNEs4JdxPgPJl9G-e9WEJTe\",\"y\":"
513+ "\"AammgflZaJuSdycK_ccUXkSXjNQd8NsqJuv9LFpk5Ys1OAiirWm6uktXG8ALNSxSffcurBq8zqZyZ141dV6qSzKQ\",\"x5c\":["
514+ "\"MIICBDCCAWagAwIBAgIUdYpkXaCal7IwjHix3n1PP9/"
515+ "O6OcwCgYIKoZIzj0EAwIwFDESMBAGA1UEAwwJbG9jYWxob3N0MB4XDTIzMDMyMzIwNDU1MFoXDTMzMDMyMDIwNDU1MFowFDESMBAGA1UEA"
516+ "wwJbG9jYWxob3N0MIGbMBAGByqGSM49AgEGBSuBBAAjA4GGAAQBHoSH1WF0sQD6ublZHT9PQuMrKwm4GRKhdpHwaOmEe+"
517+ "g5OuWNwAJGxWVMRL0UyRvFs0Szgl3E+A8mX0b571YQlN4BqaaB+Vlom5J3Jwr9xxReRJeM1B3w2yom6/"
518+ "0sWmTlizU4CKKtabq6S1cbwAs1LFJ99y6sGrzOpnJnXjV1XqpLMpCjUzBRMB0GA1UdDgQWBBTKfLLXyRVQpnXFf19Bs7eXRPlRmzAfBgNV"
519+ "HSMEGDAWgBTKfLLXyRVQpnXFf19Bs7eXRPlRmzAPBgNVHRMBAf8EBTADAQH/"
520+ "MAoGCCqGSM49BAMCA4GLADCBhwJBGkoifMDYwsSLSmnnVdFftqTwxrjdgrtPMRzetz/w/"
521+ "D9KkM4Mlufgv5jBXuWcEiP9ray2ZgAGhdkvoOfsc8g1l6ICQgEJ+"
522+ "9R5K2WKlDTEydmiHiSYQHSVyS61PFskm537AqrLVSRu80Sezu2W4m8IF2UbbRZiUPaHPIx9Xe3GdpqIEmPFfA==\"],\"x5t#S256\":"
523+ "\"yCl_u4GL5GrTkf8xvqdF2aixUIhjDdsMFhLUz7O6gVA\",\"x5t\":\"waxmjjAAhxGY5XvH6ufxVxwYGDw\"}" );
524+ oidc_jwk_destroy (jwkCert );
525+ }
526+ END_TEST
527+
403528START_TEST (test_jwk_list_destroy ) {
404529 apr_pool_t * pool = oidc_test_pool_get ();
405530 apr_array_header_t * arr = apr_array_make (pool , 2 , sizeof (const oidc_jwk_t * ));
@@ -476,6 +601,8 @@ int main(void) {
476601 tcase_add_test (core , test_jwk_json_parse_and_jwks );
477602 tcase_add_test (core , test_jwk_list_destroy );
478603 tcase_add_test (core , test_alg2keysize_and_hdr_get_and_jwt_parse );
604+ tcase_add_test (core , test_jwk_json_x5c_parse );
605+ tcase_add_test (core , test_jwk_public_key_parse );
479606
480607 Suite * s = suite_create ("jose" );
481608 suite_add_tcase (s , sup );
0 commit comments