/* * parse JSON JWK */ apr_byte_t apr_jwk_parse_json(apr_pool_t *pool, json_t *json, apr_jwk_t **j_jwk, apr_jwt_error_t *err) { /* check that we've actually got a JSON value back */ if (json == NULL) { apr_jwt_error(err, "JWK JSON is NULL"); return FALSE; } /* check that the value is a JSON object */ if (!json_is_object(json)) { apr_jwt_error(err, "JWK JSON is not a JSON object"); return FALSE; } /* allocate memory for the JWK */ *j_jwk = apr_pcalloc(pool, sizeof(apr_jwk_t)); apr_jwk_t *jwk = *j_jwk; /* get the mandatory key type */ char *kty = NULL; if (apr_jwt_get_string(pool, json, "kty", TRUE, &kty, err) == FALSE) return FALSE; /* get the optional kid */ apr_jwt_get_string(pool, json, "kid", FALSE, &jwk->kid, NULL); /* parse the key */ if (apr_strnatcmp(kty, "RSA") == 0) return apr_jwk_parse_rsa(pool, json, jwk, err); if (apr_strnatcmp(kty, "EC") == 0) return apr_jwk_parse_ec(pool, json, jwk, err); if (apr_strnatcmp(kty, "oct") == 0) return apr_jwk_parse_oct(pool, json, jwk, err); apr_jwt_error(err, "wrong or unsupported JWK key representation \"%s\" (\"RSA\", \"EC\" and \"oct\" are supported key types)", kty); return FALSE; }
/* * parse JSON JWK */ apr_byte_t apr_jwk_parse_json(apr_pool_t *pool, json_t *j_json, const char *s_json, apr_jwk_t **j_jwk) { /* check that we've actually got a JSON value back */ if (j_json == NULL) return FALSE; /* check that the value is a JSON object */ if (!json_is_object(j_json)) return FALSE; /* allocate memory for the JWK */ *j_jwk = apr_pcalloc(pool, sizeof(apr_jwk_t)); apr_jwk_t *jwk = *j_jwk; /* set the raw JSON/string representations */ jwk->value.json = j_json; jwk->value.str = apr_pstrdup(pool, s_json); /* get the key type */ char *kty = NULL; if (apr_jwt_get_string(pool, &jwk->value, "kty", &kty) == FALSE) return FALSE; /* kty is mandatory */ if (kty == NULL) return FALSE; /* parse the key */ if (apr_strnatcmp(kty, "RSA") == 0) return apr_jwk_parse_rsa(pool, jwk); if (apr_strnatcmp(kty, "EC") == 0) return apr_jwk_parse_ec(pool, jwk); return FALSE; }