aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/gen/seed.c37
-rw-r--r--test/src/gen/test_seed.c56
2 files changed, 71 insertions, 22 deletions
diff --git a/src/gen/seed.c b/src/gen/seed.c
index 49a33ff..5b26718 100644
--- a/src/gen/seed.c
+++ b/src/gen/seed.c
@@ -4,7 +4,6 @@
*/
#include "seed.h"
-#include <io/config.h>
#include "io/output.h"
#include "util/memory.h"
@@ -57,6 +56,7 @@ static GEN seed_stoi(const char *cstr) {
}
GEN i = strtoi(seed_str);
+ try_free(seed_str);
return gerepilecopy(ltop, i);
}
@@ -72,6 +72,18 @@ static char *seed_itos(GEN seed) {
return seed_str;
}
+static char *seed_strip(const char *cstr) {
+ size_t seed_len = strlen(cstr);
+ char *seed_str = try_malloc(seed_len + 1);
+ char *prefix = strstr(cstr, "0x");
+ if (prefix != NULL) {
+ strcpy(seed_str, cstr + 2);
+ } else {
+ strcpy(seed_str, cstr);
+ }
+ return seed_str;
+}
+
GENERATOR(seed_gen_random) {
curve->seed = seed_new();
curve->seed->seed = random_int(160);
@@ -83,13 +95,8 @@ GENERATOR(seed_gen_random) {
GENERATOR(seed_gen_argument) {
curve->seed = seed_new();
curve->seed->seed = seed_stoi(cfg->seed);
-
- size_t seed_len = strlen(cfg->seed);
- char *seed = try_malloc(seed_len + 1);
- strcpy(seed, cfg->seed);
-
- curve->seed->raw = seed;
- curve->seed->raw_len = seed_len;
+ curve->seed->raw = seed_strip(cfg->seed);
+ curve->seed->raw_len = strlen(curve->seed->raw);
return 1;
}
@@ -99,20 +106,14 @@ GENERATOR(seed_gen_input) {
GEN str = input_string("seed:");
const char *cstr = GSTR(str);
if (strlen(cstr) < 20) {
- fprintf(err, "SEED must be at least 160 bits(20 characters).\n");
+ fprintf(err, "SEED must be at least 160 bits(20 hex characters).\n");
avma = ltop;
return 0;
}
- GEN seed = seed_stoi(cstr);
curve->seed = seed_new();
- curve->seed->seed = gerepilecopy(ltop, seed);
-
- size_t seed_len = strlen(cstr);
- char *seed_str = try_malloc(seed_len + 1);
- strcpy(seed_str, cfg->seed);
-
- curve->seed->raw = seed_str;
- curve->seed->raw_len = seed_len;
+ curve->seed->seed = seed_stoi(cstr);
+ curve->seed->raw = seed_strip(cstr);
+ curve->seed->raw_len = strlen(curve->seed->raw);
return 1;
}
diff --git a/test/src/gen/test_seed.c b/test/src/gen/test_seed.c
index 28c24d3..b4da7e0 100644
--- a/test/src/gen/test_seed.c
+++ b/test/src/gen/test_seed.c
@@ -7,8 +7,22 @@
#include "gen/seed.h"
#include "gen/types.h"
#include "test/default.h"
+#include "test/input.h"
+#include "test/output.h"
-TestSuite(seed, .init = default_setup, .fini = default_teardown);
+void seed_suite_setup(void) {
+ default_setup();
+ input_setup();
+ output_setup();
+}
+
+void seed_suite_teardown(void) {
+ default_teardown();
+ input_teardown();
+ output_teardown();
+}
+
+TestSuite(seed, .init = seed_suite_setup, .fini = seed_suite_teardown);
Test(seed, test_seed_random) {
curve_t curve = {};
@@ -17,7 +31,7 @@ Test(seed, test_seed_random) {
cr_assert_eq(ret, 1, );
cr_assert_not_null(curve.seed, );
- cr_assert_str_eq(pari_sprintf("%Px", curve.seed->seed), curve.seed->raw, );
+ cr_assert_str_eq(curve.seed->raw, pari_sprintf("%Px", curve.seed->seed), );
cr_assert_eq(strlen(curve.seed->raw), curve.seed->raw_len, );
}
@@ -30,8 +44,42 @@ Test(seed, test_seed_argument) {
cr_assert_eq(ret, 1, );
cr_assert_not_null(curve.seed, );
cr_assert_str_eq(curve.seed->raw, seed, );
- cr_assert_str_eq(pari_sprintf("%Px", curve.seed->seed), curve.seed->raw, );
+ cr_assert_str_eq(curve.seed->raw, pari_sprintf("%Px", curve.seed->seed), );
+ cr_assert_eq(strlen(curve.seed->raw), curve.seed->raw_len, );
+}
+
+Test(seed, test_seed_argument_hex) {
+ curve_t curve = {};
+ char *seed = "0xabcdefabcdefabcdefab";
+ config_t cfg = {.seed = seed};
+ int ret = seed_gen_argument(&curve, &cfg, NULL);
+
+ cr_assert_eq(ret, 1, );
+ cr_assert_not_null(curve.seed, );
+ cr_assert_str_eq(curve.seed->raw, pari_sprintf("%Px", curve.seed->seed), );
+ cr_assert_eq(strlen(curve.seed->raw), curve.seed->raw_len, );
+}
+
+Test(seed, test_seed_input) {
+ curve_t curve = {};
+ char *seed = "abcdefabcdefabcdefab";
+ config_t cfg = {};
+ fprintf(write_in, "%s\n", seed);
+ int ret = seed_gen_input(&curve, &cfg, NULL);
+
+ cr_assert_eq(ret, 1, );
+ cr_assert_not_null(curve.seed, );
+ cr_assert_str_eq(curve.seed->raw, seed, );
+ cr_assert_str_eq(curve.seed->raw, pari_sprintf("%Px", curve.seed->seed), );
cr_assert_eq(strlen(curve.seed->raw), curve.seed->raw_len, );
}
-Test(seed, test_seed_input) {} \ No newline at end of file
+Test(seed, test_seed_input_short) {
+ curve_t curve = {};
+ char *seed = "abcdef";
+ config_t cfg = {};
+ fprintf(write_in, "%s\n", seed);
+ int ret = seed_gen_input(&curve, &cfg, NULL);
+
+ cr_assert_eq(ret, 0, );
+} \ No newline at end of file