PageRenderTime 58ms CodeModel.GetById 19ms RepoModel.GetById 0ms app.codeStats 0ms

/Library/ssrNative/depends/mbedtls/library/bignum.c

https://bitbucket.org/frodo_man/vvn.io
C | 2457 lines | 1583 code | 506 blank | 368 comment | 429 complexity | a046fa5e14b3db09319a997d8b83bbdb MD5 | raw file
Possible License(s): Apache-2.0, 0BSD, ISC, GPL-3.0, CC-BY-SA-3.0, BSD-3-Clause, BSD-2-Clause, JSON, LGPL-3.0

Large files files are truncated, but you can click here to view the full file

  1. /*
  2. * Multi-precision integer library
  3. *
  4. * Copyright (C) 2006-2015, ARM Limited, All Rights Reserved
  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. * This file is part of mbed TLS (https://tls.mbed.org)
  20. */
  21. /*
  22. * The following sources were referenced in the design of this Multi-precision
  23. * Integer library:
  24. *
  25. * [1] Handbook of Applied Cryptography - 1997
  26. * Menezes, van Oorschot and Vanstone
  27. *
  28. * [2] Multi-Precision Math
  29. * Tom St Denis
  30. * https://github.com/libtom/libtommath/blob/develop/tommath.pdf
  31. *
  32. * [3] GNU Multi-Precision Arithmetic Library
  33. * https://gmplib.org/manual/index.html
  34. *
  35. */
  36. #if !defined(MBEDTLS_CONFIG_FILE)
  37. #include "mbedtls/config.h"
  38. #else
  39. #include MBEDTLS_CONFIG_FILE
  40. #endif
  41. #if defined(MBEDTLS_BIGNUM_C)
  42. #include "mbedtls/bignum.h"
  43. #include "mbedtls/bn_mul.h"
  44. #include <string.h>
  45. #if defined(MBEDTLS_PLATFORM_C)
  46. #include "mbedtls/platform.h"
  47. #else
  48. #include <stdio.h>
  49. #include <stdlib.h>
  50. #define mbedtls_printf printf
  51. #define mbedtls_calloc calloc
  52. #define mbedtls_free free
  53. #endif
  54. /* Implementation that should never be optimized out by the compiler */
  55. static void mbedtls_mpi_zeroize( mbedtls_mpi_uint *v, size_t n ) {
  56. volatile mbedtls_mpi_uint *p = v; while( n-- ) *p++ = 0;
  57. }
  58. /* Implementation that should never be optimized out by the compiler */
  59. static void mbedtls_zeroize( void *v, size_t n ) {
  60. volatile unsigned char *p = v; while( n-- ) *p++ = 0;
  61. }
  62. #define ciL (sizeof(mbedtls_mpi_uint)) /* chars in limb */
  63. #define biL (ciL << 3) /* bits in limb */
  64. #define biH (ciL << 2) /* half limb size */
  65. #define MPI_SIZE_T_MAX ( (size_t) -1 ) /* SIZE_T_MAX is not standard */
  66. /*
  67. * Convert between bits/chars and number of limbs
  68. * Divide first in order to avoid potential overflows
  69. */
  70. #define BITS_TO_LIMBS(i) ( (i) / biL + ( (i) % biL != 0 ) )
  71. #define CHARS_TO_LIMBS(i) ( (i) / ciL + ( (i) % ciL != 0 ) )
  72. /*
  73. * Initialize one MPI
  74. */
  75. void mbedtls_mpi_init( mbedtls_mpi *X )
  76. {
  77. if( X == NULL )
  78. return;
  79. X->s = 1;
  80. X->n = 0;
  81. X->p = NULL;
  82. }
  83. /*
  84. * Unallocate one MPI
  85. */
  86. void mbedtls_mpi_free( mbedtls_mpi *X )
  87. {
  88. if( X == NULL )
  89. return;
  90. if( X->p != NULL )
  91. {
  92. mbedtls_mpi_zeroize( X->p, X->n );
  93. mbedtls_free( X->p );
  94. }
  95. X->s = 1;
  96. X->n = 0;
  97. X->p = NULL;
  98. }
  99. /*
  100. * Enlarge to the specified number of limbs
  101. */
  102. int mbedtls_mpi_grow( mbedtls_mpi *X, size_t nblimbs )
  103. {
  104. mbedtls_mpi_uint *p;
  105. if( nblimbs > MBEDTLS_MPI_MAX_LIMBS )
  106. return( MBEDTLS_ERR_MPI_ALLOC_FAILED );
  107. if( X->n < nblimbs )
  108. {
  109. if( ( p = (mbedtls_mpi_uint*)mbedtls_calloc( nblimbs, ciL ) ) == NULL )
  110. return( MBEDTLS_ERR_MPI_ALLOC_FAILED );
  111. if( X->p != NULL )
  112. {
  113. memcpy( p, X->p, X->n * ciL );
  114. mbedtls_mpi_zeroize( X->p, X->n );
  115. mbedtls_free( X->p );
  116. }
  117. X->n = nblimbs;
  118. X->p = p;
  119. }
  120. return( 0 );
  121. }
  122. /*
  123. * Resize down as much as possible,
  124. * while keeping at least the specified number of limbs
  125. */
  126. int mbedtls_mpi_shrink( mbedtls_mpi *X, size_t nblimbs )
  127. {
  128. mbedtls_mpi_uint *p;
  129. size_t i;
  130. /* Actually resize up in this case */
  131. if( X->n <= nblimbs )
  132. return( mbedtls_mpi_grow( X, nblimbs ) );
  133. for( i = X->n - 1; i > 0; i-- )
  134. if( X->p[i] != 0 )
  135. break;
  136. i++;
  137. if( i < nblimbs )
  138. i = nblimbs;
  139. if( ( p = (mbedtls_mpi_uint*)mbedtls_calloc( i, ciL ) ) == NULL )
  140. return( MBEDTLS_ERR_MPI_ALLOC_FAILED );
  141. if( X->p != NULL )
  142. {
  143. memcpy( p, X->p, i * ciL );
  144. mbedtls_mpi_zeroize( X->p, X->n );
  145. mbedtls_free( X->p );
  146. }
  147. X->n = i;
  148. X->p = p;
  149. return( 0 );
  150. }
  151. /*
  152. * Copy the contents of Y into X
  153. */
  154. int mbedtls_mpi_copy( mbedtls_mpi *X, const mbedtls_mpi *Y )
  155. {
  156. int ret;
  157. size_t i;
  158. if( X == Y )
  159. return( 0 );
  160. if( Y->p == NULL )
  161. {
  162. mbedtls_mpi_free( X );
  163. return( 0 );
  164. }
  165. for( i = Y->n - 1; i > 0; i-- )
  166. if( Y->p[i] != 0 )
  167. break;
  168. i++;
  169. X->s = Y->s;
  170. MBEDTLS_MPI_CHK( mbedtls_mpi_grow( X, i ) );
  171. memset( X->p, 0, X->n * ciL );
  172. memcpy( X->p, Y->p, i * ciL );
  173. cleanup:
  174. return( ret );
  175. }
  176. /*
  177. * Swap the contents of X and Y
  178. */
  179. void mbedtls_mpi_swap( mbedtls_mpi *X, mbedtls_mpi *Y )
  180. {
  181. mbedtls_mpi T;
  182. memcpy( &T, X, sizeof( mbedtls_mpi ) );
  183. memcpy( X, Y, sizeof( mbedtls_mpi ) );
  184. memcpy( Y, &T, sizeof( mbedtls_mpi ) );
  185. }
  186. /*
  187. * Conditionally assign X = Y, without leaking information
  188. * about whether the assignment was made or not.
  189. * (Leaking information about the respective sizes of X and Y is ok however.)
  190. */
  191. int mbedtls_mpi_safe_cond_assign( mbedtls_mpi *X, const mbedtls_mpi *Y, unsigned char assign )
  192. {
  193. int ret = 0;
  194. size_t i;
  195. /* make sure assign is 0 or 1 in a time-constant manner */
  196. assign = (assign | (unsigned char)-assign) >> 7;
  197. MBEDTLS_MPI_CHK( mbedtls_mpi_grow( X, Y->n ) );
  198. X->s = X->s * ( 1 - assign ) + Y->s * assign;
  199. for( i = 0; i < Y->n; i++ )
  200. X->p[i] = X->p[i] * ( 1 - assign ) + Y->p[i] * assign;
  201. for( ; i < X->n; i++ )
  202. X->p[i] *= ( 1 - assign );
  203. cleanup:
  204. return( ret );
  205. }
  206. /*
  207. * Conditionally swap X and Y, without leaking information
  208. * about whether the swap was made or not.
  209. * Here it is not ok to simply swap the pointers, which whould lead to
  210. * different memory access patterns when X and Y are used afterwards.
  211. */
  212. int mbedtls_mpi_safe_cond_swap( mbedtls_mpi *X, mbedtls_mpi *Y, unsigned char swap )
  213. {
  214. int ret, s;
  215. size_t i;
  216. mbedtls_mpi_uint tmp;
  217. if( X == Y )
  218. return( 0 );
  219. /* make sure swap is 0 or 1 in a time-constant manner */
  220. swap = (swap | (unsigned char)-swap) >> 7;
  221. MBEDTLS_MPI_CHK( mbedtls_mpi_grow( X, Y->n ) );
  222. MBEDTLS_MPI_CHK( mbedtls_mpi_grow( Y, X->n ) );
  223. s = X->s;
  224. X->s = X->s * ( 1 - swap ) + Y->s * swap;
  225. Y->s = Y->s * ( 1 - swap ) + s * swap;
  226. for( i = 0; i < X->n; i++ )
  227. {
  228. tmp = X->p[i];
  229. X->p[i] = X->p[i] * ( 1 - swap ) + Y->p[i] * swap;
  230. Y->p[i] = Y->p[i] * ( 1 - swap ) + tmp * swap;
  231. }
  232. cleanup:
  233. return( ret );
  234. }
  235. /*
  236. * Set value from integer
  237. */
  238. int mbedtls_mpi_lset( mbedtls_mpi *X, mbedtls_mpi_sint z )
  239. {
  240. int ret;
  241. MBEDTLS_MPI_CHK( mbedtls_mpi_grow( X, 1 ) );
  242. memset( X->p, 0, X->n * ciL );
  243. X->p[0] = ( z < 0 ) ? -z : z;
  244. X->s = ( z < 0 ) ? -1 : 1;
  245. cleanup:
  246. return( ret );
  247. }
  248. /*
  249. * Get a specific bit
  250. */
  251. int mbedtls_mpi_get_bit( const mbedtls_mpi *X, size_t pos )
  252. {
  253. if( X->n * biL <= pos )
  254. return( 0 );
  255. return( ( X->p[pos / biL] >> ( pos % biL ) ) & 0x01 );
  256. }
  257. /*
  258. * Set a bit to a specific value of 0 or 1
  259. */
  260. int mbedtls_mpi_set_bit( mbedtls_mpi *X, size_t pos, unsigned char val )
  261. {
  262. int ret = 0;
  263. size_t off = pos / biL;
  264. size_t idx = pos % biL;
  265. if( val != 0 && val != 1 )
  266. return( MBEDTLS_ERR_MPI_BAD_INPUT_DATA );
  267. if( X->n * biL <= pos )
  268. {
  269. if( val == 0 )
  270. return( 0 );
  271. MBEDTLS_MPI_CHK( mbedtls_mpi_grow( X, off + 1 ) );
  272. }
  273. X->p[off] &= ~( (mbedtls_mpi_uint) 0x01 << idx );
  274. X->p[off] |= (mbedtls_mpi_uint) val << idx;
  275. cleanup:
  276. return( ret );
  277. }
  278. /*
  279. * Return the number of less significant zero-bits
  280. */
  281. size_t mbedtls_mpi_lsb( const mbedtls_mpi *X )
  282. {
  283. size_t i, j, count = 0;
  284. for( i = 0; i < X->n; i++ )
  285. for( j = 0; j < biL; j++, count++ )
  286. if( ( ( X->p[i] >> j ) & 1 ) != 0 )
  287. return( count );
  288. return( 0 );
  289. }
  290. /*
  291. * Count leading zero bits in a given integer
  292. */
  293. static size_t mbedtls_clz( const mbedtls_mpi_uint x )
  294. {
  295. size_t j;
  296. mbedtls_mpi_uint mask = (mbedtls_mpi_uint) 1 << (biL - 1);
  297. for( j = 0; j < biL; j++ )
  298. {
  299. if( x & mask ) break;
  300. mask >>= 1;
  301. }
  302. return j;
  303. }
  304. /*
  305. * Return the number of bits
  306. */
  307. size_t mbedtls_mpi_bitlen( const mbedtls_mpi *X )
  308. {
  309. size_t i, j;
  310. if( X->n == 0 )
  311. return( 0 );
  312. for( i = X->n - 1; i > 0; i-- )
  313. if( X->p[i] != 0 )
  314. break;
  315. j = biL - mbedtls_clz( X->p[i] );
  316. return( ( i * biL ) + j );
  317. }
  318. /*
  319. * Return the total size in bytes
  320. */
  321. size_t mbedtls_mpi_size( const mbedtls_mpi *X )
  322. {
  323. return( ( mbedtls_mpi_bitlen( X ) + 7 ) >> 3 );
  324. }
  325. /*
  326. * Convert an ASCII character to digit value
  327. */
  328. static int mpi_get_digit( mbedtls_mpi_uint *d, int radix, char c )
  329. {
  330. *d = 255;
  331. if( c >= 0x30 && c <= 0x39 ) *d = c - 0x30;
  332. if( c >= 0x41 && c <= 0x46 ) *d = c - 0x37;
  333. if( c >= 0x61 && c <= 0x66 ) *d = c - 0x57;
  334. if( *d >= (mbedtls_mpi_uint) radix )
  335. return( MBEDTLS_ERR_MPI_INVALID_CHARACTER );
  336. return( 0 );
  337. }
  338. /*
  339. * Import from an ASCII string
  340. */
  341. int mbedtls_mpi_read_string( mbedtls_mpi *X, int radix, const char *s )
  342. {
  343. int ret;
  344. size_t i, j, slen, n;
  345. mbedtls_mpi_uint d;
  346. mbedtls_mpi T;
  347. if( radix < 2 || radix > 16 )
  348. return( MBEDTLS_ERR_MPI_BAD_INPUT_DATA );
  349. mbedtls_mpi_init( &T );
  350. slen = strlen( s );
  351. if( radix == 16 )
  352. {
  353. if( slen > MPI_SIZE_T_MAX >> 2 )
  354. return( MBEDTLS_ERR_MPI_BAD_INPUT_DATA );
  355. n = BITS_TO_LIMBS( slen << 2 );
  356. MBEDTLS_MPI_CHK( mbedtls_mpi_grow( X, n ) );
  357. MBEDTLS_MPI_CHK( mbedtls_mpi_lset( X, 0 ) );
  358. for( i = slen, j = 0; i > 0; i--, j++ )
  359. {
  360. if( i == 1 && s[i - 1] == '-' )
  361. {
  362. X->s = -1;
  363. break;
  364. }
  365. MBEDTLS_MPI_CHK( mpi_get_digit( &d, radix, s[i - 1] ) );
  366. X->p[j / ( 2 * ciL )] |= d << ( ( j % ( 2 * ciL ) ) << 2 );
  367. }
  368. }
  369. else
  370. {
  371. MBEDTLS_MPI_CHK( mbedtls_mpi_lset( X, 0 ) );
  372. for( i = 0; i < slen; i++ )
  373. {
  374. if( i == 0 && s[i] == '-' )
  375. {
  376. X->s = -1;
  377. continue;
  378. }
  379. MBEDTLS_MPI_CHK( mpi_get_digit( &d, radix, s[i] ) );
  380. MBEDTLS_MPI_CHK( mbedtls_mpi_mul_int( &T, X, radix ) );
  381. if( X->s == 1 )
  382. {
  383. MBEDTLS_MPI_CHK( mbedtls_mpi_add_int( X, &T, d ) );
  384. }
  385. else
  386. {
  387. MBEDTLS_MPI_CHK( mbedtls_mpi_sub_int( X, &T, d ) );
  388. }
  389. }
  390. }
  391. cleanup:
  392. mbedtls_mpi_free( &T );
  393. return( ret );
  394. }
  395. /*
  396. * Helper to write the digits high-order first
  397. */
  398. static int mpi_write_hlp( mbedtls_mpi *X, int radix, char **p )
  399. {
  400. int ret;
  401. mbedtls_mpi_uint r;
  402. if( radix < 2 || radix > 16 )
  403. return( MBEDTLS_ERR_MPI_BAD_INPUT_DATA );
  404. MBEDTLS_MPI_CHK( mbedtls_mpi_mod_int( &r, X, radix ) );
  405. MBEDTLS_MPI_CHK( mbedtls_mpi_div_int( X, NULL, X, radix ) );
  406. if( mbedtls_mpi_cmp_int( X, 0 ) != 0 )
  407. MBEDTLS_MPI_CHK( mpi_write_hlp( X, radix, p ) );
  408. if( r < 10 )
  409. *(*p)++ = (char)( r + 0x30 );
  410. else
  411. *(*p)++ = (char)( r + 0x37 );
  412. cleanup:
  413. return( ret );
  414. }
  415. /*
  416. * Export into an ASCII string
  417. */
  418. int mbedtls_mpi_write_string( const mbedtls_mpi *X, int radix,
  419. char *buf, size_t buflen, size_t *olen )
  420. {
  421. int ret = 0;
  422. size_t n;
  423. char *p;
  424. mbedtls_mpi T;
  425. if( radix < 2 || radix > 16 )
  426. return( MBEDTLS_ERR_MPI_BAD_INPUT_DATA );
  427. n = mbedtls_mpi_bitlen( X );
  428. if( radix >= 4 ) n >>= 1;
  429. if( radix >= 16 ) n >>= 1;
  430. /*
  431. * Round up the buffer length to an even value to ensure that there is
  432. * enough room for hexadecimal values that can be represented in an odd
  433. * number of digits.
  434. */
  435. n += 3 + ( ( n + 1 ) & 1 );
  436. if( buflen < n )
  437. {
  438. *olen = n;
  439. return( MBEDTLS_ERR_MPI_BUFFER_TOO_SMALL );
  440. }
  441. p = buf;
  442. mbedtls_mpi_init( &T );
  443. if( X->s == -1 )
  444. *p++ = '-';
  445. if( radix == 16 )
  446. {
  447. int c;
  448. size_t i, j, k;
  449. for( i = X->n, k = 0; i > 0; i-- )
  450. {
  451. for( j = ciL; j > 0; j-- )
  452. {
  453. c = ( X->p[i - 1] >> ( ( j - 1 ) << 3) ) & 0xFF;
  454. if( c == 0 && k == 0 && ( i + j ) != 2 )
  455. continue;
  456. *(p++) = "0123456789ABCDEF" [c / 16];
  457. *(p++) = "0123456789ABCDEF" [c % 16];
  458. k = 1;
  459. }
  460. }
  461. }
  462. else
  463. {
  464. MBEDTLS_MPI_CHK( mbedtls_mpi_copy( &T, X ) );
  465. if( T.s == -1 )
  466. T.s = 1;
  467. MBEDTLS_MPI_CHK( mpi_write_hlp( &T, radix, &p ) );
  468. }
  469. *p++ = '\0';
  470. *olen = p - buf;
  471. cleanup:
  472. mbedtls_mpi_free( &T );
  473. return( ret );
  474. }
  475. #if defined(MBEDTLS_FS_IO)
  476. /*
  477. * Read X from an opened file
  478. */
  479. int mbedtls_mpi_read_file( mbedtls_mpi *X, int radix, FILE *fin )
  480. {
  481. mbedtls_mpi_uint d;
  482. size_t slen;
  483. char *p;
  484. /*
  485. * Buffer should have space for (short) label and decimal formatted MPI,
  486. * newline characters and '\0'
  487. */
  488. char s[ MBEDTLS_MPI_RW_BUFFER_SIZE ];
  489. memset( s, 0, sizeof( s ) );
  490. if( fgets( s, sizeof( s ) - 1, fin ) == NULL )
  491. return( MBEDTLS_ERR_MPI_FILE_IO_ERROR );
  492. slen = strlen( s );
  493. if( slen == sizeof( s ) - 2 )
  494. return( MBEDTLS_ERR_MPI_BUFFER_TOO_SMALL );
  495. if( slen > 0 && s[slen - 1] == '\n' ) { slen--; s[slen] = '\0'; }
  496. if( slen > 0 && s[slen - 1] == '\r' ) { slen--; s[slen] = '\0'; }
  497. p = s + slen;
  498. while( p-- > s )
  499. if( mpi_get_digit( &d, radix, *p ) != 0 )
  500. break;
  501. return( mbedtls_mpi_read_string( X, radix, p + 1 ) );
  502. }
  503. /*
  504. * Write X into an opened file (or stdout if fout == NULL)
  505. */
  506. int mbedtls_mpi_write_file( const char *p, const mbedtls_mpi *X, int radix, FILE *fout )
  507. {
  508. int ret;
  509. size_t n, slen, plen;
  510. /*
  511. * Buffer should have space for (short) label and decimal formatted MPI,
  512. * newline characters and '\0'
  513. */
  514. char s[ MBEDTLS_MPI_RW_BUFFER_SIZE ];
  515. memset( s, 0, sizeof( s ) );
  516. MBEDTLS_MPI_CHK( mbedtls_mpi_write_string( X, radix, s, sizeof( s ) - 2, &n ) );
  517. if( p == NULL ) p = "";
  518. plen = strlen( p );
  519. slen = strlen( s );
  520. s[slen++] = '\r';
  521. s[slen++] = '\n';
  522. if( fout != NULL )
  523. {
  524. if( fwrite( p, 1, plen, fout ) != plen ||
  525. fwrite( s, 1, slen, fout ) != slen )
  526. return( MBEDTLS_ERR_MPI_FILE_IO_ERROR );
  527. }
  528. else
  529. mbedtls_printf( "%s%s", p, s );
  530. cleanup:
  531. return( ret );
  532. }
  533. #endif /* MBEDTLS_FS_IO */
  534. /*
  535. * Import X from unsigned binary data, big endian
  536. */
  537. int mbedtls_mpi_read_binary( mbedtls_mpi *X, const unsigned char *buf, size_t buflen )
  538. {
  539. int ret;
  540. size_t i, j;
  541. size_t const limbs = CHARS_TO_LIMBS( buflen );
  542. /* Ensure that target MPI has exactly the necessary number of limbs */
  543. if( X->n != limbs )
  544. {
  545. mbedtls_mpi_free( X );
  546. mbedtls_mpi_init( X );
  547. MBEDTLS_MPI_CHK( mbedtls_mpi_grow( X, limbs ) );
  548. }
  549. MBEDTLS_MPI_CHK( mbedtls_mpi_lset( X, 0 ) );
  550. for( i = buflen, j = 0; i > 0; i--, j++ )
  551. X->p[j / ciL] |= ((mbedtls_mpi_uint) buf[i - 1]) << ((j % ciL) << 3);
  552. cleanup:
  553. return( ret );
  554. }
  555. /*
  556. * Export X into unsigned binary data, big endian
  557. */
  558. int mbedtls_mpi_write_binary( const mbedtls_mpi *X, unsigned char *buf, size_t buflen )
  559. {
  560. size_t i, j, n;
  561. n = mbedtls_mpi_size( X );
  562. if( buflen < n )
  563. return( MBEDTLS_ERR_MPI_BUFFER_TOO_SMALL );
  564. memset( buf, 0, buflen );
  565. for( i = buflen - 1, j = 0; n > 0; i--, j++, n-- )
  566. buf[i] = (unsigned char)( X->p[j / ciL] >> ((j % ciL) << 3) );
  567. return( 0 );
  568. }
  569. /*
  570. * Left-shift: X <<= count
  571. */
  572. int mbedtls_mpi_shift_l( mbedtls_mpi *X, size_t count )
  573. {
  574. int ret;
  575. size_t i, v0, t1;
  576. mbedtls_mpi_uint r0 = 0, r1;
  577. v0 = count / (biL );
  578. t1 = count & (biL - 1);
  579. i = mbedtls_mpi_bitlen( X ) + count;
  580. if( X->n * biL < i )
  581. MBEDTLS_MPI_CHK( mbedtls_mpi_grow( X, BITS_TO_LIMBS( i ) ) );
  582. ret = 0;
  583. /*
  584. * shift by count / limb_size
  585. */
  586. if( v0 > 0 )
  587. {
  588. for( i = X->n; i > v0; i-- )
  589. X->p[i - 1] = X->p[i - v0 - 1];
  590. for( ; i > 0; i-- )
  591. X->p[i - 1] = 0;
  592. }
  593. /*
  594. * shift by count % limb_size
  595. */
  596. if( t1 > 0 )
  597. {
  598. for( i = v0; i < X->n; i++ )
  599. {
  600. r1 = X->p[i] >> (biL - t1);
  601. X->p[i] <<= t1;
  602. X->p[i] |= r0;
  603. r0 = r1;
  604. }
  605. }
  606. cleanup:
  607. return( ret );
  608. }
  609. /*
  610. * Right-shift: X >>= count
  611. */
  612. int mbedtls_mpi_shift_r( mbedtls_mpi *X, size_t count )
  613. {
  614. size_t i, v0, v1;
  615. mbedtls_mpi_uint r0 = 0, r1;
  616. v0 = count / biL;
  617. v1 = count & (biL - 1);
  618. if( v0 > X->n || ( v0 == X->n && v1 > 0 ) )
  619. return mbedtls_mpi_lset( X, 0 );
  620. /*
  621. * shift by count / limb_size
  622. */
  623. if( v0 > 0 )
  624. {
  625. for( i = 0; i < X->n - v0; i++ )
  626. X->p[i] = X->p[i + v0];
  627. for( ; i < X->n; i++ )
  628. X->p[i] = 0;
  629. }
  630. /*
  631. * shift by count % limb_size
  632. */
  633. if( v1 > 0 )
  634. {
  635. for( i = X->n; i > 0; i-- )
  636. {
  637. r1 = X->p[i - 1] << (biL - v1);
  638. X->p[i - 1] >>= v1;
  639. X->p[i - 1] |= r0;
  640. r0 = r1;
  641. }
  642. }
  643. return( 0 );
  644. }
  645. /*
  646. * Compare unsigned values
  647. */
  648. int mbedtls_mpi_cmp_abs( const mbedtls_mpi *X, const mbedtls_mpi *Y )
  649. {
  650. size_t i, j;
  651. for( i = X->n; i > 0; i-- )
  652. if( X->p[i - 1] != 0 )
  653. break;
  654. for( j = Y->n; j > 0; j-- )
  655. if( Y->p[j - 1] != 0 )
  656. break;
  657. if( i == 0 && j == 0 )
  658. return( 0 );
  659. if( i > j ) return( 1 );
  660. if( j > i ) return( -1 );
  661. for( ; i > 0; i-- )
  662. {
  663. if( X->p[i - 1] > Y->p[i - 1] ) return( 1 );
  664. if( X->p[i - 1] < Y->p[i - 1] ) return( -1 );
  665. }
  666. return( 0 );
  667. }
  668. /*
  669. * Compare signed values
  670. */
  671. int mbedtls_mpi_cmp_mpi( const mbedtls_mpi *X, const mbedtls_mpi *Y )
  672. {
  673. size_t i, j;
  674. for( i = X->n; i > 0; i-- )
  675. if( X->p[i - 1] != 0 )
  676. break;
  677. for( j = Y->n; j > 0; j-- )
  678. if( Y->p[j - 1] != 0 )
  679. break;
  680. if( i == 0 && j == 0 )
  681. return( 0 );
  682. if( i > j ) return( X->s );
  683. if( j > i ) return( -Y->s );
  684. if( X->s > 0 && Y->s < 0 ) return( 1 );
  685. if( Y->s > 0 && X->s < 0 ) return( -1 );
  686. for( ; i > 0; i-- )
  687. {
  688. if( X->p[i - 1] > Y->p[i - 1] ) return( X->s );
  689. if( X->p[i - 1] < Y->p[i - 1] ) return( -X->s );
  690. }
  691. return( 0 );
  692. }
  693. /*
  694. * Compare signed values
  695. */
  696. int mbedtls_mpi_cmp_int( const mbedtls_mpi *X, mbedtls_mpi_sint z )
  697. {
  698. mbedtls_mpi Y;
  699. mbedtls_mpi_uint p[1];
  700. *p = ( z < 0 ) ? -z : z;
  701. Y.s = ( z < 0 ) ? -1 : 1;
  702. Y.n = 1;
  703. Y.p = p;
  704. return( mbedtls_mpi_cmp_mpi( X, &Y ) );
  705. }
  706. /*
  707. * Unsigned addition: X = |A| + |B| (HAC 14.7)
  708. */
  709. int mbedtls_mpi_add_abs( mbedtls_mpi *X, const mbedtls_mpi *A, const mbedtls_mpi *B )
  710. {
  711. int ret;
  712. size_t i, j;
  713. mbedtls_mpi_uint *o, *p, c, tmp;
  714. if( X == B )
  715. {
  716. const mbedtls_mpi *T = A; A = X; B = T;
  717. }
  718. if( X != A )
  719. MBEDTLS_MPI_CHK( mbedtls_mpi_copy( X, A ) );
  720. /*
  721. * X should always be positive as a result of unsigned additions.
  722. */
  723. X->s = 1;
  724. for( j = B->n; j > 0; j-- )
  725. if( B->p[j - 1] != 0 )
  726. break;
  727. MBEDTLS_MPI_CHK( mbedtls_mpi_grow( X, j ) );
  728. o = B->p; p = X->p; c = 0;
  729. /*
  730. * tmp is used because it might happen that p == o
  731. */
  732. for( i = 0; i < j; i++, o++, p++ )
  733. {
  734. tmp= *o;
  735. *p += c; c = ( *p < c );
  736. *p += tmp; c += ( *p < tmp );
  737. }
  738. while( c != 0 )
  739. {
  740. if( i >= X->n )
  741. {
  742. MBEDTLS_MPI_CHK( mbedtls_mpi_grow( X, i + 1 ) );
  743. p = X->p + i;
  744. }
  745. *p += c; c = ( *p < c ); i++; p++;
  746. }
  747. cleanup:
  748. return( ret );
  749. }
  750. /*
  751. * Helper for mbedtls_mpi subtraction
  752. */
  753. static void mpi_sub_hlp( size_t n, mbedtls_mpi_uint *s, mbedtls_mpi_uint *d )
  754. {
  755. size_t i;
  756. mbedtls_mpi_uint c, z;
  757. for( i = c = 0; i < n; i++, s++, d++ )
  758. {
  759. z = ( *d < c ); *d -= c;
  760. c = ( *d < *s ) + z; *d -= *s;
  761. }
  762. while( c != 0 )
  763. {
  764. z = ( *d < c ); *d -= c;
  765. c = z; i++; d++;
  766. }
  767. }
  768. /*
  769. * Unsigned subtraction: X = |A| - |B| (HAC 14.9)
  770. */
  771. int mbedtls_mpi_sub_abs( mbedtls_mpi *X, const mbedtls_mpi *A, const mbedtls_mpi *B )
  772. {
  773. mbedtls_mpi TB;
  774. int ret;
  775. size_t n;
  776. if( mbedtls_mpi_cmp_abs( A, B ) < 0 )
  777. return( MBEDTLS_ERR_MPI_NEGATIVE_VALUE );
  778. mbedtls_mpi_init( &TB );
  779. if( X == B )
  780. {
  781. MBEDTLS_MPI_CHK( mbedtls_mpi_copy( &TB, B ) );
  782. B = &TB;
  783. }
  784. if( X != A )
  785. MBEDTLS_MPI_CHK( mbedtls_mpi_copy( X, A ) );
  786. /*
  787. * X should always be positive as a result of unsigned subtractions.
  788. */
  789. X->s = 1;
  790. ret = 0;
  791. for( n = B->n; n > 0; n-- )
  792. if( B->p[n - 1] != 0 )
  793. break;
  794. mpi_sub_hlp( n, B->p, X->p );
  795. cleanup:
  796. mbedtls_mpi_free( &TB );
  797. return( ret );
  798. }
  799. /*
  800. * Signed addition: X = A + B
  801. */
  802. int mbedtls_mpi_add_mpi( mbedtls_mpi *X, const mbedtls_mpi *A, const mbedtls_mpi *B )
  803. {
  804. int ret, s = A->s;
  805. if( A->s * B->s < 0 )
  806. {
  807. if( mbedtls_mpi_cmp_abs( A, B ) >= 0 )
  808. {
  809. MBEDTLS_MPI_CHK( mbedtls_mpi_sub_abs( X, A, B ) );
  810. X->s = s;
  811. }
  812. else
  813. {
  814. MBEDTLS_MPI_CHK( mbedtls_mpi_sub_abs( X, B, A ) );
  815. X->s = -s;
  816. }
  817. }
  818. else
  819. {
  820. MBEDTLS_MPI_CHK( mbedtls_mpi_add_abs( X, A, B ) );
  821. X->s = s;
  822. }
  823. cleanup:
  824. return( ret );
  825. }
  826. /*
  827. * Signed subtraction: X = A - B
  828. */
  829. int mbedtls_mpi_sub_mpi( mbedtls_mpi *X, const mbedtls_mpi *A, const mbedtls_mpi *B )
  830. {
  831. int ret, s = A->s;
  832. if( A->s * B->s > 0 )
  833. {
  834. if( mbedtls_mpi_cmp_abs( A, B ) >= 0 )
  835. {
  836. MBEDTLS_MPI_CHK( mbedtls_mpi_sub_abs( X, A, B ) );
  837. X->s = s;
  838. }
  839. else
  840. {
  841. MBEDTLS_MPI_CHK( mbedtls_mpi_sub_abs( X, B, A ) );
  842. X->s = -s;
  843. }
  844. }
  845. else
  846. {
  847. MBEDTLS_MPI_CHK( mbedtls_mpi_add_abs( X, A, B ) );
  848. X->s = s;
  849. }
  850. cleanup:
  851. return( ret );
  852. }
  853. /*
  854. * Signed addition: X = A + b
  855. */
  856. int mbedtls_mpi_add_int( mbedtls_mpi *X, const mbedtls_mpi *A, mbedtls_mpi_sint b )
  857. {
  858. mbedtls_mpi _B;
  859. mbedtls_mpi_uint p[1];
  860. p[0] = ( b < 0 ) ? -b : b;
  861. _B.s = ( b < 0 ) ? -1 : 1;
  862. _B.n = 1;
  863. _B.p = p;
  864. return( mbedtls_mpi_add_mpi( X, A, &_B ) );
  865. }
  866. /*
  867. * Signed subtraction: X = A - b
  868. */
  869. int mbedtls_mpi_sub_int( mbedtls_mpi *X, const mbedtls_mpi *A, mbedtls_mpi_sint b )
  870. {
  871. mbedtls_mpi _B;
  872. mbedtls_mpi_uint p[1];
  873. p[0] = ( b < 0 ) ? -b : b;
  874. _B.s = ( b < 0 ) ? -1 : 1;
  875. _B.n = 1;
  876. _B.p = p;
  877. return( mbedtls_mpi_sub_mpi( X, A, &_B ) );
  878. }
  879. /*
  880. * Helper for mbedtls_mpi multiplication
  881. */
  882. static
  883. #if defined(__APPLE__) && defined(__arm__)
  884. /*
  885. * Apple LLVM version 4.2 (clang-425.0.24) (based on LLVM 3.2svn)
  886. * appears to need this to prevent bad ARM code generation at -O3.
  887. */
  888. __attribute__ ((noinline))
  889. #endif
  890. void mpi_mul_hlp( size_t i, mbedtls_mpi_uint *s, mbedtls_mpi_uint *d, mbedtls_mpi_uint b )
  891. {
  892. mbedtls_mpi_uint c = 0, t = 0;
  893. #if defined(MULADDC_HUIT)
  894. for( ; i >= 8; i -= 8 )
  895. {
  896. MULADDC_INIT
  897. MULADDC_HUIT
  898. MULADDC_STOP
  899. }
  900. for( ; i > 0; i-- )
  901. {
  902. MULADDC_INIT
  903. MULADDC_CORE
  904. MULADDC_STOP
  905. }
  906. #else /* MULADDC_HUIT */
  907. for( ; i >= 16; i -= 16 )
  908. {
  909. MULADDC_INIT
  910. MULADDC_CORE MULADDC_CORE
  911. MULADDC_CORE MULADDC_CORE
  912. MULADDC_CORE MULADDC_CORE
  913. MULADDC_CORE MULADDC_CORE
  914. MULADDC_CORE MULADDC_CORE
  915. MULADDC_CORE MULADDC_CORE
  916. MULADDC_CORE MULADDC_CORE
  917. MULADDC_CORE MULADDC_CORE
  918. MULADDC_STOP
  919. }
  920. for( ; i >= 8; i -= 8 )
  921. {
  922. MULADDC_INIT
  923. MULADDC_CORE MULADDC_CORE
  924. MULADDC_CORE MULADDC_CORE
  925. MULADDC_CORE MULADDC_CORE
  926. MULADDC_CORE MULADDC_CORE
  927. MULADDC_STOP
  928. }
  929. for( ; i > 0; i-- )
  930. {
  931. MULADDC_INIT
  932. MULADDC_CORE
  933. MULADDC_STOP
  934. }
  935. #endif /* MULADDC_HUIT */
  936. t++;
  937. do {
  938. *d += c; c = ( *d < c ); d++;
  939. }
  940. while( c != 0 );
  941. }
  942. /*
  943. * Baseline multiplication: X = A * B (HAC 14.12)
  944. */
  945. int mbedtls_mpi_mul_mpi( mbedtls_mpi *X, const mbedtls_mpi *A, const mbedtls_mpi *B )
  946. {
  947. int ret;
  948. size_t i, j;
  949. mbedtls_mpi TA, TB;
  950. mbedtls_mpi_init( &TA ); mbedtls_mpi_init( &TB );
  951. if( X == A ) { MBEDTLS_MPI_CHK( mbedtls_mpi_copy( &TA, A ) ); A = &TA; }
  952. if( X == B ) { MBEDTLS_MPI_CHK( mbedtls_mpi_copy( &TB, B ) ); B = &TB; }
  953. for( i = A->n; i > 0; i-- )
  954. if( A->p[i - 1] != 0 )
  955. break;
  956. for( j = B->n; j > 0; j-- )
  957. if( B->p[j - 1] != 0 )
  958. break;
  959. MBEDTLS_MPI_CHK( mbedtls_mpi_grow( X, i + j ) );
  960. MBEDTLS_MPI_CHK( mbedtls_mpi_lset( X, 0 ) );
  961. for( i++; j > 0; j-- )
  962. mpi_mul_hlp( i - 1, A->p, X->p + j - 1, B->p[j - 1] );
  963. X->s = A->s * B->s;
  964. cleanup:
  965. mbedtls_mpi_free( &TB ); mbedtls_mpi_free( &TA );
  966. return( ret );
  967. }
  968. /*
  969. * Baseline multiplication: X = A * b
  970. */
  971. int mbedtls_mpi_mul_int( mbedtls_mpi *X, const mbedtls_mpi *A, mbedtls_mpi_uint b )
  972. {
  973. mbedtls_mpi _B;
  974. mbedtls_mpi_uint p[1];
  975. _B.s = 1;
  976. _B.n = 1;
  977. _B.p = p;
  978. p[0] = b;
  979. return( mbedtls_mpi_mul_mpi( X, A, &_B ) );
  980. }
  981. /*
  982. * Unsigned integer divide - double mbedtls_mpi_uint dividend, u1/u0, and
  983. * mbedtls_mpi_uint divisor, d
  984. */
  985. static mbedtls_mpi_uint mbedtls_int_div_int( mbedtls_mpi_uint u1,
  986. mbedtls_mpi_uint u0, mbedtls_mpi_uint d, mbedtls_mpi_uint *r )
  987. {
  988. #if defined(MBEDTLS_HAVE_UDBL)
  989. mbedtls_t_udbl dividend, quotient;
  990. #else
  991. const mbedtls_mpi_uint radix = (mbedtls_mpi_uint) 1 << biH;
  992. const mbedtls_mpi_uint uint_halfword_mask = ( (mbedtls_mpi_uint) 1 << biH ) - 1;
  993. mbedtls_mpi_uint d0, d1, q0, q1, rAX, r0, quotient;
  994. mbedtls_mpi_uint u0_msw, u0_lsw;
  995. size_t s;
  996. #endif
  997. /*
  998. * Check for overflow
  999. */
  1000. if( 0 == d || u1 >= d )
  1001. {
  1002. if (r != NULL) *r = ~0;
  1003. return ( ~0 );
  1004. }
  1005. #if defined(MBEDTLS_HAVE_UDBL)
  1006. dividend = (mbedtls_t_udbl) u1 << biL;
  1007. dividend |= (mbedtls_t_udbl) u0;
  1008. quotient = dividend / d;
  1009. if( quotient > ( (mbedtls_t_udbl) 1 << biL ) - 1 )
  1010. quotient = ( (mbedtls_t_udbl) 1 << biL ) - 1;
  1011. if( r != NULL )
  1012. *r = (mbedtls_mpi_uint)( dividend - (quotient * d ) );
  1013. return (mbedtls_mpi_uint) quotient;
  1014. #else
  1015. /*
  1016. * Algorithm D, Section 4.3.1 - The Art of Computer Programming
  1017. * Vol. 2 - Seminumerical Algorithms, Knuth
  1018. */
  1019. /*
  1020. * Normalize the divisor, d, and dividend, u0, u1
  1021. */
  1022. s = mbedtls_clz( d );
  1023. d = d << s;
  1024. u1 = u1 << s;
  1025. u1 |= ( u0 >> ( biL - s ) ) & ( -(mbedtls_mpi_sint)s >> ( biL - 1 ) );
  1026. u0 = u0 << s;
  1027. d1 = d >> biH;
  1028. d0 = d & uint_halfword_mask;
  1029. u0_msw = u0 >> biH;
  1030. u0_lsw = u0 & uint_halfword_mask;
  1031. /*
  1032. * Find the first quotient and remainder
  1033. */
  1034. q1 = u1 / d1;
  1035. r0 = u1 - d1 * q1;
  1036. while( q1 >= radix || ( q1 * d0 > radix * r0 + u0_msw ) )
  1037. {
  1038. q1 -= 1;
  1039. r0 += d1;
  1040. if ( r0 >= radix ) break;
  1041. }
  1042. rAX = ( u1 * radix ) + ( u0_msw - q1 * d );
  1043. q0 = rAX / d1;
  1044. r0 = rAX - q0 * d1;
  1045. while( q0 >= radix || ( q0 * d0 > radix * r0 + u0_lsw ) )
  1046. {
  1047. q0 -= 1;
  1048. r0 += d1;
  1049. if ( r0 >= radix ) break;
  1050. }
  1051. if (r != NULL)
  1052. *r = ( rAX * radix + u0_lsw - q0 * d ) >> s;
  1053. quotient = q1 * radix + q0;
  1054. return quotient;
  1055. #endif
  1056. }
  1057. /*
  1058. * Division by mbedtls_mpi: A = Q * B + R (HAC 14.20)
  1059. */
  1060. int mbedtls_mpi_div_mpi( mbedtls_mpi *Q, mbedtls_mpi *R, const mbedtls_mpi *A, const mbedtls_mpi *B )
  1061. {
  1062. int ret;
  1063. size_t i, n, t, k;
  1064. mbedtls_mpi X, Y, Z, T1, T2;
  1065. if( mbedtls_mpi_cmp_int( B, 0 ) == 0 )
  1066. return( MBEDTLS_ERR_MPI_DIVISION_BY_ZERO );
  1067. mbedtls_mpi_init( &X ); mbedtls_mpi_init( &Y ); mbedtls_mpi_init( &Z );
  1068. mbedtls_mpi_init( &T1 ); mbedtls_mpi_init( &T2 );
  1069. if( mbedtls_mpi_cmp_abs( A, B ) < 0 )
  1070. {
  1071. if( Q != NULL ) MBEDTLS_MPI_CHK( mbedtls_mpi_lset( Q, 0 ) );
  1072. if( R != NULL ) MBEDTLS_MPI_CHK( mbedtls_mpi_copy( R, A ) );
  1073. return( 0 );
  1074. }
  1075. MBEDTLS_MPI_CHK( mbedtls_mpi_copy( &X, A ) );
  1076. MBEDTLS_MPI_CHK( mbedtls_mpi_copy( &Y, B ) );
  1077. X.s = Y.s = 1;
  1078. MBEDTLS_MPI_CHK( mbedtls_mpi_grow( &Z, A->n + 2 ) );
  1079. MBEDTLS_MPI_CHK( mbedtls_mpi_lset( &Z, 0 ) );
  1080. MBEDTLS_MPI_CHK( mbedtls_mpi_grow( &T1, 2 ) );
  1081. MBEDTLS_MPI_CHK( mbedtls_mpi_grow( &T2, 3 ) );
  1082. k = mbedtls_mpi_bitlen( &Y ) % biL;
  1083. if( k < biL - 1 )
  1084. {
  1085. k = biL - 1 - k;
  1086. MBEDTLS_MPI_CHK( mbedtls_mpi_shift_l( &X, k ) );
  1087. MBEDTLS_MPI_CHK( mbedtls_mpi_shift_l( &Y, k ) );
  1088. }
  1089. else k = 0;
  1090. n = X.n - 1;
  1091. t = Y.n - 1;
  1092. MBEDTLS_MPI_CHK( mbedtls_mpi_shift_l( &Y, biL * ( n - t ) ) );
  1093. while( mbedtls_mpi_cmp_mpi( &X, &Y ) >= 0 )
  1094. {
  1095. Z.p[n - t]++;
  1096. MBEDTLS_MPI_CHK( mbedtls_mpi_sub_mpi( &X, &X, &Y ) );
  1097. }
  1098. MBEDTLS_MPI_CHK( mbedtls_mpi_shift_r( &Y, biL * ( n - t ) ) );
  1099. for( i = n; i > t ; i-- )
  1100. {
  1101. if( X.p[i] >= Y.p[t] )
  1102. Z.p[i - t - 1] = ~0;
  1103. else
  1104. {
  1105. Z.p[i - t - 1] = mbedtls_int_div_int( X.p[i], X.p[i - 1],
  1106. Y.p[t], NULL);
  1107. }
  1108. Z.p[i - t - 1]++;
  1109. do
  1110. {
  1111. Z.p[i - t - 1]--;
  1112. MBEDTLS_MPI_CHK( mbedtls_mpi_lset( &T1, 0 ) );
  1113. T1.p[0] = ( t < 1 ) ? 0 : Y.p[t - 1];
  1114. T1.p[1] = Y.p[t];
  1115. MBEDTLS_MPI_CHK( mbedtls_mpi_mul_int( &T1, &T1, Z.p[i - t - 1] ) );
  1116. MBEDTLS_MPI_CHK( mbedtls_mpi_lset( &T2, 0 ) );
  1117. T2.p[0] = ( i < 2 ) ? 0 : X.p[i - 2];
  1118. T2.p[1] = ( i < 1 ) ? 0 : X.p[i - 1];
  1119. T2.p[2] = X.p[i];
  1120. }
  1121. while( mbedtls_mpi_cmp_mpi( &T1, &T2 ) > 0 );
  1122. MBEDTLS_MPI_CHK( mbedtls_mpi_mul_int( &T1, &Y, Z.p[i - t - 1] ) );
  1123. MBEDTLS_MPI_CHK( mbedtls_mpi_shift_l( &T1, biL * ( i - t - 1 ) ) );
  1124. MBEDTLS_MPI_CHK( mbedtls_mpi_sub_mpi( &X, &X, &T1 ) );
  1125. if( mbedtls_mpi_cmp_int( &X, 0 ) < 0 )
  1126. {
  1127. MBEDTLS_MPI_CHK( mbedtls_mpi_copy( &T1, &Y ) );
  1128. MBEDTLS_MPI_CHK( mbedtls_mpi_shift_l( &T1, biL * ( i - t - 1 ) ) );
  1129. MBEDTLS_MPI_CHK( mbedtls_mpi_add_mpi( &X, &X, &T1 ) );
  1130. Z.p[i - t - 1]--;
  1131. }
  1132. }
  1133. if( Q != NULL )
  1134. {
  1135. MBEDTLS_MPI_CHK( mbedtls_mpi_copy( Q, &Z ) );
  1136. Q->s = A->s * B->s;
  1137. }
  1138. if( R != NULL )
  1139. {
  1140. MBEDTLS_MPI_CHK( mbedtls_mpi_shift_r( &X, k ) );
  1141. X.s = A->s;
  1142. MBEDTLS_MPI_CHK( mbedtls_mpi_copy( R, &X ) );
  1143. if( mbedtls_mpi_cmp_int( R, 0 ) == 0 )
  1144. R->s = 1;
  1145. }
  1146. cleanup:
  1147. mbedtls_mpi_free( &X ); mbedtls_mpi_free( &Y ); mbedtls_mpi_free( &Z );
  1148. mbedtls_mpi_free( &T1 ); mbedtls_mpi_free( &T2 );
  1149. return( ret );
  1150. }
  1151. /*
  1152. * Division by int: A = Q * b + R
  1153. */
  1154. int mbedtls_mpi_div_int( mbedtls_mpi *Q, mbedtls_mpi *R, const mbedtls_mpi *A, mbedtls_mpi_sint b )
  1155. {
  1156. mbedtls_mpi _B;
  1157. mbedtls_mpi_uint p[1];
  1158. p[0] = ( b < 0 ) ? -b : b;
  1159. _B.s = ( b < 0 ) ? -1 : 1;
  1160. _B.n = 1;
  1161. _B.p = p;
  1162. return( mbedtls_mpi_div_mpi( Q, R, A, &_B ) );
  1163. }
  1164. /*
  1165. * Modulo: R = A mod B
  1166. */
  1167. int mbedtls_mpi_mod_mpi( mbedtls_mpi *R, const mbedtls_mpi *A, const mbedtls_mpi *B )
  1168. {
  1169. int ret;
  1170. if( mbedtls_mpi_cmp_int( B, 0 ) < 0 )
  1171. return( MBEDTLS_ERR_MPI_NEGATIVE_VALUE );
  1172. MBEDTLS_MPI_CHK( mbedtls_mpi_div_mpi( NULL, R, A, B ) );
  1173. while( mbedtls_mpi_cmp_int( R, 0 ) < 0 )
  1174. MBEDTLS_MPI_CHK( mbedtls_mpi_add_mpi( R, R, B ) );
  1175. while( mbedtls_mpi_cmp_mpi( R, B ) >= 0 )
  1176. MBEDTLS_MPI_CHK( mbedtls_mpi_sub_mpi( R, R, B ) );
  1177. cleanup:
  1178. return( ret );
  1179. }
  1180. /*
  1181. * Modulo: r = A mod b
  1182. */
  1183. int mbedtls_mpi_mod_int( mbedtls_mpi_uint *r, const mbedtls_mpi *A, mbedtls_mpi_sint b )
  1184. {
  1185. size_t i;
  1186. mbedtls_mpi_uint x, y, z;
  1187. if( b == 0 )
  1188. return( MBEDTLS_ERR_MPI_DIVISION_BY_ZERO );
  1189. if( b < 0 )
  1190. return( MBEDTLS_ERR_MPI_NEGATIVE_VALUE );
  1191. /*
  1192. * handle trivial cases
  1193. */
  1194. if( b == 1 )
  1195. {
  1196. *r = 0;
  1197. return( 0 );
  1198. }
  1199. if( b == 2 )
  1200. {
  1201. *r = A->p[0] & 1;
  1202. return( 0 );
  1203. }
  1204. /*
  1205. * general case
  1206. */
  1207. for( i = A->n, y = 0; i > 0; i-- )
  1208. {
  1209. x = A->p[i - 1];
  1210. y = ( y << biH ) | ( x >> biH );
  1211. z = y / b;
  1212. y -= z * b;
  1213. x <<= biH;
  1214. y = ( y << biH ) | ( x >> biH );
  1215. z = y / b;
  1216. y -= z * b;
  1217. }
  1218. /*
  1219. * If A is negative, then the current y represents a negative value.
  1220. * Flipping it to the positive side.
  1221. */
  1222. if( A->s < 0 && y != 0 )
  1223. y = b - y;
  1224. *r = y;
  1225. return( 0 );
  1226. }
  1227. /*
  1228. * Fast Montgomery initialization (thanks to Tom St Denis)
  1229. */
  1230. static void mpi_montg_init( mbedtls_mpi_uint *mm, const mbedtls_mpi *N )
  1231. {
  1232. mbedtls_mpi_uint x, m0 = N->p[0];
  1233. unsigned int i;
  1234. x = m0;
  1235. x += ( ( m0 + 2 ) & 4 ) << 1;
  1236. for( i = biL; i >= 8; i /= 2 )
  1237. x *= ( 2 - ( m0 * x ) );
  1238. *mm = ~x + 1;
  1239. }
  1240. /*
  1241. * Montgomery multiplication: A = A * B * R^-1 mod N (HAC 14.36)
  1242. */
  1243. static int mpi_montmul( mbedtls_mpi *A, const mbedtls_mpi *B, const mbedtls_mpi *N, mbedtls_mpi_uint mm,
  1244. const mbedtls_mpi *T )
  1245. {
  1246. size_t i, n, m;
  1247. mbedtls_mpi_uint u0, u1, *d;
  1248. if( T->n < N->n + 1 || T->p == NULL )
  1249. return( MBEDTLS_ERR_MPI_BAD_INPUT_DATA );
  1250. memset( T->p, 0, T->n * ciL );
  1251. d = T->p;
  1252. n = N->n;
  1253. m = ( B->n < n ) ? B->n : n;
  1254. for( i = 0; i < n; i++ )
  1255. {
  1256. /*
  1257. * T = (T + u0*B + u1*N) / 2^biL
  1258. */
  1259. u0 = A->p[i];
  1260. u1 = ( d[0] + u0 * B->p[0] ) * mm;
  1261. mpi_mul_hlp( m, B->p, d, u0 );
  1262. mpi_mul_hlp( n, N->p, d, u1 );
  1263. *d++ = u0; d[n + 1] = 0;
  1264. }
  1265. memcpy( A->p, d, ( n + 1 ) * ciL );
  1266. if( mbedtls_mpi_cmp_abs( A, N ) >= 0 )
  1267. mpi_sub_hlp( n, N->p, A->p );
  1268. else
  1269. /* prevent timing attacks */
  1270. mpi_sub_hlp( n, A->p, T->p );
  1271. return( 0 );
  1272. }
  1273. /*
  1274. * Montgomery reduction: A = A * R^-1 mod N
  1275. */
  1276. static int mpi_montred( mbedtls_mpi *A, const mbedtls_mpi *N, mbedtls_mpi_uint mm, const mbedtls_mpi *T )
  1277. {
  1278. mbedtls_mpi_uint z = 1;
  1279. mbedtls_mpi U;
  1280. U.n = U.s = (int) z;
  1281. U.p = &z;
  1282. return( mpi_montmul( A, &U, N, mm, T ) );
  1283. }
  1284. /*
  1285. * Sliding-window exponentiation: X = A^E mod N (HAC 14.85)
  1286. */
  1287. int mbedtls_mpi_exp_mod( mbedtls_mpi *X, const mbedtls_mpi *A, const mbedtls_mpi *E, const mbedtls_mpi *N, mbedtls_mpi *_RR )
  1288. {
  1289. int ret;
  1290. size_t wbits, wsize, one = 1;
  1291. size_t i, j, nblimbs;
  1292. size_t bufsize, nbits;
  1293. mbedtls_mpi_uint ei, mm, state;
  1294. mbedtls_mpi RR, T, W[ 2 << MBEDTLS_MPI_WINDOW_SIZE ], Apos;
  1295. int neg;
  1296. if( mbedtls_mpi_cmp_int( N, 0 ) < 0 || ( N->p[0] & 1 ) == 0 )
  1297. return( MBEDTLS_ERR_MPI_BAD_INPUT_DATA );
  1298. if( mbedtls_mpi_cmp_int( E, 0 ) < 0 )
  1299. return( MBEDTLS_ERR_MPI_BAD_INPUT_DATA );
  1300. /*
  1301. * Init temps and window size
  1302. */
  1303. mpi_montg_init( &mm, N );
  1304. mbedtls_mpi_init( &RR ); mbedtls_mpi_init( &T );
  1305. mbedtls_mpi_init( &Apos );
  1306. memset( W, 0, sizeof( W ) );
  1307. i = mbedtls_mpi_bitlen( E );
  1308. wsize = ( i > 671 ) ? 6 : ( i > 239 ) ? 5 :
  1309. ( i > 79 ) ? 4 : ( i > 23 ) ? 3 : 1;
  1310. if( wsize > MBEDTLS_MPI_WINDOW_SIZE )
  1311. wsize = MBEDTLS_MPI_WINDOW_SIZE;
  1312. j = N->n + 1;
  1313. MBEDTLS_MPI_CHK( mbedtls_mpi_grow( X, j ) );
  1314. MBEDTLS_MPI_CHK( mbedtls_mpi_grow( &W[1], j ) );
  1315. MBEDTLS_MPI_CHK( mbedtls_mpi_grow( &T, j * 2 ) );
  1316. /*
  1317. * Compensate for negative A (and correct at the end)
  1318. */
  1319. neg = ( A->s == -1 );
  1320. if( neg )
  1321. {
  1322. MBEDTLS_MPI_CHK( mbedtls_mpi_copy( &Apos, A ) );
  1323. Apos.s = 1;
  1324. A = &Apos;
  1325. }
  1326. /*
  1327. * If 1st call, pre-compute R^2 mod N
  1328. */
  1329. if( _RR == NULL || _RR->p == NULL )
  1330. {
  1331. MBEDTLS_MPI_CHK( mbedtls_mpi_lset( &RR, 1 ) );
  1332. MBEDTLS_MPI_CHK( mbedtls_mpi_shift_l( &RR, N->n * 2 * biL ) );
  1333. MBEDTLS_MPI_CHK( mbedtls_mpi_mod_mpi( &RR, &RR, N ) );
  1334. if( _RR != NULL )
  1335. memcpy( _RR, &RR, sizeof( mbedtls_mpi ) );
  1336. }
  1337. else
  1338. memcpy( &RR, _RR, sizeof( mbedtls_mpi ) );
  1339. /*
  1340. * W[1] = A * R^2 * R^-1 mod N = A * R mod N
  1341. */
  1342. if( mbedtls_mpi_cmp_mpi( A, N ) >= 0 )
  1343. MBEDTLS_MPI_CHK( mbedtls_mpi_mod_mpi( &W[1], A, N ) );
  1344. else
  1345. MBEDTLS_MPI_CHK( mbedtls_mpi_copy( &W[1], A ) );
  1346. MBEDTLS_MPI_CHK( mpi_montmul( &W[1], &RR, N, mm, &T ) );
  1347. /*
  1348. * X = R^2 * R^-1 mod N = R mod N
  1349. */
  1350. MBEDTLS_MPI_CHK( mbedtls_mpi_copy( X, &RR ) );
  1351. MBEDTLS_MPI_CHK( mpi_montred( X, N, mm, &T ) );
  1352. if( wsize > 1 )
  1353. {
  1354. /*
  1355. * W[1 << (wsize - 1)] = W[1] ^ (wsize - 1)
  1356. */
  1357. j = one << ( wsize - 1 );
  1358. MBEDTLS_MPI_CHK( mbedtls_mpi_grow( &W[j], N->n + 1 ) );
  1359. MBEDTLS_MPI_CHK( mbedtls_mpi_copy( &W[j], &W[1] ) );
  1360. for( i = 0; i < wsize - 1; i++ )
  1361. MBEDTLS_MPI_CHK( mpi_montmul( &W[j], &W[j], N, mm, &T ) );
  1362. /*
  1363. * W[i] = W[i - 1] * W[1]
  1364. */
  1365. for( i = j + 1; i < ( one << wsize ); i++ )
  1366. {
  1367. MBEDTLS_MPI_CHK( mbedtls_mpi_grow( &W[i], N->n + 1 ) );
  1368. MBEDTLS_MPI_CHK( mbedtls_mpi_copy( &W[i], &W[i - 1] ) );
  1369. MBEDTLS_MPI_CHK( mpi_montmul( &W[i], &W[1], N, mm, &T ) );
  1370. }
  1371. }
  1372. nblimbs = E->n;
  1373. bufsize = 0;
  1374. nbits = 0;
  1375. wbits = 0;
  1376. state = 0;
  1377. while( 1 )
  1378. {
  1379. if( bufsize == 0 )
  1380. {
  1381. if( nblimbs == 0 )
  1382. break;
  1383. nblimbs--;
  1384. bufsize = sizeof( mbedtls_mpi_uint ) << 3;
  1385. }
  1386. bufsize--;
  1387. ei = (E->p[nblimbs] >> bufsize) & 1;
  1388. /*
  1389. * skip leading 0s
  1390. */
  1391. if( ei == 0 && state == 0 )
  1392. continue;
  1393. if( ei == 0 && state == 1 )
  1394. {
  1395. /*
  1396. * out of window, square X
  1397. */
  1398. MBEDTLS_MPI_CHK( mpi_montmul( X, X, N, mm, &T ) );
  1399. continue;
  1400. }
  1401. /*
  1402. * add ei to current window
  1403. */
  1404. state = 2;
  1405. nbits++;
  1406. wbits |= ( ei << ( wsize - nbits ) );
  1407. if( nbits == wsize )
  1408. {
  1409. /*
  1410. * X = X^wsize R^-1 mod N
  1411. */
  1412. for( i = 0; i < wsize; i++ )
  1413. MBEDTLS_MPI_CHK( mpi_montmul( X, X, N, mm, &T ) );
  1414. /*
  1415. * X = X * W[wbits] R^-1 mod N
  1416. */
  1417. MBEDTLS_MPI_CHK( mpi_montmul( X, &W[wbits], N, mm, &T ) );
  1418. state--;
  1419. nbits = 0;
  1420. wbits = 0;
  1421. }
  1422. }
  1423. /*
  1424. * process the remaining bits
  1425. */
  1426. for( i = 0; i < nbits; i++ )
  1427. {
  1428. MBEDTLS_MPI_CHK( mpi_montmul( X, X, N, mm, &T ) );
  1429. wbits <<= 1;
  1430. if( ( wbits & ( one << wsize ) ) != 0 )
  1431. MBEDTLS_MPI_CHK( mpi_montmul( X, &W[1], N, mm, &T ) );
  1432. }
  1433. /*
  1434. * X = A^E * R * R^-1 mod N = A^E mod N
  1435. */
  1436. MBEDTLS_MPI_CHK( mpi_montred( X, N, mm, &T ) );
  1437. if( neg && E->n != 0 && ( E->p[0] & 1 ) != 0 )
  1438. {
  1439. X->s = -1;
  1440. MBEDTLS_MPI_CHK( mbedtls_mpi_add_mpi( X, N, X ) );
  1441. }
  1442. cleanup:
  1443. for( i = ( one << ( wsize - 1 ) ); i < ( one << wsize ); i++ )
  1444. mbedtls_mpi_free( &W[i] );
  1445. mbedtls_mpi_free( &W[1] ); mbedtls_mpi_free( &T ); mbedtls_mpi_free( &Apos );
  1446. if( _RR == NULL || _RR->p == NULL )
  1447. mbedtls_mpi_free( &RR );
  1448. return( ret );
  1449. }
  1450. /*
  1451. * Greatest common divisor: G = gcd(A, B) (HAC 14.54)
  1452. */
  1453. int mbedtls_mpi_gcd( mbedtls_mpi *G, const mbedtls_mpi *A, const mbedtls_mpi *B )
  1454. {
  1455. int ret;
  1456. size_t lz, lzt;
  1457. mbedtls_mpi TG, TA, TB;
  1458. mbedtls_mpi_init( &TG ); mbedtls_mpi_init( &TA ); mbedtls_mpi_init( &TB );
  1459. MBEDTLS_MPI_CHK( mbedtls_mpi_copy( &TA, A ) );
  1460. MBEDTLS_MPI_CHK( mbedtls_mpi_copy( &TB, B ) );
  1461. lz = mbedtls_mpi_lsb( &TA );
  1462. lzt = mbedtls_mpi_lsb( &TB );
  1463. if( lzt < lz )
  1464. lz = lzt;
  1465. MBEDTLS_MPI_CHK( mbedtls_mpi_shift_r( &TA, lz ) );
  1466. MBEDTLS_MPI_CHK( mbedtls_mpi_shift_r( &TB, lz ) );
  1467. TA.s = TB.s = 1;
  1468. while( mbedtls_mpi_cmp_int( &TA, 0 ) != 0 )
  1469. {
  1470. MBEDTLS_MPI_CHK( mbedtls_mpi_shift_r( &TA, mbedtls_mpi_lsb( &TA ) ) );
  1471. MBEDTLS_MPI_CHK( mbedtls_mpi_shift_r( &TB, mbedtls_mpi_lsb( &TB ) ) );
  1472. if( mbedtls_mpi_cmp_mpi( &TA, &TB ) >= 0 )
  1473. {
  1474. MBEDTLS_MPI_CHK( mbedtls_mpi_sub_abs( &TA, &TA, &TB ) );
  1475. MBEDTLS_MPI_CHK( mbedtls_mpi_shift_r( &TA, 1 ) );
  1476. }
  1477. else
  1478. {
  1479. MBEDTLS_MPI_CHK( mbedtls_mpi_sub_abs( &TB, &TB, &TA ) );
  1480. MBEDTLS_MPI_CHK( mbedtls_mpi_shift_r( &TB, 1 ) );
  1481. }
  1482. }
  1483. MBEDTLS_MPI_CHK( mbedtls_mpi_shift_l( &TB, lz ) );
  1484. MBEDTLS_MPI_CHK( mbedtls_mpi_copy( G, &TB ) );
  1485. cleanup:
  1486. mbedtls_mpi_free( &TG ); mbedtls_mpi_free( &TA ); mbedtls_mpi_free( &TB );
  1487. return( ret );
  1488. }
  1489. /*
  1490. * Fill X with size bytes of random.
  1491. *
  1492. * Use a temporary bytes representation to make sure the result is the same
  1493. * regardless of the platform endianness (useful when f_rng is actually
  1494. * deterministic, eg for tests).
  1495. */
  1496. int mbedtls_mpi_fill_random( mbedtls_mpi *X, size_t size,
  1497. int (*f_rng)(void *, unsigned char *, size_t),
  1498. void *p_rng )
  1499. {
  1500. int ret;
  1501. unsigned char buf[MBEDTLS_MPI_MAX_SIZE];
  1502. if( size > MBEDTLS_MPI_MAX_SIZE )
  1503. return( MBEDTLS_ERR_MPI_BAD_INPUT_DATA );
  1504. MBEDTLS_MPI_CHK( f_rng( p_rng, buf, size ) );
  1505. MBEDTLS_MPI_CHK( mbedtls_mpi_read_binary( X, buf, size ) );
  1506. cleanup:
  1507. mbedtls_zeroize( buf, sizeof( buf ) );
  1508. return( ret );
  1509. }
  1510. /*
  1511. * Modular inverse: X = A^-1 mod N (HAC 14.61 / 14.64)
  1512. */
  1513. int mbedtls_mpi_inv_mod( mbedtls_mpi *X, const mbedtls_mpi *A, const mbedtls_mpi *N )
  1514. {
  1515. int ret;
  1516. mbedtls_mpi G, TA, TU, U1, U2, TB, TV, V1, V2;
  1517. if( mbedtls_mpi_cmp_int( N, 1 ) <= 0 )
  1518. return( MBEDTLS_ERR_MPI_BAD_INPUT_DATA );
  1519. mbedtls_mpi_init( &TA ); mbedtls_mpi_init( &TU ); mbedtls_mpi_init( &U1 ); mbedtls_mpi_init( &U2 );
  1520. mbedtls_mpi_init( &G ); mbedtls_mpi_init( &TB ); mbedtls_mpi_init( &TV );
  1521. mbedtls_mpi_init( &V1 ); mbedtls_mpi_init( &V2 );
  1522. MBEDTLS_MPI_CHK( mbedtls_mpi_gcd( &G, A, N ) );
  1523. if( mbedtls_mpi_cmp_int( &G, 1 ) != 0 )
  1524. {
  1525. ret = MBEDTLS_ERR_MPI_NOT_ACCEPTABLE;
  1526. goto cleanup;
  1527. }
  1528. MBEDTLS_MPI_CHK( mbedtls_mpi_mod_mpi( &TA, A, N ) );
  1529. MBEDTLS_MPI_CHK( mbedtls_mpi_copy( &TU, &TA ) );
  1530. MBEDTLS_MPI_CHK( mbedtls_mpi_copy( &TB, N ) );
  1531. MBEDTLS_MPI_CHK( mbedtls_mpi_copy( &TV, N ) );
  1532. MBEDTLS_MPI_CHK( mbedtls_mpi_lset( &U1, 1 ) );
  1533. MBEDTLS_MPI_CHK( mbedtls_mpi_lset( &U2, 0 ) );
  1534. MBEDTLS_MPI_CHK( mbedtls_mpi_lset( &V1, 0 ) );
  1535. MBEDTLS_MPI_CHK( mbedtls_mpi_lset( &V2, 1 ) );
  1536. do
  1537. {
  1538. while( ( TU.p[0] & 1 ) == 0 )
  1539. {
  1540. MBEDTLS_MPI_CHK( mbedtls_mpi_shift_r( &TU, 1 ) );
  1541. if( ( U1.p[0] & 1 ) != 0 || ( U2.p[0] & 1 ) != 0 )
  1542. {
  1543. MBEDTLS_MPI_CHK( mbedtls_mpi_add_mpi( &U1, &U1, &TB ) );
  1544. MBEDTLS_MPI_CHK( mbedtls_mpi_sub_mpi( &U2, &U2, &TA ) );
  1545. }
  1546. MBEDTLS_MPI_CHK( mbedtls_mpi_shift_r( &U1, 1 ) );
  1547. MBEDTLS_MPI_CHK( mbedtls_mpi_shift_r( &U2, 1 ) );
  1548. }
  1549. while( ( TV.p[0] & 1 ) == 0 )
  1550. {
  1551. MBEDTLS_MPI_CHK( mbedtls_mpi_shift_r( &TV, 1 ) );
  1552. if( ( V1.p[0] & 1 ) != 0 || ( V2.p[0] & 1 ) != 0 )
  1553. {
  1554. MBEDTLS_MPI_CHK( mbedtls_mpi_add_mpi( &V1, &V1, &TB ) );
  1555. MBEDTLS_MPI_CHK( mbedtls_mpi_sub_mpi( &V2, &V2, &TA ) );
  1556. }
  1557. MBEDTLS_MPI_CHK( mbedtls_mpi_shift_r( &V1, 1 ) );
  1558. MBEDTLS_MPI_CHK( mbedtls_mpi_shift_r( &V2, 1 ) );
  1559. }
  1560. if( mbedtls_mpi_cmp_mpi( &TU, &TV ) >= 0 )
  1561. {
  1562. MBEDTLS_MPI_CHK( mbedtls_mpi_sub_mpi( &TU, &TU, &TV ) );
  1563. MBEDTLS_MPI_CHK( mbedtls_mpi_sub_mpi( &U1, &U1, &V1 ) );
  1564. MBEDTLS_MPI_CHK( mbedtls_mpi_sub_mpi( &U2, &U2, &V2 ) );
  1565. }
  1566. else
  1567. {
  1568. MBEDTLS_MPI_CHK( mbedtls_mpi_sub_mpi( &TV, &TV, &TU ) );
  1569. MBEDTLS_MPI_CHK( mbedtls_mpi_sub_mpi( &V1, &V1, &U1 ) );
  1570. MBEDTLS_MPI_CHK( mbedtls_mpi_sub_mpi( &V2, &V2, &U2 ) );
  1571. }
  1572. }
  1573. while( mbedtls_mpi_cmp_int( &TU, 0 ) != 0 );
  1574. while( mbedtls_mpi_cmp_int( &V1, 0 ) < 0 )
  1575. MBEDTLS_MPI_CHK( mbedtls_mpi_add_mpi( &V1, &V1, N ) );
  1576. while( mbedtls_mpi_cmp_mpi( &V1, N ) >= 0 )
  1577. MBEDTLS_MPI_CHK( mbedtls_mpi_sub_mpi( &V1, &V1, N ) );
  1578. MBEDTLS_MPI_CHK( mbedtls_mpi_copy( X, &V1 ) );
  1579. cleanup:
  1580. mbedtls_mpi_free( &TA ); mbedtls_mpi_free( &TU ); mbedtls_mpi_free( &U1 ); mbedtls_mpi_free( &U2 );
  1581. mbedtls_mpi_free( &G ); mbedtls_mpi_free( &TB ); mbedtls_mpi_free( &TV );
  1582. mbedtls_mpi_free( &V1 ); mbedtls_mpi_free( &V2 );
  1583. return( ret );
  1584. }
  1585. #if defined(MBEDTLS_GENPRIME)
  1586. static const int small_prime[] =
  1587. {
  1588. 3, 5, 7, 11, 13, 17, 19, 23,
  1589. 29, 31, 37, 41, 43, 47, 53, 59,
  1590. 61, 67, 71, 73, 79, 83, 89, 97,
  1591. 101, 103, 107, 109, 113, 127, 131, 137,
  1592. 139, 149, 151, 157, 163, 167, 173, 179,
  1593. 181, 191, 193, 197, 199, 211, 223, 227,
  1594. 229, 233, 239, 241, 251, 257, 263, 269,
  1595. 271, 277, 281, 283, 293, 307, 311, 313,
  1596. 317, 331, 337, 347, 349, 353, 359, 367,
  1597. 373, 379, 383, 389, 397, 401, 409, 419,
  1598. 421, 431, 433, 439, 443, 449, 457, 461,
  1599. 463, 467, 479, 487, 491, 499, 503, 509,
  1600. 521, 523, 541, 547, 557, 563, 569, 571,
  1601. 577, 587, 593, 599, 601, 607, 613, 617,
  1602. 619, 631, 641, 643, 647, 653, 659, 661,
  1603. 673, 677, 683, 691, 701, 709, 719, 727,
  1604. 733, 739, 743, 751, 757, 761, 769, 773,
  1605. 787, 797, 809, 811, 821, 823, 827, 829,
  1606. 839, 853, 857, 859, 863, 877, 881, 883,
  1607. 887, 907, 911, 919, 929, 937, 941, 947,
  1608. 953, 967, 971, 977, 983, 991, 997, -103
  1609. };
  1610. /*
  1611. * Small divisors test (X must be positive)
  1612. *
  1613. * Return values:
  1614. * 0: no small factor (possible prime, more tests needed)
  1615. * 1: certain prime
  1616. * MBEDTLS_ERR_MPI_NOT_ACCEPTABLE: certain non-prime
  1617. * other negative: error
  1618. */
  1619. static int mpi_check_small_factors( const mbedtls_mpi *X )
  1620. {
  1621. int ret = 0;
  1622. size_t i;
  1623. mbedtls_mpi_uint r;
  1624. if( ( X->p[0] & 1 ) == 0 )
  1625. return( MBEDTLS_ERR_MPI_NOT_ACCEPTABLE );
  1626. for( i = 0; small_prime[i] > 0; i++ )
  1627. {
  1628. if( mbedtls_mpi_cmp_int( X, small_prime[i] ) <= 0 )
  1629. return( 1 );
  1630. MBEDTLS_MPI_CHK( mbedtls_mpi_mod_int( &r, X, small_prime[i] ) );
  1631. if( r == 0 )
  1632. return( MBEDTLS_ERR_MPI_NOT_ACCEPTABLE );
  1633. }
  1634. cleanup:
  1635. return( ret );
  1636. }
  1637. /*
  1638. * Miller-Rabin pseudo-primality test (HAC 4.24)
  1639. */
  1640. static int mpi_miller_rabin( const mbedtls_mpi *X,
  1641. int (*f_rng)(void *, unsigned char *, size_t),
  1642. void *p_rng )
  1643. {
  1644. int ret, count;
  1645. size_t i, j, k, n, s;
  1646. mbedtls_mpi W, R, T, A, RR;
  1647. mbedtls_mpi_init( &W ); mbedtls_mpi_init( &R ); mbedtls_mpi_init( &T ); mbedtls_mpi_init( &A );
  1648. mbedtls_mpi_init( &RR );
  1649. /*
  1650. * W = |X| - 1
  1651. * R = W >> lsb( W )
  1652. */
  1653. MBEDTLS_MPI_CHK( mbedtls_mpi_sub_int( &W, X, 1 ) );
  1654. s = mbedtls_mpi_lsb( &W );
  1655. MBEDTLS_MPI_CHK( mbedtls_mpi_copy( &R, &W ) );
  1656. MBEDTLS_MPI_CHK( mbedtls_mpi_shift_r( &R, s ) );
  1657. i = mbedtls_mpi_bitlen( X );
  1658. /*
  1659. * HAC, table 4.4
  1660. */
  1661. n = ( ( i >= 1300 ) ? 2 : ( i >= 850 ) ? 3 :
  1662. ( i >= 650 ) ? 4 : ( i >= 350 ) ? 8 :
  1663. ( i >= 250 ) ? 12 : ( i >= 150 ) ? 18 : 27 );
  1664. for( i = 0; i < n; i++ )
  1665. {
  1666. /*
  1667. * pick a random A, 1 < A < |X| - 1
  1668. */
  1669. MBEDTLS_MPI_CHK( mbedtls_mpi_fill_random( &A, X->n * ciL, f_rng, p_rng ) );
  1670. if( mbedtls_mpi_cmp_mpi( &A, &W ) >= 0 )
  1671. {
  1672. j = mbedtls_mpi_bitlen( &A ) - mbedtls_mpi_bitlen( &W );
  1673. MBEDTLS_MPI_CHK( mbedtls_mpi_shift_r( &A, j + 1 ) );
  1674. }
  1675. A.p[0] |= 3;
  1676. count = 0;
  1677. do {
  1678. MBEDTLS_MPI_CHK( mbedtls_mpi_fill_random( &A, X->n * ciL, f_rng, p_rng ) );
  1679. j = mbedtls_mpi_bitlen( &A );
  1680. k = mbedtls_mpi_bitlen( &W );
  1681. if (j > k) {
  1682. MBEDTLS_MPI_CHK( mbedtls_mpi_shift_r( &A, j - k ) );
  1683. }
  1684. if (count++ > 30) {
  1685. return MBEDTLS_ERR_MPI_NOT_ACCEPTABLE;
  1686. }
  1687. } while ( mbedtls_mpi_cmp_mpi( &A, &W ) >= 0 ||
  1688. mbedtls_mpi_cmp_int( &A, 1 ) <= 0 );
  1689. /*
  1690. * A = A^R mod |X|
  1691. */
  1692. MBEDTLS_MPI_CHK( mbedtls_mpi_exp_mod( &A, &A, &R, X, &RR ) );
  1693. if( mbedtls_mpi_cmp_mpi( &A, &W ) == 0 ||
  1694. mbedtls_mpi_cmp_int( &A, 1 ) == 0 )
  1695. continue;
  1696. j = 1;
  1697. while( j < s && mbedtls_mpi_cmp_mpi( &A, &W ) != 0 )
  1698. {
  1699. /*
  1700. * A = A * A mod |X|
  1701. */
  1702. MBEDTLS_MPI_CHK( mbedtls_mpi_mul_mpi( &T, &A, &A ) );
  1703. MBEDTLS_MPI_CHK( mbedtls_mpi_mod_mpi( &A, &T, X ) );
  1704. if

Large files files are truncated, but you can click here to view the full file