MPHELL  5.0.0
mphell_tuto_weierstrass.c
Go to the documentation of this file.
1 /*
2  MPHELL-5.0
3  Author(s): The MPHELL team
4 
5  (C) Copyright 2015-2021 - Institut Fourier / Univ. Grenoble Alpes (France)
6 
7  This file is part of the MPHELL Library.
8  MPHELL is free software: you can redistribute it and/or modify
9  it under the terms of the GNU Lesser General Public License as published by
10  the Free Software Foundation, version 3 of the License.
11 
12  MPHELL is distributed in the hope that it will be useful,
13  but WITHOUT ANY WARRANTY; without even the implied warranty of
14  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15  GNU Lesser General Public License for more details.
16 
17  You should have received a copy of the GNU Lesser General Public License
18  along with MPHELL. If not, see <http://www.gnu.org/licenses/>.
19 */
20 
26 #include <stdio.h>
27 #include "mphell/mphell.h"
28 
29 int main()
30 {
31  /* Initialise MPHELL with 256 bits of security strength for the entropy, RANDOM_AES256 as DRBG and DEVURANDOM as entropy source */
32 
34 
35  /* Allocate a field of size 3*block_SIZE = 3*64 = 192 on 64 bits architecture */
36 
37  field k;
38  field_alloc(k, FP, bits_to_nblock(192), NULL);
39 
40  /* Allocate a number of size 3*block_SIZE = 3*64 = 192 on 64 bits architecture */
41 
42  number p;
43  number_init(&p, bits_to_nblock(192));
44 
45  /* Set the number p from a string in base 16 */
46 
47  number_set_str(p, "fffffffffffffffffffffffffffffffeffffffffffffffff", 16);
48 #if MPHELL_USE_AMNS == 1
49  amns AMNS;
50 #if MPHELL_USE_AMNS_32 == 0
51  amns_alloc_init_str(&AMNS, "[16, 4, [-2, 0, 0, 0, 1], 52, 6172336866035235830030737468594796900503843124202341567269, [276558595304361, 45414025950417, -34859774231597, -43697934106541], [15163021665183677629, 10328824020132901291, 3520630562803742874, 2017188797426544734], [175018852767439, 167878561785955, 39999505818260, -16528460836324], [197873551048475, 174802838528544, 29957080636796, 208984152402038]]", p);
52 #else
53  amns_alloc_init_str(&AMNS, "[1, 9, [-2, 0, 0, 0, 0, 0, 0, 0, 0, 1], 25, 778621639070749301272595529543640079614006395911121441202, [701093, -169839, 992868, -808873, -49859, -1298542, 346565, 1453220, 10927], [3371333987, 1139504849, 3063325107, 1068215102, 2225669310, 3489025068, 823765184, 3434826107, 24083075], [2398376, 1499579, -352758, -1034120, -179340, 1441412, 1982754, 1026111, 990222], [1506274, 1189710, -669416, 2638499, 1835063, 598693, 1905562, -10756, 308592]]", p);
54 #endif
55  field_set_amns(k, AMNS);
56 #endif
57 
58  /* Create the field of characteristic p */
59 
60  field_create(k, "", STACK_1, 1, p);
61 
62  /* Allocate curve */
63 
64  ec_curve E;
65  ec_alloc(E, k);
66  ec_init(E, k);
67 
68  /* Create curve */
69 
70  field_elt a, b;
71  ec_point G;
72  number h, n;
73 
74  field_elt_alloc(&a, k);
75  field_elt_init(a, k);
76  field_elt_alloc(&b, k);
77  field_elt_init(b, k);
78  ec_point_alloc(G, k);
79  ec_point_init(G, k);
80  number_init(&h, bits_to_nblock(192));
81  number_init(&n, bits_to_nblock(192));
82 
83  field_elt_set_str(a, "fffffffffffffffffffffffffffffffefffffffffffffffc", 16, false, k, STACK_1);
84  field_elt_set_str(b, "64210519e59c80e70fa7e9ab72243049feb8deecc146b9b1", 16, false, k, STACK_1);
85  ec_point_set_aff_str(G, "188da80eb03090f67cbf20eb43a18800f4ff0afd82ff1012", "07192b95ffc8da78631011ed6b24cdd573f977a11e794811", false, 16, WEIERSTRASS, k, STACK_1);
86  number_set_str(h, "000000000000000000000000000000000000000000000001", 16);
87  number_set_str(n, "ffffffffffffffffffffffff99def836146bc9b1b4d22831", 16);
88 
89  ec_create(E, "Weierstrass_test", k, a, b, G, h, n, WEIERSTRASS, PROJECTIVE, STACK_1);
90 
91  printf("E: \n"); ec_curve_print(E, 16, STACK_1); printf("\n");
92 
93  field_elt_free(&a, k);
94  field_elt_free(&b, k);
95  ec_point_free(G, k);
96  number_free(&n);
97  number_free(&h);
98 
99  /* Allocate element of the field k */
100 
101  ec_point x;
102  ec_point y;
103  ec_point res;
104  ec_point_alloc(x, k);
105  ec_point_init(x, k);
106  ec_point_alloc(y, k);
107  ec_point_init(y, k);
108  ec_point_alloc(res, k);
109  ec_point_init(res, k);
110 
111  /* Set field element from string in base 16, which are not under Montgomery form */
112 
113  ec_point_set_aff_str(x, "3a6e0e0135079698f34344bb2261a5fa0730419b639b45ca", "52c86dc001c77804f6a1e9ab8e5ac4627727919a68993692", false, 16, WEIERSTRASS, k, STACK_1);
114  ec_point_set_aff_str(y, "8cf9058484386d660331a5ef852002360c00d5c940010c33", "2ec3235f6b5eeec13bc3c206b47e60cf715966c67c6e292a", false, 16, WEIERSTRASS, k, STACK_1);
115 
116  /* Addition */
117 
118  ec_point_add(res, x, y, E, STACK_1);
119  printf("x+y = "); ec_point_print(res, 16, true, k, STACK_1); printf("\n");
120  printf("x+y belongs to E : %d\n\n", ec_belongs(res, E, STACK_1));
121 
122  /* Substraction */
123 
124  ec_point_sub(res, x, y, E, STACK_1);
125  printf("x-y = "); ec_point_print(res, 16, true, k, STACK_1); printf("\n");
126  printf("x-y belongs to E : %d\n\n", ec_belongs(res, E, STACK_1));
127 
128  /* Doubling */
129 
130  ec_point_dbl(res, x, E, STACK_1);
131  printf("x*2 = "); ec_point_print(res, 16, true, k, STACK_1); printf("\n");
132  printf("x*2 belongs to E : %d\n\n", ec_belongs(res, E, STACK_1));
133 
134  /* Negation */
135 
136  ec_point_neg(res, x, E);
137  printf("-x = "); ec_point_print(res, 16, true, k, STACK_1); printf("\n");
138  printf("-x belongs to E : %d\n\n", ec_belongs(res, E, STACK_1));
139 
140  /* Scalar Multiplication */
141 
142  number m;
143  number_init(&m, 3);
144  number_set_str(m, "3a6e0e0135079698f34344bb2261a5fa0730419b639b45ca", 16);
145  ec_point_mul(res, m, x, E, STACK_1);
146  printf("x*3a6e0e0135079698f34344bb2261a5fa0730419b639b45ca = "); ec_point_print(res, 16, true, k, STACK_1); printf("\n");
147  printf("x*3a6e0e0135079698f34344bb2261a5fa0730419b639b45ca belongs to E : %d\n\n", ec_belongs(res, E, STACK_1));
148  number_free(&m);
149 
150 
151  /* Random point */
152 
153  ec_point_random(res, E, STACK_1);
154  printf("random point, res = "); ec_point_print(res, 16, true, k, STACK_1); printf("\n");
155  printf("res belongs to E : %d\n\n", ec_belongs(res, E, STACK_1));
156 
157  ec_point_free(res, k);
158  number_free(&p);
159  ec_point_free(x, k);
160  ec_point_free(y, k);
161  field_free(k);
162 #if MPHELL_USE_AMNS == 1
163  amns_free(&AMNS);
164 #endif
165  ec_free(E);
166  free_mphell();
167 
168  return 0;
169 }
void amns_free(amns_ptr *AMNS)
Free the amns system.
Definition: mphell-amns.c:444
void amns_alloc_init_str(amns_ptr *AMNS, char *str, number p)
Allocate and initialise the amns system from the string generated by the Sage AMNS generator from htt...
Definition: mphell-amns.c:1242
void ec_curve_print(ec_curve_srcptr E, const uint8_t base, uint8_t stack)
Print a description of E.
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.
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)
Definition: mphell-curve.c:65
bool ec_belongs(ec_point_srcptr P, ec_curve_srcptr E, uint8_t stack)
Test if P belongs to E.
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 ec_point_random(ec_point_ptr P, ec_curve_srcptr E, uint8_t stack)
Create a random point P on the elliptic curve E.
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 ec_free(ec_curve_ptr E)
Free the elliptic curve E.
Definition: mphell-curve.c:809
void ec_init(ec_curve_ptr E, field_srcptr k)
Initialise a curve.
Definition: mphell-curve.c:55
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_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.
Definition: mphell-curve.c:913
void ec_point_neg(ec_point_ptr P3, ec_point_srcptr P1, ec_curve_srcptr E)
Set P3 to -P1.
void ec_point_init(ec_point_ptr P, field_srcptr k)
Initialise an elliptic curve point.
Definition: mphell-curve.c:842
void ec_point_free(ec_point_ptr P, field_srcptr k)
Free the point P.
Definition: mphell-curve.c:858
void ec_point_alloc(ec_point_ptr P, field_srcptr k)
Allocate an elliptic curve point.
Definition: mphell-curve.c:834
void ec_alloc(ec_curve_ptr E, field_srcptr k)
Allocate a curve.
Definition: mphell-curve.c:37
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)
@ WEIERSTRASS
Definition: mphell-curve.h:41
@ PROJECTIVE
Definition: mphell-curve.h:58
@ DEVURANDOM
void field_elt_free(fe_ptr *src, field_srcptr k)
Free space used by src.
Definition: mphell-field.c:348
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.
Definition: mphell-field.c:37
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...
Definition: mphell-field.c:516
void field_elt_init(fe_ptr dst, field_srcptr k)
Initialise the field element.
Definition: mphell-field.c:291
void field_elt_alloc(fe_ptr *dst, field_srcptr k)
Allocate space for a field element.
Definition: mphell-field.c:269
void field_free(field_ptr k)
Free the space of the field informations structure.
Definition: mphell-field.c:194
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.
Definition: mphell-field.c:87
field_t field[1]
Address of a field structure.
Definition: mphell-field.h:86
fp_elt * field_elt
Generic field element.
Definition: mphell-field.h:37
@ FP
Definition: mphell-field.h:57
void free_mphell()
Free MPHELL memory, especially the big amount of temporary memory.
Definition: mphell-init.c:97
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).
Definition: mphell-init.c:35
void number_free(number *dst)
Free a number_ptr allocated on the RAM memory (malloc)
Definition: mphell-number.c:75
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)
Definition: mphell-number.c:59
@ RANDOM_AES256
Definition: mphell-random.h:39
uint8_t bits_to_nblock(const uint16_t nbits)
Return the number of blocks required to store a nbits number.
Definition: mphell-util.c:29
Define a AMNS.
Definition: mphell-amns.h:81
Define an elliptic curve.
Definition: mphell-curve.h:141
Define an elliptic curve point.
Definition: mphell-curve.h:105