MPHELL  4.0.0
mphell-field.h
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 #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 
33 #if MPHELL_USE_FP_ONLY == 0
34 
39 typedef fp_elt * field_elt;
40 
45 typedef fp_elt * fe_ptr;
46 
51 typedef const fp_elt * fe_srcptr;
52 
53 #elif MPHELL_USE_FP_ONLY == 1
54 
59 typedef fp_elt field_elt;
60 
65 typedef fp_elt_ptr fe_ptr;
66 
71 typedef const fp_elt_srcptr fe_srcptr;
72 
73 #endif
74 
79 typedef enum
80 {
81  FP,
82  FP2,
83  FP3
84 } field_type;
85 
90 typedef struct
91 {
92  void *param;
94  uint8_t size;
95  uint16_t bit_size;
96  field_elt pool_1[POOL_SIZE_FIELD];
97  uint8_t i_1;
98 #if MPHELL_USE_MULTITHREADING == 1
99  field_elt pool_2[POOL_SIZE_FIELD];
100  uint8_t i_2;
101 #endif
102  char id[20];
103 }
104 field_t;
105 
110 typedef field_t field[1];
111 
116 typedef field_t * field_ptr;
117 
122 typedef const field_t * field_srcptr;
123 
124 /**************************************TMP**********************************/
125 
133 static inline void
134 field_elt_get_pool_elt (field_elt * dst, field_ptr k, uint8_t stack)
135 {
136 #if MPHELL_USE_MULTITHREADING == 0
137  MPHELL_ASSERT(stack == STACK_1, "field_elt_get_pool_elt, unknow stack \n");
138  MPHELL_ASSERT(k->i_1 < POOL_SIZE_FIELD, "field_elt_get_pool_elt, stack is too small \n");
139  *dst = (k->pool_1)[(k->i_1)++];
140 #elif MPHELL_USE_MULTITHREADING == 1
141  if(stack == STACK_1)
142  {
143  MPHELL_ASSERT(k->i_1 < POOL_SIZE_FIELD, "field_elt_get_pool_elt, stack is too small \n");
144  *dst = (k->pool_1)[(k->i_1)++];
145  }
146  else if (stack == STACK_2)
147  {
148  MPHELL_ASSERT(k->i_2 < POOL_SIZE_FIELD, "field_elt_get_pool_elt, stack is too small \n");
149  *dst = (k->pool_2)[(k->i_2)++];
150  }
151  else
152  {
153  *dst = 0;
154  mphell_error("field_elt_get_pool_elt, unknow stack \n");
155  }
156 #endif
157 }
158 
166 static inline void
168 {
169 #if MPHELL_USE_MULTITHREADING == 0
170  MPHELL_ASSERT(stack == STACK_1, "field_elt_relax_pool_elt, unknow stack \n");
171  (k->i_1)--;
172  MPHELL_ASSERT(k->i_1 >= 0, "k->i_1 is < 0 in pool 1\n");
173 #elif MPHELL_USE_MULTITHREADING == 1
174  if(stack == STACK_1)
175  {
176  (k->i_1)--;
177  MPHELL_ASSERT(k->i_1 >= 0, "k->i_1 is < 0 in pool 1\n");
178  }
179  else if (stack == STACK_2)
180  {
181  (k->i_2)--;
182  MPHELL_ASSERT(k->i_2 >= 0, "k->i_2 is < 0 in pool 2\n");
183  }
184  else
185  {
186  mphell_error("field_elt_relax_pool_elt, unknow stack \n");
187  }
188 #endif
189 }
190 
191 /************************************SETTERS**********************************/
192 
201 void
202 field_alloc (field_ptr k, const field_type type, const uint8_t size, field_ptr base);
203 
212 void
213 field_create (field_ptr k, const char* id, uint8_t stack, const uint32_t n, ...);
214 
221 void
223 
229 void
231 
238 void
239 field_get_size (number_ptr c, field_srcptr k);
240 
247 void
248 field_get_characteristic (number_ptr c, field_srcptr k);
249 
256 void
258 
265 void
267 
275 void
277 
284 void
286 
293 void
295 
302 void
304 
314 void
315 field_elt_set_ui (fe_ptr dst, const block src, const bool isreduced,
316  field_srcptr k, uint8_t stack);
317 
327 void
328 field_elt_set_number (fe_ptr dst, const bool isreduced, field_srcptr k,
329  uint8_t stack, const uint32_t n, ...);
330 
339 void
340 field_elt_set_fp_elts (fe_ptr dst, field_srcptr k, const uint32_t n, ...);
341 
352 void
353 field_elt_set_str (fe_ptr dst, const char *str, const uint8_t base,
354  const bool isreduced, field_srcptr k, uint8_t stack);
355 
363 void
364 field_elt_random (fe_ptr dst, field_srcptr k, uint8_t stack);
365 
374 void
375 field_elt_lift (fe_ptr dst, fe_srcptr src, field_srcptr k, uint8_t stack);
376 
386 void
387 field_elt_get_number (number_ptr dst, fe_srcptr src, uint8_t pos, field_srcptr k, uint8_t stack);
388 
397 void
398 field_elt_get_fp_elt (fe_ptr dst, fe_srcptr src, uint8_t pos, field_srcptr k);
399 
408 void
409 field_str (char **str, field_srcptr k, const uint8_t base, uint8_t stack);
410 
418 void
419 field_print (field_srcptr k, const uint8_t base, uint8_t stack);
420 
431 void
432 field_elt_str (char **str, fe_srcptr src, const uint8_t base, const bool lift, field_srcptr k, uint8_t stack);
433 
443 void
444 field_elt_print (fe_srcptr src, const uint8_t base, const bool lift, field_srcptr k, uint8_t stack);
445 
454 bool
456 
457 
458 /*************************COMPARISON AND LOGICAL******************************/
459 
470 int8_t
472 
483 int8_t
485 
493 bool
495 
503 static inline bool
505 {
506  bool res = false;
507  switch(k->type)
508  {
509  case FP :
510  res = fp_elt_iszero((fp_elt_srcptr)(*src), k->param);
511  break;
512 
513  case FP2 :
514  res = fp2_elt_iszero((fp2_elt_srcptr)src, k->param);
515  break;
516 
517  case FP3 :
518  res = fp3_elt_iszero((fp3_elt_srcptr)src, k->param);
519  break;
520  }
521  return res;
522 }
523 
524 
525 /***************************ADDITION SUBTRACTION******************************/
526 
534 static inline void
536 {
537  switch(k->type)
538  {
539  case FP :
540  fp_elt_inc((fp_elt_ptr)(*dst), (fp_elt_srcptr)(*src), k->param);
541  break;
542 
543  case FP2 :
545  break;
546 
547  case FP3 :
549  break;
550  }
551 }
552 
561 static inline void
563 {
564  switch(k->type)
565  {
566  case FP :
567  fp_elt_add((fp_elt_ptr)(*dst), (fp_elt_srcptr)(*src1), (fp_elt_srcptr)(*src2), k->param);
568  break;
569 
570  case FP2 :
572  break;
573 
574  case FP3 :
576  break;
577  }
578 }
579 
588 static inline void
590 {
591  switch(k->type)
592  {
593  case FP :
594  fp_elt_add((fp_elt_ptr)(*dst), (fp_elt_srcptr)(*src1), (fp_elt_srcptr)(*src2), k->param);
595  break;
596 
597  case FP2 :
598  fp2_elt_add_fp_elt((fp2_elt_ptr)dst, (fp2_elt_srcptr)src1, (fp_elt_srcptr)(*src2), k->param);
599  break;
600 
601  case FP3 :
602  fp3_elt_add_fp_elt((fp3_elt_ptr)dst, (fp3_elt_srcptr)src1, (fp_elt_srcptr)(*src2), k->param);
603  break;
604  }
605 }
606 
614 static inline void
616 {
617  switch(k->type)
618  {
619  case FP :
620  fp_elt_dec((fp_elt_ptr)(*dst), (fp_elt_srcptr)(*src), k->param);
621  break;
622 
623  case FP2 :
625  break;
626 
627  case FP3 :
629  break;
630  }
631 }
632 
641 static inline void
643 {
644  switch(k->type)
645  {
646  case FP :
647  fp_elt_sub((fp_elt_ptr)(*dst), (fp_elt_srcptr)(*src1), (fp_elt_srcptr)(*src2), k->param);
648  break;
649 
650  case FP2 :
652  break;
653 
654  case FP3 :
656  break;
657  }
658 }
659 
668 static inline void
670 {
671  switch(k->type)
672  {
673  case FP :
674  fp_elt_sub((fp_elt_ptr)(*dst), (fp_elt_srcptr)(*src1), (fp_elt_srcptr)(*src2), k->param);
675  break;
676 
677  case FP2 :
678  fp2_elt_sub_fp_elt((fp2_elt_ptr)dst, (fp2_elt_srcptr)src1, (fp_elt_srcptr)(*src2), k->param);
679  break;
680 
681  case FP3 :
682  fp3_elt_sub_fp_elt((fp3_elt_ptr)dst, (fp3_elt_srcptr)src1, (fp_elt_srcptr)(*src2), k->param);
683  break;
684  }
685 }
686 
694 static inline void
696 {
697  switch(k->type)
698  {
699  case FP :
700  fp_elt_neg((fp_elt_ptr)(*dst), (fp_elt_srcptr)(*src), k->param);
701  break;
702 
703  case FP2 :
705  break;
706 
707  case FP3 :
709  break;
710  }
711 }
712 
720 static inline void
722 {
723  switch(k->type)
724  {
725  case FP :
726  fp_elt_neg((fp_elt_ptr)(*dst), (fp_elt_srcptr)(*src), k->param);
727  break;
728 
729  case FP2 :
730  fp2_elt_neg_fp_elt((fp2_elt_ptr)dst, (fp_elt_srcptr)(*src), k->param);
731  break;
732 
733  case FP3 :
734  fp3_elt_neg_fp_elt((fp3_elt_ptr)dst, (fp_elt_srcptr)(*src), k->param);
735  break;
736  }
737 }
738 
739 
740 
741 /*******************************MULTIPLICATION********************************/
742 
752 static inline void
753 field_elt_mul (fe_ptr dst, fe_srcptr src1, fe_srcptr src2, field_srcptr k, uint8_t stack)
754 {
755  switch(k->type)
756  {
757  case FP :
758  fp_elt_mul((fp_elt_ptr)(*dst), (fp_elt_srcptr)(*src1), (fp_elt_srcptr)(*src2), k->param, stack);
759  break;
760 
761  case FP2 :
762  fp2_elt_mul((fp2_elt_ptr)dst, (fp2_elt_srcptr)src1, (fp2_elt_srcptr)src2, k->param, stack);
763  break;
764 
765  case FP3 :
766  fp3_elt_mul((fp3_elt_ptr)dst, (fp3_elt_srcptr)src1, (fp3_elt_srcptr)src2, k->param, stack);
767  break;
768  }
769 }
770 
780 static inline void
781 field_elt_mul_fp_elt (fe_ptr dst, fe_srcptr src1, fe_srcptr src2, field_srcptr k, uint8_t stack)
782 {
783  switch(k->type)
784  {
785  case FP :
786  fp_elt_mul((fp_elt_ptr)(*dst), (fp_elt_srcptr)(*src1), (fp_elt_srcptr)(*src2), k->param, stack);
787  break;
788 
789  case FP2 :
790  fp2_elt_mul_fp_elt((fp2_elt_ptr)dst, (fp2_elt_srcptr)src1, (fp_elt_srcptr)(*src2), k->param, stack);
791  break;
792 
793  case FP3 :
794  fp3_elt_mul_fp_elt((fp3_elt_ptr)dst, (fp3_elt_srcptr)src1, (fp_elt_srcptr)(*src2), k->param, stack);
795  break;
796  }
797 }
798 
806 static inline void
808 {
809  switch(k->type)
810  {
811  case FP :
812  fp_elt_mul2((fp_elt_ptr)(*dst), (fp_elt_srcptr)(*src), k->param);
813  break;
814 
815  case FP2 :
817  break;
818 
819  case FP3 :
821  break;
822  }
823 }
824 
832 static inline void
834 {
835  switch(k->type)
836  {
837  case FP :
838  fp_elt_mul4((fp_elt_ptr)(*dst), (fp_elt_srcptr)(*src), k->param);
839  break;
840 
841  case FP2 :
843  break;
844 
845  case FP3 :
847  break;
848  }
849 }
850 
858 static inline void
860 {
861  switch(k->type)
862  {
863  case FP :
864  fp_elt_mul8((fp_elt_ptr)(*dst), (fp_elt_srcptr)(*src), k->param);
865  break;
866 
867  case FP2 :
869  break;
870 
871  case FP3 :
873  break;
874  }
875 }
876 
885 static inline void
886 field_elt_mul3 (fe_ptr dst, fe_srcptr src, field_srcptr k, uint8_t stack)
887 {
888  switch(k->type)
889  {
890  case FP :
891  fp_elt_mul3((fp_elt_ptr)(*dst), (fp_elt_srcptr)(*src), k->param, stack);
892  break;
893 
894  case FP2 :
895  fp2_elt_mul3((fp2_elt_ptr)dst, (fp2_elt_srcptr)src, k->param, stack);
896  break;
897 
898  case FP3 :
899  fp3_elt_mul3((fp3_elt_ptr)dst, (fp3_elt_srcptr)src, k->param, stack);
900  break;
901  }
902 }
903 
912 static inline void
913 field_elt_sqr (fe_ptr dst, fe_srcptr src, field_srcptr k, uint8_t stack)
914 {
915  switch(k->type)
916  {
917  case FP :
918  fp_elt_sqr((fp_elt_ptr)(*dst), (fp_elt_srcptr)(*src), k->param, stack);
919  break;
920 
921  case FP2 :
922  fp2_elt_sqr((fp2_elt_ptr)dst, (fp2_elt_srcptr)src, k->param, stack);
923  break;
924 
925  case FP3 :
926  fp3_elt_sqr((fp3_elt_ptr)dst, (fp3_elt_srcptr)src, k->param, stack);
927  break;
928  }
929 }
930 
939 static inline void
940 field_elt_sqr_fp_elt (fe_ptr dst, fe_srcptr src, field_srcptr k, uint8_t stack)
941 {
942  switch(k->type)
943  {
944  case FP :
945  fp_elt_sqr((fp_elt_ptr)(*dst), (fp_elt_srcptr)(*src), k->param, stack);
946  break;
947 
948  case FP2 :
949  fp2_elt_sqr_fp_elt((fp2_elt_ptr)dst, (fp_elt_srcptr)(*src), k->param, stack);
950  break;
951 
952  case FP3 :
953  fp3_elt_sqr_fp_elt((fp3_elt_ptr)dst, (fp_elt_srcptr)(*src), k->param, stack);
954  break;
955  }
956 }
957 
967 void
968 field_elt_pow_ui (fe_ptr dst, fe_srcptr src, const block n, field_srcptr k, uint8_t stack);
969 
979 void
980 field_elt_pow_number (fe_ptr dst, fe_srcptr src, number_srcptr n, field_srcptr k, uint8_t stack);
981 
990 bool
991 field_elt_issquare (fe_srcptr src, field_srcptr k, uint8_t stack);
992 
1004 int8_t
1005 field_elt_ispower_ui (fe_srcptr src, const block n, field_srcptr k, uint8_t stack);
1006 
1018 int8_t
1019 field_elt_ispower_number (fe_srcptr src, number_srcptr n, field_srcptr k, uint8_t stack);
1020 
1028 void
1029 field_find_nonsquare (fe_ptr dst, field_ptr k, uint8_t stack);
1030 
1041 bool
1042 field_find_nonpower_ui (fe_ptr dst, const block n, field_ptr k, uint8_t stack);
1043 
1054 bool
1055 field_find_nonpower_number (fe_ptr dst, number_srcptr n, field_ptr k, uint8_t stack);
1056 
1065 void
1066 field_elt_sqrt (fe_ptr dst, fe_srcptr src, field_srcptr k, uint8_t stack);
1067 
1076 void
1077 field_elt_cube_root (fe_ptr dst, fe_srcptr src, field_srcptr k, uint8_t stack);
1078 
1087 void
1088 field_elt_unity_nth_root (fe_ptr dst, const block n, field_ptr k, uint8_t stack);
1089 
1090 /**********************************DIVISION***********************************/
1091 
1100 void
1101 field_elt_inv (fe_ptr dst, fe_srcptr src, field_srcptr k, uint8_t stack);
1102 
1111 void
1112 field_elt_inv_fp_elt (fe_ptr dst, fe_srcptr src, field_srcptr k, uint8_t stack);
1113 
1123 void
1124 field_elt_div (fe_ptr dst, fe_srcptr src1, fe_srcptr src2, field_srcptr k, uint8_t stack);
1125 
1135 void
1136 field_elt_div_fp_elt (fe_ptr dst, fe_srcptr src1, fe_srcptr src2, field_srcptr k, uint8_t stack);
1137 
1138 #endif
int8_t field_elt_cmp(fe_srcptr src1, fe_srcptr src2, field_srcptr k)
Compare src1 and src2.
Definition: mphell-field.c:732
fp_elt * field_elt
Generic field element.
Definition: mphell-field.h:39
static void fp_elt_add(fp_elt_ptr dst, fp_elt_srcptr src1, fp_elt_srcptr src2, const fp_param param)
Set dst <- src1 + src2.
Definition: mphell-fp.h:514
void field_elt_div(fe_ptr dst, fe_srcptr src1, fe_srcptr src2, field_srcptr k, uint8_t stack)
Set dst <- src1 / src2.
void fp3_elt_mul(fp3_elt_ptr dst, fp3_elt_srcptr src1, fp3_elt_srcptr src2, const fp3_param param, uint8_t stack)
Set dst <- src1 * src2, if Montgomery arithmetic is used, the Montgomery multiplication will be used ...
Definition: mphell-fp3.c:501
static bool field_elt_iszero(fe_srcptr src, field_srcptr k)
Test if src is zero.
Definition: mphell-field.h:504
void fp3_elt_neg(fp3_elt_ptr dst, fp3_elt_srcptr src, const fp3_param param)
Set dst <- (-src)
Definition: mphell-fp3.c:446
void 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
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:753
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:451
void fp2_elt_mul2(fp2_elt_ptr dst, fp2_elt_srcptr src, const fp2_param param)
Set dst <- 2 * src.
Definition: mphell-fp2.c:419
static void field_elt_mul4(fe_ptr dst, fe_srcptr src, field_srcptr k)
Set dst <- 4 * src.
Definition: mphell-field.h:833
uint16_t bit_size
Definition: mphell-field.h:95
void fp3_elt_add_fp_elt(fp3_elt_ptr dst, fp3_elt_srcptr src1, fp_elt_srcptr src2, const fp3_param param)
Set dst <- src1 + src2.
Definition: mphell-fp3.c:394
void field_elt_inv_fp_elt(fe_ptr dst, fe_srcptr src, field_srcptr k, uint8_t stack)
Set dst <- src^(-1)
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 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
static void field_elt_mul8(fe_ptr dst, fe_srcptr src, field_srcptr k)
Set dst <- 8 * src.
Definition: mphell-field.h:859
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
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:940
void mphell_error(char *expr)
Write in stderr, filename, line and expr, free mphell.
Definition: mphell-errors.c:45
static void field_elt_neg_fp_elt(fe_ptr dst, fe_srcptr src, field_srcptr k)
Set dst <- (-src)
Definition: mphell-field.h:721
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:781
Define a field.
Definition: mphell-field.h:90
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_get_characteristic(number_ptr c, field_srcptr k)
Get the charactristic of the field "k".
Definition: mphell-field.c:239
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 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),...
field_elt pool_1[POOL_SIZE_FIELD]
Definition: mphell-field.h:96
void field_elt_free(fe_ptr *src, field_srcptr k)
Free space used by src.
Definition: mphell-field.c:356
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
static void field_elt_inc(fe_ptr dst, fe_srcptr src, field_srcptr k)
Set dst <- src + 1.
Definition: mphell-field.h:535
static void fp_elt_mul8(fp_elt_ptr dst, fp_elt_srcptr src, const fp_param param)
Set dst <- 8 * src.
Definition: mphell-fp.h:728
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:495
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:443
void fp2_elt_mul8(fp2_elt_ptr dst, fp2_elt_srcptr src, const fp2_param param)
Set dst <- 8 * src.
Definition: mphell-fp2.c:435
field_t field[1]
Address of a field structure.
Definition: mphell-field.h:110
uint8_t size
Definition: mphell-field.h:94
static void fp_elt_sqr(fp_elt_ptr dst, fp_elt_srcptr src, const fp_param param, uint8_t stack)
Set dst <- src^2.
Definition: mphell-fp.h:806
void field_elt_alloc(fe_ptr *dst, field_srcptr k)
Allocate space for a field element.
Definition: mphell-field.c:277
void fp3_elt_dec(fp3_elt_ptr dst, fp3_elt_srcptr src, const fp3_param param)
Set dst <- src - 1.
Definition: mphell-fp3.c:412
void fp2_elt_neg(fp2_elt_ptr dst, fp2_elt_srcptr src, const fp2_param param)
Set dst <- (-src)
Definition: mphell-fp2.c:402
const field_t * field_srcptr
Address of a field structure, use in all functions where the parameter is const.
Definition: mphell-field.h:122
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:886
void fp3_elt_sqr(fp3_elt_ptr dst, fp3_elt_srcptr src, const fp3_param param, uint8_t stack)
Set dst <- src^2.
Definition: mphell-fp3.c:566
void 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:379
bool field_isequal(field_srcptr k1, field_srcptr k2)
Test if k1 and k2 are equals.
Definition: mphell-field.c:797
void fp2_elt_inc(fp2_elt_ptr dst, fp2_elt_srcptr src, const fp2_param param)
Set dst <- src + 1.
Definition: mphell-fp2.c:349
void fp2_elt_mul4(fp2_elt_ptr dst, fp2_elt_srcptr src, const fp2_param param)
Set dst <- 4 * src.
Definition: mphell-fp2.c:427
void fp3_elt_add(fp3_elt_ptr dst, fp3_elt_srcptr src1, fp3_elt_srcptr src2, const fp3_param param)
Set dst <- src1 + src2.
Definition: mphell-fp3.c:403
void fp3_elt_mul4(fp3_elt_ptr dst, fp3_elt_srcptr src, const fp3_param param)
Set dst <- 4 * src.
Definition: mphell-fp3.c:474
void 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 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
void fp3_elt_neg_fp_elt(fp3_elt_ptr dst, fp_elt_srcptr src, const fp3_param param)
Set dst <- (-src)
Definition: mphell-fp3.c:438
void fp3_elt_sub(fp3_elt_ptr dst, fp3_elt_srcptr src1, fp3_elt_srcptr src2, const fp3_param param)
Set dst <- src1 - src2.
Definition: mphell-fp3.c:429
void 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_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_cube_root(fe_ptr dst, fe_srcptr src, field_srcptr k, uint8_t stack)
Set dst <- src^(1/3)
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_mul_fp_elt(fp3_elt_ptr dst, fp3_elt_srcptr src1, fp_elt_srcptr src2, const fp3_param param, uint8_t stack)
Set dst <- src1 * src2, if Montgomery arithmetic is used, the Montgomery multiplication will be used ...
Definition: mphell-fp3.c:456
static void fp_elt_mul(fp_elt_ptr dst, fp_elt_srcptr src1, fp_elt_srcptr src2, const fp_param param, uint8_t stack)
Set dst <- src1 * src2, if Montgomery arithmetic is used, the Montgomery multiplication will be used ...
Definition: mphell-fp.h:643
static void fp_elt_inc(fp_elt_ptr dst, fp_elt_srcptr src, const fp_param param)
Set dst <- src + 1.
Definition: mphell-fp.h:539
static bool fp_elt_iszero(fp_elt_srcptr src, const fp_param param)
Test if src is zero.
Definition: mphell-fp.h:462
static void fp_elt_mul3(fp_elt_ptr dst, fp_elt_srcptr src, const fp_param param, uint8_t stack)
Set dst <- 3 * src.
Definition: mphell-fp.h:768
static void fp_elt_mul2(fp_elt_ptr dst, fp_elt_srcptr src, const fp_param param)
Set dst <- 2 * src.
Definition: mphell-fp.h:665
Declaration of binary field (finite field constructed with an irreducible polynomial of degree 2) fun...
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
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 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 * param
Definition: mphell-field.h:92
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
static void fp_elt_neg(fp_elt_ptr dst, fp_elt_srcptr src, const fp_param param)
Set dst <- (-src) mod p.
Definition: mphell-fp.h:613
void 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 fp3_elt_mul3(fp3_elt_ptr dst, fp3_elt_srcptr src, const fp3_param param, uint8_t stack)
Set dst <- 3 * src.
Definition: mphell-fp3.c:492
void field_get_size(number_ptr c, field_srcptr k)
Get the size of the field "k".
Definition: mphell-field.c:220
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
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:483
static void fp_elt_mul4(fp_elt_ptr dst, fp_elt_srcptr src, const fp_param param)
Set dst <- 4 * src.
Definition: mphell-fp.h:690
void 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 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:411
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:669
uint8_t i_1
Definition: mphell-field.h:97
void fp3_elt_mul2(fp3_elt_ptr dst, fp3_elt_srcptr src, const fp3_param param)
Set dst <- 2 * src.
Definition: mphell-fp3.c:465
void 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
Cubic extension field element structure.
Definition: mphell-fp3.h:35
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
fp_elt * fe_ptr
Pointer on a field element.
Definition: mphell-field.h:45
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 fp3_elt_sqr_fp_elt(fp3_elt_ptr dst, fp_elt_srcptr src, const fp3_param param, uint8_t stack)
Set dst <- src^2.
Definition: mphell-fp3.c:558
field_type
Define the field type.
Definition: mphell-field.h:79
void fp3_elt_inc(fp3_elt_ptr dst, fp3_elt_srcptr src, const fp3_param param)
Set dst <- src + 1.
Definition: mphell-fp3.c:386
static void field_elt_mul2(fe_ptr dst, fe_srcptr src, field_srcptr k)
Set dst <- 2 * src.
Definition: mphell-field.h:807
Quadratic extension field element structure.
Definition: mphell-fp2.h:35
void field_elt_init(fe_ptr dst, field_srcptr k)
Initialise the field element.
Definition: mphell-field.c:299
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:589
static void field_elt_neg(fe_ptr dst, fe_srcptr src, field_srcptr k)
Set dst <- (-src)
Definition: mphell-field.h:695
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
Declaration of cubic field (finite field constructed with an irreducible polynomial of degree 3) func...
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:356
static void fp_elt_dec(fp_elt_ptr dst, fp_elt_srcptr src, const fp_param param)
Set dst <- src - 1.
Definition: mphell-fp.h:596
void field_elt_inv(fe_ptr dst, fe_srcptr src, field_srcptr k, uint8_t stack)
Set dst <- src^(-1)
Declaration of primary field functions, if Montgomery arithmetic is used, the Montgomery arithmetic w...
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:387
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
field_t * field_ptr
Address of a field structure, use in all functions.
Definition: mphell-field.h:116
void field_free(field_ptr k)
Free the space of the field informations structure.
Definition: mphell-field.c:183
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:913
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:395
static void fp_elt_sub(fp_elt_ptr dst, fp_elt_srcptr src1, fp_elt_srcptr src2, const fp_param param)
Set dst <- src1 - src2.
Definition: mphell-fp.h:557
void fp2_elt_dec(fp2_elt_ptr dst, fp2_elt_srcptr src, const fp2_param param)
Set dst <- src - 1.
Definition: mphell-fp2.c:372
bool fp2_elt_iszero(fp2_elt_srcptr src, const fp2_param param)
Test if src is zero.
Definition: mphell-fp2.c:341
void field_copy(field_ptr k_res, field_srcptr k)
Copy the field structure param into param_res.
Definition: mphell-field.c:164
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
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
bool field_elt_isone(fe_srcptr src, field_srcptr k)
Test if src is one.
Definition: mphell-field.c:774
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:642
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:364
static void field_elt_dec(fe_ptr dst, fe_srcptr src, field_srcptr k)
Set dst <- src - 1.
Definition: mphell-field.h:615
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:167
field_type type
Definition: mphell-field.h:93
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:562
bool fp3_elt_iszero(fp3_elt_srcptr src, const fp3_param param)
Test if src is zero.
Definition: mphell-fp3.c:377
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
void fp3_elt_sub_fp_elt(fp3_elt_ptr dst, fp3_elt_srcptr src1, fp_elt_srcptr src2, const fp3_param param)
Set dst <- src1 - src2.
Definition: mphell-fp3.c:420
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:134
void fp3_elt_mul8(fp3_elt_ptr dst, fp3_elt_srcptr src, const fp3_param param)
Set dst <- 8 * src.
Definition: mphell-fp3.c:483
void 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
void field_elt_sqrt(fe_ptr dst, fe_srcptr src, field_srcptr k, uint8_t stack)
Set dst <- src^(1/2)