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