MPHELL  4.0.0
mphell-fp3.c
Go to the documentation of this file.
1 /*
2  MPHELL-4.0
3  Author(s): The MPHELL team
4 
5  (C) Copyright 2015-2018 - 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 "mphell-fp3.h"
27 
28 /*************************************DEBUG***********************************/
29 
39 void
40 fp3_elt_print (fp3_elt_srcptr src, const uint8_t base, const bool lift, const fp3_param param, uint8_t stack)
41 {
42  char *str;
43  fp3_elt_str(&str, src, base, lift, param, stack);
44  printf("%s", str);
45  free(str);
46 }
47 
48 /**************************************TMP************************************/
49 
50 void
51 fp3_elt_get_pool_elt (fp3_elt * dst, const fp3_param param, uint8_t stack)
52 {
53  fp_elt_get_pool_elt(&(dst->v0), param->base, stack);
54  fp_elt_get_pool_elt(&(dst->v1), param->base, stack);
55  fp_elt_get_pool_elt(&(dst->v2), param->base, stack);
56 }
57 
58 void
59 fp3_elt_relax_pool_elt (fp3_elt * dst, const fp3_param param, uint8_t stack)
60 {
61  fp_elt_relax_pool_elt(&(dst->v0), param->base, stack);
62  fp_elt_relax_pool_elt(&(dst->v1), param->base, stack);
63  fp_elt_relax_pool_elt(&(dst->v2), param->base, stack);
64 }
65 
66 /************************************SETTERS**********************************/
67 
68 void
69 fp3_alloc (fp3_param param, const fp_param base)
70 {
71  param->size = base->size;
72  param->base = base;
73  number_init(&(param->q), 3 * (param->size));
74  fp_elt_alloc(&(param->non_residue), base);
75  fp_elt_init(param->non_residue, base);
76  fp3_elt_alloc(&(param->non_res), param);
77  fp3_elt_init(&(param->non_res), param);
78  fp3_elt_alloc(&(param->gen_sylow), param);
79  fp3_elt_init(&(param->gen_sylow), param);
80  number_init(&(param->p_odd), 3 * (param->size));
81 }
82 
89 void
90 fp3_prepare_sqrt(fp3_param param, uint8_t stack)
91 {
92  do
93  {
94  fp3_elt_random(&(param->non_res), param, stack);
95  } while (fp3_elt_issquare(&(param->non_res), param, stack));
96 
97  number_dec(param->p_odd, param->q);
98  param->p_even = 0;
99  while (number_iseven(param->p_odd))
100  {
101  ++(param->p_even);
102  number_rshift(param->p_odd, param->p_odd, 1);
103  }
104  fp3_elt_pow_number(&(param->gen_sylow), &(param->non_res), param->p_odd, param, stack);
105 }
106 
107 void
108 fp3_create (fp3_param param, const fp_param base, fp_elt_srcptr non_residue, uint8_t stack)
109 {
110  param->base = base;
111  number tmp;
112  number_tmp_alloc(&tmp, (base->size)*2, stack);
113  number_sqr(tmp, base->p);
114  number_mul(param->q, tmp, base->p);
115  fp_elt_copy(param->non_residue, non_residue, param->base);
116  fp3_prepare_sqrt(param, stack);
117  number_tmp_free(&tmp, (base->size)*2, stack);
118  /* For FLT */
119 /* number pm2;*/
120 /* number_tmp_alloc(&pm2, 3*number_block_size(base->p), stack);*/
121 /* number_dec(pm2, base->p);*/
122 /* number_mul(pm2, pm2, base->p);*/
123 /* number_mul(pm2, pm2, base->p);*/
124 /* number_dec(pm2, pm2);*/
125 /* number_str(&(param->pm2), pm2, 2);*/
126 /* number_tmp_free(&pm2, 3*number_block_size(base->p), stack);*/
127 
128 }
129 
130 void
131 fp3_copy (fp3_param param_res, const fp3_param param)
132 {
133  param_res->base = param->base;
134  number_copy(param_res->q, param->q);
135  fp_elt_copy(param_res->non_residue, param->non_residue, param->base);
136  fp3_elt_copy(&(param_res->non_res), &(param->non_res), param);
137  fp3_elt_copy(&(param_res->gen_sylow), &(param->gen_sylow), param);
138  number_copy(param_res->p_odd, param->p_odd);
139  param_res->p_even = param->p_even;
140 }
141 
142 void
144 {
145  param->base = NULL;
146  number_free(&(param->q));
147  fp_elt_free(&(param->non_residue));
148  param->size = (uint8_t)0;
149  fp3_elt_free(&(param->non_res));
150  fp3_elt_free(&(param->gen_sylow));
151  number_free(&(param->p_odd));
152  param->p_even = (uint32_t)0;
153 }
154 
155 void
156 fp3_get_characteristic (number_ptr c, const fp3_param param)
157 {
158  fp_get_characteristic (c, param->base);
159 }
160 
161 void
162 fp3_get_size (number_ptr c, const fp3_param param)
163 {
164  number_copy(c, param->q);
165 }
166 
167 /*void*/
168 /*fp3_get_pm2 (char * str, const fp3_param param)*/
169 /*{*/
170 /* strcpy(str, param->pm2);*/
171 /*}*/
172 
173 void
174 fp3_elt_alloc (fp3_elt * dst, const fp3_param param)
175 {
176  fp_elt_alloc(&(dst->v0), param->base);
177  fp_elt_alloc(&(dst->v1), param->base);
178  fp_elt_alloc(&(dst->v2), param->base);
179 }
180 
181 void
183 {
184  fp_elt_init(dst->v0, param->base);
185  fp_elt_init(dst->v1, param->base);
186  fp_elt_init(dst->v2, param->base);
187 }
188 
189 void
191 {
192  fp_elt_copy(dst->v0, src->v0, param->base);
193  fp_elt_copy(dst->v1, src->v1, param->base);
194  fp_elt_copy(dst->v2, src->v2, param->base);
195 }
196 
197 void
199 {
200  fp_elt_clear(&(src->v0));
201  fp_elt_clear(&(src->v1));
202  fp_elt_clear(&(src->v2));
203 }
204 
205 void
207 {
208  fp_elt_free(&(src->v0));
209  fp_elt_free(&(src->v1));
210  fp_elt_free(&(src->v2));
211 }
212 
213 void
215 {
216  fp_elt_set_one(dst->v0, param->base);
217  fp_elt_set_zero(dst->v1, param->base);
218  fp_elt_set_zero(dst->v2, param->base);
219 }
220 
221 void
222 fp3_elt_set_ui (fp3_elt_ptr dst, const uint64_t src, const bool isreduced,
223  const fp3_param param, uint8_t stack)
224 {
225  fp_elt_set_ui(dst->v0, src, isreduced, param->base, stack);
226  fp_elt_set_zero(dst->v1, param->base);
227  fp_elt_set_zero(dst->v2, param->base);
228 }
229 
230 void
231 fp3_elt_set_number (fp3_elt_ptr dst, number_srcptr src, const bool isreduced,
232  const fp3_param param, uint8_t stack)
233 {
234  fp_elt_set_number(dst->v0, src, isreduced, param->base, stack);
235  fp_elt_set_zero(dst->v1, param->base);
236  fp_elt_set_zero(dst->v2, param->base);
237 }
238 
239 void
240 fp3_elt_set_fp_elt (fp3_elt_ptr dst, fp_elt_srcptr src, const fp3_param param)
241 {
242  fp_elt_copy(dst->v0, src, param->base);
243  fp_elt_set_zero(dst->v1, param->base);
244  fp_elt_set_zero(dst->v2, param->base);
245 }
246 
247 void
248 fp3_elt_set (fp3_elt_ptr dst, number_srcptr src1, number_srcptr src2,
249  number_srcptr src3, const bool isreduced, const fp3_param param, uint8_t stack)
250 {
251  fp_elt_set_number(dst->v0, src1, isreduced, param->base, stack);
252  fp_elt_set_number(dst->v1, src2, isreduced, param->base, stack);
253  fp_elt_set_number(dst->v2, src3, isreduced, param->base, stack);
254 }
255 
256 void
257 fp3_elt_set_fp_elts (fp3_elt_ptr dst, fp_elt_srcptr src1, fp_elt_srcptr src2, fp_elt_srcptr src3, const fp3_param param)
258 {
259  fp_elt_copy(dst->v0, src1, param->base);
260  fp_elt_copy(dst->v1, src2, param->base);
261  fp_elt_copy(dst->v2, src3, param->base);
262 }
263 
264 void
265 fp3_elt_set_str (fp3_elt_ptr dst, const char *str, const uint8_t base,
266  const bool isreduced, const fp3_param param, uint8_t stack)
267 {
268  char *s = (char*) malloc(sizeof(char)*strlen(str)+10);
269  char *mem = s;
270  strcpy(s, str);
271 
272  char *str1, *str2, *str3 = NULL;
273  str1 = strsep(&s, ",");
274  str2 = strsep(&s, ",");
275  str3 = strsep(&s, ",");
276  MPHELL_ASSERT_ALWAYS((str1!= NULL) && (str2 != NULL) && (str3 != NULL),
277  "fp3_elt_set_str : invalid string");
278  fp_elt_set_str(dst->v0, str1, base, isreduced, param->base, stack);
279  fp_elt_set_str(dst->v1, str2, base, isreduced, param->base, stack);
280  fp_elt_set_str(dst->v2, str3, base, isreduced, param->base, stack);
281  free(mem);
282 }
283 
284 void
285 fp3_elt_random (fp3_elt_ptr dst, const fp3_param param, uint8_t stack)
286 {
287  fp_elt_random(dst->v0, param->base, stack);
288  fp_elt_random(dst->v1, param->base, stack);
289  fp_elt_random(dst->v2, param->base, stack);
290 }
291 
292 void
293 fp3_elt_lift (fp3_elt_ptr dst, fp3_elt_srcptr src, const fp3_param param, uint8_t stack)
294 {
295  fp_elt_lift(dst->v0, src->v0, param->base, stack);
296  fp_elt_lift(dst->v1, src->v1, param->base, stack);
297  fp_elt_lift(dst->v2, src->v2, param->base, stack);
298 }
299 
300 void
301 fp3_str (char **str, const fp3_param param, const uint8_t base, uint8_t stack)
302 {
303  char *base_str, *non_residue_str, *q_str;
304 
305  fp_str(&base_str, param->base, base, stack);
306  number_str(&q_str, param->q, base);
307  fp_elt_str(&non_residue_str, param->non_residue, base, true, param->base, stack);
308 
309  *str = (char*)malloc(100 + strlen(base_str) + strlen(q_str) +
310  strlen(non_residue_str));
311  char *s = *str;
312  sprintf(s, "base parameter \n%s\nnon residue quadratic = %s\norder = %s",
313  base_str, non_residue_str, q_str);
314 
315  free(base_str);
316  free(q_str);
317  free(non_residue_str);
318 }
319 
320 void
321 fp3_elt_str (char **str, fp3_elt_srcptr src, const uint8_t base,
322  const bool lift, const fp3_param param, uint8_t stack)
323 {
324  char *str1, *str2, *str3;
325  fp_elt_str(&str1, src->v0, base, lift, param->base, stack);
326  fp_elt_str(&str2, src->v1, base, lift, param->base, stack);
327  fp_elt_str(&str3, src->v2, base, lift, param->base, stack);
328  *str = malloc(strlen(str1) + strlen(str2) + strlen(str3) + 10);
329  sprintf(*str, "%s,%s,%s", str1, str2, str3);
330  free(str1);
331  free(str2);
332  free(str3);
333 }
334 
335 /*************************COMPARISON AND LOGICAL******************************/
336 
337 int8_t
338 fp3_elt_cmp_fp_elt (fp3_elt_srcptr src1, fp_elt_srcptr src2, const fp3_param param)
339 {
340  if((!fp_elt_iszero(src1->v2, param->base)) || (!fp_elt_iszero(src1->v1, param->base)))
341  {
342  return 1;
343  }
344  return fp_elt_cmp(src1->v0, src2, param->base);
345 }
346 
347 int8_t
349 {
350  int8_t res = fp_elt_cmp(src1->v2, src2->v2, param->base);
351  if(res == 0)
352  {
353  res = fp_elt_cmp(src1->v1, src2->v1, param->base);
354  if(res == 0)
355  {
356  return fp_elt_cmp(src1->v0, src2->v0, param->base);
357  }
358  else
359  {
360  return res;
361  }
362  }
363  else
364  {
365  return res;
366  }
367 }
368 
369 bool
371 {
372  return (fp_elt_isone(src->v0, param->base) && fp_elt_iszero(src->v1, param->base) &&
373  fp_elt_iszero(src->v2, param->base));
374 }
375 
376 bool
378 {
379  return (fp_elt_iszero(src->v0, param->base) && fp_elt_iszero(src->v1, param->base) &&
380  fp_elt_iszero(src->v2, param->base));
381 }
382 
383 /***************************ADDITION SUBTRACTION******************************/
384 
385 void
387 {
388  fp_elt_inc(dst->v0, src->v0, param->base);
389  fp_elt_copy(dst->v1, src->v1, param->base);
390  fp_elt_copy(dst->v2, src->v2, param->base);
391 }
392 
393 void
394 fp3_elt_add_fp_elt (fp3_elt_ptr dst, fp3_elt_srcptr src1, fp_elt_srcptr src2,
395  const fp3_param param)
396 {
397  fp_elt_add(dst->v0, src1->v0, src2, param->base);
398  fp_elt_copy(dst->v1, src1->v1, param->base);
399  fp_elt_copy(dst->v2, src1->v2, param->base);
400 }
401 
402 void
404  const fp3_param param)
405 {
406  fp_elt_add(dst->v0, src1->v0, src2->v0, param->base);
407  fp_elt_add(dst->v1, src1->v1, src2->v1, param->base);
408  fp_elt_add(dst->v2, src1->v2, src2->v2, param->base);
409 }
410 
411 void
413 {
414  fp_elt_dec(dst->v0, src->v0, param->base);
415  fp_elt_copy(dst->v1, src->v1, param->base);
416  fp_elt_copy(dst->v2, src->v2, param->base);
417 }
418 
419 void
420 fp3_elt_sub_fp_elt (fp3_elt_ptr dst, fp3_elt_srcptr src1, fp_elt_srcptr src2,
421  const fp3_param param)
422 {
423  fp_elt_sub(dst->v0, src1->v0, src2, param->base);
424  fp_elt_copy(dst->v1, src1->v1, param->base);
425  fp_elt_copy(dst->v2, src1->v2, param->base);
426 }
427 
428 void
430  const fp3_param param)
431 {
432  fp_elt_sub(dst->v0, src1->v0, src2->v0, param->base);
433  fp_elt_sub(dst->v1, src1->v1, src2->v1, param->base);
434  fp_elt_sub(dst->v2, src1->v2, src2->v2, param->base);
435 }
436 
437 void
438 fp3_elt_neg_fp_elt (fp3_elt_ptr dst, fp_elt_srcptr src, const fp3_param param)
439 {
440  fp_elt_neg(dst->v0, src, param->base);
441  fp_elt_set_zero(dst->v1, param->base);
442  fp_elt_set_zero(dst->v2, param->base);
443 }
444 
445 void
447 {
448  fp_elt_neg(dst->v0, src->v0, param->base);
449  fp_elt_neg(dst->v1, src->v1, param->base);
450  fp_elt_neg(dst->v2, src->v2, param->base);
451 }
452 
453 /*******************************MULTIPLICATION********************************/
454 
455 void
456 fp3_elt_mul_fp_elt (fp3_elt_ptr dst, fp3_elt_srcptr src1, fp_elt_srcptr src2,
457  const fp3_param param, uint8_t stack)
458 {
459  fp_elt_mul(dst->v0, src1->v0, src2, param->base, stack);
460  fp_elt_mul(dst->v1, src1->v1, src2, param->base, stack);
461  fp_elt_mul(dst->v2, src1->v2, src2, param->base, stack);
462 }
463 
464 void
466  const fp3_param param)
467 {
468  fp_elt_mul2(dst->v0, src->v0, param->base);
469  fp_elt_mul2(dst->v1, src->v1, param->base);
470  fp_elt_mul2(dst->v2, src->v2, param->base);
471 }
472 
473 void
475  const fp3_param param)
476 {
477  fp_elt_mul4(dst->v0, src->v0, param->base);
478  fp_elt_mul4(dst->v1, src->v1, param->base);
479  fp_elt_mul4(dst->v2, src->v2, param->base);
480 }
481 
482 void
484  const fp3_param param)
485 {
486  fp_elt_mul8(dst->v0, src->v0, param->base);
487  fp_elt_mul8(dst->v1, src->v1, param->base);
488  fp_elt_mul8(dst->v2, src->v2, param->base);
489 }
490 
491 void
493  const fp3_param param, uint8_t stack)
494 {
495  fp_elt_mul3(dst->v0, src->v0, param->base, stack);
496  fp_elt_mul3(dst->v1, src->v1, param->base, stack);
497  fp_elt_mul3(dst->v2, src->v2, param->base, stack);
498 }
499 
500 void
502  const fp3_param param, uint8_t stack)
503 {
504  /* src1 = [v0, v1, v2] */
505  /* src2 = [y0, y1, y2] */
506 
507  fp_param_t *base_param = (fp_param_t*)(param->base);
508 
509  fp_elt res0, res1, v0, v1, v2, t1, t2;
510  fp_elt_get_pool_elt(&res0, base_param, stack);
511  fp_elt_get_pool_elt(&res1, base_param, stack);
512  fp_elt_get_pool_elt(&v0, base_param, stack);
513  fp_elt_get_pool_elt(&v1, base_param, stack);
514  fp_elt_get_pool_elt(&v2, base_param, stack);
515  fp_elt_get_pool_elt(&t1, base_param, stack);
516  fp_elt_get_pool_elt(&t2, base_param, stack);
517 
518  fp_elt_mul(v0, src1->v0, src2->v0, base_param, stack);
519  fp_elt_mul(v1, src1->v1, src2->v1, base_param, stack);
520  fp_elt_mul(v2, src1->v2, src2->v2, base_param, stack);
521 
522  fp_elt_add(t1, src1->v1, src1->v2, base_param);
523  fp_elt_add(t2, src2->v1, src2->v2, base_param);
524  fp_elt_mul(t1, t1, t2, base_param, stack);
525  fp_elt_add(t2, v1, v2, base_param);
526  fp_elt_sub(t1, t1, t2, base_param);
527  fp_elt_mul(t2, t1, param->non_residue, base_param, stack);
528  fp_elt_add(res0, t2, v0, base_param);
529 
530  fp_elt_add(t1, src1->v0, src1->v1, base_param);
531  fp_elt_add(t2, src2->v0, src2->v1, base_param);
532  fp_elt_mul(t1, t1, t2, base_param, stack);
533  fp_elt_add(t2, v0, v1, base_param);
534  fp_elt_sub(t1, t1, t2, base_param);
535  fp_elt_mul(t2, param->non_residue, v2, base_param, stack);
536  fp_elt_add(res1, t1, t2, base_param);
537 
538  fp_elt_add(t1, src1->v0, src1->v2, base_param);
539  fp_elt_add(t2, src2->v0, src2->v2, base_param);
540  fp_elt_mul(t1, t1, t2, base_param, stack);
541  fp_elt_add(t2, v0, v2, base_param);
542  fp_elt_sub(t1, t1, t2, base_param);
543  fp_elt_add(dst->v2, t1, v1, base_param);
544 
545  fp_elt_copy(dst->v1, res1, base_param);
546  fp_elt_copy(dst->v0, res0, base_param);
547 
548  fp_elt_relax_pool_elt(&res0, base_param, stack);
549  fp_elt_relax_pool_elt(&res1, base_param, stack);
550  fp_elt_relax_pool_elt(&v0, base_param, stack);
551  fp_elt_relax_pool_elt(&v1, base_param, stack);
552  fp_elt_relax_pool_elt(&v2, base_param, stack);
553  fp_elt_relax_pool_elt(&t1, base_param, stack);
554  fp_elt_relax_pool_elt(&t2, base_param, stack);
555 }
556 
557 void
558 fp3_elt_sqr_fp_elt (fp3_elt_ptr dst, fp_elt_srcptr src, const fp3_param param, uint8_t stack)
559 {
560  fp_elt_sqr(dst->v0, src, param->base, stack);
561  fp_elt_set_zero(dst->v1, param->base);
562  fp_elt_set_zero(dst->v2, param->base);
563 }
564 
565 void
566 fp3_elt_sqr (fp3_elt_ptr dst, fp3_elt_srcptr src, const fp3_param param, uint8_t stack)
567 {
568  fp3_elt_mul(dst, src, src, param, stack);
569 }
570 
571 void
572 fp3_elt_inv_fp_elt (fp3_elt_ptr dst, fp_elt_srcptr src, const fp3_param param, uint8_t stack)
573 {
574  fp_elt_inv(dst->v0, src, param->base, stack);
575  fp_elt_set_zero(dst->v1, param->base);
576  fp_elt_set_zero(dst->v2, param->base);
577 }
578 
579 void
580 fp3_elt_inv (fp3_elt_ptr dst, fp3_elt_srcptr src, const fp3_param param, uint8_t stack)
581 {
582  fp_param_t *base_param = (fp_param_t*)(param->base);
583 
584  fp_elt tmp, tmp1, tmp2;
585  fp_elt_get_pool_elt(&tmp, base_param, stack);
586  fp_elt_get_pool_elt(&tmp1, base_param, stack);
587  fp_elt_get_pool_elt(&tmp2, base_param, stack);
588 
589  fp3_elt t;
590  fp3_elt_get_pool_elt(&t, param, stack);
591 
592  fp_elt_sqr(t.v0, src->v0, base_param, stack);
593  fp_elt_mul(tmp, src->v1, src->v2, base_param, stack);
594  fp_elt_mul(tmp, tmp, param->non_residue, base_param, stack);
595  fp_elt_sub(t.v0, t.v0, tmp, base_param); /* t0 = a0^2 -wa1a2 */
596  fp_elt_mul(tmp, src->v0, t.v0, base_param, stack); /* tmp = a0 * t0 */
597 
598  fp_elt_sqr(t.v1, src->v2, base_param, stack);
599  fp_elt_mul(t.v1, t.v1, param->non_residue, base_param, stack);
600  fp_elt_mul(tmp1, src->v0, src->v1, base_param, stack);
601  fp_elt_sub(t.v1, t.v1, tmp1, base_param);
602  fp_elt_mul(tmp1, src->v2, t.v1, base_param, stack); /* t1 = wa2^2 - a0a1 */
603  fp_elt_mul(tmp1, tmp1, param->non_residue, base_param, stack); /* tmp1 = wa2 * t1 */
604 
605  fp_elt_sqr(t.v2, src->v1, base_param, stack);
606  fp_elt_mul(tmp2, src->v0, src->v2, base_param, stack);
607  fp_elt_sub(t.v2, t.v2, tmp2, base_param);
608  fp_elt_mul(tmp2, src->v1, t.v2, base_param, stack); /* t2 = a1^2 -a0a2 */
609  fp_elt_mul(tmp2, tmp2, param->non_residue, base_param, stack); /* tmp2 = wa1 * t2 */
610 
611  fp_elt_add(tmp, tmp, tmp1, base_param);
612  fp_elt_add(tmp, tmp, tmp2, base_param);
613  fp_elt_inv(tmp1, tmp, base_param, stack);
614 
615  fp3_elt_mul_fp_elt(dst, &t, tmp1, param, stack);
616 
617  fp_elt_relax_pool_elt(&tmp, base_param, stack);
618  fp_elt_relax_pool_elt(&tmp1, base_param, stack);
619  fp_elt_relax_pool_elt(&tmp2, base_param, stack);
620  fp3_elt_relax_pool_elt(&t, param, stack);
621 }
622 
623 void
624 fp3_elt_div_fp_elt (fp3_elt_ptr dst, fp3_elt_srcptr src1, fp_elt_srcptr src2,
625  const fp3_param param, uint8_t stack)
626 {
627  fp3_elt tmp;
628  fp3_elt_get_pool_elt(&tmp, param, stack);
629  fp3_elt_inv_fp_elt(&tmp, src2, param, stack);
630  fp3_elt_mul(dst, src1, &tmp, param, stack);
631  fp3_elt_relax_pool_elt(&tmp, param, stack);
632 }
633 
634 void
636  const fp3_param param, uint8_t stack)
637 {
638  fp3_elt tmp;
639  fp3_elt_get_pool_elt(&tmp, param, stack);
640  fp3_elt_inv(&tmp, src2, param, stack);
641  fp3_elt_mul(dst, src1, &tmp, param, stack);
642  fp3_elt_relax_pool_elt(&tmp, param, stack);
643 }
644 
645 void
646 fp3_elt_pow_ui (fp3_elt_ptr dst, fp3_elt_srcptr src, const block n,
647  const fp3_param param, uint8_t stack)
648 {
649  fp3_elt y;
650  fp3_elt_get_pool_elt(&y, param, stack);
651  block m = n;
652 
653  fp3_elt_copy(&y, src, param);
654  fp3_elt_set_one(dst, param);
655 
656  while (m != (block)0)
657  {
658  if (m & (block)1)
659  {
660  fp3_elt_mul(dst, dst, &y, param, stack);
661  }
662  fp3_elt_sqr(&y, &y, param, stack);
663  m >>= 1;
664  }
665  fp3_elt_relax_pool_elt(&y, param, stack);
666 }
667 
668 void
669 fp3_elt_pow_number (fp3_elt_ptr dst, fp3_elt_srcptr src, number_srcptr n,
670  const fp3_param param, uint8_t stack)
671 {
672  number m;
673  fp3_elt y;
674  fp3_elt_get_pool_elt(&y, param, stack);
675 #if MPHELL_USE_GMP == 1
676  number_tmp_alloc(&m, SIZ(n), stack);
677 #elif MPHELL_USE_IPP == 1
678  int size;
679  ippsRef_BN(NULL, &size, NULL, n);
680  number_tmp_alloc(&m, size, stack);
681 #elif MPHELL_USE_MBEDTLS == 1
682  number_tmp_alloc(&m, n->n, stack);
683 #endif
684  number_copy(m, n);
685  fp3_elt_copy(&y, src, param);
686  fp3_elt_set_one(dst, param);
687 
688  while (number_isdiff_ui(m, 0))
689  {
690  if (number_and_ui(m, (block)1, stack))
691  {
692  fp3_elt_mul(dst, dst, &y, param, stack);
693  }
694  fp3_elt_sqr(&y, &y, param, stack);
695  number_rshift(m, m, 1);
696  }
697  fp3_elt_relax_pool_elt(&y, param, stack);
698 #if MPHELL_USE_GMP == 1
699  number_tmp_free(&m, SIZ(n), stack);
700 #elif MPHELL_USE_IPP == 1
701  number_tmp_free(&m, size, stack);
702 #elif MPHELL_USE_MBEDTLS == 1
703  number_tmp_free(&m, n->n, stack);
704 #endif
705 }
706 
707 bool
708 fp3_elt_issquare (fp3_elt_srcptr src, const fp3_param param, uint8_t stack)
709 {
710  fp3_elt y;
711  number m;
712  fp3_elt_get_pool_elt(&y, param, stack);
713  number_tmp_alloc(&m, (param->size)*3, stack);
714 
715  number_dec(m, param->q);
716  number_div_ui(m, m, (block)2);
717 
718  fp3_elt_pow_number(&y, src, m, param, stack);
719  bool res = fp3_elt_isone(&y, param);
720  fp3_elt_relax_pool_elt(&y, param, stack);
721  number_tmp_free(&m, (param->size)*3, stack);
722  return res;
723 }
724 
725 int8_t
726 fp3_elt_ispower_ui (fp3_elt_srcptr src, const block n, const fp3_param param, uint8_t stack)
727 {
728  if(n == 0)
729  {
730  return (fp3_elt_isone(src, param));
731  }
732 
733  if(n == 1)
734  {
735  return true;
736  }
737 
738  if(n == 2)
739  {
740  return (fp3_elt_issquare(src, param, stack));
741  }
742 
743  fp3_elt y;
744  number m;
745  block r;
746  fp3_elt_get_pool_elt(&y, param, stack);
747  number_tmp_alloc(&m, param->size * 3, stack);
748 
749  number_dec(m, param->q);
750  number_divmod_ui(m, &r, m, n);
751 
752  if (r != (block)0)
753  {
754  fp3_elt_relax_pool_elt(&y, param, stack);
755  number_tmp_free(&m, param->size * 3, stack);
756  return 2;
757  }
758 
759  fp3_elt_pow_number(&y, src, m, param, stack);
760  bool res = fp3_elt_isone(&y, param);
761  fp3_elt_relax_pool_elt(&y, param, stack);
762  number_tmp_free(&m, param->size * 3, stack);
763  return res;
764 }
765 
766 int8_t
768  const fp3_param param, uint8_t stack)
769 {
770  if(number_iszero(n))
771  {
772  return (fp3_elt_isone(src, param));
773  }
774 
775  if(number_cmp_ui(n , 1) == 0)
776  {
777  return true;
778  }
779 
780  if(number_cmp_ui(n , 2) == 0)
781  {
782  return (fp3_elt_issquare(src, param, stack));
783  }
784 
785  fp3_elt y;
786  number m, r;
787 
788  fp3_elt_get_pool_elt(&y, param, stack);
789  number_tmp_alloc(&m, param->size * 3, stack);
790 
791 #if MPHELL_USE_GMP == 1
792  number_tmp_alloc(&r, SIZ(n), stack);
793 #elif MPHELL_USE_IPP == 1
794  int size;
795  ippsRef_BN(NULL, &size, NULL, n);
796  number_tmp_alloc(&r, size, stack);
797 #elif MPHELL_USE_MBEDTLS == 1
798  number_tmp_alloc(&r, n->n, stack);
799 #endif
800 
801  number_dec(m, param->q);
802  number_divmod(m, r, m, n);
803 
804  if (!number_iszero(r))
805  {
806  fp3_elt_relax_pool_elt(&y, param, stack);
807  number_tmp_free(&m, param->size * 3, stack);
808 #if MPHELL_USE_GMP == 1
809  number_tmp_free(&r, SIZ(n), stack);
810 #elif MPHELL_USE_IPP == 1
811  number_tmp_free(&r, size, stack);
812 #elif MPHELL_USE_MBEDTLS == 1
813  number_tmp_free(&r, n->n, stack);
814 #endif
815  return 2;
816  }
817 
818  fp3_elt_pow_number(&y, src, m, param, stack);
819  bool res = fp3_elt_isone(&y, param);
820  fp3_elt_relax_pool_elt(&y, param, stack);
821  number_tmp_free(&m, param->size * 3, stack);
822 #if MPHELL_USE_GMP == 1
823  number_tmp_free(&r, SIZ(n), stack);
824 #elif MPHELL_USE_IPP == 1
825  number_tmp_free(&r, size, stack);
826 #elif MPHELL_USE_MBEDTLS == 1
827  number_tmp_free(&r, n->n, stack);
828 #endif
829  return res;
830 }
831 
832 void
833 fp3_elt_sqrt (fp3_elt_ptr dst, fp3_elt_srcptr src, const fp3_param param, uint8_t stack)
834 {
835  fp3_elt r, b, x ;
836  if(fp3_elt_iszero(src, param))
837  {
838  fp3_elt_set_ui(dst, 0, true, param, stack);
839  }
840 
841  fp3_elt_get_pool_elt(&r, param, stack);
842  fp3_elt_get_pool_elt(&b, param, stack);
843  fp3_elt_get_pool_elt(&x, param, stack);
844 
845  number q;
846 #if MPHELL_USE_GMP == 1
847  number_tmp_alloc(&q, SIZ(param->p_odd)+1, stack);
848 #elif MPHELL_USE_IPP == 1
849  int size;
850  ippsRef_BN(NULL, &size, NULL, param->p_odd);
851  number_tmp_alloc(&q, size+1, stack);
852 #elif MPHELL_USE_MBEDTLS == 1
853  number_tmp_alloc(&q, (param->p_odd->n)+1, stack);
854 #endif
855 
856  number_inc(q, param->p_odd);
857  number_rshift(q, q, 1);
858 
859  fp3_elt_pow_number(&x, src, q, param, stack);
860 
861  while (1)
862  {
863  fp3_elt_sqr(&r, &x, param, stack);
864  fp3_elt_div(&b, &r, src, param, stack);
865  if (fp3_elt_isone(&b, param))
866  {
867  fp3_elt_neg(dst, &x, param);
868  fp3_elt_relax_pool_elt(&r, param, stack);
869  fp3_elt_relax_pool_elt(&b, param, stack);
870 #if MPHELL_USE_GMP == 1
871  number_tmp_free(&q, SIZ(param->p_odd)+1, stack);
872 #elif MPHELL_USE_IPP == 1
873  number_tmp_free(&q, size+1, stack);
874 #elif MPHELL_USE_MBEDTLS == 1
875  number_tmp_free(&q, (param->p_odd->n)+1, stack);
876 #endif
877  fp3_elt_relax_pool_elt(&x, param, stack);
878  return;
879  }
880  uint32_t m = 0;
881  do {
882  fp3_elt_sqr(&b, &b, param, stack);
883  ++m;
884  MPHELL_ASSERT_ALWAYS(m <= param->p_even, "fp_elt_sqrt : \
885  m > p_even");
886  } while (!fp3_elt_isone(&b, param));
887 
888  fp3_elt_copy(&r, &(param->gen_sylow), param);
889  while (m < param->p_even - 1)
890  {
891  fp3_elt_sqr(&r, &r, param, stack);
892  ++m;
893  }
894  fp3_elt_mul(&x, &x, &r, param, stack);
895  }
896 
897  fp3_elt_relax_pool_elt(&r, param, stack);
898  fp3_elt_relax_pool_elt(&b, param, stack);
899 #if MPHELL_USE_GMP == 1
900  number_tmp_free(&q, SIZ(param->p_odd)+1, stack);
901 #elif MPHELL_USE_IPP == 1
902  number_tmp_free(&q, size+1, stack);
903 #elif MPHELL_USE_MBEDTLS == 1
904  number_tmp_free(&q, (param->p_odd->n)+1, stack);
905 #endif
906  fp3_elt_relax_pool_elt(&x, param, stack);
907 }
908 
909 void
910 fp3_elt_cube_root (fp3_elt_ptr dst, fp3_elt_srcptr src, const fp3_param param, uint8_t stack)
911 {
912  number t;
913  number l;
914  uint32_t s = 0;
915  uint32_t s1 = 0;
916  uint32_t i;
917  uint8_t k;
918  block pow = (block)1;
919  block r0;
920  int8_t r1;
921  block gcd;
922  fp3_elt b, c1, c2, h, r, d, tmp1;
923  number_tmp_alloc(&t, param->size*3, stack);
924  number_tmp_alloc(&l, param->size*3, stack);
925  fp3_elt_get_pool_elt(&b, param, stack);
926  fp3_elt_get_pool_elt(&c1, param, stack);
927  fp3_elt_get_pool_elt(&c2, param, stack);
928  fp3_elt_get_pool_elt(&h, param, stack);
929  fp3_elt_get_pool_elt(&r, param, stack);
930  fp3_elt_get_pool_elt(&d, param, stack);
931  fp3_elt_get_pool_elt(&tmp1, param, stack);
932 
933  number_dec(t, param->q); /* t <- q-1 */
934  number_gcd_ui(&gcd, t, (block)3);
935 
936  /* Step 1: We write q-1 as t.3^s, with t = 3l +- 1 */
937  number_mod_ui(&r0, t, (block)3);
938  while(r0==0)
939  {
940  s++;
941  number_divmod_ui(t, &r0, t, (block)3);
942  number_mod_ui(&r0, t, (block)3);
943  }
944  number_divmod_ui(l, &r0, t, (block)3);
945 
946  if(r0 == 2)
947  {
948  number_inc(l, l);
949  r1=-1;
950  }
951  else
952  {
953  r1 = 1;
954  }
955 
956  /* Step 2: Find a non cubic residue */
957  do
958  {
959  fp3_elt_random(&b, param, stack);
960  }
961  while(fp3_elt_ispower_ui(&b, (block)3, param, stack)!=0);
962 
963  /* Compute c1 and c2 */
964  fp3_elt_pow_number(&c1, &b, t, param, stack); /* c1 <- b^t */
965  s1 = s - 1;
966  while(s1 != 0)
967  {
968  pow*=3;
969  s1--;
970  }
971  fp3_elt_pow_ui(&c2, &c1, pow, param, stack); /* c2 <- c1^(3^(s-1)) */
972 
973  /* Step 3: Computation of the cube root of (a^t)^(-1) */
974  fp3_elt_set_one(&h, param); /* h <- 1 */
975  fp3_elt_pow_number(&r, src, t, param, stack); /* r = a^t = src^t */
976 
977  for(i=1; i<= (s-1); i++)
978  {
979  /* d <- r^(3^(s-i-1)) */
980  s1 = s-i-1;
981  pow = (block)1;
982  while(s1 != 0)
983  {
984  pow*=3;
985  s1--;
986  }
987  fp3_elt_pow_ui(&d, &r, pow, param, stack);
988  if(fp3_elt_isone(&d, param))
989  {
990  k = 0;
991  }
992  else if(fp3_elt_cmp(&d, &c2, param)==0)
993  {
994  k = 2;
995  }
996  else
997  {
998  k = 1;
999  }
1000  fp3_elt_pow_ui(&tmp1, &c1, (block)k, param, stack); /* tmp1 <- c1^k */
1001  fp3_elt_mul(&h, &h, &tmp1, param, stack); /* h <- h.c1^k */
1002  fp3_elt_pow_ui(&tmp1, &c1, (block)(k*3), param, stack); /* tmp1 <- c1^3k */
1003  fp3_elt_mul(&r, &r, &tmp1, param, stack); /* r <- r.(c1^3)^k */
1004  fp3_elt_pow_ui(&c1, &c1, (block)3, param, stack); /* c1 <- c1^3 */
1005  }
1006 
1007  /* Step 4: */
1008  fp3_elt_pow_number(&tmp1, src, l, param, stack); /* tmp1 <- a^l */
1009  fp3_elt_mul(&r, &tmp1, &h, param, stack); /* r <- (a^l).h */
1010  if(r1 == 1)
1011  {
1012  fp3_elt_inv(dst, &r, param, stack);
1013  }
1014  else
1015  {
1016  fp3_elt_copy(dst, &r, param);
1017  }
1018 
1019  number_tmp_free(&t, param->size*3, stack);
1020  number_tmp_free(&l, param->size*3, stack);
1021  fp3_elt_relax_pool_elt(&b, param, stack);
1022  fp3_elt_relax_pool_elt(&c1, param, stack);
1023  fp3_elt_relax_pool_elt(&c2, param, stack);
1024  fp3_elt_relax_pool_elt(&h, param, stack);
1025  fp3_elt_relax_pool_elt(&r, param, stack);
1026  fp3_elt_relax_pool_elt(&d, param, stack);
1027  fp3_elt_relax_pool_elt(&tmp1, param, stack);
1028 }
1029 
1037 void
1038 fp3_elt_primitive_elt (fp3_elt_ptr dst, const fp3_param param, uint8_t stack)
1039 {
1040  /* Find a possible primitive element */
1041  fp3_elt a;
1042  fp3_elt res;
1043  fp3_elt_get_pool_elt(&a, param, stack);
1044  fp3_elt_get_pool_elt(&res, param, stack);
1045  number m;
1046  number q;
1047  number_tmp_alloc(&m, 3*(param->size), stack);
1048  number_tmp_alloc(&q, 3*(param->size), stack);
1049  bool test = true;
1050  block r;
1051  int8_t i = 0;
1052 
1053  number_set_ui(m, (block)0);
1054  number_set_ui(q, (block)0);
1055 
1056  number_dec(m, param->q); /* m <- q-1 */
1057 
1058  /* First 20 prime */
1059  block prime[20]={2,3,5,7,11,13,17,19,23,29,31,37,41,43,47,53,59,61,67,71};
1060 
1061  do
1062  {
1063  /* Select a random element */
1064  fp3_elt_random(&a, param, stack);
1065 
1066  /* Suppose that the element is primitive */
1067  test = true;
1068  i = 0;
1069  while(i<20)
1070  {
1071  number_mod_ui(&r, m, prime[i]);
1072  number_divmod_ui(q, &r, m, prime[i]);
1073  if(r == 0)
1074  {
1075  /* prime[i] divides p-1 */
1076  /* q = (q-1) / prime[i] */
1077  fp3_elt_pow_number(&res, &a, q, param, stack);
1078  if(fp3_elt_isone(&res, param))
1079  {
1080  /* The element is not primitive */
1081  test = false;
1082  break;
1083  }
1084  }
1085  i++;
1086  }
1087  }
1088  while(test == false);
1089 
1090  fp3_elt_copy(dst, &a, param);
1091 
1092  fp3_elt_relax_pool_elt(&a, param, stack);
1093  fp3_elt_relax_pool_elt(&res, param, stack);
1094  number_tmp_free(&m, 3*(param->size), stack);
1095  number_tmp_free(&q, 3*(param->size), stack);
1096 }
1097 
1098 void
1099 fp3_elt_unity_nth_root (fp3_elt_ptr dst, const block n, const fp3_param param, uint8_t stack)
1100 {
1101  /* Find a possible primitive element */
1102  fp3_elt a;
1103  fp3_elt b;
1104  fp3_elt_get_pool_elt(&a, param, stack);
1105  fp3_elt_get_pool_elt(&b, param, stack);
1106  number m;
1107  number q;
1108  block r;
1109 
1110  number_tmp_alloc(&m, 3*(param->size), stack);
1111  number_tmp_alloc(&q, 3*(param->size), stack);
1112  number_set_ui(m, (block)0);
1113  number_set_ui(q, (block)0);
1114  number_dec(m, param->q); /* m <- q-1 */
1115  number_divmod_ui(q, &r, m, n); /* q <- (q-1)/n */
1116 
1117  if(r != 0)
1118  {
1119  /* There is no non-trivial nth root of unity */
1120  fp3_elt_set_one(dst, param);
1121  }
1122  else
1123  {
1124  /* There is a non-trivial nth root of unity */
1125  do
1126  {
1127  /* Set a to a strongly possible primitive element */
1128  fp3_elt_primitive_elt(&a, param, stack);
1129  /* Set b = a^((q-1)/n) */
1130  fp3_elt_pow_number(&b, &a, q, param, stack);
1131  }
1132  while(fp3_elt_isone(&b, param));
1133 
1134  fp3_elt_copy(dst, &b, param);
1135  }
1136 
1137  fp3_elt_relax_pool_elt(&a, param, stack);
1138  fp3_elt_relax_pool_elt(&b, param, stack);
1139  number_tmp_free(&m, 3*(param->size), stack);
1140  number_tmp_free(&q, 3*(param->size), stack);
1141 }
void fp3_get_characteristic(number_ptr c, const fp3_param param)
Get the characteristic of the cubic extension field "param".
Definition: mphell-fp3.c:156
bool number_isdiff_ui(number_srcptr src1, const block src2)
Test if src1 != src2.
bool number_iszero(number_srcptr src)
Test if src is zero.
int8_t fp_elt_cmp(fp_elt_srcptr src1, fp_elt_srcptr src2, const fp_param param)
Compare src1 and src2 in Fp.
Definition: mphell-fp.c:631
static void fp_elt_add(fp_elt_ptr dst, fp_elt_srcptr src1, fp_elt_srcptr src2, const fp_param param)
Set dst <- src1 + src2.
Definition: mphell-fp.h:514
void fp3_elt_alloc(fp3_elt *dst, const fp3_param param)
Allocate space for a cubic extension field element.
Definition: mphell-fp3.c:174
void fp3_elt_mul(fp3_elt_ptr dst, fp3_elt_srcptr src1, fp3_elt_srcptr src2, const fp3_param param, uint8_t stack)
Set dst <- src1 * src2, if Montgomery arithmetic is used, the Montgomery multiplication will be used ...
Definition: mphell-fp3.c:501
void fp3_elt_neg(fp3_elt_ptr dst, fp3_elt_srcptr src, const fp3_param param)
Set dst <- (-src)
Definition: mphell-fp3.c:446
void fp3_elt_pow_number(fp3_elt_ptr dst, fp3_elt_srcptr src, number_srcptr n, const fp3_param param, uint8_t stack)
Set dst <- src^n.
Definition: mphell-fp3.c:669
void fp3_elt_relax_pool_elt(fp3_elt *dst, const fp3_param param, uint8_t stack)
Free space of a temporary cubic extension field element.
Definition: mphell-fp3.c:59
void fp3_elt_add_fp_elt(fp3_elt_ptr dst, fp3_elt_srcptr src1, fp_elt_srcptr src2, const fp3_param param)
Set dst <- src1 + src2.
Definition: mphell-fp3.c:394
void number_mod_ui(block *dst, number_srcptr src1, const block src2)
Compute dst such that src1 = q * src2 + dst ; dst < src2.
void number_div_ui(number_ptr dst, number_srcptr src1, const block src2)
Compute dst such that src1 = dst * src2 + r ; r < src2.
void fp3_elt_random(fp3_elt_ptr dst, const fp3_param param, uint8_t stack)
Set dst to a random element of FP3, the random process is chosen at the MHELL initialisation.
Definition: mphell-fp3.c:285
void fp_elt_set_ui(fp_elt_ptr dst, const block src, const bool isreduced, const fp_param param, uint8_t stack)
Set dst to src, if Montgomery arithmetic is used, is_reduced == false -> transform dst into its Montg...
Definition: mphell-fp.c:415
void fp3_elt_init(fp3_elt_ptr dst, const fp3_param param)
Initialise a cubic extension field element.
Definition: mphell-fp3.c:182
void fp_elt_free(fp_elt *src)
Free space used by src.
Definition: mphell-fp.c:385
fp_elt v1
Definition: mphell-fp3.h:38
void fp3_elt_set_one(fp3_elt_ptr dst, const fp3_param param)
Set dst to one (or its Montgomery form if Montgomery arithmetic is used)
Definition: mphell-fp3.c:214
int8_t fp3_elt_cmp_fp_elt(fp3_elt_srcptr src1, fp_elt_srcptr src2, const fp3_param param)
Compare src1 and src2 in FP3.
Definition: mphell-fp3.c:338
void fp_elt_clear(fp_elt *src)
Clear space used by src (remove the action of fp_elt_init but let the one of fp_elt_alloc)
Definition: mphell-fp.c:377
static void fp_elt_mul8(fp_elt_ptr dst, fp_elt_srcptr src, const fp_param param)
Set dst <- 8 * src.
Definition: mphell-fp.h:728
fp_elt v2
Definition: mphell-fp3.h:39
void fp3_elt_pow_ui(fp3_elt_ptr dst, fp3_elt_srcptr src, const block n, const fp3_param param, uint8_t stack)
Set dst <- src^n.
Definition: mphell-fp3.c:646
void number_set_ui(number_ptr dst, const block src)
Set dst to src.
bool number_iseven(number_srcptr src)
Test if src is even.
bool fp3_elt_isone(fp3_elt_srcptr src, const fp3_param param)
Test if src is one.
Definition: mphell-fp3.c:370
fp_elt v0
Definition: mphell-fp3.h:37
fp_param_t * base
Definition: mphell-fp3.h:66
void fp3_elt_set(fp3_elt_ptr dst, number_srcptr src1, number_srcptr src2, number_srcptr src3, const bool isreduced, const fp3_param param, uint8_t stack)
Set dst to src1 + src2*x + src3*x^2, if Montgomery arithmetic is used, is_reduced == false -> transfo...
Definition: mphell-fp3.c:248
static void fp_elt_sqr(fp_elt_ptr dst, fp_elt_srcptr src, const fp_param param, uint8_t stack)
Set dst <- src^2.
Definition: mphell-fp.h:806
void fp3_elt_inv_fp_elt(fp3_elt_ptr dst, fp_elt_srcptr src, const fp3_param param, uint8_t stack)
Set dst <- src^(-1)
Definition: mphell-fp3.c:572
void fp3_elt_div(fp3_elt_ptr dst, fp3_elt_srcptr src1, fp3_elt_srcptr src2, const fp3_param param, uint8_t stack)
Set dst <- src1 / src2.
Definition: mphell-fp3.c:635
void fp3_elt_dec(fp3_elt_ptr dst, fp3_elt_srcptr src, const fp3_param param)
Set dst <- src - 1.
Definition: mphell-fp3.c:412
int8_t fp3_elt_ispower_number(fp3_elt_srcptr src, number_srcptr n, const fp3_param param, uint8_t stack)
Test if src is a n-power in FP3, using A NOTE ON POWERS IN FINITE FIELDS from ANDREAS AABRANDT AND VA...
Definition: mphell-fp3.c:767
static void fp_elt_relax_pool_elt(fp_elt *dst, const fp_param param, uint8_t stack)
Relax an initialised field element from the pool.
Definition: mphell-fp.h:195
void fp3_get_size(number_ptr c, const fp3_param param)
Get the size of the cubic extension field "param".
Definition: mphell-fp3.c:162
void fp3_elt_sqr(fp3_elt_ptr dst, fp3_elt_srcptr src, const fp3_param param, uint8_t stack)
Set dst <- src^2.
Definition: mphell-fp3.c:566
void fp3_elt_str(char **str, fp3_elt_srcptr src, const uint8_t base, const bool lift, const fp3_param param, uint8_t stack)
Converts src to string format in base specified by base.
Definition: mphell-fp3.c:321
void number_free(number *dst)
Free a number_ptr allocated on the RAM memory (malloc)
Definition: mphell-number.c:75
void number_divmod_ui(number_ptr q, block *r, number_srcptr src1, const block src2)
Compute (q, r) such that src1 = q * src2 + r ; r < src2.
void fp3_elt_print(fp3_elt_srcptr src, const uint8_t base, const bool lift, const fp3_param param, uint8_t stack)
Print src in base "base".
Definition: mphell-fp3.c:40
void fp3_elt_add(fp3_elt_ptr dst, fp3_elt_srcptr src1, fp3_elt_srcptr src2, const fp3_param param)
Set dst <- src1 + src2.
Definition: mphell-fp3.c:403
void fp3_elt_mul4(fp3_elt_ptr dst, fp3_elt_srcptr src, const fp3_param param)
Set dst <- 4 * src.
Definition: mphell-fp3.c:474
void fp_elt_copy(fp_elt_ptr dst, fp_elt_srcptr src, const fp_param param)
Copy src into dst, src and dst must belong to the same Fp.
Definition: mphell-fp.c:367
number q
Definition: mphell-fp3.h:68
void fp3_elt_neg_fp_elt(fp3_elt_ptr dst, fp_elt_srcptr src, const fp3_param param)
Set dst <- (-src)
Definition: mphell-fp3.c:438
void fp3_elt_sub(fp3_elt_ptr dst, fp3_elt_srcptr src1, fp3_elt_srcptr src2, const fp3_param param)
Set dst <- src1 - src2.
Definition: mphell-fp3.c:429
void fp_get_characteristic(number_ptr c, const fp_param param)
Get the characteristic of the prime field "param".
Definition: mphell-fp.c:332
void fp3_free(fp3_param param)
Free the space of the cubic extension field informations structure.
Definition: mphell-fp3.c:143
void fp3_elt_unity_nth_root(fp3_elt_ptr dst, const block n, const fp3_param param, uint8_t stack)
Set dst to a non trivial n-th root of unity if it exists (ie n divides q-1), 1 otherwise.
Definition: mphell-fp3.c:1099
void fp3_str(char **str, const fp3_param param, const uint8_t base, uint8_t stack)
Converts fp2_param param to string format in base specified by base.
Definition: mphell-fp3.c:301
void fp3_elt_sqrt(fp3_elt_ptr dst, fp3_elt_srcptr src, const fp3_param param, uint8_t stack)
Set dst <- src^(1/2), using Tonelli–Shanks algorithm.
Definition: mphell-fp3.c:833
void fp_str(char **str, const fp_param param, const uint8_t base, uint8_t stack)
Converts fp_param param to string format in base specified by base.
Definition: mphell-fp.c:543
void fp_elt_set_number(fp_elt_ptr dst, number_srcptr src, const bool isreduced, const fp_param param, uint8_t stack)
Set dst to src, if Montgomery arithmetic is used, is_reduced == false -> transform dst into its Montg...
Definition: mphell-fp.c:433
void fp3_elt_mul_fp_elt(fp3_elt_ptr dst, fp3_elt_srcptr src1, fp_elt_srcptr src2, const fp3_param param, uint8_t stack)
Set dst <- src1 * src2, if Montgomery arithmetic is used, the Montgomery multiplication will be used ...
Definition: mphell-fp3.c:456
void number_mul(number_ptr dst, number_srcptr src1, number_srcptr src2)
Set dst to src1 * src2.
bool fp_elt_isone(fp_elt_srcptr src, const fp_param param)
Test if src is one.
Definition: mphell-fp.c:654
void number_gcd_ui(block *dst, number_srcptr src1, const block src2)
Set dst to GCD(src1, src2)
static void fp_elt_mul(fp_elt_ptr dst, fp_elt_srcptr src1, fp_elt_srcptr src2, const fp_param param, uint8_t stack)
Set dst <- src1 * src2, if Montgomery arithmetic is used, the Montgomery multiplication will be used ...
Definition: mphell-fp.h:643
static void fp_elt_inc(fp_elt_ptr dst, fp_elt_srcptr src, const fp_param param)
Set dst <- src + 1.
Definition: mphell-fp.h:539
static bool fp_elt_iszero(fp_elt_srcptr src, const fp_param param)
Test if src is zero.
Definition: mphell-fp.h:462
block number_and_ui(number_srcptr src1, const block src2, uint8_t stack)
Apply logical bitwise AND operator between src1 and src2.
static void fp_elt_get_pool_elt(fp_elt *dst, const fp_param param, uint8_t stack)
Get an initialised field element from the pool.
Definition: mphell-fp.h:158
static void fp_elt_mul3(fp_elt_ptr dst, fp_elt_srcptr src, const fp_param param, uint8_t stack)
Set dst <- 3 * src.
Definition: mphell-fp.h:768
static void fp_elt_mul2(fp_elt_ptr dst, fp_elt_srcptr src, const fp_param param)
Set dst <- 2 * src.
Definition: mphell-fp.h:665
void number_copy(number_ptr dst, number_srcptr src)
Copy src into dst.
Definition: mphell-number.c:87
void fp3_elt_copy(fp3_elt_ptr dst, fp3_elt_srcptr src, const fp3_param param)
Copy src into dst, src and dst must belong to the same FP3.
Definition: mphell-fp3.c:190
void fp3_alloc(fp3_param param, const fp_param base)
Allocate space for the cubic extension field informations structure.
Definition: mphell-fp3.c:69
void number_sqr(number_ptr dst, number_srcptr src)
Set dst to src1^2.
void fp_elt_alloc(fp_elt *dst, const fp_param param)
Allocate space for a primary field element.
Definition: mphell-fp.c:344
void fp_elt_inv(fp_elt_ptr dst, fp_elt_srcptr src, const fp_param param, uint8_t stack)
Set dst <- src^(-1)
Definition: mphell-fp.c:716
void fp3_elt_get_pool_elt(fp3_elt *dst, const fp3_param param, uint8_t stack)
Allocate and initialise space for a temporary cubic extension field element.
Definition: mphell-fp3.c:51
static void fp_elt_neg(fp_elt_ptr dst, fp_elt_srcptr src, const fp_param param)
Set dst <- (-src) mod p.
Definition: mphell-fp.h:613
void fp3_elt_mul3(fp3_elt_ptr dst, fp3_elt_srcptr src, const fp3_param param, uint8_t stack)
Set dst <- 3 * src.
Definition: mphell-fp3.c:492
void fp_elt_set_zero(fp_elt_ptr dst, const fp_param param)
Set dst to zero.
Definition: mphell-fp.c:404
fp3_elt non_res
Definition: mphell-fp3.h:70
void fp3_elt_set_number(fp3_elt_ptr dst, number_srcptr src, const bool isreduced, const fp3_param param, uint8_t stack)
Set dst to src, if Montgomery arithmetic is used, is_reduced == false -> transform dst into its Montg...
Definition: mphell-fp3.c:231
static void fp_elt_mul4(fp_elt_ptr dst, fp_elt_srcptr src, const fp_param param)
Set dst <- 4 * src.
Definition: mphell-fp.h:690
void fp3_copy(fp3_param param_res, const fp3_param param)
Copy the cubic extension field structure param into param_res.
Definition: mphell-fp3.c:131
void fp3_elt_mul2(fp3_elt_ptr dst, fp3_elt_srcptr src, const fp3_param param)
Set dst <- 2 * src.
Definition: mphell-fp3.c:465
void number_tmp_free(number *t, const uint8_t size, uint8_t stack)
Free a temporary number.
Definition: mphell-number.c:45
Cubic extension field element structure.
Definition: mphell-fp3.h:35
void fp3_elt_clear(fp3_elt *src)
Clear space used by src (remove the action of fp3_elt_init but let the one of fp3_elt_alloc)
Definition: mphell-fp3.c:198
void fp3_elt_sqr_fp_elt(fp3_elt_ptr dst, fp_elt_srcptr src, const fp3_param param, uint8_t stack)
Set dst <- src^2.
Definition: mphell-fp3.c:558
fp_elt non_residue
Definition: mphell-fp3.h:67
void fp3_elt_set_fp_elt(fp3_elt_ptr dst, fp_elt_srcptr src, const fp3_param param)
Set dst to src.
Definition: mphell-fp3.c:240
void fp3_elt_inc(fp3_elt_ptr dst, fp3_elt_srcptr src, const fp3_param param)
Set dst <- src + 1.
Definition: mphell-fp3.c:386
uint8_t size
Definition: mphell-fp3.h:74
bool fp3_elt_issquare(fp3_elt_srcptr src, const fp3_param param, uint8_t stack)
Test if src is a square, using A NOTE ON POWERS IN FINITE FIELDS from ANDREAS AABRANDT AND VAGN LUNDS...
Definition: mphell-fp3.c:708
void fp3_elt_set_str(fp3_elt_ptr dst, const char *str, const uint8_t base, const bool isreduced, const fp3_param param, uint8_t stack)
Set dst to str, if Montgomery arithmetic is used, is_reduced == false -> transform dst into its Montg...
Definition: mphell-fp3.c:265
void number_dec(number_ptr dst, number_srcptr src)
Set dst to src - 1 if src - 1 fit in dst.
void number_inc(number_ptr dst, number_srcptr src)
Set dst to src + 1 if src + 1 fit in dst.
void fp_elt_set_str(fp_elt_ptr dst, const char *str, const uint8_t base, const bool isreduced, const fp_param param, uint8_t stack)
Set dst to str, if Montgomery arithmetic is used, is_reduced == false -> transform dst into its Montg...
Definition: mphell-fp.c:455
void number_tmp_alloc(number *t, const uint8_t size, uint8_t stack)
Allocate a temporary number.
Definition: mphell-number.c:31
Cubic extension field structure.
Definition: mphell-fp3.h:64
void number_init(number *dst, const uint8_t n)
Allocate a number_ptr on the RAM memory (malloc)
Definition: mphell-number.c:59
Declaration of cubic field (finite field constructed with an irreducible polynomial of degree 3) func...
uint32_t p_even
Definition: mphell-fp3.h:73
void fp3_create(fp3_param param, const fp_param base, fp_elt_srcptr non_residue, uint8_t stack)
Create a cubic extension of the field base.
Definition: mphell-fp3.c:108
static void fp_elt_dec(fp_elt_ptr dst, fp_elt_srcptr src, const fp_param param)
Set dst <- src - 1.
Definition: mphell-fp.h:596
number p_odd
Definition: mphell-fp3.h:72
void fp_elt_lift(fp_elt_ptr dst, fp_elt_srcptr src, const fp_param param, uint8_t stack)
If Montgomery arithmetic is used, lift src (which is into Montgomery form) to classical fp.
Definition: mphell-fp.c:503
void number_rshift(number_ptr dst, number_srcptr src, const uint16_t shift)
Set dst to src >> shift.
Primary field parameters.
void fp3_elt_free(fp3_elt *src)
Free space used by src.
Definition: mphell-fp3.c:206
static void fp_elt_sub(fp_elt_ptr dst, fp_elt_srcptr src1, fp_elt_srcptr src2, const fp_param param)
Set dst <- src1 - src2.
Definition: mphell-fp.h:557
void fp3_elt_set_fp_elts(fp3_elt_ptr dst, fp_elt_srcptr src1, fp_elt_srcptr src2, fp_elt_srcptr src3, const fp3_param param)
Set dst to src1 + src2*x + src3*x^2.
Definition: mphell-fp3.c:257
fp3_elt gen_sylow
Definition: mphell-fp3.h:71
void fp3_elt_set_ui(fp3_elt_ptr dst, const uint64_t src, const bool isreduced, const fp3_param param, uint8_t stack)
Set dst to src, if Montgomery arithmetic is used, is_reduced == false -> transform dst into its Montg...
Definition: mphell-fp3.c:222
void fp3_prepare_sqrt(fp3_param param, uint8_t stack)
Find a non square residue in FP3, factor out q-1 by powers of 2, find Q and S such that q − 1 = Q....
Definition: mphell-fp3.c:90
void fp_elt_random(fp_elt_ptr dst, const fp_param param, uint8_t stack)
Set dst to a random element of Fp, the random process is chosen at the MHELL initialisation.
Definition: mphell-fp.c:481
int8_t number_cmp_ui(number_srcptr src1, const block src2)
Compare src1 and src2.
void number_divmod(number_ptr q, number_ptr r, number_srcptr src1, number_srcptr src2)
Compute (q, r) such that src1 = q * src2 + r ; r < src2.
void fp3_elt_inv(fp3_elt_ptr dst, fp3_elt_srcptr src, const fp3_param param, uint8_t stack)
Set dst <- src^(-1)
Definition: mphell-fp3.c:580
void fp_elt_set_one(fp_elt_ptr dst, const fp_param param)
Set dst to one (or its Montgomery form if Montgomery arithmetic is used)
Definition: mphell-fp.c:394
void fp3_elt_div_fp_elt(fp3_elt_ptr dst, fp3_elt_srcptr src1, fp_elt_srcptr src2, const fp3_param param, uint8_t stack)
Set dst <- src1 / src2.
Definition: mphell-fp3.c:624
bool fp3_elt_iszero(fp3_elt_srcptr src, const fp3_param param)
Test if src is zero.
Definition: mphell-fp3.c:377
void fp3_elt_sub_fp_elt(fp3_elt_ptr dst, fp3_elt_srcptr src1, fp_elt_srcptr src2, const fp3_param param)
Set dst <- src1 - src2.
Definition: mphell-fp3.c:420
void fp_elt_str(char **str, fp_elt_srcptr src, const uint8_t base, const bool lift, const fp_param param, uint8_t stack)
Converts src to string format in base specified by base.
Definition: mphell-fp.c:600
void number_str(char **str, number_srcptr src, const uint8_t base)
Converts src to string format in base specified by base.
void fp3_elt_lift(fp3_elt_ptr dst, fp3_elt_srcptr src, const fp3_param param, uint8_t stack)
If Montgomery arithmetic is used, lift src (which is into Montgomery form) to classical FP3.
Definition: mphell-fp3.c:293
int8_t fp3_elt_cmp(fp3_elt_srcptr src1, fp3_elt_srcptr src2, const fp3_param param)
Compare src1 and src2 in FP3.
Definition: mphell-fp3.c:348
void fp3_elt_mul8(fp3_elt_ptr dst, fp3_elt_srcptr src, const fp3_param param)
Set dst <- 8 * src.
Definition: mphell-fp3.c:483
void fp_elt_init(fp_elt_ptr dst, const fp_param param)
Initialise a primary field element.
Definition: mphell-fp.c:357
void fp3_elt_primitive_elt(fp3_elt_ptr dst, const fp3_param param, uint8_t stack)
Find a possible primitive element in the field defined by param.
Definition: mphell-fp3.c:1038
void fp3_elt_cube_root(fp3_elt_ptr dst, fp3_elt_srcptr src, const fp3_param param, uint8_t stack)
Set dst <- src^(1/3)
Definition: mphell-fp3.c:910
int8_t fp3_elt_ispower_ui(fp3_elt_srcptr src, const block n, const fp3_param param, uint8_t stack)
Test if src is a n-power in FP3, using A NOTE ON POWERS IN FINITE FIELDS from ANDREAS AABRANDT AND VA...
Definition: mphell-fp3.c:726