aboutsummaryrefslogtreecommitdiff
path: root/src/math
diff options
context:
space:
mode:
authorJ08nY2017-02-19 18:58:26 +0100
committerJ08nY2017-02-19 18:58:26 +0100
commit888ca8052e0eb3acbe33dbf180e3af27341002eb (patch)
tree589be6afcec5d8986462911fdf41608c39eba8e3 /src/math
parentc1be6dbea0f6e2b8d9cb8c422bc2e1cfb41524da (diff)
downloadecgen-888ca8052e0eb3acbe33dbf180e3af27341002eb.tar.gz
ecgen-888ca8052e0eb3acbe33dbf180e3af27341002eb.tar.zst
ecgen-888ca8052e0eb3acbe33dbf180e3af27341002eb.zip
Added generators
- Added new type of gen_t, essentially only for generators. Since they are points with a special property. - Added order_smallfact generator - Added generators to csv and json output
Diffstat (limited to 'src/math')
-rw-r--r--src/math/curve.c45
-rw-r--r--src/math/gens.c23
-rw-r--r--src/math/gens.h9
-rw-r--r--src/math/order.c16
-rw-r--r--src/math/order.h10
-rw-r--r--src/math/point.c55
-rw-r--r--src/math/point.h12
-rw-r--r--src/math/types.h6
8 files changed, 115 insertions, 61 deletions
diff --git a/src/math/curve.c b/src/math/curve.c
index 3892704..71d1744 100644
--- a/src/math/curve.c
+++ b/src/math/curve.c
@@ -45,19 +45,16 @@ int curve_init(curve_t *curve, config_t *config, arg_t *args) {
pari_sp ltop = avma;
GEN v = gen_0;
switch (typ(curve->field)) {
- case t_INT:
- v = gtovec0(gen_0, 2);
+ case t_INT: v = gtovec0(gen_0, 2);
gel(v, 1) = curve->a;
gel(v, 2) = curve->b;
break;
- case t_FFELT:
- v = gtovec0(gen_0, 5);
+ case t_FFELT: v = gtovec0(gen_0, 5);
gel(v, 1) = gen_1;
gel(v, 4) = curve->a;
gel(v, 5) = curve->b;
break;
- default:
- pari_err_TYPE("curve_init", curve->field);
+ default: pari_err_TYPE("curve_init", curve->field);
}
curve->curve = gerepilecopy(ltop, ellinit(v, curve->field, -1));
@@ -87,12 +84,9 @@ int curve_seed_f2m(curve_t *curve, config_t *config, arg_t *args) {
int curve_seed(curve_t *curve, config_t *config, arg_t *args) {
switch (typ(curve->field)) {
- case t_INT:
- return curve_seed_fp(curve, config, args);
- case t_FFELT:
- return curve_seed_f2m(curve, config, args);
- default:
- pari_err_TYPE("curve_seed", curve->field);
+ case t_INT: return curve_seed_fp(curve, config, args);
+ case t_FFELT: return curve_seed_f2m(curve, config, args);
+ default: pari_err_TYPE("curve_seed", curve->field);
return INT_MIN; /* NOT REACHABLE */
}
}
@@ -103,14 +97,35 @@ GEN curve_params(curve_t *curve) {
GEN result = field_params(curve->field);
if (curve->a) result = gconcat(result, field_elementi(curve->a));
if (curve->b) result = gconcat(result, field_elementi(curve->b));
+ if (curve->generators) {
+ for (size_t i = 0; i < curve->ngens; ++i) {
+ GEN point =
+ gconcat(field_elementi(gel(curve->generators[i]->point, 1)),
+ field_elementi(gel(curve->generators[i]->point, 2)));
+ GEN x = field_elementi(gel(point, 1));
+ GEN y = field_elementi(gel(point, 2));
+ result = gconcat(result, x);
+ result = gconcat(result, y);
+ result = gconcat(result, curve->generators[i]->order);
+ if (curve->generators[i]->cofactor) {
+ result = gconcat(result, curve->generators[i]->cofactor);
+ }
+ }
+ }
if (curve->order) result = gconcat(result, gtovec(curve->order));
if (curve->points) {
for (size_t i = 0; i < curve->npoints; ++i) {
GEN point =
- gconcat(field_elementi(gel(curve->points[i]->point, 1)),
- field_elementi(gel(curve->points[i]->point, 2)));
- result = gconcat(result, point);
+ gconcat(field_elementi(gel(curve->points[i]->point, 1)),
+ field_elementi(gel(curve->points[i]->point, 2)));
+ GEN x = field_elementi(gel(point, 1));
+ GEN y = field_elementi(gel(point, 2));
+ result = gconcat(result, x);
+ result = gconcat(result, y);
result = gconcat(result, curve->points[i]->order);
+ if (curve->points[i]->cofactor) {
+ result = gconcat(result, curve->points[i]->cofactor);
+ }
}
}
diff --git a/src/math/gens.c b/src/math/gens.c
new file mode 100644
index 0000000..619eb25
--- /dev/null
+++ b/src/math/gens.c
@@ -0,0 +1,23 @@
+
+#include "gens.h"
+#include "point.h"
+
+
+int gens_init(curve_t *curve, config_t *config, arg_t *args) {
+ // TODO stack code!!!
+ GEN generators = ellff_get_gens(curve->curve);
+ long len = glength(generators);
+ curve->generators = points_new((size_t)len);
+ curve->ngens = (size_t)len;
+
+ for (long i = 1; i <= len; ++i) {
+ point_t *p = point_new();
+ p->point = gel(generators, i);
+ p->order = ellorder(curve->curve, p->point, NULL);
+ p->cofactor = divii(curve->order, p->order);
+ curve->generators[i - 1] = p;
+ }
+
+ return 1;
+}
+
diff --git a/src/math/gens.h b/src/math/gens.h
new file mode 100644
index 0000000..fc67a23
--- /dev/null
+++ b/src/math/gens.h
@@ -0,0 +1,9 @@
+
+#ifndef ECGEN_GENS_H
+#define ECGEN_GENS_H
+
+#include "types.h"
+
+int gens_init(curve_t *curve, config_t *config, arg_t *args);
+
+#endif //ECGEN_GENS_H
diff --git a/src/math/order.c b/src/math/order.c
index 39222b4..7e7eeda 100644
--- a/src/math/order.c
+++ b/src/math/order.c
@@ -9,6 +9,22 @@ int order_init(curve_t *curve, config_t *cfg, arg_t *args) {
return 1;
}
+int order_smallfact(curve_t *curve, config_t *cfg, arg_t *args) {
+ if (!args) {
+ fprintf(stderr, "No args to an arged function. points_random");
+ return INT_MIN;
+ }
+ pari_ulong smallfact = *(pari_ulong *)args->args;
+ pari_sp ltop = avma;
+ curve->order = ellsea(curve->curve, smallfact);
+ if (gequal0(curve->order)) {
+ avma = ltop;
+ return -4;
+ } else {
+ return 1;
+ }
+}
+
int order_prime(curve_t *curve, config_t *cfg, arg_t *args) {
pari_sp ltop = avma;
curve->order = ellsea(curve->curve, 1);
diff --git a/src/math/order.h b/src/math/order.h
index a1ed861..4562fab 100644
--- a/src/math/order.h
+++ b/src/math/order.h
@@ -24,6 +24,16 @@ int order_init(curve_t *curve, config_t *cfg, arg_t *args);
/**
* GENERATOR(gen_t)
+ *
+ * @param curve
+ * @param cfg
+ * @param args
+ * @return
+ */
+int order_smallfact(curve_t *curve, config_t *cfg, arg_t *args);
+
+/**
+ * GENERATOR(gen_t)
* Calculates the curve order, always using the SEA algorithm,
* gives up early in case the order is divisible by "something".
* Succeeds if the curve has a prime order.
diff --git a/src/math/point.c b/src/math/point.c
index c2cd02a..514f1b9 100644
--- a/src/math/point.c
+++ b/src/math/point.c
@@ -91,19 +91,19 @@ int points_random(curve_t *curve, config_t *config, arg_t *args) {
}
/*
- * GEN o = utoi(dprimes[i]);
- GEN mul = ellmul(curve->curve, rand, o);
+ GEN o = utoi(dprimes[i]);
+ GEN mul = ellmul(curve->curve, rand, o);
- if (gequal0(mul)) {
- printf("Success! %lu\n", npoints);
- curve->points[i] = point_new();
+ if (gequal0(mul)) {
+ printf("Success! %lu\n", npoints);
+ curve->points[i] = point_new();
- gerepileall(btop, 2, &rand, &o);
- curve->points[i]->point = rand;
- curve->points[i]->order = o;
- npoints++;
- break;
- }
+ gerepileall(btop, 2, &rand, &o);
+ curve->points[i]->point = rand;
+ curve->points[i]->order = o;
+ npoints++;
+ break;
+ }
*/
int points_primet(curve_t *curve, config_t *config, arg_t *args) {
@@ -125,11 +125,14 @@ int points_primet(curve_t *curve, config_t *config, arg_t *args) {
for (long i = 0; i < nprimes; ++i) {
if (curve->points[i] == NULL && dvdis(ord, primes[i])) {
+ pari_sp ftop = avma;
+
GEN p = stoi(primes[i]);
GEN mul = divii(ord, p);
GEN point = ellmul(curve->curve, rand, mul);
curve->points[i] = point_new();
+ gerepileall(ftop, 2, &point, &p);
curve->points[i]->point = point;
curve->points[i]->order = p;
npoints++;
@@ -156,15 +159,18 @@ int points_prime(curve_t *curve, config_t *config, arg_t *args) {
for (long i = 1; i <= nprimes; ++i) {
if (curve->points[i - 1] == NULL && dvdii(ord, gel(primes, i))) {
+ pari_sp ftop = avma;
+
// primes[i] divides ord
// mul = ord/primes[i]
- GEN mul = divii(ord, gel(primes, i));
+ GEN p = gcopy(gel(primes, i));
+ GEN mul = divii(ord, p);
GEN point = ellmul(curve->curve, rand, mul);
- point_t *p = point_new();
- p->point = point;
- p->order = gel(primes, i);
- curve->points[i - 1] = p;
+ curve->points[i - 1] = point_new();
+ gerepileall(ftop, 2, &point, &p);
+ curve->points[i - 1]->point = point;
+ curve->points[i - 1]->order = p;
npoints++;
}
}
@@ -172,20 +178,3 @@ int points_prime(curve_t *curve, config_t *config, arg_t *args) {
return 1;
}
-
-int points_generators(curve_t *curve, config_t *config, arg_t *args) {
- // TODO stack code!!!
- GEN generators = ellff_get_gens(curve->curve);
- long len = glength(generators);
- curve->points = points_new((size_t)len);
- curve->npoints = (size_t)len;
-
- for (long i = 1; i <= len; ++i) {
- point_t *p = point_new();
- p->point = gel(generators, i);
- p->order = ellorder(curve->curve, p->point, NULL);
- curve->points[i - 1] = p;
- }
-
- return 1;
-}
diff --git a/src/math/point.h b/src/math/point.h
index fe9aeb4..9a0dd89 100644
--- a/src/math/point.h
+++ b/src/math/point.h
@@ -112,16 +112,4 @@ int points_primet(curve_t *curve, config_t *config, arg_t *args);
*/
int points_prime(curve_t *curve, config_t *config, arg_t *args);
-/**
- * GENERATOR(gen_t)
- * Calculates the minimal set of generators of the curve.(one or two points).
- * Always succeeds.
- *
- * @param curve
- * @param config
- * @param args unused
- * @return state diff
- */
-int points_generators(curve_t *curve, config_t *config, arg_t *args);
-
#endif // ECGEN_POINT_H
diff --git a/src/math/types.h b/src/math/types.h
index 575f583..70696ad 100644
--- a/src/math/types.h
+++ b/src/math/types.h
@@ -16,6 +16,7 @@ typedef struct seed_t { GEN seed; } seed_t;
typedef struct point_t {
GEN point;
GEN order;
+ GEN cofactor;
} point_t;
typedef struct curve_t {
@@ -25,6 +26,8 @@ typedef struct curve_t {
GEN b;
GEN curve;
GEN order;
+ point_t **generators;
+ size_t ngens;
point_t **points;
size_t npoints;
} curve_t;
@@ -36,6 +39,7 @@ enum curve_offset {
OFFSET_B,
OFFSET_CURVE,
OFFSET_ORDER,
+ OFFSET_GENERATORS,
OFFSET_POINTS,
OFFSET_END
};
@@ -45,7 +49,7 @@ typedef struct arg_t {
size_t nargs;
} arg_t;
-typedef int (*gen_t)(curve_t *, config_t *, arg_t *args);
+typedef int (*gen_t)(curve_t *, config_t *, arg_t *);
int gen_skip(curve_t *curve, config_t *config, arg_t *args);