diff options
Diffstat (limited to 'test/src')
| -rw-r--r-- | test/src/exhaustive/test_ansi.c | 286 | ||||
| -rw-r--r-- | test/src/gen/test_point.c | 2 | ||||
| -rw-r--r-- | test/src/io/test_cli.c | 25 | ||||
| -rw-r--r-- | test/src/io/test_input.c | 54 | ||||
| -rw-r--r-- | test/src/math/test_subgroups.c | 2 | ||||
| -rw-r--r-- | test/src/test/default.c (renamed from test/src/test/utils.c) | 8 | ||||
| -rw-r--r-- | test/src/test/default.h (renamed from test/src/test/utils.h) | 6 | ||||
| -rw-r--r-- | test/src/test/input.c | 27 | ||||
| -rw-r--r-- | test/src/test/input.h | 16 | ||||
| -rw-r--r-- | test/src/test/memory.c | 17 | ||||
| -rw-r--r-- | test/src/test/memory.h | 13 | ||||
| -rw-r--r-- | test/src/test/output.c | 49 | ||||
| -rw-r--r-- | test/src/test/output.h | 18 | ||||
| -rw-r--r-- | test/src/util/test_bits.c | 486 | ||||
| -rw-r--r-- | test/src/util/test_random.c | 16 |
15 files changed, 959 insertions, 66 deletions
diff --git a/test/src/exhaustive/test_ansi.c b/test/src/exhaustive/test_ansi.c new file mode 100644 index 0000000..4217a15 --- /dev/null +++ b/test/src/exhaustive/test_ansi.c @@ -0,0 +1,286 @@ +/* + * ecgen, tool for generating Elliptic curve domain parameters + * Copyright (C) 2017 J08nY + */ + +#include <criterion/criterion.h> +#include <criterion/parameterized.h> +#include "misc/types.h" +#include "math/poly.h" +#include "exhaustive/ansi.h" +#include "gen/seed.h" +#include "gen/field.h" +#include "test/default.h" +#include "test/memory.h" +#include "test/input.h" +#include "test/output.h" +#include "util/bits.h" +#include "util/memory.h" + +void ansi_suite_setup(void) { + default_setup(); + input_setup(); + output_setup(); +} + +void ansi_suite_teardown(void) { + default_teardown(); + input_teardown(); + output_teardown(); +} + +TestSuite(ansi, .init = ansi_suite_setup, .fini = ansi_suite_teardown); + +Test(ansi, test_seed_random) { + curve_t curve = {}; + config_t cfg = {.bits = 256}; + int ret = ansi_gen_seed_random(&curve, &cfg, NULL); + + cr_assert_eq(ret, 1, ); + cr_assert_not_null(curve.seed, ); + + seed_free(&curve.seed); +} + +Test(ansi, test_seed_argument) { + curve_t curve = {}; + char *seed = "abcdefabcdefabcdefabcdefabcdefabcdefabcd"; + config_t cfg = {.seed = seed, .bits = 256}; + int ret = ansi_gen_seed_argument(&curve, &cfg, NULL); + + cr_assert_eq(ret, 1, ); + cr_assert_not_null(curve.seed, ); + char *hex = bits_to_hex(curve.seed->seed); + cr_assert_str_eq(hex, seed, ); + + try_free(hex); + seed_free(&curve.seed); +} + +Test(ansi, test_seed_argument_hex) { + curve_t curve = {}; + char *seed = "0xabcdefabcdefabcdefabcdefabcdefabcdefabcd"; + config_t cfg = {.seed = seed, .bits = 256}; + int ret = ansi_gen_seed_argument(&curve, &cfg, NULL); + + cr_assert_eq(ret, 1, ); + cr_assert_not_null(curve.seed, ); + char *hex = bits_to_hex(curve.seed->seed); + cr_assert_str_eq(hex, seed + 2, ); + + try_free(hex); + seed_free(&curve.seed); +} + +Test(ansi, test_seed_input) { + curve_t curve = {}; + char *seed = "abcdefabcdefabcdefabcdefabcdefabcdefabcd"; + config_t cfg = {.bits = 256}; + fprintf(write_in, "%s\n", seed); + int ret = ansi_gen_seed_input(&curve, &cfg, NULL); + + cr_assert_eq(ret, 1, ); + cr_assert_not_null(curve.seed, ); + char *hex = bits_to_hex(curve.seed->seed); + cr_assert_str_eq(hex, seed, ); + + try_free(hex); + seed_free(&curve.seed); +} + +Test(ansi, test_seed_input_short) { + curve_t curve = {}; + char *seed = "abcdef"; + config_t cfg = {}; + fprintf(write_in, "%s\n", seed); + int ret = ansi_gen_seed_input(&curve, &cfg, NULL); + + cr_assert_eq(ret, 0, ); +} + +struct prime_params { + size_t bits; + char *p; + char *seed; + char *r; + char *a; + char *b; +}; + +void prime_params_cleanup(struct criterion_test_params *ctp) { + struct prime_params *params = (struct prime_params *)ctp->params; + cr_free(params->p); + cr_free(params->seed); + cr_free(params->r); + cr_free(params->a); + cr_free(params->b); +} + +ParameterizedTestParameters(ansi, test_seed_prime_examples) { + static struct prime_params params[7] = {}; + // Taken from ANSI X9.62 J.5.1 - J.5.3; p. 115 - 117 + params[0].bits = 192; + params[0].p = cr_strdup("fffffffffffffffffffffffffffffffeffffffffffffffff"); + params[0].seed = cr_strdup("3045AE6FC8422F64ED579528D38120EAE12196D5"); + params[0].r = cr_strdup("3099D2BBBFCB2538542DCD5FB078B6EF5F3D6FE2C745DE65"); + params[0].a = cr_strdup("FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFFFFFFFFFC"); + params[0].b = cr_strdup("64210519E59C80E70FA7E9AB72243049FEB8DEECC146B9B1"); + params[1].bits = 192; + params[1].p = cr_strdup("fffffffffffffffffffffffffffffffeffffffffffffffff"); + params[1].seed = cr_strdup("31A92EE2029FD10D901B113E990710F0D21AC6B6"); + params[1].r = cr_strdup("15038D1D2E1CAFEE0299F3011C1DC75B3C2A86E135DB1E6B"); + params[1].a = cr_strdup("FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFFFFFFFFFC"); + params[1].b = cr_strdup("CC22D6DFB95C6B25E49C0D6364A4E5980C393AA21668D953"); + params[2].bits = 192; + params[2].p = cr_strdup("fffffffffffffffffffffffffffffffeffffffffffffffff"); + params[2].seed = cr_strdup("C469684435DEB378C4B65CA9591E2A5763059A2E"); + params[2].r = cr_strdup("25191F95024D839546D9A3375639A9967D52F1373BC4EE0B"); + params[2].a = cr_strdup("FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFFFFFFFFFC"); + params[2].b = cr_strdup("22123DC2395A05CAA7423DAECCC94760A7D462256BD56916"); + params[3].bits = 239; + params[3].p = cr_strdup("7fffffffffffffffffffffff7fffffffffff8000000000007fffffffffff"); + params[3].seed = cr_strdup("E43BB460F0B80CC0C0B075798E948060F8321B7D"); + params[3].r = cr_strdup("28B85EC1ECC19EFE769EB741A6D1BA29476AA5A8F2610957D6EFE78D3783"); + params[3].a = cr_strdup("7FFFFFFFFFFFFFFFFFFFFFFF7FFFFFFFFFFF8000000000007FFFFFFFFFFC"); + params[3].b = cr_strdup("6B016C3BDCF18941D0D654921475CA71A9DB2FB27D1D37796185C2942C0A"); + params[4].bits = 239; + params[4].p = cr_strdup("7fffffffffffffffffffffff7fffffffffff8000000000007fffffffffff"); + params[4].seed = cr_strdup("E8B4011604095303CA3B8099982BE09FCB9AE616"); + params[4].r = cr_strdup("1DF491E44E7CCAF4D1EAD8A6B90DAE09E0D33F2C6CFE7A6BA76E86713D52"); + params[4].a = cr_strdup("7FFFFFFFFFFFFFFFFFFFFFFF7FFFFFFFFFFF8000000000007FFFFFFFFFFC"); + params[4].b = cr_strdup("617FAB6832576CBBFED50D99F0249C3FEE58B94BA0038C7AE84C8C832F2C"); + params[5].bits = 239; + params[5].p = cr_strdup("7fffffffffffffffffffffff7fffffffffff8000000000007fffffffffff"); + params[5].seed = cr_strdup("7D7374168FFE3471B60A857686A19475D3BFA2FF"); + params[5].r = cr_strdup("3A4F9DC9A6CEFD5F9D1193B9C9968C202430003C2819C2E498618DC58330"); + params[5].a = cr_strdup("7FFFFFFFFFFFFFFFFFFFFFFF7FFFFFFFFFFF8000000000007FFFFFFFFFFC"); + params[5].b = cr_strdup("255705FA2A306654B1F4CB03D6A750A30C250102D4988717D9BA15AB6D3E"); + params[6].bits = 256; + params[6].p = cr_strdup("ffffffff00000001000000000000000000000000ffffffffffffffffffffffff"); + params[6].seed = cr_strdup("C49D360886E704936A6678E1139D26B7819F7E90"); + params[6].r = cr_strdup("7EFBA1662985BE9403CB055C75D4F7E0CE8D84A9C5114ABCAF3177680104FA0D"); + params[6].a = cr_strdup("FFFFFFFF00000001000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFC"); + params[6].b = cr_strdup("5AC635D8AA3A93E7B3EBBD55769886BC651D06B0CC53B0F63BCE3C3E27D2604B"); + + size_t nb_params = sizeof(params) / sizeof(struct prime_params); + return cr_make_param_array(struct prime_params, params, nb_params, NULL); +} +ParameterizedTest(struct prime_params *param, ansi, test_seed_prime_examples) { + config_t cfg = {}; + cfg.bits = param->bits; + cfg.field = FIELD_PRIME; + cfg.seed = param->seed; + curve_t curve = {}; + bits_t *p = bits_from_hex(param->p); + curve.field = bits_to_i(p); + + int ret = ansi_gen_seed_argument(&curve, &cfg, NULL); + cr_assert_eq(ret, 1,); + + ret = ansi_gen_equation(&curve, &cfg, NULL); + cr_assert_eq(ret, 1,); + GEN expected_r = bits_to_i(bits_from_hex(param->r)); + cr_assert(gequal(curve.seed->ansi.r, expected_r),); + + bits_free(&p); + seed_free(&curve.seed); +} + +struct binary_params { + size_t bits; + polynomial_t field; + char *seed; + char *a; + char *b; +}; + +void binary_params_cleanup(struct criterion_test_params *ctp) { + struct binary_params *params = (struct binary_params *)ctp->params; + cr_free(params->seed); + cr_free(params->a); + cr_free(params->b); +} + +ParameterizedTestParameters(ansi, test_seed_binary_examples) { + static struct binary_params params[10] = {}; + // Taken from ANSI X9.62 J.4.1, J.4.3, J.4.5 and J.4.8; p. 107 - 113 + polynomial_t p163 = {163, 9, 3, 2}; + params[0].bits = 163; + params[0].field = p163; + params[0].seed = cr_strdup("D2C0FB15760860DEF1EEF4D696E6768756151754"); + params[0].a = cr_strdup("072546B5435234A422E0789675F432C89435DE5242"); + params[0].b = cr_strdup("00C9517D06D5240D3CFF38C74B20B6CD4D6F9DD4D9"); + params[1].bits = 163, + params[1].field = p163; + params[1].seed = cr_strdup("53814C050D44D696E67687561517580CA4E29FFD"); + params[1].a = cr_strdup("0108B39E77C4B108BED981ED0E890E117C511CF072"); + params[1].b = cr_strdup("0667ACEB38AF4E488C407433FFAE4F1C811638DF20"); + params[2].bits = 163; + params[2].field = p163; + params[2].seed = cr_strdup("50CBF1D95CA94D696E676875615175F16A36A3B8"); + params[2].a = cr_strdup("07A526C63D3E25A256A007699F5447E32AE456B50E"); + params[2].b = cr_strdup("03F7061798EB99E238FD6F1BF95B48FEEB4854252B"); + polynomial_t p191 = {191, 10}; + params[3].bits = 191; + params[3].field = p191; + params[3].seed = cr_strdup("4E13CA542744D696E67687561517552F279A8C84"); + params[3].a = cr_strdup("2866537B676752636A68F56554E12640276B649EF7526267"); + params[3].b = cr_strdup("2E45EF571F00786F67B0081B9495A3D95462F5DE0AA185EC"); + params[4].bits = 191; + params[4].field = p191; + params[4].seed = cr_strdup("0871EF2FEF24D696E6768756151758BEE0D95C15"); + params[4].a = cr_strdup("401028774D7777C7B7666D1366EA432071274F89FF01E718"); + params[4].b = cr_strdup("0620048D28BCBD03B6249C99182B7C8CD19700C362C46A01"); + params[5].bits = 191; + params[5].field = p191; + params[5].seed = cr_strdup("E053512DC684D696E676875615175067AE786D1F"); + params[5].a = cr_strdup("6C01074756099122221056911C77D77E77A777E7E7E77FCB"); + params[5].b = cr_strdup("71FE1AF926CF847989EFEF8DB459F66394D90F32AD3F15E8"); + polynomial_t p239 = {239, 37}; + params[6].bits = 239; + params[6].field = p239; + params[6].seed = cr_strdup("D34B9A4D696E676875615175CA71B920BFEFB05D"); + params[6].a = cr_strdup("32010857077C5431123A46B808906756F543423E8D27877578125778AC76"); + params[6].b = cr_strdup("790408F2EEDAF392B012EDEFB3392F30F4327C0CA3F31FC383C422AA8C16"); + params[7].bits = 239; + params[7].field = p239; + params[7].seed = cr_strdup("2AA6982FDFA4D696E676875615175D266727277D"); + params[7].a = cr_strdup("4230017757A767FAE42398569B746325D45313AF0766266479B75654E65F"); + params[7].b = cr_strdup("5037EA654196CFF0CD82B2C14A2FCF2E3FF8775285B545722F03EACDB74B"); + params[8].bits = 239; + params[8].field = p239; + params[8].seed = cr_strdup("9E076F4D696E676875615175E11E9FDD77F92041"); + params[8].a = cr_strdup("01238774666A67766D6676F778E676B66999176666E687666D8766C66A9F"); + params[8].b = cr_strdup("6A941977BA9F6A435199ACFC51067ED587F519C5ECB541B8E44111DE1D40"); + polynomial_t p359 = {359, 69}; + params[9].bits = 359; + params[9].field = p359; + params[9].seed = cr_strdup("2B354920B724D696E67687561517585BA1332DC6"); + params[9].a = cr_strdup("5667676A654B20754F356EA92017D946567C46675556F19556A04616B567D223A5E05656FB549016A96656A557"); + params[9].b = cr_strdup("2472E2D0197C49363F1FE7F5B6DB075D52B6947D135D8CA445805D39BC345626089687742B6329E70680231988"); + + size_t nb_params = sizeof(params) / sizeof(struct binary_params); + return cr_make_param_array(struct binary_params, params, nb_params, binary_params_cleanup); +} +ParameterizedTest(struct binary_params *param, ansi, test_seed_binary_examples) { + config_t cfg = {}; + cfg.bits = param->bits; + cfg.field = FIELD_BINARY; + cfg.seed = param->seed; + curve_t curve = {}; + curve.field = poly_gen(¶m->field); + + GEN expected_b = bits_to_i(bits_from_hex(param->b)); + bits_t *b = bits_from_i(expected_b); + + int ret = ansi_gen_seed_argument(&curve, &cfg, NULL); + cr_assert_eq(ret, 1,); + + ret = ansi_gen_equation(&curve, &cfg, NULL); + cr_assert_eq(ret, 1,); + GEN curve_b = field_elementi(curve.b); + cr_assert(gequal(curve_b, expected_b),); + + bits_free(&b); + seed_free(&curve.seed); +}
\ No newline at end of file diff --git a/test/src/gen/test_point.c b/test/src/gen/test_point.c index 48872be..d77f83d 100644 --- a/test/src/gen/test_point.c +++ b/test/src/gen/test_point.c @@ -5,7 +5,7 @@ #include <criterion/criterion.h> #include "gen/point.h" -#include "test/utils.h" +#include "test/default.h" TestSuite(point, .init = default_setup, .fini = default_teardown); diff --git a/test/src/io/test_cli.c b/test/src/io/test_cli.c index c90bbfa..e5077ef 100644 --- a/test/src/io/test_cli.c +++ b/test/src/io/test_cli.c @@ -3,26 +3,25 @@ * Copyright (C) 2017 J08nY */ -#include "test/utils.h" -#include "io/cli.h" -#include "io/config.h" #include <criterion/criterion.h> #include <unistd.h> +#include "io/cli.h" +#include "misc/config.h" +#include "test/default.h" static struct argp test_argp = {cli_options, cli_parse, cli_args_doc, - cli_doc, 0, cli_filter}; + cli_doc, 0, cli_filter}; TestSuite(cli, .init = default_setup, .fini = default_teardown); - Test(cli, test_memory) { int argc = 4; char *argv[] = {"ecgen", "--memory=2k", "--fp", "1"}; config_t cfg; memset(&cfg, 0, sizeof(cfg)); int ret = argp_parse(&test_argp, argc, argv, 0, 0, &cfg); - cr_assert_eq(ret, 0,); - cr_assert_eq(cfg.memory, 2000,); + cr_assert_eq(ret, 0, ); + cr_assert_eq(cfg.memory, 2000, ); } Test(cli, test_thread_memory) { @@ -31,8 +30,8 @@ Test(cli, test_thread_memory) { config_t cfg; memset(&cfg, 0, sizeof(cfg)); int ret = argp_parse(&test_argp, argc, argv, 0, 0, &cfg); - cr_assert_eq(ret, 0,); - cr_assert_eq(cfg.thread_memory, 2000,); + cr_assert_eq(ret, 0, ); + cr_assert_eq(cfg.thread_memory, 2000, ); } Test(cli, test_threads) { @@ -41,8 +40,8 @@ Test(cli, test_threads) { config_t cfg; memset(&cfg, 0, sizeof(cfg)); int ret = argp_parse(&test_argp, argc, argv, 0, 0, &cfg); - cr_assert_eq(ret, 0,); - cr_assert_eq(cfg.threads, 2,); + cr_assert_eq(ret, 0, ); + cr_assert_eq(cfg.threads, 2, ); } Test(cli, test_auto_threads) { @@ -51,6 +50,6 @@ Test(cli, test_auto_threads) { config_t cfg; memset(&cfg, 0, sizeof(cfg)); int ret = argp_parse(&test_argp, argc, argv, 0, 0, &cfg); - cr_assert_eq(ret, 0,); - cr_assert_eq(cfg.threads, sysconf(_SC_NPROCESSORS_ONLN),); + cr_assert_eq(ret, 0, ); + cr_assert_eq(cfg.threads, sysconf(_SC_NPROCESSORS_ONLN), ); }
\ No newline at end of file diff --git a/test/src/io/test_input.c b/test/src/io/test_input.c index de4ac0f..d32d71c 100644 --- a/test/src/io/test_input.c +++ b/test/src/io/test_input.c @@ -3,92 +3,78 @@ * Copyright (C) 2017 J08nY */ -#include "test/utils.h" -#include "io/input.h" -#include "io/output.h" #include <criterion/criterion.h> +#include "io/input.h" +#include "test/default.h" +#include "test/input.h" +#include "test/output.h" -static FILE *write_in; - -void input_setup() { +void input_suite_setup(void) { default_setup(); - config_t cfg; - memset(&cfg, 0, sizeof(cfg)); - - cfg.output = "/dev/null"; - input_init(&cfg); - output_init(&cfg); - - int in_fd[2]; - pipe(in_fd); - - write_in = fdopen(in_fd[1], "w"); - setlinebuf(write_in); - in = fdopen(in_fd[0], "r"); - err = fopen("/dev/null", "w"); + input_setup(); + output_setup(); } -void input_teardown() { +void input_suite_teardown(void) { default_teardown(); - input_quit(); - output_quit(); - fclose(write_in); + input_teardown(); + output_teardown(); } -TestSuite(input, .init = input_setup, .fini = input_teardown); +TestSuite(input, .init = input_suite_setup, .fini = input_suite_teardown); Test(input, test_prime) { fprintf(write_in, "5\n"); GEN p = input_prime(NULL, 10); - cr_assert(gequal(p, stoi(5)),); + cr_assert(gequal(p, stoi(5)), ); } Test(input, test_prime_nan) { fprintf(write_in, "....\n"); GEN p = input_prime(NULL, 10); - cr_assert(gequal(p, gen_m1),); + cr_assert(gequal(p, gen_m1), ); } Test(input, test_prime_nonprime) { fprintf(write_in, "6\n"); GEN p = input_prime(NULL, 10); - cr_assert(gequal(p, gen_m1),); + cr_assert(gequal(p, gen_m1), ); } Test(input, test_prime_newline) { fprintf(write_in, "\n"); GEN p = input_prime(NULL, 10); - cr_assert(gequal(p, gen_m1),); + cr_assert(gequal(p, gen_m1), ); } Test(input, test_int) { fprintf(write_in, "256\n"); GEN i = input_int(NULL, 10); - cr_assert(gequal(i, stoi(256)),); + cr_assert(gequal(i, stoi(256)), ); } Test(input, test_int_too_big) { fprintf(write_in, "256\n"); GEN i = input_int(NULL, 4); - cr_assert(gequal(i, gen_m1),); + cr_assert(gequal(i, gen_m1), ); } Test(input, test_int_newline) { fprintf(write_in, "\n"); GEN i = input_int(NULL, 4); - cr_assert(gequal(i, gen_m1),); + cr_assert(gequal(i, gen_m1), ); } Test(input, test_str) { fprintf(write_in, "something\n"); GEN s = input_string(NULL); GEN expected = strtoGENstr("something"); - cr_assert(gequal(s, expected),); + cr_assert(gequal(s, expected), ); } Test(input, test_str_newline) { fprintf(write_in, "\n"); GEN s = input_string(NULL); GEN expected = strtoGENstr(""); - cr_assert(gequal(s, expected),); + cr_assert(gequal(s, expected), ); } diff --git a/test/src/math/test_subgroups.c b/test/src/math/test_subgroups.c index b9368d0..8a3c8da 100644 --- a/test/src/math/test_subgroups.c +++ b/test/src/math/test_subgroups.c @@ -5,7 +5,7 @@ #include <criterion/criterion.h> #include "gen/point.h" #include "math/subgroups.h" -#include "test/utils.h" +#include "test/default.h" TestSuite(subgroups, .init = default_setup, .fini = default_teardown); diff --git a/test/src/test/utils.c b/test/src/test/default.c index a5de092..c695fea 100644 --- a/test/src/test/utils.c +++ b/test/src/test/default.c @@ -2,17 +2,15 @@ * ecgen, tool for generating Elliptic curve domain parameters * Copyright (C) 2017 J08nY */ -#include "utils.h" +#include "default.h" #include <criterion/criterion.h> #include <pari/pari.h> -static void *cr_simple_calloc(size_t size) { - return cr_calloc(1, size); -} + void default_setup(void) { pari_init(1000000, 1000000); - //set_mem_funcs(cr_malloc, cr_simple_calloc, cr_realloc, cr_free); + // set_mem_funcs(cr_malloc, cr_simple_calloc, cr_realloc, cr_free); } void default_teardown(void) { pari_close(); }
\ No newline at end of file diff --git a/test/src/test/utils.h b/test/src/test/default.h index 2780bd2..12ee4cb 100644 --- a/test/src/test/utils.h +++ b/test/src/test/default.h @@ -2,11 +2,11 @@ * ecgen, tool for generating Elliptic curve domain parameters * Copyright (C) 2017 J08nY */ -#ifndef ECGEN_UTILS_H -#define ECGEN_UTILS_H +#ifndef ECGEN_TEST_DEFAULT_H +#define ECGEN_TEST_DEFAULT_H void default_setup(void); void default_teardown(void); -#endif //ECGEN_UTILS_H +#endif // ECGEN_UTILS_H diff --git a/test/src/test/input.c b/test/src/test/input.c new file mode 100644 index 0000000..f171ca8 --- /dev/null +++ b/test/src/test/input.c @@ -0,0 +1,27 @@ +/* + * ecgen, tool for generating Elliptic curve domain parameters + * Copyright (C) 2017 J08nY + */ +#include "input.h" +#include "io/input.h" + +FILE *write_in; + +void input_setup(void) { + config_t cfg; + memset(&cfg, 0, sizeof(cfg)); + input_init(&cfg); + + int in_fd[2]; + pipe(in_fd); + + write_in = fdopen(in_fd[1], "w"); + setlinebuf(write_in); + in = fdopen(in_fd[0], "r"); + setlinebuf(in); +} + +void input_teardown(void) { + input_quit(); + fclose(write_in); +}
\ No newline at end of file diff --git a/test/src/test/input.h b/test/src/test/input.h new file mode 100644 index 0000000..5e57c01 --- /dev/null +++ b/test/src/test/input.h @@ -0,0 +1,16 @@ +/* + * ecgen, tool for generating Elliptic curve domain parameters + * Copyright (C) 2017 J08nY + */ +#ifndef ECGEN_TEST_INPUT_H +#define ECGEN_TEST_INPUT_H + +#include <stdio.h> + +extern FILE *write_in; + +void input_setup(void); + +void input_teardown(void); + +#endif // ECGEN_TEST_INPUT_H diff --git a/test/src/test/memory.c b/test/src/test/memory.c new file mode 100644 index 0000000..38c75c2 --- /dev/null +++ b/test/src/test/memory.c @@ -0,0 +1,17 @@ + +#include <string.h> +#include <criterion/alloc.h> +#include "memory.h" + +char *cr_strdup(const char *str) { + size_t len = strlen(str); + return cr_memdup(str, len + 1); +} + +void *cr_memdup(const void *str, size_t len) { + void *result = cr_malloc(len); + memcpy(result, str, len); + return result; +} + +void *cr_simple_calloc(size_t size) { return cr_calloc(1, size); }
\ No newline at end of file diff --git a/test/src/test/memory.h b/test/src/test/memory.h new file mode 100644 index 0000000..d97e3cc --- /dev/null +++ b/test/src/test/memory.h @@ -0,0 +1,13 @@ + +#ifndef ECGEN_TEST_MEMORY_H +#define ECGEN_TEST_MEMORY_H + +#include <stddef.h> + +char *cr_strdup(const char *str); + +void *cr_memdup(const void *str, size_t len); + +void *cr_simple_calloc(size_t size); + +#endif //ECGEN_TEST_MEMORY_H diff --git a/test/src/test/output.c b/test/src/test/output.c new file mode 100644 index 0000000..66c5809 --- /dev/null +++ b/test/src/test/output.c @@ -0,0 +1,49 @@ +/* + * ecgen, tool for generating Elliptic curve domain parameters + * Copyright (C) 2017 J08nY + */ +#include "output.h" +#include "misc/types.h" +#include "io/output.h" + +FILE *read_out = NULL; +FILE *read_err = NULL; +FILE *read_verbose = NULL; + +static void setup_stream(FILE **original_out, FILE **redirected_out) { + int fd[2]; + pipe(fd); + + *redirected_out = fdopen(fd[0], "r"); + setlinebuf(*redirected_out); + *original_out = fdopen(fd[1], "w"); + setlinebuf(*original_out); +} + +void output_setup(void) { + config_t cfg; + memset(&cfg, 0, sizeof(cfg)); + output_init(&cfg); + + int in_fd[2]; + pipe(in_fd); + + setup_stream(&out, &read_out); + setup_stream(&err, &read_err); + setup_stream(&verbose, &read_verbose); +} + +void output_teardown(void) { + if (read_out) { + fclose(out); + fclose(read_out); + } + if (read_err) { + fclose(err); + fclose(read_err); + } + if (read_verbose) { + fclose(verbose); + fclose(read_verbose); + } +} diff --git a/test/src/test/output.h b/test/src/test/output.h new file mode 100644 index 0000000..733cb5c --- /dev/null +++ b/test/src/test/output.h @@ -0,0 +1,18 @@ +/* + * ecgen, tool for generating Elliptic curve domain parameters + * Copyright (C) 2017 J08nY + */ +#ifndef ECGEN_TEST_OUTPUT_H +#define ECGEN_TEST_OUTPUT_H + +#include <stdio.h> + +extern FILE *read_out; +extern FILE *read_err; +extern FILE *read_verbose; + +void output_setup(void); + +void output_teardown(void); + +#endif // ECGEN_TEST_OUTPUT_H diff --git a/test/src/util/test_bits.c b/test/src/util/test_bits.c new file mode 100644 index 0000000..372541a --- /dev/null +++ b/test/src/util/test_bits.c @@ -0,0 +1,486 @@ +/* + * ecgen, tool for generating Elliptic curve domain parameters + * Copyright (C) 2017 J08nY + */ + +#include <criterion/criterion.h> +#include <criterion/parameterized.h> +#include <misc/types.h> +#include "test/default.h" +#include "test/memory.h" +#include "util/bits.h" +#include "util/memory.h" + +TestSuite(bits, .init = default_setup, .fini = default_teardown); + +Test(bits, test_bits_new) { + bits_t *bits = bits_new(10); + cr_assert_not_null(bits, ); + cr_assert_eq(bits->bitlen, 10, ); + cr_assert_eq(bits->allocated, 2, ); + cr_assert_eq(bits->bits[0], 0, ); + cr_assert_eq(bits->bits[1], 0, ); + bits_free(&bits); +} + +Test(bits, test_bits_copy) { + bits_t *bits = bits_new(10); + bits->bits[0] = 0b10101010; + bits->bits[1] = 0b11000000; + + bits_t *other_bits = bits_copy(bits); + cr_assert_not_null(other_bits, ); + cr_assert_eq(other_bits->allocated, bits->allocated, ); + cr_assert_eq(other_bits->bitlen, bits->bitlen, ); + cr_assert_eq(other_bits->bits[0], bits->bits[0], ); + cr_assert_eq(other_bits->bits[1], bits->bits[1], ); + bits_free(&bits); + bits_free(&other_bits); +} + +Test(bits, test_bits_from_i) { + GEN i = int2n(5); + + bits_t *bits = bits_from_i(i); + cr_assert_not_null(bits, ); + cr_assert_eq(bits->bitlen, 6, ); + cr_assert_eq(bits->allocated, 1, ); + cr_assert_eq(bits->bits[0], 0b10000000, ); + bits_free(&bits); +} + +Test(bits, test_bits_from_hex) { + char *hex = "0ab"; + + bits_t *bits = bits_from_hex(hex); + cr_assert_not_null(bits, ); + cr_assert_eq(bits->bitlen, 12, ); + cr_assert_eq(bits->allocated, 2, ); + cr_assert_eq(bits->bits[0], 0x0a, ); + cr_assert_eq(bits->bits[1], 0xb0, ); + bits_free(&bits); +} + +Test(bits, test_bits_from_bin) { + char *bin = "000010101101"; + + bits_t *bits = bits_from_bin(bin); + cr_assert_not_null(bits, ); + cr_assert_eq(bits->bitlen, 12, ); + cr_assert_eq(bits->allocated, 2, ); + cr_assert_eq(bits->bits[0], 0b00001010, ); + cr_assert_eq(bits->bits[1], 0b11010000, ); + bits_free(&bits); +} + +Test(bits, test_bits_from_raw) { + unsigned char *raw = (unsigned char *)"\x0a\xb0"; + + bits_t *bits = bits_from_raw(raw, 16); + cr_assert_not_null(bits, ); + cr_assert_eq(bits->bitlen, 16, ); + cr_assert_eq(bits->allocated, 2, ); + cr_assert_eq(bits->bits[0], 0x0a, ); + cr_assert_eq(bits->bits[1], 0xb0, ); + bits_free(&bits); +} + +Test(bits, test_bits_from_bitvec) { + GEN bitvec = binary_zv(int2n(5)); + + bits_t *bits = bits_from_bitvec(bitvec); + cr_assert_not_null(bits, ); + cr_assert_eq(bits->bitlen, 6, ); + cr_assert_eq(bits->allocated, 1, ); + cr_assert_eq(bits->bits[0], 0b10000000, ); + bits_free(&bits); +} + +Test(bits, test_bits_to_i) { + bits_t *bits = bits_new(6); + bits->bits[0] = 0b10000000; + + GEN i = bits_to_i(bits); + cr_assert_not_null(bits, ); + cr_assert(gequal(i, int2n(5)), ); + bits_free(&bits); +} + +Test(bits, test_bits_to_hex) { + bits_t *bits = bits_new(12); + bits->bits[0] = 0xab; + bits->bits[1] = 0xc0; + + char *hex = bits_to_hex(bits); + cr_assert_not_null(hex, ); + cr_assert_str_eq(hex, "abc0", ); + try_free(hex); + bits_free(&bits); +} + +Test(bits, test_bits_to_bin) { + bits_t *bits = bits_new(12); + bits->bits[0] = 0b10101010; + bits->bits[1] = 0b11110000; + + char *bin = bits_to_bin(bits); + cr_assert_not_null(bin, ); + cr_assert_str_eq(bin, "101010101111", ); + try_free(bin); + bits_free(&bits); +} + +Test(bits, test_bits_to_raw) { + bits_t *bits = bits_new(6); + bits->bits[0] = 0b10000000; + + unsigned char *raw = bits_to_raw(bits); + size_t rawlen = bits_to_rawlen(bits); + cr_assert_not_null(raw, ); + cr_assert_eq(rawlen, 1, ); + cr_assert_eq(raw[0], 0b10000000, ); + try_free(raw); + bits_free(&bits); +} + +Test(bits, test_bits_to_bitvec) { + bits_t *bits = bits_new(6); + bits->bits[0] = 0b10000000; + + GEN bitvec = bits_to_bitvec(bits); + cr_assert_not_null(bitvec, ); + cr_assert(gequal(bitvec, binary_zv(int2n(5))), ); +} + +Test(bits, test_bits_concat) { + bits_t *one = bits_new(6); + one->bits[0] = 0b00000000; + + bits_t *other = bits_new(8); + other->bits[0] = 0b11001100; + + bits_t *cat = bits_concat(one, other, NULL); + cr_assert_not_null(cat, ); + cr_assert_eq(cat->bitlen, 14, ); + cr_assert_eq(cat->bits[0], 0b00000011, ); + cr_assert_eq(cat->bits[1], 0b00110000, ); + + bits_free(&one); + bits_free(&other); + bits_free(&cat); +} + +Test(bits, test_bits_or) { + bits_t *bits = bits_new(6); + bits->bits[0] = 0b10000000; + + bits_t *other_bits = bits_new(10); + other_bits->bits[0] = 0b00000000; + other_bits->bits[1] = 0b11000000; + + bits_t * or = bits_or(bits, other_bits); + cr_assert_not_null(or, ); + cr_assert_eq(or->bitlen, 10, ); + cr_assert_eq(or->bits[0], 0b00001000, ); + cr_assert_eq(or->bits[1], 0b11000000, ); + bits_free(&bits); + bits_free(&other_bits); + bits_free(& or); +} + +Test(bits, test_bits_and) { + bits_t *bits = bits_new(6); + bits->bits[0] = 0b10000000; + + bits_t *other_bits = bits_new(10); + other_bits->bits[0] = 0b00001000; + other_bits->bits[1] = 0b11000000; + + bits_t *and = bits_and(bits, other_bits); + cr_assert_not_null(and, ); + cr_assert_eq(and->bitlen, 10, ); + cr_assert_eq(and->bits[0], 0b00001000, ); + cr_assert_eq(and->bits[1], 0b00000000, ); + bits_free(&bits); + bits_free(&other_bits); + bits_free(&and); +} + +Test(bits, test_bits_notz) { + bits_t *bits = bits_new(6); + bits->bits[0] = 0b10000000; + + bits_notz(bits); + cr_assert_eq(bits->bitlen, 6, ); + cr_assert_eq(bits->bits[0], 0b01111100, ); + bits_free(&bits); +} + +Test(bits, test_bits_not) { + bits_t *bits = bits_new(6); + bits->bits[0] = 0b10000000; + + bits_t *not = bits_not(bits); + cr_assert_not_null(not, ); + cr_assert_eq(not->bitlen, 6, ); + cr_assert_eq(not->bits[0], 0b01111100, ); + bits_free(&bits); + bits_free(¬); +} + +Test(bits, test_bits_rotz) { + bits_t *bits = bits_new(10); + bits->bits[0] = 0b11111000; + bits->bits[1] = 0b00000000; + + bits_rotz(bits); + cr_assert_eq(bits->bitlen, 10, ); + cr_assert_eq(bits->bits[0], 0b00000111, ); + cr_assert_eq(bits->bits[1], 0b11000000, ); + bits_free(&bits); +} + +Test(bits, test_bits_rot) { + bits_t *bits = bits_new(6); + bits->bits[0] = 0b10000000; + + bits_t *rot = bits_rot(bits); + cr_assert_not_null(rot, ); + cr_assert_eq(rot->bitlen, 6, ); + cr_assert_eq(rot->bits[0], 0b00000100, ); + bits_free(&bits); + bits_free(&rot); + + bits = bits_new(5); + bits->bits[0] = 0b10100000; + + rot = bits_rot(bits); + cr_assert_not_null(rot, ); + cr_assert_eq(rot->bitlen, 5, ); + cr_assert_eq(rot->bits[0], 0b00101000, ); + bits_free(&bits); + bits_free(&rot); +} + +Test(bits, test_bits_shiftz) { + bits_t *bits = bits_new(6); + bits->bits[0] = 0b10101000; + + bits_shiftz(bits, -1); + cr_assert_eq(bits->bitlen, 6, ); + cr_assert_eq(bits->bits[0], 0b01010100, ); + bits_free(&bits); +} + +Test(bits, test_bits_shift) { + bits_t *bits = bits_new(8); + bits->bits[0] = 0b11001100; + + bits_t *shift = bits_shift(bits, 2); + cr_assert_not_null(shift, ); + cr_assert_eq(shift->bitlen, 8, ); + cr_assert_eq(shift->bits[0], 0b00110000, ); + bits_free(&bits); + bits_free(&shift); +} + +Test(bits, test_bits_shiftrz) { + bits_t *bits = bits_new(8); + bits->bits[0] = 0b11001100; + + bits_shiftrz(bits, 1); + cr_assert_eq(bits->bitlen, 8, ); + cr_assert_eq(bits->bits[0], 0b10011001, ); + bits->bits[0] = 0b11001100; + + bits_shiftrz(bits, 9); + cr_assert_eq(bits->bitlen, 8, ); + cr_assert_eq(bits->bits[0], 0b10011001, ); + bits->bits[0] = 0b11001100; + + bits_shiftrz(bits, -10); + cr_assert_eq(bits->bitlen, 8, ); + cr_assert_eq(bits->bits[0], 0b00110011, ); + bits_free(&bits); +} + +Test(bits, test_bits_shiftr) { + bits_t *bits = bits_new(8); + bits->bits[0] = 0b11001100; + + bits_t *shift = bits_shiftr(bits, 1); + cr_assert_eq(shift->bitlen, 8, ); + cr_assert_eq(shift->bits[0], 0b10011001, ); + bits_free(&bits); + bits_free(&shift); +} + +Test(bits, test_bits_shiftiz) { + bits_t *bits = bits_new(8); + bits->bits[0] = 0b11001100; + + bits_shiftiz(bits, 2); + cr_assert_eq(bits->bitlen, 10, ); + cr_assert_eq(bits->bits[0], 0b11001100, ); + cr_assert_eq(bits->bits[1], 0b00000000, ); + + bits_shiftiz(bits, -2); + cr_assert_eq(bits->bitlen, 8, ); + cr_assert_eq(bits->bits[0], 0b11001100, ); + bits_free(&bits); +} + +Test(bits, test_bits_shitfi) { + bits_t *bits = bits_new(8); + bits->bits[0] = 0b11001100; + + bits_t *shift = bits_shifti(bits, -4); + cr_assert_eq(shift->bitlen, 4, ); + cr_assert_eq(shift->bits[0], 0b11000000, ); + bits_free(&bits); + bits_free(&shift); +} + +Test(bits, test_bits_lengthenz) { + bits_t *bits = bits_new(8); + bits->bits[0] = 0b11001100; + + bits_lengthenz(bits, 4); + cr_assert_eq(bits->bitlen, 12, ); + cr_assert_eq(bits->bits[0], 0b00001100, ); + cr_assert_eq(bits->bits[1], 0b11000000, ); + + bits_lengthenz(bits, -4); + cr_assert_eq(bits->bitlen, 16, ); + cr_assert_eq(bits->bits[0], 0b00001100, ); + cr_assert_eq(bits->bits[1], 0b11000000, ); + + bits_free(&bits); +} + +Test(bits, test_bits_lengthen) { + bits_t *bits = bits_new(6); + bits->bits[0] = 0b11111100; + + bits_t *longer = bits_lengthen(bits, 2); + cr_assert_not_null(longer, ); + cr_assert_eq(longer->bitlen, 8, ); + cr_assert_eq(longer->bits[0], 0b00111111, ); + bits_free(&bits); + bits_free(&longer); +} + +Test(bits, test_bits_shortenz) { + bits_t *bits = bits_new(6); + bits->bits[0] = 0b10110100; + + bits_shortenz(bits, 2); + cr_assert_eq(bits->bitlen, 4, ); + cr_assert_eq(bits->bits[0], 0b11010000, ); + + bits_shortenz(bits, -2); + cr_assert_eq(bits->bitlen, 2, ); + cr_assert_eq(bits->bits[0], 0b11000000, ); + bits_free(&bits); +} + +Test(bits, test_bits_shorten) { + bits_t *bits = bits_new(6); + bits->bits[0] = 0b10110100; + + bits_t *shorter = bits_shorten(bits, 4); + cr_assert_not_null(shorter, ); + cr_assert_eq(shorter->bitlen, 2, ); + cr_assert_eq(shorter->bits[0], 0b01000000, ); + bits_free(&bits); + bits_free(&shorter); +} + +struct sha1_params { + char *data; + unsigned char *hashout; +}; + +void sha1_params_cleanup(struct criterion_test_params *ctp) { + struct sha1_params *params = (struct sha1_params *)ctp->params; + cr_free(params->data); + cr_free(params->hashout); +} + +ParameterizedTestParameters(bits, test_bits_sha1) { + static struct sha1_params params[5] = {}; + params[0].data = cr_strdup("The quick brown fox jumps over the lazy dog"); + params[0].hashout = cr_memdup("\x2f\xd4\xe1\xc6\x7a\x2d\x28\xfc\xed\x84\x9e\xe1\xbb\x76\xe7\x39\x1b\x93\xeb\x12", 20); + params[1].data = cr_strdup("abc"); + params[1].hashout = cr_memdup("\xa9\x99\x3e\x36\x47\x06\x81\x6a\xba\x3e\x25\x71\x78\x50\xc2\x6c\x9c\xd0\xd8\x9d", 20); + params[2].data = cr_strdup(""); + params[2].hashout = cr_memdup("\xda\x39\xa3\xee\x5e\x6b\x4b\x0d\x32\x55\xbf\xef\x95\x60\x18\x90\xaf\xd8\x07\x09", 20); + params[3].data = cr_strdup("abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq"); + params[3].hashout = cr_memdup("\x84\x98\x3e\x44\x1c\x3b\xd2\x6e\xba\xae\x4a\xa1\xf9\x51\x29\xe5\xe5\x46\x70\xf1", 20); + params[4].data = cr_strdup("abcdefghbcdefghicdefghijdefghijkefghijklfghijklmghijklmnhijklmnoijklmnopjklmnopqklmnopqrlmnopqrsmnopqrstnopqrstu"); + params[4].hashout = cr_memdup("\xa4\x9b\x24\x46\xa0\x2c\x64\x5b\xf4\x19\xf9\x95\xb6\x70\x91\x25\x3a\x04\xa2\x59", 20); + + size_t nb_params = sizeof(params) / sizeof(struct sha1_params); + return cr_make_param_array(struct sha1_params, params, nb_params, sha1_params_cleanup); +} + +ParameterizedTest(struct sha1_params *param, bits, test_bits_sha1) { + bits_t *bits = bits_from_raw((unsigned char *)param->data, strlen(param->data) * 8); + unsigned char hashout[20] = {}; + bits_sha1(bits, hashout); + + for (size_t i = 0; i < 20; ++i) { + cr_assert_eq(hashout[i], param->hashout[i], ); + } + + bits_free(&bits); +} + +Test(bits, test_bits_eq) { + bits_t *bits = bits_new(6); + bits->bits[0] = 0b10000000; + + bits_t *other_bits = bits_new(6); + other_bits->bits[0] = 0b10000000; + + cr_assert(bits_eq(bits, other_bits), ); + + bits->bits[0] = 0b10010000; + other_bits->bits[0] = 0b10000000; + + cr_assert_not(bits_eq(bits, other_bits), ); + + bits_free(&bits); + bits_free(&other_bits); +} + +Test(bits, test_bits_eq_len) { + bits_t *bits = bits_new(5); + bits->bits[0] = 0b10000000; + + bits_t *other_bits = bits_new(6); + other_bits->bits[0] = 0b10000000; + cr_assert_not(bits_eq(bits, other_bits), ); + bits_free(&bits); + bits_free(&other_bits); +} + +Test(bits, test_bits_eq_large) { + bits_t *bits = bits_new(10); + bits->bits[0] = 0b10000010; + bits->bits[1] = 0b11000000; + + bits_t *other_bits = bits_new(10); + other_bits->bits[0] = 0b10000010; + other_bits->bits[1] = 0b11000000; + + cr_assert(bits_eq(bits, other_bits), ); + + bits->bits[0] = 0b10000000; + other_bits->bits[0] = 0b00000010; + + cr_assert_not(bits_eq(bits, other_bits), ); + + bits_free(&bits); + bits_free(&other_bits); +} diff --git a/test/src/util/test_random.c b/test/src/util/test_random.c index 5e7f854..bb632a6 100644 --- a/test/src/util/test_random.c +++ b/test/src/util/test_random.c @@ -3,9 +3,9 @@ * Copyright (C) 2017 J08nY */ -#include "test/utils.h" -#include "util/random.h" #include <criterion/criterion.h> +#include "test/default.h" +#include "util/random.h" void random_setup() { default_setup(); @@ -17,18 +17,16 @@ TestSuite(random, .init = random_setup, .fini = default_teardown); Test(random, test_random_prime) { for (size_t i = 0; i < 100; ++i) { GEN p = random_prime(10); - cr_assert(isprime(p),); - cr_assert_lt(gcmp(p, int2n(10)), 0,); - cr_assert_gt(gcmp(p, int2n(9)), 0,); + cr_assert(isprime(p), ); + cr_assert_leq(cmpii(p, int2n(10)), 0, ); + cr_assert_geq(cmpii(p, int2n(9)), 0, ); } } Test(random, test_random_int) { for (size_t i = 0; i < 100; ++i) { GEN j = random_int(10); - cr_assert_lt(gcmp(j, int2n(10)), 0,); - cr_assert_gt(gcmp(j, int2n(9)), 0,); + cr_assert_leq(cmpii(j, int2n(10)), 0, ); + cr_assert_geq(cmpii(j, int2n(9)), 0, ); } } - - |
