summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/gen/seed.c68
-rw-r--r--src/gen/types.h6
-rw-r--r--src/io/cli.c4
-rw-r--r--src/math/subgroups.c3
-rw-r--r--test/src/gen/test_seed.c27
5 files changed, 72 insertions, 36 deletions
diff --git a/src/gen/seed.c b/src/gen/seed.c
index 5b26718..00a6c0a 100644
--- a/src/gen/seed.c
+++ b/src/gen/seed.c
@@ -4,7 +4,9 @@
*/
#include "seed.h"
+#include <sha1/sha1.h>
#include "io/output.h"
+#include "util/binascii.h"
#include "util/memory.h"
seed_t *seed_new(void) { return try_calloc(sizeof(seed_t)); }
@@ -34,6 +36,15 @@ void seed_free(seed_t **seed) {
if ((*seed)->seed && isclone((*seed)->seed)) {
gunclone((*seed)->seed);
}
+ if ((*seed)->hex) {
+ try_free((*seed)->hex);
+ }
+ if ((*seed)->raw) {
+ try_free((*seed)->raw);
+ }
+ if ((*seed)->hash20) {
+ try_free((*seed)->hash20);
+ }
try_free(*seed);
*seed = NULL;
}
@@ -49,7 +60,6 @@ static GEN seed_stoi(const char *cstr) {
strncpy(seed_str + 2, cstr, len);
seed_str[0] = '0';
seed_str[1] = 'x';
- seed_str[len + 2] = 0;
} else {
seed_str = try_malloc(len + 1);
strncpy(seed_str, cstr, len);
@@ -64,8 +74,7 @@ static char *seed_itos(GEN seed) {
pari_sp ltop = avma;
char *result = pari_sprintf("%Px", seed);
- size_t seed_len = strlen(result);
- char *seed_str = try_malloc(seed_len + 1);
+ char *seed_str = try_malloc(strlen(result) + 1);
strcpy(seed_str, result);
avma = ltop;
@@ -73,8 +82,7 @@ static char *seed_itos(GEN seed) {
}
static char *seed_strip(const char *cstr) {
- size_t seed_len = strlen(cstr);
- char *seed_str = try_malloc(seed_len + 1);
+ char *seed_str = try_malloc(strlen(cstr) + 1);
char *prefix = strstr(cstr, "0x");
if (prefix != NULL) {
strcpy(seed_str, cstr + 2);
@@ -84,19 +92,36 @@ static char *seed_strip(const char *cstr) {
return seed_str;
}
+static void hash_string(const char *str, int len, unsigned char *hashout) {
+ SHA_CTX ctx = {};
+ SHA1_Init(&ctx);
+ SHA1_Update(&ctx, str, len);
+ SHA1_Final(hashout, &ctx);
+}
+
GENERATOR(seed_gen_random) {
- curve->seed = seed_new();
- curve->seed->seed = random_int(160);
- curve->seed->raw = seed_itos(curve->seed->seed);
- curve->seed->raw_len = strlen(curve->seed->raw);
+ seed_t *seed = seed_new();
+ seed->seed = random_int(160);
+ seed->hex = seed_itos(seed->seed);
+ seed->hex_len = strlen(seed->hex);
+ seed->raw = binascii_itob(seed->seed, ENDIAN_BIG);
+ seed->raw_len = binascii_blen(seed->seed);
+ seed->hash20 = try_malloc(20);
+ hash_string(seed->raw, (int)seed->raw_len, seed->hash20);
+ curve->seed = seed;
return 1;
}
GENERATOR(seed_gen_argument) {
- curve->seed = seed_new();
- curve->seed->seed = seed_stoi(cfg->seed);
- curve->seed->raw = seed_strip(cfg->seed);
- curve->seed->raw_len = strlen(curve->seed->raw);
+ seed_t *seed = seed_new();
+ seed->seed = seed_stoi(cfg->seed);
+ seed->hex = seed_strip(cfg->seed);
+ seed->hex_len = strlen(seed->hex);
+ seed->raw = binascii_itob(seed->seed, ENDIAN_BIG);
+ seed->raw_len = binascii_blen(seed->seed);
+ seed->hash20 = try_malloc(20);
+ hash_string(seed->raw, (int)seed->raw_len, seed->hash20);
+ curve->seed = seed;
return 1;
}
@@ -105,15 +130,20 @@ 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 hex characters).\n");
+ if (strlen(cstr) < 40) {
+ fprintf(err, "SEED must be at least 160 bits(40 hex characters).\n");
avma = ltop;
return 0;
}
- curve->seed = seed_new();
- curve->seed->seed = seed_stoi(cstr);
- curve->seed->raw = seed_strip(cstr);
- curve->seed->raw_len = strlen(curve->seed->raw);
+ seed_t *seed = seed_new();
+ seed->seed = seed_stoi(cstr);
+ seed->hex = seed_strip(cstr);
+ seed->hex_len = strlen(seed->hex);
+ seed->raw = binascii_itob(seed->seed, ENDIAN_BIG);
+ seed->raw_len = binascii_blen(seed->seed);
+ seed->hash20 = try_malloc(20);
+ hash_string(seed->raw, (int)seed->raw_len, seed->hash20);
+ curve->seed = seed;
return 1;
}
diff --git a/src/gen/types.h b/src/gen/types.h
index da03aeb..26aea15 100644
--- a/src/gen/types.h
+++ b/src/gen/types.h
@@ -19,7 +19,9 @@ typedef struct seed_t {
GEN seed;
char *hex;
size_t hex_len;
- unsigned char *hash;
+ char *raw;
+ size_t raw_len;
+ unsigned char *hash20;
} seed_t;
/**
@@ -98,6 +100,7 @@ typedef enum { ENDIAN_BIG = 0, ENDIAN_LITTLE } endian_e;
*/
#define GENERATOR(gen_name) \
int gen_name(curve_t *curve, const config_t *cfg, arg_t *args)
+
typedef GENERATOR((*gen_t));
/**
@@ -111,6 +114,7 @@ typedef GENERATOR((*gen_t));
#define UNROLL(unroll_name) \
int unroll_name(curve_t *curve, const config_t *cfg, pari_sp from, \
pari_sp to)
+
typedef UNROLL((*unroll_t));
/**
diff --git a/src/io/cli.c b/src/io/cli.c
index 1cbf3b9..4a75646 100644
--- a/src/io/cli.c
+++ b/src/io/cli.c
@@ -201,10 +201,10 @@ error_t cli_parse(int key, char *arg, struct argp_state *state) {
cfg->from_seed = true;
if (arg) {
// ANSI X9.62 specifies seed as at least 160 bits in length.
- if (strlen(arg) < 20) {
+ if (strlen(arg) < 40) {
argp_failure(
state, 1, 0,
- "SEED must be at least 160 bits (20 characters).");
+ "SEED must be at least 160 bits (40 characters).");
}
cfg->seed = arg;
}
diff --git a/src/math/subgroups.c b/src/math/subgroups.c
index 5ca2fde..45523ad 100644
--- a/src/math/subgroups.c
+++ b/src/math/subgroups.c
@@ -54,6 +54,7 @@ static GEN subgroups_divisors(GEN order) {
* @return a t_VEC of factors
*/
static GEN subgroups_2n_factors(GEN factors, size_t min_bits) {
+ pari_sp ltop = avma;
long nprimes = glength(factors);
if (nprimes == min_bits) return NULL;
GEN amount = int2n(nprimes);
@@ -78,7 +79,7 @@ static GEN subgroups_2n_factors(GEN factors, size_t min_bits) {
}
}
GEN ret = gtoset(groups);
- return ret;
+ return gerepilecopy(ltop, ret);
}
/**
diff --git a/test/src/gen/test_seed.c b/test/src/gen/test_seed.c
index b4da7e0..c37c57f 100644
--- a/test/src/gen/test_seed.c
+++ b/test/src/gen/test_seed.c
@@ -31,47 +31,48 @@ Test(seed, test_seed_random) {
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, );
+ cr_assert_str_eq(curve.seed->hex, pari_sprintf("%Px", curve.seed->seed), );
+ cr_assert_eq(strlen(curve.seed->hex), curve.seed->hex_len, );
}
Test(seed, test_seed_argument) {
curve_t curve = {};
- char *seed = "abcdefabcdefabcdefab";
+ char *seed = "abcdefabcdefabcdefabcdefabcdefabcdefabcd";
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, 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, );
+ cr_assert_str_eq(curve.seed->hex, seed, );
+ cr_assert_str_eq(curve.seed->hex, pari_sprintf("%Px", curve.seed->seed), );
+ cr_assert_eq(strlen(curve.seed->hex), curve.seed->hex_len, );
}
Test(seed, test_seed_argument_hex) {
curve_t curve = {};
- char *seed = "0xabcdefabcdefabcdefab";
+ char *seed = "0xabcdefabcdefabcdefabcdefabcdefabcdefabcd";
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, );
+ cr_assert_str_eq(curve.seed->hex, seed + 2, );
+ cr_assert_str_eq(curve.seed->hex, pari_sprintf("%Px", curve.seed->seed), );
+ cr_assert_eq(strlen(curve.seed->hex), curve.seed->hex_len, );
}
Test(seed, test_seed_input) {
curve_t curve = {};
- char *seed = "abcdefabcdefabcdefab";
+ char *seed = "abcdefabcdefabcdefabcdefabcdefabcdefabcd";
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, );
+ cr_assert_str_eq(curve.seed->hex, seed, );
+ cr_assert_str_eq(curve.seed->hex, pari_sprintf("%Px", curve.seed->seed), );
+ cr_assert_eq(strlen(curve.seed->hex), curve.seed->hex_len, );
}
Test(seed, test_seed_input_short) {