diff options
| author | J08nY | 2018-03-28 17:40:46 +0200 |
|---|---|---|
| committer | J08nY | 2018-03-28 17:41:08 +0200 |
| commit | bfee3d1ef27c87424b8d5324926593c1d852b91e (patch) | |
| tree | 3fbc4a67aab966b9e3053eb3db6cea4f032b2b88 /src/obj | |
| parent | 97149b9104569f70dc0eec47e2e0df4d8d05022d (diff) | |
| download | ecgen-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.c | 77 | ||||
| -rw-r--r-- | src/obj/curve.h | 53 |
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 |
