Skip to content

Commit 556976e

Browse files
committed
jwk: fix parsing JWKs with only an "x5c" parameter (i.e. no "n" and "e")
- use BIO_new_mem_buf that supports BIO_reset - solve valgrind memory access error on apr_pstrmemdup - migrate test_public_key_parse to test_jose - bump to 2.4.19.1dev Signed-off-by: Hans Zandbelt <[email protected]>
1 parent 14b9950 commit 556976e

File tree

6 files changed

+147
-126
lines changed

6 files changed

+147
-126
lines changed

ChangeLog

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,7 @@
1+
12/08/2025
2+
- jwk: fix parsi8ng RSA JWKs with only an "x5c" parameter (i.e. no "n" and "e")
3+
- bump to 2.4.19.1dev
4+
15
12/01/2025
26
- release 2.4.19
37

configure.ac

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
AC_INIT([mod_auth_openidc],[2.4.19],[[email protected]])
1+
AC_INIT([mod_auth_openidc],[2.4.19.1dev],[[email protected]])
22

33
AC_SUBST(NAMEVER, AC_PACKAGE_TARNAME()-AC_PACKAGE_VERSION())
44

src/jose.c

Lines changed: 12 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -1658,7 +1658,7 @@ static apr_byte_t _oidc_jwk_ec_key_to_jwk(apr_pool_t *pool, EVP_PKEY *pkey, oidc
16581658
* by "input" to a JSON Web Key object
16591659
*/
16601660
apr_byte_t oidc_jwk_pem_bio_to_jwk(apr_pool_t *pool, BIO *input, const char *kid, oidc_jwk_t **oidc_jwk,
1661-
int is_private_key, oidc_jose_error_t *err) {
1661+
apr_byte_t is_private_key, oidc_jose_error_t *err) {
16621662
cjose_err cjose_err;
16631663
X509 *x509 = NULL;
16641664
EVP_PKEY *pkey = NULL;
@@ -1672,7 +1672,7 @@ apr_byte_t oidc_jwk_pem_bio_to_jwk(apr_pool_t *pool, BIO *input, const char *kid
16721672

16731673
*oidc_jwk = oidc_jwk_new(pool);
16741674

1675-
if (is_private_key) {
1675+
if (is_private_key == TRUE) {
16761676
/* get the private key struct from the BIO */
16771677
if ((pkey = PEM_read_bio_PrivateKey(input, NULL, NULL, NULL)) == NULL) {
16781678
oidc_jose_error_openssl(err, "PEM_read_bio_PrivateKey");
@@ -1775,8 +1775,8 @@ apr_byte_t oidc_jwk_pem_bio_to_jwk(apr_pool_t *pool, BIO *input, const char *kid
17751775
/*
17761776
* parse a PEM-formatted public or private key from the specified file
17771777
*/
1778-
static apr_byte_t oidc_jwk_parse_pem_key(apr_pool_t *pool, int is_private_key, const char *kid, const char *filename,
1779-
oidc_jwk_t **jwk, oidc_jose_error_t *err) {
1778+
static apr_byte_t oidc_jwk_parse_pem_key(apr_pool_t *pool, apr_byte_t is_private_key, const char *kid,
1779+
const char *filename, oidc_jwk_t **jwk, oidc_jose_error_t *err) {
17801780
BIO *input = NULL;
17811781
apr_byte_t rv = FALSE;
17821782

@@ -1840,26 +1840,20 @@ static apr_byte_t _oidc_jwk_parse_x5c(apr_pool_t *pool, json_t *json, cjose_jwk_
18401840
const char *s_x5c = json_string_value(v);
18411841

18421842
/* PEM-format it */
1843-
const int len = 75;
1843+
const int chunk = 75;
18441844
int i = 0;
18451845
char *s = apr_psprintf(pool, "%s\n", OIDC_JOSE_CERT_BEGIN);
1846-
while (i < _oidc_strlen(s_x5c)) {
1847-
s = apr_psprintf(pool, "%s%s\n", s, apr_pstrmemdup(pool, s_x5c + i, len));
1848-
i += len;
1846+
const int n = _oidc_strlen(s_x5c);
1847+
while (i < n) {
1848+
s = apr_psprintf(pool, "%s%s\n", s, apr_pstrmemdup(pool, s_x5c + i, (i + chunk) > n ? (n - i) : chunk));
1849+
i += chunk;
18491850
}
18501851
s = apr_psprintf(pool, "%s%s\n", s, OIDC_JOSE_CERT_END);
18511852

1852-
BIO *input = NULL;
1853-
18541853
/* put it in BIO memory */
1855-
if ((input = BIO_new(BIO_s_mem())) == NULL) {
1856-
oidc_jose_error_openssl(err, "memory allocation BIO_new/BIO_s_mem");
1857-
return FALSE;
1858-
}
1859-
1860-
if (BIO_puts(input, s) <= 0) {
1861-
BIO_free(input);
1862-
oidc_jose_error_openssl(err, "BIO_puts");
1854+
BIO *input = BIO_new_mem_buf(s, _oidc_strlen(s));
1855+
if (input == NULL) {
1856+
oidc_jose_error_openssl(err, "BIO_new_mem_buf");
18631857
return FALSE;
18641858
}
18651859

src/jose.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -276,7 +276,7 @@ int oidc_jwt_alg2kty(oidc_jwt_t *jwt);
276276
/* return the key size for an algorithm */
277277
unsigned int oidc_alg2keysize(const char *alg);
278278

279-
apr_byte_t oidc_jwk_pem_bio_to_jwk(apr_pool_t *pool, BIO *input, const char *kid, oidc_jwk_t **jwk, int is_private_key,
280-
oidc_jose_error_t *err);
279+
apr_byte_t oidc_jwk_pem_bio_to_jwk(apr_pool_t *pool, BIO *input, const char *kid, oidc_jwk_t **jwk,
280+
apr_byte_t is_private_key, oidc_jose_error_t *err);
281281

282282
#endif /* _MOD_AUTH_OPENIDC_JOSE_H_ */

test/test.c

Lines changed: 1 addition & 105 deletions
Original file line numberDiff line numberDiff line change
@@ -134,7 +134,7 @@ static char *test_private_key_parse(apr_pool_t *pool) {
134134
oidc_jose_error_t err = {{'\0'}, 0, {'\0'}, {'\0'}};
135135
BIO *input = NULL;
136136
oidc_jwk_t *jwk = NULL;
137-
int isPrivateKey = 1;
137+
apr_byte_t isPrivateKey = TRUE;
138138
int result;
139139
char *json = NULL;
140140

@@ -191,109 +191,6 @@ static char *test_private_key_parse(apr_pool_t *pool) {
191191
return 0;
192192
}
193193

194-
static char *test_public_key_parse(apr_pool_t *pool) {
195-
196-
oidc_jose_error_t err = {{'\0'}, 0, {'\0'}, {'\0'}};
197-
oidc_jwk_t *jwk, *jwkCert = NULL;
198-
199-
BIO *input, *inputCert = NULL;
200-
char *json = NULL;
201-
202-
int isPrivateKey = 0;
203-
int result;
204-
205-
const char publicKeyFile[512];
206-
const char certificateFile[512];
207-
const char ecCertificateFile[512];
208-
char *dir = getenv("srcdir") ? getenv("srcdir") : ".";
209-
snprintf((char *)publicKeyFile, 512, "%s/%s", dir, "/public.pem");
210-
snprintf((char *)certificateFile, 512, "%s/%s", dir, "/certificate.pem");
211-
snprintf((char *)ecCertificateFile, 512, "%s/%s", dir, "/eccert.pem");
212-
213-
input = BIO_new(BIO_s_file());
214-
TST_ASSERT_ERR("test_public_key_parse_BIO_new_public_key", input != NULL, pool, err);
215-
216-
TST_ASSERT_ERR("test_public_key_parse_BIOread_filename_public_key",
217-
result = BIO_read_filename(input, publicKeyFile), pool, err);
218-
219-
TST_ASSERT_ERR("oidc_jwk_pem_bio_to_jwk", oidc_jwk_pem_bio_to_jwk(pool, input, NULL, &jwk, isPrivateKey, &err),
220-
pool, err);
221-
BIO_free(input);
222-
223-
inputCert = BIO_new(BIO_s_file());
224-
TST_ASSERT_ERR("test_public_key_parse_BIO_new_certificate", inputCert != NULL, pool, err);
225-
226-
TST_ASSERT_ERR("test_public_key_parse_BIOread_filename_certificate",
227-
BIO_read_filename(inputCert, certificateFile), pool, err);
228-
229-
TST_ASSERT_ERR("oidc_jwk_pem_bio_to_jwk",
230-
oidc_jwk_pem_bio_to_jwk(pool, inputCert, NULL, &jwkCert, isPrivateKey, &err), pool, err);
231-
BIO_free(inputCert);
232-
233-
TST_ASSERT_ERR("oidc_jwk_to_json with public key", oidc_jwk_to_json(pool, jwk, &json, &err), pool, err);
234-
TST_ASSERT_STR(
235-
"oidc_jwk_to_json with public key output test", json,
236-
"{\"kty\":\"RSA\",\"kid\":\"IbLjLR7-C1q0-ypkueZxGIJwBQNaLg46DZMpnPW1kps\",\"e\":\"AQAB\",\"n\":"
237-
"\"iGeTXbfV5bMppx7o7qMLCuVIKqbBa_qOzBiNNpe0K8rjg7-1z9GCuSlqbZtM0_5BQ6bGonnSPD--"
238-
"PowhFdivS4WNA33O0Kl1tQ0wdH3TOnwueIO9ahfW4q0BGFvMObneK-tjwiNMj1l-cZt8pvuS-3LtTWIzC-"
239-
"hTZM4caUmy5olm5PVdmru6C6V5rxkbYBPITFSzl5mpuo_C6RV_MYRwAh60ghs2OEvIWDrJkZnYaF7sjHC9j-"
240-
"4kfcM5oY7Zhg8KuHyloudYNzlqjVAPd0MbkLkh1pa8fmHsnN6cgfXYtFK7Z8WjYDUAhTH1JjZCVSFN55A-51dgD4cQNzieLEEkJw\"}");
241-
oidc_jwk_destroy(jwk);
242-
243-
TST_ASSERT_ERR("oidc_jwk_to_json with certificate", oidc_jwk_to_json(pool, jwkCert, &json, &err), pool, err);
244-
TST_ASSERT_STR("oidc_jwk_to_json with certificate output test", json,
245-
"{\"kty\":\"RSA\",\"kid\":\"IbLjLR7-C1q0-ypkueZxGIJwBQNaLg46DZMpnPW1kps\",\"e\":\"AQAB\",\"n\":"
246-
"\"iGeTXbfV5bMppx7o7qMLCuVIKqbBa_qOzBiNNpe0K8rjg7-1z9GCuSlqbZtM0_5BQ6bGonnSPD--"
247-
"PowhFdivS4WNA33O0Kl1tQ0wdH3TOnwueIO9ahfW4q0BGFvMObneK-tjwiNMj1l-cZt8pvuS-3LtTWIzC-"
248-
"hTZM4caUmy5olm5PVdmru6C6V5rxkbYBPITFSzl5mpuo_C6RV_MYRwAh60ghs2OEvIWDrJkZnYaF7sjHC9j-"
249-
"4kfcM5oY7Zhg8KuHyloudYNzlqjVAPd0MbkLkh1pa8fmHsnN6cgfXYtFK7Z8WjYDUAhTH1JjZCVSFN55A-"
250-
"51dgD4cQNzieLEEkJw\",\"x5c\":[\"MIICnTCCAYUCBgFuk1+"
251-
"FLDANBgkqhkiG9w0BAQsFADASMRAwDgYDVQQDDAd2aW5jZW50MB4XDTE5MTEyMjEzNDcyMVoXDTI5MTEyMjEzNDkwMVowEj"
252-
"EQMA4GA1UEAwwHdmluY2VudDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAIhnk1231eWzKace6O6jCwrlSCqmw"
253-
"Wv6jswYjTaXtCvK44O/tc/Rgrkpam2bTNP+QUOmxqJ50jw/"
254-
"vj6MIRXYr0uFjQN9ztCpdbUNMHR90zp8LniDvWoX1uKtARhbzDm53ivrY8IjTI9ZfnGbfKb7kvty7U1iMwvoU2TOHGlJsua"
255-
"JZuT1XZq7ugulea8ZG2ATyExUs5eZqbqPwukVfzGEcAIetIIbNjhLyFg6yZGZ2Ghe7IxwvY/"
256-
"uJH3DOaGO2YYPCrh8paLnWDc5ao1QD3dDG5C5IdaWvH5h7JzenIH12LRSu2fFo2A1AIUx9SY2QlUhTeeQPudXYA+"
257-
"HEDc4nixBJCcCAwEAATANBgkqhkiG9w0BAQsFAAOCAQEAfAo40il4qw7DfOkke0p1ZFAgLQQS3J5hYNDSRvVv+vxkk9o/"
258-
"N++zTMoHbfcDcU5BdVH6Qsr/12PXPX7Ur5WYDq+bWGAK3MAaGtZlmycFeVhoVRfab4TUWUy43H3VyFUNqjGRAVJ/"
259-
"VD1RW3fJ18KrQTN2fcKSd88Jqt5TvjROKghq95+8BQtlhrR/"
260-
"sQVrjgYwc+eU9ljWI56MQXbpHstl9IewMXnusSPxKRTbutjaxzKaoXRTUncPL6ga0SSxOTdKksM4ZYpPnq0B93silb+"
261-
"0qs8aJraGzjAmLE30opfufP+roth19VJxAfYsW5mgAmXP9kEAF+iWB8FB4/"
262-
"Q4noNG8Q==\"],\"x5t#S256\":\"hMVJ55Mqi4uAQIztPKUmL2MSfy6iN1Lr3J1CNGAIBms\",\"x5t\":\"0oN6Bx-"
263-
"eh6VAmNw1I7o3Dd9JPwE\"}");
264-
oidc_jwk_destroy(jwkCert);
265-
266-
inputCert = BIO_new(BIO_s_file());
267-
TST_ASSERT_ERR("test_public_key_parse_BIO_new_EC_certificate", inputCert != NULL, pool, err);
268-
269-
TST_ASSERT_ERR("test_public_key_parse_BIOread_filename_EC_certificate",
270-
BIO_read_filename(inputCert, ecCertificateFile), pool, err);
271-
272-
TST_ASSERT_ERR("oidc_jwk_pem_bio_to_jwk",
273-
oidc_jwk_pem_bio_to_jwk(pool, inputCert, NULL, &jwkCert, isPrivateKey, &err), pool, err);
274-
BIO_free(inputCert);
275-
276-
TST_ASSERT_ERR("oidc_jwk_to_json with EC certificate", oidc_jwk_to_json(pool, jwkCert, &json, &err), pool, err);
277-
TST_ASSERT_STR(
278-
"oidc_jwk_to_json with EC certificate output test", json,
279-
"{\"kty\":\"EC\",\"kid\":\"-THDTumMGazABrYTb8xJoYOK2OPiWmho3D-nPC1dSYg\",\"crv\":\"P-521\",\"x\":"
280-
"\"AR6Eh9VhdLEA-rm5WR0_T0LjKysJuBkSoXaR8GjphHvoOTrljcACRsVlTES9FMkbxbNEs4JdxPgPJl9G-e9WEJTe\",\"y\":"
281-
"\"AammgflZaJuSdycK_ccUXkSXjNQd8NsqJuv9LFpk5Ys1OAiirWm6uktXG8ALNSxSffcurBq8zqZyZ141dV6qSzKQ\",\"x5c\":["
282-
"\"MIICBDCCAWagAwIBAgIUdYpkXaCal7IwjHix3n1PP9/"
283-
"O6OcwCgYIKoZIzj0EAwIwFDESMBAGA1UEAwwJbG9jYWxob3N0MB4XDTIzMDMyMzIwNDU1MFoXDTMzMDMyMDIwNDU1MFowFDESMBAGA1UEA"
284-
"wwJbG9jYWxob3N0MIGbMBAGByqGSM49AgEGBSuBBAAjA4GGAAQBHoSH1WF0sQD6ublZHT9PQuMrKwm4GRKhdpHwaOmEe+"
285-
"g5OuWNwAJGxWVMRL0UyRvFs0Szgl3E+A8mX0b571YQlN4BqaaB+Vlom5J3Jwr9xxReRJeM1B3w2yom6/"
286-
"0sWmTlizU4CKKtabq6S1cbwAs1LFJ99y6sGrzOpnJnXjV1XqpLMpCjUzBRMB0GA1UdDgQWBBTKfLLXyRVQpnXFf19Bs7eXRPlRmzAfBgNV"
287-
"HSMEGDAWgBTKfLLXyRVQpnXFf19Bs7eXRPlRmzAPBgNVHRMBAf8EBTADAQH/"
288-
"MAoGCCqGSM49BAMCA4GLADCBhwJBGkoifMDYwsSLSmnnVdFftqTwxrjdgrtPMRzetz/w/"
289-
"D9KkM4Mlufgv5jBXuWcEiP9ray2ZgAGhdkvoOfsc8g1l6ICQgEJ+"
290-
"9R5K2WKlDTEydmiHiSYQHSVyS61PFskm537AqrLVSRu80Sezu2W4m8IF2UbbRZiUPaHPIx9Xe3GdpqIEmPFfA==\"],\"x5t#S256\":"
291-
"\"yCl_u4GL5GrTkf8xvqdF2aixUIhjDdsMFhLUz7O6gVA\",\"x5t\":\"waxmjjAAhxGY5XvH6ufxVxwYGDw\"}");
292-
oidc_jwk_destroy(jwkCert);
293-
294-
return 0;
295-
}
296-
297194
static char *test_jwt_parse(apr_pool_t *pool) {
298195

299196
// from http://tools.ietf.org/html/draft-ietf-oauth-json-web-token-20
@@ -1388,7 +1285,6 @@ static char *test_check_cookie_domain(request_rec *r) {
13881285
static char *all_tests(apr_pool_t *pool, request_rec *r) {
13891286
char *message;
13901287
TST_RUN(test_private_key_parse, pool);
1391-
TST_RUN(test_public_key_parse, pool);
13921288

13931289
TST_RUN(test_jwt_parse, pool);
13941290
TST_RUN(test_plaintext_jwt_parse, pool);

test/test_jose.c

Lines changed: 127 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -400,6 +400,131 @@ START_TEST(test_jwk_json_parse_and_jwks) {
400400
}
401401
END_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+
403528
START_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

Comments
 (0)