LCOV - code coverage report
Current view: top level - externals/mbedtls/library - bignum.c (source / functions) Hit Total Coverage
Test: lcov.info Lines: 730 961 76.0 %
Date: 2024-09-16 20:15:30 Functions: 44 55 80.0 %
Legend: Lines: hit not hit | Branches: + taken - not taken # not executed Branches: 390 730 53.4 %

           Branch data     Line data    Source code
       1                 :            : /*
       2                 :            :  *  Multi-precision integer library
       3                 :            :  *
       4                 :            :  *  Copyright The Mbed TLS Contributors
       5                 :            :  *  SPDX-License-Identifier: Apache-2.0
       6                 :            :  *
       7                 :            :  *  Licensed under the Apache License, Version 2.0 (the "License"); you may
       8                 :            :  *  not use this file except in compliance with the License.
       9                 :            :  *  You may obtain a copy of the License at
      10                 :            :  *
      11                 :            :  *  http://www.apache.org/licenses/LICENSE-2.0
      12                 :            :  *
      13                 :            :  *  Unless required by applicable law or agreed to in writing, software
      14                 :            :  *  distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
      15                 :            :  *  WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
      16                 :            :  *  See the License for the specific language governing permissions and
      17                 :            :  *  limitations under the License.
      18                 :            :  */
      19                 :            : 
      20                 :            : /*
      21                 :            :  *  The following sources were referenced in the design of this Multi-precision
      22                 :            :  *  Integer library:
      23                 :            :  *
      24                 :            :  *  [1] Handbook of Applied Cryptography - 1997
      25                 :            :  *      Menezes, van Oorschot and Vanstone
      26                 :            :  *
      27                 :            :  *  [2] Multi-Precision Math
      28                 :            :  *      Tom St Denis
      29                 :            :  *      https://github.com/libtom/libtommath/blob/develop/tommath.pdf
      30                 :            :  *
      31                 :            :  *  [3] GNU Multi-Precision Arithmetic Library
      32                 :            :  *      https://gmplib.org/manual/index.html
      33                 :            :  *
      34                 :            :  */
      35                 :            : 
      36                 :            : #include "common.h"
      37                 :            : 
      38                 :            : #if defined(MBEDTLS_BIGNUM_C)
      39                 :            : 
      40                 :            : #include "mbedtls/bignum.h"
      41                 :            : #include "bn_mul.h"
      42                 :            : #include "mbedtls/platform_util.h"
      43                 :            : #include "mbedtls/error.h"
      44                 :            : #include "constant_time_internal.h"
      45                 :            : 
      46                 :            : #include <limits.h>
      47                 :            : #include <string.h>
      48                 :            : 
      49                 :            : #if defined(MBEDTLS_PLATFORM_C)
      50                 :            : #include "mbedtls/platform.h"
      51                 :            : #else
      52                 :            : #include <stdio.h>
      53                 :            : #include <stdlib.h>
      54                 :            : #define mbedtls_printf     printf
      55                 :            : #define mbedtls_calloc    calloc
      56                 :            : #define mbedtls_free       free
      57                 :            : #endif
      58                 :            : 
      59                 :            : #define MPI_VALIDATE_RET( cond )                                       \
      60                 :            :     MBEDTLS_INTERNAL_VALIDATE_RET( cond, MBEDTLS_ERR_MPI_BAD_INPUT_DATA )
      61                 :            : #define MPI_VALIDATE( cond )                                           \
      62                 :            :     MBEDTLS_INTERNAL_VALIDATE( cond )
      63                 :            : 
      64                 :            : #define ciL    (sizeof(mbedtls_mpi_uint))         /* chars in limb  */
      65                 :            : #define biL    (ciL << 3)               /* bits  in limb  */
      66                 :            : #define biH    (ciL << 2)               /* half limb size */
      67                 :            : 
      68                 :            : #define MPI_SIZE_T_MAX  ( (size_t) -1 ) /* SIZE_T_MAX is not standard */
      69                 :            : 
      70                 :            : /*
      71                 :            :  * Convert between bits/chars and number of limbs
      72                 :            :  * Divide first in order to avoid potential overflows
      73                 :            :  */
      74                 :            : #define BITS_TO_LIMBS(i)  ( (i) / biL + ( (i) % biL != 0 ) )
      75                 :            : #define CHARS_TO_LIMBS(i) ( (i) / ciL + ( (i) % ciL != 0 ) )
      76                 :            : 
      77                 :            : /* Implementation that should never be optimized out by the compiler */
      78                 :     313409 : static void mbedtls_mpi_zeroize( mbedtls_mpi_uint *v, size_t n )
      79                 :            : {
      80                 :     313409 :     mbedtls_platform_zeroize( v, ciL * n );
      81                 :     313409 : }
      82                 :            : 
      83                 :            : /*
      84                 :            :  * Initialize one MPI
      85                 :            :  */
      86                 :     259648 : void mbedtls_mpi_init( mbedtls_mpi *X )
      87                 :            : {
      88                 :     259648 :     MPI_VALIDATE( X != NULL );
      89                 :            : 
      90                 :     259648 :     X->s = 1;
      91                 :     259648 :     X->n = 0;
      92                 :     259648 :     X->p = NULL;
      93                 :     259648 : }
      94                 :            : 
      95                 :            : /*
      96                 :            :  * Unallocate one MPI
      97                 :            :  */
      98                 :     258730 : void mbedtls_mpi_free( mbedtls_mpi *X )
      99                 :            : {
     100         [ +  - ]:     258730 :     if( X == NULL )
     101                 :            :         return;
     102                 :            : 
     103         [ +  + ]:     258730 :     if( X->p != NULL )
     104                 :            :     {
     105                 :     189532 :         mbedtls_mpi_zeroize( X->p, X->n );
     106                 :     189532 :         mbedtls_free( X->p );
     107                 :            :     }
     108                 :            : 
     109                 :     258730 :     X->s = 1;
     110                 :     258730 :     X->n = 0;
     111                 :     258730 :     X->p = NULL;
     112                 :            : }
     113                 :            : 
     114                 :            : /*
     115                 :            :  * Enlarge to the specified number of limbs
     116                 :            :  */
     117                 :    2089440 : int mbedtls_mpi_grow( mbedtls_mpi *X, size_t nblimbs )
     118                 :            : {
     119                 :    2089440 :     mbedtls_mpi_uint *p;
     120                 :    2089440 :     MPI_VALIDATE_RET( X != NULL );
     121                 :            : 
     122         [ +  - ]:    2089440 :     if( nblimbs > MBEDTLS_MPI_MAX_LIMBS )
     123                 :            :         return( MBEDTLS_ERR_MPI_ALLOC_FAILED );
     124                 :            : 
     125         [ +  + ]:    2089440 :     if( X->n < nblimbs )
     126                 :            :     {
     127         [ +  - ]:     313209 :         if( ( p = (mbedtls_mpi_uint*)mbedtls_calloc( nblimbs, ciL ) ) == NULL )
     128                 :            :             return( MBEDTLS_ERR_MPI_ALLOC_FAILED );
     129                 :            : 
     130         [ +  + ]:     313209 :         if( X->p != NULL )
     131                 :            :         {
     132                 :     123677 :             memcpy( p, X->p, X->n * ciL );
     133                 :     123677 :             mbedtls_mpi_zeroize( X->p, X->n );
     134                 :     123677 :             mbedtls_free( X->p );
     135                 :            :         }
     136                 :            : 
     137                 :     313209 :         X->n = nblimbs;
     138                 :     313209 :         X->p = p;
     139                 :            :     }
     140                 :            : 
     141                 :            :     return( 0 );
     142                 :            : }
     143                 :            : 
     144                 :            : /*
     145                 :            :  * Resize down as much as possible,
     146                 :            :  * while keeping at least the specified number of limbs
     147                 :            :  */
     148                 :        200 : int mbedtls_mpi_shrink( mbedtls_mpi *X, size_t nblimbs )
     149                 :            : {
     150                 :        200 :     mbedtls_mpi_uint *p;
     151                 :        200 :     size_t i;
     152                 :        200 :     MPI_VALIDATE_RET( X != NULL );
     153                 :            : 
     154         [ +  - ]:        200 :     if( nblimbs > MBEDTLS_MPI_MAX_LIMBS )
     155                 :            :         return( MBEDTLS_ERR_MPI_ALLOC_FAILED );
     156                 :            : 
     157                 :            :     /* Actually resize up if there are currently fewer than nblimbs limbs. */
     158         [ -  + ]:        200 :     if( X->n <= nblimbs )
     159                 :          0 :         return( mbedtls_mpi_grow( X, nblimbs ) );
     160                 :            :     /* After this point, then X->n > nblimbs and in particular X->n > 0. */
     161                 :            : 
     162         [ +  - ]:       1800 :     for( i = X->n - 1; i > 0; i-- )
     163         [ +  + ]:       1800 :         if( X->p[i] != 0 )
     164                 :            :             break;
     165                 :        200 :     i++;
     166                 :            : 
     167                 :        200 :     if( i < nblimbs )
     168                 :            :         i = nblimbs;
     169                 :            : 
     170         [ +  - ]:        200 :     if( ( p = (mbedtls_mpi_uint*)mbedtls_calloc( i, ciL ) ) == NULL )
     171                 :            :         return( MBEDTLS_ERR_MPI_ALLOC_FAILED );
     172                 :            : 
     173         [ +  - ]:        200 :     if( X->p != NULL )
     174                 :            :     {
     175                 :        200 :         memcpy( p, X->p, i * ciL );
     176                 :        200 :         mbedtls_mpi_zeroize( X->p, X->n );
     177                 :        200 :         mbedtls_free( X->p );
     178                 :            :     }
     179                 :            : 
     180                 :        200 :     X->n = i;
     181                 :        200 :     X->p = p;
     182                 :            : 
     183                 :        200 :     return( 0 );
     184                 :            : }
     185                 :            : 
     186                 :            : /* Resize X to have exactly n limbs and set it to 0. */
     187                 :        106 : static int mbedtls_mpi_resize_clear( mbedtls_mpi *X, size_t limbs )
     188                 :            : {
     189         [ -  + ]:        106 :     if( limbs == 0 )
     190                 :            :     {
     191                 :          0 :         mbedtls_mpi_free( X );
     192                 :          0 :         return( 0 );
     193                 :            :     }
     194         [ -  + ]:        106 :     else if( X->n == limbs )
     195                 :            :     {
     196                 :          0 :         memset( X->p, 0, limbs * ciL );
     197                 :          0 :         X->s = 1;
     198                 :          0 :         return( 0 );
     199                 :            :     }
     200                 :            :     else
     201                 :            :     {
     202                 :        106 :         mbedtls_mpi_free( X );
     203                 :        106 :         return( mbedtls_mpi_grow( X, limbs ) );
     204                 :            :     }
     205                 :            : }
     206                 :            : 
     207                 :            : /*
     208                 :            :  * Copy the contents of Y into X.
     209                 :            :  *
     210                 :            :  * This function is not constant-time. Leading zeros in Y may be removed.
     211                 :            :  *
     212                 :            :  * Ensure that X does not shrink. This is not guaranteed by the public API,
     213                 :            :  * but some code in the bignum module relies on this property, for example
     214                 :            :  * in mbedtls_mpi_exp_mod().
     215                 :            :  */
     216                 :     919048 : int mbedtls_mpi_copy( mbedtls_mpi *X, const mbedtls_mpi *Y )
     217                 :            : {
     218                 :     919048 :     int ret = 0;
     219                 :     919048 :     size_t i;
     220                 :     919048 :     MPI_VALIDATE_RET( X != NULL );
     221                 :     919048 :     MPI_VALIDATE_RET( Y != NULL );
     222                 :            : 
     223         [ +  + ]:     919048 :     if( X == Y )
     224                 :            :         return( 0 );
     225                 :            : 
     226         [ +  + ]:     459746 :     if( Y->n == 0 )
     227                 :            :     {
     228         [ -  + ]:         12 :         if( X->n != 0 )
     229                 :            :         {
     230                 :          0 :             X->s = 1;
     231                 :          0 :             memset( X->p, 0, X->n * ciL );
     232                 :            :         }
     233                 :         12 :         return( 0 );
     234                 :            :     }
     235                 :            : 
     236         [ +  + ]:    3526726 :     for( i = Y->n - 1; i > 0; i-- )
     237         [ +  + ]:    3526566 :         if( Y->p[i] != 0 )
     238                 :            :             break;
     239                 :     459734 :     i++;
     240                 :            : 
     241                 :     459734 :     X->s = Y->s;
     242                 :            : 
     243         [ +  + ]:     459734 :     if( X->n < i )
     244                 :            :     {
     245         [ -  + ]:      91674 :         MBEDTLS_MPI_CHK( mbedtls_mpi_grow( X, i ) );
     246                 :            :     }
     247                 :            :     else
     248                 :            :     {
     249                 :     368060 :         memset( X->p + i, 0, ( X->n - i ) * ciL );
     250                 :            :     }
     251                 :            : 
     252                 :     459734 :     memcpy( X->p, Y->p, i * ciL );
     253                 :            : 
     254                 :            : cleanup:
     255                 :            : 
     256                 :            :     return( ret );
     257                 :            : }
     258                 :            : 
     259                 :            : /*
     260                 :            :  * Swap the contents of X and Y
     261                 :            :  */
     262                 :          0 : void mbedtls_mpi_swap( mbedtls_mpi *X, mbedtls_mpi *Y )
     263                 :            : {
     264                 :          0 :     mbedtls_mpi T;
     265                 :          0 :     MPI_VALIDATE( X != NULL );
     266                 :          0 :     MPI_VALIDATE( Y != NULL );
     267                 :            : 
     268                 :          0 :     memcpy( &T,  X, sizeof( mbedtls_mpi ) );
     269                 :          0 :     memcpy(  X,  Y, sizeof( mbedtls_mpi ) );
     270                 :          0 :     memcpy(  Y, &T, sizeof( mbedtls_mpi ) );
     271                 :          0 : }
     272                 :            : 
     273                 :            : /*
     274                 :            :  * Set value from integer
     275                 :            :  */
     276                 :     537598 : int mbedtls_mpi_lset( mbedtls_mpi *X, mbedtls_mpi_sint z )
     277                 :            : {
     278                 :     537598 :     int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
     279                 :     537598 :     MPI_VALIDATE_RET( X != NULL );
     280                 :            : 
     281         [ -  + ]:     537598 :     MBEDTLS_MPI_CHK( mbedtls_mpi_grow( X, 1 ) );
     282         [ +  - ]:     537598 :     memset( X->p, 0, X->n * ciL );
     283                 :            : 
     284                 :     537598 :     X->p[0] = ( z < 0 ) ? -z : z;
     285         [ +  - ]:    1075196 :     X->s    = ( z < 0 ) ? -1 : 1;
     286                 :            : 
     287                 :     537598 : cleanup:
     288                 :            : 
     289                 :     537598 :     return( ret );
     290                 :            : }
     291                 :            : 
     292                 :            : /*
     293                 :            :  * Get a specific bit
     294                 :            :  */
     295                 :       5260 : int mbedtls_mpi_get_bit( const mbedtls_mpi *X, size_t pos )
     296                 :            : {
     297                 :       5260 :     MPI_VALIDATE_RET( X != NULL );
     298                 :            : 
     299         [ +  + ]:       5260 :     if( X->n * biL <= pos )
     300                 :            :         return( 0 );
     301                 :            : 
     302                 :       5220 :     return( ( X->p[pos / biL] >> ( pos % biL ) ) & 0x01 );
     303                 :            : }
     304                 :            : 
     305                 :            : /* Get a specific byte, without range checks. */
     306                 :            : #define GET_BYTE( X, i )                                \
     307                 :            :     ( ( ( X )->p[( i ) / ciL] >> ( ( ( i ) % ciL ) * 8 ) ) & 0xff )
     308                 :            : 
     309                 :            : /*
     310                 :            :  * Set a bit to a specific value of 0 or 1
     311                 :            :  */
     312                 :          0 : int mbedtls_mpi_set_bit( mbedtls_mpi *X, size_t pos, unsigned char val )
     313                 :            : {
     314                 :          0 :     int ret = 0;
     315                 :          0 :     size_t off = pos / biL;
     316                 :          0 :     size_t idx = pos % biL;
     317                 :          0 :     MPI_VALIDATE_RET( X != NULL );
     318                 :            : 
     319         [ #  # ]:          0 :     if( val != 0 && val != 1 )
     320                 :            :         return( MBEDTLS_ERR_MPI_BAD_INPUT_DATA );
     321                 :            : 
     322         [ #  # ]:          0 :     if( X->n * biL <= pos )
     323                 :            :     {
     324         [ #  # ]:          0 :         if( val == 0 )
     325                 :            :             return( 0 );
     326                 :            : 
     327         [ #  # ]:          0 :         MBEDTLS_MPI_CHK( mbedtls_mpi_grow( X, off + 1 ) );
     328                 :            :     }
     329                 :            : 
     330                 :          0 :     X->p[off] &= ~( (mbedtls_mpi_uint) 0x01 << idx );
     331                 :          0 :     X->p[off] |= (mbedtls_mpi_uint) val << idx;
     332                 :            : 
     333                 :            : cleanup:
     334                 :            : 
     335                 :            :     return( ret );
     336                 :            : }
     337                 :            : 
     338                 :            : /*
     339                 :            :  * Return the number of less significant zero-bits
     340                 :            :  */
     341                 :      20406 : size_t mbedtls_mpi_lsb( const mbedtls_mpi *X )
     342                 :            : {
     343                 :      20406 :     size_t i, j, count = 0;
     344                 :      20406 :     MBEDTLS_INTERNAL_VALIDATE_RET( X != NULL, 0 );
     345                 :            : 
     346         [ +  - ]:      20406 :     for( i = 0; i < X->n; i++ )
     347         [ +  - ]:      30580 :         for( j = 0; j < biL; j++, count++ )
     348         [ +  + ]:      30580 :             if( ( ( X->p[i] >> j ) & 1 ) != 0 )
     349                 :      20406 :                 return( count );
     350                 :            : 
     351                 :            :     return( 0 );
     352                 :            : }
     353                 :            : 
     354                 :            : /*
     355                 :            :  * Count leading zero bits in a given integer
     356                 :            :  */
     357                 :     481618 : static size_t mbedtls_clz( const mbedtls_mpi_uint x )
     358                 :            : {
     359                 :     481618 :     size_t j;
     360                 :     481618 :     mbedtls_mpi_uint mask = (mbedtls_mpi_uint) 1 << (biL - 1);
     361                 :            : 
     362         [ +  + ]:    1310569 :     for( j = 0; j < biL; j++ )
     363                 :            :     {
     364         [ +  + ]:    1310561 :         if( x & mask ) break;
     365                 :            : 
     366                 :     828951 :         mask >>= 1;
     367                 :            :     }
     368                 :            : 
     369                 :     481618 :     return j;
     370                 :            : }
     371                 :            : 
     372                 :            : /*
     373                 :            :  * Return the number of bits
     374                 :            :  */
     375                 :     481618 : size_t mbedtls_mpi_bitlen( const mbedtls_mpi *X )
     376                 :            : {
     377                 :     481618 :     size_t i, j;
     378                 :            : 
     379         [ +  - ]:     481618 :     if( X->n == 0 )
     380                 :            :         return( 0 );
     381                 :            : 
     382         [ +  + ]:    3087659 :     for( i = X->n - 1; i > 0; i-- )
     383         [ +  + ]:    3087591 :         if( X->p[i] != 0 )
     384                 :            :             break;
     385                 :            : 
     386                 :     481618 :     j = biL - mbedtls_clz( X->p[i] );
     387                 :            : 
     388                 :     481618 :     return( ( i * biL ) + j );
     389                 :            : }
     390                 :            : 
     391                 :            : /*
     392                 :            :  * Return the total size in bytes
     393                 :            :  */
     394                 :         34 : size_t mbedtls_mpi_size( const mbedtls_mpi *X )
     395                 :            : {
     396                 :         34 :     return( ( mbedtls_mpi_bitlen( X ) + 7 ) >> 3 );
     397                 :            : }
     398                 :            : 
     399                 :            : /*
     400                 :            :  * Convert an ASCII character to digit value
     401                 :            :  */
     402                 :          0 : static int mpi_get_digit( mbedtls_mpi_uint *d, int radix, char c )
     403                 :            : {
     404                 :          0 :     *d = 255;
     405                 :            : 
     406         [ #  # ]:          0 :     if( c >= 0x30 && c <= 0x39 ) *d = c - 0x30;
     407         [ #  # ]:          0 :     if( c >= 0x41 && c <= 0x46 ) *d = c - 0x37;
     408         [ #  # ]:          0 :     if( c >= 0x61 && c <= 0x66 ) *d = c - 0x57;
     409                 :            : 
     410         [ #  # ]:          0 :     if( *d >= (mbedtls_mpi_uint) radix )
     411                 :          0 :         return( MBEDTLS_ERR_MPI_INVALID_CHARACTER );
     412                 :            : 
     413                 :            :     return( 0 );
     414                 :            : }
     415                 :            : 
     416                 :            : /*
     417                 :            :  * Import from an ASCII string
     418                 :            :  */
     419                 :          0 : int mbedtls_mpi_read_string( mbedtls_mpi *X, int radix, const char *s )
     420                 :            : {
     421                 :          0 :     int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
     422                 :          0 :     size_t i, j, slen, n;
     423                 :          0 :     int sign = 1;
     424                 :          0 :     mbedtls_mpi_uint d;
     425                 :          0 :     mbedtls_mpi T;
     426                 :          0 :     MPI_VALIDATE_RET( X != NULL );
     427                 :          0 :     MPI_VALIDATE_RET( s != NULL );
     428                 :            : 
     429         [ #  # ]:          0 :     if( radix < 2 || radix > 16 )
     430                 :            :         return( MBEDTLS_ERR_MPI_BAD_INPUT_DATA );
     431                 :            : 
     432                 :          0 :     mbedtls_mpi_init( &T );
     433                 :            : 
     434         [ #  # ]:          0 :     if( s[0] == 0 )
     435                 :            :     {
     436                 :          0 :         mbedtls_mpi_free( X );
     437                 :          0 :         return( 0 );
     438                 :            :     }
     439                 :            : 
     440         [ #  # ]:          0 :     if( s[0] == '-' )
     441                 :            :     {
     442                 :          0 :         ++s;
     443                 :          0 :         sign = -1;
     444                 :            :     }
     445                 :            : 
     446                 :          0 :     slen = strlen( s );
     447                 :            : 
     448         [ #  # ]:          0 :     if( radix == 16 )
     449                 :            :     {
     450         [ #  # ]:          0 :         if( slen > MPI_SIZE_T_MAX >> 2 )
     451                 :            :             return( MBEDTLS_ERR_MPI_BAD_INPUT_DATA );
     452                 :            : 
     453                 :          0 :         n = BITS_TO_LIMBS( slen << 2 );
     454                 :            : 
     455         [ #  # ]:          0 :         MBEDTLS_MPI_CHK( mbedtls_mpi_grow( X, n ) );
     456         [ #  # ]:          0 :         MBEDTLS_MPI_CHK( mbedtls_mpi_lset( X, 0 ) );
     457                 :            : 
     458         [ #  # ]:          0 :         for( i = slen, j = 0; i > 0; i--, j++ )
     459                 :            :         {
     460         [ #  # ]:          0 :             MBEDTLS_MPI_CHK( mpi_get_digit( &d, radix, s[i - 1] ) );
     461                 :          0 :             X->p[j / ( 2 * ciL )] |= d << ( ( j % ( 2 * ciL ) ) << 2 );
     462                 :            :         }
     463                 :            :     }
     464                 :            :     else
     465                 :            :     {
     466         [ #  # ]:          0 :         MBEDTLS_MPI_CHK( mbedtls_mpi_lset( X, 0 ) );
     467                 :            : 
     468         [ #  # ]:          0 :         for( i = 0; i < slen; i++ )
     469                 :            :         {
     470         [ #  # ]:          0 :             MBEDTLS_MPI_CHK( mpi_get_digit( &d, radix, s[i] ) );
     471         [ #  # ]:          0 :             MBEDTLS_MPI_CHK( mbedtls_mpi_mul_int( &T, X, radix ) );
     472         [ #  # ]:          0 :             MBEDTLS_MPI_CHK( mbedtls_mpi_add_int( X, &T, d ) );
     473                 :            :         }
     474                 :            :     }
     475                 :            : 
     476   [ #  #  #  # ]:          0 :     if( sign < 0 && mbedtls_mpi_bitlen( X ) != 0 )
     477                 :          0 :         X->s = -1;
     478                 :            : 
     479                 :          0 : cleanup:
     480                 :            : 
     481                 :          0 :     mbedtls_mpi_free( &T );
     482                 :            : 
     483                 :          0 :     return( ret );
     484                 :            : }
     485                 :            : 
     486                 :            : /*
     487                 :            :  * Helper to write the digits high-order first.
     488                 :            :  */
     489                 :          0 : static int mpi_write_hlp( mbedtls_mpi *X, int radix,
     490                 :            :                           char **p, const size_t buflen )
     491                 :            : {
     492                 :          0 :     int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
     493                 :          0 :     mbedtls_mpi_uint r;
     494                 :          0 :     size_t length = 0;
     495                 :          0 :     char *p_end = *p + buflen;
     496                 :            : 
     497                 :          0 :     do
     498                 :            :     {
     499         [ #  # ]:          0 :         if( length >= buflen )
     500                 :            :         {
     501                 :            :             return( MBEDTLS_ERR_MPI_BUFFER_TOO_SMALL );
     502                 :            :         }
     503                 :            : 
     504         [ #  # ]:          0 :         MBEDTLS_MPI_CHK( mbedtls_mpi_mod_int( &r, X, radix ) );
     505         [ #  # ]:          0 :         MBEDTLS_MPI_CHK( mbedtls_mpi_div_int( X, NULL, X, radix ) );
     506                 :            :         /*
     507                 :            :          * Write the residue in the current position, as an ASCII character.
     508                 :            :          */
     509         [ #  # ]:          0 :         if( r < 0xA )
     510                 :          0 :             *(--p_end) = (char)( '0' + r );
     511                 :            :         else
     512                 :          0 :             *(--p_end) = (char)( 'A' + ( r - 0xA ) );
     513                 :            : 
     514                 :          0 :         length++;
     515         [ #  # ]:          0 :     } while( mbedtls_mpi_cmp_int( X, 0 ) != 0 );
     516                 :            : 
     517                 :          0 :     memmove( *p, p_end, length );
     518                 :          0 :     *p += length;
     519                 :            : 
     520                 :            : cleanup:
     521                 :            : 
     522                 :            :     return( ret );
     523                 :            : }
     524                 :            : 
     525                 :            : /*
     526                 :            :  * Export into an ASCII string
     527                 :            :  */
     528                 :          0 : int mbedtls_mpi_write_string( const mbedtls_mpi *X, int radix,
     529                 :            :                               char *buf, size_t buflen, size_t *olen )
     530                 :            : {
     531                 :          0 :     int ret = 0;
     532                 :          0 :     size_t n;
     533                 :          0 :     char *p;
     534                 :          0 :     mbedtls_mpi T;
     535                 :          0 :     MPI_VALIDATE_RET( X    != NULL );
     536                 :          0 :     MPI_VALIDATE_RET( olen != NULL );
     537                 :          0 :     MPI_VALIDATE_RET( buflen == 0 || buf != NULL );
     538                 :            : 
     539         [ #  # ]:          0 :     if( radix < 2 || radix > 16 )
     540                 :            :         return( MBEDTLS_ERR_MPI_BAD_INPUT_DATA );
     541                 :            : 
     542                 :          0 :     n = mbedtls_mpi_bitlen( X ); /* Number of bits necessary to present `n`. */
     543         [ #  # ]:          0 :     if( radix >=  4 ) n >>= 1;   /* Number of 4-adic digits necessary to present
     544                 :            :                                   * `n`. If radix > 4, this might be a strict
     545                 :            :                                   * overapproximation of the number of
     546                 :            :                                   * radix-adic digits needed to present `n`. */
     547         [ #  # ]:          0 :     if( radix >= 16 ) n >>= 1;   /* Number of hexadecimal digits necessary to
     548                 :            :                                   * present `n`. */
     549                 :            : 
     550                 :          0 :     n += 1; /* Terminating null byte */
     551                 :          0 :     n += 1; /* Compensate for the divisions above, which round down `n`
     552                 :            :              * in case it's not even. */
     553                 :          0 :     n += 1; /* Potential '-'-sign. */
     554                 :          0 :     n += ( n & 1 ); /* Make n even to have enough space for hexadecimal writing,
     555                 :            :                      * which always uses an even number of hex-digits. */
     556                 :            : 
     557         [ #  # ]:          0 :     if( buflen < n )
     558                 :            :     {
     559                 :          0 :         *olen = n;
     560                 :          0 :         return( MBEDTLS_ERR_MPI_BUFFER_TOO_SMALL );
     561                 :            :     }
     562                 :            : 
     563                 :          0 :     p = buf;
     564                 :          0 :     mbedtls_mpi_init( &T );
     565                 :            : 
     566         [ #  # ]:          0 :     if( X->s == -1 )
     567                 :            :     {
     568                 :          0 :         *p++ = '-';
     569                 :          0 :         buflen--;
     570                 :            :     }
     571                 :            : 
     572         [ #  # ]:          0 :     if( radix == 16 )
     573                 :            :     {
     574                 :          0 :         int c;
     575                 :          0 :         size_t i, j, k;
     576                 :            : 
     577         [ #  # ]:          0 :         for( i = X->n, k = 0; i > 0; i-- )
     578                 :            :         {
     579         [ #  # ]:          0 :             for( j = ciL; j > 0; j-- )
     580                 :            :             {
     581                 :          0 :                 c = ( X->p[i - 1] >> ( ( j - 1 ) << 3) ) & 0xFF;
     582                 :            : 
     583   [ #  #  #  # ]:          0 :                 if( c == 0 && k == 0 && ( i + j ) != 2 )
     584                 :          0 :                     continue;
     585                 :            : 
     586                 :          0 :                 *(p++) = "0123456789ABCDEF" [c / 16];
     587                 :          0 :                 *(p++) = "0123456789ABCDEF" [c % 16];
     588                 :          0 :                 k = 1;
     589                 :            :             }
     590                 :            :         }
     591                 :            :     }
     592                 :            :     else
     593                 :            :     {
     594         [ #  # ]:          0 :         MBEDTLS_MPI_CHK( mbedtls_mpi_copy( &T, X ) );
     595                 :            : 
     596         [ #  # ]:          0 :         if( T.s == -1 )
     597                 :          0 :             T.s = 1;
     598                 :            : 
     599         [ #  # ]:          0 :         MBEDTLS_MPI_CHK( mpi_write_hlp( &T, radix, &p, buflen ) );
     600                 :            :     }
     601                 :            : 
     602                 :          0 :     *p++ = '\0';
     603                 :          0 :     *olen = p - buf;
     604                 :            : 
     605                 :          0 : cleanup:
     606                 :            : 
     607                 :          0 :     mbedtls_mpi_free( &T );
     608                 :            : 
     609                 :          0 :     return( ret );
     610                 :            : }
     611                 :            : 
     612                 :            : #if defined(MBEDTLS_FS_IO)
     613                 :            : /*
     614                 :            :  * Read X from an opened file
     615                 :            :  */
     616                 :            : int mbedtls_mpi_read_file( mbedtls_mpi *X, int radix, FILE *fin )
     617                 :            : {
     618                 :            :     mbedtls_mpi_uint d;
     619                 :            :     size_t slen;
     620                 :            :     char *p;
     621                 :            :     /*
     622                 :            :      * Buffer should have space for (short) label and decimal formatted MPI,
     623                 :            :      * newline characters and '\0'
     624                 :            :      */
     625                 :            :     char s[ MBEDTLS_MPI_RW_BUFFER_SIZE ];
     626                 :            : 
     627                 :            :     MPI_VALIDATE_RET( X   != NULL );
     628                 :            :     MPI_VALIDATE_RET( fin != NULL );
     629                 :            : 
     630                 :            :     if( radix < 2 || radix > 16 )
     631                 :            :         return( MBEDTLS_ERR_MPI_BAD_INPUT_DATA );
     632                 :            : 
     633                 :            :     memset( s, 0, sizeof( s ) );
     634                 :            :     if( fgets( s, sizeof( s ) - 1, fin ) == NULL )
     635                 :            :         return( MBEDTLS_ERR_MPI_FILE_IO_ERROR );
     636                 :            : 
     637                 :            :     slen = strlen( s );
     638                 :            :     if( slen == sizeof( s ) - 2 )
     639                 :            :         return( MBEDTLS_ERR_MPI_BUFFER_TOO_SMALL );
     640                 :            : 
     641                 :            :     if( slen > 0 && s[slen - 1] == '\n' ) { slen--; s[slen] = '\0'; }
     642                 :            :     if( slen > 0 && s[slen - 1] == '\r' ) { slen--; s[slen] = '\0'; }
     643                 :            : 
     644                 :            :     p = s + slen;
     645                 :            :     while( p-- > s )
     646                 :            :         if( mpi_get_digit( &d, radix, *p ) != 0 )
     647                 :            :             break;
     648                 :            : 
     649                 :            :     return( mbedtls_mpi_read_string( X, radix, p + 1 ) );
     650                 :            : }
     651                 :            : 
     652                 :            : /*
     653                 :            :  * Write X into an opened file (or stdout if fout == NULL)
     654                 :            :  */
     655                 :            : int mbedtls_mpi_write_file( const char *p, const mbedtls_mpi *X, int radix, FILE *fout )
     656                 :            : {
     657                 :            :     int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
     658                 :            :     size_t n, slen, plen;
     659                 :            :     /*
     660                 :            :      * Buffer should have space for (short) label and decimal formatted MPI,
     661                 :            :      * newline characters and '\0'
     662                 :            :      */
     663                 :            :     char s[ MBEDTLS_MPI_RW_BUFFER_SIZE ];
     664                 :            :     MPI_VALIDATE_RET( X != NULL );
     665                 :            : 
     666                 :            :     if( radix < 2 || radix > 16 )
     667                 :            :         return( MBEDTLS_ERR_MPI_BAD_INPUT_DATA );
     668                 :            : 
     669                 :            :     memset( s, 0, sizeof( s ) );
     670                 :            : 
     671                 :            :     MBEDTLS_MPI_CHK( mbedtls_mpi_write_string( X, radix, s, sizeof( s ) - 2, &n ) );
     672                 :            : 
     673                 :            :     if( p == NULL ) p = "";
     674                 :            : 
     675                 :            :     plen = strlen( p );
     676                 :            :     slen = strlen( s );
     677                 :            :     s[slen++] = '\r';
     678                 :            :     s[slen++] = '\n';
     679                 :            : 
     680                 :            :     if( fout != NULL )
     681                 :            :     {
     682                 :            :         if( fwrite( p, 1, plen, fout ) != plen ||
     683                 :            :             fwrite( s, 1, slen, fout ) != slen )
     684                 :            :             return( MBEDTLS_ERR_MPI_FILE_IO_ERROR );
     685                 :            :     }
     686                 :            :     else
     687                 :            :         mbedtls_printf( "%s%s", p, s );
     688                 :            : 
     689                 :            : cleanup:
     690                 :            : 
     691                 :            :     return( ret );
     692                 :            : }
     693                 :            : #endif /* MBEDTLS_FS_IO */
     694                 :            : 
     695                 :            : 
     696                 :            : /* Convert a big-endian byte array aligned to the size of mbedtls_mpi_uint
     697                 :            :  * into the storage form used by mbedtls_mpi. */
     698                 :            : 
     699                 :            : static mbedtls_mpi_uint mpi_uint_bigendian_to_host_c( mbedtls_mpi_uint x )
     700                 :            : {
     701                 :            :     uint8_t i;
     702                 :            :     unsigned char *x_ptr;
     703                 :            :     mbedtls_mpi_uint tmp = 0;
     704                 :            : 
     705                 :            :     for( i = 0, x_ptr = (unsigned char*) &x; i < ciL; i++, x_ptr++ )
     706                 :            :     {
     707                 :            :         tmp <<= CHAR_BIT;
     708                 :            :         tmp |= (mbedtls_mpi_uint) *x_ptr;
     709                 :            :     }
     710                 :            : 
     711                 :            :     return( tmp );
     712                 :            : }
     713                 :            : 
     714                 :        848 : static mbedtls_mpi_uint mpi_uint_bigendian_to_host( mbedtls_mpi_uint x )
     715                 :            : {
     716                 :            : #if defined(__BYTE_ORDER__)
     717                 :            : 
     718                 :            : /* Nothing to do on bigendian systems. */
     719                 :            : #if ( __BYTE_ORDER__ == __ORDER_BIG_ENDIAN__ )
     720                 :            :     return( x );
     721                 :            : #endif /* __BYTE_ORDER__ == __ORDER_BIG_ENDIAN__ */
     722                 :            : 
     723                 :            : #if ( __BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__ )
     724                 :            : 
     725                 :            : /* For GCC and Clang, have builtins for byte swapping. */
     726                 :            : #if defined(__GNUC__) && defined(__GNUC_PREREQ)
     727                 :            : #if __GNUC_PREREQ(4,3)
     728                 :            : #define have_bswap
     729                 :            : #endif
     730                 :            : #endif
     731                 :            : 
     732                 :            : #if defined(__clang__) && defined(__has_builtin)
     733                 :            : #if __has_builtin(__builtin_bswap32)  &&                 \
     734                 :            :     __has_builtin(__builtin_bswap64)
     735                 :            : #define have_bswap
     736                 :            : #endif
     737                 :            : #endif
     738                 :            : 
     739                 :            : #if defined(have_bswap)
     740                 :            :     /* The compiler is hopefully able to statically evaluate this! */
     741                 :        848 :     switch( sizeof(mbedtls_mpi_uint) )
     742                 :            :     {
     743                 :            :         case 4:
     744                 :        848 :             return( __builtin_bswap32(x) );
     745                 :            :         case 8:
     746                 :            :             return( __builtin_bswap64(x) );
     747                 :            :     }
     748                 :            : #endif
     749                 :            : #endif /* __BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__ */
     750                 :            : #endif /* __BYTE_ORDER__ */
     751                 :            : 
     752                 :            :     /* Fall back to C-based reordering if we don't know the byte order
     753                 :            :      * or we couldn't use a compiler-specific builtin. */
     754                 :            :     return( mpi_uint_bigendian_to_host_c( x ) );
     755                 :            : }
     756                 :            : 
     757                 :        106 : static void mpi_bigendian_to_host( mbedtls_mpi_uint * const p, size_t limbs )
     758                 :            : {
     759                 :        106 :     mbedtls_mpi_uint *cur_limb_left;
     760                 :        106 :     mbedtls_mpi_uint *cur_limb_right;
     761         [ +  - ]:        106 :     if( limbs == 0 )
     762                 :            :         return;
     763                 :            : 
     764                 :            :     /*
     765                 :            :      * Traverse limbs and
     766                 :            :      * - adapt byte-order in each limb
     767                 :            :      * - swap the limbs themselves.
     768                 :            :      * For that, simultaneously traverse the limbs from left to right
     769                 :            :      * and from right to left, as long as the left index is not bigger
     770                 :            :      * than the right index (it's not a problem if limbs is odd and the
     771                 :            :      * indices coincide in the last iteration).
     772                 :            :      */
     773                 :        106 :     for( cur_limb_left = p, cur_limb_right = p + ( limbs - 1 );
     774         [ +  + ]:        530 :          cur_limb_left <= cur_limb_right;
     775                 :        424 :          cur_limb_left++, cur_limb_right-- )
     776                 :            :     {
     777                 :        424 :         mbedtls_mpi_uint tmp;
     778                 :            :         /* Note that if cur_limb_left == cur_limb_right,
     779                 :            :          * this code effectively swaps the bytes only once. */
     780                 :        424 :         tmp             = mpi_uint_bigendian_to_host( *cur_limb_left  );
     781                 :        424 :         *cur_limb_left  = mpi_uint_bigendian_to_host( *cur_limb_right );
     782                 :        424 :         *cur_limb_right = tmp;
     783                 :            :     }
     784                 :            : }
     785                 :            : 
     786                 :            : /*
     787                 :            :  * Import X from unsigned binary data, little endian
     788                 :            :  */
     789                 :          0 : int mbedtls_mpi_read_binary_le( mbedtls_mpi *X,
     790                 :            :                                 const unsigned char *buf, size_t buflen )
     791                 :            : {
     792                 :          0 :     int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
     793                 :          0 :     size_t i;
     794                 :          0 :     size_t const limbs = CHARS_TO_LIMBS( buflen );
     795                 :            : 
     796                 :            :     /* Ensure that target MPI has exactly the necessary number of limbs */
     797         [ #  # ]:          0 :     MBEDTLS_MPI_CHK( mbedtls_mpi_resize_clear( X, limbs ) );
     798                 :            : 
     799         [ #  # ]:          0 :     for( i = 0; i < buflen; i++ )
     800                 :          0 :         X->p[i / ciL] |= ((mbedtls_mpi_uint) buf[i]) << ((i % ciL) << 3);
     801                 :            : 
     802                 :          0 : cleanup:
     803                 :            : 
     804                 :            :     /*
     805                 :            :      * This function is also used to import keys. However, wiping the buffers
     806                 :            :      * upon failure is not necessary because failure only can happen before any
     807                 :            :      * input is copied.
     808                 :            :      */
     809                 :          0 :     return( ret );
     810                 :            : }
     811                 :            : 
     812                 :            : /*
     813                 :            :  * Import X from unsigned binary data, big endian
     814                 :            :  */
     815                 :         82 : int mbedtls_mpi_read_binary( mbedtls_mpi *X, const unsigned char *buf, size_t buflen )
     816                 :            : {
     817                 :         82 :     int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
     818                 :         82 :     size_t const limbs    = CHARS_TO_LIMBS( buflen );
     819                 :         82 :     size_t const overhead = ( limbs * ciL ) - buflen;
     820                 :         82 :     unsigned char *Xp;
     821                 :            : 
     822                 :         82 :     MPI_VALIDATE_RET( X != NULL );
     823                 :         82 :     MPI_VALIDATE_RET( buflen == 0 || buf != NULL );
     824                 :            : 
     825                 :            :     /* Ensure that target MPI has exactly the necessary number of limbs */
     826         [ -  + ]:         82 :     MBEDTLS_MPI_CHK( mbedtls_mpi_resize_clear( X, limbs ) );
     827                 :            : 
     828                 :            :     /* Avoid calling `memcpy` with NULL source or destination argument,
     829                 :            :      * even if buflen is 0. */
     830         [ -  + ]:         82 :     if( buflen != 0 )
     831                 :            :     {
     832                 :         82 :         Xp = (unsigned char*) X->p;
     833                 :         82 :         memcpy( Xp + overhead, buf, buflen );
     834                 :            : 
     835                 :         82 :         mpi_bigendian_to_host( X->p, limbs );
     836                 :            :     }
     837                 :            : 
     838                 :          0 : cleanup:
     839                 :            : 
     840                 :            :     /*
     841                 :            :      * This function is also used to import keys. However, wiping the buffers
     842                 :            :      * upon failure is not necessary because failure only can happen before any
     843                 :            :      * input is copied.
     844                 :            :      */
     845                 :         82 :     return( ret );
     846                 :            : }
     847                 :            : 
     848                 :            : /*
     849                 :            :  * Export X into unsigned binary data, little endian
     850                 :            :  */
     851                 :          0 : int mbedtls_mpi_write_binary_le( const mbedtls_mpi *X,
     852                 :            :                                  unsigned char *buf, size_t buflen )
     853                 :            : {
     854                 :          0 :     size_t stored_bytes = X->n * ciL;
     855                 :          0 :     size_t bytes_to_copy;
     856                 :          0 :     size_t i;
     857                 :            : 
     858         [ #  # ]:          0 :     if( stored_bytes < buflen )
     859                 :            :     {
     860                 :            :         bytes_to_copy = stored_bytes;
     861                 :            :     }
     862                 :            :     else
     863                 :            :     {
     864                 :          0 :         bytes_to_copy = buflen;
     865                 :            : 
     866                 :            :         /* The output buffer is smaller than the allocated size of X.
     867                 :            :          * However X may fit if its leading bytes are zero. */
     868         [ #  # ]:          0 :         for( i = bytes_to_copy; i < stored_bytes; i++ )
     869                 :            :         {
     870         [ #  # ]:          0 :             if( GET_BYTE( X, i ) != 0 )
     871                 :            :                 return( MBEDTLS_ERR_MPI_BUFFER_TOO_SMALL );
     872                 :            :         }
     873                 :            :     }
     874                 :            : 
     875         [ #  # ]:          0 :     for( i = 0; i < bytes_to_copy; i++ )
     876                 :          0 :         buf[i] = GET_BYTE( X, i );
     877                 :            : 
     878         [ #  # ]:          0 :     if( stored_bytes < buflen )
     879                 :            :     {
     880                 :            :         /* Write trailing 0 bytes */
     881                 :          0 :         memset( buf + stored_bytes, 0, buflen - stored_bytes );
     882                 :            :     }
     883                 :            : 
     884                 :            :     return( 0 );
     885                 :            : }
     886                 :            : 
     887                 :            : /*
     888                 :            :  * Export X into unsigned binary data, big endian
     889                 :            :  */
     890                 :         36 : int mbedtls_mpi_write_binary( const mbedtls_mpi *X,
     891                 :            :                               unsigned char *buf, size_t buflen )
     892                 :            : {
     893                 :         36 :     size_t stored_bytes;
     894                 :         36 :     size_t bytes_to_copy;
     895                 :         36 :     unsigned char *p;
     896                 :         36 :     size_t i;
     897                 :            : 
     898                 :         36 :     MPI_VALIDATE_RET( X != NULL );
     899                 :         36 :     MPI_VALIDATE_RET( buflen == 0 || buf != NULL );
     900                 :            : 
     901                 :         36 :     stored_bytes = X->n * ciL;
     902                 :            : 
     903         [ -  + ]:         36 :     if( stored_bytes < buflen )
     904                 :            :     {
     905                 :            :         /* There is enough space in the output buffer. Write initial
     906                 :            :          * null bytes and record the position at which to start
     907                 :            :          * writing the significant bytes. In this case, the execution
     908                 :            :          * trace of this function does not depend on the value of the
     909                 :            :          * number. */
     910                 :          0 :         bytes_to_copy = stored_bytes;
     911                 :          0 :         p = buf + buflen - stored_bytes;
     912                 :          0 :         memset( buf, 0, buflen - stored_bytes );
     913                 :            :     }
     914                 :            :     else
     915                 :            :     {
     916                 :            :         /* The output buffer is smaller than the allocated size of X.
     917                 :            :          * However X may fit if its leading bytes are zero. */
     918                 :        676 :         bytes_to_copy = buflen;
     919                 :        676 :         p = buf;
     920         [ +  + ]:        676 :         for( i = bytes_to_copy; i < stored_bytes; i++ )
     921                 :            :         {
     922         [ +  - ]:        640 :             if( GET_BYTE( X, i ) != 0 )
     923                 :            :                 return( MBEDTLS_ERR_MPI_BUFFER_TOO_SMALL );
     924                 :            :         }
     925                 :            :     }
     926                 :            : 
     927         [ +  + ]:       1188 :     for( i = 0; i < bytes_to_copy; i++ )
     928                 :       1152 :         p[bytes_to_copy - i - 1] = GET_BYTE( X, i );
     929                 :            : 
     930                 :            :     return( 0 );
     931                 :            : }
     932                 :            : 
     933                 :            : /*
     934                 :            :  * Left-shift: X <<= count
     935                 :            :  */
     936                 :     442452 : int mbedtls_mpi_shift_l( mbedtls_mpi *X, size_t count )
     937                 :            : {
     938                 :     442452 :     int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
     939                 :     442452 :     size_t i, v0, t1;
     940                 :     442452 :     mbedtls_mpi_uint r0 = 0, r1;
     941                 :     442452 :     MPI_VALIDATE_RET( X != NULL );
     942                 :            : 
     943                 :     442452 :     v0 = count / (biL    );
     944                 :     442452 :     t1 = count & (biL - 1);
     945                 :            : 
     946                 :     442452 :     i = mbedtls_mpi_bitlen( X ) + count;
     947                 :            : 
     948         [ +  + ]:     442452 :     if( X->n * biL < i )
     949         [ -  + ]:     116928 :         MBEDTLS_MPI_CHK( mbedtls_mpi_grow( X, BITS_TO_LIMBS( i ) ) );
     950                 :            : 
     951                 :     442452 :     ret = 0;
     952                 :            : 
     953                 :            :     /*
     954                 :            :      * shift by count / limb_size
     955                 :            :      */
     956         [ +  + ]:     442452 :     if( v0 > 0 )
     957                 :            :     {
     958         [ +  + ]:    4484760 :         for( i = X->n; i > v0; i-- )
     959                 :    4172848 :             X->p[i - 1] = X->p[i - v0 - 1];
     960                 :            : 
     961         [ +  + ]:    1716580 :         for( ; i > 0; i-- )
     962                 :    1404668 :             X->p[i - 1] = 0;
     963                 :            :     }
     964                 :            : 
     965                 :            :     /*
     966                 :            :      * shift by count % limb_size
     967                 :            :      */
     968         [ +  + ]:     442452 :     if( t1 > 0 )
     969                 :            :     {
     970         [ +  + ]:    1321652 :         for( i = v0; i < X->n; i++ )
     971                 :            :         {
     972                 :    1230144 :             r1 = X->p[i] >> (biL - t1);
     973                 :    1230144 :             X->p[i] <<= t1;
     974                 :    1230144 :             X->p[i] |= r0;
     975                 :    1230144 :             r0 = r1;
     976                 :            :         }
     977                 :            :     }
     978                 :            : 
     979                 :     442452 : cleanup:
     980                 :            : 
     981                 :     442452 :     return( ret );
     982                 :            : }
     983                 :            : 
     984                 :            : /*
     985                 :            :  * Right-shift: X >>= count
     986                 :            :  */
     987                 :     168976 : int mbedtls_mpi_shift_r( mbedtls_mpi *X, size_t count )
     988                 :            : {
     989                 :     168976 :     size_t i, v0, v1;
     990                 :     168976 :     mbedtls_mpi_uint r0 = 0, r1;
     991                 :     168976 :     MPI_VALIDATE_RET( X != NULL );
     992                 :            : 
     993                 :     168976 :     v0 = count /  biL;
     994                 :     168976 :     v1 = count & (biL - 1);
     995                 :            : 
     996   [ +  -  -  +  :     168976 :     if( v0 > X->n || ( v0 == X->n && v1 > 0 ) )
                   -  - ]
     997                 :          0 :         return mbedtls_mpi_lset( X, 0 );
     998                 :            : 
     999                 :            :     /*
    1000                 :            :      * shift by count / limb_size
    1001                 :            :      */
    1002         [ +  + ]:     168976 :     if( v0 > 0 )
    1003                 :            :     {
    1004         [ +  + ]:     389760 :         for( i = 0; i < X->n - v0; i++ )
    1005                 :     350784 :             X->p[i] = X->p[i + v0];
    1006                 :            : 
    1007         [ +  + ]:     350880 :         for( ; i < X->n; i++ )
    1008                 :     311904 :             X->p[i] = 0;
    1009                 :            :     }
    1010                 :            : 
    1011                 :            :     /*
    1012                 :            :      * shift by count % limb_size
    1013                 :            :      */
    1014         [ +  + ]:     168976 :     if( v1 > 0 )
    1015                 :            :     {
    1016         [ +  + ]:    1410317 :         for( i = X->n; i > 0; i-- )
    1017                 :            :         {
    1018                 :    1295535 :             r1 = X->p[i - 1] << (biL - v1);
    1019                 :    1295535 :             X->p[i - 1] >>= v1;
    1020                 :    1295535 :             X->p[i - 1] |= r0;
    1021                 :    1295535 :             r0 = r1;
    1022                 :            :         }
    1023                 :            :     }
    1024                 :            : 
    1025                 :            :     return( 0 );
    1026                 :            : }
    1027                 :            : 
    1028                 :            : /*
    1029                 :            :  * Compare unsigned values
    1030                 :            :  */
    1031                 :     415101 : int mbedtls_mpi_cmp_abs( const mbedtls_mpi *X, const mbedtls_mpi *Y )
    1032                 :            : {
    1033                 :     415101 :     size_t i, j;
    1034                 :     415101 :     MPI_VALIDATE_RET( X != NULL );
    1035                 :     415101 :     MPI_VALIDATE_RET( Y != NULL );
    1036                 :            : 
    1037         [ +  + ]:    1809808 :     for( i = X->n; i > 0; i-- )
    1038         [ +  + ]:    1809715 :         if( X->p[i - 1] != 0 )
    1039                 :            :             break;
    1040                 :            : 
    1041         [ +  + ]:    2034981 :     for( j = Y->n; j > 0; j-- )
    1042         [ +  + ]:    2034954 :         if( Y->p[j - 1] != 0 )
    1043                 :            :             break;
    1044                 :            : 
    1045         [ +  - ]:     415101 :     if( i == 0 && j == 0 )
    1046                 :            :         return( 0 );
    1047                 :            : 
    1048         [ +  + ]:     415101 :     if( i > j ) return(  1 );
    1049         [ +  + ]:     375016 :     if( j > i ) return( -1 );
    1050                 :            : 
    1051         [ +  + ]:     605193 :     for( ; i > 0; i-- )
    1052                 :            :     {
    1053         [ +  + ]:     605053 :         if( X->p[i - 1] > Y->p[i - 1] ) return(  1 );
    1054         [ +  + ]:     265300 :         if( X->p[i - 1] < Y->p[i - 1] ) return( -1 );
    1055                 :            :     }
    1056                 :            : 
    1057                 :            :     return( 0 );
    1058                 :            : }
    1059                 :            : 
    1060                 :            : /*
    1061                 :            :  * Compare signed values
    1062                 :            :  */
    1063                 :    1093679 : int mbedtls_mpi_cmp_mpi( const mbedtls_mpi *X, const mbedtls_mpi *Y )
    1064                 :            : {
    1065                 :    1093679 :     size_t i, j;
    1066                 :    1093679 :     MPI_VALIDATE_RET( X != NULL );
    1067                 :    1093679 :     MPI_VALIDATE_RET( Y != NULL );
    1068                 :            : 
    1069         [ +  + ]:   10730691 :     for( i = X->n; i > 0; i-- )
    1070         [ +  + ]:   10730571 :         if( X->p[i - 1] != 0 )
    1071                 :            :             break;
    1072                 :            : 
    1073         [ +  + ]:    1669789 :     for( j = Y->n; j > 0; j-- )
    1074         [ +  + ]:    1165447 :         if( Y->p[j - 1] != 0 )
    1075                 :            :             break;
    1076                 :            : 
    1077         [ +  + ]:    1093679 :     if( i == 0 && j == 0 )
    1078                 :            :         return( 0 );
    1079                 :            : 
    1080         [ +  + ]:    1093567 :     if( i > j ) return(  X->s );
    1081         [ +  + ]:     577150 :     if( j > i ) return( -Y->s );
    1082                 :            : 
    1083   [ +  -  +  - ]:     576343 :     if( X->s > 0 && Y->s < 0 ) return(  1 );
    1084   [ +  -  +  - ]:     576343 :     if( Y->s > 0 && X->s < 0 ) return( -1 );
    1085                 :            : 
    1086         [ +  + ]:     918387 :     for( ; i > 0; i-- )
    1087                 :            :     {
    1088         [ +  + ]:     918103 :         if( X->p[i - 1] > Y->p[i - 1] ) return(  X->s );
    1089         [ +  + ]:     761417 :         if( X->p[i - 1] < Y->p[i - 1] ) return( -X->s );
    1090                 :            :     }
    1091                 :            : 
    1092                 :            :     return( 0 );
    1093                 :            : }
    1094                 :            : 
    1095                 :            : /*
    1096                 :            :  * Compare signed values
    1097                 :            :  */
    1098                 :     504600 : int mbedtls_mpi_cmp_int( const mbedtls_mpi *X, mbedtls_mpi_sint z )
    1099                 :            : {
    1100                 :     504600 :     mbedtls_mpi Y;
    1101                 :     504600 :     mbedtls_mpi_uint p[1];
    1102                 :     504600 :     MPI_VALIDATE_RET( X != NULL );
    1103                 :            : 
    1104                 :     504600 :     *p  = ( z < 0 ) ? -z : z;
    1105         [ +  + ]:     504600 :     Y.s = ( z < 0 ) ? -1 : 1;
    1106                 :     504600 :     Y.n = 1;
    1107                 :     504600 :     Y.p = p;
    1108                 :            : 
    1109                 :     504600 :     return( mbedtls_mpi_cmp_mpi( X, &Y ) );
    1110                 :            : }
    1111                 :            : 
    1112                 :            : /*
    1113                 :            :  * Unsigned addition: X = |A| + |B|  (HAC 14.7)
    1114                 :            :  */
    1115                 :      23052 : int mbedtls_mpi_add_abs( mbedtls_mpi *X, const mbedtls_mpi *A, const mbedtls_mpi *B )
    1116                 :            : {
    1117                 :      23052 :     int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
    1118                 :      23052 :     size_t i, j;
    1119                 :      23052 :     mbedtls_mpi_uint *o, *p, c, tmp;
    1120                 :      23052 :     MPI_VALIDATE_RET( X != NULL );
    1121                 :      23052 :     MPI_VALIDATE_RET( A != NULL );
    1122                 :      23052 :     MPI_VALIDATE_RET( B != NULL );
    1123                 :            : 
    1124         [ -  + ]:      23052 :     if( X == B )
    1125                 :            :     {
    1126                 :          0 :         const mbedtls_mpi *T = A; A = X; B = T;
    1127                 :            :     }
    1128                 :            : 
    1129         [ +  + ]:      23052 :     if( X != A )
    1130         [ -  + ]:       3084 :         MBEDTLS_MPI_CHK( mbedtls_mpi_copy( X, A ) );
    1131                 :            : 
    1132                 :            :     /*
    1133                 :            :      * X should always be positive as a result of unsigned additions.
    1134                 :            :      */
    1135                 :      23052 :     X->s = 1;
    1136                 :            : 
    1137         [ +  + ]:      51763 :     for( j = B->n; j > 0; j-- )
    1138         [ +  + ]:      51760 :         if( B->p[j - 1] != 0 )
    1139                 :            :             break;
    1140                 :            : 
    1141         [ -  + ]:      23052 :     MBEDTLS_MPI_CHK( mbedtls_mpi_grow( X, j ) );
    1142                 :            : 
    1143                 :      23052 :     o = B->p; p = X->p; c = 0;
    1144                 :            : 
    1145                 :            :     /*
    1146                 :            :      * tmp is used because it might happen that p == o
    1147                 :            :      */
    1148         [ +  + ]:     207367 :     for( i = 0; i < j; i++, o++, p++ )
    1149                 :            :     {
    1150                 :     184315 :         tmp= *o;
    1151                 :     184315 :         *p +=  c; c  = ( *p <  c );
    1152                 :     184315 :         *p += tmp; c += ( *p < tmp );
    1153                 :            :     }
    1154                 :            : 
    1155         [ +  + ]:      33171 :     while( c != 0 )
    1156                 :            :     {
    1157         [ +  + ]:      10119 :         if( i >= X->n )
    1158                 :            :         {
    1159         [ -  + ]:       1639 :             MBEDTLS_MPI_CHK( mbedtls_mpi_grow( X, i + 1 ) );
    1160                 :       1639 :             p = X->p + i;
    1161                 :            :         }
    1162                 :            : 
    1163                 :      10119 :         *p += c; c = ( *p < c ); i++; p++;
    1164                 :            :     }
    1165                 :            : 
    1166                 :      23052 : cleanup:
    1167                 :            : 
    1168                 :      23052 :     return( ret );
    1169                 :            : }
    1170                 :            : 
    1171                 :            : /**
    1172                 :            :  * Helper for mbedtls_mpi subtraction.
    1173                 :            :  *
    1174                 :            :  * Calculate l - r where l and r have the same size.
    1175                 :            :  * This function operates modulo (2^ciL)^n and returns the carry
    1176                 :            :  * (1 if there was a wraparound, i.e. if `l < r`, and 0 otherwise).
    1177                 :            :  *
    1178                 :            :  * d may be aliased to l or r.
    1179                 :            :  *
    1180                 :            :  * \param n             Number of limbs of \p d, \p l and \p r.
    1181                 :            :  * \param[out] d        The result of the subtraction.
    1182                 :            :  * \param[in] l         The left operand.
    1183                 :            :  * \param[in] r         The right operand.
    1184                 :            :  *
    1185                 :            :  * \return              1 if `l < r`.
    1186                 :            :  *                      0 if `l >= r`.
    1187                 :            :  */
    1188                 :     398539 : static mbedtls_mpi_uint mpi_sub_hlp( size_t n,
    1189                 :            :                                      mbedtls_mpi_uint *d,
    1190                 :            :                                      const mbedtls_mpi_uint *l,
    1191                 :            :                                      const mbedtls_mpi_uint *r )
    1192                 :            : {
    1193                 :     398539 :     size_t i;
    1194                 :     398539 :     mbedtls_mpi_uint c = 0, t, z;
    1195                 :            : 
    1196         [ +  + ]:    5229337 :     for( i = 0; i < n; i++ )
    1197                 :            :     {
    1198                 :    4830798 :         z = ( l[i] <  c );    t = l[i] - c;
    1199                 :    4830798 :         c = ( t < r[i] ) + z; d[i] = t - r[i];
    1200                 :            :     }
    1201                 :            : 
    1202                 :     398539 :     return( c );
    1203                 :            : }
    1204                 :            : 
    1205                 :            : /*
    1206                 :            :  * Unsigned subtraction: X = |A| - |B|  (HAC 14.9, 14.10)
    1207                 :            :  */
    1208                 :     397399 : int mbedtls_mpi_sub_abs( mbedtls_mpi *X, const mbedtls_mpi *A, const mbedtls_mpi *B )
    1209                 :            : {
    1210                 :     397399 :     int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
    1211                 :     397399 :     size_t n;
    1212                 :     397399 :     mbedtls_mpi_uint carry;
    1213                 :     397399 :     MPI_VALIDATE_RET( X != NULL );
    1214                 :     397399 :     MPI_VALIDATE_RET( A != NULL );
    1215                 :     397399 :     MPI_VALIDATE_RET( B != NULL );
    1216                 :            : 
    1217         [ +  + ]:    2144277 :     for( n = B->n; n > 0; n-- )
    1218         [ +  + ]:    2144157 :         if( B->p[n - 1] != 0 )
    1219                 :            :             break;
    1220         [ -  + ]:     397399 :     if( n > A->n )
    1221                 :            :     {
    1222                 :            :         /* B >= (2^ciL)^n > A */
    1223                 :          0 :         ret = MBEDTLS_ERR_MPI_NEGATIVE_VALUE;
    1224                 :          0 :         goto cleanup;
    1225                 :            :     }
    1226                 :            : 
    1227         [ -  + ]:     397399 :     MBEDTLS_MPI_CHK( mbedtls_mpi_grow( X, A->n ) );
    1228                 :            : 
    1229                 :            :     /* Set the high limbs of X to match A. Don't touch the lower limbs
    1230                 :            :      * because X might be aliased to B, and we must not overwrite the
    1231                 :            :      * significant digits of B. */
    1232         [ +  + ]:     397399 :     if( A->n > n )
    1233                 :     332534 :         memcpy( X->p + n, A->p + n, ( A->n - n ) * ciL );
    1234         [ +  + ]:     397399 :     if( X->n > A->n )
    1235                 :      16694 :         memset( X->p + A->n, 0, ( X->n - A->n ) * ciL );
    1236                 :            : 
    1237                 :     397399 :     carry = mpi_sub_hlp( n, X->p, A->p, B->p );
    1238         [ +  + ]:     397399 :     if( carry != 0 )
    1239                 :            :     {
    1240                 :            :         /* Propagate the carry to the first nonzero limb of X. */
    1241   [ +  -  -  + ]:      12380 :         for( ; n < X->n && X->p[n] == 0; n++ )
    1242                 :          0 :             --X->p[n];
    1243                 :            :         /* If we ran out of space for the carry, it means that the result
    1244                 :            :          * is negative. */
    1245         [ -  + ]:      12380 :         if( n == X->n )
    1246                 :            :         {
    1247                 :          0 :             ret = MBEDTLS_ERR_MPI_NEGATIVE_VALUE;
    1248                 :          0 :             goto cleanup;
    1249                 :            :         }
    1250                 :      12380 :         --X->p[n];
    1251                 :            :     }
    1252                 :            : 
    1253                 :            :     /* X should always be positive as a result of unsigned subtractions. */
    1254                 :     397399 :     X->s = 1;
    1255                 :            : 
    1256                 :     397399 : cleanup:
    1257                 :     397399 :     return( ret );
    1258                 :            : }
    1259                 :            : 
    1260                 :            : /*
    1261                 :            :  * Signed addition: X = A + B
    1262                 :            :  */
    1263                 :      23488 : int mbedtls_mpi_add_mpi( mbedtls_mpi *X, const mbedtls_mpi *A, const mbedtls_mpi *B )
    1264                 :            : {
    1265                 :      23488 :     int ret, s;
    1266                 :      23488 :     MPI_VALIDATE_RET( X != NULL );
    1267                 :      23488 :     MPI_VALIDATE_RET( A != NULL );
    1268                 :      23488 :     MPI_VALIDATE_RET( B != NULL );
    1269                 :            : 
    1270                 :      23488 :     s = A->s;
    1271         [ +  + ]:      23488 :     if( A->s * B->s < 0 )
    1272                 :            :     {
    1273         [ +  + ]:      14659 :         if( mbedtls_mpi_cmp_abs( A, B ) >= 0 )
    1274                 :            :         {
    1275         [ -  + ]:        248 :             MBEDTLS_MPI_CHK( mbedtls_mpi_sub_abs( X, A, B ) );
    1276                 :        248 :             X->s =  s;
    1277                 :            :         }
    1278                 :            :         else
    1279                 :            :         {
    1280         [ -  + ]:      14411 :             MBEDTLS_MPI_CHK( mbedtls_mpi_sub_abs( X, B, A ) );
    1281                 :      14411 :             X->s = -s;
    1282                 :            :         }
    1283                 :            :     }
    1284                 :            :     else
    1285                 :            :     {
    1286         [ -  + ]:       8829 :         MBEDTLS_MPI_CHK( mbedtls_mpi_add_abs( X, A, B ) );
    1287                 :       8829 :         X->s = s;
    1288                 :            :     }
    1289                 :            : 
    1290                 :      23488 : cleanup:
    1291                 :            : 
    1292                 :      23488 :     return( ret );
    1293                 :            : }
    1294                 :            : 
    1295                 :            : /*
    1296                 :            :  * Signed subtraction: X = A - B
    1297                 :            :  */
    1298                 :     375391 : int mbedtls_mpi_sub_mpi( mbedtls_mpi *X, const mbedtls_mpi *A, const mbedtls_mpi *B )
    1299                 :            : {
    1300                 :     375391 :     int ret, s;
    1301                 :     375391 :     MPI_VALIDATE_RET( X != NULL );
    1302                 :     375391 :     MPI_VALIDATE_RET( A != NULL );
    1303                 :     375391 :     MPI_VALIDATE_RET( B != NULL );
    1304                 :            : 
    1305                 :     375391 :     s = A->s;
    1306         [ +  + ]:     375391 :     if( A->s * B->s > 0 )
    1307                 :            :     {
    1308         [ +  + ]:     361168 :         if( mbedtls_mpi_cmp_abs( A, B ) >= 0 )
    1309                 :            :         {
    1310         [ -  + ]:     340754 :             MBEDTLS_MPI_CHK( mbedtls_mpi_sub_abs( X, A, B ) );
    1311                 :     340754 :             X->s =  s;
    1312                 :            :         }
    1313                 :            :         else
    1314                 :            :         {
    1315         [ -  + ]:      20414 :             MBEDTLS_MPI_CHK( mbedtls_mpi_sub_abs( X, B, A ) );
    1316                 :      20414 :             X->s = -s;
    1317                 :            :         }
    1318                 :            :     }
    1319                 :            :     else
    1320                 :            :     {
    1321         [ -  + ]:      14223 :         MBEDTLS_MPI_CHK( mbedtls_mpi_add_abs( X, A, B ) );
    1322                 :      14223 :         X->s = s;
    1323                 :            :     }
    1324                 :            : 
    1325                 :     375391 : cleanup:
    1326                 :            : 
    1327                 :     375391 :     return( ret );
    1328                 :            : }
    1329                 :            : 
    1330                 :            : /*
    1331                 :            :  * Signed addition: X = A + b
    1332                 :            :  */
    1333                 :          4 : int mbedtls_mpi_add_int( mbedtls_mpi *X, const mbedtls_mpi *A, mbedtls_mpi_sint b )
    1334                 :            : {
    1335                 :          4 :     mbedtls_mpi B;
    1336                 :          4 :     mbedtls_mpi_uint p[1];
    1337                 :          4 :     MPI_VALIDATE_RET( X != NULL );
    1338                 :          4 :     MPI_VALIDATE_RET( A != NULL );
    1339                 :            : 
    1340                 :          4 :     p[0] = ( b < 0 ) ? -b : b;
    1341         [ +  - ]:          4 :     B.s = ( b < 0 ) ? -1 : 1;
    1342                 :          4 :     B.n = 1;
    1343                 :          4 :     B.p = p;
    1344                 :            : 
    1345                 :          4 :     return( mbedtls_mpi_add_mpi( X, A, &B ) );
    1346                 :            : }
    1347                 :            : 
    1348                 :            : /*
    1349                 :            :  * Signed subtraction: X = A - b
    1350                 :            :  */
    1351                 :         44 : int mbedtls_mpi_sub_int( mbedtls_mpi *X, const mbedtls_mpi *A, mbedtls_mpi_sint b )
    1352                 :            : {
    1353                 :         44 :     mbedtls_mpi B;
    1354                 :         44 :     mbedtls_mpi_uint p[1];
    1355                 :         44 :     MPI_VALIDATE_RET( X != NULL );
    1356                 :         44 :     MPI_VALIDATE_RET( A != NULL );
    1357                 :            : 
    1358                 :         44 :     p[0] = ( b < 0 ) ? -b : b;
    1359         [ +  - ]:         44 :     B.s = ( b < 0 ) ? -1 : 1;
    1360                 :         44 :     B.n = 1;
    1361                 :         44 :     B.p = p;
    1362                 :            : 
    1363                 :         44 :     return( mbedtls_mpi_sub_mpi( X, A, &B ) );
    1364                 :            : }
    1365                 :            : 
    1366                 :            : /** Helper for mbedtls_mpi multiplication.
    1367                 :            :  *
    1368                 :            :  * Add \p b * \p s to \p d.
    1369                 :            :  *
    1370                 :            :  * \param i             The number of limbs of \p s.
    1371                 :            :  * \param[in] s         A bignum to multiply, of size \p i.
    1372                 :            :  *                      It may overlap with \p d, but only if
    1373                 :            :  *                      \p d <= \p s.
    1374                 :            :  *                      Its leading limb must not be \c 0.
    1375                 :            :  * \param[in,out] d     The bignum to add to.
    1376                 :            :  *                      It must be sufficiently large to store the
    1377                 :            :  *                      result of the multiplication. This means
    1378                 :            :  *                      \p i + 1 limbs if \p d[\p i - 1] started as 0 and \p b
    1379                 :            :  *                      is not known a priori.
    1380                 :            :  * \param b             A scalar to multiply.
    1381                 :            :  */
    1382                 :            : static
    1383                 :            : #if defined(__APPLE__) && defined(__arm__)
    1384                 :            : /*
    1385                 :            :  * Apple LLVM version 4.2 (clang-425.0.24) (based on LLVM 3.2svn)
    1386                 :            :  * appears to need this to prevent bad ARM code generation at -O3.
    1387                 :            :  */
    1388                 :            : __attribute__ ((noinline))
    1389                 :            : #endif
    1390                 :    1105260 : void mpi_mul_hlp( size_t i,
    1391                 :            :                   const mbedtls_mpi_uint *s,
    1392                 :            :                   mbedtls_mpi_uint *d,
    1393                 :            :                   mbedtls_mpi_uint b )
    1394                 :            : {
    1395                 :    1105260 :     mbedtls_mpi_uint c = 0, t = 0;
    1396                 :            : 
    1397                 :            : #if defined(MULADDC_HUIT)
    1398                 :            :     for( ; i >= 8; i -= 8 )
    1399                 :            :     {
    1400                 :            :         MULADDC_INIT
    1401                 :            :         MULADDC_HUIT
    1402                 :            :         MULADDC_STOP
    1403                 :            :     }
    1404                 :            : 
    1405                 :            :     for( ; i > 0; i-- )
    1406                 :            :     {
    1407                 :            :         MULADDC_INIT
    1408                 :            :         MULADDC_CORE
    1409                 :            :         MULADDC_STOP
    1410                 :            :     }
    1411                 :            : #else /* MULADDC_HUIT */
    1412         [ +  + ]:    1105324 :     for( ; i >= 16; i -= 16 )
    1413                 :            :     {
    1414                 :         64 :         MULADDC_INIT
    1415                 :         64 :         MULADDC_CORE   MULADDC_CORE
    1416                 :         64 :         MULADDC_CORE   MULADDC_CORE
    1417                 :         64 :         MULADDC_CORE   MULADDC_CORE
    1418                 :         64 :         MULADDC_CORE   MULADDC_CORE
    1419                 :            : 
    1420                 :         64 :         MULADDC_CORE   MULADDC_CORE
    1421                 :         64 :         MULADDC_CORE   MULADDC_CORE
    1422                 :         64 :         MULADDC_CORE   MULADDC_CORE
    1423                 :         64 :         MULADDC_CORE   MULADDC_CORE
    1424                 :            :         MULADDC_STOP
    1425                 :            :     }
    1426                 :            : 
    1427         [ +  + ]:    1750306 :     for( ; i >= 8; i -= 8 )
    1428                 :            :     {
    1429                 :     645046 :         MULADDC_INIT
    1430                 :     645046 :         MULADDC_CORE   MULADDC_CORE
    1431                 :     645046 :         MULADDC_CORE   MULADDC_CORE
    1432                 :            : 
    1433                 :     645046 :         MULADDC_CORE   MULADDC_CORE
    1434                 :     645046 :         MULADDC_CORE   MULADDC_CORE
    1435                 :            :         MULADDC_STOP
    1436                 :            :     }
    1437                 :            : 
    1438         [ +  + ]:    2336370 :     for( ; i > 0; i-- )
    1439                 :            :     {
    1440                 :    1231110 :         MULADDC_INIT
    1441                 :    1231110 :         MULADDC_CORE
    1442                 :            :         MULADDC_STOP
    1443                 :            :     }
    1444                 :            : #endif /* MULADDC_HUIT */
    1445                 :            : 
    1446                 :    2278801 :     t++;
    1447                 :            : 
    1448         [ +  + ]:    2278801 :     while( c != 0 )
    1449                 :            :     {
    1450                 :    1173541 :         *d += c; c = ( *d < c ); d++;
    1451                 :            :     }
    1452                 :    1105260 : }
    1453                 :            : 
    1454                 :            : /*
    1455                 :            :  * Baseline multiplication: X = A * B  (HAC 14.12)
    1456                 :            :  */
    1457                 :      39216 : int mbedtls_mpi_mul_mpi( mbedtls_mpi *X, const mbedtls_mpi *A, const mbedtls_mpi *B )
    1458                 :            : {
    1459                 :      39216 :     int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
    1460                 :      39216 :     size_t i, j;
    1461                 :      39216 :     mbedtls_mpi TA, TB;
    1462                 :      39216 :     int result_is_zero = 0;
    1463                 :      39216 :     MPI_VALIDATE_RET( X != NULL );
    1464                 :      39216 :     MPI_VALIDATE_RET( A != NULL );
    1465                 :      39216 :     MPI_VALIDATE_RET( B != NULL );
    1466                 :            : 
    1467                 :      39216 :     mbedtls_mpi_init( &TA ); mbedtls_mpi_init( &TB );
    1468                 :            : 
    1469   [ +  +  -  + ]:      39216 :     if( X == A ) { MBEDTLS_MPI_CHK( mbedtls_mpi_copy( &TA, A ) ); A = &TA; }
    1470   [ -  +  -  - ]:      39216 :     if( X == B ) { MBEDTLS_MPI_CHK( mbedtls_mpi_copy( &TB, B ) ); B = &TB; }
    1471                 :            : 
    1472         [ +  - ]:     121703 :     for( i = A->n; i > 0; i-- )
    1473         [ +  + ]:     121703 :         if( A->p[i - 1] != 0 )
    1474                 :            :             break;
    1475         [ -  + ]:      39216 :     if( i == 0 )
    1476                 :          0 :         result_is_zero = 1;
    1477                 :            : 
    1478         [ +  - ]:     174656 :     for( j = B->n; j > 0; j-- )
    1479         [ +  + ]:     174656 :         if( B->p[j - 1] != 0 )
    1480                 :            :             break;
    1481         [ -  + ]:      39216 :     if( j == 0 )
    1482                 :          0 :         result_is_zero = 1;
    1483                 :            : 
    1484         [ -  + ]:      39216 :     MBEDTLS_MPI_CHK( mbedtls_mpi_grow( X, i + j ) );
    1485         [ +  - ]:      39216 :     MBEDTLS_MPI_CHK( mbedtls_mpi_lset( X, 0 ) );
    1486                 :            : 
    1487         [ +  + ]:     352196 :     for( ; j > 0; j-- )
    1488                 :     312980 :         mpi_mul_hlp( i, A->p, X->p + j - 1, B->p[j - 1] );
    1489                 :            : 
    1490                 :            :     /* If the result is 0, we don't shortcut the operation, which reduces
    1491                 :            :      * but does not eliminate side channels leaking the zero-ness. We do
    1492                 :            :      * need to take care to set the sign bit properly since the library does
    1493                 :            :      * not fully support an MPI object with a value of 0 and s == -1. */
    1494         [ -  + ]:      39216 :     if( result_is_zero )
    1495                 :          0 :         X->s = 1;
    1496                 :            :     else
    1497                 :      39216 :         X->s = A->s * B->s;
    1498                 :            : 
    1499                 :      39216 : cleanup:
    1500                 :            : 
    1501                 :      39216 :     mbedtls_mpi_free( &TB ); mbedtls_mpi_free( &TA );
    1502                 :            : 
    1503                 :      39216 :     return( ret );
    1504                 :            : }
    1505                 :            : 
    1506                 :            : /*
    1507                 :            :  * Baseline multiplication: X = A * b
    1508                 :            :  */
    1509                 :     774056 : int mbedtls_mpi_mul_int( mbedtls_mpi *X, const mbedtls_mpi *A, mbedtls_mpi_uint b )
    1510                 :            : {
    1511                 :     774056 :     MPI_VALIDATE_RET( X != NULL );
    1512                 :     774056 :     MPI_VALIDATE_RET( A != NULL );
    1513                 :            : 
    1514                 :            :     /* mpi_mul_hlp can't deal with a leading 0. */
    1515                 :     774056 :     size_t n = A->n;
    1516   [ +  -  +  + ]:   10644116 :     while( n > 0 && A->p[n - 1] == 0 )
    1517                 :    9870060 :         --n;
    1518                 :            : 
    1519                 :            :     /* The general method below doesn't work if n==0 or b==0. By chance
    1520                 :            :      * calculating the result is trivial in those cases. */
    1521         [ +  + ]:     774056 :     if( b == 0 || n == 0 )
    1522                 :            :     {
    1523                 :         16 :         return( mbedtls_mpi_lset( X, 0 ) );
    1524                 :            :     }
    1525                 :            : 
    1526                 :            :     /* Calculate A*b as A + A*(b-1) to take advantage of mpi_mul_hlp */
    1527                 :     774040 :     int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
    1528                 :            :     /* In general, A * b requires 1 limb more than b. If
    1529                 :            :      * A->p[n - 1] * b / b == A->p[n - 1], then A * b fits in the same
    1530                 :            :      * number of limbs as A and the call to grow() is not required since
    1531                 :            :      * copy() will take care of the growth if needed. However, experimentally,
    1532                 :            :      * making the call to grow() unconditional causes slightly fewer
    1533                 :            :      * calls to calloc() in ECP code, presumably because it reuses the
    1534                 :            :      * same mpi for a while and this way the mpi is more likely to directly
    1535                 :            :      * grow to its final size. */
    1536         [ -  + ]:     774040 :     MBEDTLS_MPI_CHK( mbedtls_mpi_grow( X, n + 1 ) );
    1537         [ -  + ]:     774040 :     MBEDTLS_MPI_CHK( mbedtls_mpi_copy( X, A ) );
    1538                 :     774040 :     mpi_mul_hlp( n, A->p, X->p, b - 1 );
    1539                 :            : 
    1540                 :            : cleanup:
    1541                 :            :     return( ret );
    1542                 :            : }
    1543                 :            : 
    1544                 :            : /*
    1545                 :            :  * Unsigned integer divide - double mbedtls_mpi_uint dividend, u1/u0, and
    1546                 :            :  * mbedtls_mpi_uint divisor, d
    1547                 :            :  */
    1548                 :     311884 : static mbedtls_mpi_uint mbedtls_int_div_int( mbedtls_mpi_uint u1,
    1549                 :            :             mbedtls_mpi_uint u0, mbedtls_mpi_uint d, mbedtls_mpi_uint *r )
    1550                 :            : {
    1551                 :            : #if defined(MBEDTLS_HAVE_UDBL)
    1552                 :     311884 :     mbedtls_t_udbl dividend, quotient;
    1553                 :            : #else
    1554                 :            :     const mbedtls_mpi_uint radix = (mbedtls_mpi_uint) 1 << biH;
    1555                 :            :     const mbedtls_mpi_uint uint_halfword_mask = ( (mbedtls_mpi_uint) 1 << biH ) - 1;
    1556                 :            :     mbedtls_mpi_uint d0, d1, q0, q1, rAX, r0, quotient;
    1557                 :            :     mbedtls_mpi_uint u0_msw, u0_lsw;
    1558                 :            :     size_t s;
    1559                 :            : #endif
    1560                 :            : 
    1561                 :            :     /*
    1562                 :            :      * Check for overflow
    1563                 :            :      */
    1564         [ -  + ]:     311884 :     if( 0 == d || u1 >= d )
    1565                 :            :     {
    1566         [ #  # ]:          0 :         if (r != NULL) *r = ~0;
    1567                 :            : 
    1568                 :          0 :         return ( ~0 );
    1569                 :            :     }
    1570                 :            : 
    1571                 :            : #if defined(MBEDTLS_HAVE_UDBL)
    1572                 :     311884 :     dividend  = (mbedtls_t_udbl) u1 << biL;
    1573                 :     311884 :     dividend |= (mbedtls_t_udbl) u0;
    1574                 :     311884 :     quotient = dividend / d;
    1575                 :     311884 :     if( quotient > ( (mbedtls_t_udbl) 1 << biL ) - 1 )
    1576                 :            :         quotient = ( (mbedtls_t_udbl) 1 << biL ) - 1;
    1577                 :            : 
    1578         [ -  + ]:     311884 :     if( r != NULL )
    1579                 :          0 :         *r = (mbedtls_mpi_uint)( dividend - (quotient * d ) );
    1580                 :            : 
    1581                 :     311884 :     return (mbedtls_mpi_uint) quotient;
    1582                 :            : #else
    1583                 :            : 
    1584                 :            :     /*
    1585                 :            :      * Algorithm D, Section 4.3.1 - The Art of Computer Programming
    1586                 :            :      *   Vol. 2 - Seminumerical Algorithms, Knuth
    1587                 :            :      */
    1588                 :            : 
    1589                 :            :     /*
    1590                 :            :      * Normalize the divisor, d, and dividend, u0, u1
    1591                 :            :      */
    1592                 :            :     s = mbedtls_clz( d );
    1593                 :            :     d = d << s;
    1594                 :            : 
    1595                 :            :     u1 = u1 << s;
    1596                 :            :     u1 |= ( u0 >> ( biL - s ) ) & ( -(mbedtls_mpi_sint)s >> ( biL - 1 ) );
    1597                 :            :     u0 =  u0 << s;
    1598                 :            : 
    1599                 :            :     d1 = d >> biH;
    1600                 :            :     d0 = d & uint_halfword_mask;
    1601                 :            : 
    1602                 :            :     u0_msw = u0 >> biH;
    1603                 :            :     u0_lsw = u0 & uint_halfword_mask;
    1604                 :            : 
    1605                 :            :     /*
    1606                 :            :      * Find the first quotient and remainder
    1607                 :            :      */
    1608                 :            :     q1 = u1 / d1;
    1609                 :            :     r0 = u1 - d1 * q1;
    1610                 :            : 
    1611                 :            :     while( q1 >= radix || ( q1 * d0 > radix * r0 + u0_msw ) )
    1612                 :            :     {
    1613                 :            :         q1 -= 1;
    1614                 :            :         r0 += d1;
    1615                 :            : 
    1616                 :            :         if ( r0 >= radix ) break;
    1617                 :            :     }
    1618                 :            : 
    1619                 :            :     rAX = ( u1 * radix ) + ( u0_msw - q1 * d );
    1620                 :            :     q0 = rAX / d1;
    1621                 :            :     r0 = rAX - q0 * d1;
    1622                 :            : 
    1623                 :            :     while( q0 >= radix || ( q0 * d0 > radix * r0 + u0_lsw ) )
    1624                 :            :     {
    1625                 :            :         q0 -= 1;
    1626                 :            :         r0 += d1;
    1627                 :            : 
    1628                 :            :         if ( r0 >= radix ) break;
    1629                 :            :     }
    1630                 :            : 
    1631                 :            :     if (r != NULL)
    1632                 :            :         *r = ( rAX * radix + u0_lsw - q0 * d ) >> s;
    1633                 :            : 
    1634                 :            :     quotient = q1 * radix + q0;
    1635                 :            : 
    1636                 :            :     return quotient;
    1637                 :            : #endif
    1638                 :            : }
    1639                 :            : 
    1640                 :            : /*
    1641                 :            :  * Division by mbedtls_mpi: A = Q * B + R  (HAC 14.20)
    1642                 :            :  */
    1643                 :      39274 : int mbedtls_mpi_div_mpi( mbedtls_mpi *Q, mbedtls_mpi *R, const mbedtls_mpi *A,
    1644                 :            :                          const mbedtls_mpi *B )
    1645                 :            : {
    1646                 :      39274 :     int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
    1647                 :      39274 :     size_t i, n, t, k;
    1648                 :      39274 :     mbedtls_mpi X, Y, Z, T1, T2;
    1649                 :      39274 :     mbedtls_mpi_uint TP2[3];
    1650                 :      39274 :     MPI_VALIDATE_RET( A != NULL );
    1651                 :      39274 :     MPI_VALIDATE_RET( B != NULL );
    1652                 :            : 
    1653         [ +  - ]:      39274 :     if( mbedtls_mpi_cmp_int( B, 0 ) == 0 )
    1654                 :            :         return( MBEDTLS_ERR_MPI_DIVISION_BY_ZERO );
    1655                 :            : 
    1656                 :      39274 :     mbedtls_mpi_init( &X ); mbedtls_mpi_init( &Y ); mbedtls_mpi_init( &Z );
    1657                 :      39274 :     mbedtls_mpi_init( &T1 );
    1658                 :            :     /*
    1659                 :            :      * Avoid dynamic memory allocations for constant-size T2.
    1660                 :            :      *
    1661                 :            :      * T2 is used for comparison only and the 3 limbs are assigned explicitly,
    1662                 :            :      * so nobody increase the size of the MPI and we're safe to use an on-stack
    1663                 :            :      * buffer.
    1664                 :            :      */
    1665                 :      39274 :     T2.s = 1;
    1666                 :      39274 :     T2.n = sizeof( TP2 ) / sizeof( *TP2 );
    1667                 :      39274 :     T2.p = TP2;
    1668                 :            : 
    1669         [ +  + ]:      39274 :     if( mbedtls_mpi_cmp_abs( A, B ) < 0 )
    1670                 :            :     {
    1671   [ -  +  -  - ]:        298 :         if( Q != NULL ) MBEDTLS_MPI_CHK( mbedtls_mpi_lset( Q, 0 ) );
    1672   [ +  -  -  + ]:        298 :         if( R != NULL ) MBEDTLS_MPI_CHK( mbedtls_mpi_copy( R, A ) );
    1673                 :        298 :         return( 0 );
    1674                 :            :     }
    1675                 :            : 
    1676         [ -  + ]:      38976 :     MBEDTLS_MPI_CHK( mbedtls_mpi_copy( &X, A ) );
    1677         [ -  + ]:      38976 :     MBEDTLS_MPI_CHK( mbedtls_mpi_copy( &Y, B ) );
    1678                 :      38976 :     X.s = Y.s = 1;
    1679                 :            : 
    1680         [ -  + ]:      38976 :     MBEDTLS_MPI_CHK( mbedtls_mpi_grow( &Z, A->n + 2 ) );
    1681         [ -  + ]:      38976 :     MBEDTLS_MPI_CHK( mbedtls_mpi_lset( &Z,  0 ) );
    1682         [ -  + ]:      38976 :     MBEDTLS_MPI_CHK( mbedtls_mpi_grow( &T1, A->n + 2 ) );
    1683                 :            : 
    1684                 :      38976 :     k = mbedtls_mpi_bitlen( &Y ) % biL;
    1685         [ +  - ]:      38976 :     if( k < biL - 1 )
    1686                 :            :     {
    1687                 :      38976 :         k = biL - 1 - k;
    1688         [ -  + ]:      38976 :         MBEDTLS_MPI_CHK( mbedtls_mpi_shift_l( &X, k ) );
    1689         [ -  + ]:      38976 :         MBEDTLS_MPI_CHK( mbedtls_mpi_shift_l( &Y, k ) );
    1690                 :            :     }
    1691                 :            :     else k = 0;
    1692                 :            : 
    1693                 :      38976 :     n = X.n - 1;
    1694                 :      38976 :     t = Y.n - 1;
    1695         [ -  + ]:      38976 :     MBEDTLS_MPI_CHK( mbedtls_mpi_shift_l( &Y, biL * ( n - t ) ) );
    1696                 :            : 
    1697                 :      38980 :     while( mbedtls_mpi_cmp_mpi( &X, &Y ) >= 0 )
    1698                 :            :     {
    1699                 :          4 :         Z.p[n - t]++;
    1700   [ -  +  +  + ]:      38980 :         MBEDTLS_MPI_CHK( mbedtls_mpi_sub_mpi( &X, &X, &Y ) );
    1701                 :            :     }
    1702         [ -  + ]:      38976 :     MBEDTLS_MPI_CHK( mbedtls_mpi_shift_r( &Y, biL * ( n - t ) ) );
    1703                 :            : 
    1704         [ +  + ]:     350880 :     for( i = n; i > t ; i-- )
    1705                 :            :     {
    1706         [ +  + ]:     311904 :         if( X.p[i] >= Y.p[t] )
    1707                 :         20 :             Z.p[i - t - 1] = ~0;
    1708                 :            :         else
    1709                 :            :         {
    1710                 :     311884 :             Z.p[i - t - 1] = mbedtls_int_div_int( X.p[i], X.p[i - 1],
    1711                 :            :                                                             Y.p[t], NULL);
    1712                 :            :         }
    1713                 :            : 
    1714         [ +  - ]:     311904 :         T2.p[0] = ( i < 2 ) ? 0 : X.p[i - 2];
    1715                 :     311904 :         T2.p[1] = ( i < 1 ) ? 0 : X.p[i - 1];
    1716                 :     311904 :         T2.p[2] = X.p[i];
    1717                 :            : 
    1718                 :     311904 :         Z.p[i - t - 1]++;
    1719                 :     459072 :         do
    1720                 :            :         {
    1721                 :     459072 :             Z.p[i - t - 1]--;
    1722                 :            : 
    1723         [ -  + ]:     459072 :             MBEDTLS_MPI_CHK( mbedtls_mpi_lset( &T1, 0 ) );
    1724         [ +  - ]:     459072 :             T1.p[0] = ( t < 1 ) ? 0 : Y.p[t - 1];
    1725                 :     459072 :             T1.p[1] = Y.p[t];
    1726         [ -  + ]:     459072 :             MBEDTLS_MPI_CHK( mbedtls_mpi_mul_int( &T1, &T1, Z.p[i - t - 1] ) );
    1727                 :            :         }
    1728         [ +  + ]:     459072 :         while( mbedtls_mpi_cmp_mpi( &T1, &T2 ) > 0 );
    1729                 :            : 
    1730         [ -  + ]:     311904 :         MBEDTLS_MPI_CHK( mbedtls_mpi_mul_int( &T1, &Y, Z.p[i - t - 1] ) );
    1731         [ -  + ]:     311904 :         MBEDTLS_MPI_CHK( mbedtls_mpi_shift_l( &T1,  biL * ( i - t - 1 ) ) );
    1732         [ -  + ]:     311904 :         MBEDTLS_MPI_CHK( mbedtls_mpi_sub_mpi( &X, &X, &T1 ) );
    1733                 :            : 
    1734         [ +  + ]:     311904 :         if( mbedtls_mpi_cmp_int( &X, 0 ) < 0 )
    1735                 :            :         {
    1736         [ -  + ]:          4 :             MBEDTLS_MPI_CHK( mbedtls_mpi_copy( &T1, &Y ) );
    1737         [ -  + ]:          4 :             MBEDTLS_MPI_CHK( mbedtls_mpi_shift_l( &T1, biL * ( i - t - 1 ) ) );
    1738         [ -  + ]:          4 :             MBEDTLS_MPI_CHK( mbedtls_mpi_add_mpi( &X, &X, &T1 ) );
    1739                 :          4 :             Z.p[i - t - 1]--;
    1740                 :            :         }
    1741                 :            :     }
    1742                 :            : 
    1743         [ -  + ]:      38976 :     if( Q != NULL )
    1744                 :            :     {
    1745         [ #  # ]:          0 :         MBEDTLS_MPI_CHK( mbedtls_mpi_copy( Q, &Z ) );
    1746                 :          0 :         Q->s = A->s * B->s;
    1747                 :            :     }
    1748                 :            : 
    1749         [ -  + ]:      38976 :     if( R != NULL )
    1750                 :            :     {
    1751         [ -  + ]:      38976 :         MBEDTLS_MPI_CHK( mbedtls_mpi_shift_r( &X, k ) );
    1752                 :      38976 :         X.s = A->s;
    1753         [ -  + ]:      38976 :         MBEDTLS_MPI_CHK( mbedtls_mpi_copy( R, &X ) );
    1754                 :            : 
    1755         [ +  - ]:      38976 :         if( mbedtls_mpi_cmp_int( R, 0 ) == 0 )
    1756                 :          0 :             R->s = 1;
    1757                 :            :     }
    1758                 :            : 
    1759                 :      38976 : cleanup:
    1760                 :            : 
    1761                 :      38976 :     mbedtls_mpi_free( &X ); mbedtls_mpi_free( &Y ); mbedtls_mpi_free( &Z );
    1762                 :      38976 :     mbedtls_mpi_free( &T1 );
    1763                 :      38976 :     mbedtls_platform_zeroize( TP2, sizeof( TP2 ) );
    1764                 :            : 
    1765                 :      38976 :     return( ret );
    1766                 :            : }
    1767                 :            : 
    1768                 :            : /*
    1769                 :            :  * Division by int: A = Q * b + R
    1770                 :            :  */
    1771                 :          0 : int mbedtls_mpi_div_int( mbedtls_mpi *Q, mbedtls_mpi *R,
    1772                 :            :                          const mbedtls_mpi *A,
    1773                 :            :                          mbedtls_mpi_sint b )
    1774                 :            : {
    1775                 :          0 :     mbedtls_mpi B;
    1776                 :          0 :     mbedtls_mpi_uint p[1];
    1777                 :          0 :     MPI_VALIDATE_RET( A != NULL );
    1778                 :            : 
    1779                 :          0 :     p[0] = ( b < 0 ) ? -b : b;
    1780         [ #  # ]:          0 :     B.s = ( b < 0 ) ? -1 : 1;
    1781                 :          0 :     B.n = 1;
    1782                 :          0 :     B.p = p;
    1783                 :            : 
    1784                 :          0 :     return( mbedtls_mpi_div_mpi( Q, R, A, &B ) );
    1785                 :            : }
    1786                 :            : 
    1787                 :            : /*
    1788                 :            :  * Modulo: R = A mod B
    1789                 :            :  */
    1790                 :      39274 : int mbedtls_mpi_mod_mpi( mbedtls_mpi *R, const mbedtls_mpi *A, const mbedtls_mpi *B )
    1791                 :            : {
    1792                 :      39274 :     int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
    1793                 :      39274 :     MPI_VALIDATE_RET( R != NULL );
    1794                 :      39274 :     MPI_VALIDATE_RET( A != NULL );
    1795                 :      39274 :     MPI_VALIDATE_RET( B != NULL );
    1796                 :            : 
    1797         [ +  - ]:      39274 :     if( mbedtls_mpi_cmp_int( B, 0 ) < 0 )
    1798                 :            :         return( MBEDTLS_ERR_MPI_NEGATIVE_VALUE );
    1799                 :            : 
    1800         [ -  + ]:      39274 :     MBEDTLS_MPI_CHK( mbedtls_mpi_div_mpi( NULL, R, A, B ) );
    1801                 :            : 
    1802                 :      39274 :     while( mbedtls_mpi_cmp_int( R, 0 ) < 0 )
    1803   [ -  -  -  + ]:      39274 :       MBEDTLS_MPI_CHK( mbedtls_mpi_add_mpi( R, R, B ) );
    1804                 :            : 
    1805                 :      39274 :     while( mbedtls_mpi_cmp_mpi( R, B ) >= 0 )
    1806   [ -  -  -  + ]:      39274 :       MBEDTLS_MPI_CHK( mbedtls_mpi_sub_mpi( R, R, B ) );
    1807                 :            : 
    1808                 :      39274 : cleanup:
    1809                 :            : 
    1810                 :            :     return( ret );
    1811                 :            : }
    1812                 :            : 
    1813                 :            : /*
    1814                 :            :  * Modulo: r = A mod b
    1815                 :            :  */
    1816                 :          0 : int mbedtls_mpi_mod_int( mbedtls_mpi_uint *r, const mbedtls_mpi *A, mbedtls_mpi_sint b )
    1817                 :            : {
    1818                 :          0 :     size_t i;
    1819                 :          0 :     mbedtls_mpi_uint x, y, z;
    1820                 :          0 :     MPI_VALIDATE_RET( r != NULL );
    1821                 :          0 :     MPI_VALIDATE_RET( A != NULL );
    1822                 :            : 
    1823         [ #  # ]:          0 :     if( b == 0 )
    1824                 :            :         return( MBEDTLS_ERR_MPI_DIVISION_BY_ZERO );
    1825                 :            : 
    1826         [ #  # ]:          0 :     if( b < 0 )
    1827                 :            :         return( MBEDTLS_ERR_MPI_NEGATIVE_VALUE );
    1828                 :            : 
    1829                 :            :     /*
    1830                 :            :      * handle trivial cases
    1831                 :            :      */
    1832         [ #  # ]:          0 :     if( b == 1 )
    1833                 :            :     {
    1834                 :          0 :         *r = 0;
    1835                 :          0 :         return( 0 );
    1836                 :            :     }
    1837                 :            : 
    1838         [ #  # ]:          0 :     if( b == 2 )
    1839                 :            :     {
    1840                 :          0 :         *r = A->p[0] & 1;
    1841                 :          0 :         return( 0 );
    1842                 :            :     }
    1843                 :            : 
    1844                 :            :     /*
    1845                 :            :      * general case
    1846                 :            :      */
    1847         [ #  # ]:          0 :     for( i = A->n, y = 0; i > 0; i-- )
    1848                 :            :     {
    1849                 :          0 :         x  = A->p[i - 1];
    1850                 :          0 :         y  = ( y << biH ) | ( x >> biH );
    1851                 :          0 :         z  = y / b;
    1852                 :          0 :         y -= z * b;
    1853                 :            : 
    1854                 :          0 :         x <<= biH;
    1855                 :          0 :         y  = ( y << biH ) | ( x >> biH );
    1856                 :          0 :         z  = y / b;
    1857                 :          0 :         y -= z * b;
    1858                 :            :     }
    1859                 :            : 
    1860                 :            :     /*
    1861                 :            :      * If A is negative, then the current y represents a negative value.
    1862                 :            :      * Flipping it to the positive side.
    1863                 :            :      */
    1864   [ #  #  #  # ]:          0 :     if( A->s < 0 && y != 0 )
    1865                 :          0 :         y = b - y;
    1866                 :            : 
    1867                 :          0 :     *r = y;
    1868                 :            : 
    1869                 :          0 :     return( 0 );
    1870                 :            : }
    1871                 :            : 
    1872                 :            : /*
    1873                 :            :  * Fast Montgomery initialization (thanks to Tom St Denis)
    1874                 :            :  */
    1875                 :          4 : static void mpi_montg_init( mbedtls_mpi_uint *mm, const mbedtls_mpi *N )
    1876                 :            : {
    1877                 :          4 :     mbedtls_mpi_uint x, m0 = N->p[0];
    1878                 :          4 :     unsigned int i;
    1879                 :            : 
    1880                 :          4 :     x  = m0;
    1881                 :          4 :     x += ( ( m0 + 2 ) & 4 ) << 1;
    1882                 :            : 
    1883         [ +  + ]:         16 :     for( i = biL; i >= 8; i /= 2 )
    1884                 :         12 :         x *= ( 2 - ( m0 * x ) );
    1885                 :            : 
    1886                 :          4 :     *mm = ~x + 1;
    1887                 :          4 : }
    1888                 :            : 
    1889                 :            : /** Montgomery multiplication: A = A * B * R^-1 mod N  (HAC 14.36)
    1890                 :            :  *
    1891                 :            :  * \param[in,out]   A   One of the numbers to multiply.
    1892                 :            :  *                      It must have at least as many limbs as N
    1893                 :            :  *                      (A->n >= N->n), and any limbs beyond n are ignored.
    1894                 :            :  *                      On successful completion, A contains the result of
    1895                 :            :  *                      the multiplication A * B * R^-1 mod N where
    1896                 :            :  *                      R = (2^ciL)^n.
    1897                 :            :  * \param[in]       B   One of the numbers to multiply.
    1898                 :            :  *                      It must be nonzero and must not have more limbs than N
    1899                 :            :  *                      (B->n <= N->n).
    1900                 :            :  * \param[in]       N   The modulo. N must be odd.
    1901                 :            :  * \param           mm  The value calculated by `mpi_montg_init(&mm, N)`.
    1902                 :            :  *                      This is -N^-1 mod 2^ciL.
    1903                 :            :  * \param[in,out]   T   A bignum for temporary storage.
    1904                 :            :  *                      It must be at least twice the limb size of N plus 2
    1905                 :            :  *                      (T->n >= 2 * (N->n + 1)).
    1906                 :            :  *                      Its initial content is unused and
    1907                 :            :  *                      its final content is indeterminate.
    1908                 :            :  *                      Note that unlike the usual convention in the library
    1909                 :            :  *                      for `const mbedtls_mpi*`, the content of T can change.
    1910                 :            :  */
    1911                 :       1140 : static void mpi_montmul( mbedtls_mpi *A, const mbedtls_mpi *B, const mbedtls_mpi *N, mbedtls_mpi_uint mm,
    1912                 :            :                          const mbedtls_mpi *T )
    1913                 :            : {
    1914                 :       1140 :     size_t i, n, m;
    1915                 :       1140 :     mbedtls_mpi_uint u0, u1, *d;
    1916                 :            : 
    1917                 :       1140 :     memset( T->p, 0, T->n * ciL );
    1918                 :            : 
    1919                 :       1140 :     d = T->p;
    1920                 :       1140 :     n = N->n;
    1921                 :       1140 :     m = ( B->n < n ) ? B->n : n;
    1922                 :            : 
    1923         [ +  + ]:      10260 :     for( i = 0; i < n; i++ )
    1924                 :            :     {
    1925                 :            :         /*
    1926                 :            :          * T = (T + u0*B + u1*N) / 2^biL
    1927                 :            :          */
    1928                 :       9120 :         u0 = A->p[i];
    1929                 :       9120 :         u1 = ( d[0] + u0 * B->p[0] ) * mm;
    1930                 :            : 
    1931                 :       9120 :         mpi_mul_hlp( m, B->p, d, u0 );
    1932                 :       9120 :         mpi_mul_hlp( n, N->p, d, u1 );
    1933                 :            : 
    1934                 :       9120 :         *d++ = u0; d[n + 1] = 0;
    1935                 :            :     }
    1936                 :            : 
    1937                 :            :     /* At this point, d is either the desired result or the desired result
    1938                 :            :      * plus N. We now potentially subtract N, avoiding leaking whether the
    1939                 :            :      * subtraction is performed through side channels. */
    1940                 :            : 
    1941                 :            :     /* Copy the n least significant limbs of d to A, so that
    1942                 :            :      * A = d if d < N (recall that N has n limbs). */
    1943                 :       1140 :     memcpy( A->p, d, n * ciL );
    1944                 :            :     /* If d >= N then we want to set A to d - N. To prevent timing attacks,
    1945                 :            :      * do the calculation without using conditional tests. */
    1946                 :            :     /* Set d to d0 + (2^biL)^n - N where d0 is the current value of d. */
    1947                 :       1140 :     d[n] += 1;
    1948                 :       1140 :     d[n] -= mpi_sub_hlp( n, d, d, N->p );
    1949                 :            :     /* If d0 < N then d < (2^biL)^n
    1950                 :            :      * so d[n] == 0 and we want to keep A as it is.
    1951                 :            :      * If d0 >= N then d >= (2^biL)^n, and d <= (2^biL)^n + N < 2 * (2^biL)^n
    1952                 :            :      * so d[n] == 1 and we want to set A to the result of the subtraction
    1953                 :            :      * which is d - (2^biL)^n, i.e. the n least significant limbs of d.
    1954                 :            :      * This exactly corresponds to a conditional assignment. */
    1955                 :       1140 :     mbedtls_ct_mpi_uint_cond_assign( n, A->p, d, (unsigned char) d[n] );
    1956                 :       1140 : }
    1957                 :            : 
    1958                 :            : /*
    1959                 :            :  * Montgomery reduction: A = A * R^-1 mod N
    1960                 :            :  *
    1961                 :            :  * See mpi_montmul() regarding constraints and guarantees on the parameters.
    1962                 :            :  */
    1963                 :          8 : static void mpi_montred( mbedtls_mpi *A, const mbedtls_mpi *N,
    1964                 :            :                          mbedtls_mpi_uint mm, const mbedtls_mpi *T )
    1965                 :            : {
    1966                 :          8 :     mbedtls_mpi_uint z = 1;
    1967                 :          8 :     mbedtls_mpi U;
    1968                 :            : 
    1969                 :          8 :     U.n = U.s = (int) z;
    1970                 :          8 :     U.p = &z;
    1971                 :            : 
    1972                 :          8 :     mpi_montmul( A, &U, N, mm, T );
    1973                 :          8 : }
    1974                 :            : 
    1975                 :            : /**
    1976                 :            :  * Select an MPI from a table without leaking the index.
    1977                 :            :  *
    1978                 :            :  * This is functionally equivalent to mbedtls_mpi_copy(R, T[idx]) except it
    1979                 :            :  * reads the entire table in order to avoid leaking the value of idx to an
    1980                 :            :  * attacker able to observe memory access patterns.
    1981                 :            :  *
    1982                 :            :  * \param[out] R        Where to write the selected MPI.
    1983                 :            :  * \param[in] T         The table to read from.
    1984                 :            :  * \param[in] T_size    The number of elements in the table.
    1985                 :            :  * \param[in] idx       The index of the element to select;
    1986                 :            :  *                      this must satisfy 0 <= idx < T_size.
    1987                 :            :  *
    1988                 :            :  * \return \c 0 on success, or a negative error code.
    1989                 :            :  */
    1990                 :         36 : static int mpi_select( mbedtls_mpi *R, const mbedtls_mpi *T, size_t T_size, size_t idx )
    1991                 :            : {
    1992                 :         36 :     int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
    1993                 :            : 
    1994         [ +  + ]:       1188 :     for( size_t i = 0; i < T_size; i++ )
    1995                 :            :     {
    1996         [ -  + ]:       1152 :         MBEDTLS_MPI_CHK( mbedtls_mpi_safe_cond_assign( R, &T[i],
    1997                 :            :                         (unsigned char) mbedtls_ct_size_bool_eq( i, idx ) ) );
    1998                 :            :     }
    1999                 :            : 
    2000                 :         36 : cleanup:
    2001                 :         36 :     return( ret );
    2002                 :            : }
    2003                 :            : 
    2004                 :            : /*
    2005                 :            :  * Sliding-window exponentiation: X = A^E mod N  (HAC 14.85)
    2006                 :            :  */
    2007                 :          4 : int mbedtls_mpi_exp_mod( mbedtls_mpi *X, const mbedtls_mpi *A,
    2008                 :            :                          const mbedtls_mpi *E, const mbedtls_mpi *N,
    2009                 :            :                          mbedtls_mpi *prec_RR )
    2010                 :            : {
    2011                 :          4 :     int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
    2012                 :          4 :     size_t wbits, wsize, one = 1;
    2013                 :          4 :     size_t i, j, nblimbs;
    2014                 :          4 :     size_t bufsize, nbits;
    2015                 :          4 :     mbedtls_mpi_uint ei, mm, state;
    2016                 :          4 :     mbedtls_mpi RR, T, W[ 1 << MBEDTLS_MPI_WINDOW_SIZE ], WW, Apos;
    2017                 :          4 :     int neg;
    2018                 :            : 
    2019                 :          4 :     MPI_VALIDATE_RET( X != NULL );
    2020                 :          4 :     MPI_VALIDATE_RET( A != NULL );
    2021                 :          4 :     MPI_VALIDATE_RET( E != NULL );
    2022                 :          4 :     MPI_VALIDATE_RET( N != NULL );
    2023                 :            : 
    2024   [ +  -  +  - ]:          4 :     if( mbedtls_mpi_cmp_int( N, 0 ) <= 0 || ( N->p[0] & 1 ) == 0 )
    2025                 :            :         return( MBEDTLS_ERR_MPI_BAD_INPUT_DATA );
    2026                 :            : 
    2027         [ +  - ]:          4 :     if( mbedtls_mpi_cmp_int( E, 0 ) < 0 )
    2028                 :            :         return( MBEDTLS_ERR_MPI_BAD_INPUT_DATA );
    2029                 :            : 
    2030         [ +  - ]:          4 :     if( mbedtls_mpi_bitlen( E ) > MBEDTLS_MPI_MAX_BITS ||
    2031         [ +  - ]:          4 :         mbedtls_mpi_bitlen( N ) > MBEDTLS_MPI_MAX_BITS )
    2032                 :            :         return ( MBEDTLS_ERR_MPI_BAD_INPUT_DATA );
    2033                 :            : 
    2034                 :            :     /*
    2035                 :            :      * Init temps and window size
    2036                 :            :      */
    2037                 :          4 :     mpi_montg_init( &mm, N );
    2038                 :          4 :     mbedtls_mpi_init( &RR ); mbedtls_mpi_init( &T );
    2039                 :          4 :     mbedtls_mpi_init( &Apos );
    2040                 :          4 :     mbedtls_mpi_init( &WW );
    2041         [ +  - ]:          4 :     memset( W, 0, sizeof( W ) );
    2042                 :            : 
    2043                 :          4 :     i = mbedtls_mpi_bitlen( E );
    2044                 :            : 
    2045   [ +  -  -  +  :          4 :     wsize = ( i > 671 ) ? 6 : ( i > 239 ) ? 5 :
             -  -  -  - ]
    2046                 :            :             ( i >  79 ) ? 4 : ( i >  23 ) ? 3 : 1;
    2047                 :            : 
    2048                 :            : #if( MBEDTLS_MPI_WINDOW_SIZE < 6 )
    2049                 :            :     if( wsize > MBEDTLS_MPI_WINDOW_SIZE )
    2050                 :            :         wsize = MBEDTLS_MPI_WINDOW_SIZE;
    2051                 :            : #endif
    2052                 :            : 
    2053                 :          4 :     j = N->n + 1;
    2054                 :            :     /* All W[i] and X must have at least N->n limbs for the mpi_montmul()
    2055                 :            :      * and mpi_montred() calls later. Here we ensure that W[1] and X are
    2056                 :            :      * large enough, and later we'll grow other W[i] to the same length.
    2057                 :            :      * They must not be shrunk midway through this function!
    2058                 :            :      */
    2059         [ -  + ]:          4 :     MBEDTLS_MPI_CHK( mbedtls_mpi_grow( X, j ) );
    2060         [ -  + ]:          4 :     MBEDTLS_MPI_CHK( mbedtls_mpi_grow( &W[1],  j ) );
    2061         [ -  + ]:          4 :     MBEDTLS_MPI_CHK( mbedtls_mpi_grow( &T, j * 2 ) );
    2062                 :            : 
    2063                 :            :     /*
    2064                 :            :      * Compensate for negative A (and correct at the end)
    2065                 :            :      */
    2066                 :          4 :     neg = ( A->s == -1 );
    2067         [ -  + ]:          4 :     if( neg )
    2068                 :            :     {
    2069         [ #  # ]:          0 :         MBEDTLS_MPI_CHK( mbedtls_mpi_copy( &Apos, A ) );
    2070                 :          0 :         Apos.s = 1;
    2071                 :          0 :         A = &Apos;
    2072                 :            :     }
    2073                 :            : 
    2074                 :            :     /*
    2075                 :            :      * If 1st call, pre-compute R^2 mod N
    2076                 :            :      */
    2077   [ -  +  -  - ]:          4 :     if( prec_RR == NULL || prec_RR->p == NULL )
    2078                 :            :     {
    2079         [ -  + ]:          4 :         MBEDTLS_MPI_CHK( mbedtls_mpi_lset( &RR, 1 ) );
    2080         [ -  + ]:          4 :         MBEDTLS_MPI_CHK( mbedtls_mpi_shift_l( &RR, N->n * 2 * biL ) );
    2081         [ -  + ]:          4 :         MBEDTLS_MPI_CHK( mbedtls_mpi_mod_mpi( &RR, &RR, N ) );
    2082                 :            : 
    2083         [ -  + ]:          4 :         if( prec_RR != NULL )
    2084                 :          0 :             memcpy( prec_RR, &RR, sizeof( mbedtls_mpi ) );
    2085                 :            :     }
    2086                 :            :     else
    2087                 :          0 :         memcpy( &RR, prec_RR, sizeof( mbedtls_mpi ) );
    2088                 :            : 
    2089                 :            :     /*
    2090                 :            :      * W[1] = A * R^2 * R^-1 mod N = A * R mod N
    2091                 :            :      */
    2092         [ +  - ]:          4 :     if( mbedtls_mpi_cmp_mpi( A, N ) >= 0 )
    2093                 :            :     {
    2094         [ -  + ]:          4 :         MBEDTLS_MPI_CHK( mbedtls_mpi_mod_mpi( &W[1], A, N ) );
    2095                 :            :         /* This should be a no-op because W[1] is already that large before
    2096                 :            :          * mbedtls_mpi_mod_mpi(), but it's necessary to avoid an overflow
    2097                 :            :          * in mpi_montmul() below, so let's make sure. */
    2098         [ -  + ]:          4 :         MBEDTLS_MPI_CHK( mbedtls_mpi_grow( &W[1], N->n + 1 ) );
    2099                 :            :     }
    2100                 :            :     else
    2101         [ #  # ]:          0 :         MBEDTLS_MPI_CHK( mbedtls_mpi_copy( &W[1], A ) );
    2102                 :            : 
    2103                 :            :     /* Note that this is safe because W[1] always has at least N->n limbs
    2104                 :            :      * (it grew above and was preserved by mbedtls_mpi_copy()). */
    2105                 :          4 :     mpi_montmul( &W[1], &RR, N, mm, &T );
    2106                 :            : 
    2107                 :            :     /*
    2108                 :            :      * X = R^2 * R^-1 mod N = R mod N
    2109                 :            :      */
    2110         [ -  + ]:          4 :     MBEDTLS_MPI_CHK( mbedtls_mpi_copy( X, &RR ) );
    2111                 :          4 :     mpi_montred( X, N, mm, &T );
    2112                 :            : 
    2113         [ +  - ]:          4 :     if( wsize > 1 )
    2114                 :            :     {
    2115                 :            :         /*
    2116                 :            :          * W[1 << (wsize - 1)] = W[1] ^ (wsize - 1)
    2117                 :            :          */
    2118                 :          4 :         j =  one << ( wsize - 1 );
    2119                 :            : 
    2120         [ -  + ]:          4 :         MBEDTLS_MPI_CHK( mbedtls_mpi_grow( &W[j], N->n + 1 ) );
    2121         [ -  + ]:          4 :         MBEDTLS_MPI_CHK( mbedtls_mpi_copy( &W[j], &W[1]    ) );
    2122                 :            : 
    2123         [ +  + ]:         20 :         for( i = 0; i < wsize - 1; i++ )
    2124                 :         16 :             mpi_montmul( &W[j], &W[j], N, mm, &T );
    2125                 :            : 
    2126                 :            :         /*
    2127                 :            :          * W[i] = W[i - 1] * W[1]
    2128                 :            :          */
    2129         [ +  + ]:         64 :         for( i = j + 1; i < ( one << wsize ); i++ )
    2130                 :            :         {
    2131         [ -  + ]:         60 :             MBEDTLS_MPI_CHK( mbedtls_mpi_grow( &W[i], N->n + 1 ) );
    2132         [ -  + ]:         60 :             MBEDTLS_MPI_CHK( mbedtls_mpi_copy( &W[i], &W[i - 1] ) );
    2133                 :            : 
    2134                 :         60 :             mpi_montmul( &W[i], &W[1], N, mm, &T );
    2135                 :            :         }
    2136                 :            :     }
    2137                 :            : 
    2138                 :          4 :     nblimbs = E->n;
    2139                 :          4 :     bufsize = 0;
    2140                 :          4 :     nbits   = 0;
    2141                 :          4 :     wbits   = 0;
    2142                 :          4 :     state   = 0;
    2143                 :            : 
    2144                 :       1028 :     while( 1 )
    2145                 :            :     {
    2146         [ +  + ]:       1028 :         if( bufsize == 0 )
    2147                 :            :         {
    2148         [ +  + ]:         36 :             if( nblimbs == 0 )
    2149                 :            :                 break;
    2150                 :            : 
    2151                 :         32 :             nblimbs--;
    2152                 :            : 
    2153                 :         32 :             bufsize = sizeof( mbedtls_mpi_uint ) << 3;
    2154                 :            :         }
    2155                 :            : 
    2156                 :       1024 :         bufsize--;
    2157                 :            : 
    2158                 :       1024 :         ei = (E->p[nblimbs] >> bufsize) & 1;
    2159                 :            : 
    2160                 :            :         /*
    2161                 :            :          * skip leading 0s
    2162                 :            :          */
    2163         [ +  + ]:       1024 :         if( ei == 0 && state == 0 )
    2164                 :          8 :             continue;
    2165                 :            : 
    2166         [ +  + ]:       1016 :         if( ei == 0 && state == 1 )
    2167                 :            :         {
    2168                 :            :             /*
    2169                 :            :              * out of window, square X
    2170                 :            :              */
    2171                 :        836 :             mpi_montmul( X, X, N, mm, &T );
    2172                 :        836 :             continue;
    2173                 :            :         }
    2174                 :            : 
    2175                 :            :         /*
    2176                 :            :          * add ei to current window
    2177                 :            :          */
    2178                 :        180 :         state = 2;
    2179                 :            : 
    2180                 :        180 :         nbits++;
    2181                 :        180 :         wbits |= ( ei << ( wsize - nbits ) );
    2182                 :            : 
    2183         [ +  + ]:        180 :         if( nbits == wsize )
    2184                 :            :         {
    2185                 :            :             /*
    2186                 :            :              * X = X^wsize R^-1 mod N
    2187                 :            :              */
    2188         [ +  + ]:        216 :             for( i = 0; i < wsize; i++ )
    2189                 :        180 :                 mpi_montmul( X, X, N, mm, &T );
    2190                 :            : 
    2191                 :            :             /*
    2192                 :            :              * X = X * W[wbits] R^-1 mod N
    2193                 :            :              */
    2194         [ -  + ]:         36 :             MBEDTLS_MPI_CHK( mpi_select( &WW, W, (size_t) 1 << wsize, wbits ) );
    2195                 :         36 :             mpi_montmul( X, &WW, N, mm, &T );
    2196                 :            : 
    2197                 :         36 :             state--;
    2198                 :         36 :             nbits = 0;
    2199                 :         36 :             wbits = 0;
    2200                 :            :         }
    2201                 :            :     }
    2202                 :            : 
    2203                 :            :     /*
    2204                 :            :      * process the remaining bits
    2205                 :            :      */
    2206         [ -  + ]:          4 :     for( i = 0; i < nbits; i++ )
    2207                 :            :     {
    2208                 :          0 :         mpi_montmul( X, X, N, mm, &T );
    2209                 :            : 
    2210                 :          0 :         wbits <<= 1;
    2211                 :            : 
    2212         [ #  # ]:          0 :         if( ( wbits & ( one << wsize ) ) != 0 )
    2213                 :          0 :             mpi_montmul( X, &W[1], N, mm, &T );
    2214                 :            :     }
    2215                 :            : 
    2216                 :            :     /*
    2217                 :            :      * X = A^E * R * R^-1 mod N = A^E mod N
    2218                 :            :      */
    2219                 :          4 :     mpi_montred( X, N, mm, &T );
    2220                 :            : 
    2221   [ +  -  -  -  :          4 :     if( neg && E->n != 0 && ( E->p[0] & 1 ) != 0 )
                   -  - ]
    2222                 :            :     {
    2223                 :          0 :         X->s = -1;
    2224         [ #  # ]:          0 :         MBEDTLS_MPI_CHK( mbedtls_mpi_add_mpi( X, N, X ) );
    2225                 :            :     }
    2226                 :            : 
    2227                 :          4 : cleanup:
    2228                 :            : 
    2229         [ +  + ]:         68 :     for( i = ( one << ( wsize - 1 ) ); i < ( one << wsize ); i++ )
    2230                 :         64 :         mbedtls_mpi_free( &W[i] );
    2231                 :            : 
    2232                 :          4 :     mbedtls_mpi_free( &W[1] ); mbedtls_mpi_free( &T ); mbedtls_mpi_free( &Apos );
    2233                 :          4 :     mbedtls_mpi_free( &WW );
    2234                 :            : 
    2235   [ -  +  -  - ]:          4 :     if( prec_RR == NULL || prec_RR->p == NULL )
    2236                 :          4 :         mbedtls_mpi_free( &RR );
    2237                 :            : 
    2238                 :            :     return( ret );
    2239                 :            : }
    2240                 :            : 
    2241                 :            : /*
    2242                 :            :  * Greatest common divisor: G = gcd(A, B)  (HAC 14.54)
    2243                 :            :  */
    2244                 :         56 : int mbedtls_mpi_gcd( mbedtls_mpi *G, const mbedtls_mpi *A, const mbedtls_mpi *B )
    2245                 :            : {
    2246                 :         56 :     int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
    2247                 :         56 :     size_t lz, lzt;
    2248                 :         56 :     mbedtls_mpi TA, TB;
    2249                 :            : 
    2250                 :         56 :     MPI_VALIDATE_RET( G != NULL );
    2251                 :         56 :     MPI_VALIDATE_RET( A != NULL );
    2252                 :         56 :     MPI_VALIDATE_RET( B != NULL );
    2253                 :            : 
    2254                 :         56 :     mbedtls_mpi_init( &TA ); mbedtls_mpi_init( &TB );
    2255                 :            : 
    2256         [ -  + ]:         56 :     MBEDTLS_MPI_CHK( mbedtls_mpi_copy( &TA, A ) );
    2257         [ -  + ]:         56 :     MBEDTLS_MPI_CHK( mbedtls_mpi_copy( &TB, B ) );
    2258                 :            : 
    2259                 :         56 :     lz = mbedtls_mpi_lsb( &TA );
    2260                 :         56 :     lzt = mbedtls_mpi_lsb( &TB );
    2261                 :            : 
    2262                 :            :     /* The loop below gives the correct result when A==0 but not when B==0.
    2263                 :            :      * So have a special case for B==0. Leverage the fact that we just
    2264                 :            :      * calculated the lsb and lsb(B)==0 iff B is odd or 0 to make the test
    2265                 :            :      * slightly more efficient than cmp_int(). */
    2266   [ +  -  -  + ]:         56 :     if( lzt == 0 && mbedtls_mpi_get_bit( &TB, 0 ) == 0 )
    2267                 :            :     {
    2268                 :          0 :         ret = mbedtls_mpi_copy( G, A );
    2269                 :          0 :         goto cleanup;
    2270                 :            :     }
    2271                 :            : 
    2272                 :         56 :     if( lzt < lz )
    2273                 :            :         lz = lzt;
    2274                 :            : 
    2275                 :         56 :     TA.s = TB.s = 1;
    2276                 :            : 
    2277                 :            :     /* We mostly follow the procedure described in HAC 14.54, but with some
    2278                 :            :      * minor differences:
    2279                 :            :      * - Sequences of multiplications or divisions by 2 are grouped into a
    2280                 :            :      *   single shift operation.
    2281                 :            :      * - The procedure in HAC assumes that 0 < TB <= TA.
    2282                 :            :      *     - The condition TB <= TA is not actually necessary for correctness.
    2283                 :            :      *       TA and TB have symmetric roles except for the loop termination
    2284                 :            :      *       condition, and the shifts at the beginning of the loop body
    2285                 :            :      *       remove any significance from the ordering of TA vs TB before
    2286                 :            :      *       the shifts.
    2287                 :            :      *     - If TA = 0, the loop goes through 0 iterations and the result is
    2288                 :            :      *       correctly TB.
    2289                 :            :      *     - The case TB = 0 was short-circuited above.
    2290                 :            :      *
    2291                 :            :      * For the correctness proof below, decompose the original values of
    2292                 :            :      * A and B as
    2293                 :            :      *   A = sa * 2^a * A' with A'=0 or A' odd, and sa = +-1
    2294                 :            :      *   B = sb * 2^b * B' with B'=0 or B' odd, and sb = +-1
    2295                 :            :      * Then gcd(A, B) = 2^{min(a,b)} * gcd(A',B'),
    2296                 :            :      * and gcd(A',B') is odd or 0.
    2297                 :            :      *
    2298                 :            :      * At the beginning, we have TA = |A| and TB = |B| so gcd(A,B) = gcd(TA,TB).
    2299                 :            :      * The code maintains the following invariant:
    2300                 :            :      *     gcd(A,B) = 2^k * gcd(TA,TB) for some k   (I)
    2301                 :            :      */
    2302                 :            : 
    2303                 :            :     /* Proof that the loop terminates:
    2304                 :            :      * At each iteration, either the right-shift by 1 is made on a nonzero
    2305                 :            :      * value and the nonnegative integer bitlen(TA) + bitlen(TB) decreases
    2306                 :            :      * by at least 1, or the right-shift by 1 is made on zero and then
    2307                 :            :      * TA becomes 0 which ends the loop (TB cannot be 0 if it is right-shifted
    2308                 :            :      * since in that case TB is calculated from TB-TA with the condition TB>TA).
    2309                 :            :      */
    2310                 :         56 :     while( mbedtls_mpi_cmp_int( &TA, 0 ) != 0 )
    2311                 :            :     {
    2312                 :            :         /* Divisions by 2 preserve the invariant (I). */
    2313         [ -  + ]:      10147 :         MBEDTLS_MPI_CHK( mbedtls_mpi_shift_r( &TA, mbedtls_mpi_lsb( &TA ) ) );
    2314         [ -  + ]:      10147 :         MBEDTLS_MPI_CHK( mbedtls_mpi_shift_r( &TB, mbedtls_mpi_lsb( &TB ) ) );
    2315                 :            : 
    2316                 :            :         /* Set either TA or TB to |TA-TB|/2. Since TA and TB are both odd,
    2317                 :            :          * TA-TB is even so the division by 2 has an integer result.
    2318                 :            :          * Invariant (I) is preserved since any odd divisor of both TA and TB
    2319                 :            :          * also divides |TA-TB|/2, and any odd divisor of both TA and |TA-TB|/2
    2320                 :            :          * also divides TB, and any odd divisior of both TB and |TA-TB|/2 also
    2321                 :            :          * divides TA.
    2322                 :            :          */
    2323         [ +  + ]:      10147 :         if( mbedtls_mpi_cmp_mpi( &TA, &TB ) >= 0 )
    2324                 :            :         {
    2325         [ -  + ]:       5110 :             MBEDTLS_MPI_CHK( mbedtls_mpi_sub_abs( &TA, &TA, &TB ) );
    2326         [ -  + ]:       5110 :             MBEDTLS_MPI_CHK( mbedtls_mpi_shift_r( &TA, 1 ) );
    2327                 :            :         }
    2328                 :            :         else
    2329                 :            :         {
    2330         [ -  + ]:       5037 :             MBEDTLS_MPI_CHK( mbedtls_mpi_sub_abs( &TB, &TB, &TA ) );
    2331   [ -  +  +  + ]:      15240 :             MBEDTLS_MPI_CHK( mbedtls_mpi_shift_r( &TB, 1 ) );
    2332                 :            :         }
    2333                 :            :         /* Note that one of TA or TB is still odd. */
    2334                 :            :     }
    2335                 :            : 
    2336                 :            :     /* By invariant (I), gcd(A,B) = 2^k * gcd(TA,TB) for some k.
    2337                 :            :      * At the loop exit, TA = 0, so gcd(TA,TB) = TB.
    2338                 :            :      * - If there was at least one loop iteration, then one of TA or TB is odd,
    2339                 :            :      *   and TA = 0, so TB is odd and gcd(TA,TB) = gcd(A',B'). In this case,
    2340                 :            :      *   lz = min(a,b) so gcd(A,B) = 2^lz * TB.
    2341                 :            :      * - If there was no loop iteration, then A was 0, and gcd(A,B) = B.
    2342                 :            :      *   In this case, lz = 0 and B = TB so gcd(A,B) = B = 2^lz * TB as well.
    2343                 :            :      */
    2344                 :            : 
    2345         [ -  + ]:         56 :     MBEDTLS_MPI_CHK( mbedtls_mpi_shift_l( &TB, lz ) );
    2346         [ +  - ]:         56 :     MBEDTLS_MPI_CHK( mbedtls_mpi_copy( G, &TB ) );
    2347                 :            : 
    2348                 :         56 : cleanup:
    2349                 :            : 
    2350                 :         56 :     mbedtls_mpi_free( &TA ); mbedtls_mpi_free( &TB );
    2351                 :            : 
    2352                 :         56 :     return( ret );
    2353                 :            : }
    2354                 :            : 
    2355                 :            : /* Fill X with n_bytes random bytes.
    2356                 :            :  * X must already have room for those bytes.
    2357                 :            :  * The ordering of the bytes returned from the RNG is suitable for
    2358                 :            :  * deterministic ECDSA (see RFC 6979 §3.3 and mbedtls_mpi_random()).
    2359                 :            :  * The size and sign of X are unchanged.
    2360                 :            :  * n_bytes must not be 0.
    2361                 :            :  */
    2362                 :         24 : static int mpi_fill_random_internal(
    2363                 :            :     mbedtls_mpi *X, size_t n_bytes,
    2364                 :            :     int (*f_rng)(void *, unsigned char *, size_t), void *p_rng )
    2365                 :            : {
    2366                 :         24 :     int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
    2367                 :         24 :     const size_t limbs = CHARS_TO_LIMBS( n_bytes );
    2368                 :         24 :     const size_t overhead = ( limbs * ciL ) - n_bytes;
    2369                 :            : 
    2370         [ +  - ]:         24 :     if( X->n < limbs )
    2371                 :            :         return( MBEDTLS_ERR_MPI_BAD_INPUT_DATA );
    2372                 :            : 
    2373                 :         24 :     memset( X->p, 0, overhead );
    2374                 :         24 :     memset( (unsigned char *) X->p + limbs * ciL, 0, ( X->n - limbs ) * ciL );
    2375         [ -  + ]:         24 :     MBEDTLS_MPI_CHK( f_rng( p_rng, (unsigned char *) X->p + overhead, n_bytes ) );
    2376                 :         24 :     mpi_bigendian_to_host( X->p, limbs );
    2377                 :            : 
    2378                 :            : cleanup:
    2379                 :            :     return( ret );
    2380                 :            : }
    2381                 :            : 
    2382                 :            : /*
    2383                 :            :  * Fill X with size bytes of random.
    2384                 :            :  *
    2385                 :            :  * Use a temporary bytes representation to make sure the result is the same
    2386                 :            :  * regardless of the platform endianness (useful when f_rng is actually
    2387                 :            :  * deterministic, eg for tests).
    2388                 :            :  */
    2389                 :          0 : int mbedtls_mpi_fill_random( mbedtls_mpi *X, size_t size,
    2390                 :            :                      int (*f_rng)(void *, unsigned char *, size_t),
    2391                 :            :                      void *p_rng )
    2392                 :            : {
    2393                 :          0 :     int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
    2394                 :          0 :     size_t const limbs = CHARS_TO_LIMBS( size );
    2395                 :            : 
    2396                 :          0 :     MPI_VALIDATE_RET( X     != NULL );
    2397                 :          0 :     MPI_VALIDATE_RET( f_rng != NULL );
    2398                 :            : 
    2399                 :            :     /* Ensure that target MPI has exactly the necessary number of limbs */
    2400         [ #  # ]:          0 :     MBEDTLS_MPI_CHK( mbedtls_mpi_resize_clear( X, limbs ) );
    2401         [ #  # ]:          0 :     if( size == 0 )
    2402                 :            :         return( 0 );
    2403                 :            : 
    2404                 :          0 :     ret = mpi_fill_random_internal( X, size, f_rng, p_rng );
    2405                 :            : 
    2406                 :            : cleanup:
    2407                 :            :     return( ret );
    2408                 :            : }
    2409                 :            : 
    2410                 :         24 : int mbedtls_mpi_random( mbedtls_mpi *X,
    2411                 :            :                         mbedtls_mpi_sint min,
    2412                 :            :                         const mbedtls_mpi *N,
    2413                 :            :                         int (*f_rng)(void *, unsigned char *, size_t),
    2414                 :            :                         void *p_rng )
    2415                 :            : {
    2416                 :         24 :     int ret = MBEDTLS_ERR_MPI_BAD_INPUT_DATA;
    2417                 :         24 :     int count;
    2418                 :         24 :     unsigned lt_lower = 1, lt_upper = 0;
    2419                 :         24 :     size_t n_bits = mbedtls_mpi_bitlen( N );
    2420                 :         24 :     size_t n_bytes = ( n_bits + 7 ) / 8;
    2421                 :         24 :     mbedtls_mpi lower_bound;
    2422                 :            : 
    2423         [ +  - ]:         24 :     if( min < 0 )
    2424                 :            :         return( MBEDTLS_ERR_MPI_BAD_INPUT_DATA );
    2425         [ +  - ]:         24 :     if( mbedtls_mpi_cmp_int( N, min ) <= 0 )
    2426                 :            :         return( MBEDTLS_ERR_MPI_BAD_INPUT_DATA );
    2427                 :            : 
    2428                 :            :     /*
    2429                 :            :      * When min == 0, each try has at worst a probability 1/2 of failing
    2430                 :            :      * (the msb has a probability 1/2 of being 0, and then the result will
    2431                 :            :      * be < N), so after 30 tries failure probability is a most 2**(-30).
    2432                 :            :      *
    2433                 :            :      * When N is just below a power of 2, as is the case when generating
    2434                 :            :      * a random scalar on most elliptic curves, 1 try is enough with
    2435                 :            :      * overwhelming probability. When N is just above a power of 2,
    2436                 :            :      * as when generating a random scalar on secp224k1, each try has
    2437                 :            :      * a probability of failing that is almost 1/2.
    2438                 :            :      *
    2439                 :            :      * The probabilities are almost the same if min is nonzero but negligible
    2440                 :            :      * compared to N. This is always the case when N is crypto-sized, but
    2441                 :            :      * it's convenient to support small N for testing purposes. When N
    2442                 :            :      * is small, use a higher repeat count, otherwise the probability of
    2443                 :            :      * failure is macroscopic.
    2444                 :            :      */
    2445         [ -  + ]:         24 :     count = ( n_bytes > 4 ? 30 : 250 );
    2446                 :            : 
    2447                 :         24 :     mbedtls_mpi_init( &lower_bound );
    2448                 :            : 
    2449                 :            :     /* Ensure that target MPI has exactly the same number of limbs
    2450                 :            :      * as the upper bound, even if the upper bound has leading zeros.
    2451                 :            :      * This is necessary for the mbedtls_mpi_lt_mpi_ct() check. */
    2452         [ -  + ]:         24 :     MBEDTLS_MPI_CHK( mbedtls_mpi_resize_clear( X, N->n ) );
    2453         [ -  + ]:         24 :     MBEDTLS_MPI_CHK( mbedtls_mpi_grow( &lower_bound, N->n ) );
    2454         [ -  + ]:         24 :     MBEDTLS_MPI_CHK( mbedtls_mpi_lset( &lower_bound, min ) );
    2455                 :            : 
    2456                 :            :     /*
    2457                 :            :      * Match the procedure given in RFC 6979 §3.3 (deterministic ECDSA)
    2458                 :            :      * when f_rng is a suitably parametrized instance of HMAC_DRBG:
    2459                 :            :      * - use the same byte ordering;
    2460                 :            :      * - keep the leftmost n_bits bits of the generated octet string;
    2461                 :            :      * - try until result is in the desired range.
    2462                 :            :      * This also avoids any bias, which is especially important for ECDSA.
    2463                 :            :      */
    2464                 :         24 :     do
    2465                 :            :     {
    2466         [ -  + ]:         24 :         MBEDTLS_MPI_CHK( mpi_fill_random_internal( X, n_bytes, f_rng, p_rng ) );
    2467         [ -  + ]:         24 :         MBEDTLS_MPI_CHK( mbedtls_mpi_shift_r( X, 8 * n_bytes - n_bits ) );
    2468                 :            : 
    2469         [ -  + ]:         24 :         if( --count == 0 )
    2470                 :            :         {
    2471                 :          0 :             ret = MBEDTLS_ERR_MPI_NOT_ACCEPTABLE;
    2472                 :          0 :             goto cleanup;
    2473                 :            :         }
    2474                 :            : 
    2475         [ -  + ]:         24 :         MBEDTLS_MPI_CHK( mbedtls_mpi_lt_mpi_ct( X, &lower_bound, &lt_lower ) );
    2476         [ -  + ]:         24 :         MBEDTLS_MPI_CHK( mbedtls_mpi_lt_mpi_ct( X, N, &lt_upper ) );
    2477                 :            :     }
    2478   [ -  +  -  + ]:         24 :     while( lt_lower != 0 || lt_upper == 0 );
    2479                 :            : 
    2480                 :         24 : cleanup:
    2481                 :         24 :     mbedtls_mpi_free( &lower_bound );
    2482                 :         24 :     return( ret );
    2483                 :            : }
    2484                 :            : 
    2485                 :            : /*
    2486                 :            :  * Modular inverse: X = A^-1 mod N  (HAC 14.61 / 14.64)
    2487                 :            :  */
    2488                 :         56 : int mbedtls_mpi_inv_mod( mbedtls_mpi *X, const mbedtls_mpi *A, const mbedtls_mpi *N )
    2489                 :            : {
    2490                 :         56 :     int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
    2491                 :         56 :     mbedtls_mpi G, TA, TU, U1, U2, TB, TV, V1, V2;
    2492                 :         56 :     MPI_VALIDATE_RET( X != NULL );
    2493                 :         56 :     MPI_VALIDATE_RET( A != NULL );
    2494                 :         56 :     MPI_VALIDATE_RET( N != NULL );
    2495                 :            : 
    2496         [ +  - ]:         56 :     if( mbedtls_mpi_cmp_int( N, 1 ) <= 0 )
    2497                 :            :         return( MBEDTLS_ERR_MPI_BAD_INPUT_DATA );
    2498                 :            : 
    2499                 :         56 :     mbedtls_mpi_init( &TA ); mbedtls_mpi_init( &TU ); mbedtls_mpi_init( &U1 ); mbedtls_mpi_init( &U2 );
    2500                 :         56 :     mbedtls_mpi_init( &G ); mbedtls_mpi_init( &TB ); mbedtls_mpi_init( &TV );
    2501                 :         56 :     mbedtls_mpi_init( &V1 ); mbedtls_mpi_init( &V2 );
    2502                 :            : 
    2503         [ -  + ]:         56 :     MBEDTLS_MPI_CHK( mbedtls_mpi_gcd( &G, A, N ) );
    2504                 :            : 
    2505         [ -  + ]:         56 :     if( mbedtls_mpi_cmp_int( &G, 1 ) != 0 )
    2506                 :            :     {
    2507                 :          0 :         ret = MBEDTLS_ERR_MPI_NOT_ACCEPTABLE;
    2508                 :          0 :         goto cleanup;
    2509                 :            :     }
    2510                 :            : 
    2511         [ -  + ]:         56 :     MBEDTLS_MPI_CHK( mbedtls_mpi_mod_mpi( &TA, A, N ) );
    2512         [ -  + ]:         56 :     MBEDTLS_MPI_CHK( mbedtls_mpi_copy( &TU, &TA ) );
    2513         [ -  + ]:         56 :     MBEDTLS_MPI_CHK( mbedtls_mpi_copy( &TB, N ) );
    2514         [ -  + ]:         56 :     MBEDTLS_MPI_CHK( mbedtls_mpi_copy( &TV, N ) );
    2515                 :            : 
    2516         [ -  + ]:         56 :     MBEDTLS_MPI_CHK( mbedtls_mpi_lset( &U1, 1 ) );
    2517         [ -  + ]:         56 :     MBEDTLS_MPI_CHK( mbedtls_mpi_lset( &U2, 0 ) );
    2518         [ -  + ]:         56 :     MBEDTLS_MPI_CHK( mbedtls_mpi_lset( &V1, 0 ) );
    2519         [ -  + ]:         56 :     MBEDTLS_MPI_CHK( mbedtls_mpi_lset( &V2, 1 ) );
    2520                 :            : 
    2521                 :            :     do
    2522                 :            :     {
    2523                 :      20256 :         while( ( TU.p[0] & 1 ) == 0 )
    2524                 :            :         {
    2525         [ -  + ]:      10109 :             MBEDTLS_MPI_CHK( mbedtls_mpi_shift_r( &TU, 1 ) );
    2526                 :            : 
    2527   [ +  +  -  + ]:      10109 :             if( ( U1.p[0] & 1 ) != 0 || ( U2.p[0] & 1 ) != 0 )
    2528                 :            :             {
    2529         [ -  + ]:       4297 :                 MBEDTLS_MPI_CHK( mbedtls_mpi_add_mpi( &U1, &U1, &TB ) );
    2530         [ -  + ]:       4297 :                 MBEDTLS_MPI_CHK( mbedtls_mpi_sub_mpi( &U2, &U2, &TA ) );
    2531                 :            :             }
    2532                 :            : 
    2533         [ -  + ]:      10109 :             MBEDTLS_MPI_CHK( mbedtls_mpi_shift_r( &U1, 1 ) );
    2534   [ -  +  +  + ]:      30365 :             MBEDTLS_MPI_CHK( mbedtls_mpi_shift_r( &U2, 1 ) );
    2535                 :            :         }
    2536                 :            : 
    2537                 :      20223 :         while( ( TV.p[0] & 1 ) == 0 )
    2538                 :            :         {
    2539         [ -  + ]:      10076 :             MBEDTLS_MPI_CHK( mbedtls_mpi_shift_r( &TV, 1 ) );
    2540                 :            : 
    2541   [ +  +  -  + ]:      10076 :             if( ( V1.p[0] & 1 ) != 0 || ( V2.p[0] & 1 ) != 0 )
    2542                 :            :             {
    2543         [ -  + ]:       4661 :                 MBEDTLS_MPI_CHK( mbedtls_mpi_add_mpi( &V1, &V1, &TB ) );
    2544         [ -  + ]:       4661 :                 MBEDTLS_MPI_CHK( mbedtls_mpi_sub_mpi( &V2, &V2, &TA ) );
    2545                 :            :             }
    2546                 :            : 
    2547         [ -  + ]:      10076 :             MBEDTLS_MPI_CHK( mbedtls_mpi_shift_r( &V1, 1 ) );
    2548   [ -  +  +  + ]:      20223 :             MBEDTLS_MPI_CHK( mbedtls_mpi_shift_r( &V2, 1 ) );
    2549                 :            :         }
    2550                 :            : 
    2551         [ +  + ]:      10147 :         if( mbedtls_mpi_cmp_mpi( &TU, &TV ) >= 0 )
    2552                 :            :         {
    2553         [ -  + ]:       5110 :             MBEDTLS_MPI_CHK( mbedtls_mpi_sub_mpi( &TU, &TU, &TV ) );
    2554         [ -  + ]:       5110 :             MBEDTLS_MPI_CHK( mbedtls_mpi_sub_mpi( &U1, &U1, &V1 ) );
    2555         [ -  + ]:       5110 :             MBEDTLS_MPI_CHK( mbedtls_mpi_sub_mpi( &U2, &U2, &V2 ) );
    2556                 :            :         }
    2557                 :            :         else
    2558                 :            :         {
    2559         [ -  + ]:       5037 :             MBEDTLS_MPI_CHK( mbedtls_mpi_sub_mpi( &TV, &TV, &TU ) );
    2560         [ -  + ]:       5037 :             MBEDTLS_MPI_CHK( mbedtls_mpi_sub_mpi( &V1, &V1, &U1 ) );
    2561         [ -  + ]:       5037 :             MBEDTLS_MPI_CHK( mbedtls_mpi_sub_mpi( &V2, &V2, &U2 ) );
    2562                 :            :         }
    2563                 :            :     }
    2564         [ +  + ]:      10147 :     while( mbedtls_mpi_cmp_int( &TU, 0 ) != 0 );
    2565                 :            : 
    2566                 :         67 :     while( mbedtls_mpi_cmp_int( &V1, 0 ) < 0 )
    2567   [ -  +  +  + ]:         67 :         MBEDTLS_MPI_CHK( mbedtls_mpi_add_mpi( &V1, &V1, N ) );
    2568                 :            : 
    2569                 :         56 :     while( mbedtls_mpi_cmp_mpi( &V1, N ) >= 0 )
    2570   [ -  -  -  + ]:         56 :         MBEDTLS_MPI_CHK( mbedtls_mpi_sub_mpi( &V1, &V1, N ) );
    2571                 :            : 
    2572         [ +  - ]:         56 :     MBEDTLS_MPI_CHK( mbedtls_mpi_copy( X, &V1 ) );
    2573                 :            : 
    2574                 :         56 : cleanup:
    2575                 :            : 
    2576                 :         56 :     mbedtls_mpi_free( &TA ); mbedtls_mpi_free( &TU ); mbedtls_mpi_free( &U1 ); mbedtls_mpi_free( &U2 );
    2577                 :         56 :     mbedtls_mpi_free( &G ); mbedtls_mpi_free( &TB ); mbedtls_mpi_free( &TV );
    2578                 :         56 :     mbedtls_mpi_free( &V1 ); mbedtls_mpi_free( &V2 );
    2579                 :            : 
    2580                 :         56 :     return( ret );
    2581                 :            : }
    2582                 :            : 
    2583                 :            : #if defined(MBEDTLS_GENPRIME)
    2584                 :            : 
    2585                 :            : static const int small_prime[] =
    2586                 :            : {
    2587                 :            :         3,    5,    7,   11,   13,   17,   19,   23,
    2588                 :            :        29,   31,   37,   41,   43,   47,   53,   59,
    2589                 :            :        61,   67,   71,   73,   79,   83,   89,   97,
    2590                 :            :       101,  103,  107,  109,  113,  127,  131,  137,
    2591                 :            :       139,  149,  151,  157,  163,  167,  173,  179,
    2592                 :            :       181,  191,  193,  197,  199,  211,  223,  227,
    2593                 :            :       229,  233,  239,  241,  251,  257,  263,  269,
    2594                 :            :       271,  277,  281,  283,  293,  307,  311,  313,
    2595                 :            :       317,  331,  337,  347,  349,  353,  359,  367,
    2596                 :            :       373,  379,  383,  389,  397,  401,  409,  419,
    2597                 :            :       421,  431,  433,  439,  443,  449,  457,  461,
    2598                 :            :       463,  467,  479,  487,  491,  499,  503,  509,
    2599                 :            :       521,  523,  541,  547,  557,  563,  569,  571,
    2600                 :            :       577,  587,  593,  599,  601,  607,  613,  617,
    2601                 :            :       619,  631,  641,  643,  647,  653,  659,  661,
    2602                 :            :       673,  677,  683,  691,  701,  709,  719,  727,
    2603                 :            :       733,  739,  743,  751,  757,  761,  769,  773,
    2604                 :            :       787,  797,  809,  811,  821,  823,  827,  829,
    2605                 :            :       839,  853,  857,  859,  863,  877,  881,  883,
    2606                 :            :       887,  907,  911,  919,  929,  937,  941,  947,
    2607                 :            :       953,  967,  971,  977,  983,  991,  997, -103
    2608                 :            : };
    2609                 :            : 
    2610                 :            : /*
    2611                 :            :  * Small divisors test (X must be positive)
    2612                 :            :  *
    2613                 :            :  * Return values:
    2614                 :            :  * 0: no small factor (possible prime, more tests needed)
    2615                 :            :  * 1: certain prime
    2616                 :            :  * MBEDTLS_ERR_MPI_NOT_ACCEPTABLE: certain non-prime
    2617                 :            :  * other negative: error
    2618                 :            :  */
    2619                 :            : static int mpi_check_small_factors( const mbedtls_mpi *X )
    2620                 :            : {
    2621                 :            :     int ret = 0;
    2622                 :            :     size_t i;
    2623                 :            :     mbedtls_mpi_uint r;
    2624                 :            : 
    2625                 :            :     if( ( X->p[0] & 1 ) == 0 )
    2626                 :            :         return( MBEDTLS_ERR_MPI_NOT_ACCEPTABLE );
    2627                 :            : 
    2628                 :            :     for( i = 0; small_prime[i] > 0; i++ )
    2629                 :            :     {
    2630                 :            :         if( mbedtls_mpi_cmp_int( X, small_prime[i] ) <= 0 )
    2631                 :            :             return( 1 );
    2632                 :            : 
    2633                 :            :         MBEDTLS_MPI_CHK( mbedtls_mpi_mod_int( &r, X, small_prime[i] ) );
    2634                 :            : 
    2635                 :            :         if( r == 0 )
    2636                 :            :             return( MBEDTLS_ERR_MPI_NOT_ACCEPTABLE );
    2637                 :            :     }
    2638                 :            : 
    2639                 :            : cleanup:
    2640                 :            :     return( ret );
    2641                 :            : }
    2642                 :            : 
    2643                 :            : /*
    2644                 :            :  * Miller-Rabin pseudo-primality test  (HAC 4.24)
    2645                 :            :  */
    2646                 :            : static int mpi_miller_rabin( const mbedtls_mpi *X, size_t rounds,
    2647                 :            :                              int (*f_rng)(void *, unsigned char *, size_t),
    2648                 :            :                              void *p_rng )
    2649                 :            : {
    2650                 :            :     int ret, count;
    2651                 :            :     size_t i, j, k, s;
    2652                 :            :     mbedtls_mpi W, R, T, A, RR;
    2653                 :            : 
    2654                 :            :     MPI_VALIDATE_RET( X     != NULL );
    2655                 :            :     MPI_VALIDATE_RET( f_rng != NULL );
    2656                 :            : 
    2657                 :            :     mbedtls_mpi_init( &W ); mbedtls_mpi_init( &R );
    2658                 :            :     mbedtls_mpi_init( &T ); mbedtls_mpi_init( &A );
    2659                 :            :     mbedtls_mpi_init( &RR );
    2660                 :            : 
    2661                 :            :     /*
    2662                 :            :      * W = |X| - 1
    2663                 :            :      * R = W >> lsb( W )
    2664                 :            :      */
    2665                 :            :     MBEDTLS_MPI_CHK( mbedtls_mpi_sub_int( &W, X, 1 ) );
    2666                 :            :     s = mbedtls_mpi_lsb( &W );
    2667                 :            :     MBEDTLS_MPI_CHK( mbedtls_mpi_copy( &R, &W ) );
    2668                 :            :     MBEDTLS_MPI_CHK( mbedtls_mpi_shift_r( &R, s ) );
    2669                 :            : 
    2670                 :            :     for( i = 0; i < rounds; i++ )
    2671                 :            :     {
    2672                 :            :         /*
    2673                 :            :          * pick a random A, 1 < A < |X| - 1
    2674                 :            :          */
    2675                 :            :         count = 0;
    2676                 :            :         do {
    2677                 :            :             MBEDTLS_MPI_CHK( mbedtls_mpi_fill_random( &A, X->n * ciL, f_rng, p_rng ) );
    2678                 :            : 
    2679                 :            :             j = mbedtls_mpi_bitlen( &A );
    2680                 :            :             k = mbedtls_mpi_bitlen( &W );
    2681                 :            :             if (j > k) {
    2682                 :            :                 A.p[A.n - 1] &= ( (mbedtls_mpi_uint) 1 << ( k - ( A.n - 1 ) * biL - 1 ) ) - 1;
    2683                 :            :             }
    2684                 :            : 
    2685                 :            :             if (count++ > 30) {
    2686                 :            :                 ret = MBEDTLS_ERR_MPI_NOT_ACCEPTABLE;
    2687                 :            :                 goto cleanup;
    2688                 :            :             }
    2689                 :            : 
    2690                 :            :         } while ( mbedtls_mpi_cmp_mpi( &A, &W ) >= 0 ||
    2691                 :            :                   mbedtls_mpi_cmp_int( &A, 1 )  <= 0    );
    2692                 :            : 
    2693                 :            :         /*
    2694                 :            :          * A = A^R mod |X|
    2695                 :            :          */
    2696                 :            :         MBEDTLS_MPI_CHK( mbedtls_mpi_exp_mod( &A, &A, &R, X, &RR ) );
    2697                 :            : 
    2698                 :            :         if( mbedtls_mpi_cmp_mpi( &A, &W ) == 0 ||
    2699                 :            :             mbedtls_mpi_cmp_int( &A,  1 ) == 0 )
    2700                 :            :             continue;
    2701                 :            : 
    2702                 :            :         j = 1;
    2703                 :            :         while( j < s && mbedtls_mpi_cmp_mpi( &A, &W ) != 0 )
    2704                 :            :         {
    2705                 :            :             /*
    2706                 :            :              * A = A * A mod |X|
    2707                 :            :              */
    2708                 :            :             MBEDTLS_MPI_CHK( mbedtls_mpi_mul_mpi( &T, &A, &A ) );
    2709                 :            :             MBEDTLS_MPI_CHK( mbedtls_mpi_mod_mpi( &A, &T, X  ) );
    2710                 :            : 
    2711                 :            :             if( mbedtls_mpi_cmp_int( &A, 1 ) == 0 )
    2712                 :            :                 break;
    2713                 :            : 
    2714                 :            :             j++;
    2715                 :            :         }
    2716                 :            : 
    2717                 :            :         /*
    2718                 :            :          * not prime if A != |X| - 1 or A == 1
    2719                 :            :          */
    2720                 :            :         if( mbedtls_mpi_cmp_mpi( &A, &W ) != 0 ||
    2721                 :            :             mbedtls_mpi_cmp_int( &A,  1 ) == 0 )
    2722                 :            :         {
    2723                 :            :             ret = MBEDTLS_ERR_MPI_NOT_ACCEPTABLE;
    2724                 :            :             break;
    2725                 :            :         }
    2726                 :            :     }
    2727                 :            : 
    2728                 :            : cleanup:
    2729                 :            :     mbedtls_mpi_free( &W ); mbedtls_mpi_free( &R );
    2730                 :            :     mbedtls_mpi_free( &T ); mbedtls_mpi_free( &A );
    2731                 :            :     mbedtls_mpi_free( &RR );
    2732                 :            : 
    2733                 :            :     return( ret );
    2734                 :            : }
    2735                 :            : 
    2736                 :            : /*
    2737                 :            :  * Pseudo-primality test: small factors, then Miller-Rabin
    2738                 :            :  */
    2739                 :            : int mbedtls_mpi_is_prime_ext( const mbedtls_mpi *X, int rounds,
    2740                 :            :                               int (*f_rng)(void *, unsigned char *, size_t),
    2741                 :            :                               void *p_rng )
    2742                 :            : {
    2743                 :            :     int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
    2744                 :            :     mbedtls_mpi XX;
    2745                 :            :     MPI_VALIDATE_RET( X     != NULL );
    2746                 :            :     MPI_VALIDATE_RET( f_rng != NULL );
    2747                 :            : 
    2748                 :            :     XX.s = 1;
    2749                 :            :     XX.n = X->n;
    2750                 :            :     XX.p = X->p;
    2751                 :            : 
    2752                 :            :     if( mbedtls_mpi_cmp_int( &XX, 0 ) == 0 ||
    2753                 :            :         mbedtls_mpi_cmp_int( &XX, 1 ) == 0 )
    2754                 :            :         return( MBEDTLS_ERR_MPI_NOT_ACCEPTABLE );
    2755                 :            : 
    2756                 :            :     if( mbedtls_mpi_cmp_int( &XX, 2 ) == 0 )
    2757                 :            :         return( 0 );
    2758                 :            : 
    2759                 :            :     if( ( ret = mpi_check_small_factors( &XX ) ) != 0 )
    2760                 :            :     {
    2761                 :            :         if( ret == 1 )
    2762                 :            :             return( 0 );
    2763                 :            : 
    2764                 :            :         return( ret );
    2765                 :            :     }
    2766                 :            : 
    2767                 :            :     return( mpi_miller_rabin( &XX, rounds, f_rng, p_rng ) );
    2768                 :            : }
    2769                 :            : 
    2770                 :            : /*
    2771                 :            :  * Prime number generation
    2772                 :            :  *
    2773                 :            :  * To generate an RSA key in a way recommended by FIPS 186-4, both primes must
    2774                 :            :  * be either 1024 bits or 1536 bits long, and flags must contain
    2775                 :            :  * MBEDTLS_MPI_GEN_PRIME_FLAG_LOW_ERR.
    2776                 :            :  */
    2777                 :            : int mbedtls_mpi_gen_prime( mbedtls_mpi *X, size_t nbits, int flags,
    2778                 :            :                    int (*f_rng)(void *, unsigned char *, size_t),
    2779                 :            :                    void *p_rng )
    2780                 :            : {
    2781                 :            : #ifdef MBEDTLS_HAVE_INT64
    2782                 :            : // ceil(2^63.5)
    2783                 :            : #define CEIL_MAXUINT_DIV_SQRT2 0xb504f333f9de6485ULL
    2784                 :            : #else
    2785                 :            : // ceil(2^31.5)
    2786                 :            : #define CEIL_MAXUINT_DIV_SQRT2 0xb504f334U
    2787                 :            : #endif
    2788                 :            :     int ret = MBEDTLS_ERR_MPI_NOT_ACCEPTABLE;
    2789                 :            :     size_t k, n;
    2790                 :            :     int rounds;
    2791                 :            :     mbedtls_mpi_uint r;
    2792                 :            :     mbedtls_mpi Y;
    2793                 :            : 
    2794                 :            :     MPI_VALIDATE_RET( X     != NULL );
    2795                 :            :     MPI_VALIDATE_RET( f_rng != NULL );
    2796                 :            : 
    2797                 :            :     if( nbits < 3 || nbits > MBEDTLS_MPI_MAX_BITS )
    2798                 :            :         return( MBEDTLS_ERR_MPI_BAD_INPUT_DATA );
    2799                 :            : 
    2800                 :            :     mbedtls_mpi_init( &Y );
    2801                 :            : 
    2802                 :            :     n = BITS_TO_LIMBS( nbits );
    2803                 :            : 
    2804                 :            :     if( ( flags & MBEDTLS_MPI_GEN_PRIME_FLAG_LOW_ERR ) == 0 )
    2805                 :            :     {
    2806                 :            :         /*
    2807                 :            :          * 2^-80 error probability, number of rounds chosen per HAC, table 4.4
    2808                 :            :          */
    2809                 :            :         rounds = ( ( nbits >= 1300 ) ?  2 : ( nbits >=  850 ) ?  3 :
    2810                 :            :                    ( nbits >=  650 ) ?  4 : ( nbits >=  350 ) ?  8 :
    2811                 :            :                    ( nbits >=  250 ) ? 12 : ( nbits >=  150 ) ? 18 : 27 );
    2812                 :            :     }
    2813                 :            :     else
    2814                 :            :     {
    2815                 :            :         /*
    2816                 :            :          * 2^-100 error probability, number of rounds computed based on HAC,
    2817                 :            :          * fact 4.48
    2818                 :            :          */
    2819                 :            :         rounds = ( ( nbits >= 1450 ) ?  4 : ( nbits >=  1150 ) ?  5 :
    2820                 :            :                    ( nbits >= 1000 ) ?  6 : ( nbits >=   850 ) ?  7 :
    2821                 :            :                    ( nbits >=  750 ) ?  8 : ( nbits >=   500 ) ? 13 :
    2822                 :            :                    ( nbits >=  250 ) ? 28 : ( nbits >=   150 ) ? 40 : 51 );
    2823                 :            :     }
    2824                 :            : 
    2825                 :            :     while( 1 )
    2826                 :            :     {
    2827                 :            :         MBEDTLS_MPI_CHK( mbedtls_mpi_fill_random( X, n * ciL, f_rng, p_rng ) );
    2828                 :            :         /* make sure generated number is at least (nbits-1)+0.5 bits (FIPS 186-4 §B.3.3 steps 4.4, 5.5) */
    2829                 :            :         if( X->p[n-1] < CEIL_MAXUINT_DIV_SQRT2 ) continue;
    2830                 :            : 
    2831                 :            :         k = n * biL;
    2832                 :            :         if( k > nbits ) MBEDTLS_MPI_CHK( mbedtls_mpi_shift_r( X, k - nbits ) );
    2833                 :            :         X->p[0] |= 1;
    2834                 :            : 
    2835                 :            :         if( ( flags & MBEDTLS_MPI_GEN_PRIME_FLAG_DH ) == 0 )
    2836                 :            :         {
    2837                 :            :             ret = mbedtls_mpi_is_prime_ext( X, rounds, f_rng, p_rng );
    2838                 :            : 
    2839                 :            :             if( ret != MBEDTLS_ERR_MPI_NOT_ACCEPTABLE )
    2840                 :            :                 goto cleanup;
    2841                 :            :         }
    2842                 :            :         else
    2843                 :            :         {
    2844                 :            :             /*
    2845                 :            :              * An necessary condition for Y and X = 2Y + 1 to be prime
    2846                 :            :              * is X = 2 mod 3 (which is equivalent to Y = 2 mod 3).
    2847                 :            :              * Make sure it is satisfied, while keeping X = 3 mod 4
    2848                 :            :              */
    2849                 :            : 
    2850                 :            :             X->p[0] |= 2;
    2851                 :            : 
    2852                 :            :             MBEDTLS_MPI_CHK( mbedtls_mpi_mod_int( &r, X, 3 ) );
    2853                 :            :             if( r == 0 )
    2854                 :            :                 MBEDTLS_MPI_CHK( mbedtls_mpi_add_int( X, X, 8 ) );
    2855                 :            :             else if( r == 1 )
    2856                 :            :                 MBEDTLS_MPI_CHK( mbedtls_mpi_add_int( X, X, 4 ) );
    2857                 :            : 
    2858                 :            :             /* Set Y = (X-1) / 2, which is X / 2 because X is odd */
    2859                 :            :             MBEDTLS_MPI_CHK( mbedtls_mpi_copy( &Y, X ) );
    2860                 :            :             MBEDTLS_MPI_CHK( mbedtls_mpi_shift_r( &Y, 1 ) );
    2861                 :            : 
    2862                 :            :             while( 1 )
    2863                 :            :             {
    2864                 :            :                 /*
    2865                 :            :                  * First, check small factors for X and Y
    2866                 :            :                  * before doing Miller-Rabin on any of them
    2867                 :            :                  */
    2868                 :            :                 if( ( ret = mpi_check_small_factors(  X         ) ) == 0 &&
    2869                 :            :                     ( ret = mpi_check_small_factors( &Y         ) ) == 0 &&
    2870                 :            :                     ( ret = mpi_miller_rabin(  X, rounds, f_rng, p_rng  ) )
    2871                 :            :                                                                     == 0 &&
    2872                 :            :                     ( ret = mpi_miller_rabin( &Y, rounds, f_rng, p_rng  ) )
    2873                 :            :                                                                     == 0 )
    2874                 :            :                     goto cleanup;
    2875                 :            : 
    2876                 :            :                 if( ret != MBEDTLS_ERR_MPI_NOT_ACCEPTABLE )
    2877                 :            :                     goto cleanup;
    2878                 :            : 
    2879                 :            :                 /*
    2880                 :            :                  * Next candidates. We want to preserve Y = (X-1) / 2 and
    2881                 :            :                  * Y = 1 mod 2 and Y = 2 mod 3 (eq X = 3 mod 4 and X = 2 mod 3)
    2882                 :            :                  * so up Y by 6 and X by 12.
    2883                 :            :                  */
    2884                 :            :                 MBEDTLS_MPI_CHK( mbedtls_mpi_add_int(  X,  X, 12 ) );
    2885                 :            :                 MBEDTLS_MPI_CHK( mbedtls_mpi_add_int( &Y, &Y, 6  ) );
    2886                 :            :             }
    2887                 :            :         }
    2888                 :            :     }
    2889                 :            : 
    2890                 :            : cleanup:
    2891                 :            : 
    2892                 :            :     mbedtls_mpi_free( &Y );
    2893                 :            : 
    2894                 :            :     return( ret );
    2895                 :            : }
    2896                 :            : 
    2897                 :            : #endif /* MBEDTLS_GENPRIME */
    2898                 :            : 
    2899                 :            : #if defined(MBEDTLS_SELF_TEST)
    2900                 :            : 
    2901                 :            : #define GCD_PAIR_COUNT  3
    2902                 :            : 
    2903                 :            : static const int gcd_pairs[GCD_PAIR_COUNT][3] =
    2904                 :            : {
    2905                 :            :     { 693, 609, 21 },
    2906                 :            :     { 1764, 868, 28 },
    2907                 :            :     { 768454923, 542167814, 1 }
    2908                 :            : };
    2909                 :            : 
    2910                 :            : /*
    2911                 :            :  * Checkup routine
    2912                 :            :  */
    2913                 :            : int mbedtls_mpi_self_test( int verbose )
    2914                 :            : {
    2915                 :            :     int ret, i;
    2916                 :            :     mbedtls_mpi A, E, N, X, Y, U, V;
    2917                 :            : 
    2918                 :            :     mbedtls_mpi_init( &A ); mbedtls_mpi_init( &E ); mbedtls_mpi_init( &N ); mbedtls_mpi_init( &X );
    2919                 :            :     mbedtls_mpi_init( &Y ); mbedtls_mpi_init( &U ); mbedtls_mpi_init( &V );
    2920                 :            : 
    2921                 :            :     MBEDTLS_MPI_CHK( mbedtls_mpi_read_string( &A, 16,
    2922                 :            :         "EFE021C2645FD1DC586E69184AF4A31E" \
    2923                 :            :         "D5F53E93B5F123FA41680867BA110131" \
    2924                 :            :         "944FE7952E2517337780CB0DB80E61AA" \
    2925                 :            :         "E7C8DDC6C5C6AADEB34EB38A2F40D5E6" ) );
    2926                 :            : 
    2927                 :            :     MBEDTLS_MPI_CHK( mbedtls_mpi_read_string( &E, 16,
    2928                 :            :         "B2E7EFD37075B9F03FF989C7C5051C20" \
    2929                 :            :         "34D2A323810251127E7BF8625A4F49A5" \
    2930                 :            :         "F3E27F4DA8BD59C47D6DAABA4C8127BD" \
    2931                 :            :         "5B5C25763222FEFCCFC38B832366C29E" ) );
    2932                 :            : 
    2933                 :            :     MBEDTLS_MPI_CHK( mbedtls_mpi_read_string( &N, 16,
    2934                 :            :         "0066A198186C18C10B2F5ED9B522752A" \
    2935                 :            :         "9830B69916E535C8F047518A889A43A5" \
    2936                 :            :         "94B6BED27A168D31D4A52F88925AA8F5" ) );
    2937                 :            : 
    2938                 :            :     MBEDTLS_MPI_CHK( mbedtls_mpi_mul_mpi( &X, &A, &N ) );
    2939                 :            : 
    2940                 :            :     MBEDTLS_MPI_CHK( mbedtls_mpi_read_string( &U, 16,
    2941                 :            :         "602AB7ECA597A3D6B56FF9829A5E8B85" \
    2942                 :            :         "9E857EA95A03512E2BAE7391688D264A" \
    2943                 :            :         "A5663B0341DB9CCFD2C4C5F421FEC814" \
    2944                 :            :         "8001B72E848A38CAE1C65F78E56ABDEF" \
    2945                 :            :         "E12D3C039B8A02D6BE593F0BBBDA56F1" \
    2946                 :            :         "ECF677152EF804370C1A305CAF3B5BF1" \
    2947                 :            :         "30879B56C61DE584A0F53A2447A51E" ) );
    2948                 :            : 
    2949                 :            :     if( verbose != 0 )
    2950                 :            :         mbedtls_printf( "  MPI test #1 (mul_mpi): " );
    2951                 :            : 
    2952                 :            :     if( mbedtls_mpi_cmp_mpi( &X, &U ) != 0 )
    2953                 :            :     {
    2954                 :            :         if( verbose != 0 )
    2955                 :            :             mbedtls_printf( "failed\n" );
    2956                 :            : 
    2957                 :            :         ret = 1;
    2958                 :            :         goto cleanup;
    2959                 :            :     }
    2960                 :            : 
    2961                 :            :     if( verbose != 0 )
    2962                 :            :         mbedtls_printf( "passed\n" );
    2963                 :            : 
    2964                 :            :     MBEDTLS_MPI_CHK( mbedtls_mpi_div_mpi( &X, &Y, &A, &N ) );
    2965                 :            : 
    2966                 :            :     MBEDTLS_MPI_CHK( mbedtls_mpi_read_string( &U, 16,
    2967                 :            :         "256567336059E52CAE22925474705F39A94" ) );
    2968                 :            : 
    2969                 :            :     MBEDTLS_MPI_CHK( mbedtls_mpi_read_string( &V, 16,
    2970                 :            :         "6613F26162223DF488E9CD48CC132C7A" \
    2971                 :            :         "0AC93C701B001B092E4E5B9F73BCD27B" \
    2972                 :            :         "9EE50D0657C77F374E903CDFA4C642" ) );
    2973                 :            : 
    2974                 :            :     if( verbose != 0 )
    2975                 :            :         mbedtls_printf( "  MPI test #2 (div_mpi): " );
    2976                 :            : 
    2977                 :            :     if( mbedtls_mpi_cmp_mpi( &X, &U ) != 0 ||
    2978                 :            :         mbedtls_mpi_cmp_mpi( &Y, &V ) != 0 )
    2979                 :            :     {
    2980                 :            :         if( verbose != 0 )
    2981                 :            :             mbedtls_printf( "failed\n" );
    2982                 :            : 
    2983                 :            :         ret = 1;
    2984                 :            :         goto cleanup;
    2985                 :            :     }
    2986                 :            : 
    2987                 :            :     if( verbose != 0 )
    2988                 :            :         mbedtls_printf( "passed\n" );
    2989                 :            : 
    2990                 :            :     MBEDTLS_MPI_CHK( mbedtls_mpi_exp_mod( &X, &A, &E, &N, NULL ) );
    2991                 :            : 
    2992                 :            :     MBEDTLS_MPI_CHK( mbedtls_mpi_read_string( &U, 16,
    2993                 :            :         "36E139AEA55215609D2816998ED020BB" \
    2994                 :            :         "BD96C37890F65171D948E9BC7CBAA4D9" \
    2995                 :            :         "325D24D6A3C12710F10A09FA08AB87" ) );
    2996                 :            : 
    2997                 :            :     if( verbose != 0 )
    2998                 :            :         mbedtls_printf( "  MPI test #3 (exp_mod): " );
    2999                 :            : 
    3000                 :            :     if( mbedtls_mpi_cmp_mpi( &X, &U ) != 0 )
    3001                 :            :     {
    3002                 :            :         if( verbose != 0 )
    3003                 :            :             mbedtls_printf( "failed\n" );
    3004                 :            : 
    3005                 :            :         ret = 1;
    3006                 :            :         goto cleanup;
    3007                 :            :     }
    3008                 :            : 
    3009                 :            :     if( verbose != 0 )
    3010                 :            :         mbedtls_printf( "passed\n" );
    3011                 :            : 
    3012                 :            :     MBEDTLS_MPI_CHK( mbedtls_mpi_inv_mod( &X, &A, &N ) );
    3013                 :            : 
    3014                 :            :     MBEDTLS_MPI_CHK( mbedtls_mpi_read_string( &U, 16,
    3015                 :            :         "003A0AAEDD7E784FC07D8F9EC6E3BFD5" \
    3016                 :            :         "C3DBA76456363A10869622EAC2DD84EC" \
    3017                 :            :         "C5B8A74DAC4D09E03B5E0BE779F2DF61" ) );
    3018                 :            : 
    3019                 :            :     if( verbose != 0 )
    3020                 :            :         mbedtls_printf( "  MPI test #4 (inv_mod): " );
    3021                 :            : 
    3022                 :            :     if( mbedtls_mpi_cmp_mpi( &X, &U ) != 0 )
    3023                 :            :     {
    3024                 :            :         if( verbose != 0 )
    3025                 :            :             mbedtls_printf( "failed\n" );
    3026                 :            : 
    3027                 :            :         ret = 1;
    3028                 :            :         goto cleanup;
    3029                 :            :     }
    3030                 :            : 
    3031                 :            :     if( verbose != 0 )
    3032                 :            :         mbedtls_printf( "passed\n" );
    3033                 :            : 
    3034                 :            :     if( verbose != 0 )
    3035                 :            :         mbedtls_printf( "  MPI test #5 (simple gcd): " );
    3036                 :            : 
    3037                 :            :     for( i = 0; i < GCD_PAIR_COUNT; i++ )
    3038                 :            :     {
    3039                 :            :         MBEDTLS_MPI_CHK( mbedtls_mpi_lset( &X, gcd_pairs[i][0] ) );
    3040                 :            :         MBEDTLS_MPI_CHK( mbedtls_mpi_lset( &Y, gcd_pairs[i][1] ) );
    3041                 :            : 
    3042                 :            :         MBEDTLS_MPI_CHK( mbedtls_mpi_gcd( &A, &X, &Y ) );
    3043                 :            : 
    3044                 :            :         if( mbedtls_mpi_cmp_int( &A, gcd_pairs[i][2] ) != 0 )
    3045                 :            :         {
    3046                 :            :             if( verbose != 0 )
    3047                 :            :                 mbedtls_printf( "failed at %d\n", i );
    3048                 :            : 
    3049                 :            :             ret = 1;
    3050                 :            :             goto cleanup;
    3051                 :            :         }
    3052                 :            :     }
    3053                 :            : 
    3054                 :            :     if( verbose != 0 )
    3055                 :            :         mbedtls_printf( "passed\n" );
    3056                 :            : 
    3057                 :            : cleanup:
    3058                 :            : 
    3059                 :            :     if( ret != 0 && verbose != 0 )
    3060                 :            :         mbedtls_printf( "Unexpected error, return code = %08X\n", (unsigned int) ret );
    3061                 :            : 
    3062                 :            :     mbedtls_mpi_free( &A ); mbedtls_mpi_free( &E ); mbedtls_mpi_free( &N ); mbedtls_mpi_free( &X );
    3063                 :            :     mbedtls_mpi_free( &Y ); mbedtls_mpi_free( &U ); mbedtls_mpi_free( &V );
    3064                 :            : 
    3065                 :            :     if( verbose != 0 )
    3066                 :            :         mbedtls_printf( "\n" );
    3067                 :            : 
    3068                 :            :     return( ret );
    3069                 :            : }
    3070                 :            : 
    3071                 :            : #endif /* MBEDTLS_SELF_TEST */
    3072                 :            : 
    3073                 :            : #endif /* MBEDTLS_BIGNUM_C */

Generated by: LCOV version 1.14