MPHELL  4.0.0
mphell-field.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-field.h"
27 
28 /**************************************TMP**********************************/
29 
30 /* void field_elt_get_pool_elt (field_elt * dst, field_ptr k, uint8_t stack){} is inline */
31 
32 /* void field_elt_relax_pool_elt (field_elt * dst, field_ptr k, uint8_t stack){} is inline */
33 
34 /************************************SETTERS**********************************/
35 
36 void
37 field_alloc (field_ptr k, const field_type type, const uint8_t size, field_ptr base)
38 {
39  switch(type)
40  {
41  case FP :
42  k->param = (fp_param_t *)malloc(sizeof(fp_param_t));
43  fp_alloc(k->param, size);
44  break;
45 
46  case FP2 :
47  k->param = (fp2_param_t *)malloc(sizeof(fp2_param_t));
48  fp2_alloc(k->param, (fp_param)(base->param));
49  break;
50 
51  case FP3 :
52  k->param = (fp3_param_t *)malloc(sizeof(fp3_param_t));
53  fp3_alloc(k->param, (fp_param)(base->param));
54  break;
55  }
56  k->type = type;
57  k->size = size;
58 
59  /* Pools creation */
60  uint8_t i;
61  k->i_1 = 0;
62  for(i=0; i<POOL_SIZE_FIELD; i++)
63  {
64  field_elt_alloc(&(k->pool_1)[i], k);
65  }
66 #if MPHELL_USE_MULTITHREADING == 1
67  k->i_2 = 0;
68  for(i=0; i<POOL_SIZE_FIELD; i++)
69  {
70  field_elt_alloc(&(k->pool_2)[i], k);
71  }
72 #endif
73 }
74 
75 void
76 field_create (field_ptr k, const char* id, uint8_t stack, const uint32_t n, ...)
77 {
78  va_list va;
79  field_t * base;
80  number_t * p;
81  fp_elt * non_residue;
82  fp_id ID;
83 
84  if((id != NULL) && (id[0] != '\0'))
85  {
86  strcpy(k->id, id);
87  if(strcmp(id, "p192r1")==0)
88  {
89  ID = P192R1;
90  }
91  else if(strcmp(id, "p224r1")==0)
92  {
93  ID = P224R1;
94  }
95  else if(strcmp(id, "p256r1")==0)
96  {
97  ID = P256R1;
98  }
99  else if(strcmp(id, "p384r1")==0)
100  {
101  ID = P384R1;
102  }
103  else if(strcmp(id, "p521r1")==0)
104  {
105  ID = P521R1;
106  }
107  else
108  {
109  ID = ARBITRARY;
110  }
111  }
112  else
113  {
114  strcpy(k->id, "NO_ID");
115  ID = ARBITRARY;
116  }
117 
118  switch(k->type)
119  {
120  case FP :
121  va_start(va, n);
122  p = va_arg(va, number_t *);
123  fp_create(k->param, p, ID, stack);
124  k->bit_size = number_log2(p);
125  va_end(va);
126  break;
127 
128  case FP2 :
129  va_start(va, n);
130  base = va_arg(va, field_t *);
131  non_residue = va_arg(va, fp_elt *);
132  fp2_create(k->param, base->param, *non_residue, stack);
133  va_end(va);
134  k->bit_size = base->bit_size;
135  break;
136 
137  case FP3 :
138  va_start(va, n);
139  base = va_arg(va, field_t *);
140  non_residue = va_arg(va, fp_elt *);
141  fp3_create(k->param, base->param, *non_residue, stack);
142  k->bit_size = base->bit_size;
143  va_end(va);
144  break;
145  }
146 
147  /* Pools creation */
148  uint8_t i;
149  k->i_1 = 0;
150  for(i=0; i<POOL_SIZE_FIELD; i++)
151  {
152  field_elt_init((k->pool_1)[i], k);
153  }
154 #if MPHELL_USE_MULTITHREADING == 1
155  k->i_2 = 0;
156  for(i=0; i<POOL_SIZE_FIELD; i++)
157  {
158  field_elt_init((k->pool_2)[i], k);
159  }
160 #endif
161 }
162 
163 void
165 {
166  switch(k->type)
167  {
168  case FP :
169  fp_copy(k_res->param, k->param);
170  break;
171 
172  case FP2 :
173  fp2_copy(k_res->param, k->param);
174  break;
175 
176  case FP3 :
177  fp3_copy(k_res->param, k->param);
178  break;
179  }
180 }
181 
182 void
184 {
185  switch(k->type)
186  {
187  case FP :
188  fp_free(k->param);
189  break;
190 
191  case FP2 :
192  fp2_free(k->param);
193  break;
194 
195  case FP3 :
196  fp3_free(k->param);
197  break;
198  }
199  k->size = 0;
200  free(k->param);
201  k->param = NULL;
202 
203  /* Pools free */
204  uint8_t i;
205  k->i_1 = 0;
206  for(i=0; i<POOL_SIZE_FIELD; i++)
207  {
208  field_elt_free(&(k->pool_1)[i], k);
209  }
210 #if MPHELL_USE_MULTITHREADING == 1
211  k->i_2 = 0;
212  for(i=0; i<POOL_SIZE_FIELD; i++)
213  {
214  field_elt_free(&(k->pool_2)[i], k);
215  }
216 #endif
217 }
218 
219 void
220 field_get_size (number_ptr c, field_srcptr k)
221 {
222  switch(k->type)
223  {
224  case FP :
226  break;
227 
228  case FP2 :
229  fp2_get_size(c, k->param);
230  break;
231 
232  case FP3 :
233  fp3_get_size(c, k->param);
234  break;
235  }
236 }
237 
238 void
240 {
241  switch(k->type)
242  {
243  case FP :
245  break;
246 
247  case FP2 :
249  break;
250 
251  case FP3 :
253  break;
254  }
255 }
256 
257 /*void*/
258 /*field_get_pm2(char* str, field_srcptr k)*/
259 /*{*/
260 /* switch(k->type)*/
261 /* {*/
262 /* case FP :*/
263 /* fp_get_pm2(str, k->param);*/
264 /* break;*/
265 
266 /* case FP2 :*/
267 /* fp2_get_pm2(str, k->param);*/
268 /* break;*/
269 
270 /* case FP3 :*/
271 /* fp3_get_pm2(str, k->param);*/
272 /* break;*/
273 /* }*/
274 /*}*/
275 
276 void
278 {
279  switch(k->type)
280  {
281  case FP :
282  *dst = (fp_elt *)malloc(sizeof(fp_elt));
283  fp_elt_alloc((fp_elt *)(*dst), k->param);
284  break;
285 
286  case FP2 :
287  *dst = (fp_elt *)malloc(sizeof(fp2_elt));
288  fp2_elt_alloc((fp2_elt *)(*dst), k->param);
289  break;
290 
291  case FP3 :
292  *dst = (fp_elt *)malloc(sizeof(fp3_elt));
293  fp3_elt_alloc((fp3_elt *)(*dst), k->param);
294  break;
295  }
296 }
297 
298 void
300 {
301  switch(k->type)
302  {
303  case FP :
304  fp_elt_init((fp_elt_ptr)(*dst), k->param);
305  break;
306 
307  case FP2 :
308  fp2_elt_init((fp2_elt_ptr)dst, k->param);
309  break;
310 
311  case FP3 :
312  fp3_elt_init((fp3_elt_ptr)dst, k->param);
313  break;
314  }
315 }
316 
317 void
319 {
320  switch(k->type)
321  {
322  case FP :
323  fp_elt_copy((fp_elt_ptr)(*dst), (fp_elt_srcptr)(*src), k->param);
324  break;
325 
326  case FP2 :
328  break;
329 
330  case FP3 :
332  break;
333  }
334 }
335 
336 void
338 {
339  switch(k->type)
340  {
341  case FP :
342  fp_elt_clear((fp_elt *)(*src));
343  break;
344 
345  case FP2 :
346  fp2_elt_clear((fp2_elt *)(*src));
347  break;
348 
349  case FP3 :
350  fp3_elt_clear((fp3_elt *)(*src));
351  break;
352  }
353 }
354 
355 void
357 {
358  switch(k->type)
359  {
360  case FP :
361  fp_elt_free((fp_elt *)(*src));
362  break;
363 
364  case FP2 :
365  fp2_elt_free((fp2_elt *)(*src));
366  break;
367 
368  case FP3 :
369  fp3_elt_free((fp3_elt *)(*src));
370  break;
371  }
372  free(*src);
373 }
374 
375 void
377 {
378  switch(k->type)
379  {
380  case FP :
381  fp_elt_set_one((fp_elt_ptr)(*dst), k->param);
382  break;
383 
384  case FP2 :
386  break;
387 
388  case FP3 :
390  break;
391  }
392 }
393 
394 void
395 field_elt_set_ui (fe_ptr dst, const block src, const bool isreduced,
396  field_srcptr k, uint8_t stack)
397 {
398  switch(k->type)
399  {
400  case FP :
401  fp_elt_set_ui((fp_elt_ptr)(*dst), src, isreduced, k->param, stack);
402  break;
403 
404  case FP2 :
405  fp2_elt_set_ui((fp2_elt_ptr)dst, src, isreduced, k->param, stack);
406  break;
407 
408  case FP3 :
409  fp3_elt_set_ui((fp3_elt_ptr)dst, src, isreduced, k->param, stack);
410  break;
411  }
412 }
413 
414 void
415 field_elt_set_number (fe_ptr dst, const bool isreduced, field_srcptr k, uint8_t stack, const uint32_t n, ...)
416 {
417  va_list va;
418  va_start(va, n);
419  number_t *n1, *n2, *n3;
420  switch(k->type)
421  {
422  case FP :
423  n1 = va_arg(va, number_t *);
424  fp_elt_set_number((fp_elt_ptr)(*dst), n1, isreduced, k->param, stack);
425  break;
426 
427  case FP2 :
428  if(n == 1)
429  {
430  n1 = va_arg(va, number_t *);
431  fp2_elt_set_number((fp2_elt_ptr)dst, n1, isreduced, k->param, stack);
432  }
433  else
434  {
435  n1 = va_arg(va, number_t *);
436  n2 = va_arg(va, number_t *);
437  fp2_elt_set((fp2_elt_ptr)dst, n1, n2, isreduced, k->param, stack);
438  }
439  break;
440 
441  case FP3 :
442  if(n == 1)
443  {
444  n1 = va_arg(va, number_t *);
445  fp3_elt_set_number((fp3_elt_ptr)dst, n1, isreduced, k->param, stack);
446  }
447  else
448  {
449  n1 = va_arg(va, number_t *);
450  n2 = va_arg(va, number_t *);
451  n3 = va_arg(va, number_t *);
452  fp3_elt_set((fp3_elt_ptr)dst, n1, n2, n3, isreduced, k->param, stack);
453  }
454  break;
455  }
456  va_end(va);
457 }
458 
459 void
460 field_elt_set_fp_elts (fe_ptr dst, field_srcptr k, const uint32_t n, ...)
461 {
462  va_list va;
463  va_start(va, n);
464  fp_elt *n1, *n2, *n3;
465  switch(k->type)
466  {
467  case FP :
468  n1 = va_arg(va, fp_elt *);
469  fp_elt_copy((fp_elt_ptr)(*dst), (fp_elt_srcptr)(*n1), k->param);
470  break;
471 
472  case FP2 :
473  if(n == 1)
474  {
475  n1 = va_arg(va, fp_elt *);
476  fp2_elt_set_fp_elt((fp2_elt_ptr)dst, (fp_elt_srcptr)(*n1), k->param);
477  }
478  else
479  {
480  n1 = va_arg(va, fp_elt *);
481  n2 = va_arg(va, fp_elt *);
482  fp2_elt_set_fp_elts((fp2_elt_ptr)dst, (fp_elt_srcptr)(*n1), (fp_elt_srcptr)(*n2), k->param);
483  }
484  break;
485 
486  case FP3 :
487  if(n == 1)
488  {
489  n1 = va_arg(va, fp_elt *);
490  fp3_elt_set_fp_elt((fp3_elt_ptr)dst, (fp_elt_srcptr)(*n1), k->param);
491  }
492  else
493  {
494  n1 = va_arg(va, fp_elt *);
495  n2 = va_arg(va, fp_elt *);
496  n3 = va_arg(va, fp_elt *);
497  fp3_elt_set_fp_elts((fp3_elt_ptr)dst, (fp_elt_srcptr)(*n1), (fp_elt_srcptr)(*n2), (fp_elt_srcptr)(*n3), k->param);
498  }
499  break;
500  }
501  va_end(va);
502 }
503 
504 void
505 field_elt_set_str (fe_ptr dst, const char *str, const uint8_t base,
506  const bool isreduced, field_srcptr k, uint8_t stack)
507 {
508  switch(k->type)
509  {
510  case FP :
511  fp_elt_set_str((fp_elt_ptr)(*dst), str, base, isreduced, k->param, stack);
512  break;
513 
514  case FP2 :
515  fp2_elt_set_str((fp2_elt_ptr)dst, str, base, isreduced, k->param, stack);
516  break;
517 
518  case FP3 :
519  fp3_elt_set_str((fp3_elt_ptr)dst, str, base, isreduced, k->param, stack);
520  break;
521  }
522 }
523 
524 void
525 field_elt_random (fe_ptr dst, field_srcptr k, uint8_t stack)
526 {
527  switch(k->type)
528  {
529  case FP :
530  fp_elt_random((fp_elt_ptr)(*dst), k->param, stack);
531  break;
532 
533  case FP2 :
534  fp2_elt_random((fp2_elt_ptr)dst, k->param, stack);
535  break;
536 
537  case FP3 :
538  fp3_elt_random((fp3_elt_ptr)dst, k->param, stack);
539  break;
540  }
541 }
542 
543 void
544 field_elt_lift (fe_ptr dst, fe_srcptr src, field_srcptr k, uint8_t stack)
545 {
546  switch(k->type)
547  {
548  case FP :
549  fp_elt_lift((fp_elt_ptr)(*dst), (fp_elt_srcptr)(*src), k->param, stack);
550  break;
551 
552  case FP2 :
553  fp2_elt_lift((fp2_elt_ptr)dst, (fp2_elt_srcptr)src, k->param, stack);
554  break;
555 
556  case FP3 :
557  fp3_elt_lift((fp3_elt_ptr)dst, (fp3_elt_srcptr)src, k->param, stack);
558  break;
559  }
560 }
561 
562 void
563 field_elt_get_number (number_ptr dst, fe_srcptr src, uint8_t pos, field_srcptr k, uint8_t stack)
564 {
565  switch(k->type)
566  {
567  case FP :
568  fp_elt_get_number(dst, (fp_elt_srcptr)(*src), k->param, stack);
569  break;
570 
571  case FP2 :
572  if(pos == 1)
573  {
574  fp_elt_get_number(dst, ((fp2_elt *)src)->v0, ((fp2_param_t *)(k->param))->base, stack);
575  }
576  else if (pos == 2)
577  {
578  fp_elt_get_number(dst, ((fp2_elt *)src)->v1, ((fp2_param_t *)(k->param))->base, stack);
579  }
580  else
581  {
582  mphell_error("pos must be 1 or 2 to get first or second part of the FP2 element\n");
583  }
584  break;
585  case FP3 :
586  if(pos == 1)
587  {
588  fp_elt_get_number(dst, ((fp3_elt *)src)->v0, ((fp3_param_t *)(k->param))->base, stack);
589  }
590  else if (pos == 2)
591  {
592  fp_elt_get_number(dst, ((fp3_elt *)src)->v1, ((fp3_param_t *)(k->param))->base, stack);
593  }
594  else if (pos == 3)
595  {
596  fp_elt_get_number(dst, ((fp3_elt *)src)->v2, ((fp3_param_t *)(k->param))->base, stack);
597  }
598  else
599  {
600  mphell_error("pos must be 1, 2 or 3 to get first, second or third part of the FP3 element\n");
601  }
602  break;
603  }
604 }
605 
606 void
608 {
609  switch(k->type)
610  {
611  case FP :
612  fp_elt_copy((fp_elt_ptr)(*dst), (fp_elt_srcptr)(*src), k->param);
613  break;
614 
615  case FP2 :
616  if(pos == 1)
617  {
618  fp_elt_copy((fp_elt_ptr)(*dst), ((fp2_elt *)src)->v0, ((fp2_param_t *)(k->param))->base);
619  }
620  else if (pos == 2)
621  {
622  fp_elt_copy((fp_elt_ptr)(*dst), ((fp2_elt *)src)->v1, ((fp2_param_t *)(k->param))->base);
623  }
624  else
625  {
626  mphell_error("pos must be 1 or 2 to get first or second part of the FP2 element\n");
627  }
628  break;
629  case FP3 :
630  if(pos == 1)
631  {
632  fp_elt_copy((fp_elt_ptr)(*dst), ((fp3_elt *)src)->v0, ((fp3_param_t *)(k->param))->base);
633  }
634  else if (pos == 2)
635  {
636  fp_elt_copy((fp_elt_ptr)(*dst), ((fp3_elt *)src)->v1, ((fp3_param_t *)(k->param))->base);
637  }
638  else if (pos == 3)
639  {
640  fp_elt_copy((fp_elt_ptr)(*dst), ((fp3_elt *)src)->v2, ((fp3_param_t *)(k->param))->base);
641  }
642  else
643  {
644  mphell_error("pos must be 1, 2 or 3 to get first, second or third part of the FP3 element\n");
645  }
646  break;
647  }
648 }
649 
650 void
651 field_str (char **str, field_srcptr k, const uint8_t base, uint8_t stack)
652 {
653  char *def, *param_str = NULL;
654  switch(k->type)
655  {
656  case FP :
657  def = "Prime field :\n";
658  fp_str(&param_str, k->param, base, stack);
659  break;
660  case FP2 :
661  def = "Quadractic extension of prime field :\n";
662  fp2_str(&param_str, k->param, base, stack);
663  break;
664  case FP3 :
665  def = "Cubic extension of prime field :\n";
666  fp3_str(&param_str, k->param, base, stack);
667  break;
668  }
669  if(param_str != NULL)
670  {
671  *str = (char*)malloc(strlen(def) + strlen(param_str) + 2);
672  sprintf(*str, "%s%s", def, param_str);
673  free(param_str);
674  }
675  else
676  {
677  *str = NULL;
678  }
679 }
680 
681 void
682 field_print (field_srcptr k, const uint8_t base, uint8_t stack)
683 {
684  char *str;
685  field_str(&str, k, base, stack);
686  printf("%s\n", str);
687  free(str);
688 }
689 
690 void
691 field_elt_str (char **str, fe_srcptr src, const uint8_t base, const bool lift, field_srcptr k, uint8_t stack)
692 {
693  char *v_str = NULL;
694  switch(k->type)
695  {
696  case FP :
697  fp_elt_str(&v_str, (fp_elt_ptr)(*src), base, lift, k->param, stack);
698  break;
699 
700  case FP2 :
701  fp2_elt_str(&v_str, (fp2_elt_ptr)src, base, lift, k->param, stack);
702  break;
703 
704  case FP3 :
705  fp3_elt_str(&v_str, (fp3_elt_ptr)src, base, lift, k->param, stack);
706  break;
707  }
708  if(v_str != NULL)
709  {
710  *str = (char*)malloc(strlen(v_str)+1);
711  strcpy(*str, v_str);
712  free(v_str);
713  }
714  else
715  {
716  *str = NULL;
717  }
718 }
719 
720 void
721 field_elt_print (fe_srcptr src, const uint8_t base, const bool lift, field_srcptr k, uint8_t stack)
722 {
723  char *str;
724  field_elt_str(&str, src, base, lift, k, stack);
725  printf("%s", str);
726  free(str);
727 }
728 
729 /*************************COMPARISON AND LOGICAL******************************/
730 
731 int8_t
733 {
734  int8_t res = -1;
735  switch(k->type)
736  {
737  case FP :
738  res = fp_elt_cmp((fp_elt_srcptr)(*src1), (fp_elt_srcptr)(*src2), k->param);
739  break;
740 
741  case FP2 :
742  res = fp2_elt_cmp((fp2_elt_srcptr)src1, (fp2_elt_srcptr)src2, k->param);
743  break;
744 
745  case FP3 :
746  res = fp3_elt_cmp((fp3_elt_srcptr)src1, (fp3_elt_srcptr)src2, k->param);
747  break;
748  }
749  return res;
750 }
751 
752 int8_t
754 {
755  int8_t res = -1;
756  switch(k->type)
757  {
758  case FP :
759  res = fp_elt_cmp((fp_elt_srcptr)(*src1), (fp_elt_srcptr)(*src2), k->param);
760  break;
761 
762  case FP2 :
763  res = fp2_elt_cmp_fp_elt((fp2_elt_srcptr)src1, (fp_elt_srcptr)(*src2), k->param);
764  break;
765 
766  case FP3 :
767  res = fp3_elt_cmp_fp_elt((fp3_elt_srcptr)src1, (fp_elt_srcptr)(*src2), k->param);
768  break;
769  }
770  return res;
771 }
772 
773 bool
775 {
776  bool res = false;
777  switch(k->type)
778  {
779  case FP :
780  res = fp_elt_isone((fp_elt_srcptr)(*src), k->param);
781  break;
782 
783  case FP2 :
784  res = fp2_elt_isone((fp2_elt_srcptr)src, k->param);
785  break;
786 
787  case FP3 :
788  res = fp3_elt_isone((fp3_elt_srcptr)src, k->param);
789  break;
790  }
791  return res;
792 }
793 
794 /* bool field_elt_iszero (fe_srcptr src, field_srcptr k){} is inline */
795 
796 bool
798 {
799  int8_t res = 0;
800  int8_t res1 = 0;
801  int8_t res2 = 0;
802 
803  if (k1->type != k2->type)
804  {
805  return false;
806  }
807  else
808  {
809  switch(k1->type)
810  {
811  case FP :
812  res = number_cmp(((fp_param)k1->param)->p, ((fp_param)k2->param)->p);
813  break;
814 
815  case FP2 :
816  res1 = number_cmp(((fp2_param)k1->param)->q, ((fp2_param)k2->param)->q);
817  res2 = fp_elt_cmp(((fp2_param)k1->param)->non_residue, ((fp2_param)k2->param)->non_residue, ((fp2_param)k1->param)->base);
818  if((res1==0) && (res2 ==0))
819  {
820  res = 0;
821  }
822  else
823  {
824  res=1;
825  }
826  break;
827 
828  case FP3 :
829  res1 = number_cmp(((fp3_param)k1->param)->q, ((fp3_param)k2->param)->q);
830  res2 = fp_elt_cmp(((fp3_param)k1->param)->non_residue, ((fp3_param)k2->param)->non_residue, ((fp3_param)k1->param)->base);
831  if((res1==0) && (res2 ==0))
832  {
833  res = 0;
834  }
835  else
836  {
837  res=1;
838  }
839  res = 0;
840  break;
841  }
842  return (res == 0);
843  }
844 }
845 
846 /***************************ADDITION SUBTRACTION******************************/
847 
848 /* void field_elt_inc (fe_ptr dst, fe_srcptr src, field_srcptr k){} is inline */
849 
850 /* void field_elt_add (fe_ptr dst, fe_srcptr src1, fe_srcptr src2, field_srcptr k){} is inline */
851 
852 /* void field_elt_add_fp_elt (fe_ptr dst, fe_srcptr src1, fe_srcptr src2, field_srcptr k){} is inline */
853 
854 /* void field_elt_dec (fe_ptr dst, fe_srcptr src, field_srcptr k){} is inline */
855 
856 /* void field_elt_sub (fe_ptr dst, fe_srcptr src1, fe_srcptr src2, field_srcptr k){} is inline */
857 
858 /* void field_elt_sub_fp_elt (fe_ptr dst, fe_srcptr src1, fe_srcptr src2, field_srcptr k){} is inline */
859 
860 /* void field_elt_neg (fe_ptr dst, fe_srcptr src, field_srcptr k){} is inline */
861 
862 /* void field_elt_neg_fp_elt (fe_ptr dst, fe_srcptr src, field_srcptr k){} is inline */
863 
864 /*******************************MULTIPLICATION********************************/
865 
866 /* void field_elt_mul (fe_ptr dst, fe_srcptr src1, fe_srcptr src2, field_srcptr k, uint8_t stack){} is inline */
867 
868 /* void field_elt_mul_fp_elt (fe_ptr dst, fe_srcptr src1, fe_srcptr src2, field_srcptr k, uint8_t stack){} is inline */
869 
870 /* void field_elt_mul2 (fe_ptr dst, fe_srcptr src, field_srcptr k){} is inline */
871 
872 /* void field_elt_mul4 (fe_ptr dst, fe_srcptr src, field_srcptr k){} is inline */
873 
874 /* void field_elt_mul8 (fe_ptr dst, fe_srcptr src, field_srcptr k){} is inline */
875 
876 /* void field_elt_mul3 (fe_ptr dst, fe_srcptr src, field_srcptr k, uint8_t stack){} is inline */
877 
878 /* void field_elt_sqr (fe_ptr dst, fe_srcptr src, field_srcptr k, uint8_t stack){} is inline */
879 
880 /* void field_elt_sqr_fp_elt (fe_ptr dst, fe_srcptr src, field_srcptr k, uint8_t stack){} is inline */
881 
882 void
883 field_elt_pow_ui (fe_ptr dst, fe_srcptr src, const block n, field_srcptr k, uint8_t stack)
884 {
885  switch(k->type)
886  {
887  case FP :
888  fp_elt_pow_ui((fp_elt_ptr)(*dst), (fp_elt_srcptr)(*src), n, k->param, stack);
889  break;
890 
891  case FP2 :
892  fp2_elt_pow_ui((fp2_elt_ptr)dst, (fp2_elt_srcptr)src, n, k->param, stack);
893  break;
894 
895  case FP3 :
896  fp3_elt_pow_ui((fp3_elt_ptr)dst, (fp3_elt_srcptr)src, n, k->param, stack);
897  break;
898  }
899 }
900 
901 void
902 field_elt_pow_number (fe_ptr dst, fe_srcptr src, number_srcptr n, field_srcptr k, uint8_t stack)
903 {
904  switch(k->type)
905  {
906  case FP :
907  fp_elt_pow_number((fp_elt_ptr)(*dst), (fp_elt_srcptr)(*src), n, k->param, stack);
908  break;
909 
910  case FP2 :
911  fp2_elt_pow_number((fp2_elt_ptr)dst, (fp2_elt_srcptr)src, n, k->param, stack);
912  break;
913 
914  case FP3 :
915  fp3_elt_pow_number((fp3_elt_ptr)dst, (fp3_elt_srcptr)src, n, k->param, stack);
916  break;
917  }
918 }
919 
920 bool
922 {
923  bool res = false;
924  switch(k->type)
925  {
926  case FP :
927  res = fp_elt_issquare((fp_elt_srcptr)(*src), k->param, stack);
928  break;
929  case FP2 :
930  res = fp2_elt_issquare((fp2_elt_srcptr)src, k->param, stack);
931  break;
932  case FP3 :
933  res = fp3_elt_issquare((fp3_elt_srcptr)src, k->param, stack);
934  break;
935  }
936  return res;
937 }
938 
939 int8_t
940 field_elt_ispower_ui (fe_srcptr src, const block n, field_srcptr k, uint8_t stack)
941 {
942  int8_t res = 0;
943  switch(k->type)
944  {
945  case FP :
946  res = fp_elt_ispower_ui((fp_elt_srcptr)(*src), n, k->param, stack);
947  break;
948 
949  case FP2 :
950  res = fp2_elt_ispower_ui((fp2_elt_srcptr)src, n, k->param, stack);
951  break;
952 
953  case FP3 :
954  res = fp3_elt_ispower_ui((fp3_elt_srcptr)src, n, k->param, stack);
955  break;
956  }
957  return res;
958 }
959 
960 int8_t
961 field_elt_ispower_number (fe_srcptr src, number_srcptr n, field_srcptr k, uint8_t stack)
962 {
963  int8_t res = 0;
964  switch(k->type)
965  {
966  case FP :
967  res = fp_elt_ispower_number((fp_elt_srcptr)(*src), n, k->param, stack);
968  break;
969 
970  case FP2 :
971  res = fp2_elt_ispower_number((fp2_elt_srcptr)src, n, k->param, stack);
972  break;
973 
974  case FP3 :
975  res = fp3_elt_ispower_number((fp3_elt_srcptr)src, n, k->param, stack);
976  break;
977  }
978  return res;
979 }
980 
981 void
982 field_find_nonsquare (fe_ptr dst, field_ptr k, uint8_t stack)
983 {
984  do
985  {
986  field_elt_random(dst, k, stack);
987  } while (field_elt_issquare(dst, k, stack));
988 }
989 
990 bool
991 field_find_nonpower_ui (fe_ptr dst, const block n, field_ptr k, uint8_t stack)
992 {
993  int8_t res = 0;
994  do
995  {
996  field_elt_random(dst, k, stack);
997  res = field_elt_ispower_ui(dst, n, k, stack);
998  } while (res==1);
999  if(res == 2)
1000  {
1001  /* All the elements in k are some n-power */
1002  return false;
1003  }
1004  return true;
1005 }
1006 
1007 bool
1008 field_find_nonpower_number (fe_ptr dst, number_srcptr n, field_ptr k, uint8_t stack)
1009 {
1010  int8_t res = 0;
1011  do
1012  {
1013  field_elt_random(dst, k, stack);
1014  res = field_elt_ispower_number(dst, n, k, stack);
1015  } while (res==1);
1016  if(res == 2)
1017  {
1018  /* All the elements in k are some n-power */
1019  return false;
1020  }
1021  return true;
1022 }
1023 
1024 void
1025 field_elt_sqrt (fe_ptr dst, fe_srcptr src, field_srcptr k, uint8_t stack)
1026 {
1027  MPHELL_ASSERT_ALWAYS(field_elt_issquare(src, k, stack), "field_elt_sqrt : src \
1028  is not a square in k");
1029  switch(k->type)
1030  {
1031  case FP :
1032  fp_elt_sqrt((fp_elt_ptr)(*dst), (fp_elt_srcptr)(*src), k->param, stack);
1033  break;
1034 
1035  case FP2 :
1036  fp2_elt_sqrt((fp2_elt_ptr)dst, (fp2_elt_srcptr)src, k->param, stack);
1037  break;
1038 
1039  case FP3 :
1040  fp3_elt_sqrt((fp3_elt_ptr)dst, (fp3_elt_srcptr)src, k->param, stack);
1041  break;
1042  }
1043 }
1044 
1045 void
1046 field_elt_cube_root (fe_ptr dst, fe_srcptr src, field_srcptr k, uint8_t stack)
1047 {
1048  MPHELL_ASSERT_ALWAYS(field_elt_ispower_ui (src, 3, k, stack), "field_elt_cube_root \
1049  : src is not a cube in k");
1050  switch(k->type)
1051  {
1052  case FP :
1053  fp_elt_cube_root((fp_elt_ptr)(*dst), (fp_elt_srcptr)(*src), k->param, stack);
1054  break;
1055 
1056  case FP2 :
1057  fp2_elt_cube_root((fp2_elt_ptr)dst, (fp2_elt_srcptr)src, k->param, stack);
1058  break;
1059 
1060  case FP3 :
1061  fp3_elt_cube_root((fp3_elt_ptr)dst, (fp3_elt_srcptr)src, k->param, stack);
1062  break;
1063  }
1064 }
1065 
1066 void
1067 field_elt_unity_nth_root (fe_ptr dst, const block n, field_ptr k, uint8_t stack)
1068 {
1069  switch(k->type)
1070  {
1071  case FP :
1072  fp_elt_unity_nth_root((fp_elt_ptr)(*dst), n, k->param, stack);
1073  break;
1074 
1075  case FP2 :
1076  fp2_elt_unity_nth_root((fp2_elt_ptr)dst, n, k->param, stack);
1077  break;
1078 
1079  case FP3 :
1080  fp3_elt_unity_nth_root((fp3_elt_ptr)dst, n, k->param, stack);
1081  break;
1082  }
1083 }
1084 
1085 /**********************************DIVISION***********************************/
1086 
1087 void
1088 field_elt_inv (fe_ptr dst, fe_srcptr src, field_srcptr k, uint8_t stack)
1089 {
1090  switch(k->type)
1091  {
1092  case FP :
1093  fp_elt_inv((fp_elt_ptr)(*dst), (fp_elt_srcptr)(*src), k->param, stack);
1094  break;
1095 
1096  case FP2 :
1097  fp2_elt_inv((fp2_elt_ptr)dst, (fp2_elt_srcptr)src, k->param, stack);
1098  break;
1099 
1100  case FP3 :
1101  fp3_elt_inv((fp3_elt_ptr)dst, (fp3_elt_srcptr)src, k->param, stack);
1102  break;
1103  }
1104 }
1105 
1106 void
1108 {
1109  switch(k->type)
1110  {
1111  case FP :
1112  fp_elt_inv((fp_elt_ptr)(*dst), (fp_elt_srcptr)(*src), k->param, stack);
1113  break;
1114 
1115  case FP2 :
1116  fp2_elt_inv_fp_elt((fp2_elt_ptr)dst, (fp_elt_srcptr)(*src), k->param, stack);
1117  break;
1118 
1119  case FP3 :
1120  fp3_elt_inv_fp_elt((fp3_elt_ptr)dst, (fp_elt_srcptr)(*src), k->param, stack);
1121  break;
1122  }
1123 }
1124 
1125 /* Not tested */
1126 /*void*/
1127 /*field_elt_inv_pm2 (fe_ptr dst, fe_srcptr src, field_srcptr k, uint8_t stack)*/
1128 /*{*/
1129 /* char * pm2;*/
1130 /* pm2=malloc((k2->bit_size+1)*sizeof(char));*/
1131 /* switch(k->type)*/
1132 /* {*/
1133 /* case FP :*/
1134 /* {*/
1135 /* fp_get_pm2(pm2, k->param);*/
1136 /* break;*/
1137 /* }*/
1138 /* case FP2 :*/
1139 /* {*/
1140 /* fp2_get_pm2(pm2, k->param);*/
1141 /* break;*/
1142 /* }*/
1143 /* */
1144 /* case FP3 :*/
1145 /* {*/
1146 /* fp3_get_pm2(pm2, k->param);*/
1147 /* break;*/
1148 /* }*/
1149 /* default :*/
1150 /* {*/
1151 /* break;*/
1152 /* }*/
1153 /* }*/
1154 /* field_elt y, dst2, dst3;*/
1155 
1156 /* */
1157 
1158 /* int i, len;*/
1159 /* field_elt_get_pool_elt(&y, (field_ptr)k, stack);*/
1160 /* field_elt_get_pool_elt(&dst2, (field_ptr)k, stack);*/
1161 /* field_elt_get_pool_elt(&dst3, (field_ptr)k, stack);*/
1162 /* */
1163 /* field_elt_copy(y, src, k);*/
1164 /* field_elt_set_one(dst2, k);*/
1165 /* */
1166 /* len=(int)strlen(pm2);*/
1167 /* */
1168 /* for(i=len-1; i>=0; i--)*/
1169 /* { */
1170 /* field_elt_sqr(dst2, dst2, k, stack);*/
1171 /* if (pm2[i]=='1')*/
1172 /* {*/
1173 /* field_elt_mul(dst2, dst2, y, k, stack);*/
1174 /* }*/
1175 /* else*/
1176 /* {*/
1177 /* field_elt_mul(dst3, y, dst3, k, stack);*/
1178 /* }*/
1179 /* }*/
1180 /* field_elt_copy(dst, dst2, k);*/
1181 /* field_elt_mul(dst3, dst2, src, k, stack);*/
1182 /* if(!field_elt_isone(dst3,k))*/
1183 /* {*/
1184 /* printf("\nInversion echouee: src*src^{-1}=");*/
1185 /* field_elt_print(dst3, 10, true, k, stack);*/
1186 /* }*/
1187 /* field_elt_relax_pool_elt(&y, (field_ptr)k, stack);*/
1188 /* field_elt_relax_pool_elt(&dst2, (field_ptr)k, stack);*/
1189 /* field_elt_relax_pool_elt(&dst3, (field_ptr)k, stack);*/
1190 /*}*/
1191 
1192 void
1193 field_elt_div (fe_ptr dst, fe_srcptr src1, fe_srcptr src2, field_srcptr k, uint8_t stack)
1194 {
1195  switch(k->type)
1196  {
1197  case FP :
1198  fp_elt_div((fp_elt_ptr)(*dst), (fp_elt_srcptr)(*src1), (fp_elt_srcptr)(*src2), k->param, stack);
1199  break;
1200 
1201  case FP2 :
1202  fp2_elt_div((fp2_elt_ptr)dst, (fp2_elt_srcptr)src1, (fp2_elt_srcptr)src2, k->param, stack);
1203  break;
1204 
1205  case FP3 :
1206  fp3_elt_div((fp3_elt_ptr)dst, (fp3_elt_srcptr)src1, (fp3_elt_srcptr)src2, k->param, stack);
1207  break;
1208  }
1209 }
1210 
1211 void
1212 field_elt_div_fp_elt (fe_ptr dst, fe_srcptr src1, fe_srcptr src2, field_srcptr k, uint8_t stack)
1213 {
1214  switch(k->type)
1215  {
1216  case FP :
1217  fp_elt_div((fp_elt_ptr)(*dst), (fp_elt_srcptr)(*src1), (fp_elt_srcptr)(*src2), k->param, stack);
1218  break;
1219 
1220  case FP2 :
1221  fp2_elt_div_fp_elt((fp2_elt_ptr)dst, (fp2_elt_srcptr)src1, (fp_elt_srcptr)(*src2), k->param, stack);
1222  break;
1223 
1224  case FP3 :
1225  fp3_elt_div_fp_elt((fp3_elt_ptr)dst, (fp3_elt_srcptr)src1, (fp_elt_srcptr)(*src2), k->param, stack);
1226  break;
1227  }
1228 }
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
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:197
void fp2_elt_alloc(fp2_elt *dst, const fp2_param param)
Allocate space for a quadratic extension field element.
Definition: mphell-fp2.c:162
void field_elt_unity_nth_root(fe_ptr dst, const block n, field_ptr k, uint8_t stack)
Set dst to a non trivial n-th root of unity if it exists (ie n divides order(k)-1),...
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
int8_t field_elt_cmp_fp_elt(fe_srcptr src1, fe_srcptr src2, field_srcptr k)
Compare src1 and src2.
Definition: mphell-field.c:753
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 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_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:742
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:183
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:176
void field_elt_free(fe_ptr *src, field_srcptr k)
Free space used by src.
Definition: mphell-field.c:356
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
Declaration of field functions.
uint16_t bit_size
Definition: mphell-field.h:95
void fp_elt_pow_number(fp_elt_ptr dst, fp_elt_srcptr src, number_srcptr n, const fp_param param, uint8_t stack)
Set dst <- src^n.
Definition: mphell-fp.c:806
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:267
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
uint16_t number_log2(number_srcptr src)
Calculate log2(src), which is the binary size of src.
void mphell_error(char *expr)
Write in stderr, filename, line and expr, free mphell.
Definition: mphell-errors.c:45
void fp3_elt_init(fp3_elt_ptr dst, const fp3_param param)
Initialise a cubic extension field element.
Definition: mphell-fp3.c:182
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:1007
void fp_elt_free(fp_elt *src)
Free space used by src.
Definition: mphell-fp.c:385
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:554
Define a field.
Definition: mphell-field.h:90
void field_elt_inv_fp_elt(fe_ptr dst, fe_srcptr src, field_srcptr k, uint8_t stack)
Set dst <- src^(-1)
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 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 fp2_free(fp2_param param)
Free the space of the quadratic extension field informations structure.
Definition: mphell-fp2.c:133
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
field_elt pool_1[POOL_SIZE_FIELD]
Definition: mphell-field.h:96
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
enum fp_id_e fp_id
Identifier for known field, use by IPPCP to accelerate the field arithmetic.
Definition: mphell-fp.h:143
bool fp3_elt_isone(fp3_elt_srcptr src, const fp3_param param)
Test if src is one.
Definition: mphell-fp3.c:370
void field_elt_sqrt(fe_ptr dst, fe_srcptr src, field_srcptr k, uint8_t stack)
Set dst <- src^(1/2)
void field_elt_alloc(fe_ptr *dst, field_srcptr k)
Allocate space for a field element.
Definition: mphell-field.c:277
void fp_elt_pow_ui(fp_elt_ptr dst, fp_elt_srcptr src, const block n, const fp_param param, uint8_t stack)
Set dst <- src^n.
Definition: mphell-fp.c:763
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:204
void field_elt_div(fe_ptr dst, fe_srcptr src1, fe_srcptr src2, field_srcptr k, uint8_t stack)
Set dst <- src1 / src2.
uint8_t size
Definition: mphell-field.h:94
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
void field_elt_div_fp_elt(fe_ptr dst, fe_srcptr src1, fe_srcptr src2, field_srcptr k, uint8_t stack)
Set dst <- src1 / src2.
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:227
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
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
bool field_elt_isone(fe_srcptr src, field_srcptr k)
Test if src is one.
Definition: mphell-field.c:774
void field_elt_cube_root(fe_ptr dst, fe_srcptr src, field_srcptr k, uint8_t stack)
Set dst <- src^(1/3)
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_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 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:294
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:634
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_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:260
void fp_create(fp_param param, number_srcptr p, fp_id id, uint8_t stack)
Create a prime field of characteristic p.
Definition: mphell-fp.c:126
void field_elt_set_one(fe_ptr dst, field_srcptr k)
Set dst to one (or its Montgomery form if Montgomery arithmetic is used)
Definition: mphell-field.c:376
bool field_isequal(field_srcptr k1, field_srcptr k2)
Test if k1 and k2 are equals.
Definition: mphell-field.c:797
bool field_find_nonpower_number(fe_ptr dst, number_srcptr n, field_ptr k, uint8_t stack)
Look for a random non n-power element in k.
void field_elt_copy(fe_ptr dst, fe_srcptr src, field_srcptr k)
Copy src into dst, src and dst must belong to the same field.
Definition: mphell-field.c:318
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:819
void field_create(field_ptr k, const char *id, uint8_t stack, const uint32_t n,...)
Initialize the different fields of the structure pointed by k.
Definition: mphell-field.c:76
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
void field_elt_get_number(number_ptr dst, fe_srcptr src, uint8_t pos, field_srcptr k, uint8_t stack)
If Montgomery arithmetic is used, lift src (which is into Montgomery form) to classical fp (or its co...
Definition: mphell-field.c:563
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
bool fp2_elt_isone(fp2_elt_srcptr src, const fp2_param param)
Test if src is one.
Definition: mphell-fp2.c:335
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 fp_free(fp_param param)
Free the space of the prime field informations structure.
Definition: mphell-fp.c:292
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 field_elt_set_fp_elts(fe_ptr dst, field_srcptr k, const uint32_t n,...)
Set dst to src(s)
Definition: mphell-field.c:460
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:508
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
int8_t fp_elt_ispower_number(fp_elt_srcptr src, number_srcptr n, const fp_param param, uint8_t stack)
Test if src is a n-power in Fp.
Definition: mphell-fp.c:909
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 field_get_size(number_ptr c, field_srcptr k)
Get the size of the field "k".
Definition: mphell-field.c:220
void field_elt_str(char **str, fe_srcptr src, const uint8_t base, const bool lift, field_srcptr k, uint8_t stack)
Converts src to string format in base specified by base.
Definition: mphell-field.c:691
bool fp_elt_isone(fp_elt_srcptr src, const fp_param param)
Test if src is one.
Definition: mphell-fp.c:654
void fp_elt_get_number(number_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 number (in FP...
Definition: mphell-fp.c:522
bool field_elt_issquare(fe_srcptr src, field_srcptr k, uint8_t stack)
Test if src is a square using the Lengendre symbol.
Definition: mphell-field.c:921
void field_elt_lift(fe_ptr dst, fe_srcptr src, field_srcptr k, uint8_t stack)
If Montgomery arithmetic is used, lift src (which is into Montgomery form) to classical fp (or its co...
Definition: mphell-field.c:544
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 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:543
void fp3_alloc(fp3_param param, const fp_param base)
Allocate space for the cubic extension field informations structure.
Definition: mphell-fp3.c:69
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:616
void field_elt_clear(fe_ptr *src, field_srcptr k)
Clear space used by src (remove the action of field_elt_init but let the one of field_elt_alloc)
Definition: mphell-field.c:337
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 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:274
const fp_elt * fe_srcptr
Pointer on a field element, the field element cannot be modified through this pointer.
Definition: mphell-field.h:51
void * param
Definition: mphell-field.h:92
void field_get_characteristic(number_ptr c, field_srcptr k)
Get the charactristic of the field "k".
Definition: mphell-field.c:239
int8_t field_elt_ispower_ui(fe_srcptr src, const block n, field_srcptr k, uint8_t stack)
Test if src is a n-power in src->k.
Definition: mphell-field.c:940
void field_elt_get_fp_elt(fe_ptr dst, fe_srcptr src, uint8_t pos, field_srcptr k)
Get the field_elt in position 1, 2 or 3 of the src element. Rmq: if src element is in FP,...
Definition: mphell-field.c:607
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
int8_t field_elt_cmp(fe_srcptr src1, fe_srcptr src2, field_srcptr k)
Compare src1 and src2.
Definition: mphell-field.c:732
void field_alloc(field_ptr k, const field_type type, const uint8_t size, field_ptr base)
Allocates space for the different fields of the structure pointed by k.
Definition: mphell-field.c:37
void 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:532
bool field_find_nonpower_ui(fe_ptr dst, const block n, field_ptr k, uint8_t stack)
Look for a random non n-power element in k.
Definition: mphell-field.c:991
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
uint8_t i_1
Definition: mphell-field.h:97
Cubic extension field element structure.
Definition: mphell-fp3.h:35
fp_elt * fe_ptr
Pointer on a field element.
Definition: mphell-field.h:45
void field_elt_inv(fe_ptr dst, fe_srcptr src, field_srcptr k, uint8_t stack)
Set dst <- src^(-1)
void fp_copy(fp_param param_res, const fp_param param)
Copy the prime field structure param into param_res.
Definition: mphell-fp.c:266
void field_copy(field_ptr k_res, field_srcptr k)
Copy the field structure param into param_res.
Definition: mphell-field.c:164
void fp2_elt_init(fp2_elt_ptr dst, const fp2_param param)
Initialise a quadratic extension field element.
Definition: mphell-fp2.c:169
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
field_type
Define the field type.
Definition: mphell-field.h:79
void field_elt_init(fe_ptr dst, field_srcptr k)
Initialise the field element.
Definition: mphell-field.c:299
void fp_elt_div(fp_elt_ptr dst, fp_elt_srcptr src1, fp_elt_srcptr src2, const fp_param param, uint8_t stack)
Set dst <- src1 / src2.
Definition: mphell-fp.c:740
void field_str(char **str, field_srcptr k, const uint8_t base, uint8_t stack)
Converts k to string format in base specified by base.
Definition: mphell-field.c:651
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
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
int8_t fp_elt_ispower_ui(fp_elt_srcptr src, const block n, const fp_param param, uint8_t stack)
Test if src is a n-power in Fp.
Definition: mphell-fp.c:865
Quadratic extension field element structure.
Definition: mphell-fp2.h:35
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:311
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 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:212
void field_elt_pow_number(fe_ptr dst, fe_srcptr src, number_srcptr n, field_srcptr k, uint8_t stack)
Set dst <- src^n.
Definition: mphell-field.c:902
Cubic extension field structure.
Definition: mphell-fp3.h:64
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:577
void field_elt_print(fe_srcptr src, const uint8_t base, const bool lift, field_srcptr k, uint8_t stack)
Print src in base specified by base.
Definition: mphell-field.c:721
char id[20]
Definition: mphell-field.h:102
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
int8_t number_cmp(number_srcptr src1, number_srcptr src2)
Compare src1 and src2.
void field_elt_pow_ui(fe_ptr dst, fe_srcptr src, const block n, field_srcptr k, uint8_t stack)
Set dst <- src^n.
Definition: mphell-field.c:883
void field_free(field_ptr k)
Free the space of the field informations structure.
Definition: mphell-field.c:183
void fp_elt_unity_nth_root(fp_elt_ptr dst, const block n, const fp_param param, uint8_t stack)
Set dst to a non trivial n-th root of unity if it exists (ie n divides p-1), 1 otherwise.
Definition: mphell-fp.c:1257
void field_find_nonsquare(fe_ptr dst, field_ptr k, uint8_t stack)
Look for a random non square element in k.
Definition: mphell-field.c:982
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:675
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:501
void fp_elt_cube_root(fp_elt_ptr dst, fp_elt_srcptr src, const fp_param param, uint8_t stack)
Set dst <- src^(1/3) mod p.
Definition: mphell-fp.c:1019
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 field_elt_set_str(fe_ptr dst, const char *str, const uint8_t base, const bool isreduced, field_srcptr k, uint8_t stack)
Set dst to str, if Montgomery arithmetic is used, is_reduced == false -> transform dst into its Montg...
Definition: mphell-field.c:505
Primary field parameters.
void fp3_elt_free(fp3_elt *src)
Free space used by src.
Definition: mphell-fp3.c:206
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:242
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
bool fp_elt_issquare(fp_elt_srcptr src, const fp_param param, uint8_t stack)
Test if src is a square using the Lengendre symbol.
Definition: mphell-fp.c:848
void field_elt_set_ui(fe_ptr dst, const block src, const bool isreduced, field_srcptr k, uint8_t stack)
Set dst to src, if Montgomery arithmetic is used, is_reduced == false -> transform dst into its Montg...
Definition: mphell-field.c:395
void fp_elt_sqrt(fp_elt_ptr dst, fp_elt_srcptr src, const fp_param param, uint8_t stack)
Set dst <- src^(1/2) mod p, using Tonelli–Shanks algorithm.
Definition: mphell-fp.c:956
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 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:235
void field_print(field_srcptr k, const uint8_t base, uint8_t stack)
Print the different fields of the structure pointed by k.
Definition: mphell-field.c:682
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
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_alloc(fp_param param, const uint8_t size)
Allocate space for the prime field informations structure.
Definition: mphell-fp.c:58
void fp2_get_characteristic(number_ptr c, const fp2_param param)
Get the characteristic of the quadratic extension field "param".
Definition: mphell-fp2.c:144
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:321
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
field_type type
Definition: mphell-field.h:93
void fp2_get_size(number_ptr c, const fp2_param param)
Get the size of the quadratic extension field "param".
Definition: mphell-fp2.c:150
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
Quadratic extension field structure.
Definition: mphell-fp2.h:63
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 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:220
void field_elt_random(fe_ptr dst, field_srcptr k, uint8_t stack)
Set dst to a random element of k, the random process is chosen at the MHELL initialisation.
Definition: mphell-field.c:525
void field_elt_set_number(fe_ptr dst, const bool isreduced, field_srcptr k, uint8_t stack, const uint32_t n,...)
Set dst to src, if Montgomery arithmetic is used, is_reduced == false -> transform dst into its Montg...
Definition: mphell-field.c:415
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_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 field_elt_ispower_number(fe_srcptr src, number_srcptr n, field_srcptr k, uint8_t stack)
Test if src is a n-power in src->k.
Definition: mphell-field.c:961
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
void fp2_elt_free(fp2_elt *src)
Free space used by src.
Definition: mphell-fp2.c:190