33 #if MPHELL_USE_GMP == 1 36 gmp_tmp_alloc((number_ptr)(*t), size+2, stack);
37 #elif MPHELL_USE_IPP == 1 38 ippcp_bn_tmp_alloc(t, size, stack);
39 #elif MPHELL_USE_MBEDTLS == 1 40 mbedtls_tmp_alloc((number_ptr)(*t), size, stack);
47 #if MPHELL_USE_GMP == 1 48 gmp_tmp_free((number_ptr)(*t), size+2, stack);
49 #elif MPHELL_USE_IPP == 1 50 ippcp_bn_tmp_free(t, size, stack);
51 #elif MPHELL_USE_MBEDTLS == 1 52 mbedtls_tmp_free((number_ptr)(*t), size, stack);
61 #if MPHELL_USE_GMP == 1 62 mpz_init2(*dst, BLOCK_SIZE * n);
63 #elif MPHELL_USE_IPP == 1 65 ippsBigNumGetSize(n, &ctxSize);
66 *dst = (IppsBigNumState*)malloc(ctxSize*
sizeof(Ipp8u));
67 ippsBigNumInit(n, *dst);
68 #elif MPHELL_USE_MBEDTLS == 1 69 mbedtls_mpi_init(*dst);
70 mbedtls_mpi_grow(*dst, n);
77 #if MPHELL_USE_GMP == 1 79 #elif MPHELL_USE_IPP == 1 81 #elif MPHELL_USE_MBEDTLS == 1 82 mbedtls_mpi_free(*dst);
89 #if MPHELL_USE_GMP == 1 91 #elif MPHELL_USE_IPP == 1 95 ippsRef_BN(&sgn, &len, &data, src);
97 #elif MPHELL_USE_MBEDTLS == 1 98 mbedtls_mpi_copy(dst, src);
105 #if MPHELL_USE_GMP == 1 106 mpz_set_ui(dst, src);
107 #elif MPHELL_USE_IPP == 1 108 ippsSet_BN(ippBigNumPOS, 1, (Ipp32u *)(&src), dst);
109 #elif MPHELL_USE_MBEDTLS == 1 111 memset(dst->p, 0, dst->n * BYTES_PER_LIMB);
118 number_set (number_ptr dst,
const int8_t sign,
const uint32_t size, ...)
120 #if MPHELL_USE_GMP == 1 125 uint8_t n = ALLOC_SIZ(dst);
126 for(i = 0; i < n; i++)
130 LIMB(dst)[i] = (block)va_arg(ap, block);
134 LIMB(dst)[i] = (block)0;
145 #elif MPHELL_USE_IPP == 1 150 for(i = 0; i < size; i++)
152 temp[i]=va_arg(ap, Ipp32u);
156 ippsSet_BN(ippBigNumNEG, size, temp, dst);
160 ippsSet_BN(ippBigNumPOS, size, temp, dst);
163 #elif MPHELL_USE_MBEDTLS == 1 166 mbedtls_mpi_lset(dst, 0);
169 for(i=0; i<size; i++)
171 dst->p[i] = (block)va_arg(ap, block);
180 #if (MPHELL_USE_GMP == 1 || MPHELL_USE_IPP == 1) 181 uint8_t q = bit / BLOCK_SIZE;
182 uint8_t r = bit % BLOCK_SIZE;
185 #if MPHELL_USE_GMP == 1 186 memset(LIMB(dst), 0, size * BYTES_PER_LIMB);
187 LIMB(dst)[q] = (mp_limb_t)1 << r;
189 #elif MPHELL_USE_IPP == 1 191 memset(data, 0, size * BYTES_PER_LIMB);
192 data[q] = (Ipp32u)1 << r;
193 ippsSet_BN(IppsBigNumPOS, size, data, dst);
194 #elif MPHELL_USE_MBEDTLS == 1 195 mbedtls_mpi_set_bit(dst, bit, 1);
202 #if MPHELL_USE_GMP == 1 204 mphell_rng(NULL, (
unsigned char *)LIMB(dst), size*8);
206 mphell_rng(NULL, (
unsigned char *)LIMB(dst), size*4);
209 #elif MPHELL_USE_IPP == 1 212 mphell_rng(NULL, (
unsigned char *)temp, size*4);
213 ippsSet_BN(ippBigNumPOS, size, temp, dst);
214 #elif MPHELL_USE_MBEDTLS == 1 217 mphell_rng(NULL, (
unsigned char *)dst->p, size*8);
219 mphell_rng(NULL, (
unsigned char *)dst->p, size*4);
222 for(i = size; i < dst->n; i++)
234 #if MPHELL_USE_GMP == 1 236 #elif MPHELL_USE_IPP == 1 237 ippsRef_BN(NULL, &size, NULL, bound);
239 #elif MPHELL_USE_MBEDTLS == 1 259 #if MPHELL_USE_GMP == 1 260 return (uint16_t)mpz_sizeinbase(src, 2);
261 #elif MPHELL_USE_IPP == 1 263 ippsExtGet_BN(NULL, &size, NULL, src);
265 #elif MPHELL_USE_MBEDTLS == 1 266 return mbedtls_mpi_bitlen(src);
273 #if MPHELL_USE_GMP == 1 274 return src->_mp_size;
275 #elif MPHELL_USE_IPP == 1 277 ippsExtGet_BN(NULL, &size, NULL, src);
279 #elif MPHELL_USE_MBEDTLS == 1 287 #if MPHELL_USE_GMP == 1 288 return src->_mp_alloc;
289 #elif MPHELL_USE_IPP == 1 291 ippsGetSize_BN(src, &size);
293 #elif MPHELL_USE_MBEDTLS == 1 301 #if MPHELL_USE_GMP == 1 302 mpz_set_str(dst, str, base);
303 #elif MPHELL_USE_IPP == 1 305 int16_t len, len_chunk, lentmp;
311 Ipp32u data[len_chunk];
312 memset(data, 0, len_chunk * 4);
313 for(i=0; i<len_chunk; i++)
322 data[i]^=((Ipp32u)1<<j);
327 ippsSet_BN(IppsBigNumPOS, len_chunk, data, dst);
342 char * tab[16]={
"0000",
"0001",
"0010",
"0011",
"0100",
"0101",
"0110",
"0111",
"1000",
"1001",
"1010",
"1011",
"1100",
"1101",
"1110",
"1111"};
346 for(i=0; i<strlen(str); i++)
350 memcpy(str2+j, tab[0], 4);
354 memcpy(str2+j, tab[1], 4);
358 memcpy(str2+j, tab[2], 4);
362 memcpy(str2+j, tab[3], 4);
366 memcpy(str2+j, tab[4], 4);
370 memcpy(str2+j, tab[5], 4);
374 memcpy(str2+j, tab[6], 4);
378 memcpy(str2+j, tab[7], 4);
382 memcpy(str2+j, tab[8], 4);
386 memcpy(str2+j, tab[9], 4);
388 else if(str[i]==
'a' || str[i]==
'A')
390 memcpy(str2+j, tab[10], 4);
392 else if(str[i]==
'b' || str[i]==
'B')
394 memcpy(str2+j, tab[11], 4);
396 else if(str[i]==
'c' || str[i]==
'C')
398 memcpy(str2+j, tab[12], 4);
400 else if(str[i]==
'd' || str[i]==
'D')
402 memcpy(str2+j, tab[13], 4);
404 else if(str[i]==
'e' || str[i]==
'E')
406 memcpy(str2+j, tab[14], 4);
408 else if(str[i]==
'f' || str[i]==
'F')
410 memcpy(str2+j, tab[15], 4);
424 mphell_error (
"Error in number_set_str, base must be either 2, 10 or 16\n");
426 #elif MPHELL_USE_MBEDTLS == 1 427 mbedtls_mpi_lset(dst, 0);
428 if(str[strlen(str)-1]==
'\n')
430 uint16_t s = strlen(str);
432 memcpy(tmp, str, s-1);
434 mbedtls_mpi_read_string(dst, base, tmp);
438 mbedtls_mpi_read_string(dst, base, str);
444 number_str (
char **str, number_srcptr src,
const uint8_t base)
446 #if MPHELL_USE_GMP == 1 449 gmp_asprintf(str,
"%Zx", src);
453 gmp_asprintf(str,
"%Zd", src);
457 *str = mpz_get_str (NULL, base, src);
459 #elif MPHELL_USE_IPP == 1 462 *str = (
char *)malloc(2*
sizeof(
char));
476 ippsRef_BN(&sgn, &len, &data, src);
479 if(sgn==IppsBigNumNEG)
481 *str = (
char *)malloc((len+2)*
sizeof(char));
488 *str = (
char *)malloc((len+1)*
sizeof(char));
492 for(i=0; i<len32; i++)
498 if(data[i] & (Ipp32u)1<<j)
521 ippsRef_BN(&sgn, &len, &data, src);
527 ippsSet_BN(IppsBigNumPOS, len32, data, tmp);
534 tab[it++]=digit +
'0';
538 if(sgn==IppsBigNumNEG)
540 *str = (
char *)malloc((it+2)*
sizeof(char));
546 *str = (
char *)malloc((it+1)*
sizeof(char));
549 for(i = 0; i<it; i++)
557 char tab[16]={
'0',
'1',
'2',
'3',
'4',
'5',
'6',
'7',
'8',
'9',
'a',
'b',
'c',
'd',
'e',
'f'};
566 ippsRef_BN(&sgn, &len, &data, src);
568 len4 = ((len / 4) + ((len % 4) != 0));
570 if(sgn==IppsBigNumNEG)
572 *str = (
char *)malloc((len4+2)*
sizeof(char));
579 *str = (
char *)malloc((len4+1)*
sizeof(char));
583 for(i=0; i<len32; i++)
590 if(data[i] & (Ipp32u)1<<j)
594 if(data[i] & (Ipp32u)1<<(j+1))
598 if(data[i] & (Ipp32u)1<<(j+2))
602 if(data[i] & (Ipp32u)1<<(j+3))
613 mphell_error (
"Error in number_str, base must be either 2, 10 or 16\n");
616 #elif MPHELL_USE_MBEDTLS == 1 617 size_t size = mbedtls_mpi_bitlen(src);
628 *str = (
char *)malloc(size*
sizeof(
char));
629 mbedtls_mpi_write_string(src, base, *str, size, &outlen);
630 if(((*str)[0]==
'0' && outlen > 2) || ((*str)[0]==
'-' && (*str)[1]==
'0' && outlen > 3))
640 for(; size < outlen-1; size++)
642 (*str)[size]=(*str)[size+1];
651 #if MPHELL_USE_GMP == 1 652 *dst = mpz_get_ui(src);
653 #elif MPHELL_USE_IPP == 1 657 ippsRef_BN(&sgn, &len, &data, src);
659 #elif MPHELL_USE_MBEDTLS == 1 667 #if MPHELL_USE_GMP == 1 668 mpz_get_str (str, 2, src);
669 #elif MPHELL_USE_IPP == 1 683 ippsRef_BN(&sgn, &len, &data, src);
686 for(i=0; i<len32; i++)
692 if(data[i] & (Ipp32u)1<<j)
708 #elif MPHELL_USE_MBEDTLS == 1 709 size_t size = mbedtls_mpi_bitlen(src)+4;
710 mbedtls_mpi_write_string(src, 2, str, size, &size);
717 #if MPHELL_USE_GMP == 1 720 gmp_printf(
"%Zx", src);
724 gmp_printf(
"%Zd", src);
733 #elif (MPHELL_USE_IPP == 1 || MPHELL_USE_MBEDTLS == 1) 746 #if MPHELL_USE_GMP == 1 747 return (mpz_cmp_ui(src, (block)0) == 0);
748 #elif MPHELL_USE_IPP == 1 750 ippsCmpZero_BN(src, &test);
751 return (test==IS_ZERO);
752 #elif MPHELL_USE_MBEDTLS == 1 753 return (mbedtls_mpi_cmp_int(src, 0) == 0);
760 #if MPHELL_USE_GMP == 1 761 return (mpz_cmp_ui(src1, src2) == 0);
762 #elif MPHELL_USE_IPP == 1 766 ippsRef_BN(&sgn, &len, &data, src1);
767 if((sgn == IppsBigNumNEG) || (len > 32) || (data[0]!=(Ipp32u)src2))
775 #elif MPHELL_USE_MBEDTLS == 1 776 return (mbedtls_mpi_cmp_int(src1, (mbedtls_mpi_sint)src2) == 0);
783 #if MPHELL_USE_GMP == 1 784 return (mpz_cmp(src1, src2) == 0);
785 #elif MPHELL_USE_IPP == 1 787 ippsCmp_BN(src1, src2, &test);
788 return (test==IS_ZERO);
789 #elif MPHELL_USE_MBEDTLS == 1 790 return (mbedtls_mpi_cmp_mpi(src1, src2)==0);
797 #if MPHELL_USE_GMP == 1 798 return (mpz_cmp_ui(src1, src2) != 0);
799 #elif (MPHELL_USE_IPP == 1 || MPHELL_USE_MBEDTLS == 1) 807 #if MPHELL_USE_GMP == 1 808 return (mpz_cmp(src1, src2) != 0);
809 #elif (MPHELL_USE_IPP == 1 || MPHELL_USE_MBEDTLS == 1) 817 #if MPHELL_USE_GMP == 1 818 return (mpz_cmp_ui(src1, src2) < 0);
819 #elif MPHELL_USE_IPP == 1 823 ippsRef_BN(&sgn, &len, &data, src1);
824 if(sgn == IppsBigNumNEG)
828 if((len > 32) || (data[0]>=(Ipp32u)src2))
836 #elif MPHELL_USE_MBEDTLS == 1 837 return (mbedtls_mpi_cmp_int(src1, (mbedtls_mpi_sint)src2) < 0);
844 #if MPHELL_USE_GMP == 1 845 return (mpz_cmp(src1, src2) < 0);
846 #elif MPHELL_USE_IPP == 1 848 ippsCmp_BN(src1, src2, &test);
849 return (test==LESS_THAN_ZERO);
850 #elif MPHELL_USE_MBEDTLS == 1 851 return (mbedtls_mpi_cmp_mpi(src1, src2)<0);
858 #if MPHELL_USE_GMP == 1 859 return (mpz_cmp_ui(src1, src2) > 0);
860 #elif MPHELL_USE_IPP == 1 864 ippsRef_BN(&sgn, &len, &data, src1);
869 if((sgn == IppsBigNumNEG) || (data[0]<=(Ipp32u)src2))
877 #elif MPHELL_USE_MBEDTLS == 1 878 return (mbedtls_mpi_cmp_int(src1, (mbedtls_mpi_sint)src2) > 0);
885 #if MPHELL_USE_GMP == 1 886 return (mpz_cmp(src1, src2) > 0);
887 #elif MPHELL_USE_IPP == 1 889 ippsCmp_BN(src1, src2, &test);
890 return (test==GREATER_THAN_ZERO);
891 #elif MPHELL_USE_MBEDTLS == 1 892 return (mbedtls_mpi_cmp_mpi(src1, src2)>0);
900 #if MPHELL_USE_GMP == 1 901 return (mpz_cmp_ui(src1, src2) <= 0);
902 #elif MPHELL_USE_IPP == 1 904 #elif MPHELL_USE_MBEDTLS == 1 905 return (mbedtls_mpi_cmp_int(src1, (mbedtls_mpi_sint)src2) <= 0);
912 #if MPHELL_USE_GMP == 1 913 return (mpz_cmp(src1, src2) <= 0);
914 #elif MPHELL_USE_IPP == 1 916 #elif MPHELL_USE_MBEDTLS == 1 917 return (mbedtls_mpi_cmp_mpi(src1, src2)<=0);
924 #if MPHELL_USE_GMP == 1 925 return (mpz_cmp_ui(src1, src2) >= 0);
926 #elif MPHELL_USE_IPP == 1 928 #elif MPHELL_USE_MBEDTLS == 1 929 return (mbedtls_mpi_cmp_int(src1, (mbedtls_mpi_sint)src2) >= 0);
936 #if MPHELL_USE_GMP == 1 937 return (mpz_cmp(src1, src2) >= 0);
938 #elif MPHELL_USE_IPP == 1 940 #elif MPHELL_USE_MBEDTLS == 1 941 return (mbedtls_mpi_cmp_mpi(src1, src2)>=0);
948 #if MPHELL_USE_GMP == 1 949 return mpz_cmp_ui(src1, src2);
950 #elif MPHELL_USE_IPP == 1 960 #elif MPHELL_USE_MBEDTLS == 1 961 return mbedtls_mpi_cmp_int(src1, (mbedtls_mpi_sint)src2);
968 #if MPHELL_USE_GMP == 1 969 return mpz_cmp(src1, src2);
970 #elif MPHELL_USE_IPP == 1 972 ippsCmp_BN(src1, src2, &test);
977 else if (test==GREATER_THAN_ZERO)
985 #elif MPHELL_USE_MBEDTLS == 1 986 return mbedtls_mpi_cmp_mpi(src1, src2);
993 #if MPHELL_USE_GMP == 1 994 return !(LIMB(src)[0] & (block)1);
995 #elif MPHELL_USE_IPP == 1 997 ippsRef_BN(NULL, NULL, &data, src);
998 return !(data[0] & (block)1);
999 #elif MPHELL_USE_MBEDTLS == 1 1000 return !(src->p[0] & (block)1);
1007 #if MPHELL_USE_GMP == 1 1008 return (LIMB(src)[0] & (block)1);
1009 #elif MPHELL_USE_IPP == 1 1011 ippsRef_BN(NULL, NULL, &data, src);
1012 return (data[0] & (block)1);
1013 #elif MPHELL_USE_MBEDTLS == 1 1014 return (src->p[0] & (block)1);
1023 #if MPHELL_USE_GMP == 1 1026 mpz_set_ui(t, src2);
1027 mpz_and(t, src1, t);
1028 block res = mpz_get_ui(t);
1031 #elif MPHELL_USE_IPP == 1 1033 ippsRef_BN(NULL, NULL, &data, src1);
1034 return data[0] & (Ipp32u)src2;
1035 #elif MPHELL_USE_MBEDTLS == 1 1036 return (src1->p[0] & src2);
1041 number_and (number_ptr dst, number_srcptr src1, number_srcptr src2)
1043 #if MPHELL_USE_GMP == 1 1044 mpz_and(dst, src1, src2);
1045 #elif MPHELL_USE_IPP == 1 1046 Ipp32u * data1, * data2;
1047 int len1, len2, lenchunk1, lenchunk2;
1048 ippsRef_BN(NULL, &len1, &data1, src1);
1049 ippsRef_BN(NULL, &len2, &data2, src2);
1054 if(lenchunk1 < lenchunk2)
1063 for (i=0; i<min; i++)
1065 tab[i] = data1[i] & data2[i];
1067 ippsSet_BN(IppsBigNumPOS, min, tab, dst);
1068 #elif MPHELL_USE_MBEDTLS == 1 1071 if(src1->n < src2->n)
1079 for (i=0; i<min; i++)
1081 dst->p[i] = src1->p[i] & src2->p[i];
1083 for (i=min; i<dst->n; i++)
1091 number_or_ui (number_ptr dst, number_srcptr src1,
const block src2, uint8_t stack)
1093 #if MPHELL_USE_GMP == 1 1096 mpz_set_ui(t, src2);
1097 mpz_ior(dst, src1, t);
1099 #elif MPHELL_USE_IPP == 1 1102 ippsRef_BN(NULL, NULL, &data, dst);
1104 #elif MPHELL_USE_MBEDTLS == 1 1111 number_or (number_ptr dst, number_srcptr src1, number_srcptr src2)
1113 #if MPHELL_USE_GMP == 1 1114 mpz_ior(dst, src1, src2);
1115 #elif MPHELL_USE_IPP == 1 1117 Ipp32u * data1, * data2;
1118 int len1, len2, lenchunk1, lenchunk2;
1119 ippsRef_BN(NULL, &len1, &data1, src1);
1120 ippsRef_BN(NULL, &len2, &data2, src2);
1123 if(lenchunk1 < lenchunk2)
1125 Ipp32u tab[lenchunk2];
1126 for (i=0; i<lenchunk1; i++)
1128 tab[i] = data1[i] | data2[i];
1130 for(i=lenchunk1; i<lenchunk2; i++)
1134 ippsSet_BN(IppsBigNumPOS, lenchunk2, tab, dst);
1138 Ipp32u tab[lenchunk1];
1139 for (i=0; i<lenchunk2; i++)
1141 tab[i] = data1[i] | data2[i];
1143 for(i=lenchunk2; i<lenchunk1; i++)
1147 ippsSet_BN(IppsBigNumPOS, lenchunk1, tab, dst);
1149 #elif MPHELL_USE_MBEDTLS == 1 1151 if(src1->n < src2->n)
1153 for (i=0; i<src1->n; i++)
1155 dst->p[i] = src1->p[i] | src2->p[i];
1157 for(i=src1->n; i<src2->n; i++)
1159 dst->p[i] = src2->p[i];
1164 for (i=0; i<src2->n; i++)
1166 dst->p[i] = src1->p[i] | src2->p[i];
1168 for(i=src2->n; i<src1->n; i++)
1170 dst->p[i] = src1->p[i];
1177 number_xor_ui (number_ptr dst, number_srcptr src1,
const block src2, uint8_t stack)
1179 #if MPHELL_USE_GMP == 1 1182 mpz_set_ui(t, src2);
1183 mpz_xor(dst, src1, t);
1185 #elif MPHELL_USE_IPP == 1 1188 ippsRef_BN(NULL, NULL, &data, dst);
1190 #elif MPHELL_USE_MBEDTLS == 1 1197 number_xor (number_ptr dst, number_srcptr src1, number_srcptr src2)
1199 #if MPHELL_USE_GMP == 1 1200 mpz_xor(dst, src1, src2);
1201 #elif MPHELL_USE_IPP == 1 1203 Ipp32u * data1, * data2;
1204 int len1, len2, lenchunk1, lenchunk2;
1205 ippsRef_BN(NULL, &len1, &data1, src1);
1206 ippsRef_BN(NULL, &len2, &data2, src2);
1209 if(lenchunk1 < lenchunk2)
1211 Ipp32u tab[lenchunk2];
1212 for (i=0; i<lenchunk1; i++)
1214 tab[i] = data1[i] ^ data2[i];
1216 for(i=lenchunk1; i<lenchunk2; i++)
1220 ippsSet_BN(IppsBigNumPOS, lenchunk2, tab, dst);
1224 Ipp32u tab[lenchunk1];
1225 for (i=0; i<lenchunk2; i++)
1227 tab[i] = data1[i] ^ data2[i];
1229 for(i=lenchunk2; i<lenchunk1; i++)
1233 ippsSet_BN(IppsBigNumPOS, lenchunk1, tab, dst);
1235 #elif MPHELL_USE_MBEDTLS == 1 1237 if(src1->n < src2->n)
1239 for (i=0; i<src1->n; i++)
1241 dst->p[i] = src1->p[i] ^ src2->p[i];
1243 for(i=src1->n; i<src2->n; i++)
1245 dst->p[i] = src2->p[i];
1250 for (i=0; i<src2->n; i++)
1252 dst->p[i] = src1->p[i] ^ src2->p[i];
1254 for(i=src2->n; i<src1->n; i++)
1256 dst->p[i] = src1->p[i];
1265 #if MPHELL_USE_GMP == 1 1266 mpz_mul_2exp(dst, src, shift);
1267 #elif MPHELL_USE_IPP == 1 1270 q = len32 - ((shift % 32)!=0);
1272 int lenshift=len32+(r==0);
1273 Ipp32u data[lenshift];
1274 memset(data, 0, lenshift*4);
1275 data[lenshift-1] = (Ipp32u)1 << r;
1278 ippsSet_BN(IppsBigNumPOS, lenshift, data, tmp);
1279 ippsMul_BN(src, tmp, dst);
1281 #elif MPHELL_USE_MBEDTLS == 1 1283 mbedtls_mpi_shift_l(dst, shift);
1290 #if MPHELL_USE_GMP == 1 1291 mpz_tdiv_q_2exp(dst, src, shift);
1292 #elif MPHELL_USE_IPP == 1 1295 q = len32 - ((shift % 32)!=0);
1297 int lenshift=len32+(r==0);
1298 Ipp32u data[lenshift];
1299 memset(data, 0, lenshift*4);
1300 data[lenshift-1] = (Ipp32u)1 << r;
1303 ippsSet_BN(IppsBigNumPOS, lenshift, data, tmp);
1307 #elif MPHELL_USE_MBEDTLS == 1 1309 mbedtls_mpi_shift_r(dst, shift);
1320 #if MPHELL_USE_GMP == 1 1321 mpz_add_ui(dst, src1, src2);
1322 #elif MPHELL_USE_IPP == 1 1326 ippsAdd_BN(src1, tmp, dst);
1328 #elif MPHELL_USE_MBEDTLS == 1 1329 mbedtls_mpi_add_int(dst, src1, (mbedtls_mpi_sint)src2);
1337 #if MPHELL_USE_GMP == 1 1338 mpz_add(dst, src1, src2);
1339 #elif MPHELL_USE_IPP == 1 1340 ippsAdd_BN(src1, src2, dst);
1341 #elif MPHELL_USE_MBEDTLS == 1 1342 mbedtls_mpi_add_mpi(dst, src1, src2);
1356 #if MPHELL_USE_GMP == 1 1357 mpz_sub_ui(dst, src1, src2);
1358 #elif MPHELL_USE_IPP == 1 1362 ippsSub_BN(src1, tmp, dst);
1364 #elif MPHELL_USE_MBEDTLS == 1 1365 mbedtls_mpi_sub_int(dst, src1, (mbedtls_mpi_sint)src2);
1373 #if MPHELL_USE_GMP == 1 1374 mpz_sub(dst, src1, src2);
1375 #elif MPHELL_USE_IPP == 1 1376 ippsSub_BN(src1, src2, dst);
1377 #elif MPHELL_USE_MBEDTLS == 1 1378 mbedtls_mpi_sub_mpi(dst, src1, src2);
1391 #if MPHELL_USE_GMP == 1 1392 mpz_mul_ui(dst, src1, src2);
1393 #elif MPHELL_USE_IPP == 1 1397 ippsMul_BN(src1, tmp, dst);
1399 #elif MPHELL_USE_MBEDTLS == 1 1400 mbedtls_mpi_mul_int(dst, src1, (mbedtls_mpi_uint)src2);
1407 #if MPHELL_USE_GMP == 1 1408 mpz_addmul_ui(dst, src1, src2);
1409 #elif MPHELL_USE_IPP == 1 1413 ippsMAC_BN_I(src1, tmp, dst);
1415 #elif MPHELL_USE_MBEDTLS == 1 1425 number_mul (number_ptr dst, number_srcptr src1, number_srcptr src2)
1427 #if MPHELL_USE_GMP == 1 1428 mpz_mul(dst, src1, src2);
1429 #elif MPHELL_USE_IPP == 1 1430 ippsMul_BN(src1, src2, dst);
1431 #elif MPHELL_USE_MBEDTLS == 1 1432 mbedtls_mpi_mul_mpi(dst, src1, src2);
1436 void number_mul_mod (number_ptr dst, number_srcptr src1, number_srcptr src2, number_srcptr mod, uint8_t stack)
1438 #if MPHELL_USE_GMP == 1 1439 uint8_t size = SIZ(src1)+SIZ(src2);
1442 mpz_mul(tmp, src1, src2);
1443 mpz_mod(dst, tmp, mod);
1445 #elif MPHELL_USE_IPP == 1 1448 int len1, len2, lenchunk1, lenchunk2;
1449 ippsRef_BN(NULL, &len1, NULL, src1);
1450 ippsRef_BN(NULL, &len2, NULL, src2);
1454 ippsMul_BN(src1, src2, mul);
1455 ippsMod_BN(mul, mod, dst);
1457 #elif MPHELL_USE_MBEDTLS == 1 1458 uint8_t size = src1->n+src2->n;
1461 mbedtls_mpi_mul_mpi(tmp, src1, src2);
1462 mbedtls_mpi_mod_mpi(dst, tmp, mod);
1470 #if MPHELL_USE_GMP == 1 1471 mpz_addmul(dst, src1, src2);
1472 #elif MPHELL_USE_IPP == 1 1473 ippsMAC_BN_I(src1, src2, dst);
1474 #elif MPHELL_USE_MBEDTLS == 1 1484 number_pow (number_ptr dst, number_srcptr src1, number_srcptr src2, uint8_t stack)
1486 #if MPHELL_USE_GMP == 1 1487 mpz_pow_ui(dst, src1, mpz_get_ui(src2));
1488 #elif MPHELL_USE_IPP == 1 1489 int len1, len2, lenchunk1, lenchunk2;
1490 ippsRef_BN(NULL, &len1, NULL, src1);
1491 ippsRef_BN(NULL, &len2, NULL, src2);
1515 #elif MPHELL_USE_MBEDTLS == 1 1541 number_powm (number_ptr dst, number_srcptr src1, number_srcptr src2, number_srcptr mod, uint8_t stack)
1543 #if MPHELL_USE_GMP == 1 1544 mpz_powm(dst, src1, src2, mod);
1545 #elif MPHELL_USE_IPP == 1 1546 int i,len1, len2, lenchunk1;
1548 ippsRef_BN(NULL, &len1, NULL, mod);
1558 for(i=len2-1; i>=0; i--)
1568 #elif MPHELL_USE_MBEDTLS == 1 1571 mbedtls_mpi_exp_mod(dst, src1, src2, mod, NULL);
1583 for(i=strlen(m)-1; i>=0; i--)
1598 number_powm_ui (number_ptr dst, number_srcptr src1,
const block src2, number_srcptr mod, uint8_t stack)
1600 #if MPHELL_USE_GMP == 1 1601 mpz_powm_ui(dst, src1, src2, mod);
1602 #elif MPHELL_USE_IPP == 1 1604 int len1, lenchunk1;
1605 ippsRef_BN(NULL, &len1, NULL, mod);
1611 while (m != (block)0)
1621 #elif MPHELL_USE_MBEDTLS == 1 1625 mbedtls_mpi_uint p[1];
1631 mbedtls_mpi_exp_mod(dst, src1, &B, mod, NULL);
1640 while (m != (block)0)
1657 #if MPHELL_USE_GMP == 1 1658 mpz_mul(dst, src, src);
1659 #elif MPHELL_USE_IPP == 1 1660 ippsMul_BN(src, src, dst);
1661 #elif MPHELL_USE_MBEDTLS == 1 1662 mbedtls_mpi_mul_mpi(dst, src, src);
1670 #if MPHELL_USE_GMP == 1 1671 *r = mpz_fdiv_q_ui(q, src1, src2);
1672 #elif MPHELL_USE_IPP == 1 1678 ippsDiv_BN(src1, b, q, rst);
1680 ippsRef_BN(NULL, NULL, &data, rst);
1684 #elif MPHELL_USE_MBEDTLS == 1 1686 mbedtls_mpi_uint p[1];
1690 mbedtls_mpi_div_int(q, &B, src1, (mbedtls_mpi_sint)src2);
1699 #if MPHELL_USE_GMP == 1 1700 mpz_divmod(q, r, src1, src2);
1701 #elif MPHELL_USE_IPP == 1 1702 ippsDiv_BN(src1, src2, q, r);
1703 #elif MPHELL_USE_MBEDTLS == 1 1704 mbedtls_mpi_div_mpi(q, r, src1, src2);
1711 #if MPHELL_USE_GMP == 1 1712 mpz_fdiv_q_ui(dst, src1, src2);
1713 #elif MPHELL_USE_IPP == 1 1719 ippsDiv_BN(src1, b, dst, rst);
1722 #elif MPHELL_USE_MBEDTLS == 1 1724 mbedtls_mpi_uint p[1];
1728 mbedtls_mpi_div_int(dst, &B, src1, (mbedtls_mpi_sint)src2);
1733 number_div (number_ptr dst, number_srcptr src1, number_srcptr src2)
1735 #if MPHELL_USE_GMP == 1 1736 mpz_div(dst, src1, src2);
1737 #elif MPHELL_USE_IPP == 1 1740 ippsRef_BN(NULL, &len, NULL, src2);
1743 ippsDiv_BN(src1, src2, dst, rst);
1745 #elif MPHELL_USE_MBEDTLS == 1 1746 mbedtls_mpi_div_mpi(dst, NULL, src1, src2);
1753 #if MPHELL_USE_GMP == 1 1754 *dst = mpz_fdiv_ui(src1, (block)src2);
1755 #elif MPHELL_USE_IPP == 1 1760 ippsMod_BN(src1, b, d);
1762 ippsRef_BN(NULL, NULL, &data, d);
1766 #elif MPHELL_USE_MBEDTLS == 1 1768 mbedtls_mpi_uint p[1];
1773 mbedtls_mpi_uint q[1];
1778 mbedtls_mpi_mod_mpi(&B, src1, &C);
1785 number_mod (number_ptr dst, number_srcptr src1, number_srcptr src2)
1787 #if MPHELL_USE_GMP == 1 1788 mpz_mod(dst, src1, src2);
1789 #elif MPHELL_USE_IPP == 1 1790 ippsMod_BN(src1, src2, dst);
1791 #elif MPHELL_USE_MBEDTLS == 1 1792 mbedtls_mpi_mod_mpi(dst, src1, src2);
1799 MPHELL_ASSERT_ALWAYS(
number_iszero(src1) ==
false ,
"number_invmod : src1 == 0");
1805 #if MPHELL_USE_GMP == 1 1806 mpz_invert(dst, src1, src2);
1807 #elif MPHELL_USE_IPP == 1 1810 int len1, lenchunk1;
1811 ippsRef_BN(NULL, &len1, NULL, src1);
1816 IppStatus st = ippsModInv_BN(tmp, src2, dst);
1817 if(st != ippStsNoErr)
1819 printf(
"Error ippsModInv_BN: %s\n", ippcpGetStatusString(st));
1823 else if(dst == src2)
1825 int len2, lenchunk2;
1826 ippsRef_BN(NULL, &len2, NULL, src2);
1831 IppStatus st = ippsModInv_BN(src1, tmp, dst);
1832 if(st != ippStsNoErr)
1834 printf(
"Error ippsModInv_BN: %s\n", ippcpGetStatusString(st));
1840 IppStatus st = ippsModInv_BN(src1, src2, dst);
1841 if(st != ippStsNoErr)
1843 printf(
"Error ippsModInv_BN: %s\n", ippcpGetStatusString(st));
1846 #elif MPHELL_USE_MBEDTLS == 1 1847 mbedtls_mpi_inv_mod(dst, src1, src2);
1853 #if MPHELL_USE_GMP == 1 1856 mpz_init(minus_src);
1857 mpz_set_ui(minus_src, src);
1858 mpz_neg(minus_src, minus_src);
1866 mpz_mul_2exp(base, one, BLOCK_SIZE);
1871 mpz_invert(res, minus_src, base);
1872 *dst = mpz_get_ui(res);
1875 mpz_clear(minus_src);
1879 #elif MPHELL_USE_IPP == 1 1881 #elif MPHELL_USE_MBEDTLS == 1 1882 mbedtls_mpi_uint x, m0 = src;
1886 x += ( ( m0 + 2 ) & 4 ) << 1;
1888 for( i =
sizeof(mbedtls_mpi_uint)<<3; i >= 8; i /= 2 )
1889 x *= ( 2 - ( m0 * x ) );
1896 #if MPHELL_USE_GMP == 1 1899 redcify(number_ptr dst, number_srcptr src, number_srcptr p, uint8_t stack)
1902 uint8_t n = SIZ(p)+SIZ(src);
1904 mpz_mul_2exp(tp, src, SIZ(p)*BLOCK_SIZE);
1905 mpz_tdiv_r (dst, tp, p);
1916 gmp_rshift1(mpz_t dst, uint8_t size)
1919 for (i = 0; i < size-1; i++)
1921 LIMB(dst)[i]=LIMB(dst)[i+1];
1923 LIMB(dst)[size-1]= 0;
1937 gmp_redc_1 (mp_ptr rp, mp_ptr up, mp_srcptr mp, mp_size_t n, mp_limb_t invm)
1942 for (j = n - 1; j >= 0; j--)
1944 cy = mpn_addmul_1 (up, mp, n, (up[0] * invm) & GMP_NUMB_MASK);
1945 MPHELL_ASSERT (up[0] == 0,
"mphell_redc_1 : up[0] == 0");
1949 cy = mpn_add_n (rp, up, up - n, n);
1953 mpn_sub_n (rp, rp, mp, n);
1955 if(mpn_cmp(rp, mp, n)>0)
1957 mpn_sub_n (rp, rp, mp, n);
1962 for(i=n-1; i>=0; i--)
1986 gmp_mred_full(number_ptr dst, number_srcptr src1, number_srcptr src2, number_srcptr p,
1987 const block invp, uint8_t stack)
1993 mpn_mul_n(LIMB(tmp), LIMB(src1), LIMB(src2), n);
1994 SIZ(dst)=gmp_redc_1(LIMB(dst), LIMB(tmp), LIMB(p), n, invp);
2008 gmp_mred_block(number_ptr dst, number_srcptr src1, number_srcptr src2, number_srcptr p,
2009 const block invp, uint8_t stack)
2012 uint8_t n1 = SIZ(src1);
2024 mp_limb_t *res = LIMB(tmp);
2025 mp_limb_t m, carry, a;
2028 memset(res, 0, n*BLOCK_SIZE);
2030 for (i = 0; i < n1; i++)
2033 m = (res[0] + (LIMB(src1)[i] * LIMB(src2)[0])) * invp;
2037 carry = mpn_addmul_1 (res, LIMB(src2), SIZ(src2), LIMB(src1)[i]);
2039 if((SIZ(src2) < n) && (carry > 0))
2041 carry = mpn_add_1 (res + SIZ(src2), res + SIZ(src2), n - SIZ(src2), carry);
2044 a = mpn_addmul_1 (res, LIMB(p), n, m);
2045 gmp_rshift1(tmp, n);
2047 res[n - 1] = carry + a;
2049 if ((res[n - 1] < a) || (res[n - 1] < carry))
2051 mpn_sub (res, res, n, LIMB(p), n);
2053 else if (mpn_cmp(res, LIMB(p), n)>=0)
2055 mpn_sub (res, res, n, LIMB(p), n);
2058 for (i = n1; i < n; i++)
2064 a = mpn_addmul_1 (res, LIMB(p), n, m);
2067 gmp_rshift1(tmp, n);
2072 if (mpn_cmp(res, LIMB(p), n)>=0)
2074 mpn_sub (res, res, n, LIMB(p), n);
2079 for(i=n-1; i>=0; i--)
2090 mpn_copyi(LIMB(dst), res, SIZ(tmp));
2091 SIZ(dst) = SIZ(tmp);
2094 #elif MPHELL_USE_IPP == 1 2097 #elif MPHELL_USE_MBEDTLS == 1 2101 redcify(number_ptr dst, number_srcptr src, number_srcptr p, uint8_t stack)
2104 uint8_t n = p->n+src->n;
2115 #if defined(__APPLE__) && defined(__arm__) 2120 __attribute__ ((noinline))
2122 void mpi_mul_hlp_mphell(
size_t i, mbedtls_mpi_uint *s, mbedtls_mpi_uint *d, mbedtls_mpi_uint b )
2124 mbedtls_mpi_uint c = 0, t = 0;
2126 #if defined(MULADDC_HUIT) 2127 for( ; i >= 8; i -= 8 )
2141 for( ; i >= 16; i -= 16 )
2144 MULADDC_CORE MULADDC_CORE
2145 MULADDC_CORE MULADDC_CORE
2146 MULADDC_CORE MULADDC_CORE
2147 MULADDC_CORE MULADDC_CORE
2149 MULADDC_CORE MULADDC_CORE
2150 MULADDC_CORE MULADDC_CORE
2151 MULADDC_CORE MULADDC_CORE
2152 MULADDC_CORE MULADDC_CORE
2156 for( ; i >= 8; i -= 8 )
2159 MULADDC_CORE MULADDC_CORE
2160 MULADDC_CORE MULADDC_CORE
2162 MULADDC_CORE MULADDC_CORE
2163 MULADDC_CORE MULADDC_CORE
2178 *d += c; c = ( *d < c ); d++;
2186 static void mpi_sub_hlp_mphell(
size_t n, mbedtls_mpi_uint *s, mbedtls_mpi_uint *d )
2189 mbedtls_mpi_uint c, z;
2191 for( i = c = 0; i < n; i++, s++, d++ )
2193 z = ( *d < c ); *d -= c;
2194 c = ( *d < *s ) + z; *d -= *s;
2199 z = ( *d < c ); *d -= c;
2205 mpi_montmul_mphell(mbedtls_mpi *Dst,
const mbedtls_mpi *A,
const mbedtls_mpi *B,
const mbedtls_mpi *N, mbedtls_mpi_uint mm,
const mbedtls_mpi *T )
2208 mbedtls_mpi_uint u0, u1, *d;
2210 memset( T->p, 0, T->n * BYTES_PER_LIMB );
2214 m = ( B->n < n ) ? B->n : n;
2216 for( i = 0; i < n; i++ )
2222 u1 = ( d[0] + u0 * B->p[0] ) * mm;
2224 mpi_mul_hlp_mphell( m, B->p, d, u0 );
2225 mpi_mul_hlp_mphell( n, N->p, d, u1 );
2227 *d++ = u0; d[n + 1] = 0;
2230 memcpy( Dst->p, d, ( n + 1 ) * BYTES_PER_LIMB );
2232 if( mbedtls_mpi_cmp_abs( Dst, N ) >= 0 )
2234 mpi_sub_hlp_mphell( n, N->p, Dst->p );
2241 number_mul_montgomery(number_ptr dst, number_srcptr src1, number_srcptr src2, number_srcptr p,
const block invp, uint8_t stack)
2243 #if MPHELL_USE_GMP == 1 2244 MPHELL_ASSERT(SIZ(src1) >= 0,
"number_mul_montgomery : invalid size for src1");
2245 MPHELL_ASSERT(SIZ(src2) >= 0,
"number_mul_montgomery : invalid size for src2");
2246 MPHELL_ASSERT(SIZ(p) >= 1,
"number_mul_montgomery : invalid size for p");
2247 MPHELL_ASSERT(ALLOC_SIZ(dst) >= 1,
"number_mul_montgomery : invalid size for dst");
2249 if((SIZ(src1) == n) && (SIZ(src2) == n))
2251 gmp_mred_full(dst, src1, src2, p, invp, stack);
2255 gmp_mred_block(dst, src1, src2, p, invp, stack);
2257 #elif MPHELL_USE_IPP == 1 2259 #elif MPHELL_USE_MBEDTLS == 1 2262 mpi_montmul_mphell(dst, src1, src2, p, invp, tmp );
2270 #if MPHELL_USE_GMP == 1 2271 MPHELL_ASSERT(SIZ(src1) >= 0,
"number_mul_montgomery : invalid size for src1");
2272 MPHELL_ASSERT(SIZ(src2) >= 0,
"number_mul_montgomery : invalid size for src2");
2273 MPHELL_ASSERT(SIZ(p) >= 1,
"number_mul_montgomery : invalid size for p");
2274 MPHELL_ASSERT(ALLOC_SIZ(dst) >= 1,
"number_mul_montgomery : invalid size for dst");
2275 gmp_mred_block(dst, src1, src2, p, invp, stack);
2276 #elif MPHELL_USE_IPP == 1 2278 #elif MPHELL_USE_MBEDTLS == 1 2282 mpi_montmul_mphell(dst, src1, src2, p, invp, tmp );
2289 number_srcptr R2, number_srcptr one, uint8_t stack)
2291 #if (MPHELL_USE_GMP == 1 || MPHELL_USE_MBEDTLS == 1) 2292 MPHELL_ASSERT(SIZ(src) >= 1,
"u_invmod : invalid size for src");
2293 MPHELL_ASSERT(SIZ(R2) >= 1,
"u_invmod : invalid size for R2");
2294 MPHELL_ASSERT(SIZ(p) >= 1,
"u_invmod : invalid size for p");
2295 MPHELL_ASSERT(SIZ(one) >= 1,
"u_invmod : invalid size for one");
2296 MPHELL_ASSERT(ALLOC_SIZ(dst) >= 1,
"u_invmod : invalid size for dst");
2300 MPHELL_ASSERT_ALWAYS(
number_iszero(src)==
false,
"u_invmod : inversion of 0");
2325 if(!(LIMB(t)[0] & 1))
2330 else if(!(LIMB(r)[0] & 1))
2361 if(k <= (BLOCK_SIZE * n))
2364 k += BLOCK_SIZE * n;
2378 #elif MPHELL_USE_IPP == 1 2386 #if MPHELL_USE_GMP == 1 2387 return mpz_legendre(src1, src2);
2388 #elif MPHELL_USE_IPP == 1 2390 ippsRef_BN(NULL, &len, NULL, src2);
2413 #elif MPHELL_USE_MBEDTLS == 1 2415 uint8_t size = src2->n;
2446 #if MPHELL_USE_GMP == 1 2447 *dst = mpz_gcd_ui(NULL, src1, src2);
2448 #elif MPHELL_USE_IPP == 1 2454 ippsGcd_BN(src1, b, d);
2456 ippsRef_BN(NULL, NULL, &data, d);
2460 #elif MPHELL_USE_MBEDTLS == 1 2462 mbedtls_mpi_uint p[1];
2463 mbedtls_mpi_uint q[1];
2471 mbedtls_mpi_gcd(&B, src1, &C);
2477 number_gcd (number_ptr dst, number_srcptr src1, number_srcptr src2)
2479 #if MPHELL_USE_GMP == 1 2480 mpz_gcd(dst, src1, src2);
2481 #elif MPHELL_USE_IPP == 1 2482 ippsGcd_BN(src1, src2, dst);
2483 #elif MPHELL_USE_MBEDTLS == 1 2484 mbedtls_mpi_gcd(dst, src1, src2);
2491 #if MPHELL_USE_GMP == 1 2492 return mpz_probab_prime_p(src, (
int)bound);
2493 #elif MPHELL_USE_IPP == 1 2497 ippsRef_BN(NULL, &len, NULL, src);
2500 ippsPrimeGetSize(len, &ctxSize);
2501 IppsPrimeState* pPrimeG = (IppsPrimeState*)(malloc(ctxSize) );
2502 ippsPrimeInit(len, pPrimeG);
2505 ippsPRNGGetSize(&ctxSize);
2506 IppsPRNGState* pRand = (IppsPRNGState*)(malloc(ctxSize));
2507 ippsPRNGInit(160, pRand);
2508 ippsPrimeTest_BN(src, (
int) bound, &res, pPrimeG, ippsPRNGen, pRand);
2512 if (res == IPP_IS_PRIME)
2517 #elif MPHELL_USE_MBEDTLS == 1 2521 while(tmp->p[tmp->n-1]==0)
2525 int ret = mbedtls_mpi_is_prime(tmp,
mphell_rng, NULL);
uint8_t number_block_size(number_srcptr src)
Calculate the number of block used by src.
bool number_isdiff_ui(number_srcptr src1, const block src2)
Test if src1 != src2.
bool number_isdiff(number_srcptr src1, number_srcptr src2)
Test if src1 != src2.
bool number_iszero(number_srcptr src)
Test if src is zero.
void number_mod_ui(block *dst, number_srcptr src1, const block src2)
Compute dst such that src1 = q * src2 + dst ; dst < src2.
void number_div_ui(number_ptr dst, number_srcptr src1, const block src2)
Compute dst such that src1 = dst * src2 + r ; r < src2.
void number_invmod(number_ptr dst, number_srcptr src1, number_srcptr src2)
Compute dst such that dst = src1^(-1) mod src2.
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.
void number_powm_ui(number_ptr dst, number_srcptr src1, const block src2, number_srcptr mod, uint8_t stack)
Set dst to src1^src2 modulo mod.
uint8_t number_Rabin_Miller(number_srcptr src, const uint16_t bound)
Apply the Rabin-Miller test to src with the bound.
void number_to_bit_string(char *str, number_srcptr src)
Converts src (must be positive) to a bit string.
void number_get_ui(block *dst, number_srcptr src)
Get the less significant block of src.
void number_mul_ui(number_ptr dst, number_srcptr src1, const block src2)
Set dst to src1 * src2.
void number_set_bit(number_ptr dst, const uint32_t bit)
Set the bit-th of dst to 1, all the others to 0.
void number_set_ui(number_ptr dst, const block src)
Set dst to src.
bool number_iseven(number_srcptr src)
Test if src is even.
void number_div(number_ptr dst, number_srcptr src1, number_srcptr src2)
Compute dst such that src1 = dst * src2 + r ; r < src2.
uint8_t bits_to_nblock(const uint16_t nbits)
Return the number of blocks required to store a nbits number.
void number_addmul(number_ptr dst, number_srcptr src1, number_srcptr src2)
Set dst to dst + src1 * src2.
void redcify(number_ptr dst, number_srcptr src, number_srcptr p, uint8_t stack)
Set dst to redc form dst=B^n*src mod p.
bool number_isgreater(number_srcptr src1, number_srcptr src2)
Test if src1 > src2.
void number_mul_montgomery(number_ptr dst, number_srcptr src1, number_srcptr src2, number_srcptr p, const block invp, uint8_t stack)
Compute dst such that dst = (src1 * src2) mod(p) into the Montgomery form.
void number_gcd(number_ptr dst, number_srcptr src1, number_srcptr src2)
Set dst to GCD(src1, src2)
void number_random1(number_ptr dst, number_srcptr bound, uint8_t stack)
Set dst to a random number_ptr between 0 and bound, the random process is chosen at the MPHELL initia...
void number_free(number *dst)
Free a number_ptr allocated on the RAM memory (malloc)
void number_divmod_ui(number_ptr q, block *r, number_srcptr src1, const block src2)
Compute (q, r) such that src1 = q * src2 + r ; r < src2.
bool number_isgreatereq_ui(number_srcptr src1, const block src2)
Test if src1 >= src2.
bool number_isequal_ui(number_srcptr src1, const block src2)
Test if src1 == src2.
int mphell_rng(void *param, unsigned char *res, size_t n)
Set res to n random bytes.
void number_lshift(number_ptr dst, number_srcptr src, const uint16_t shift)
Set dst to src << shift.
void number_xor_ui(number_ptr dst, number_srcptr src1, const block src2, uint8_t stack)
Apply logical bitwise XOR operator between src1 and src2.
void number_mul(number_ptr dst, number_srcptr src1, number_srcptr src2)
Set dst to src1 * src2.
bool number_islowereq_ui(number_srcptr src1, const block src2)
Test if src1 <= src2.
void number_gcd_ui(block *dst, number_srcptr src1, const block src2)
Set dst to GCD(src1, src2)
bool number_islowereq(number_srcptr src1, number_srcptr src2)
Test if src1 <= src2.
bool number_isgreater_ui(number_srcptr src1, const block src2)
Test if src1 > src2.
uint8_t number_buffer_size(number_srcptr src)
Give the number of block that src can use.
block number_and_ui(number_srcptr src1, const block src2, uint8_t stack)
Apply logical bitwise AND operator between src1 and src2.
void number_set(number_ptr dst, const int8_t sign, const uint32_t size,...)
Set dst to [block_0, block_1, ..., block_(size-1)]. SIZ(dst) must be set before use.
void number_copy(number_ptr dst, number_srcptr src)
Copy src into dst.
void number_sqr(number_ptr dst, number_srcptr src)
Set dst to src1^2.
void number_sub(number_ptr dst, number_srcptr src1, number_srcptr src2)
Set dst to src1 - src2 if src1 - src2 fit in dst.
Declaration of arithmetic functions, interface to chose either GMP mpz or number as base type for ari...
void number_or(number_ptr dst, number_srcptr src1, number_srcptr src2)
Apply logical bitwise OR operator between src1 and src2.
bool number_islower(number_srcptr src1, number_srcptr src2)
Test if src1 < src2.
void number_random(number_ptr dst, const uint32_t size)
Set dst to a random number, the random process is chosen at the MPHELL initialisation....
void number_sub_ui(number_ptr dst, number_srcptr src1, const block src2)
Set dst to src1 - src2 if src1 - src2 fit in dst.
void number_mul_mod(number_ptr dst, number_srcptr src1, number_srcptr src2, number_srcptr mod, uint8_t stack)
Set dst to (src1 * src2) % mod.
void number_tmp_free(number *t, const uint8_t size, uint8_t stack)
Free a temporary number.
void number_powm(number_ptr dst, number_srcptr src1, number_srcptr src2, number_srcptr mod, uint8_t stack)
Set dst to src1^src2 modulo mod.
void number_inv_montgomery(number_ptr dst, number_srcptr src, number_srcptr p, const block invp, number_srcptr R2, number_srcptr one, uint8_t stack)
Compute dst such that dst = src^(-1) mod(p) into the Montgomery form.
void number_xor(number_ptr dst, number_srcptr src1, number_srcptr src2)
Apply logical bitwise XOR operator between src1 and src2.
void number_dec(number_ptr dst, number_srcptr src)
Set dst to src - 1 if src - 1 fit in dst.
void number_inc(number_ptr dst, number_srcptr src)
Set dst to src + 1 if src + 1 fit in dst.
void number_add(number_ptr dst, number_srcptr src1, number_srcptr src2)
Set dst to src1 + src2 if src1 + src2 fit in dst.
void number_set_str(number_ptr dst, const char *str, const uint8_t base)
Set dst to str.
void number_tmp_alloc(number *t, const uint8_t size, uint8_t stack)
Allocate a temporary number.
int8_t number_legendre(number_srcptr src1, number_srcptr src2, uint8_t stack)
Compute the legendre symbole of src1 and src2.
void number_init(number *dst, const uint8_t n)
Allocate a number_ptr on the RAM memory (malloc)
bool number_isodd(number_srcptr src)
Test if src is odd.
int8_t number_cmp(number_srcptr src1, number_srcptr src2)
Compare src1 and src2.
bool number_isgreatereq(number_srcptr src1, number_srcptr src2)
Test if src1 >= src2.
void number_print(number_srcptr src, const uint8_t base)
Print src in base "base".
void number_mod(number_ptr dst, number_srcptr src1, number_srcptr src2)
Compute dst such that src1 = q * src2 + dst ; dst < src2.
bool number_islower_ui(number_srcptr src1, const block src2)
Test if src1 < src2.
void number_rshift(number_ptr dst, number_srcptr src, const uint16_t shift)
Set dst to src >> shift.
void number_mul_montgomery_block(number_ptr dst, number_srcptr src1, number_srcptr src2, number_srcptr p, const block invp, uint8_t stack)
Compute dst such that dst = (src1 * src2) mod(p) into the Montgomery form, use when SIZ(src1) or SIZ(...
void number_or_ui(number_ptr dst, number_srcptr src1, const block src2, uint8_t stack)
Apply logical bitwise OR operator between src1 and src2.
void number_and(number_ptr dst, number_srcptr src1, number_srcptr src2)
Apply logical bitwise AND operator between src1 and src2.
void number_inv_mod_basis(block *dst, const block src)
Compute dst such that dst * (-src) = -1 mod (2^(BLOCK_SIZE))
void number_pow(number_ptr dst, number_srcptr src1, number_srcptr src2, uint8_t stack)
Set dst to src1^src2.
int8_t number_cmp_ui(number_srcptr src1, const block src2)
Compare src1 and src2.
void number_divmod(number_ptr q, number_ptr r, number_srcptr src1, number_srcptr src2)
Compute (q, r) such that src1 = q * src2 + r ; r < src2.
bool number_isequal(number_srcptr src1, number_srcptr src2)
Test if src1 == src2.
void number_str(char **str, number_srcptr src, const uint8_t base)
Converts src to string format in base specified by base.
void number_add_ui(number_ptr dst, number_srcptr src1, const block src2)
Set dst to src1 + src2 if src1 + src2 fit in dst.
void number_addmul_ui(number_ptr dst, number_srcptr src1, const block src2)
Set dst to dst + src1 * src2.