27 #include "mphell/mphell.h" 47 number_set_str(p,
"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffed", 16);
75 field_elt_set_str(b,
"2dfc9311d490018c7338bf8688861767ff8ff5b2bebe27548a14b235eca6874a", 16,
false, k, STACK_1);
77 ec_point_set_aff_str(G,
"159a6849e44c3c7f061b3d570fc4ed5b5d14c8ba4253df49cc7edf80f533ad9b",
"6666666666666666666666666666666666666666666666666666666666666658",
false, 16,
EDWARDS, k, STACK_1);
78 number_set_str(h,
"0000000000000000000000000000000000000000000000000000000000000008", 16);
79 number_set_str(n,
"1000000000000000000000000000000014def9dea2f79cd65812631a5cf5d3ed", 16);
81 ec_create (E,
"Edwards_test", k, a, b, G, h, n,
EDWARDS,
EXTENDED_EDWARDS, STACK_1);
105 ec_point_set_aff_str(x,
"67e82d6ecfec167788bc76ffc0165be5b3b5ac785f5bd1d2c427fa5c4ef02548",
"5f6b282c46a137a1d612df50487cfa27a4b4df2c77bf6f12e56ec667ee37b181",
false, 16,
EDWARDS, k, STACK_1);
106 ec_point_set_aff_str(y,
"1ec6d017b0d11bd1d1b5cfefebfccbc8c8079e0f1030008a2e75207b77a987e6",
"20bbd47f960781e9e13ea7cff81a4f5bec6106453cbae87abd3018d7803539be",
false, 16,
EDWARDS, k, STACK_1);
111 printf(
"x+y = ");
ec_point_print(res, 16,
true, k, STACK_1); printf(
"\n");
112 printf(
"x+y belongs to E : %d\n\n",
ec_belongs(res, E, STACK_1));
117 printf(
"x-y = ");
ec_point_print(res, 16,
true, k, STACK_1); printf(
"\n");
118 printf(
"x-y belongs to E : %d\n\n",
ec_belongs(res, E, STACK_1));
123 printf(
"x*2 = ");
ec_point_print(res, 16,
true, k, STACK_1); printf(
"\n");
124 printf(
"x*2 belongs to E : %d\n\n",
ec_belongs(res, E, STACK_1));
129 printf(
"-x = ");
ec_point_print(res, 16,
true, k, STACK_1); printf(
"\n");
130 printf(
"-x belongs to E : %d\n\n",
ec_belongs(res, E, STACK_1));
136 number_set_str(n1,
"67e82d6ecfec167788bc76ffc0165be5b3b5ac785f5bd1d2c427fa5c4ef02551", 16);
138 printf(
"x*67e82d6ecfec167788bc76ffc0165be5b3b5ac785f5bd1d2c427fa5c4ef02551 = ");
ec_point_print(res, 16,
true, k, STACK_1); printf(
"\n");
139 printf(
"x*67e82d6ecfec167788bc76ffc0165be5b3b5ac785f5bd1d2c427fa5c4ef02551 belongs to E : %d\n\n",
ec_belongs(res, E, STACK_1));
145 printf(
"random point, res = ");
ec_point_print(res, 16,
true, k, STACK_1); printf(
"\n");
146 printf(
"res belongs to E : %d\n\n",
ec_belongs(res, E, STACK_1));
157 printf(
"the image point on a weierstrass curve, convP=");
ec_point_print(convP, 16,
true, k, STACK_1); printf(
"\n");
168 printf(
"convC: \n");
ec_curve_print(convC, 16, STACK_1); printf(
"\n");
bool ec_belongs(ec_point_srcptr P, ec_curve_srcptr E, uint8_t stack)
Test if P belongs to E.
fp_elt * field_elt
Generic field element.
void free_mphell()
Free MPHELL memory, especially the big amount of temporary memory.
void ec_create(ec_curve_ptr E, const char *id_curve, field_srcptr k, fe_srcptr a, fe_srcptr b, ec_point_srcptr G, number_srcptr h, number_srcptr n, const ec_type type, const ec_formula f, uint8_t stack)
Create an elliptic curve E, the curve must be allocated and initialised (ec_alloc & ec_init)
void field_elt_free(fe_ptr *src, field_srcptr k)
Free space used by src.
void init_mphell(const uint16_t security_strength, const random_type type, const entropy_type entropy)
Initialise MPHELL with security_strength bits of security (for random number only).
Define an elliptic curve point.
void ec_point_alloc(ec_point_ptr P, field_srcptr k)
Allocate an elliptic curve point.
void edwards_to_weierstrass(ec_curve_ptr E_res, ec_curve_srcptr E, uint8_t stack)
Convert the Edwards elliptic curve E to the corresponding Weierstrass elliptic curve E_res.
void ec_point_neg(ec_point_ptr P3, ec_point_srcptr P1, ec_curve_srcptr E)
Set P3 to -P1.
void ec_init(ec_curve_ptr E, field_srcptr k)
Initialise a curve.
void ec_point_print(ec_point_srcptr P, const uint8_t base, const bool lift, field_srcptr k, uint8_t stack)
Print a description of P.
uint8_t bits_to_nblock(const uint16_t nbits)
Return the number of blocks required to store a nbits number.
void field_elt_alloc(fe_ptr *dst, field_srcptr k)
Allocate space for a field element.
void ec_point_init(ec_point_ptr P, field_srcptr k)
Initialise an elliptic curve point.
field_t field[1]
Address of a field structure.
void ec_point_add(ec_point_ptr P3, ec_point_srcptr P1, ec_point_srcptr P2, ec_curve_srcptr E, uint8_t stack)
Set P3 to P1 + P2, using dedicated formulae (not protected against SPA, but faster)
void number_free(number *dst)
Free a number_ptr allocated on the RAM memory (malloc)
void ec_point_free(ec_point_ptr P, field_srcptr k)
Free the point P.
void ec_free(ec_curve_ptr E)
Free the elliptic curve E.
void field_elt_set_one(fe_ptr dst, field_srcptr k)
Set dst to one (or its Montgomery form if Montgomery arithmetic is used)
void field_create(field_ptr k, const char *id, uint8_t stack, const uint32_t n,...)
Initialize the different fields of the structure pointed by k.
void ec_point_set_aff_str(ec_point_ptr P, const char *str_x, const char *str_y, const bool is_reduced, const uint8_t base, const ec_type type, field_srcptr k, uint8_t stack)
Set a point from its affine coordinates under string format.
void ec_point_dbl(ec_point_ptr P3, ec_point_srcptr P1, ec_curve_srcptr E, uint8_t stack)
Set P3 to 2*P1, using dedicated formulae (not protected against SPA, but faster)
void ec_alloc(ec_curve_ptr E, field_srcptr k)
Allocate a curve.
void edwards_point_to_weierstrass_point(ec_point_ptr dst, ec_point_srcptr P, ec_curve_srcptr E, uint8_t stack)
Convert the Edwards point P of the elliptic curve E to the corresponding Weierstrass elliptic curve p...
void field_alloc(field_ptr k, const field_type type, const uint8_t size, field_ptr base)
Allocates space for the different fields of the structure pointed by k.
void ec_point_mul(ec_point_ptr P3, number_srcptr n, ec_point_srcptr P1, ec_curve_srcptr E, uint8_t stack)
Set P3 to n * P1 using Montgomery for Weierstrass elliptic curve, and naive method for other elliptic...
void field_elt_init(fe_ptr dst, field_srcptr k)
Initialise the field element.
void ec_curve_print(ec_curve_srcptr E, const uint8_t base, uint8_t stack)
Print a description of E.
void number_set_str(number_ptr dst, const char *str, const uint8_t base)
Set dst to str.
void number_init(number *dst, const uint8_t n)
Allocate a number_ptr on the RAM memory (malloc)
void field_free(field_ptr k)
Free the space of the field informations structure.
void ec_point_random(ec_point_ptr P, ec_curve_srcptr E, uint8_t stack)
Create a random point P on the elliptic curve E.
Define an elliptic curve.
void field_elt_set_str(fe_ptr dst, const char *str, const uint8_t base, const bool isreduced, field_srcptr k, uint8_t stack)
Set dst to str, if Montgomery arithmetic is used, is_reduced == false -> transform dst into its Montg...
void ec_point_sub(ec_point_ptr P3, ec_point_srcptr P1, ec_point_srcptr P2, ec_curve_srcptr E, uint8_t stack)
Set P3 to P1 - P2, using dedicated formulae (not protected against SPA, but faster)