MPHELL  5.0.0
mphell-field.h
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 #ifndef MPHELL_FIELD_H
27 #define MPHELL_FIELD_H
28 
29 #include "mphell-fp.h"
30 #include "mphell-fp2.h"
31 #include "mphell-fp3.h"
32 
37 typedef fp_elt * field_elt;
38 
43 typedef fp_elt * fe_ptr;
44 
49 typedef const fp_elt * fe_srcptr;
50 
55 typedef enum
56 {
57  FP,
58  FP2,
59  FP3
61 
66 typedef struct
67 {
68  void *param;
70  uint8_t size;
71  uint16_t bit_size;
72  field_elt pool_1[POOL_SIZE_FIELD];
73  uint8_t i_1;
74 #if MPHELL_USE_MULTITHREADING == 1
75  field_elt pool_2[POOL_SIZE_FIELD];
76  uint8_t i_2;
77 #endif
78  char id[20];
79 }
80 field_t;
81 
86 typedef field_t field[1];
87 
92 typedef field_t * field_ptr;
93 
98 typedef const field_t * field_srcptr;
99 
100 /**************************************TMP**********************************/
101 
109 static inline void
110 field_elt_get_pool_elt (field_elt * dst, field_ptr k, uint8_t stack)
111 {
112 #if MPHELL_USE_MULTITHREADING == 0
113  MPHELL_ASSERT(stack == STACK_1, "field_elt_get_pool_elt, unknow stack \n");
114  MPHELL_ASSERT(k->i_1 < POOL_SIZE_FIELD, "field_elt_get_pool_elt, stack is too small \n");
115  *dst = (k->pool_1)[(k->i_1)++];
116 #elif MPHELL_USE_MULTITHREADING == 1
117  if(stack == STACK_1)
118  {
119  MPHELL_ASSERT(k->i_1 < POOL_SIZE_FIELD, "field_elt_get_pool_elt, stack is too small \n");
120  *dst = (k->pool_1)[(k->i_1)++];
121  }
122  else if (stack == STACK_2)
123  {
124  MPHELL_ASSERT(k->i_2 < POOL_SIZE_FIELD, "field_elt_get_pool_elt, stack is too small \n");
125  *dst = (k->pool_2)[(k->i_2)++];
126  }
127  else
128  {
129  *dst = 0;
130  mphell_error("field_elt_get_pool_elt, unknow stack \n");
131  }
132 #endif
133 }
134 
142 static inline void
144 {
145 #if MPHELL_USE_MULTITHREADING == 0
146  MPHELL_ASSERT(stack == STACK_1, "field_elt_relax_pool_elt, unknow stack \n");
147  (k->i_1)--;
148  MPHELL_ASSERT(k->i_1 >= 0, "k->i_1 is < 0 in pool 1\n");
149 #elif MPHELL_USE_MULTITHREADING == 1
150  if(stack == STACK_1)
151  {
152  (k->i_1)--;
153  MPHELL_ASSERT(k->i_1 >= 0, "k->i_1 is < 0 in pool 1\n");
154  }
155  else if (stack == STACK_2)
156  {
157  (k->i_2)--;
158  MPHELL_ASSERT(k->i_2 >= 0, "k->i_2 is < 0 in pool 2\n");
159  }
160  else
161  {
162  mphell_error("field_elt_relax_pool_elt, unknow stack \n");
163  }
164 #endif
165 }
166 
167 /************************************SETTERS**********************************/
168 
177 void
178 field_alloc (field_ptr k, const field_type type, const uint8_t size, field_ptr base);
179 
180 #if MPHELL_USE_AMNS == 1
187 void
188 field_set_amns (field_ptr k, amns_ptr AMNS);
189 #endif
190 
199 void
200 field_create (field_ptr k, const char* id, uint8_t stack, const uint32_t n, ...);
201 
208 void
210 
216 void
218 
225 void
226 field_get_size (number_ptr c, field_srcptr k);
227 
234 void
235 field_get_characteristic (number_ptr c, field_srcptr k);
236 
243 void
245 
252 void
254 
262 void
264 
271 void
273 
280 void
282 
289 void
291 
298 void
300 
310 void
311 field_elt_set_ui (fe_ptr dst, const block src, const bool isreduced,
312  field_srcptr k, uint8_t stack);
313 
323 void
324 field_elt_set_number (fe_ptr dst, const bool isreduced, field_srcptr k,
325  uint8_t stack, const uint32_t n, ...);
326 
335 void
336 field_elt_set_fp_elts (fe_ptr dst, field_srcptr k, const uint32_t n, ...);
337 
348 void
349 field_elt_set_str (fe_ptr dst, const char *str, const uint8_t base,
350  const bool isreduced, field_srcptr k, uint8_t stack);
351 
359 void
360 field_elt_random (fe_ptr dst, field_srcptr k, uint8_t stack);
361 
370 void
371 field_elt_lift (fe_ptr dst, fe_srcptr src, field_srcptr k, uint8_t stack);
372 
382 void
383 field_elt_get_number (number_ptr dst, fe_srcptr src, uint8_t pos, field_srcptr k, uint8_t stack);
384 
393 void
394 field_elt_get_fp_elt (fe_ptr dst, fe_srcptr src, uint8_t pos, field_srcptr k);
395 
404 void
405 field_str (char **str, field_srcptr k, const uint8_t base, uint8_t stack);
406 
414 void
415 field_print (field_srcptr k, const uint8_t base, uint8_t stack);
416 
427 void
428 field_elt_str (char **str, fe_srcptr src, const uint8_t base, const bool lift, field_srcptr k, uint8_t stack);
429 
439 void
440 field_elt_print (fe_srcptr src, const uint8_t base, const bool lift, field_srcptr k, uint8_t stack);
441 
450 bool
452 
453 
454 /*************************COMPARISON AND LOGICAL******************************/
455 
466 int8_t
468 
479 int8_t
481 
489 bool
491 
499 static inline bool
501 {
502  bool res = false;
503  switch(k->type)
504  {
505  case FP :
506  res = fp_elt_iszero((fp_elt_srcptr)(*src), k->param);
507  break;
508 
509  case FP2 :
510  res = fp2_elt_iszero((fp2_elt_srcptr)src, k->param);
511  break;
512 
513  case FP3 :
514  res = fp3_elt_iszero((fp3_elt_srcptr)src, k->param);
515  break;
516  }
517  return res;
518 }
519 
520 
521 /***************************ADDITION SUBTRACTION******************************/
522 
530 static inline void
532 {
533  switch(k->type)
534  {
535  case FP :
536  fp_elt_inc((fp_elt_ptr)(*dst), (fp_elt_srcptr)(*src), k->param);
537  break;
538 
539  case FP2 :
541  break;
542 
543  case FP3 :
545  break;
546  }
547 }
548 
557 static inline void
559 {
560  switch(k->type)
561  {
562  case FP :
563  fp_elt_add((fp_elt_ptr)(*dst), (fp_elt_srcptr)(*src1), (fp_elt_srcptr)(*src2), k->param);
564  break;
565 
566  case FP2 :
568  break;
569 
570  case FP3 :
572  break;
573  }
574 }
575 
584 static inline void
586 {
587  switch(k->type)
588  {
589  case FP :
590  fp_elt_add((fp_elt_ptr)(*dst), (fp_elt_srcptr)(*src1), (fp_elt_srcptr)(*src2), k->param);
591  break;
592 
593  case FP2 :
594  fp2_elt_add_fp_elt((fp2_elt_ptr)dst, (fp2_elt_srcptr)src1, (fp_elt_srcptr)(*src2), k->param);
595  break;
596 
597  case FP3 :
598  fp3_elt_add_fp_elt((fp3_elt_ptr)dst, (fp3_elt_srcptr)src1, (fp_elt_srcptr)(*src2), k->param);
599  break;
600  }
601 }
602 
610 static inline void
612 {
613  switch(k->type)
614  {
615  case FP :
616  fp_elt_dec((fp_elt_ptr)(*dst), (fp_elt_srcptr)(*src), k->param);
617  break;
618 
619  case FP2 :
621  break;
622 
623  case FP3 :
625  break;
626  }
627 }
628 
637 static inline void
639 {
640  switch(k->type)
641  {
642  case FP :
643  fp_elt_sub((fp_elt_ptr)(*dst), (fp_elt_srcptr)(*src1), (fp_elt_srcptr)(*src2), k->param);
644  break;
645 
646  case FP2 :
648  break;
649 
650  case FP3 :
652  break;
653  }
654 }
655 
664 static inline void
666 {
667  switch(k->type)
668  {
669  case FP :
670  fp_elt_sub((fp_elt_ptr)(*dst), (fp_elt_srcptr)(*src1), (fp_elt_srcptr)(*src2), k->param);
671  break;
672 
673  case FP2 :
674  fp2_elt_sub_fp_elt((fp2_elt_ptr)dst, (fp2_elt_srcptr)src1, (fp_elt_srcptr)(*src2), k->param);
675  break;
676 
677  case FP3 :
678  fp3_elt_sub_fp_elt((fp3_elt_ptr)dst, (fp3_elt_srcptr)src1, (fp_elt_srcptr)(*src2), k->param);
679  break;
680  }
681 }
682 
690 static inline void
692 {
693  switch(k->type)
694  {
695  case FP :
696  fp_elt_neg((fp_elt_ptr)(*dst), (fp_elt_srcptr)(*src), k->param);
697  break;
698 
699  case FP2 :
701  break;
702 
703  case FP3 :
705  break;
706  }
707 }
708 
716 static inline void
718 {
719  switch(k->type)
720  {
721  case FP :
722  fp_elt_neg((fp_elt_ptr)(*dst), (fp_elt_srcptr)(*src), k->param);
723  break;
724 
725  case FP2 :
726  fp2_elt_neg_fp_elt((fp2_elt_ptr)dst, (fp_elt_srcptr)(*src), k->param);
727  break;
728 
729  case FP3 :
730  fp3_elt_neg_fp_elt((fp3_elt_ptr)dst, (fp_elt_srcptr)(*src), k->param);
731  break;
732  }
733 }
734 
735 
736 
737 /*******************************MULTIPLICATION********************************/
738 
748 static inline void
749 field_elt_mul (fe_ptr dst, fe_srcptr src1, fe_srcptr src2, field_srcptr k, uint8_t stack)
750 {
751  switch(k->type)
752  {
753  case FP :
754  fp_elt_mul((fp_elt_ptr)(*dst), (fp_elt_srcptr)(*src1), (fp_elt_srcptr)(*src2), k->param, stack);
755  break;
756 
757  case FP2 :
758  fp2_elt_mul((fp2_elt_ptr)dst, (fp2_elt_srcptr)src1, (fp2_elt_srcptr)src2, k->param, stack);
759  break;
760 
761  case FP3 :
762  fp3_elt_mul((fp3_elt_ptr)dst, (fp3_elt_srcptr)src1, (fp3_elt_srcptr)src2, k->param, stack);
763  break;
764  }
765 }
766 
776 static inline void
777 field_elt_mul_fp_elt (fe_ptr dst, fe_srcptr src1, fe_srcptr src2, field_srcptr k, uint8_t stack)
778 {
779  switch(k->type)
780  {
781  case FP :
782  fp_elt_mul((fp_elt_ptr)(*dst), (fp_elt_srcptr)(*src1), (fp_elt_srcptr)(*src2), k->param, stack);
783  break;
784 
785  case FP2 :
786  fp2_elt_mul_fp_elt((fp2_elt_ptr)dst, (fp2_elt_srcptr)src1, (fp_elt_srcptr)(*src2), k->param, stack);
787  break;
788 
789  case FP3 :
790  fp3_elt_mul_fp_elt((fp3_elt_ptr)dst, (fp3_elt_srcptr)src1, (fp_elt_srcptr)(*src2), k->param, stack);
791  break;
792  }
793 }
794 
802 static inline void
804 {
805  switch(k->type)
806  {
807  case FP :
808  fp_elt_mul2((fp_elt_ptr)(*dst), (fp_elt_srcptr)(*src), k->param);
809  break;
810 
811  case FP2 :
813  break;
814 
815  case FP3 :
817  break;
818  }
819 }
820 
828 static inline void
830 {
831  switch(k->type)
832  {
833  case FP :
834  fp_elt_mul4((fp_elt_ptr)(*dst), (fp_elt_srcptr)(*src), k->param);
835  break;
836 
837  case FP2 :
839  break;
840 
841  case FP3 :
843  break;
844  }
845 }
846 
854 static inline void
856 {
857  switch(k->type)
858  {
859  case FP :
860  fp_elt_mul8((fp_elt_ptr)(*dst), (fp_elt_srcptr)(*src), k->param);
861  break;
862 
863  case FP2 :
865  break;
866 
867  case FP3 :
869  break;
870  }
871 }
872 
881 static inline void
882 field_elt_mul3 (fe_ptr dst, fe_srcptr src, field_srcptr k, uint8_t stack)
883 {
884  switch(k->type)
885  {
886  case FP :
887  fp_elt_mul3((fp_elt_ptr)(*dst), (fp_elt_srcptr)(*src), k->param, stack);
888  break;
889 
890  case FP2 :
891  fp2_elt_mul3((fp2_elt_ptr)dst, (fp2_elt_srcptr)src, k->param, stack);
892  break;
893 
894  case FP3 :
895  fp3_elt_mul3((fp3_elt_ptr)dst, (fp3_elt_srcptr)src, k->param, stack);
896  break;
897  }
898 }
899 
908 static inline void
909 field_elt_sqr (fe_ptr dst, fe_srcptr src, field_srcptr k, uint8_t stack)
910 {
911  switch(k->type)
912  {
913  case FP :
914  fp_elt_sqr((fp_elt_ptr)(*dst), (fp_elt_srcptr)(*src), k->param, stack);
915  break;
916 
917  case FP2 :
918  fp2_elt_sqr((fp2_elt_ptr)dst, (fp2_elt_srcptr)src, k->param, stack);
919  break;
920 
921  case FP3 :
922  fp3_elt_sqr((fp3_elt_ptr)dst, (fp3_elt_srcptr)src, k->param, stack);
923  break;
924  }
925 }
926 
935 static inline void
936 field_elt_sqr_fp_elt (fe_ptr dst, fe_srcptr src, field_srcptr k, uint8_t stack)
937 {
938  switch(k->type)
939  {
940  case FP :
941  fp_elt_sqr((fp_elt_ptr)(*dst), (fp_elt_srcptr)(*src), k->param, stack);
942  break;
943 
944  case FP2 :
945  fp2_elt_sqr_fp_elt((fp2_elt_ptr)dst, (fp_elt_srcptr)(*src), k->param, stack);
946  break;
947 
948  case FP3 :
949  fp3_elt_sqr_fp_elt((fp3_elt_ptr)dst, (fp_elt_srcptr)(*src), k->param, stack);
950  break;
951  }
952 }
953 
963 void
964 field_elt_pow_ui (fe_ptr dst, fe_srcptr src, const block n, field_srcptr k, uint8_t stack);
965 
975 void
976 field_elt_pow_number (fe_ptr dst, fe_srcptr src, number_srcptr n, field_srcptr k, uint8_t stack);
977 
986 bool
987 field_elt_issquare (fe_srcptr src, field_srcptr k, uint8_t stack);
988 
1000 int8_t
1001 field_elt_ispower_ui (fe_srcptr src, const block n, field_srcptr k, uint8_t stack);
1002 
1014 int8_t
1015 field_elt_ispower_number (fe_srcptr src, number_srcptr n, field_srcptr k, uint8_t stack);
1016 
1024 void
1025 field_find_nonsquare (fe_ptr dst, field_ptr k, uint8_t stack);
1026 
1037 bool
1038 field_find_nonpower_ui (fe_ptr dst, const block n, field_ptr k, uint8_t stack);
1039 
1050 bool
1051 field_find_nonpower_number (fe_ptr dst, number_srcptr n, field_ptr k, uint8_t stack);
1052 
1061 void
1062 field_elt_sqrt (fe_ptr dst, fe_srcptr src, field_srcptr k, uint8_t stack);
1063 
1072 void
1073 field_elt_cube_root (fe_ptr dst, fe_srcptr src, field_srcptr k, uint8_t stack);
1074 
1083 void
1084 field_elt_unity_nth_root (fe_ptr dst, const block n, field_ptr k, uint8_t stack);
1085 
1086 /**********************************DIVISION***********************************/
1087 
1096 void
1097 field_elt_inv (fe_ptr dst, fe_srcptr src, field_srcptr k, uint8_t stack);
1098 
1107 void
1108 field_elt_inv_fp_elt (fe_ptr dst, fe_srcptr src, field_srcptr k, uint8_t stack);
1109 
1119 void
1120 field_elt_div (fe_ptr dst, fe_srcptr src1, fe_srcptr src2, field_srcptr k, uint8_t stack);
1121 
1131 void
1132 field_elt_div_fp_elt (fe_ptr dst, fe_srcptr src1, fe_srcptr src2, field_srcptr k, uint8_t stack);
1133 
1134 #endif
void mphell_error(char *expr)
Write in stderr, filename, line and expr, free mphell.
Definition: mphell-errors.c:45
static void field_elt_mul_fp_elt(fe_ptr dst, fe_srcptr src1, fe_srcptr src2, field_srcptr k, uint8_t stack)
Set dst <- src1 * src2, if Montgomery arithmetic is used, the Montgomery multiplication will be used ...
Definition: mphell-field.h:777
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:471
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:618
static void field_elt_mul4(fe_ptr dst, fe_srcptr src, field_srcptr k)
Set dst <- 4 * src.
Definition: mphell-field.h:829
static void field_elt_relax_pool_elt(field_elt *dst, field_ptr k, uint8_t stack)
Relax an initialised field element from the pool.
Definition: mphell-field.h:143
static void field_elt_add(fe_ptr dst, fe_srcptr src1, fe_srcptr src2, field_srcptr k)
Set dst <- src1 + src2.
Definition: mphell-field.h:558
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:894
const fp_elt * fe_srcptr
Pointer on a field element, the field element cannot be modified through this pointer.
Definition: mphell-field.h:49
field_t * field_ptr
Address of a field structure, use in all functions.
Definition: mphell-field.h:92
static void field_elt_mul8(fe_ptr dst, fe_srcptr src, field_srcptr k)
Set dst <- 8 * src.
Definition: mphell-field.h:855
int8_t field_elt_cmp(fe_srcptr src1, fe_srcptr src2, field_srcptr k)
Compare src1 and src2.
Definition: mphell-field.c:743
void field_get_size(number_ptr c, field_srcptr k)
Get the size of the field "k".
Definition: mphell-field.c:231
bool field_elt_isone(fe_srcptr src, field_srcptr k)
Test if src is one.
Definition: mphell-field.c:785
void field_elt_free(fe_ptr *src, field_srcptr k)
Free space used by src.
Definition: mphell-field.c:348
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),...
void field_alloc(field_ptr k, const field_type type, const uint8_t size, field_ptr base)
Allocates space for the different fields of the structure pointed by k.
Definition: mphell-field.c:37
void field_elt_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:732
void field_elt_sqrt(fe_ptr dst, fe_srcptr src, field_srcptr k, uint8_t stack)
Set dst <- src^(1/2)
static void field_elt_sqr_fp_elt(fe_ptr dst, fe_srcptr src, field_srcptr k, uint8_t stack)
Set dst <- src^2.
Definition: mphell-field.h:936
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 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:913
void field_copy(field_ptr k_res, field_srcptr k)
Copy the field structure param into param_res.
Definition: mphell-field.c:175
static void field_elt_sub_fp_elt(fe_ptr dst, fe_srcptr src1, fe_srcptr src2, field_srcptr k)
Set dst <- src1 - src2.
Definition: mphell-field.h:665
void field_elt_set_str(fe_ptr dst, const char *str, const uint8_t base, const bool isreduced, field_srcptr k, uint8_t stack)
Set dst to str, if Montgomery arithmetic is used, is_reduced == false -> transform dst into its Montg...
Definition: mphell-field.c:516
void field_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:693
static void field_elt_dec(fe_ptr dst, fe_srcptr src, field_srcptr k)
Set dst <- src - 1.
Definition: mphell-field.h:611
void field_elt_init(fe_ptr dst, field_srcptr k)
Initialise the field element.
Definition: mphell-field.c:291
field_t field[1]
Address of a field structure.
Definition: mphell-field.h:86
fp_elt * field_elt
Generic field element.
Definition: mphell-field.h:37
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:310
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:932
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:555
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:574
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:972
void field_elt_cube_root(fe_ptr dst, fe_srcptr src, field_srcptr k, uint8_t stack)
Set dst <- src^(1/3)
static void field_elt_inc(fe_ptr dst, fe_srcptr src, field_srcptr k)
Set dst <- src + 1.
Definition: mphell-field.h:531
static void field_elt_neg(fe_ptr dst, fe_srcptr src, field_srcptr k)
Set dst <- (-src)
Definition: mphell-field.h:691
static void field_elt_sub(fe_ptr dst, fe_srcptr src1, fe_srcptr src2, field_srcptr k)
Set dst <- src1 - src2.
Definition: mphell-field.h:638
void field_elt_inv(fe_ptr dst, fe_srcptr src, field_srcptr k, uint8_t stack)
Set dst <- src^(-1)
void field_elt_alloc(fe_ptr *dst, field_srcptr k)
Allocate space for a field element.
Definition: mphell-field.c:269
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:662
static void field_elt_get_pool_elt(field_elt *dst, field_ptr k, uint8_t stack)
Get an initialised field element from the pool.
Definition: mphell-field.h:110
void field_elt_inv_fp_elt(fe_ptr dst, fe_srcptr src, field_srcptr k, uint8_t stack)
Set dst <- src^(-1)
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:702
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.
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:329
static void field_elt_mul(fe_ptr dst, fe_srcptr src1, fe_srcptr src2, field_srcptr k, uint8_t stack)
Set dst <- src1 * src2, if Montgomery arithmetic is used, the Montgomery multiplication will be used ...
Definition: mphell-field.h:749
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:536
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:426
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:993
int8_t field_elt_cmp_fp_elt(fe_srcptr src1, fe_srcptr src2, field_srcptr k)
Compare src1 and src2.
Definition: mphell-field.c:764
static void field_elt_mul3(fe_ptr dst, fe_srcptr src, field_srcptr k, uint8_t stack)
Set dst <- 3 * src.
Definition: mphell-field.h:882
static void field_elt_sqr(fe_ptr dst, fe_srcptr src, field_srcptr k, uint8_t stack)
Set dst <- src^2.
Definition: mphell-field.h:909
fp_elt * fe_ptr
Pointer on a field element.
Definition: mphell-field.h:43
void field_free(field_ptr k)
Free the space of the field informations structure.
Definition: mphell-field.c:194
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_set_zero(fe_ptr dst, field_srcptr k)
Set dst to zero.
Definition: mphell-field.c:387
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:406
static void field_elt_add_fp_elt(fe_ptr dst, fe_srcptr src1, fe_srcptr src2, field_srcptr k)
Set dst <- src1 + src2.
Definition: mphell-field.h:585
void field_elt_div(fe_ptr dst, fe_srcptr src1, fe_srcptr src2, field_srcptr k, uint8_t stack)
Set dst <- src1 / src2.
static void field_elt_mul2(fe_ptr dst, fe_srcptr src, field_srcptr k)
Set dst <- 2 * src.
Definition: mphell-field.h:803
const field_t * field_srcptr
Address of a field structure, use in all functions where the parameter is const.
Definition: mphell-field.h:98
void field_create(field_ptr k, const char *id, uint8_t stack, const uint32_t n,...)
Initialize the different fields of the structure pointed by k.
Definition: mphell-field.c:87
field_type
Define the field type.
Definition: mphell-field.h:56
@ FP2
Definition: mphell-field.h:58
@ FP3
Definition: mphell-field.h:59
@ FP
Definition: mphell-field.h:57
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:951
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:368
static void field_elt_neg_fp_elt(fe_ptr dst, fe_srcptr src, field_srcptr k)
Set dst <- (-src)
Definition: mphell-field.h:717
bool field_isequal(field_srcptr k1, field_srcptr k2)
Test if k1 and k2 are equals.
Definition: mphell-field.c:808
void field_get_characteristic(number_ptr c, field_srcptr k)
Get the charactristic of the field "k".
Definition: mphell-field.c:250
static bool field_elt_iszero(fe_srcptr src, field_srcptr k)
Test if src is zero.
Definition: mphell-field.h:500
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_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
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_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_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_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_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
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_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_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_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_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_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 fp3_elt_mul8(fp3_elt_ptr dst, fp3_elt_srcptr src, const fp3_param param)
Set dst <- 8 * src.
Definition: mphell-fp3.c:492
void fp3_elt_add_fp_elt(fp3_elt_ptr dst, fp3_elt_srcptr src1, fp_elt_srcptr src2, const fp3_param param)
Set dst <- src1 + src2.
Definition: mphell-fp3.c:403
void fp3_elt_mul2(fp3_elt_ptr dst, fp3_elt_srcptr src, const fp3_param param)
Set dst <- 2 * src.
Definition: mphell-fp3.c:474
void fp3_elt_neg_fp_elt(fp3_elt_ptr dst, fp_elt_srcptr src, const fp3_param param)
Set dst <- (-src)
Definition: mphell-fp3.c:447
void fp3_elt_sqr_fp_elt(fp3_elt_ptr dst, fp_elt_srcptr src, const fp3_param param, uint8_t stack)
Set dst <- src^2.
Definition: mphell-fp3.c:567
void fp3_elt_neg(fp3_elt_ptr dst, fp3_elt_srcptr src, const fp3_param param)
Set dst <- (-src)
Definition: mphell-fp3.c:455
void fp3_elt_inc(fp3_elt_ptr dst, fp3_elt_srcptr src, const fp3_param param)
Set dst <- src + 1.
Definition: mphell-fp3.c:395
void fp3_elt_mul4(fp3_elt_ptr dst, fp3_elt_srcptr src, const fp3_param param)
Set dst <- 4 * src.
Definition: mphell-fp3.c:483
void fp3_elt_dec(fp3_elt_ptr dst, fp3_elt_srcptr src, const fp3_param param)
Set dst <- src - 1.
Definition: mphell-fp3.c:421
void fp3_elt_sub_fp_elt(fp3_elt_ptr dst, fp3_elt_srcptr src1, fp_elt_srcptr src2, const fp3_param param)
Set dst <- src1 - src2.
Definition: mphell-fp3.c:429
void fp3_elt_mul_fp_elt(fp3_elt_ptr dst, fp3_elt_srcptr src1, fp_elt_srcptr src2, const fp3_param param, uint8_t stack)
Set dst <- src1 * src2, if Montgomery arithmetic is used, the Montgomery multiplication will be used ...
Definition: mphell-fp3.c:465
void fp3_elt_mul(fp3_elt_ptr dst, fp3_elt_srcptr src1, fp3_elt_srcptr src2, const fp3_param param, uint8_t stack)
Set dst <- src1 * src2, if Montgomery arithmetic is used, the Montgomery multiplication will be used ...
Definition: mphell-fp3.c:510
void fp3_elt_add(fp3_elt_ptr dst, fp3_elt_srcptr src1, fp3_elt_srcptr src2, const fp3_param param)
Set dst <- src1 + src2.
Definition: mphell-fp3.c:412
void fp3_elt_sqr(fp3_elt_ptr dst, fp3_elt_srcptr src, const fp3_param param, uint8_t stack)
Set dst <- src^2.
Definition: mphell-fp3.c:575
void fp3_elt_mul3(fp3_elt_ptr dst, fp3_elt_srcptr src, const fp3_param param, uint8_t stack)
Set dst <- 3 * src.
Definition: mphell-fp3.c:501
bool fp3_elt_iszero(fp3_elt_srcptr src, const fp3_param param)
Test if src is zero.
Definition: mphell-fp3.c:386
void fp3_elt_sub(fp3_elt_ptr dst, fp3_elt_srcptr src1, fp3_elt_srcptr src2, const fp3_param param)
Set dst <- src1 - src2.
Definition: mphell-fp3.c:438
Declaration of cubic field (finite field constructed with an irreducible polynomial of degree 3) func...
Declaration of primary field functions, if Montgomery arithmetic is used, the Montgomery arithmetic w...
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_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
Define a AMNS.
Definition: mphell-amns.h:81
Define a field.
Definition: mphell-field.h:67
void * param
Definition: mphell-field.h:68
uint16_t bit_size
Definition: mphell-field.h:71
uint8_t i_1
Definition: mphell-field.h:73
field_elt pool_1[POOL_SIZE_FIELD]
Definition: mphell-field.h:72
field_type type
Definition: mphell-field.h:69
uint8_t size
Definition: mphell-field.h:70
Quadratic extension field element structure.
Definition: mphell-fp2.h:36
Cubic extension field element structure.
Definition: mphell-fp3.h:36