diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/gen/seed.c | 68 | ||||
| -rw-r--r-- | src/gen/types.h | 6 | ||||
| -rw-r--r-- | src/io/cli.c | 4 | ||||
| -rw-r--r-- | src/math/subgroups.c | 3 |
4 files changed, 58 insertions, 23 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); } /** |
