@@ -440,8 +440,8 @@ END_TEST
440440START_TEST (test_jwk_public_key_parse ) {
441441 apr_pool_t * pool = oidc_test_pool_get ();
442442 oidc_jose_error_t err = {{'\0' }, 0 , {'\0' }, {'\0' }};
443- oidc_jwk_t * jwk , * jwkCert = NULL ;
444- BIO * input , * inputCert = NULL ;
443+ oidc_jwk_t * jwk = NULL , * jwkCert = NULL ;
444+ BIO * input = NULL , * inputCert = NULL ;
445445 char * json = NULL ;
446446 apr_byte_t isPrivateKey = FALSE;
447447
@@ -525,6 +525,57 @@ START_TEST(test_jwk_public_key_parse) {
525525}
526526END_TEST
527527
528+ START_TEST (test_jwk_private_key_parse ) {
529+ apr_pool_t * pool = oidc_test_pool_get ();
530+ oidc_jose_error_t err = {{'\0' }, 0 , {'\0' }, {'\0' }};
531+ oidc_jwk_t * jwk = NULL ;
532+ BIO * input = NULL , * inputCert = NULL ;
533+ char * json = NULL ;
534+ apr_byte_t isPrivateKey = TRUE;
535+
536+ const char rsaPrivateKeyFile [512 ];
537+ const char ecPrivateKeyFile [512 ];
538+
539+ char * dir = getenv ("srcdir" ) ? getenv ("srcdir" ) : "." ;
540+ snprintf ((char * )rsaPrivateKeyFile , 512 , "%s/%s" , dir , "/private.pem" );
541+ snprintf ((char * )ecPrivateKeyFile , 512 , "%s/%s" , dir , "/ecpriv.key" );
542+
543+ input = BIO_new (BIO_s_file ());
544+ ck_assert_ptr_nonnull (input );
545+ ck_assert_int_eq (BIO_read_filename (input , rsaPrivateKeyFile ), 1 );
546+ ck_assert_int_eq (oidc_jwk_pem_bio_to_jwk (pool , input , NULL , & jwk , isPrivateKey , & err ), TRUE);
547+ BIO_free (input );
548+
549+ ck_assert_int_eq (oidc_jwk_to_json (pool , jwk , & json , & err ), TRUE);
550+ ck_assert_str_eq (
551+ json ,
552+ "{\"kty\":\"RSA\",\"kid\":\"IbLjLR7-C1q0-ypkueZxGIJwBQNaLg46DZMpnPW1kps\",\"e\":\"AQAB\",\"n\":"
553+ "\"iGeTXbfV5bMppx7o7qMLCuVIKqbBa_qOzBiNNpe0K8rjg7-1z9GCuSlqbZtM0_5BQ6bGonnSPD--"
554+ "PowhFdivS4WNA33O0Kl1tQ0wdH3TOnwueIO9ahfW4q0BGFvMObneK-tjwiNMj1l-cZt8pvuS-3LtTWIzC-"
555+ "hTZM4caUmy5olm5PVdmru6C6V5rxkbYBPITFSzl5mpuo_C6RV_MYRwAh60ghs2OEvIWDrJkZnYaF7sjHC9j-"
556+ "4kfcM5oY7Zhg8KuHyloudYNzlqjVAPd0MbkLkh1pa8fmHsnN6cgfXYtFK7Z8WjYDUAhTH1JjZCVSFN55A-51dgD4cQNzieLEEkJw\","
557+ "\"d\":\"Xc9d-kZERQVC0Dzh1b0sCwJE75Bf1fMr4hHAjJsovjV641ElqRdd4Borp9X2sJVcLTq1wWgmvmjYXgvhdTTg2f-"
558+ "vS4dqhPcGjM3VVUhzzPU6wIdZ7W0XzC1PY4E-ozTBJ1Nr-EhujuftnhRhVjYOkAAqU94FXVsaf2mBAKg-"
559+ "8WzrWx2MeWjfLcE79DmSL9Iw2areKVRGlKddIIPnHb-Mw9HB7ZCyVTC1v5sqhQPy6qPo8XHdQju_EYRlIOMksU8kcb20R_ezib_"
560+ "rHuVwJVlTNk6MvFUIj4ayXdX13Qy4kTBRiQM7pumPaypEE4CrAfTWP0AYnEwz_FGluOpMZNzoAQ\"}" );
561+ oidc_jwk_destroy (jwk );
562+
563+ inputCert = BIO_new (BIO_s_file ());
564+ ck_assert_ptr_nonnull (inputCert );
565+ ck_assert_int_eq (BIO_read_filename (inputCert , ecPrivateKeyFile ), 1 );
566+ ck_assert_int_eq (oidc_jwk_pem_bio_to_jwk (pool , input , NULL , & jwk , isPrivateKey , & err ), TRUE);
567+ BIO_free (input );
568+
569+ ck_assert_int_eq (oidc_jwk_to_json (pool , jwk , & json , & err ), TRUE);
570+ ck_assert_str_eq (
571+ json , "{\"kty\":\"EC\",\"kid\":\"-THDTumMGazABrYTb8xJoYOK2OPiWmho3D-nPC1dSYg\",\"crv\":\"P-521\",\"x\":"
572+ "\"AR6Eh9VhdLEA-rm5WR0_T0LjKysJuBkSoXaR8GjphHvoOTrljcACRsVlTES9FMkbxbNEs4JdxPgPJl9G-e9WEJTe\",\"y\":"
573+ "\"AammgflZaJuSdycK_ccUXkSXjNQd8NsqJuv9LFpk5Ys1OAiirWm6uktXG8ALNSxSffcurBq8zqZyZ141dV6qSzKQ\",\"d\":"
574+ "\"AKFwyWAZ2FiTTEofXXOC6I2GBPQeEyCnsVzo075hCOcebYgLpzSj8xWfkTqxsUq8FF5cxlKS3jym3qgsuV0Eb0wd\"}" );
575+ oidc_jwk_destroy (jwk );
576+ }
577+ END_TEST
578+
528579START_TEST (test_jwk_list_destroy ) {
529580 apr_pool_t * pool = oidc_test_pool_get ();
530581 apr_array_header_t * arr = apr_array_make (pool , 2 , sizeof (const oidc_jwk_t * ));
@@ -603,6 +654,7 @@ int main(void) {
603654 tcase_add_test (core , test_alg2keysize_and_hdr_get_and_jwt_parse );
604655 tcase_add_test (core , test_jwk_json_x5c_parse );
605656 tcase_add_test (core , test_jwk_public_key_parse );
657+ tcase_add_test (core , test_jwk_private_key_parse );
606658
607659 Suite * s = suite_create ("jose" );
608660 suite_add_tcase (s , sup );
0 commit comments