blob: 54ae741ba1467f5038049a37ce9fabbc40e8d410 [file] [edit]
/* Public domain, no copyright. Use at your own risk. */
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "jwt_tests.h"
/* Every defined jwe_key_alg_t value (excluding NONE/INVAL) with its string. */
static const struct {
jwe_key_alg_t alg;
const char *str;
} alg_map[] = {
{ JWE_ALG_DIR, "dir" },
{ JWE_ALG_A128KW, "A128KW" },
{ JWE_ALG_A192KW, "A192KW" },
{ JWE_ALG_A256KW, "A256KW" },
{ JWE_ALG_RSA_OAEP, "RSA-OAEP" },
{ JWE_ALG_RSA_OAEP_256, "RSA-OAEP-256" },
{ JWE_ALG_ECDH_ES, "ECDH-ES" },
{ JWE_ALG_ECDH_ES_A128KW, "ECDH-ES+A128KW" },
{ JWE_ALG_ECDH_ES_A192KW, "ECDH-ES+A192KW" },
{ JWE_ALG_ECDH_ES_A256KW, "ECDH-ES+A256KW" },
};
/* Every defined jwe_enc_t value (excluding NONE/INVAL) with its string. */
static const struct {
jwe_enc_t enc;
const char *str;
} enc_map[] = {
{ JWE_ENC_A128GCM, "A128GCM" },
{ JWE_ENC_A192GCM, "A192GCM" },
{ JWE_ENC_A256GCM, "A256GCM" },
{ JWE_ENC_A128CBC_HS256, "A128CBC-HS256" },
{ JWE_ENC_A192CBC_HS384, "A192CBC-HS384" },
{ JWE_ENC_A256CBC_HS512, "A256CBC-HS512" },
};
START_TEST(alg_roundtrip)
{
size_t j;
SET_OPS();
for (j = 0; j < ARRAY_SIZE(alg_map); j++) {
const char *s = jwe_alg_str(alg_map[j].alg);
ck_assert_ptr_nonnull(s);
ck_assert_str_eq(s, alg_map[j].str);
ck_assert_int_eq(jwe_str_alg(alg_map[j].str), alg_map[j].alg);
}
/* Unknown / invalid inputs */
ck_assert_ptr_null(jwe_alg_str(JWE_ALG_NONE));
ck_assert_ptr_null(jwe_alg_str(JWE_ALG_INVAL));
ck_assert_int_eq(jwe_str_alg(NULL), JWE_ALG_INVAL);
ck_assert_int_eq(jwe_str_alg("bogus"), JWE_ALG_INVAL);
ck_assert_int_eq(jwe_str_alg("RS256"), JWE_ALG_INVAL);
}
END_TEST
START_TEST(enc_roundtrip)
{
size_t j;
SET_OPS();
for (j = 0; j < ARRAY_SIZE(enc_map); j++) {
const char *s = jwe_enc_str(enc_map[j].enc);
ck_assert_ptr_nonnull(s);
ck_assert_str_eq(s, enc_map[j].str);
ck_assert_int_eq(jwe_str_enc(enc_map[j].str), enc_map[j].enc);
}
ck_assert_ptr_null(jwe_enc_str(JWE_ENC_NONE));
ck_assert_ptr_null(jwe_enc_str(JWE_ENC_INVAL));
ck_assert_int_eq(jwe_str_enc(NULL), JWE_ENC_INVAL);
ck_assert_int_eq(jwe_str_enc("bogus"), JWE_ENC_INVAL);
ck_assert_int_eq(jwe_str_enc("A128GCMKW"), JWE_ENC_INVAL);
}
END_TEST
START_TEST(builder_new)
{
jwe_builder_auto_t *builder = NULL;
SET_OPS();
builder = jwe_builder_new();
ck_assert_ptr_nonnull(builder);
ck_assert_int_eq(jwe_builder_error(builder), 0);
ck_assert_str_eq(jwe_builder_error_msg(builder), "");
/* NULL-safety */
ck_assert_int_eq(jwe_builder_error(NULL), 1);
ck_assert_ptr_null(jwe_builder_error_msg(NULL));
jwe_builder_free(NULL);
jwe_builder_error_clear(NULL);
}
END_TEST
START_TEST(checker_new)
{
jwe_checker_auto_t *checker = NULL;
SET_OPS();
checker = jwe_checker_new();
ck_assert_ptr_nonnull(checker);
ck_assert_int_eq(jwe_checker_error(checker), 0);
ck_assert_str_eq(jwe_checker_error_msg(checker), "");
ck_assert_int_eq(jwe_checker_error(NULL), 1);
ck_assert_ptr_null(jwe_checker_error_msg(NULL));
jwe_checker_free(NULL);
jwe_checker_error_clear(NULL);
}
END_TEST
START_TEST(builder_setkey)
{
jwe_builder_auto_t *builder = NULL;
int ret;
SET_OPS();
read_json("oct_key_256.json");
builder = jwe_builder_new();
ck_assert_ptr_nonnull(builder);
/* Happy path */
ret = jwe_builder_setkey(builder, JWE_ALG_A256KW, JWE_ENC_A256GCM,
g_item);
ck_assert_int_eq(ret, 0);
ck_assert_int_eq(jwe_builder_error(builder), 0);
/* Bad alg */
ret = jwe_builder_setkey(builder, JWE_ALG_NONE, JWE_ENC_A256GCM,
g_item);
ck_assert_int_eq(ret, 1);
ck_assert_int_eq(jwe_builder_error(builder), 1);
jwe_builder_error_clear(builder);
ret = jwe_builder_setkey(builder, JWE_ALG_INVAL, JWE_ENC_A256GCM,
g_item);
ck_assert_int_eq(ret, 1);
jwe_builder_error_clear(builder);
/* Bad enc */
ret = jwe_builder_setkey(builder, JWE_ALG_A256KW, JWE_ENC_NONE,
g_item);
ck_assert_int_eq(ret, 1);
jwe_builder_error_clear(builder);
ret = jwe_builder_setkey(builder, JWE_ALG_A256KW, JWE_ENC_INVAL,
g_item);
ck_assert_int_eq(ret, 1);
jwe_builder_error_clear(builder);
/* No key */
ret = jwe_builder_setkey(builder, JWE_ALG_A256KW, JWE_ENC_A256GCM,
NULL);
ck_assert_int_eq(ret, 1);
jwe_builder_error_clear(builder);
/* NULL object */
ret = jwe_builder_setkey(NULL, JWE_ALG_A256KW, JWE_ENC_A256GCM,
g_item);
ck_assert_int_eq(ret, 1);
free_key();
}
END_TEST
START_TEST(checker_setkey)
{
jwe_checker_auto_t *checker = NULL;
int ret;
SET_OPS();
read_json("oct_key_256.json");
checker = jwe_checker_new();
ck_assert_ptr_nonnull(checker);
ret = jwe_checker_setkey(checker, JWE_ALG_A256KW, JWE_ENC_A256GCM,
g_item);
ck_assert_int_eq(ret, 0);
ret = jwe_checker_setkey(checker, JWE_ALG_INVAL, JWE_ENC_A256GCM,
g_item);
ck_assert_int_eq(ret, 1);
jwe_checker_error_clear(checker);
ret = jwe_checker_setkey(checker, JWE_ALG_A256KW, JWE_ENC_INVAL,
g_item);
ck_assert_int_eq(ret, 1);
jwe_checker_error_clear(checker);
ret = jwe_checker_setkey(checker, JWE_ALG_A256KW, JWE_ENC_A256GCM,
NULL);
ck_assert_int_eq(ret, 1);
jwe_checker_error_clear(checker);
ret = jwe_checker_setkey(NULL, JWE_ALG_A256KW, JWE_ENC_A256GCM,
g_item);
ck_assert_int_eq(ret, 1);
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("JWE Foundation");
/* The string maps and object lifecycle are crypto-backend
* independent, but run them under every compiled provider for
* consistency with the rest of the suite. */
tcase_add_loop_test(tc_core, alg_roundtrip, 0, i);
tcase_add_loop_test(tc_core, enc_roundtrip, 0, i);
tcase_add_loop_test(tc_core, builder_new, 0, i);
tcase_add_loop_test(tc_core, checker_new, 0, i);
tcase_add_loop_test(tc_core, builder_setkey, 0, i);
tcase_add_loop_test(tc_core, checker_setkey, 0, i);
tcase_set_timeout(tc_core, 30);
suite_add_tcase(s, tc_core);
return s;
}
int main(void)
{
JWT_TEST_MAIN("LibJWT JWE Foundation");
}