quickjs-tart

quickjs-based runtime for wallet-core logic
Log | Files | Refs | README | LICENSE

bignum.c (66561B)


      1 /*
      2  *  Multi-precision integer library
      3  *
      4  *  Copyright The Mbed TLS Contributors
      5  *  SPDX-License-Identifier: Apache-2.0 OR GPL-2.0-or-later
      6  */
      7 
      8 /*
      9  *  The following sources were referenced in the design of this Multi-precision
     10  *  Integer library:
     11  *
     12  *  [1] Handbook of Applied Cryptography - 1997
     13  *      Menezes, van Oorschot and Vanstone
     14  *
     15  *  [2] Multi-Precision Math
     16  *      Tom St Denis
     17  *      https://github.com/libtom/libtommath/blob/develop/tommath.pdf
     18  *
     19  *  [3] GNU Multi-Precision Arithmetic Library
     20  *      https://gmplib.org/manual/index.html
     21  *
     22  */
     23 
     24 #include "common.h"
     25 
     26 #if defined(MBEDTLS_BIGNUM_C)
     27 
     28 #include "mbedtls/bignum.h"
     29 #include "bignum_core.h"
     30 #include "bignum_internal.h"
     31 #include "bn_mul.h"
     32 #include "mbedtls/platform_util.h"
     33 #include "mbedtls/error.h"
     34 #include "constant_time_internal.h"
     35 
     36 #include <limits.h>
     37 #include <string.h>
     38 
     39 #include "mbedtls/platform.h"
     40 
     41 
     42 
     43 /*
     44  * Conditionally select an MPI sign in constant time.
     45  * (MPI sign is the field s in mbedtls_mpi. It is unsigned short and only 1 and -1 are valid
     46  * values.)
     47  */
     48 static inline signed short mbedtls_ct_mpi_sign_if(mbedtls_ct_condition_t cond,
     49                                                   signed short sign1, signed short sign2)
     50 {
     51     return (signed short) mbedtls_ct_uint_if(cond, sign1 + 1, sign2 + 1) - 1;
     52 }
     53 
     54 /*
     55  * Compare signed values in constant time
     56  */
     57 int mbedtls_mpi_lt_mpi_ct(const mbedtls_mpi *X,
     58                           const mbedtls_mpi *Y,
     59                           unsigned *ret)
     60 {
     61     mbedtls_ct_condition_t different_sign, X_is_negative, Y_is_negative, result;
     62 
     63     if (X->n != Y->n) {
     64         return MBEDTLS_ERR_MPI_BAD_INPUT_DATA;
     65     }
     66 
     67     /*
     68      * Set N_is_negative to MBEDTLS_CT_FALSE if N >= 0, MBEDTLS_CT_TRUE if N < 0.
     69      * We know that N->s == 1 if N >= 0 and N->s == -1 if N < 0.
     70      */
     71     X_is_negative = mbedtls_ct_bool((X->s & 2) >> 1);
     72     Y_is_negative = mbedtls_ct_bool((Y->s & 2) >> 1);
     73 
     74     /*
     75      * If the signs are different, then the positive operand is the bigger.
     76      * That is if X is negative (X_is_negative == 1), then X < Y is true and it
     77      * is false if X is positive (X_is_negative == 0).
     78      */
     79     different_sign = mbedtls_ct_bool_ne(X_is_negative, Y_is_negative); // true if different sign
     80     result = mbedtls_ct_bool_and(different_sign, X_is_negative);
     81 
     82     /*
     83      * Assuming signs are the same, compare X and Y. We switch the comparison
     84      * order if they are negative so that we get the right result, regardles of
     85      * sign.
     86      */
     87 
     88     /* This array is used to conditionally swap the pointers in const time */
     89     void * const p[2] = { X->p, Y->p };
     90     size_t i = mbedtls_ct_size_if_else_0(X_is_negative, 1);
     91     mbedtls_ct_condition_t lt = mbedtls_mpi_core_lt_ct(p[i], p[i ^ 1], X->n);
     92 
     93     /*
     94      * Store in result iff the signs are the same (i.e., iff different_sign == false). If
     95      * the signs differ, result has already been set, so we don't change it.
     96      */
     97     result = mbedtls_ct_bool_or(result,
     98                                 mbedtls_ct_bool_and(mbedtls_ct_bool_not(different_sign), lt));
     99 
    100     *ret = mbedtls_ct_uint_if_else_0(result, 1);
    101 
    102     return 0;
    103 }
    104 
    105 /*
    106  * Conditionally assign X = Y, without leaking information
    107  * about whether the assignment was made or not.
    108  * (Leaking information about the respective sizes of X and Y is ok however.)
    109  */
    110 #if defined(_MSC_VER) && defined(MBEDTLS_PLATFORM_IS_WINDOWS_ON_ARM64) && \
    111     (_MSC_FULL_VER < 193131103)
    112 /*
    113  * MSVC miscompiles this function if it's inlined prior to Visual Studio 2022 version 17.1. See:
    114  * https://developercommunity.visualstudio.com/t/c-compiler-miscompiles-part-of-mbedtls-library-on/1646989
    115  */
    116 __declspec(noinline)
    117 #endif
    118 int mbedtls_mpi_safe_cond_assign(mbedtls_mpi *X,
    119                                  const mbedtls_mpi *Y,
    120                                  unsigned char assign)
    121 {
    122     int ret = 0;
    123 
    124     MBEDTLS_MPI_CHK(mbedtls_mpi_grow(X, Y->n));
    125 
    126     {
    127         mbedtls_ct_condition_t do_assign = mbedtls_ct_bool(assign);
    128 
    129         X->s = mbedtls_ct_mpi_sign_if(do_assign, Y->s, X->s);
    130 
    131         mbedtls_mpi_core_cond_assign(X->p, Y->p, Y->n, do_assign);
    132 
    133         mbedtls_ct_condition_t do_not_assign = mbedtls_ct_bool_not(do_assign);
    134         for (size_t i = Y->n; i < X->n; i++) {
    135             X->p[i] = mbedtls_ct_mpi_uint_if_else_0(do_not_assign, X->p[i]);
    136         }
    137     }
    138 
    139 cleanup:
    140     return ret;
    141 }
    142 
    143 /*
    144  * Conditionally swap X and Y, without leaking information
    145  * about whether the swap was made or not.
    146  * Here it is not ok to simply swap the pointers, which would lead to
    147  * different memory access patterns when X and Y are used afterwards.
    148  */
    149 int mbedtls_mpi_safe_cond_swap(mbedtls_mpi *X,
    150                                mbedtls_mpi *Y,
    151                                unsigned char swap)
    152 {
    153     int ret = 0;
    154     int s;
    155 
    156     if (X == Y) {
    157         return 0;
    158     }
    159 
    160     mbedtls_ct_condition_t do_swap = mbedtls_ct_bool(swap);
    161 
    162     MBEDTLS_MPI_CHK(mbedtls_mpi_grow(X, Y->n));
    163     MBEDTLS_MPI_CHK(mbedtls_mpi_grow(Y, X->n));
    164 
    165     s = X->s;
    166     X->s = mbedtls_ct_mpi_sign_if(do_swap, Y->s, X->s);
    167     Y->s = mbedtls_ct_mpi_sign_if(do_swap, s, Y->s);
    168 
    169     mbedtls_mpi_core_cond_swap(X->p, Y->p, X->n, do_swap);
    170 
    171 cleanup:
    172     return ret;
    173 }
    174 
    175 /* Implementation that should never be optimized out by the compiler */
    176 #define mbedtls_mpi_zeroize_and_free(v, n) mbedtls_zeroize_and_free(v, ciL * (n))
    177 
    178 /*
    179  * Initialize one MPI
    180  */
    181 void mbedtls_mpi_init(mbedtls_mpi *X)
    182 {
    183     X->s = 1;
    184     X->n = 0;
    185     X->p = NULL;
    186 }
    187 
    188 /*
    189  * Unallocate one MPI
    190  */
    191 void mbedtls_mpi_free(mbedtls_mpi *X)
    192 {
    193     if (X == NULL) {
    194         return;
    195     }
    196 
    197     if (X->p != NULL) {
    198         mbedtls_mpi_zeroize_and_free(X->p, X->n);
    199     }
    200 
    201     X->s = 1;
    202     X->n = 0;
    203     X->p = NULL;
    204 }
    205 
    206 /*
    207  * Enlarge to the specified number of limbs
    208  */
    209 int mbedtls_mpi_grow(mbedtls_mpi *X, size_t nblimbs)
    210 {
    211     mbedtls_mpi_uint *p;
    212 
    213     if (nblimbs > MBEDTLS_MPI_MAX_LIMBS) {
    214         return MBEDTLS_ERR_MPI_ALLOC_FAILED;
    215     }
    216 
    217     if (X->n < nblimbs) {
    218         if ((p = (mbedtls_mpi_uint *) mbedtls_calloc(nblimbs, ciL)) == NULL) {
    219             return MBEDTLS_ERR_MPI_ALLOC_FAILED;
    220         }
    221 
    222         if (X->p != NULL) {
    223             memcpy(p, X->p, X->n * ciL);
    224             mbedtls_mpi_zeroize_and_free(X->p, X->n);
    225         }
    226 
    227         /* nblimbs fits in n because we ensure that MBEDTLS_MPI_MAX_LIMBS
    228          * fits, and we've checked that nblimbs <= MBEDTLS_MPI_MAX_LIMBS. */
    229         X->n = (unsigned short) nblimbs;
    230         X->p = p;
    231     }
    232 
    233     return 0;
    234 }
    235 
    236 /*
    237  * Resize down as much as possible,
    238  * while keeping at least the specified number of limbs
    239  */
    240 int mbedtls_mpi_shrink(mbedtls_mpi *X, size_t nblimbs)
    241 {
    242     mbedtls_mpi_uint *p;
    243     size_t i;
    244 
    245     if (nblimbs > MBEDTLS_MPI_MAX_LIMBS) {
    246         return MBEDTLS_ERR_MPI_ALLOC_FAILED;
    247     }
    248 
    249     /* Actually resize up if there are currently fewer than nblimbs limbs. */
    250     if (X->n <= nblimbs) {
    251         return mbedtls_mpi_grow(X, nblimbs);
    252     }
    253     /* After this point, then X->n > nblimbs and in particular X->n > 0. */
    254 
    255     for (i = X->n - 1; i > 0; i--) {
    256         if (X->p[i] != 0) {
    257             break;
    258         }
    259     }
    260     i++;
    261 
    262     if (i < nblimbs) {
    263         i = nblimbs;
    264     }
    265 
    266     if ((p = (mbedtls_mpi_uint *) mbedtls_calloc(i, ciL)) == NULL) {
    267         return MBEDTLS_ERR_MPI_ALLOC_FAILED;
    268     }
    269 
    270     if (X->p != NULL) {
    271         memcpy(p, X->p, i * ciL);
    272         mbedtls_mpi_zeroize_and_free(X->p, X->n);
    273     }
    274 
    275     /* i fits in n because we ensure that MBEDTLS_MPI_MAX_LIMBS
    276      * fits, and we've checked that i <= nblimbs <= MBEDTLS_MPI_MAX_LIMBS. */
    277     X->n = (unsigned short) i;
    278     X->p = p;
    279 
    280     return 0;
    281 }
    282 
    283 /* Resize X to have exactly n limbs and set it to 0. */
    284 static int mbedtls_mpi_resize_clear(mbedtls_mpi *X, size_t limbs)
    285 {
    286     if (limbs == 0) {
    287         mbedtls_mpi_free(X);
    288         return 0;
    289     } else if (X->n == limbs) {
    290         memset(X->p, 0, limbs * ciL);
    291         X->s = 1;
    292         return 0;
    293     } else {
    294         mbedtls_mpi_free(X);
    295         return mbedtls_mpi_grow(X, limbs);
    296     }
    297 }
    298 
    299 /*
    300  * Copy the contents of Y into X.
    301  *
    302  * This function is not constant-time. Leading zeros in Y may be removed.
    303  *
    304  * Ensure that X does not shrink. This is not guaranteed by the public API,
    305  * but some code in the bignum module might still rely on this property.
    306  */
    307 int mbedtls_mpi_copy(mbedtls_mpi *X, const mbedtls_mpi *Y)
    308 {
    309     int ret = 0;
    310     size_t i;
    311 
    312     if (X == Y) {
    313         return 0;
    314     }
    315 
    316     if (Y->n == 0) {
    317         if (X->n != 0) {
    318             X->s = 1;
    319             memset(X->p, 0, X->n * ciL);
    320         }
    321         return 0;
    322     }
    323 
    324     for (i = Y->n - 1; i > 0; i--) {
    325         if (Y->p[i] != 0) {
    326             break;
    327         }
    328     }
    329     i++;
    330 
    331     X->s = Y->s;
    332 
    333     if (X->n < i) {
    334         MBEDTLS_MPI_CHK(mbedtls_mpi_grow(X, i));
    335     } else {
    336         memset(X->p + i, 0, (X->n - i) * ciL);
    337     }
    338 
    339     memcpy(X->p, Y->p, i * ciL);
    340 
    341 cleanup:
    342 
    343     return ret;
    344 }
    345 
    346 /*
    347  * Swap the contents of X and Y
    348  */
    349 void mbedtls_mpi_swap(mbedtls_mpi *X, mbedtls_mpi *Y)
    350 {
    351     mbedtls_mpi T;
    352 
    353     memcpy(&T,  X, sizeof(mbedtls_mpi));
    354     memcpy(X,  Y, sizeof(mbedtls_mpi));
    355     memcpy(Y, &T, sizeof(mbedtls_mpi));
    356 }
    357 
    358 static inline mbedtls_mpi_uint mpi_sint_abs(mbedtls_mpi_sint z)
    359 {
    360     if (z >= 0) {
    361         return z;
    362     }
    363     /* Take care to handle the most negative value (-2^(biL-1)) correctly.
    364      * A naive -z would have undefined behavior.
    365      * Write this in a way that makes popular compilers happy (GCC, Clang,
    366      * MSVC). */
    367     return (mbedtls_mpi_uint) 0 - (mbedtls_mpi_uint) z;
    368 }
    369 
    370 /* Convert x to a sign, i.e. to 1, if x is positive, or -1, if x is negative.
    371  * This looks awkward but generates smaller code than (x < 0 ? -1 : 1) */
    372 #define TO_SIGN(x) ((mbedtls_mpi_sint) (((mbedtls_mpi_uint) x) >> (biL - 1)) * -2 + 1)
    373 
    374 /*
    375  * Set value from integer
    376  */
    377 int mbedtls_mpi_lset(mbedtls_mpi *X, mbedtls_mpi_sint z)
    378 {
    379     int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
    380 
    381     MBEDTLS_MPI_CHK(mbedtls_mpi_grow(X, 1));
    382     memset(X->p, 0, X->n * ciL);
    383 
    384     X->p[0] = mpi_sint_abs(z);
    385     X->s    = TO_SIGN(z);
    386 
    387 cleanup:
    388 
    389     return ret;
    390 }
    391 
    392 /*
    393  * Get a specific bit
    394  */
    395 int mbedtls_mpi_get_bit(const mbedtls_mpi *X, size_t pos)
    396 {
    397     if (X->n * biL <= pos) {
    398         return 0;
    399     }
    400 
    401     return (X->p[pos / biL] >> (pos % biL)) & 0x01;
    402 }
    403 
    404 /*
    405  * Set a bit to a specific value of 0 or 1
    406  */
    407 int mbedtls_mpi_set_bit(mbedtls_mpi *X, size_t pos, unsigned char val)
    408 {
    409     int ret = 0;
    410     size_t off = pos / biL;
    411     size_t idx = pos % biL;
    412 
    413     if (val != 0 && val != 1) {
    414         return MBEDTLS_ERR_MPI_BAD_INPUT_DATA;
    415     }
    416 
    417     if (X->n * biL <= pos) {
    418         if (val == 0) {
    419             return 0;
    420         }
    421 
    422         MBEDTLS_MPI_CHK(mbedtls_mpi_grow(X, off + 1));
    423     }
    424 
    425     X->p[off] &= ~((mbedtls_mpi_uint) 0x01 << idx);
    426     X->p[off] |= (mbedtls_mpi_uint) val << idx;
    427 
    428 cleanup:
    429 
    430     return ret;
    431 }
    432 
    433 /*
    434  * Return the number of less significant zero-bits
    435  */
    436 size_t mbedtls_mpi_lsb(const mbedtls_mpi *X)
    437 {
    438     size_t i;
    439 
    440 #if defined(__has_builtin)
    441 #if (MBEDTLS_MPI_UINT_MAX == UINT_MAX) && __has_builtin(__builtin_ctz)
    442     #define mbedtls_mpi_uint_ctz __builtin_ctz
    443 #elif (MBEDTLS_MPI_UINT_MAX == ULONG_MAX) && __has_builtin(__builtin_ctzl)
    444     #define mbedtls_mpi_uint_ctz __builtin_ctzl
    445 #elif (MBEDTLS_MPI_UINT_MAX == ULLONG_MAX) && __has_builtin(__builtin_ctzll)
    446     #define mbedtls_mpi_uint_ctz __builtin_ctzll
    447 #endif
    448 #endif
    449 
    450 #if defined(mbedtls_mpi_uint_ctz)
    451     for (i = 0; i < X->n; i++) {
    452         if (X->p[i] != 0) {
    453             return i * biL + mbedtls_mpi_uint_ctz(X->p[i]);
    454         }
    455     }
    456 #else
    457     size_t count = 0;
    458     for (i = 0; i < X->n; i++) {
    459         for (size_t j = 0; j < biL; j++, count++) {
    460             if (((X->p[i] >> j) & 1) != 0) {
    461                 return count;
    462             }
    463         }
    464     }
    465 #endif
    466 
    467     return 0;
    468 }
    469 
    470 /*
    471  * Return the number of bits
    472  */
    473 size_t mbedtls_mpi_bitlen(const mbedtls_mpi *X)
    474 {
    475     return mbedtls_mpi_core_bitlen(X->p, X->n);
    476 }
    477 
    478 /*
    479  * Return the total size in bytes
    480  */
    481 size_t mbedtls_mpi_size(const mbedtls_mpi *X)
    482 {
    483     return (mbedtls_mpi_bitlen(X) + 7) >> 3;
    484 }
    485 
    486 /*
    487  * Convert an ASCII character to digit value
    488  */
    489 static int mpi_get_digit(mbedtls_mpi_uint *d, int radix, char c)
    490 {
    491     *d = 255;
    492 
    493     if (c >= 0x30 && c <= 0x39) {
    494         *d = c - 0x30;
    495     }
    496     if (c >= 0x41 && c <= 0x46) {
    497         *d = c - 0x37;
    498     }
    499     if (c >= 0x61 && c <= 0x66) {
    500         *d = c - 0x57;
    501     }
    502 
    503     if (*d >= (mbedtls_mpi_uint) radix) {
    504         return MBEDTLS_ERR_MPI_INVALID_CHARACTER;
    505     }
    506 
    507     return 0;
    508 }
    509 
    510 /*
    511  * Import from an ASCII string
    512  */
    513 int mbedtls_mpi_read_string(mbedtls_mpi *X, int radix, const char *s)
    514 {
    515     int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
    516     size_t i, j, slen, n;
    517     int sign = 1;
    518     mbedtls_mpi_uint d;
    519     mbedtls_mpi T;
    520 
    521     if (radix < 2 || radix > 16) {
    522         return MBEDTLS_ERR_MPI_BAD_INPUT_DATA;
    523     }
    524 
    525     mbedtls_mpi_init(&T);
    526 
    527     if (s[0] == 0) {
    528         mbedtls_mpi_free(X);
    529         return 0;
    530     }
    531 
    532     if (s[0] == '-') {
    533         ++s;
    534         sign = -1;
    535     }
    536 
    537     slen = strlen(s);
    538 
    539     if (radix == 16) {
    540         if (slen > SIZE_MAX >> 2) {
    541             return MBEDTLS_ERR_MPI_BAD_INPUT_DATA;
    542         }
    543 
    544         n = BITS_TO_LIMBS(slen << 2);
    545 
    546         MBEDTLS_MPI_CHK(mbedtls_mpi_grow(X, n));
    547         MBEDTLS_MPI_CHK(mbedtls_mpi_lset(X, 0));
    548 
    549         for (i = slen, j = 0; i > 0; i--, j++) {
    550             MBEDTLS_MPI_CHK(mpi_get_digit(&d, radix, s[i - 1]));
    551             X->p[j / (2 * ciL)] |= d << ((j % (2 * ciL)) << 2);
    552         }
    553     } else {
    554         MBEDTLS_MPI_CHK(mbedtls_mpi_lset(X, 0));
    555 
    556         for (i = 0; i < slen; i++) {
    557             MBEDTLS_MPI_CHK(mpi_get_digit(&d, radix, s[i]));
    558             MBEDTLS_MPI_CHK(mbedtls_mpi_mul_int(&T, X, radix));
    559             MBEDTLS_MPI_CHK(mbedtls_mpi_add_int(X, &T, d));
    560         }
    561     }
    562 
    563     if (sign < 0 && mbedtls_mpi_bitlen(X) != 0) {
    564         X->s = -1;
    565     }
    566 
    567 cleanup:
    568 
    569     mbedtls_mpi_free(&T);
    570 
    571     return ret;
    572 }
    573 
    574 /*
    575  * Helper to write the digits high-order first.
    576  */
    577 static int mpi_write_hlp(mbedtls_mpi *X, int radix,
    578                          char **p, const size_t buflen)
    579 {
    580     int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
    581     mbedtls_mpi_uint r;
    582     size_t length = 0;
    583     char *p_end = *p + buflen;
    584 
    585     do {
    586         if (length >= buflen) {
    587             return MBEDTLS_ERR_MPI_BUFFER_TOO_SMALL;
    588         }
    589 
    590         MBEDTLS_MPI_CHK(mbedtls_mpi_mod_int(&r, X, radix));
    591         MBEDTLS_MPI_CHK(mbedtls_mpi_div_int(X, NULL, X, radix));
    592         /*
    593          * Write the residue in the current position, as an ASCII character.
    594          */
    595         if (r < 0xA) {
    596             *(--p_end) = (char) ('0' + r);
    597         } else {
    598             *(--p_end) = (char) ('A' + (r - 0xA));
    599         }
    600 
    601         length++;
    602     } while (mbedtls_mpi_cmp_int(X, 0) != 0);
    603 
    604     memmove(*p, p_end, length);
    605     *p += length;
    606 
    607 cleanup:
    608 
    609     return ret;
    610 }
    611 
    612 /*
    613  * Export into an ASCII string
    614  */
    615 int mbedtls_mpi_write_string(const mbedtls_mpi *X, int radix,
    616                              char *buf, size_t buflen, size_t *olen)
    617 {
    618     int ret = 0;
    619     size_t n;
    620     char *p;
    621     mbedtls_mpi T;
    622 
    623     if (radix < 2 || radix > 16) {
    624         return MBEDTLS_ERR_MPI_BAD_INPUT_DATA;
    625     }
    626 
    627     n = mbedtls_mpi_bitlen(X);   /* Number of bits necessary to present `n`. */
    628     if (radix >=  4) {
    629         n >>= 1;                 /* Number of 4-adic digits necessary to present
    630                                   * `n`. If radix > 4, this might be a strict
    631                                   * overapproximation of the number of
    632                                   * radix-adic digits needed to present `n`. */
    633     }
    634     if (radix >= 16) {
    635         n >>= 1;                 /* Number of hexadecimal digits necessary to
    636                                   * present `n`. */
    637 
    638     }
    639     n += 1; /* Terminating null byte */
    640     n += 1; /* Compensate for the divisions above, which round down `n`
    641              * in case it's not even. */
    642     n += 1; /* Potential '-'-sign. */
    643     n += (n & 1);   /* Make n even to have enough space for hexadecimal writing,
    644                      * which always uses an even number of hex-digits. */
    645 
    646     if (buflen < n) {
    647         *olen = n;
    648         return MBEDTLS_ERR_MPI_BUFFER_TOO_SMALL;
    649     }
    650 
    651     p = buf;
    652     mbedtls_mpi_init(&T);
    653 
    654     if (X->s == -1) {
    655         *p++ = '-';
    656         buflen--;
    657     }
    658 
    659     if (radix == 16) {
    660         int c;
    661         size_t i, j, k;
    662 
    663         for (i = X->n, k = 0; i > 0; i--) {
    664             for (j = ciL; j > 0; j--) {
    665                 c = (X->p[i - 1] >> ((j - 1) << 3)) & 0xFF;
    666 
    667                 if (c == 0 && k == 0 && (i + j) != 2) {
    668                     continue;
    669                 }
    670 
    671                 *(p++) = "0123456789ABCDEF" [c / 16];
    672                 *(p++) = "0123456789ABCDEF" [c % 16];
    673                 k = 1;
    674             }
    675         }
    676     } else {
    677         MBEDTLS_MPI_CHK(mbedtls_mpi_copy(&T, X));
    678 
    679         if (T.s == -1) {
    680             T.s = 1;
    681         }
    682 
    683         MBEDTLS_MPI_CHK(mpi_write_hlp(&T, radix, &p, buflen));
    684     }
    685 
    686     *p++ = '\0';
    687     *olen = (size_t) (p - buf);
    688 
    689 cleanup:
    690 
    691     mbedtls_mpi_free(&T);
    692 
    693     return ret;
    694 }
    695 
    696 #if defined(MBEDTLS_FS_IO)
    697 /*
    698  * Read X from an opened file
    699  */
    700 int mbedtls_mpi_read_file(mbedtls_mpi *X, int radix, FILE *fin)
    701 {
    702     mbedtls_mpi_uint d;
    703     size_t slen;
    704     char *p;
    705     /*
    706      * Buffer should have space for (short) label and decimal formatted MPI,
    707      * newline characters and '\0'
    708      */
    709     char s[MBEDTLS_MPI_RW_BUFFER_SIZE];
    710 
    711     if (radix < 2 || radix > 16) {
    712         return MBEDTLS_ERR_MPI_BAD_INPUT_DATA;
    713     }
    714 
    715     memset(s, 0, sizeof(s));
    716     if (fgets(s, sizeof(s) - 1, fin) == NULL) {
    717         return MBEDTLS_ERR_MPI_FILE_IO_ERROR;
    718     }
    719 
    720     slen = strlen(s);
    721     if (slen == sizeof(s) - 2) {
    722         return MBEDTLS_ERR_MPI_BUFFER_TOO_SMALL;
    723     }
    724 
    725     if (slen > 0 && s[slen - 1] == '\n') {
    726         slen--; s[slen] = '\0';
    727     }
    728     if (slen > 0 && s[slen - 1] == '\r') {
    729         slen--; s[slen] = '\0';
    730     }
    731 
    732     p = s + slen;
    733     while (p-- > s) {
    734         if (mpi_get_digit(&d, radix, *p) != 0) {
    735             break;
    736         }
    737     }
    738 
    739     return mbedtls_mpi_read_string(X, radix, p + 1);
    740 }
    741 
    742 /*
    743  * Write X into an opened file (or stdout if fout == NULL)
    744  */
    745 int mbedtls_mpi_write_file(const char *p, const mbedtls_mpi *X, int radix, FILE *fout)
    746 {
    747     int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
    748     size_t n, slen, plen;
    749     /*
    750      * Buffer should have space for (short) label and decimal formatted MPI,
    751      * newline characters and '\0'
    752      */
    753     char s[MBEDTLS_MPI_RW_BUFFER_SIZE];
    754 
    755     if (radix < 2 || radix > 16) {
    756         return MBEDTLS_ERR_MPI_BAD_INPUT_DATA;
    757     }
    758 
    759     memset(s, 0, sizeof(s));
    760 
    761     MBEDTLS_MPI_CHK(mbedtls_mpi_write_string(X, radix, s, sizeof(s) - 2, &n));
    762 
    763     if (p == NULL) {
    764         p = "";
    765     }
    766 
    767     plen = strlen(p);
    768     slen = strlen(s);
    769     s[slen++] = '\r';
    770     s[slen++] = '\n';
    771 
    772     if (fout != NULL) {
    773         if (fwrite(p, 1, plen, fout) != plen ||
    774             fwrite(s, 1, slen, fout) != slen) {
    775             return MBEDTLS_ERR_MPI_FILE_IO_ERROR;
    776         }
    777     } else {
    778         mbedtls_printf("%s%s", p, s);
    779     }
    780 
    781 cleanup:
    782 
    783     return ret;
    784 }
    785 #endif /* MBEDTLS_FS_IO */
    786 
    787 /*
    788  * Import X from unsigned binary data, little endian
    789  *
    790  * This function is guaranteed to return an MPI with exactly the necessary
    791  * number of limbs (in particular, it does not skip 0s in the input).
    792  */
    793 int mbedtls_mpi_read_binary_le(mbedtls_mpi *X,
    794                                const unsigned char *buf, size_t buflen)
    795 {
    796     int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
    797     const size_t limbs = CHARS_TO_LIMBS(buflen);
    798 
    799     /* Ensure that target MPI has exactly the necessary number of limbs */
    800     MBEDTLS_MPI_CHK(mbedtls_mpi_resize_clear(X, limbs));
    801 
    802     MBEDTLS_MPI_CHK(mbedtls_mpi_core_read_le(X->p, X->n, buf, buflen));
    803 
    804 cleanup:
    805 
    806     /*
    807      * This function is also used to import keys. However, wiping the buffers
    808      * upon failure is not necessary because failure only can happen before any
    809      * input is copied.
    810      */
    811     return ret;
    812 }
    813 
    814 /*
    815  * Import X from unsigned binary data, big endian
    816  *
    817  * This function is guaranteed to return an MPI with exactly the necessary
    818  * number of limbs (in particular, it does not skip 0s in the input).
    819  */
    820 int mbedtls_mpi_read_binary(mbedtls_mpi *X, const unsigned char *buf, size_t buflen)
    821 {
    822     int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
    823     const size_t limbs = CHARS_TO_LIMBS(buflen);
    824 
    825     /* Ensure that target MPI has exactly the necessary number of limbs */
    826     MBEDTLS_MPI_CHK(mbedtls_mpi_resize_clear(X, limbs));
    827 
    828     MBEDTLS_MPI_CHK(mbedtls_mpi_core_read_be(X->p, X->n, buf, buflen));
    829 
    830 cleanup:
    831 
    832     /*
    833      * This function is also used to import keys. However, wiping the buffers
    834      * upon failure is not necessary because failure only can happen before any
    835      * input is copied.
    836      */
    837     return ret;
    838 }
    839 
    840 /*
    841  * Export X into unsigned binary data, little endian
    842  */
    843 int mbedtls_mpi_write_binary_le(const mbedtls_mpi *X,
    844                                 unsigned char *buf, size_t buflen)
    845 {
    846     return mbedtls_mpi_core_write_le(X->p, X->n, buf, buflen);
    847 }
    848 
    849 /*
    850  * Export X into unsigned binary data, big endian
    851  */
    852 int mbedtls_mpi_write_binary(const mbedtls_mpi *X,
    853                              unsigned char *buf, size_t buflen)
    854 {
    855     return mbedtls_mpi_core_write_be(X->p, X->n, buf, buflen);
    856 }
    857 
    858 /*
    859  * Left-shift: X <<= count
    860  */
    861 int mbedtls_mpi_shift_l(mbedtls_mpi *X, size_t count)
    862 {
    863     int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
    864     size_t i;
    865 
    866     i = mbedtls_mpi_bitlen(X) + count;
    867 
    868     if (X->n * biL < i) {
    869         MBEDTLS_MPI_CHK(mbedtls_mpi_grow(X, BITS_TO_LIMBS(i)));
    870     }
    871 
    872     ret = 0;
    873 
    874     mbedtls_mpi_core_shift_l(X->p, X->n, count);
    875 cleanup:
    876 
    877     return ret;
    878 }
    879 
    880 /*
    881  * Right-shift: X >>= count
    882  */
    883 int mbedtls_mpi_shift_r(mbedtls_mpi *X, size_t count)
    884 {
    885     if (X->n != 0) {
    886         mbedtls_mpi_core_shift_r(X->p, X->n, count);
    887     }
    888     return 0;
    889 }
    890 
    891 /*
    892  * Compare unsigned values
    893  */
    894 int mbedtls_mpi_cmp_abs(const mbedtls_mpi *X, const mbedtls_mpi *Y)
    895 {
    896     size_t i, j;
    897 
    898     for (i = X->n; i > 0; i--) {
    899         if (X->p[i - 1] != 0) {
    900             break;
    901         }
    902     }
    903 
    904     for (j = Y->n; j > 0; j--) {
    905         if (Y->p[j - 1] != 0) {
    906             break;
    907         }
    908     }
    909 
    910     /* If i == j == 0, i.e. abs(X) == abs(Y),
    911      * we end up returning 0 at the end of the function. */
    912 
    913     if (i > j) {
    914         return 1;
    915     }
    916     if (j > i) {
    917         return -1;
    918     }
    919 
    920     for (; i > 0; i--) {
    921         if (X->p[i - 1] > Y->p[i - 1]) {
    922             return 1;
    923         }
    924         if (X->p[i - 1] < Y->p[i - 1]) {
    925             return -1;
    926         }
    927     }
    928 
    929     return 0;
    930 }
    931 
    932 /*
    933  * Compare signed values
    934  */
    935 int mbedtls_mpi_cmp_mpi(const mbedtls_mpi *X, const mbedtls_mpi *Y)
    936 {
    937     size_t i, j;
    938 
    939     for (i = X->n; i > 0; i--) {
    940         if (X->p[i - 1] != 0) {
    941             break;
    942         }
    943     }
    944 
    945     for (j = Y->n; j > 0; j--) {
    946         if (Y->p[j - 1] != 0) {
    947             break;
    948         }
    949     }
    950 
    951     if (i == 0 && j == 0) {
    952         return 0;
    953     }
    954 
    955     if (i > j) {
    956         return X->s;
    957     }
    958     if (j > i) {
    959         return -Y->s;
    960     }
    961 
    962     if (X->s > 0 && Y->s < 0) {
    963         return 1;
    964     }
    965     if (Y->s > 0 && X->s < 0) {
    966         return -1;
    967     }
    968 
    969     for (; i > 0; i--) {
    970         if (X->p[i - 1] > Y->p[i - 1]) {
    971             return X->s;
    972         }
    973         if (X->p[i - 1] < Y->p[i - 1]) {
    974             return -X->s;
    975         }
    976     }
    977 
    978     return 0;
    979 }
    980 
    981 /*
    982  * Compare signed values
    983  */
    984 int mbedtls_mpi_cmp_int(const mbedtls_mpi *X, mbedtls_mpi_sint z)
    985 {
    986     mbedtls_mpi Y;
    987     mbedtls_mpi_uint p[1];
    988 
    989     *p  = mpi_sint_abs(z);
    990     Y.s = TO_SIGN(z);
    991     Y.n = 1;
    992     Y.p = p;
    993 
    994     return mbedtls_mpi_cmp_mpi(X, &Y);
    995 }
    996 
    997 /*
    998  * Unsigned addition: X = |A| + |B|  (HAC 14.7)
    999  */
   1000 int mbedtls_mpi_add_abs(mbedtls_mpi *X, const mbedtls_mpi *A, const mbedtls_mpi *B)
   1001 {
   1002     int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
   1003     size_t j;
   1004     mbedtls_mpi_uint *p;
   1005     mbedtls_mpi_uint c;
   1006 
   1007     if (X == B) {
   1008         const mbedtls_mpi *T = A; A = X; B = T;
   1009     }
   1010 
   1011     if (X != A) {
   1012         MBEDTLS_MPI_CHK(mbedtls_mpi_copy(X, A));
   1013     }
   1014 
   1015     /*
   1016      * X must always be positive as a result of unsigned additions.
   1017      */
   1018     X->s = 1;
   1019 
   1020     for (j = B->n; j > 0; j--) {
   1021         if (B->p[j - 1] != 0) {
   1022             break;
   1023         }
   1024     }
   1025 
   1026     /* Exit early to avoid undefined behavior on NULL+0 when X->n == 0
   1027      * and B is 0 (of any size). */
   1028     if (j == 0) {
   1029         return 0;
   1030     }
   1031 
   1032     MBEDTLS_MPI_CHK(mbedtls_mpi_grow(X, j));
   1033 
   1034     /* j is the number of non-zero limbs of B. Add those to X. */
   1035 
   1036     p = X->p;
   1037 
   1038     c = mbedtls_mpi_core_add(p, p, B->p, j);
   1039 
   1040     p += j;
   1041 
   1042     /* Now propagate any carry */
   1043 
   1044     while (c != 0) {
   1045         if (j >= X->n) {
   1046             MBEDTLS_MPI_CHK(mbedtls_mpi_grow(X, j + 1));
   1047             p = X->p + j;
   1048         }
   1049 
   1050         *p += c; c = (*p < c); j++; p++;
   1051     }
   1052 
   1053 cleanup:
   1054 
   1055     return ret;
   1056 }
   1057 
   1058 /*
   1059  * Unsigned subtraction: X = |A| - |B|  (HAC 14.9, 14.10)
   1060  */
   1061 int mbedtls_mpi_sub_abs(mbedtls_mpi *X, const mbedtls_mpi *A, const mbedtls_mpi *B)
   1062 {
   1063     int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
   1064     size_t n;
   1065     mbedtls_mpi_uint carry;
   1066 
   1067     for (n = B->n; n > 0; n--) {
   1068         if (B->p[n - 1] != 0) {
   1069             break;
   1070         }
   1071     }
   1072     if (n > A->n) {
   1073         /* B >= (2^ciL)^n > A */
   1074         ret = MBEDTLS_ERR_MPI_NEGATIVE_VALUE;
   1075         goto cleanup;
   1076     }
   1077 
   1078     MBEDTLS_MPI_CHK(mbedtls_mpi_grow(X, A->n));
   1079 
   1080     /* Set the high limbs of X to match A. Don't touch the lower limbs
   1081      * because X might be aliased to B, and we must not overwrite the
   1082      * significant digits of B. */
   1083     if (A->n > n && A != X) {
   1084         memcpy(X->p + n, A->p + n, (A->n - n) * ciL);
   1085     }
   1086     if (X->n > A->n) {
   1087         memset(X->p + A->n, 0, (X->n - A->n) * ciL);
   1088     }
   1089 
   1090     carry = mbedtls_mpi_core_sub(X->p, A->p, B->p, n);
   1091     if (carry != 0) {
   1092         /* Propagate the carry through the rest of X. */
   1093         carry = mbedtls_mpi_core_sub_int(X->p + n, X->p + n, carry, X->n - n);
   1094 
   1095         /* If we have further carry/borrow, the result is negative. */
   1096         if (carry != 0) {
   1097             ret = MBEDTLS_ERR_MPI_NEGATIVE_VALUE;
   1098             goto cleanup;
   1099         }
   1100     }
   1101 
   1102     /* X should always be positive as a result of unsigned subtractions. */
   1103     X->s = 1;
   1104 
   1105 cleanup:
   1106     return ret;
   1107 }
   1108 
   1109 /* Common function for signed addition and subtraction.
   1110  * Calculate A + B * flip_B where flip_B is 1 or -1.
   1111  */
   1112 static int add_sub_mpi(mbedtls_mpi *X,
   1113                        const mbedtls_mpi *A, const mbedtls_mpi *B,
   1114                        int flip_B)
   1115 {
   1116     int ret, s;
   1117 
   1118     s = A->s;
   1119     if (A->s * B->s * flip_B < 0) {
   1120         int cmp = mbedtls_mpi_cmp_abs(A, B);
   1121         if (cmp >= 0) {
   1122             MBEDTLS_MPI_CHK(mbedtls_mpi_sub_abs(X, A, B));
   1123             /* If |A| = |B|, the result is 0 and we must set the sign bit
   1124              * to +1 regardless of which of A or B was negative. Otherwise,
   1125              * since |A| > |B|, the sign is the sign of A. */
   1126             X->s = cmp == 0 ? 1 : s;
   1127         } else {
   1128             MBEDTLS_MPI_CHK(mbedtls_mpi_sub_abs(X, B, A));
   1129             /* Since |A| < |B|, the sign is the opposite of A. */
   1130             X->s = -s;
   1131         }
   1132     } else {
   1133         MBEDTLS_MPI_CHK(mbedtls_mpi_add_abs(X, A, B));
   1134         X->s = s;
   1135     }
   1136 
   1137 cleanup:
   1138 
   1139     return ret;
   1140 }
   1141 
   1142 /*
   1143  * Signed addition: X = A + B
   1144  */
   1145 int mbedtls_mpi_add_mpi(mbedtls_mpi *X, const mbedtls_mpi *A, const mbedtls_mpi *B)
   1146 {
   1147     return add_sub_mpi(X, A, B, 1);
   1148 }
   1149 
   1150 /*
   1151  * Signed subtraction: X = A - B
   1152  */
   1153 int mbedtls_mpi_sub_mpi(mbedtls_mpi *X, const mbedtls_mpi *A, const mbedtls_mpi *B)
   1154 {
   1155     return add_sub_mpi(X, A, B, -1);
   1156 }
   1157 
   1158 /*
   1159  * Signed addition: X = A + b
   1160  */
   1161 int mbedtls_mpi_add_int(mbedtls_mpi *X, const mbedtls_mpi *A, mbedtls_mpi_sint b)
   1162 {
   1163     mbedtls_mpi B;
   1164     mbedtls_mpi_uint p[1];
   1165 
   1166     p[0] = mpi_sint_abs(b);
   1167     B.s = TO_SIGN(b);
   1168     B.n = 1;
   1169     B.p = p;
   1170 
   1171     return mbedtls_mpi_add_mpi(X, A, &B);
   1172 }
   1173 
   1174 /*
   1175  * Signed subtraction: X = A - b
   1176  */
   1177 int mbedtls_mpi_sub_int(mbedtls_mpi *X, const mbedtls_mpi *A, mbedtls_mpi_sint b)
   1178 {
   1179     mbedtls_mpi B;
   1180     mbedtls_mpi_uint p[1];
   1181 
   1182     p[0] = mpi_sint_abs(b);
   1183     B.s = TO_SIGN(b);
   1184     B.n = 1;
   1185     B.p = p;
   1186 
   1187     return mbedtls_mpi_sub_mpi(X, A, &B);
   1188 }
   1189 
   1190 /*
   1191  * Baseline multiplication: X = A * B  (HAC 14.12)
   1192  */
   1193 int mbedtls_mpi_mul_mpi(mbedtls_mpi *X, const mbedtls_mpi *A, const mbedtls_mpi *B)
   1194 {
   1195     int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
   1196     size_t i, j;
   1197     mbedtls_mpi TA, TB;
   1198     int result_is_zero = 0;
   1199 
   1200     mbedtls_mpi_init(&TA);
   1201     mbedtls_mpi_init(&TB);
   1202 
   1203     if (X == A) {
   1204         MBEDTLS_MPI_CHK(mbedtls_mpi_copy(&TA, A)); A = &TA;
   1205     }
   1206     if (X == B) {
   1207         MBEDTLS_MPI_CHK(mbedtls_mpi_copy(&TB, B)); B = &TB;
   1208     }
   1209 
   1210     for (i = A->n; i > 0; i--) {
   1211         if (A->p[i - 1] != 0) {
   1212             break;
   1213         }
   1214     }
   1215     if (i == 0) {
   1216         result_is_zero = 1;
   1217     }
   1218 
   1219     for (j = B->n; j > 0; j--) {
   1220         if (B->p[j - 1] != 0) {
   1221             break;
   1222         }
   1223     }
   1224     if (j == 0) {
   1225         result_is_zero = 1;
   1226     }
   1227 
   1228     MBEDTLS_MPI_CHK(mbedtls_mpi_grow(X, i + j));
   1229     MBEDTLS_MPI_CHK(mbedtls_mpi_lset(X, 0));
   1230 
   1231     mbedtls_mpi_core_mul(X->p, A->p, i, B->p, j);
   1232 
   1233     /* If the result is 0, we don't shortcut the operation, which reduces
   1234      * but does not eliminate side channels leaking the zero-ness. We do
   1235      * need to take care to set the sign bit properly since the library does
   1236      * not fully support an MPI object with a value of 0 and s == -1. */
   1237     if (result_is_zero) {
   1238         X->s = 1;
   1239     } else {
   1240         X->s = A->s * B->s;
   1241     }
   1242 
   1243 cleanup:
   1244 
   1245     mbedtls_mpi_free(&TB); mbedtls_mpi_free(&TA);
   1246 
   1247     return ret;
   1248 }
   1249 
   1250 /*
   1251  * Baseline multiplication: X = A * b
   1252  */
   1253 int mbedtls_mpi_mul_int(mbedtls_mpi *X, const mbedtls_mpi *A, mbedtls_mpi_uint b)
   1254 {
   1255     size_t n = A->n;
   1256     while (n > 0 && A->p[n - 1] == 0) {
   1257         --n;
   1258     }
   1259 
   1260     /* The general method below doesn't work if b==0. */
   1261     if (b == 0 || n == 0) {
   1262         return mbedtls_mpi_lset(X, 0);
   1263     }
   1264 
   1265     /* Calculate A*b as A + A*(b-1) to take advantage of mbedtls_mpi_core_mla */
   1266     int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
   1267     /* In general, A * b requires 1 limb more than b. If
   1268      * A->p[n - 1] * b / b == A->p[n - 1], then A * b fits in the same
   1269      * number of limbs as A and the call to grow() is not required since
   1270      * copy() will take care of the growth if needed. However, experimentally,
   1271      * making the call to grow() unconditional causes slightly fewer
   1272      * calls to calloc() in ECP code, presumably because it reuses the
   1273      * same mpi for a while and this way the mpi is more likely to directly
   1274      * grow to its final size.
   1275      *
   1276      * Note that calculating A*b as 0 + A*b doesn't work as-is because
   1277      * A,X can be the same. */
   1278     MBEDTLS_MPI_CHK(mbedtls_mpi_grow(X, n + 1));
   1279     MBEDTLS_MPI_CHK(mbedtls_mpi_copy(X, A));
   1280     mbedtls_mpi_core_mla(X->p, X->n, A->p, n, b - 1);
   1281 
   1282 cleanup:
   1283     return ret;
   1284 }
   1285 
   1286 /*
   1287  * Unsigned integer divide - double mbedtls_mpi_uint dividend, u1/u0, and
   1288  * mbedtls_mpi_uint divisor, d
   1289  */
   1290 static mbedtls_mpi_uint mbedtls_int_div_int(mbedtls_mpi_uint u1,
   1291                                             mbedtls_mpi_uint u0,
   1292                                             mbedtls_mpi_uint d,
   1293                                             mbedtls_mpi_uint *r)
   1294 {
   1295 #if defined(MBEDTLS_HAVE_UDBL)
   1296     mbedtls_t_udbl dividend, quotient;
   1297 #else
   1298     const mbedtls_mpi_uint radix = (mbedtls_mpi_uint) 1 << biH;
   1299     const mbedtls_mpi_uint uint_halfword_mask = ((mbedtls_mpi_uint) 1 << biH) - 1;
   1300     mbedtls_mpi_uint d0, d1, q0, q1, rAX, r0, quotient;
   1301     mbedtls_mpi_uint u0_msw, u0_lsw;
   1302     size_t s;
   1303 #endif
   1304 
   1305     /*
   1306      * Check for overflow
   1307      */
   1308     if (0 == d || u1 >= d) {
   1309         if (r != NULL) {
   1310             *r = ~(mbedtls_mpi_uint) 0u;
   1311         }
   1312 
   1313         return ~(mbedtls_mpi_uint) 0u;
   1314     }
   1315 
   1316 #if defined(MBEDTLS_HAVE_UDBL)
   1317     dividend  = (mbedtls_t_udbl) u1 << biL;
   1318     dividend |= (mbedtls_t_udbl) u0;
   1319     quotient = dividend / d;
   1320     if (quotient > ((mbedtls_t_udbl) 1 << biL) - 1) {
   1321         quotient = ((mbedtls_t_udbl) 1 << biL) - 1;
   1322     }
   1323 
   1324     if (r != NULL) {
   1325         *r = (mbedtls_mpi_uint) (dividend - (quotient * d));
   1326     }
   1327 
   1328     return (mbedtls_mpi_uint) quotient;
   1329 #else
   1330 
   1331     /*
   1332      * Algorithm D, Section 4.3.1 - The Art of Computer Programming
   1333      *   Vol. 2 - Seminumerical Algorithms, Knuth
   1334      */
   1335 
   1336     /*
   1337      * Normalize the divisor, d, and dividend, u0, u1
   1338      */
   1339     s = mbedtls_mpi_core_clz(d);
   1340     d = d << s;
   1341 
   1342     u1 = u1 << s;
   1343     u1 |= (u0 >> (biL - s)) & (-(mbedtls_mpi_sint) s >> (biL - 1));
   1344     u0 =  u0 << s;
   1345 
   1346     d1 = d >> biH;
   1347     d0 = d & uint_halfword_mask;
   1348 
   1349     u0_msw = u0 >> biH;
   1350     u0_lsw = u0 & uint_halfword_mask;
   1351 
   1352     /*
   1353      * Find the first quotient and remainder
   1354      */
   1355     q1 = u1 / d1;
   1356     r0 = u1 - d1 * q1;
   1357 
   1358     while (q1 >= radix || (q1 * d0 > radix * r0 + u0_msw)) {
   1359         q1 -= 1;
   1360         r0 += d1;
   1361 
   1362         if (r0 >= radix) {
   1363             break;
   1364         }
   1365     }
   1366 
   1367     rAX = (u1 * radix) + (u0_msw - q1 * d);
   1368     q0 = rAX / d1;
   1369     r0 = rAX - q0 * d1;
   1370 
   1371     while (q0 >= radix || (q0 * d0 > radix * r0 + u0_lsw)) {
   1372         q0 -= 1;
   1373         r0 += d1;
   1374 
   1375         if (r0 >= radix) {
   1376             break;
   1377         }
   1378     }
   1379 
   1380     if (r != NULL) {
   1381         *r = (rAX * radix + u0_lsw - q0 * d) >> s;
   1382     }
   1383 
   1384     quotient = q1 * radix + q0;
   1385 
   1386     return quotient;
   1387 #endif
   1388 }
   1389 
   1390 /*
   1391  * Division by mbedtls_mpi: A = Q * B + R  (HAC 14.20)
   1392  */
   1393 int mbedtls_mpi_div_mpi(mbedtls_mpi *Q, mbedtls_mpi *R, const mbedtls_mpi *A,
   1394                         const mbedtls_mpi *B)
   1395 {
   1396     int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
   1397     size_t i, n, t, k;
   1398     mbedtls_mpi X, Y, Z, T1, T2;
   1399     mbedtls_mpi_uint TP2[3];
   1400 
   1401     if (mbedtls_mpi_cmp_int(B, 0) == 0) {
   1402         return MBEDTLS_ERR_MPI_DIVISION_BY_ZERO;
   1403     }
   1404 
   1405     mbedtls_mpi_init(&X); mbedtls_mpi_init(&Y); mbedtls_mpi_init(&Z);
   1406     mbedtls_mpi_init(&T1);
   1407     /*
   1408      * Avoid dynamic memory allocations for constant-size T2.
   1409      *
   1410      * T2 is used for comparison only and the 3 limbs are assigned explicitly,
   1411      * so nobody increase the size of the MPI and we're safe to use an on-stack
   1412      * buffer.
   1413      */
   1414     T2.s = 1;
   1415     T2.n = sizeof(TP2) / sizeof(*TP2);
   1416     T2.p = TP2;
   1417 
   1418     if (mbedtls_mpi_cmp_abs(A, B) < 0) {
   1419         if (Q != NULL) {
   1420             MBEDTLS_MPI_CHK(mbedtls_mpi_lset(Q, 0));
   1421         }
   1422         if (R != NULL) {
   1423             MBEDTLS_MPI_CHK(mbedtls_mpi_copy(R, A));
   1424         }
   1425         return 0;
   1426     }
   1427 
   1428     MBEDTLS_MPI_CHK(mbedtls_mpi_copy(&X, A));
   1429     MBEDTLS_MPI_CHK(mbedtls_mpi_copy(&Y, B));
   1430     X.s = Y.s = 1;
   1431 
   1432     MBEDTLS_MPI_CHK(mbedtls_mpi_grow(&Z, A->n + 2));
   1433     MBEDTLS_MPI_CHK(mbedtls_mpi_lset(&Z,  0));
   1434     MBEDTLS_MPI_CHK(mbedtls_mpi_grow(&T1, A->n + 2));
   1435 
   1436     k = mbedtls_mpi_bitlen(&Y) % biL;
   1437     if (k < biL - 1) {
   1438         k = biL - 1 - k;
   1439         MBEDTLS_MPI_CHK(mbedtls_mpi_shift_l(&X, k));
   1440         MBEDTLS_MPI_CHK(mbedtls_mpi_shift_l(&Y, k));
   1441     } else {
   1442         k = 0;
   1443     }
   1444 
   1445     n = X.n - 1;
   1446     t = Y.n - 1;
   1447     MBEDTLS_MPI_CHK(mbedtls_mpi_shift_l(&Y, biL * (n - t)));
   1448 
   1449     while (mbedtls_mpi_cmp_mpi(&X, &Y) >= 0) {
   1450         Z.p[n - t]++;
   1451         MBEDTLS_MPI_CHK(mbedtls_mpi_sub_mpi(&X, &X, &Y));
   1452     }
   1453     MBEDTLS_MPI_CHK(mbedtls_mpi_shift_r(&Y, biL * (n - t)));
   1454 
   1455     for (i = n; i > t; i--) {
   1456         if (X.p[i] >= Y.p[t]) {
   1457             Z.p[i - t - 1] = ~(mbedtls_mpi_uint) 0u;
   1458         } else {
   1459             Z.p[i - t - 1] = mbedtls_int_div_int(X.p[i], X.p[i - 1],
   1460                                                  Y.p[t], NULL);
   1461         }
   1462 
   1463         T2.p[0] = (i < 2) ? 0 : X.p[i - 2];
   1464         T2.p[1] = (i < 1) ? 0 : X.p[i - 1];
   1465         T2.p[2] = X.p[i];
   1466 
   1467         Z.p[i - t - 1]++;
   1468         do {
   1469             Z.p[i - t - 1]--;
   1470 
   1471             MBEDTLS_MPI_CHK(mbedtls_mpi_lset(&T1, 0));
   1472             T1.p[0] = (t < 1) ? 0 : Y.p[t - 1];
   1473             T1.p[1] = Y.p[t];
   1474             MBEDTLS_MPI_CHK(mbedtls_mpi_mul_int(&T1, &T1, Z.p[i - t - 1]));
   1475         } while (mbedtls_mpi_cmp_mpi(&T1, &T2) > 0);
   1476 
   1477         MBEDTLS_MPI_CHK(mbedtls_mpi_mul_int(&T1, &Y, Z.p[i - t - 1]));
   1478         MBEDTLS_MPI_CHK(mbedtls_mpi_shift_l(&T1,  biL * (i - t - 1)));
   1479         MBEDTLS_MPI_CHK(mbedtls_mpi_sub_mpi(&X, &X, &T1));
   1480 
   1481         if (mbedtls_mpi_cmp_int(&X, 0) < 0) {
   1482             MBEDTLS_MPI_CHK(mbedtls_mpi_copy(&T1, &Y));
   1483             MBEDTLS_MPI_CHK(mbedtls_mpi_shift_l(&T1, biL * (i - t - 1)));
   1484             MBEDTLS_MPI_CHK(mbedtls_mpi_add_mpi(&X, &X, &T1));
   1485             Z.p[i - t - 1]--;
   1486         }
   1487     }
   1488 
   1489     if (Q != NULL) {
   1490         MBEDTLS_MPI_CHK(mbedtls_mpi_copy(Q, &Z));
   1491         Q->s = A->s * B->s;
   1492     }
   1493 
   1494     if (R != NULL) {
   1495         MBEDTLS_MPI_CHK(mbedtls_mpi_shift_r(&X, k));
   1496         X.s = A->s;
   1497         MBEDTLS_MPI_CHK(mbedtls_mpi_copy(R, &X));
   1498 
   1499         if (mbedtls_mpi_cmp_int(R, 0) == 0) {
   1500             R->s = 1;
   1501         }
   1502     }
   1503 
   1504 cleanup:
   1505 
   1506     mbedtls_mpi_free(&X); mbedtls_mpi_free(&Y); mbedtls_mpi_free(&Z);
   1507     mbedtls_mpi_free(&T1);
   1508     mbedtls_platform_zeroize(TP2, sizeof(TP2));
   1509 
   1510     return ret;
   1511 }
   1512 
   1513 /*
   1514  * Division by int: A = Q * b + R
   1515  */
   1516 int mbedtls_mpi_div_int(mbedtls_mpi *Q, mbedtls_mpi *R,
   1517                         const mbedtls_mpi *A,
   1518                         mbedtls_mpi_sint b)
   1519 {
   1520     mbedtls_mpi B;
   1521     mbedtls_mpi_uint p[1];
   1522 
   1523     p[0] = mpi_sint_abs(b);
   1524     B.s = TO_SIGN(b);
   1525     B.n = 1;
   1526     B.p = p;
   1527 
   1528     return mbedtls_mpi_div_mpi(Q, R, A, &B);
   1529 }
   1530 
   1531 /*
   1532  * Modulo: R = A mod B
   1533  */
   1534 int mbedtls_mpi_mod_mpi(mbedtls_mpi *R, const mbedtls_mpi *A, const mbedtls_mpi *B)
   1535 {
   1536     int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
   1537 
   1538     if (mbedtls_mpi_cmp_int(B, 0) < 0) {
   1539         return MBEDTLS_ERR_MPI_NEGATIVE_VALUE;
   1540     }
   1541 
   1542     MBEDTLS_MPI_CHK(mbedtls_mpi_div_mpi(NULL, R, A, B));
   1543 
   1544     while (mbedtls_mpi_cmp_int(R, 0) < 0) {
   1545         MBEDTLS_MPI_CHK(mbedtls_mpi_add_mpi(R, R, B));
   1546     }
   1547 
   1548     while (mbedtls_mpi_cmp_mpi(R, B) >= 0) {
   1549         MBEDTLS_MPI_CHK(mbedtls_mpi_sub_mpi(R, R, B));
   1550     }
   1551 
   1552 cleanup:
   1553 
   1554     return ret;
   1555 }
   1556 
   1557 /*
   1558  * Modulo: r = A mod b
   1559  */
   1560 int mbedtls_mpi_mod_int(mbedtls_mpi_uint *r, const mbedtls_mpi *A, mbedtls_mpi_sint b)
   1561 {
   1562     size_t i;
   1563     mbedtls_mpi_uint x, y, z;
   1564 
   1565     if (b == 0) {
   1566         return MBEDTLS_ERR_MPI_DIVISION_BY_ZERO;
   1567     }
   1568 
   1569     if (b < 0) {
   1570         return MBEDTLS_ERR_MPI_NEGATIVE_VALUE;
   1571     }
   1572 
   1573     /*
   1574      * handle trivial cases
   1575      */
   1576     if (b == 1 || A->n == 0) {
   1577         *r = 0;
   1578         return 0;
   1579     }
   1580 
   1581     if (b == 2) {
   1582         *r = A->p[0] & 1;
   1583         return 0;
   1584     }
   1585 
   1586     /*
   1587      * general case
   1588      */
   1589     for (i = A->n, y = 0; i > 0; i--) {
   1590         x  = A->p[i - 1];
   1591         y  = (y << biH) | (x >> biH);
   1592         z  = y / b;
   1593         y -= z * b;
   1594 
   1595         x <<= biH;
   1596         y  = (y << biH) | (x >> biH);
   1597         z  = y / b;
   1598         y -= z * b;
   1599     }
   1600 
   1601     /*
   1602      * If A is negative, then the current y represents a negative value.
   1603      * Flipping it to the positive side.
   1604      */
   1605     if (A->s < 0 && y != 0) {
   1606         y = b - y;
   1607     }
   1608 
   1609     *r = y;
   1610 
   1611     return 0;
   1612 }
   1613 
   1614 /*
   1615  * Warning! If the parameter E_public has MBEDTLS_MPI_IS_PUBLIC as its value,
   1616  * this function is not constant time with respect to the exponent (parameter E).
   1617  */
   1618 static int mbedtls_mpi_exp_mod_optionally_safe(mbedtls_mpi *X, const mbedtls_mpi *A,
   1619                                                const mbedtls_mpi *E, int E_public,
   1620                                                const mbedtls_mpi *N, mbedtls_mpi *prec_RR)
   1621 {
   1622     int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
   1623 
   1624     if (mbedtls_mpi_cmp_int(N, 0) <= 0 || (N->p[0] & 1) == 0) {
   1625         return MBEDTLS_ERR_MPI_BAD_INPUT_DATA;
   1626     }
   1627 
   1628     if (mbedtls_mpi_cmp_int(E, 0) < 0) {
   1629         return MBEDTLS_ERR_MPI_BAD_INPUT_DATA;
   1630     }
   1631 
   1632     if (mbedtls_mpi_bitlen(E) > MBEDTLS_MPI_MAX_BITS ||
   1633         mbedtls_mpi_bitlen(N) > MBEDTLS_MPI_MAX_BITS) {
   1634         return MBEDTLS_ERR_MPI_BAD_INPUT_DATA;
   1635     }
   1636 
   1637     /*
   1638      * Ensure that the exponent that we are passing to the core is not NULL.
   1639      */
   1640     if (E->n == 0) {
   1641         ret = mbedtls_mpi_lset(X, 1);
   1642         return ret;
   1643     }
   1644 
   1645     /*
   1646      * Allocate working memory for mbedtls_mpi_core_exp_mod()
   1647      */
   1648     size_t T_limbs = mbedtls_mpi_core_exp_mod_working_limbs(N->n, E->n);
   1649     mbedtls_mpi_uint *T = (mbedtls_mpi_uint *) mbedtls_calloc(T_limbs, sizeof(mbedtls_mpi_uint));
   1650     if (T == NULL) {
   1651         return MBEDTLS_ERR_MPI_ALLOC_FAILED;
   1652     }
   1653 
   1654     mbedtls_mpi RR;
   1655     mbedtls_mpi_init(&RR);
   1656 
   1657     /*
   1658      * If 1st call, pre-compute R^2 mod N
   1659      */
   1660     if (prec_RR == NULL || prec_RR->p == NULL) {
   1661         MBEDTLS_MPI_CHK(mbedtls_mpi_core_get_mont_r2_unsafe(&RR, N));
   1662 
   1663         if (prec_RR != NULL) {
   1664             *prec_RR = RR;
   1665         }
   1666     } else {
   1667         MBEDTLS_MPI_CHK(mbedtls_mpi_grow(prec_RR, N->n));
   1668         RR = *prec_RR;
   1669     }
   1670 
   1671     /*
   1672      * To preserve constness we need to make a copy of A. Using X for this to
   1673      * save memory.
   1674      */
   1675     MBEDTLS_MPI_CHK(mbedtls_mpi_copy(X, A));
   1676 
   1677     /*
   1678      * Compensate for negative A (and correct at the end).
   1679      */
   1680     X->s = 1;
   1681 
   1682     /*
   1683      * Make sure that X is in a form that is safe for consumption by
   1684      * the core functions.
   1685      *
   1686      * - The core functions will not touch the limbs of X above N->n. The
   1687      *   result will be correct if those limbs are 0, which the mod call
   1688      *   ensures.
   1689      * - Also, X must have at least as many limbs as N for the calls to the
   1690      *   core functions.
   1691      */
   1692     if (mbedtls_mpi_cmp_mpi(X, N) >= 0) {
   1693         MBEDTLS_MPI_CHK(mbedtls_mpi_mod_mpi(X, X, N));
   1694     }
   1695     MBEDTLS_MPI_CHK(mbedtls_mpi_grow(X, N->n));
   1696 
   1697     /*
   1698      * Convert to and from Montgomery around mbedtls_mpi_core_exp_mod().
   1699      */
   1700     {
   1701         mbedtls_mpi_uint mm = mbedtls_mpi_core_montmul_init(N->p);
   1702         mbedtls_mpi_core_to_mont_rep(X->p, X->p, N->p, N->n, mm, RR.p, T);
   1703         if (E_public == MBEDTLS_MPI_IS_PUBLIC) {
   1704             mbedtls_mpi_core_exp_mod_unsafe(X->p, X->p, N->p, N->n, E->p, E->n, RR.p, T);
   1705         } else {
   1706             mbedtls_mpi_core_exp_mod(X->p, X->p, N->p, N->n, E->p, E->n, RR.p, T);
   1707         }
   1708         mbedtls_mpi_core_from_mont_rep(X->p, X->p, N->p, N->n, mm, T);
   1709     }
   1710 
   1711     /*
   1712      * Correct for negative A.
   1713      */
   1714     if (A->s == -1 && (E->p[0] & 1) != 0) {
   1715         mbedtls_ct_condition_t is_x_non_zero = mbedtls_mpi_core_check_zero_ct(X->p, X->n);
   1716         X->s = mbedtls_ct_mpi_sign_if(is_x_non_zero, -1, 1);
   1717 
   1718         MBEDTLS_MPI_CHK(mbedtls_mpi_add_mpi(X, N, X));
   1719     }
   1720 
   1721 cleanup:
   1722 
   1723     mbedtls_mpi_zeroize_and_free(T, T_limbs);
   1724 
   1725     if (prec_RR == NULL || prec_RR->p == NULL) {
   1726         mbedtls_mpi_free(&RR);
   1727     }
   1728 
   1729     return ret;
   1730 }
   1731 
   1732 int mbedtls_mpi_exp_mod(mbedtls_mpi *X, const mbedtls_mpi *A,
   1733                         const mbedtls_mpi *E, const mbedtls_mpi *N,
   1734                         mbedtls_mpi *prec_RR)
   1735 {
   1736     return mbedtls_mpi_exp_mod_optionally_safe(X, A, E, MBEDTLS_MPI_IS_SECRET, N, prec_RR);
   1737 }
   1738 
   1739 int mbedtls_mpi_exp_mod_unsafe(mbedtls_mpi *X, const mbedtls_mpi *A,
   1740                                const mbedtls_mpi *E, const mbedtls_mpi *N,
   1741                                mbedtls_mpi *prec_RR)
   1742 {
   1743     return mbedtls_mpi_exp_mod_optionally_safe(X, A, E, MBEDTLS_MPI_IS_PUBLIC, N, prec_RR);
   1744 }
   1745 
   1746 /*
   1747  * Greatest common divisor: G = gcd(A, B)  (HAC 14.54)
   1748  */
   1749 int mbedtls_mpi_gcd(mbedtls_mpi *G, const mbedtls_mpi *A, const mbedtls_mpi *B)
   1750 {
   1751     int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
   1752     size_t lz, lzt;
   1753     mbedtls_mpi TA, TB;
   1754 
   1755     mbedtls_mpi_init(&TA); mbedtls_mpi_init(&TB);
   1756 
   1757     MBEDTLS_MPI_CHK(mbedtls_mpi_copy(&TA, A));
   1758     MBEDTLS_MPI_CHK(mbedtls_mpi_copy(&TB, B));
   1759 
   1760     lz = mbedtls_mpi_lsb(&TA);
   1761     lzt = mbedtls_mpi_lsb(&TB);
   1762 
   1763     /* The loop below gives the correct result when A==0 but not when B==0.
   1764      * So have a special case for B==0. Leverage the fact that we just
   1765      * calculated the lsb and lsb(B)==0 iff B is odd or 0 to make the test
   1766      * slightly more efficient than cmp_int(). */
   1767     if (lzt == 0 && mbedtls_mpi_get_bit(&TB, 0) == 0) {
   1768         ret = mbedtls_mpi_copy(G, A);
   1769         goto cleanup;
   1770     }
   1771 
   1772     if (lzt < lz) {
   1773         lz = lzt;
   1774     }
   1775 
   1776     TA.s = TB.s = 1;
   1777 
   1778     /* We mostly follow the procedure described in HAC 14.54, but with some
   1779      * minor differences:
   1780      * - Sequences of multiplications or divisions by 2 are grouped into a
   1781      *   single shift operation.
   1782      * - The procedure in HAC assumes that 0 < TB <= TA.
   1783      *     - The condition TB <= TA is not actually necessary for correctness.
   1784      *       TA and TB have symmetric roles except for the loop termination
   1785      *       condition, and the shifts at the beginning of the loop body
   1786      *       remove any significance from the ordering of TA vs TB before
   1787      *       the shifts.
   1788      *     - If TA = 0, the loop goes through 0 iterations and the result is
   1789      *       correctly TB.
   1790      *     - The case TB = 0 was short-circuited above.
   1791      *
   1792      * For the correctness proof below, decompose the original values of
   1793      * A and B as
   1794      *   A = sa * 2^a * A' with A'=0 or A' odd, and sa = +-1
   1795      *   B = sb * 2^b * B' with B'=0 or B' odd, and sb = +-1
   1796      * Then gcd(A, B) = 2^{min(a,b)} * gcd(A',B'),
   1797      * and gcd(A',B') is odd or 0.
   1798      *
   1799      * At the beginning, we have TA = |A| and TB = |B| so gcd(A,B) = gcd(TA,TB).
   1800      * The code maintains the following invariant:
   1801      *     gcd(A,B) = 2^k * gcd(TA,TB) for some k   (I)
   1802      */
   1803 
   1804     /* Proof that the loop terminates:
   1805      * At each iteration, either the right-shift by 1 is made on a nonzero
   1806      * value and the nonnegative integer bitlen(TA) + bitlen(TB) decreases
   1807      * by at least 1, or the right-shift by 1 is made on zero and then
   1808      * TA becomes 0 which ends the loop (TB cannot be 0 if it is right-shifted
   1809      * since in that case TB is calculated from TB-TA with the condition TB>TA).
   1810      */
   1811     while (mbedtls_mpi_cmp_int(&TA, 0) != 0) {
   1812         /* Divisions by 2 preserve the invariant (I). */
   1813         MBEDTLS_MPI_CHK(mbedtls_mpi_shift_r(&TA, mbedtls_mpi_lsb(&TA)));
   1814         MBEDTLS_MPI_CHK(mbedtls_mpi_shift_r(&TB, mbedtls_mpi_lsb(&TB)));
   1815 
   1816         /* Set either TA or TB to |TA-TB|/2. Since TA and TB are both odd,
   1817          * TA-TB is even so the division by 2 has an integer result.
   1818          * Invariant (I) is preserved since any odd divisor of both TA and TB
   1819          * also divides |TA-TB|/2, and any odd divisor of both TA and |TA-TB|/2
   1820          * also divides TB, and any odd divisor of both TB and |TA-TB|/2 also
   1821          * divides TA.
   1822          */
   1823         if (mbedtls_mpi_cmp_mpi(&TA, &TB) >= 0) {
   1824             MBEDTLS_MPI_CHK(mbedtls_mpi_sub_abs(&TA, &TA, &TB));
   1825             MBEDTLS_MPI_CHK(mbedtls_mpi_shift_r(&TA, 1));
   1826         } else {
   1827             MBEDTLS_MPI_CHK(mbedtls_mpi_sub_abs(&TB, &TB, &TA));
   1828             MBEDTLS_MPI_CHK(mbedtls_mpi_shift_r(&TB, 1));
   1829         }
   1830         /* Note that one of TA or TB is still odd. */
   1831     }
   1832 
   1833     /* By invariant (I), gcd(A,B) = 2^k * gcd(TA,TB) for some k.
   1834      * At the loop exit, TA = 0, so gcd(TA,TB) = TB.
   1835      * - If there was at least one loop iteration, then one of TA or TB is odd,
   1836      *   and TA = 0, so TB is odd and gcd(TA,TB) = gcd(A',B'). In this case,
   1837      *   lz = min(a,b) so gcd(A,B) = 2^lz * TB.
   1838      * - If there was no loop iteration, then A was 0, and gcd(A,B) = B.
   1839      *   In this case, lz = 0 and B = TB so gcd(A,B) = B = 2^lz * TB as well.
   1840      */
   1841 
   1842     MBEDTLS_MPI_CHK(mbedtls_mpi_shift_l(&TB, lz));
   1843     MBEDTLS_MPI_CHK(mbedtls_mpi_copy(G, &TB));
   1844 
   1845 cleanup:
   1846 
   1847     mbedtls_mpi_free(&TA); mbedtls_mpi_free(&TB);
   1848 
   1849     return ret;
   1850 }
   1851 
   1852 /*
   1853  * Fill X with size bytes of random.
   1854  * The bytes returned from the RNG are used in a specific order which
   1855  * is suitable for deterministic ECDSA (see the specification of
   1856  * mbedtls_mpi_random() and the implementation in mbedtls_mpi_fill_random()).
   1857  */
   1858 int mbedtls_mpi_fill_random(mbedtls_mpi *X, size_t size,
   1859                             int (*f_rng)(void *, unsigned char *, size_t),
   1860                             void *p_rng)
   1861 {
   1862     int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
   1863     const size_t limbs = CHARS_TO_LIMBS(size);
   1864 
   1865     /* Ensure that target MPI has exactly the necessary number of limbs */
   1866     MBEDTLS_MPI_CHK(mbedtls_mpi_resize_clear(X, limbs));
   1867     if (size == 0) {
   1868         return 0;
   1869     }
   1870 
   1871     ret = mbedtls_mpi_core_fill_random(X->p, X->n, size, f_rng, p_rng);
   1872 
   1873 cleanup:
   1874     return ret;
   1875 }
   1876 
   1877 int mbedtls_mpi_random(mbedtls_mpi *X,
   1878                        mbedtls_mpi_sint min,
   1879                        const mbedtls_mpi *N,
   1880                        int (*f_rng)(void *, unsigned char *, size_t),
   1881                        void *p_rng)
   1882 {
   1883     if (min < 0) {
   1884         return MBEDTLS_ERR_MPI_BAD_INPUT_DATA;
   1885     }
   1886     if (mbedtls_mpi_cmp_int(N, min) <= 0) {
   1887         return MBEDTLS_ERR_MPI_BAD_INPUT_DATA;
   1888     }
   1889 
   1890     /* Ensure that target MPI has exactly the same number of limbs
   1891      * as the upper bound, even if the upper bound has leading zeros.
   1892      * This is necessary for mbedtls_mpi_core_random. */
   1893     int ret = mbedtls_mpi_resize_clear(X, N->n);
   1894     if (ret != 0) {
   1895         return ret;
   1896     }
   1897 
   1898     return mbedtls_mpi_core_random(X->p, min, N->p, X->n, f_rng, p_rng);
   1899 }
   1900 
   1901 /*
   1902  * Modular inverse: X = A^-1 mod N  (HAC 14.61 / 14.64)
   1903  */
   1904 int mbedtls_mpi_inv_mod(mbedtls_mpi *X, const mbedtls_mpi *A, const mbedtls_mpi *N)
   1905 {
   1906     int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
   1907     mbedtls_mpi G, TA, TU, U1, U2, TB, TV, V1, V2;
   1908 
   1909     if (mbedtls_mpi_cmp_int(N, 1) <= 0) {
   1910         return MBEDTLS_ERR_MPI_BAD_INPUT_DATA;
   1911     }
   1912 
   1913     mbedtls_mpi_init(&TA); mbedtls_mpi_init(&TU); mbedtls_mpi_init(&U1); mbedtls_mpi_init(&U2);
   1914     mbedtls_mpi_init(&G); mbedtls_mpi_init(&TB); mbedtls_mpi_init(&TV);
   1915     mbedtls_mpi_init(&V1); mbedtls_mpi_init(&V2);
   1916 
   1917     MBEDTLS_MPI_CHK(mbedtls_mpi_gcd(&G, A, N));
   1918 
   1919     if (mbedtls_mpi_cmp_int(&G, 1) != 0) {
   1920         ret = MBEDTLS_ERR_MPI_NOT_ACCEPTABLE;
   1921         goto cleanup;
   1922     }
   1923 
   1924     MBEDTLS_MPI_CHK(mbedtls_mpi_mod_mpi(&TA, A, N));
   1925     MBEDTLS_MPI_CHK(mbedtls_mpi_copy(&TU, &TA));
   1926     MBEDTLS_MPI_CHK(mbedtls_mpi_copy(&TB, N));
   1927     MBEDTLS_MPI_CHK(mbedtls_mpi_copy(&TV, N));
   1928 
   1929     MBEDTLS_MPI_CHK(mbedtls_mpi_lset(&U1, 1));
   1930     MBEDTLS_MPI_CHK(mbedtls_mpi_lset(&U2, 0));
   1931     MBEDTLS_MPI_CHK(mbedtls_mpi_lset(&V1, 0));
   1932     MBEDTLS_MPI_CHK(mbedtls_mpi_lset(&V2, 1));
   1933 
   1934     do {
   1935         while ((TU.p[0] & 1) == 0) {
   1936             MBEDTLS_MPI_CHK(mbedtls_mpi_shift_r(&TU, 1));
   1937 
   1938             if ((U1.p[0] & 1) != 0 || (U2.p[0] & 1) != 0) {
   1939                 MBEDTLS_MPI_CHK(mbedtls_mpi_add_mpi(&U1, &U1, &TB));
   1940                 MBEDTLS_MPI_CHK(mbedtls_mpi_sub_mpi(&U2, &U2, &TA));
   1941             }
   1942 
   1943             MBEDTLS_MPI_CHK(mbedtls_mpi_shift_r(&U1, 1));
   1944             MBEDTLS_MPI_CHK(mbedtls_mpi_shift_r(&U2, 1));
   1945         }
   1946 
   1947         while ((TV.p[0] & 1) == 0) {
   1948             MBEDTLS_MPI_CHK(mbedtls_mpi_shift_r(&TV, 1));
   1949 
   1950             if ((V1.p[0] & 1) != 0 || (V2.p[0] & 1) != 0) {
   1951                 MBEDTLS_MPI_CHK(mbedtls_mpi_add_mpi(&V1, &V1, &TB));
   1952                 MBEDTLS_MPI_CHK(mbedtls_mpi_sub_mpi(&V2, &V2, &TA));
   1953             }
   1954 
   1955             MBEDTLS_MPI_CHK(mbedtls_mpi_shift_r(&V1, 1));
   1956             MBEDTLS_MPI_CHK(mbedtls_mpi_shift_r(&V2, 1));
   1957         }
   1958 
   1959         if (mbedtls_mpi_cmp_mpi(&TU, &TV) >= 0) {
   1960             MBEDTLS_MPI_CHK(mbedtls_mpi_sub_mpi(&TU, &TU, &TV));
   1961             MBEDTLS_MPI_CHK(mbedtls_mpi_sub_mpi(&U1, &U1, &V1));
   1962             MBEDTLS_MPI_CHK(mbedtls_mpi_sub_mpi(&U2, &U2, &V2));
   1963         } else {
   1964             MBEDTLS_MPI_CHK(mbedtls_mpi_sub_mpi(&TV, &TV, &TU));
   1965             MBEDTLS_MPI_CHK(mbedtls_mpi_sub_mpi(&V1, &V1, &U1));
   1966             MBEDTLS_MPI_CHK(mbedtls_mpi_sub_mpi(&V2, &V2, &U2));
   1967         }
   1968     } while (mbedtls_mpi_cmp_int(&TU, 0) != 0);
   1969 
   1970     while (mbedtls_mpi_cmp_int(&V1, 0) < 0) {
   1971         MBEDTLS_MPI_CHK(mbedtls_mpi_add_mpi(&V1, &V1, N));
   1972     }
   1973 
   1974     while (mbedtls_mpi_cmp_mpi(&V1, N) >= 0) {
   1975         MBEDTLS_MPI_CHK(mbedtls_mpi_sub_mpi(&V1, &V1, N));
   1976     }
   1977 
   1978     MBEDTLS_MPI_CHK(mbedtls_mpi_copy(X, &V1));
   1979 
   1980 cleanup:
   1981 
   1982     mbedtls_mpi_free(&TA); mbedtls_mpi_free(&TU); mbedtls_mpi_free(&U1); mbedtls_mpi_free(&U2);
   1983     mbedtls_mpi_free(&G); mbedtls_mpi_free(&TB); mbedtls_mpi_free(&TV);
   1984     mbedtls_mpi_free(&V1); mbedtls_mpi_free(&V2);
   1985 
   1986     return ret;
   1987 }
   1988 
   1989 #if defined(MBEDTLS_GENPRIME)
   1990 
   1991 /* Gaps between primes, starting at 3. https://oeis.org/A001223 */
   1992 static const unsigned char small_prime_gaps[] = {
   1993     2, 2, 4, 2, 4, 2, 4, 6,
   1994     2, 6, 4, 2, 4, 6, 6, 2,
   1995     6, 4, 2, 6, 4, 6, 8, 4,
   1996     2, 4, 2, 4, 14, 4, 6, 2,
   1997     10, 2, 6, 6, 4, 6, 6, 2,
   1998     10, 2, 4, 2, 12, 12, 4, 2,
   1999     4, 6, 2, 10, 6, 6, 6, 2,
   2000     6, 4, 2, 10, 14, 4, 2, 4,
   2001     14, 6, 10, 2, 4, 6, 8, 6,
   2002     6, 4, 6, 8, 4, 8, 10, 2,
   2003     10, 2, 6, 4, 6, 8, 4, 2,
   2004     4, 12, 8, 4, 8, 4, 6, 12,
   2005     2, 18, 6, 10, 6, 6, 2, 6,
   2006     10, 6, 6, 2, 6, 6, 4, 2,
   2007     12, 10, 2, 4, 6, 6, 2, 12,
   2008     4, 6, 8, 10, 8, 10, 8, 6,
   2009     6, 4, 8, 6, 4, 8, 4, 14,
   2010     10, 12, 2, 10, 2, 4, 2, 10,
   2011     14, 4, 2, 4, 14, 4, 2, 4,
   2012     20, 4, 8, 10, 8, 4, 6, 6,
   2013     14, 4, 6, 6, 8, 6, /*reaches 997*/
   2014     0 /* the last entry is effectively unused */
   2015 };
   2016 
   2017 /*
   2018  * Small divisors test (X must be positive)
   2019  *
   2020  * Return values:
   2021  * 0: no small factor (possible prime, more tests needed)
   2022  * 1: certain prime
   2023  * MBEDTLS_ERR_MPI_NOT_ACCEPTABLE: certain non-prime
   2024  * other negative: error
   2025  */
   2026 static int mpi_check_small_factors(const mbedtls_mpi *X)
   2027 {
   2028     int ret = 0;
   2029     size_t i;
   2030     mbedtls_mpi_uint r;
   2031     unsigned p = 3; /* The first odd prime */
   2032 
   2033     if ((X->p[0] & 1) == 0) {
   2034         return MBEDTLS_ERR_MPI_NOT_ACCEPTABLE;
   2035     }
   2036 
   2037     for (i = 0; i < sizeof(small_prime_gaps); p += small_prime_gaps[i], i++) {
   2038         MBEDTLS_MPI_CHK(mbedtls_mpi_mod_int(&r, X, p));
   2039         if (r == 0) {
   2040             if (mbedtls_mpi_cmp_int(X, p) == 0) {
   2041                 return 1;
   2042             } else {
   2043                 return MBEDTLS_ERR_MPI_NOT_ACCEPTABLE;
   2044             }
   2045         }
   2046     }
   2047 
   2048 cleanup:
   2049     return ret;
   2050 }
   2051 
   2052 /*
   2053  * Miller-Rabin pseudo-primality test  (HAC 4.24)
   2054  */
   2055 static int mpi_miller_rabin(const mbedtls_mpi *X, size_t rounds,
   2056                             int (*f_rng)(void *, unsigned char *, size_t),
   2057                             void *p_rng)
   2058 {
   2059     int ret, count;
   2060     size_t i, j, k, s;
   2061     mbedtls_mpi W, R, T, A, RR;
   2062 
   2063     mbedtls_mpi_init(&W); mbedtls_mpi_init(&R);
   2064     mbedtls_mpi_init(&T); mbedtls_mpi_init(&A);
   2065     mbedtls_mpi_init(&RR);
   2066 
   2067     /*
   2068      * W = |X| - 1
   2069      * R = W >> lsb( W )
   2070      */
   2071     MBEDTLS_MPI_CHK(mbedtls_mpi_sub_int(&W, X, 1));
   2072     s = mbedtls_mpi_lsb(&W);
   2073     MBEDTLS_MPI_CHK(mbedtls_mpi_copy(&R, &W));
   2074     MBEDTLS_MPI_CHK(mbedtls_mpi_shift_r(&R, s));
   2075 
   2076     for (i = 0; i < rounds; i++) {
   2077         /*
   2078          * pick a random A, 1 < A < |X| - 1
   2079          */
   2080         count = 0;
   2081         do {
   2082             MBEDTLS_MPI_CHK(mbedtls_mpi_fill_random(&A, X->n * ciL, f_rng, p_rng));
   2083 
   2084             j = mbedtls_mpi_bitlen(&A);
   2085             k = mbedtls_mpi_bitlen(&W);
   2086             if (j > k) {
   2087                 A.p[A.n - 1] &= ((mbedtls_mpi_uint) 1 << (k - (A.n - 1) * biL - 1)) - 1;
   2088             }
   2089 
   2090             if (count++ > 30) {
   2091                 ret = MBEDTLS_ERR_MPI_NOT_ACCEPTABLE;
   2092                 goto cleanup;
   2093             }
   2094 
   2095         } while (mbedtls_mpi_cmp_mpi(&A, &W) >= 0 ||
   2096                  mbedtls_mpi_cmp_int(&A, 1)  <= 0);
   2097 
   2098         /*
   2099          * A = A^R mod |X|
   2100          */
   2101         MBEDTLS_MPI_CHK(mbedtls_mpi_exp_mod(&A, &A, &R, X, &RR));
   2102 
   2103         if (mbedtls_mpi_cmp_mpi(&A, &W) == 0 ||
   2104             mbedtls_mpi_cmp_int(&A,  1) == 0) {
   2105             continue;
   2106         }
   2107 
   2108         j = 1;
   2109         while (j < s && mbedtls_mpi_cmp_mpi(&A, &W) != 0) {
   2110             /*
   2111              * A = A * A mod |X|
   2112              */
   2113             MBEDTLS_MPI_CHK(mbedtls_mpi_mul_mpi(&T, &A, &A));
   2114             MBEDTLS_MPI_CHK(mbedtls_mpi_mod_mpi(&A, &T, X));
   2115 
   2116             if (mbedtls_mpi_cmp_int(&A, 1) == 0) {
   2117                 break;
   2118             }
   2119 
   2120             j++;
   2121         }
   2122 
   2123         /*
   2124          * not prime if A != |X| - 1 or A == 1
   2125          */
   2126         if (mbedtls_mpi_cmp_mpi(&A, &W) != 0 ||
   2127             mbedtls_mpi_cmp_int(&A,  1) == 0) {
   2128             ret = MBEDTLS_ERR_MPI_NOT_ACCEPTABLE;
   2129             break;
   2130         }
   2131     }
   2132 
   2133 cleanup:
   2134     mbedtls_mpi_free(&W); mbedtls_mpi_free(&R);
   2135     mbedtls_mpi_free(&T); mbedtls_mpi_free(&A);
   2136     mbedtls_mpi_free(&RR);
   2137 
   2138     return ret;
   2139 }
   2140 
   2141 /*
   2142  * Pseudo-primality test: small factors, then Miller-Rabin
   2143  */
   2144 int mbedtls_mpi_is_prime_ext(const mbedtls_mpi *X, int rounds,
   2145                              int (*f_rng)(void *, unsigned char *, size_t),
   2146                              void *p_rng)
   2147 {
   2148     int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
   2149     mbedtls_mpi XX;
   2150 
   2151     XX.s = 1;
   2152     XX.n = X->n;
   2153     XX.p = X->p;
   2154 
   2155     if (mbedtls_mpi_cmp_int(&XX, 0) == 0 ||
   2156         mbedtls_mpi_cmp_int(&XX, 1) == 0) {
   2157         return MBEDTLS_ERR_MPI_NOT_ACCEPTABLE;
   2158     }
   2159 
   2160     if (mbedtls_mpi_cmp_int(&XX, 2) == 0) {
   2161         return 0;
   2162     }
   2163 
   2164     if ((ret = mpi_check_small_factors(&XX)) != 0) {
   2165         if (ret == 1) {
   2166             return 0;
   2167         }
   2168 
   2169         return ret;
   2170     }
   2171 
   2172     return mpi_miller_rabin(&XX, rounds, f_rng, p_rng);
   2173 }
   2174 
   2175 /*
   2176  * Prime number generation
   2177  *
   2178  * To generate an RSA key in a way recommended by FIPS 186-4, both primes must
   2179  * be either 1024 bits or 1536 bits long, and flags must contain
   2180  * MBEDTLS_MPI_GEN_PRIME_FLAG_LOW_ERR.
   2181  */
   2182 int mbedtls_mpi_gen_prime(mbedtls_mpi *X, size_t nbits, int flags,
   2183                           int (*f_rng)(void *, unsigned char *, size_t),
   2184                           void *p_rng)
   2185 {
   2186 #ifdef MBEDTLS_HAVE_INT64
   2187 // ceil(2^63.5)
   2188 #define CEIL_MAXUINT_DIV_SQRT2 0xb504f333f9de6485ULL
   2189 #else
   2190 // ceil(2^31.5)
   2191 #define CEIL_MAXUINT_DIV_SQRT2 0xb504f334U
   2192 #endif
   2193     int ret = MBEDTLS_ERR_MPI_NOT_ACCEPTABLE;
   2194     size_t k, n;
   2195     int rounds;
   2196     mbedtls_mpi_uint r;
   2197     mbedtls_mpi Y;
   2198 
   2199     if (nbits < 3 || nbits > MBEDTLS_MPI_MAX_BITS) {
   2200         return MBEDTLS_ERR_MPI_BAD_INPUT_DATA;
   2201     }
   2202 
   2203     mbedtls_mpi_init(&Y);
   2204 
   2205     n = BITS_TO_LIMBS(nbits);
   2206 
   2207     if ((flags & MBEDTLS_MPI_GEN_PRIME_FLAG_LOW_ERR) == 0) {
   2208         /*
   2209          * 2^-80 error probability, number of rounds chosen per HAC, table 4.4
   2210          */
   2211         rounds = ((nbits >= 1300) ?  2 : (nbits >=  850) ?  3 :
   2212                   (nbits >=  650) ?  4 : (nbits >=  350) ?  8 :
   2213                   (nbits >=  250) ? 12 : (nbits >=  150) ? 18 : 27);
   2214     } else {
   2215         /*
   2216          * 2^-100 error probability, number of rounds computed based on HAC,
   2217          * fact 4.48
   2218          */
   2219         rounds = ((nbits >= 1450) ?  4 : (nbits >=  1150) ?  5 :
   2220                   (nbits >= 1000) ?  6 : (nbits >=   850) ?  7 :
   2221                   (nbits >=  750) ?  8 : (nbits >=   500) ? 13 :
   2222                   (nbits >=  250) ? 28 : (nbits >=   150) ? 40 : 51);
   2223     }
   2224 
   2225     while (1) {
   2226         MBEDTLS_MPI_CHK(mbedtls_mpi_fill_random(X, n * ciL, f_rng, p_rng));
   2227         /* make sure generated number is at least (nbits-1)+0.5 bits (FIPS 186-4 §B.3.3 steps 4.4, 5.5) */
   2228         if (X->p[n-1] < CEIL_MAXUINT_DIV_SQRT2) {
   2229             continue;
   2230         }
   2231 
   2232         k = n * biL;
   2233         if (k > nbits) {
   2234             MBEDTLS_MPI_CHK(mbedtls_mpi_shift_r(X, k - nbits));
   2235         }
   2236         X->p[0] |= 1;
   2237 
   2238         if ((flags & MBEDTLS_MPI_GEN_PRIME_FLAG_DH) == 0) {
   2239             ret = mbedtls_mpi_is_prime_ext(X, rounds, f_rng, p_rng);
   2240 
   2241             if (ret != MBEDTLS_ERR_MPI_NOT_ACCEPTABLE) {
   2242                 goto cleanup;
   2243             }
   2244         } else {
   2245             /*
   2246              * A necessary condition for Y and X = 2Y + 1 to be prime
   2247              * is X = 2 mod 3 (which is equivalent to Y = 2 mod 3).
   2248              * Make sure it is satisfied, while keeping X = 3 mod 4
   2249              */
   2250 
   2251             X->p[0] |= 2;
   2252 
   2253             MBEDTLS_MPI_CHK(mbedtls_mpi_mod_int(&r, X, 3));
   2254             if (r == 0) {
   2255                 MBEDTLS_MPI_CHK(mbedtls_mpi_add_int(X, X, 8));
   2256             } else if (r == 1) {
   2257                 MBEDTLS_MPI_CHK(mbedtls_mpi_add_int(X, X, 4));
   2258             }
   2259 
   2260             /* Set Y = (X-1) / 2, which is X / 2 because X is odd */
   2261             MBEDTLS_MPI_CHK(mbedtls_mpi_copy(&Y, X));
   2262             MBEDTLS_MPI_CHK(mbedtls_mpi_shift_r(&Y, 1));
   2263 
   2264             while (1) {
   2265                 /*
   2266                  * First, check small factors for X and Y
   2267                  * before doing Miller-Rabin on any of them
   2268                  */
   2269                 if ((ret = mpi_check_small_factors(X)) == 0 &&
   2270                     (ret = mpi_check_small_factors(&Y)) == 0 &&
   2271                     (ret = mpi_miller_rabin(X, rounds, f_rng, p_rng))
   2272                     == 0 &&
   2273                     (ret = mpi_miller_rabin(&Y, rounds, f_rng, p_rng))
   2274                     == 0) {
   2275                     goto cleanup;
   2276                 }
   2277 
   2278                 if (ret != MBEDTLS_ERR_MPI_NOT_ACCEPTABLE) {
   2279                     goto cleanup;
   2280                 }
   2281 
   2282                 /*
   2283                  * Next candidates. We want to preserve Y = (X-1) / 2 and
   2284                  * Y = 1 mod 2 and Y = 2 mod 3 (eq X = 3 mod 4 and X = 2 mod 3)
   2285                  * so up Y by 6 and X by 12.
   2286                  */
   2287                 MBEDTLS_MPI_CHK(mbedtls_mpi_add_int(X,  X, 12));
   2288                 MBEDTLS_MPI_CHK(mbedtls_mpi_add_int(&Y, &Y, 6));
   2289             }
   2290         }
   2291     }
   2292 
   2293 cleanup:
   2294 
   2295     mbedtls_mpi_free(&Y);
   2296 
   2297     return ret;
   2298 }
   2299 
   2300 #endif /* MBEDTLS_GENPRIME */
   2301 
   2302 #if defined(MBEDTLS_SELF_TEST)
   2303 
   2304 #define GCD_PAIR_COUNT  3
   2305 
   2306 static const int gcd_pairs[GCD_PAIR_COUNT][3] =
   2307 {
   2308     { 693, 609, 21 },
   2309     { 1764, 868, 28 },
   2310     { 768454923, 542167814, 1 }
   2311 };
   2312 
   2313 /*
   2314  * Checkup routine
   2315  */
   2316 int mbedtls_mpi_self_test(int verbose)
   2317 {
   2318     int ret, i;
   2319     mbedtls_mpi A, E, N, X, Y, U, V;
   2320 
   2321     mbedtls_mpi_init(&A); mbedtls_mpi_init(&E); mbedtls_mpi_init(&N); mbedtls_mpi_init(&X);
   2322     mbedtls_mpi_init(&Y); mbedtls_mpi_init(&U); mbedtls_mpi_init(&V);
   2323 
   2324     MBEDTLS_MPI_CHK(mbedtls_mpi_read_string(&A, 16,
   2325                                             "EFE021C2645FD1DC586E69184AF4A31E" \
   2326                                             "D5F53E93B5F123FA41680867BA110131" \
   2327                                             "944FE7952E2517337780CB0DB80E61AA" \
   2328                                             "E7C8DDC6C5C6AADEB34EB38A2F40D5E6"));
   2329 
   2330     MBEDTLS_MPI_CHK(mbedtls_mpi_read_string(&E, 16,
   2331                                             "B2E7EFD37075B9F03FF989C7C5051C20" \
   2332                                             "34D2A323810251127E7BF8625A4F49A5" \
   2333                                             "F3E27F4DA8BD59C47D6DAABA4C8127BD" \
   2334                                             "5B5C25763222FEFCCFC38B832366C29E"));
   2335 
   2336     MBEDTLS_MPI_CHK(mbedtls_mpi_read_string(&N, 16,
   2337                                             "0066A198186C18C10B2F5ED9B522752A" \
   2338                                             "9830B69916E535C8F047518A889A43A5" \
   2339                                             "94B6BED27A168D31D4A52F88925AA8F5"));
   2340 
   2341     MBEDTLS_MPI_CHK(mbedtls_mpi_mul_mpi(&X, &A, &N));
   2342 
   2343     MBEDTLS_MPI_CHK(mbedtls_mpi_read_string(&U, 16,
   2344                                             "602AB7ECA597A3D6B56FF9829A5E8B85" \
   2345                                             "9E857EA95A03512E2BAE7391688D264A" \
   2346                                             "A5663B0341DB9CCFD2C4C5F421FEC814" \
   2347                                             "8001B72E848A38CAE1C65F78E56ABDEF" \
   2348                                             "E12D3C039B8A02D6BE593F0BBBDA56F1" \
   2349                                             "ECF677152EF804370C1A305CAF3B5BF1" \
   2350                                             "30879B56C61DE584A0F53A2447A51E"));
   2351 
   2352     if (verbose != 0) {
   2353         mbedtls_printf("  MPI test #1 (mul_mpi): ");
   2354     }
   2355 
   2356     if (mbedtls_mpi_cmp_mpi(&X, &U) != 0) {
   2357         if (verbose != 0) {
   2358             mbedtls_printf("failed\n");
   2359         }
   2360 
   2361         ret = 1;
   2362         goto cleanup;
   2363     }
   2364 
   2365     if (verbose != 0) {
   2366         mbedtls_printf("passed\n");
   2367     }
   2368 
   2369     MBEDTLS_MPI_CHK(mbedtls_mpi_div_mpi(&X, &Y, &A, &N));
   2370 
   2371     MBEDTLS_MPI_CHK(mbedtls_mpi_read_string(&U, 16,
   2372                                             "256567336059E52CAE22925474705F39A94"));
   2373 
   2374     MBEDTLS_MPI_CHK(mbedtls_mpi_read_string(&V, 16,
   2375                                             "6613F26162223DF488E9CD48CC132C7A" \
   2376                                             "0AC93C701B001B092E4E5B9F73BCD27B" \
   2377                                             "9EE50D0657C77F374E903CDFA4C642"));
   2378 
   2379     if (verbose != 0) {
   2380         mbedtls_printf("  MPI test #2 (div_mpi): ");
   2381     }
   2382 
   2383     if (mbedtls_mpi_cmp_mpi(&X, &U) != 0 ||
   2384         mbedtls_mpi_cmp_mpi(&Y, &V) != 0) {
   2385         if (verbose != 0) {
   2386             mbedtls_printf("failed\n");
   2387         }
   2388 
   2389         ret = 1;
   2390         goto cleanup;
   2391     }
   2392 
   2393     if (verbose != 0) {
   2394         mbedtls_printf("passed\n");
   2395     }
   2396 
   2397     MBEDTLS_MPI_CHK(mbedtls_mpi_exp_mod(&X, &A, &E, &N, NULL));
   2398 
   2399     MBEDTLS_MPI_CHK(mbedtls_mpi_read_string(&U, 16,
   2400                                             "36E139AEA55215609D2816998ED020BB" \
   2401                                             "BD96C37890F65171D948E9BC7CBAA4D9" \
   2402                                             "325D24D6A3C12710F10A09FA08AB87"));
   2403 
   2404     if (verbose != 0) {
   2405         mbedtls_printf("  MPI test #3 (exp_mod): ");
   2406     }
   2407 
   2408     if (mbedtls_mpi_cmp_mpi(&X, &U) != 0) {
   2409         if (verbose != 0) {
   2410             mbedtls_printf("failed\n");
   2411         }
   2412 
   2413         ret = 1;
   2414         goto cleanup;
   2415     }
   2416 
   2417     if (verbose != 0) {
   2418         mbedtls_printf("passed\n");
   2419     }
   2420 
   2421     MBEDTLS_MPI_CHK(mbedtls_mpi_inv_mod(&X, &A, &N));
   2422 
   2423     MBEDTLS_MPI_CHK(mbedtls_mpi_read_string(&U, 16,
   2424                                             "003A0AAEDD7E784FC07D8F9EC6E3BFD5" \
   2425                                             "C3DBA76456363A10869622EAC2DD84EC" \
   2426                                             "C5B8A74DAC4D09E03B5E0BE779F2DF61"));
   2427 
   2428     if (verbose != 0) {
   2429         mbedtls_printf("  MPI test #4 (inv_mod): ");
   2430     }
   2431 
   2432     if (mbedtls_mpi_cmp_mpi(&X, &U) != 0) {
   2433         if (verbose != 0) {
   2434             mbedtls_printf("failed\n");
   2435         }
   2436 
   2437         ret = 1;
   2438         goto cleanup;
   2439     }
   2440 
   2441     if (verbose != 0) {
   2442         mbedtls_printf("passed\n");
   2443     }
   2444 
   2445     if (verbose != 0) {
   2446         mbedtls_printf("  MPI test #5 (simple gcd): ");
   2447     }
   2448 
   2449     for (i = 0; i < GCD_PAIR_COUNT; i++) {
   2450         MBEDTLS_MPI_CHK(mbedtls_mpi_lset(&X, gcd_pairs[i][0]));
   2451         MBEDTLS_MPI_CHK(mbedtls_mpi_lset(&Y, gcd_pairs[i][1]));
   2452 
   2453         MBEDTLS_MPI_CHK(mbedtls_mpi_gcd(&A, &X, &Y));
   2454 
   2455         if (mbedtls_mpi_cmp_int(&A, gcd_pairs[i][2]) != 0) {
   2456             if (verbose != 0) {
   2457                 mbedtls_printf("failed at %d\n", i);
   2458             }
   2459 
   2460             ret = 1;
   2461             goto cleanup;
   2462         }
   2463     }
   2464 
   2465     if (verbose != 0) {
   2466         mbedtls_printf("passed\n");
   2467     }
   2468 
   2469 cleanup:
   2470 
   2471     if (ret != 0 && verbose != 0) {
   2472         mbedtls_printf("Unexpected error, return code = %08X\n", (unsigned int) ret);
   2473     }
   2474 
   2475     mbedtls_mpi_free(&A); mbedtls_mpi_free(&E); mbedtls_mpi_free(&N); mbedtls_mpi_free(&X);
   2476     mbedtls_mpi_free(&Y); mbedtls_mpi_free(&U); mbedtls_mpi_free(&V);
   2477 
   2478     if (verbose != 0) {
   2479         mbedtls_printf("\n");
   2480     }
   2481 
   2482     return ret;
   2483 }
   2484 
   2485 #endif /* MBEDTLS_SELF_TEST */
   2486 
   2487 #endif /* MBEDTLS_BIGNUM_C */