38 #if defined(MBEDTLS_BIGNUM_C)
51 #define MPI_VALIDATE_RET(cond) \
52 MBEDTLS_INTERNAL_VALIDATE_RET(cond, MBEDTLS_ERR_MPI_BAD_INPUT_DATA)
53 #define MPI_VALIDATE(cond) \
54 MBEDTLS_INTERNAL_VALIDATE(cond)
56 #define ciL (sizeof(mbedtls_mpi_uint))
57 #define biL (ciL << 3)
58 #define biH (ciL << 2)
60 #define MPI_SIZE_T_MAX ((size_t) -1)
66 #define BITS_TO_LIMBS(i) ((i) / biL + ((i) % biL != 0))
67 #define CHARS_TO_LIMBS(i) ((i) / ciL + ((i) % ciL != 0))
118 if (X->
n < nblimbs) {
124 memcpy(p, X->
p, X->
n *
ciL);
151 if (X->
n <= nblimbs) {
156 for (
i = X->
n - 1;
i > 0;
i--) {
172 memcpy(p, X->
p,
i *
ciL);
189 }
else if (X->
n == limbs) {
190 memset(X->
p, 0, limbs *
ciL);
222 memset(X->
p, 0, X->
n *
ciL);
227 for (
i = Y->
n - 1;
i > 0;
i--) {
239 memset(X->
p +
i, 0, (X->
n -
i) *
ciL);
242 memcpy(X->
p, Y->
p,
i *
ciL);
284 memset(X->
p, 0, X->
n *
ciL);
287 X->
s = (z < 0) ? -1 : 1;
301 if (X->
n *
biL <= pos) {
305 return (X->
p[pos /
biL] >> (pos %
biL)) & 0x01;
309 #define GET_BYTE(X, i) \
310 (((X)->p[(i) / ciL] >> (((i) % ciL) * 8)) & 0xff)
318 size_t off = pos /
biL;
319 size_t idx = pos %
biL;
322 if (
val != 0 &&
val != 1) {
326 if (X->
n *
biL <= pos) {
347 size_t i, j, count = 0;
350 for (
i = 0;
i < X->
n;
i++) {
351 for (j = 0; j <
biL; j++, count++) {
352 if (((X->
p[
i] >> j) & 1) != 0) {
369 for (j = 0; j <
biL; j++) {
391 for (
i = X->
n - 1;
i > 0;
i--) {
399 return (
i *
biL) + j;
417 if (c >= 0x30 && c <= 0x39) {
420 if (c >= 0x41 && c <= 0x46) {
423 if (c >= 0x61 && c <= 0x66) {
440 size_t i, j, slen,
n;
447 if (radix < 2 || radix > 16) {
475 for (
i = slen, j = 0;
i > 0;
i--, j++) {
477 X->
p[j / (2 *
ciL)] |= d << ((j % (2 *
ciL)) << 2);
482 for (
i = 0;
i < slen;
i++) {
504 char **p,
const size_t buflen)
509 char *p_end = *p + buflen;
512 if (length >= buflen) {
522 *(--p_end) = (
char) (
'0' +
r);
524 *(--p_end) = (
char) (
'A' + (
r - 0xA));
542 char *
buf,
size_t buflen,
size_t *olen)
552 if (radix < 2 || radix > 16) {
592 for (
i = X->
n, k = 0;
i > 0;
i--) {
593 for (j =
ciL; j > 0; j--) {
594 c = (X->
p[
i - 1] >> ((j - 1) << 3)) & 0xFF;
596 if (c == 0 && k == 0 && (
i + j) != 2) {
600 *(p++) =
"0123456789ABCDEF" [c / 16];
601 *(p++) =
"0123456789ABCDEF" [c % 16];
625 #if defined(MBEDTLS_FS_IO)
643 if (radix < 2 || radix > 16) {
647 memset(s, 0,
sizeof(s));
648 if (fgets(s,
sizeof(s) - 1, fin) ==
NULL) {
653 if (slen ==
sizeof(s) - 2) {
657 if (slen > 0 && s[slen - 1] ==
'\n') {
658 slen--; s[slen] =
'\0';
660 if (slen > 0 && s[slen - 1] ==
'\r') {
661 slen--; s[slen] =
'\0';
680 size_t n, slen, plen;
688 if (radix < 2 || radix > 16) {
692 memset(s, 0,
sizeof(s));
706 if (fwrite(p, 1, plen, fout) != plen ||
707 fwrite(s, 1, slen, fout) != slen) {
727 unsigned char *x_ptr;
730 for (
i = 0, x_ptr = (
unsigned char *) &x;
i <
ciL;
i++, x_ptr++) {
740 #if defined(__BYTE_ORDER__)
743 #if (__BYTE_ORDER__ == __ORDER_BIG_ENDIAN__)
747 #if (__BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__)
750 #if defined(__GNUC__) && defined(__GNUC_PREREQ)
751 #if __GNUC_PREREQ(4, 3)
756 #if defined(__clang__) && defined(__has_builtin)
757 #if __has_builtin(__builtin_bswap32) && \
758 __has_builtin(__builtin_bswap64)
763 #if defined(have_bswap)
767 return __builtin_bswap32(x);
769 return __builtin_bswap64(x);
797 for (cur_limb_left = p, cur_limb_right = p + (limbs - 1);
798 cur_limb_left <= cur_limb_right;
799 cur_limb_left++, cur_limb_right--) {
805 *cur_limb_right =
tmp;
813 const unsigned char *
buf,
size_t buflen)
822 for (
i = 0;
i < buflen;
i++) {
843 size_t const overhead = (limbs *
ciL) - buflen;
855 Xp = (
unsigned char *) X->
p;
856 memcpy(Xp + overhead,
buf, buflen);
875 unsigned char *
buf,
size_t buflen)
877 size_t stored_bytes = X->
n *
ciL;
878 size_t bytes_to_copy;
881 if (stored_bytes < buflen) {
882 bytes_to_copy = stored_bytes;
884 bytes_to_copy = buflen;
888 for (
i = bytes_to_copy;
i < stored_bytes;
i++) {
895 for (
i = 0;
i < bytes_to_copy;
i++) {
899 if (stored_bytes < buflen) {
901 memset(
buf + stored_bytes, 0, buflen - stored_bytes);
911 unsigned char *
buf,
size_t buflen)
914 size_t bytes_to_copy;
921 stored_bytes = X->
n *
ciL;
923 if (stored_bytes < buflen) {
929 bytes_to_copy = stored_bytes;
930 p =
buf + buflen - stored_bytes;
931 memset(
buf, 0, buflen - stored_bytes);
935 bytes_to_copy = buflen;
937 for (
i = bytes_to_copy;
i < stored_bytes;
i++) {
944 for (
i = 0;
i < bytes_to_copy;
i++) {
962 t1 = count & (
biL - 1);
966 if (X->
n *
biL <
i) {
976 for (
i = X->
n;
i > v0;
i--) {
977 X->
p[
i - 1] = X->
p[
i - v0 - 1];
989 for (
i = v0;
i < X->
n;
i++) {
990 r1 = X->
p[
i] >> (
biL - t1);
1012 v1 = count & (
biL - 1);
1014 if (v0 > X->
n || (v0 == X->
n && v1 > 0)) {
1022 for (
i = 0;
i < X->
n - v0;
i++) {
1023 X->
p[
i] = X->
p[
i + v0];
1026 for (;
i < X->
n;
i++) {
1035 for (
i = X->
n;
i > 0;
i--) {
1036 r1 = X->
p[
i - 1] << (
biL - v1);
1055 for (
i = X->
n;
i > 0;
i--) {
1056 if (X->
p[
i - 1] != 0) {
1061 for (j = Y->
n; j > 0; j--) {
1062 if (Y->
p[j - 1] != 0) {
1067 if (
i == 0 && j == 0) {
1078 for (;
i > 0;
i--) {
1079 if (X->
p[
i - 1] > Y->
p[
i - 1]) {
1082 if (X->
p[
i - 1] < Y->
p[
i - 1]) {
1099 for (
i = X->
n;
i > 0;
i--) {
1100 if (X->
p[
i - 1] != 0) {
1105 for (j = Y->
n; j > 0; j--) {
1106 if (Y->
p[j - 1] != 0) {
1111 if (
i == 0 && j == 0) {
1122 if (X->
s > 0 && Y->
s < 0) {
1125 if (Y->
s > 0 && X->
s < 0) {
1129 for (;
i > 0;
i--) {
1130 if (X->
p[
i - 1] > Y->
p[
i - 1]) {
1133 if (X->
p[
i - 1] < Y->
p[
i - 1]) {
1151 Y.
s = (z < 0) ? -1 : 1;
1183 for (j = B->
n; j > 0; j--) {
1184 if (B->
p[j - 1] != 0) {
1197 o = B->
p; p = X->
p; c = 0;
1202 for (
i = 0;
i < j;
i++, o++, p++) {
1204 *p += c; c = (*p < c);
1205 *p +=
tmp; c += (*p <
tmp);
1214 *p += c; c = (*p < c);
i++; p++;
1247 for (
i = 0;
i <
n;
i++) {
1248 z = (l[
i] < c);
t = l[
i] - c;
1249 c = (
t <
r[
i]) + z; d[
i] =
t -
r[
i];
1267 for (
n = B->
n;
n > 0;
n--) {
1268 if (B->
p[
n - 1] != 0) {
1283 if (
A->n >
n &&
A != X) {
1284 memcpy(X->
p +
n,
A->p +
n, (
A->n -
n) *
ciL);
1287 memset(X->
p +
A->n, 0, (X->
n -
A->n) *
ciL);
1293 for (;
n < X->
n && X->
p[
n] == 0;
n++) {
1325 if (
A->s * B->
s * flip_B < 0) {
1332 X->
s =
cmp == 0 ? 1 : s;
1375 B.
s = (
b < 0) ? -1 : 1;
1393 B.
s = (
b < 0) ? -1 : 1;
1417 #if defined(__APPLE__) && defined(__arm__)
1422 __attribute__((noinline))
1432 #if defined(MULADDC_HUIT)
1433 for (;
i >= 8;
i -= 8) {
1439 for (;
i > 0;
i--) {
1445 for (;
i >= 16;
i -= 16) {
1459 for (;
i >= 8;
i -= 8) {
1469 for (;
i > 0;
i--) {
1477 *d += c; c = (*d < c); d++;
1489 int result_is_zero = 0;
1503 for (
i =
A->n;
i > 0;
i--) {
1504 if (
A->p[
i - 1] != 0) {
1512 for (j = B->
n; j > 0; j--) {
1513 if (B->
p[j - 1] != 0) {
1524 for (; j > 0; j--) {
1532 if (result_is_zero) {
1555 while (
n > 0 &&
A->p[
n - 1] == 0) {
1561 if (
b == 0 ||
n == 0) {
1592 #if defined(MBEDTLS_HAVE_UDBL)
1605 if (0 == d || u1 >= d) {
1613 #if defined(MBEDTLS_HAVE_UDBL)
1616 quotient = dividend / d;
1644 d0 = d & uint_halfword_mask;
1647 u0_lsw = u0 & uint_halfword_mask;
1655 while (q1 >= radix || (q1 * d0 > radix * r0 + u0_msw)) {
1664 rAX = (u1 * radix) + (u0_msw - q1 * d);
1668 while (q0 >= radix || (q0 * d0 > radix * r0 + u0_lsw)) {
1678 *
r = (rAX * radix + u0_lsw - q0 * d) >> s;
1681 quotient = q1 * radix + q0;
1714 T2.
n =
sizeof(TP2) /
sizeof(*TP2);
1754 for (
i =
n;
i >
t;
i--) {
1755 if (X.
p[
i] >= Y.
p[
t]) {
1762 T2.
p[0] = (
i < 2) ? 0 : X.
p[
i - 2];
1763 T2.
p[1] = (
i < 1) ? 0 : X.
p[
i - 1];
1771 T1.
p[0] = (
t < 1) ? 0 : Y.
p[
t - 1];
1824 B.
s = (
b < 0) ? -1 : 1;
1881 if (
b == 1 ||
A->n == 0) {
1894 for (
i =
A->n, y = 0;
i > 0;
i--) {
1896 y = (y <<
biH) | (x >>
biH);
1901 y = (y <<
biH) | (x >>
biH);
1910 if (
A->s < 0 && y != 0) {
1928 x += ((m0 + 2) & 4) << 1;
1930 for (
i =
biL;
i >= 8;
i /= 2) {
1931 x *= (2 - (m0 * x));
1968 memset(
T->p, 0,
T->n *
ciL);
1972 m = (B->
n <
n) ? B->
n :
n;
1979 u1 = (d[0] + u0 * B->
p[0]) * mm;
1984 *d++ = u0; d[
n + 1] = 0;
1993 memcpy(
A->p, d,
n *
ciL);
2019 U.
n = U.
s = (
int) z;
2044 for (
size_t i = 0;
i < T_size;
i++) {
2062 size_t window_bitsize;
2063 size_t i, j, nblimbs;
2065 size_t exponent_bits_in_window = 0;
2095 memset(
W, 0,
sizeof(
W));
2099 window_bitsize = (
i > 671) ? 6 : (
i > 239) ? 5 :
2100 (
i > 79) ? 4 : (
i > 23) ? 3 : 1;
2102 #if (MBEDTLS_MPI_WINDOW_SIZE < 6)
2108 const size_t w_table_used_size = (size_t) 1 << window_bitsize;
2142 const size_t x_index = 0;
2169 if (prec_RR ==
NULL || prec_RR->
p ==
NULL) {
2174 if (prec_RR !=
NULL) {
2205 if (window_bitsize > 1) {
2216 j = w_table_used_size / 2;
2221 for (
i = 0;
i < window_bitsize - 1;
i++) {
2228 for (
i = j + 1;
i < w_table_used_size;
i++) {
2254 ei = (
E->p[nblimbs] >>
bufsize) & 1;
2259 if (ei == 0 &&
state == 0) {
2263 if (ei == 0 &&
state == 1) {
2278 exponent_bits_in_window |= (ei << (window_bitsize - nbits));
2280 if (nbits == window_bitsize) {
2284 for (
i = 0;
i < window_bitsize;
i++) {
2294 exponent_bits_in_window));
2299 exponent_bits_in_window = 0;
2306 for (
i = 0;
i < nbits;
i++) {
2310 exponent_bits_in_window <<= 1;
2312 if ((exponent_bits_in_window & ((
size_t) 1 << window_bitsize)) != 0) {
2323 if (neg &&
E->n != 0 && (
E->p[0] & 1) != 0) {
2337 for (
i = w_table_used_size/2;
i < w_table_used_size;
i++) {
2347 if (prec_RR ==
NULL || prec_RR->
p ==
NULL) {
2473 int (*f_rng)(
void *,
unsigned char *,
size_t),
void *p_rng)
2477 const size_t overhead = (limbs *
ciL) - n_bytes;
2483 memset(X->
p, 0, overhead);
2484 memset((
unsigned char *) X->
p + limbs *
ciL, 0, (X->
n - limbs) *
ciL);
2500 int (*f_rng)(
void *,
unsigned char *,
size_t),
2524 int (*f_rng)(
void *,
unsigned char *,
size_t),
2529 unsigned lt_lower = 1, lt_upper = 0;
2531 size_t n_bytes = (n_bits + 7) / 8;
2558 count = (n_bytes > 4 ? 30 : 250);
2588 }
while (lt_lower != 0 || lt_upper == 0);
2632 while ((TU.
p[0] & 1) == 0) {
2635 if ((U1.
p[0] & 1) != 0 || (U2.
p[0] & 1) != 0) {
2644 while ((TV.
p[0] & 1) == 0) {
2647 if ((V1.
p[0] & 1) != 0 || (V2.
p[0] & 1) != 0) {
2686 #if defined(MBEDTLS_GENPRIME)
2690 3, 5, 7, 11, 13, 17, 19, 23,
2691 29, 31, 37, 41, 43, 47, 53, 59,
2692 61, 67, 71, 73, 79, 83, 89, 97,
2693 101, 103, 107, 109, 113, 127, 131, 137,
2694 139, 149, 151, 157, 163, 167, 173, 179,
2695 181, 191, 193, 197, 199, 211, 223, 227,
2696 229, 233, 239, 241, 251, 257, 263, 269,
2697 271, 277, 281, 283, 293, 307, 311, 313,
2698 317, 331, 337, 347, 349, 353, 359, 367,
2699 373, 379, 383, 389, 397, 401, 409, 419,
2700 421, 431, 433, 439, 443, 449, 457, 461,
2701 463, 467, 479, 487, 491, 499, 503, 509,
2702 521, 523, 541, 547, 557, 563, 569, 571,
2703 577, 587, 593, 599, 601, 607, 613, 617,
2704 619, 631, 641, 643, 647, 653, 659, 661,
2705 673, 677, 683, 691, 701, 709, 719, 727,
2706 733, 739, 743, 751, 757, 761, 769, 773,
2707 787, 797, 809, 811, 821, 823, 827, 829,
2708 839, 853, 857, 859, 863, 877, 881, 883,
2709 887, 907, 911, 919, 929, 937, 941, 947,
2710 953, 967, 971, 977, 983, 991, 997, -103
2728 if ((X->
p[0] & 1) == 0) {
2752 int (*f_rng)(
void *,
unsigned char *,
size_t),
2775 for (
i = 0;
i < rounds;
i++) {
2844 int (*f_rng)(
void *,
unsigned char *,
size_t),
2876 #if !defined(MBEDTLS_DEPRECATED_REMOVED)
2881 int (*f_rng)(
void *,
unsigned char *,
size_t),
2904 int (*f_rng)(
void *,
unsigned char *,
size_t),
2907 #ifdef MBEDTLS_HAVE_INT64
2909 #define CEIL_MAXUINT_DIV_SQRT2 0xb504f333f9de6485ULL
2912 #define CEIL_MAXUINT_DIV_SQRT2 0xb504f334U
2935 rounds = ((nbits >= 1300) ? 2 : (nbits >= 850) ? 3 :
2936 (nbits >= 650) ? 4 : (nbits >= 350) ? 8 :
2937 (nbits >= 250) ? 12 : (nbits >= 150) ? 18 : 27);
2943 rounds = ((nbits >= 1450) ? 4 : (nbits >= 1150) ? 5 :
2944 (nbits >= 1000) ? 6 : (nbits >= 850) ? 7 :
2945 (nbits >= 750) ? 8 : (nbits >= 500) ? 13 :
2946 (nbits >= 250) ? 28 : (nbits >= 150) ? 40 : 51);
2980 }
else if (
r == 1) {
3026 #if defined(MBEDTLS_SELF_TEST)
3028 #define GCD_PAIR_COUNT 3
3030 static const int gcd_pairs[GCD_PAIR_COUNT][3] =
3034 { 768454923, 542167814, 1 }
3040 int mbedtls_mpi_self_test(
int verbose)
3049 "EFE021C2645FD1DC586E69184AF4A31E" \
3050 "D5F53E93B5F123FA41680867BA110131" \
3051 "944FE7952E2517337780CB0DB80E61AA" \
3052 "E7C8DDC6C5C6AADEB34EB38A2F40D5E6"));
3055 "B2E7EFD37075B9F03FF989C7C5051C20" \
3056 "34D2A323810251127E7BF8625A4F49A5" \
3057 "F3E27F4DA8BD59C47D6DAABA4C8127BD" \
3058 "5B5C25763222FEFCCFC38B832366C29E"));
3061 "0066A198186C18C10B2F5ED9B522752A" \
3062 "9830B69916E535C8F047518A889A43A5" \
3063 "94B6BED27A168D31D4A52F88925AA8F5"));
3068 "602AB7ECA597A3D6B56FF9829A5E8B85" \
3069 "9E857EA95A03512E2BAE7391688D264A" \
3070 "A5663B0341DB9CCFD2C4C5F421FEC814" \
3071 "8001B72E848A38CAE1C65F78E56ABDEF" \
3072 "E12D3C039B8A02D6BE593F0BBBDA56F1" \
3073 "ECF677152EF804370C1A305CAF3B5BF1" \
3074 "30879B56C61DE584A0F53A2447A51E"));
3096 "256567336059E52CAE22925474705F39A94"));
3099 "6613F26162223DF488E9CD48CC132C7A" \
3100 "0AC93C701B001B092E4E5B9F73BCD27B" \
3101 "9EE50D0657C77F374E903CDFA4C642"));
3124 "36E139AEA55215609D2816998ED020BB" \
3125 "BD96C37890F65171D948E9BC7CBAA4D9" \
3126 "325D24D6A3C12710F10A09FA08AB87"));
3148 "003A0AAEDD7E784FC07D8F9EC6E3BFD5" \
3149 "C3DBA76456363A10869622EAC2DD84EC" \
3150 "C5B8A74DAC4D09E03B5E0BE779F2DF61"));
3173 for (
i = 0;
i < GCD_PAIR_COUNT;
i++) {
3195 if (ret != 0 &&
verbose != 0) {
3196 mbedtls_printf(
"Unexpected error, return code = %08X\n", (
unsigned int) ret);
static int mpi_select(mbedtls_mpi *R, const mbedtls_mpi *T, size_t T_size, size_t idx)
Select an MPI from a table without leaking the index.
static int mpi_get_digit(mbedtls_mpi_uint *d, int radix, char c)
static int add_sub_mpi(mbedtls_mpi *X, const mbedtls_mpi *A, const mbedtls_mpi *B, int flip_B)
static int mpi_miller_rabin(const mbedtls_mpi *X, size_t rounds, int(*f_rng)(void *, unsigned char *, size_t), void *p_rng)
static int mbedtls_mpi_resize_clear(mbedtls_mpi *X, size_t limbs)
#define MPI_VALIDATE(cond)
static mbedtls_mpi_uint mpi_sub_hlp(size_t n, mbedtls_mpi_uint *d, const mbedtls_mpi_uint *l, const mbedtls_mpi_uint *r)
Helper for mbedtls_mpi subtraction.
static const int small_prime[]
#define CEIL_MAXUINT_DIV_SQRT2
static void mpi_mul_hlp(size_t i, const mbedtls_mpi_uint *s, mbedtls_mpi_uint *d, mbedtls_mpi_uint b)
Helper for mbedtls_mpi multiplication.
static void mbedtls_mpi_zeroize(mbedtls_mpi_uint *v, size_t n)
static mbedtls_mpi_uint mbedtls_int_div_int(mbedtls_mpi_uint u1, mbedtls_mpi_uint u0, mbedtls_mpi_uint d, mbedtls_mpi_uint *r)
static int mpi_write_hlp(mbedtls_mpi *X, int radix, char **p, const size_t buflen)
static size_t mbedtls_clz(const mbedtls_mpi_uint x)
static void mpi_bigendian_to_host(mbedtls_mpi_uint *const p, size_t limbs)
static int mpi_check_small_factors(const mbedtls_mpi *X)
static void mpi_montg_init(mbedtls_mpi_uint *mm, const mbedtls_mpi *N)
static mbedtls_mpi_uint mpi_uint_bigendian_to_host_c(mbedtls_mpi_uint x)
static void mpi_montmul(mbedtls_mpi *A, const mbedtls_mpi *B, const mbedtls_mpi *N, mbedtls_mpi_uint mm, const mbedtls_mpi *T)
Montgomery multiplication: A = A * B * R^-1 mod N (HAC 14.36)
static mbedtls_mpi_uint mpi_sint_abs(mbedtls_mpi_sint z)
static mbedtls_mpi_uint mpi_uint_bigendian_to_host(mbedtls_mpi_uint x)
#define CHARS_TO_LIMBS(i)
#define MPI_VALIDATE_RET(cond)
static int mpi_fill_random_internal(mbedtls_mpi *X, size_t n_bytes, int(*f_rng)(void *, unsigned char *, size_t), void *p_rng)
static void mpi_montred(mbedtls_mpi *A, const mbedtls_mpi *N, mbedtls_mpi_uint mm, const mbedtls_mpi *T)
Multi-precision integer library.
#define MBEDTLS_ERR_MPI_INVALID_CHARACTER
There is an invalid character in the digit string.
#define MBEDTLS_MPI_MAX_BITS
Maximum number of bits for usable MPIs.
int mbedtls_mpi_read_string(mbedtls_mpi *X, int radix, const char *s)
Import an MPI from an ASCII string.
int mbedtls_mpi_sub_mpi(mbedtls_mpi *X, const mbedtls_mpi *A, const mbedtls_mpi *B)
Perform a signed subtraction of MPIs: X = A - B.
int mbedtls_mpi_sub_int(mbedtls_mpi *X, const mbedtls_mpi *A, mbedtls_mpi_sint b)
Perform a signed subtraction of an MPI and an integer: X = A - b.
int mbedtls_mpi_add_int(mbedtls_mpi *X, const mbedtls_mpi *A, mbedtls_mpi_sint b)
Perform a signed addition of an MPI and an integer: X = A + b.
int mbedtls_mpi_read_binary_le(mbedtls_mpi *X, const unsigned char *buf, size_t buflen)
Import X from unsigned binary data, little endian.
int mbedtls_mpi_grow(mbedtls_mpi *X, size_t nblimbs)
Enlarge an MPI to the specified number of limbs.
#define MBEDTLS_ERR_MPI_NOT_ACCEPTABLE
The input arguments are not acceptable.
int mbedtls_mpi_exp_mod(mbedtls_mpi *X, const mbedtls_mpi *A, const mbedtls_mpi *E, const mbedtls_mpi *N, mbedtls_mpi *prec_RR)
Perform a sliding-window exponentiation: X = A^E mod N.
int mbedtls_mpi_is_prime_ext(const mbedtls_mpi *X, int rounds, int(*f_rng)(void *, unsigned char *, size_t), void *p_rng)
Miller-Rabin primality test.
int32_t mbedtls_mpi_sint
The signed type corresponding to mbedtls_mpi_uint.
int mbedtls_mpi_copy(mbedtls_mpi *X, const mbedtls_mpi *Y)
Make a copy of an MPI.
#define MBEDTLS_ERR_MPI_BAD_INPUT_DATA
Bad input parameters to function.
int mbedtls_mpi_set_bit(mbedtls_mpi *X, size_t pos, unsigned char val)
Modify a specific bit in an MPI.
int mbedtls_mpi_mod_int(mbedtls_mpi_uint *r, const mbedtls_mpi *A, mbedtls_mpi_sint b)
Perform a modular reduction with respect to an integer.
@ MBEDTLS_MPI_GEN_PRIME_FLAG_DH
(X-1)/2 is prime too
@ MBEDTLS_MPI_GEN_PRIME_FLAG_LOW_ERR
lower error rate from 2-80 to 2-128
#define MBEDTLS_MPI_MAX_LIMBS
size_t mbedtls_mpi_size(const mbedtls_mpi *X)
Return the total size of an MPI value in bytes.
int mbedtls_mpi_write_binary_le(const mbedtls_mpi *X, unsigned char *buf, size_t buflen)
Export X into unsigned binary data, little endian.
#define MBEDTLS_ERR_MPI_FILE_IO_ERROR
An error occurred while reading from or writing to a file.
int mbedtls_mpi_add_abs(mbedtls_mpi *X, const mbedtls_mpi *A, const mbedtls_mpi *B)
Perform an unsigned addition of MPIs: X = |A| + |B|.
int mbedtls_mpi_is_prime(const mbedtls_mpi *X, int(*f_rng)(void *, unsigned char *, size_t), void *p_rng)
Perform a Miller-Rabin primality test with error probability of 2-80.
int mbedtls_mpi_div_mpi(mbedtls_mpi *Q, mbedtls_mpi *R, const mbedtls_mpi *A, const mbedtls_mpi *B)
Perform a division with remainder of two MPIs: A = Q * B + R.
int mbedtls_mpi_add_mpi(mbedtls_mpi *X, const mbedtls_mpi *A, const mbedtls_mpi *B)
Perform a signed addition of MPIs: X = A + B.
void mbedtls_mpi_swap(mbedtls_mpi *X, mbedtls_mpi *Y)
Swap the contents of two MPIs.
int mbedtls_mpi_safe_cond_assign(mbedtls_mpi *X, const mbedtls_mpi *Y, unsigned char assign)
Perform a safe conditional copy of MPI which doesn't reveal whether the condition was true or not.
int mbedtls_mpi_lset(mbedtls_mpi *X, mbedtls_mpi_sint z)
Store integer value in MPI.
size_t mbedtls_mpi_bitlen(const mbedtls_mpi *X)
Return the number of bits up to and including the most significant bit of value 1.
int mbedtls_mpi_read_binary(mbedtls_mpi *X, const unsigned char *buf, size_t buflen)
Import an MPI from unsigned big endian binary data.
int mbedtls_mpi_cmp_mpi(const mbedtls_mpi *X, const mbedtls_mpi *Y)
Compare two MPIs.
int mbedtls_mpi_mod_mpi(mbedtls_mpi *R, const mbedtls_mpi *A, const mbedtls_mpi *B)
Perform a modular reduction.
#define MBEDTLS_MPI_WINDOW_SIZE
Maximum window size used.
#define MBEDTLS_ERR_MPI_BUFFER_TOO_SMALL
The buffer is too small to write to.
int mbedtls_mpi_div_int(mbedtls_mpi *Q, mbedtls_mpi *R, const mbedtls_mpi *A, mbedtls_mpi_sint b)
Perform a division with remainder of an MPI by an integer: A = Q * b + R.
int mbedtls_mpi_fill_random(mbedtls_mpi *X, size_t size, int(*f_rng)(void *, unsigned char *, size_t), void *p_rng)
Fill an MPI with a number of random bytes.
int mbedtls_mpi_cmp_abs(const mbedtls_mpi *X, const mbedtls_mpi *Y)
Compare the absolute values of two MPIs.
int mbedtls_mpi_gen_prime(mbedtls_mpi *X, size_t nbits, int flags, int(*f_rng)(void *, unsigned char *, size_t), void *p_rng)
Generate a prime number.
int mbedtls_mpi_shift_l(mbedtls_mpi *X, size_t count)
Perform a left-shift on an MPI: X <<= count.
#define MBEDTLS_MPI_RW_BUFFER_SIZE
#define MBEDTLS_ERR_MPI_DIVISION_BY_ZERO
The input argument for division is zero, which is not allowed.
void mbedtls_mpi_init(mbedtls_mpi *X)
Initialize an MPI context.
#define MBEDTLS_ERR_MPI_ALLOC_FAILED
Memory allocation failed.
size_t mbedtls_mpi_lsb(const mbedtls_mpi *X)
Return the number of bits of value 0 before the least significant bit of value 1.
int mbedtls_mpi_mul_mpi(mbedtls_mpi *X, const mbedtls_mpi *A, const mbedtls_mpi *B)
Perform a multiplication of two MPIs: X = A * B.
uint32_t mbedtls_mpi_uint
The type of machine digits in a bignum, called _limbs_.
#define MBEDTLS_MPI_CHK(f)
int mbedtls_mpi_write_string(const mbedtls_mpi *X, int radix, char *buf, size_t buflen, size_t *olen)
Export an MPI to an ASCII string.
#define MBEDTLS_ERR_MPI_NEGATIVE_VALUE
The input arguments are negative or result in illegal output.
int mbedtls_mpi_shrink(mbedtls_mpi *X, size_t nblimbs)
This function resizes an MPI downwards, keeping at least the specified number of limbs.
int mbedtls_mpi_inv_mod(mbedtls_mpi *X, const mbedtls_mpi *A, const mbedtls_mpi *N)
Compute the modular inverse: X = A^-1 mod N.
int mbedtls_mpi_get_bit(const mbedtls_mpi *X, size_t pos)
Get a specific bit from an MPI.
void mbedtls_mpi_free(mbedtls_mpi *X)
This function frees the components of an MPI context.
int mbedtls_mpi_mul_int(mbedtls_mpi *X, const mbedtls_mpi *A, mbedtls_mpi_uint b)
Perform a multiplication of an MPI with an unsigned integer: X = A * b.
int mbedtls_mpi_lt_mpi_ct(const mbedtls_mpi *X, const mbedtls_mpi *Y, unsigned *ret)
Check if an MPI is less than the other in constant time.
int mbedtls_mpi_write_binary(const mbedtls_mpi *X, unsigned char *buf, size_t buflen)
Export X into unsigned binary data, big endian.
int mbedtls_mpi_cmp_int(const mbedtls_mpi *X, mbedtls_mpi_sint z)
Compare an MPI with an integer.
int mbedtls_mpi_sub_abs(mbedtls_mpi *X, const mbedtls_mpi *A, const mbedtls_mpi *B)
Perform an unsigned subtraction of MPIs: X = |A| - |B|.
int mbedtls_mpi_random(mbedtls_mpi *X, mbedtls_mpi_sint min, const mbedtls_mpi *N, int(*f_rng)(void *, unsigned char *, size_t), void *p_rng)
Generate a random number uniformly in a range.
int mbedtls_mpi_shift_r(mbedtls_mpi *X, size_t count)
Perform a right-shift on an MPI: X >>= count.
int mbedtls_mpi_gcd(mbedtls_mpi *G, const mbedtls_mpi *A, const mbedtls_mpi *B)
Compute the greatest common divisor: G = gcd(A, B)
Multi-precision integer library.
static void cleanup(void)
#define Z
printf format modifier for size_t
unsigned int
A callback function used to compare two keys in a database.
for(len=0;yy_str[len];++len)
const struct ncbi::grid::netcache::search::fields::SIZE size
#define mbedtls_ct_size_bool_eq
#define mbedtls_mpi_write_file
#define mbedtls_ct_mpi_uint_cond_assign
#define mbedtls_mpi_read_file
double r(size_t dimension_, const Int4 *score_, const double *prob_, double theta_)
Error to string translation.
#define MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED
This is a bug in the library.
size_t n
Total number of limbs in p.
int s
Sign: -1 if the mpi is negative, 1 otherwise.
mbedtls_mpi_uint * p
Pointer to limbs.