aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJ08nY2017-10-01 02:56:56 +0200
committerJ08nY2017-10-01 02:56:56 +0200
commit7f2aee83a9d5771b4c8bfd5d32d1eaa1e96398fa (patch)
treedf19debd7b25f570a0ab4cc72fea2ec89121d229
parent6fea41693fa19734747103b5cf4d681613090bc1 (diff)
downloadecgen-7f2aee83a9d5771b4c8bfd5d32d1eaa1e96398fa.tar.gz
ecgen-7f2aee83a9d5771b4c8bfd5d32d1eaa1e96398fa.tar.zst
ecgen-7f2aee83a9d5771b4c8bfd5d32d1eaa1e96398fa.zip
-rw-r--r--src/gen/gp.c56
-rw-r--r--src/gen/gp.h10
2 files changed, 66 insertions, 0 deletions
diff --git a/src/gen/gp.c b/src/gen/gp.c
index dff7ca1..7824a42 100644
--- a/src/gen/gp.c
+++ b/src/gen/gp.c
@@ -117,4 +117,60 @@ GENERATOR(gp_gen) {
break;
}
return 1;
+}
+
+CHECK(gp_check) {
+ HAS_ARG(args);
+ pari_sp ltop = avma;
+ GEN closure = compile_str(args->args);
+ GEN params = zerovec(state - OFFSET_SEED + 1);
+
+ if (state >= OFFSET_SEED) {
+ if (curve->seed && curve->seed->seed) {
+ gel(params, 1) = bits_to_bitvec(curve->seed->seed);
+ }
+ }
+
+ if (state >= OFFSET_FIELD) {
+ gel(params, 2) = curve->field;
+ }
+
+ if (state >= OFFSET_A) {
+ gel(params, 3) = curve->a;
+ }
+
+ if (state >= OFFSET_B) {
+ gel(params, 4) = curve->b;
+ }
+
+ if (state >= OFFSET_CURVE) {
+ gel(params, 5) = curve->curve;
+ }
+
+ if (state >= OFFSET_ORDER) {
+ gel(params, 6) = curve->order;
+ }
+
+ if (state >= OFFSET_GENERATORS) {
+ GEN gens = zerovec(curve->ngens);
+ for (size_t i = 0; i < curve->ngens; ++i) {
+ gel(gens, i + 1) = curve->generators[i]->point;
+ }
+ gel(params, 7) = gens;
+ }
+
+ if (state >= OFFSET_POINTS) {
+ GEN points = zerovec(curve->npoints);
+ for (size_t i = 0; i < curve->npoints; ++i) {
+ gel(points, i + 1) = curve->points[i]->point;
+ }
+ gel(params, 8) = points;
+ }
+
+ GEN res = call0(closure, zerovec(0));
+ res = call0(res, params);
+
+ int result = (int)itos(res);
+ avma = ltop;
+ return result;
} \ No newline at end of file
diff --git a/src/gen/gp.h b/src/gen/gp.h
index c0ee1af..2f2f59d 100644
--- a/src/gen/gp.h
+++ b/src/gen/gp.h
@@ -16,4 +16,14 @@
*/
GENERATOR(gp_gen);
+/**
+ * @brief
+ * @param curve
+ * @param cfg
+ * @param args
+ * @param state
+ * @return
+ */
+CHECK(gp_check);
+
#endif // ECGEN_GP_H