blob: 09a8cc39815eeac82135e566c96a31b0dc2635fa [file] [log] [blame] [edit]
/* Public domain, no copyright. Use at your own risk. */
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <errno.h>
#include <time.h>
#include "jwt_tests.h"
START_TEST(test_jwks_keyring_load)
{
const jwk_item_t *item;
int i, ret;
int fails = 0;
SET_OPS();
read_json("jwks_keyring.json");
for (i = 0; (item = jwks_item_get(g_jwk_set, i)); i++) {
jwt_builder_auto_t *builder = NULL;
char_auto *out = NULL;
jwt_alg_t alg;
if (jwks_item_error(item)) {
fprintf(stderr, "Err KID: %s\n",
jwks_item_kid(item));
}
ck_assert_int_eq(jwks_item_error(item), 0);
alg = jwks_item_alg(item);
if (alg == JWT_ALG_ES256K)
continue;
if (alg == JWT_ALG_NONE || !jwks_item_is_private(item))
continue;
builder = jwt_builder_new();
ck_assert_ptr_nonnull(builder);
ret = jwt_builder_setkey(builder, alg, item);
ck_assert_int_eq(ret, 0);
out = jwt_builder_generate(builder);
if (out == NULL) {
fprintf(stderr, "Gen KID(%d/%s): %s\n", i,
jwt_alg_str(alg),
jwt_builder_error_msg(builder));
fails++;
}
}
ck_assert_int_eq(fails, 0);
item = jwks_find_bykid(g_jwk_set, "SDSDS");
ck_assert_ptr_null(item);
item = jwks_find_bykid(g_jwk_set, "354912a0-b90a-435e-886a-1629f7b2665e");
ck_assert_ptr_nonnull(item);
ck_assert_int_eq(i, 27);
i = jwks_item_count(g_jwk_set);
ck_assert_int_eq(i, 27);
ck_assert(jwks_item_free(g_jwk_set, 3));
i = jwks_item_count(g_jwk_set);
ck_assert_int_eq(i, 26);
i = jwks_item_free_bad(g_jwk_set);
ck_assert_int_eq(i, 0);
i = jwks_item_count(g_jwk_set);
ck_assert_int_eq(i, 26);
free_key();
}
END_TEST
#ifdef HAVE_LIBCURL
START_TEST(load_fromurl)
{
jwk_set_auto_t *jwk_set = NULL;
const char *test_url;
SET_OPS();
jwk_set = jwks_create_fromurl(NULL, 1);
ck_assert_ptr_null(jwk_set);
jwk_set = jwks_create_fromurl("file:///DOESNOTEXIST", 1);
ck_assert_ptr_nonnull(jwk_set);
ck_assert_int_ne(jwks_error(jwk_set), 0);
jwks_error_clear(jwk_set);
test_url = getenv("LIBJWT_TEST_URL");
if (!test_url || !test_url[0])
test_url = "file://" KEYDIR "/jwks_keyring.json";
jwk_set = jwks_load_fromurl(jwk_set, test_url, 2);
ck_assert_ptr_nonnull(jwk_set);
ck_assert_int_gt(jwks_item_count(jwk_set), 0);
}
#else
START_TEST(load_fromurl)
{
ck_assert_ptr_null(jwks_create_fromurl("file:///", 1));
}
END_TEST
#endif
START_TEST(test_jwks_keyring_all_bad)
{
const jwk_item_t *item;
jwk_set_auto_t *jwk_set;
int i;
SET_OPS();
jwk_set = jwks_create_fromfile(KEYDIR "/bad_keys.json");
ck_assert_ptr_nonnull(jwk_set);
i = jwks_error_any(jwk_set);
ck_assert_int_eq(i, 14);
for (i = 0; (item = jwks_item_get(jwk_set, i)); i++) {
if (!jwks_item_error(item)) {
fprintf(stderr, "KID: %s\n",
jwks_item_kid(item));
}
ck_assert_int_ne(jwks_item_error(item), 0);
}
ck_assert_int_eq(i, 14);
i = jwks_item_free_bad(jwk_set);
ck_assert_int_eq(i, 14);
i = jwks_item_count(jwk_set);
ck_assert_int_eq(i, 0);
}
END_TEST
START_TEST(test_jwks_key_op_all_types)
{
jwk_key_op_t key_ops = JWK_KEY_OP_SIGN | JWK_KEY_OP_VERIFY |
JWK_KEY_OP_ENCRYPT | JWK_KEY_OP_DECRYPT | JWK_KEY_OP_WRAP |
JWK_KEY_OP_UNWRAP | JWK_KEY_OP_DERIVE_KEY |
JWK_KEY_OP_DERIVE_BITS;
const jwk_item_t *item;
SET_OPS();
read_jsonfp("jwks_test-1.json");
item = jwks_item_get(g_jwk_set, 0);
ck_assert_ptr_nonnull(item);
ck_assert(!jwks_item_error(item));
ck_assert_int_eq(jwks_item_key_ops(item), key_ops);
free_key();
}
END_TEST
START_TEST(test_jwks_key_op_bad_type)
{
const jwk_item_t *item;
const char *kid = "264265c2-4ef0-4751-adbd-9739550afe5b";
SET_OPS();
read_json("jwks_test-2.json");
item = jwks_item_get(g_jwk_set, 0);
ck_assert_ptr_nonnull(item);
/* The bad key_op is ignored. */
ck_assert(!jwks_item_error(item));
/* Only these ops set. */
ck_assert_int_eq(jwks_item_key_ops(item),
JWK_KEY_OP_VERIFY | JWK_KEY_OP_DERIVE_BITS);
ck_assert_int_eq(jwks_item_use(item), JWK_PUB_KEY_USE_ENC);
/* Check this key ID. */
ck_assert_str_eq(jwks_item_kid(item), kid);
free_key();
}
END_TEST
static Suite *libjwt_suite(const char *title)
{
Suite *s;
TCase *tc_core;
int i = ARRAY_SIZE(jwt_test_ops);
s = suite_create(title);
tc_core = tcase_create("jwt_jwks");
/* Load a whole keyring */
tcase_add_loop_test(tc_core, test_jwks_keyring_load, 0, i);
tcase_add_loop_test(tc_core, test_jwks_keyring_all_bad, 0, i);
tcase_add_loop_test(tc_core, load_fromurl, 0, i);
/* Some coverage attempts */
tcase_add_loop_test(tc_core, test_jwks_key_op_all_types, 0, i);
tcase_add_loop_test(tc_core, test_jwks_key_op_bad_type, 0, i);
tcase_set_timeout(tc_core, 30);
suite_add_tcase(s, tc_core);
return s;
}
int main(void)
{
JWT_TEST_MAIN("LibJWT JWKS");
}