aboutsummaryrefslogtreecommitdiff
path: root/src/obj
diff options
context:
space:
mode:
authorJ08nY2018-03-28 17:40:46 +0200
committerJ08nY2018-03-28 17:41:08 +0200
commitbfee3d1ef27c87424b8d5324926593c1d852b91e (patch)
tree3fbc4a67aab966b9e3053eb3db6cea4f032b2b88 /src/obj
parent97149b9104569f70dc0eec47e2e0df4d8d05022d (diff)
downloadecgen-bfee3d1ef27c87424b8d5324926593c1d852b91e.tar.gz
ecgen-bfee3d1ef27c87424b8d5324926593c1d852b91e.tar.zst
ecgen-bfee3d1ef27c87424b8d5324926593c1d852b91e.zip
Separate curve object functions into obj.
Diffstat (limited to 'src/obj')
-rw-r--r--src/obj/curve.c77
-rw-r--r--src/obj/curve.h53
2 files changed, 130 insertions, 0 deletions
diff --git a/src/obj/curve.c b/src/obj/curve.c
new file mode 100644
index 0000000..b052729
--- /dev/null
+++ b/src/obj/curve.c
@@ -0,0 +1,77 @@
+
+#include "curve.h"
+#include "gen/seed.h"
+#include "math/subgroup.h"
+#include "misc/types.h"
+#include "util/memory.h"
+
+curve_t *curve_new(void) { return try_calloc(sizeof(curve_t)); }
+
+curve_t *curve_copy(const curve_t *src, curve_t *dest) {
+ if (src->seed) dest->seed = seed_new_copy(src->seed);
+ if (src->field) dest->field = gcopy(src->field);
+ if (src->a) dest->a = gcopy(src->a);
+ if (src->b) dest->b = gcopy(src->b);
+ if (src->curve) dest->curve = gcopy(src->curve);
+ if (src->order) dest->order = gcopy(src->order);
+ if (src->generators) {
+ dest->generators = subgroups_new_copy(src->generators, src->ngens);
+ dest->ngens = src->ngens;
+ }
+ return dest;
+}
+
+curve_t *curve_new_copy(const curve_t *src) {
+ curve_t *result = curve_new();
+ return curve_copy(src, result);
+}
+
+curve_t *curve_clone(const curve_t *src, curve_t *dest) {
+ if (src->seed) dest->seed = seed_new_clone(src->seed);
+ if (src->field) dest->field = gclone(src->field);
+ if (src->a) dest->a = gclone(src->a);
+ if (src->b) dest->b = gclone(src->b);
+ if (src->curve) dest->curve = gclone(src->curve);
+ if (src->order) dest->order = gclone(src->order);
+ if (src->generators) {
+ dest->generators = subgroups_new_clone(src->generators, src->ngens);
+ dest->ngens = src->ngens;
+ }
+ return dest;
+}
+
+curve_t *curve_new_clone(const curve_t *src) {
+ curve_t *result = curve_new();
+ return curve_clone(src, result);
+}
+
+void curve_free(curve_t **curve) {
+ if (*curve) {
+ seed_free(&(*curve)->seed);
+ subgroups_free_deep(&(*curve)->generators, (*curve)->ngens);
+
+ if ((*curve)->curve) {
+ // TODO, this is possibly dangerous...
+ obj_free((*curve)->curve);
+ if (isclone((*curve)->curve)) {
+ gunclone((*curve)->curve);
+ }
+ }
+
+ if ((*curve)->field && isclone((*curve)->field)) {
+ gunclone((*curve)->field);
+ }
+ if ((*curve)->a && isclone((*curve)->a)) {
+ gunclone((*curve)->a);
+ }
+ if ((*curve)->b && isclone((*curve)->b)) {
+ gunclone((*curve)->b);
+ }
+ if ((*curve)->order && isclone((*curve)->order)) {
+ gunclone((*curve)->order);
+ }
+
+ try_free(*curve);
+ *curve = NULL;
+ }
+} \ No newline at end of file
diff --git a/src/obj/curve.h b/src/obj/curve.h
new file mode 100644
index 0000000..5d8886b
--- /dev/null
+++ b/src/obj/curve.h
@@ -0,0 +1,53 @@
+
+#ifndef ECGEN_OBJ_CURVE_H
+#define ECGEN_OBJ_CURVE_H
+
+#include "misc/types.h"
+
+/**
+ * Allocates and zeros out a new curve_t object.
+ * @return new curve
+ */
+curve_t *curve_new(void);
+
+/**
+ * Copies parameters from src curve to dest curve, allocates space for points.
+ * Otherwise expects everything to be allocated.
+ *
+ * @param src source curve
+ * @param dest destination curve
+ * @return destination curve
+ */
+curve_t *curve_copy(const curve_t *src, curve_t *dest);
+
+/**
+ *
+ * @param src
+ * @return
+ */
+curve_t *curve_new_copy(const curve_t *src);
+
+/**
+ *
+ * @param src
+ * @param dest
+ * @return
+ */
+curve_t *curve_clone(const curve_t *src, curve_t *dest);
+
+/**
+ *
+ * @param src
+ * @return
+ */
+curve_t *curve_new_clone(const curve_t *src);
+
+/**
+ * Free a curve_t along with it's seed_t and point_ts.
+ * @param curve to free
+ */
+void curve_free(curve_t **curve);
+
+#include "misc/types.h"
+
+#endif // ECGEN_OBJ_CURVE_H