35 #if defined(POLARSSL_BIGNUM_C)
40 #if defined(POLARSSL_MEMORY_C)
43 #define polarssl_malloc malloc
44 #define polarssl_free free
49 #define ciL (sizeof(t_uint))
50 #define biL (ciL << 3)
51 #define biH (ciL << 2)
56 #define BITS_TO_LIMBS(i) (((i) + biL - 1) / biL)
57 #define CHARS_TO_LIMBS(i) (((i) + ciL - 1) / ciL)
82 memset( X->
p, 0, X->
n * ciL );
106 memset( p, 0, nblimbs * ciL );
110 memcpy( p, X->
p, X->
n * ciL );
111 memset( X->
p, 0, X->
n * ciL );
132 if( X->
n <= nblimbs )
135 for( i = X->
n - 1; i > 0; i-- )
146 memset( p, 0, i * ciL );
150 memcpy( p, X->
p, i * ciL );
151 memset( X->
p, 0, X->
n * ciL );
178 for( i = Y->
n - 1; i > 0; i-- )
187 memset( X->
p, 0, X->
n * ciL );
188 memcpy( X->
p, Y->
p, i * ciL );
202 memcpy( &T, X,
sizeof(
mpi ) );
203 memcpy( X, Y,
sizeof(
mpi ) );
204 memcpy( Y, &T,
sizeof(
mpi ) );
218 assign = ( assign != 0 );
222 X->
s = X->
s * (1 - assign) + Y->
s * assign;
224 for( i = 0; i < Y->n; i++ )
225 X->
p[i] = X->
p[i] * (1 - assign) + Y->
p[i] * assign;
227 for( ; i < X->n; i++ )
228 X->
p[i] *= (1 - assign);
250 swap = ( swap != 0 );
256 X->
s = X->
s * (1 - swap) + Y->
s * swap;
257 Y->
s = Y->
s * (1 - swap) + s * swap;
260 for( i = 0; i < X->
n; i++ )
263 X->
p[i] = X->
p[i] * (1 - swap) + Y->
p[i] * swap;
264 Y->
p[i] = Y->
p[i] * (1 - swap) + tmp * swap;
279 memset( X->
p, 0, X->
n * ciL );
281 X->
p[0] = ( z < 0 ) ? -z : z;
282 X->
s = ( z < 0 ) ? -1 : 1;
294 if( X->
n * biL <= pos )
297 return ( X->
p[pos / biL] >> ( pos % biL ) ) & 0x01;
306 size_t off = pos / biL;
307 size_t idx = pos % biL;
309 if( val != 0 && val != 1 )
312 if( X->
n * biL <= pos )
320 X->
p[off] &= ~( (
t_uint) 0x01 << idx );
321 X->
p[off] |= (
t_uint) val << idx;
333 size_t i, j, count = 0;
335 for( i = 0; i < X->
n; i++ )
336 for( j = 0; j < biL; j++, count++ )
337 if( ( ( X->
p[i] >> j ) & 1 ) != 0 )
350 for( i = X->
n - 1; i > 0; i-- )
354 for( j = biL; j > 0; j-- )
355 if( ( ( X->
p[i] >> ( j - 1 ) ) & 1 ) != 0 )
358 return( ( i * biL ) + j );
366 return( (
mpi_msb( X ) + 7 ) >> 3 );
372 static int mpi_get_digit(
t_uint *d,
int radix,
char c )
376 if( c >= 0x30 && c <= 0x39 ) *d = c - 0x30;
377 if( c >= 0x41 && c <= 0x46 ) *d = c - 0x37;
378 if( c >= 0x61 && c <= 0x66 ) *d = c - 0x57;
380 if( *d >= (
t_uint) radix )
392 size_t i, j, slen, n;
396 if( radix < 2 || radix > 16 )
405 n = BITS_TO_LIMBS( slen << 2 );
410 for( i = slen, j = 0; i > 0; i--, j++ )
412 if( i == 1 && s[i - 1] ==
'-' )
418 MPI_CHK( mpi_get_digit( &d, radix, s[i - 1] ) );
419 X->
p[j / (2 * ciL)] |= d << ( (j % (2 * ciL)) << 2 );
426 for( i = 0; i < slen; i++ )
428 if( i == 0 && s[i] ==
'-' )
434 MPI_CHK( mpi_get_digit( &d, radix, s[i] ) );
458 static int mpi_write_hlp(
mpi *X,
int radix,
char **p )
463 if( radix < 2 || radix > 16 )
470 MPI_CHK( mpi_write_hlp( X, radix, p ) );
473 *(*p)++ = (char)( r + 0x30 );
475 *(*p)++ = (char)( r + 0x37 );
492 if( radix < 2 || radix > 16 )
496 if( radix >= 4 ) n >>= 1;
497 if( radix >= 16 ) n >>= 1;
517 for( i = X->
n, k = 0; i > 0; i-- )
519 for( j = ciL; j > 0; j-- )
521 c = ( X->
p[i - 1] >> ( ( j - 1 ) << 3) ) & 0xFF;
523 if( c == 0 && k == 0 && ( i + j + 3 ) != 0 )
526 *(p++) =
"0123456789ABCDEF" [c / 16];
527 *(p++) =
"0123456789ABCDEF" [c % 16];
539 MPI_CHK( mpi_write_hlp( &T, radix, &p ) );
552 #if defined(POLARSSL_FS_IO)
567 memset( s, 0,
sizeof( s ) );
568 if( fgets( s,
sizeof( s ) - 1, fin ) == NULL )
572 if( slen ==
sizeof( s ) - 2 )
575 if( s[slen - 1] ==
'\n' ) { slen--; s[slen] =
'\0'; }
576 if( s[slen - 1] ==
'\r' ) { slen--; s[slen] =
'\0'; }
580 if( mpi_get_digit( &d, radix, *p ) != 0 )
592 size_t n, slen, plen;
605 if( p == NULL ) p =
"";
614 if( fwrite( p, 1, plen, fout ) != plen ||
615 fwrite( s, 1, slen, fout ) != slen )
619 printf(
"%s%s", p, s );
635 for( n = 0; n < buflen; n++ )
642 for( i = buflen, j = 0; i > n; i--, j++ )
643 X->
p[j / ciL] |= ((
t_uint) buf[i - 1]) << ((j % ciL) << 3);
662 memset( buf, 0, buflen );
664 for( i = buflen - 1, j = 0; n > 0; i--, j++, n-- )
665 buf[i] = (
unsigned char)( X->
p[j / ciL] >> ((j % ciL) << 3) );
680 t1 = count & (biL - 1);
694 for( i = X->
n; i > v0; i-- )
695 X->
p[i - 1] = X->
p[i - v0 - 1];
706 for( i = v0; i < X->
n; i++ )
708 r1 = X->
p[i] >> (biL - t1);
729 v1 = count & (biL - 1);
731 if( v0 > X->
n || ( v0 == X->
n && v1 > 0 ) )
739 for( i = 0; i < X->
n - v0; i++ )
740 X->
p[i] = X->
p[i + v0];
742 for( ; i < X->n; i++ )
751 for( i = X->
n; i > 0; i-- )
753 r1 = X->
p[i - 1] << (biL - v1);
770 for( i = X->
n; i > 0; i-- )
771 if( X->
p[i - 1] != 0 )
774 for( j = Y->
n; j > 0; j-- )
775 if( Y->
p[j - 1] != 0 )
778 if( i == 0 && j == 0 )
781 if( i > j )
return( 1 );
782 if( j > i )
return( -1 );
786 if( X->
p[i - 1] > Y->
p[i - 1] )
return( 1 );
787 if( X->
p[i - 1] < Y->
p[i - 1] )
return( -1 );
800 for( i = X->
n; i > 0; i-- )
801 if( X->
p[i - 1] != 0 )
804 for( j = Y->
n; j > 0; j-- )
805 if( Y->
p[j - 1] != 0 )
808 if( i == 0 && j == 0 )
811 if( i > j )
return( X->
s );
812 if( j > i )
return( -Y->
s );
814 if( X->
s > 0 && Y->
s < 0 )
return( 1 );
815 if( Y->
s > 0 && X->
s < 0 )
return( -1 );
819 if( X->
p[i - 1] > Y->
p[i - 1] )
return( X->
s );
820 if( X->
p[i - 1] < Y->
p[i - 1] )
return( -X->
s );
834 *p = ( z < 0 ) ? -z : z;
835 Y.
s = ( z < 0 ) ? -1 : 1;
853 const mpi *T = A; A = X; B = T;
864 for( j = B->
n; j > 0; j-- )
865 if( B->
p[j - 1] != 0 )
870 o = B->
p; p = X->
p; c = 0;
872 for( i = 0; i < j; i++, o++, p++ )
874 *p += c; c = ( *p < c );
875 *p += *o; c += ( *p < *o );
886 *p += c; c = ( *p < c ); i++; p++;
897 static void mpi_sub_hlp(
size_t n,
t_uint *s,
t_uint *d )
902 for( i = c = 0; i < n; i++, s++, d++ )
904 z = ( *d < c ); *d -= c;
905 c = ( *d < *s ) + z; *d -= *s;
910 z = ( *d < c ); *d -= c;
945 for( n = B->
n; n > 0; n-- )
946 if( B->
p[n - 1] != 0 )
949 mpi_sub_hlp( n, B->
p, X->
p );
965 if( A->
s * B->
s < 0 )
996 if( A->
s * B->
s > 0 )
1028 p[0] = ( b < 0 ) ? -b : b;
1029 _B.
s = ( b < 0 ) ? -1 : 1;
1044 p[0] = ( b < 0 ) ? -b : b;
1045 _B.
s = ( b < 0 ) ? -1 : 1;
1056 #if defined(__APPLE__) && defined(__arm__)
1061 __attribute__ ((noinline))
1067 #if defined(MULADDC_HUIT)
1068 for( ; i >= 8; i -= 8 )
1082 for( ; i >= 16; i -= 16 )
1097 for( ; i >= 8; i -= 8 )
1119 *d += c; c = ( *d < c ); d++;
1138 for( i = A->
n; i > 0; i-- )
1139 if( A->
p[i - 1] != 0 )
1142 for( j = B->
n; j > 0; j-- )
1143 if( B->
p[j - 1] != 0 )
1149 for( i++; j > 0; j-- )
1150 mpi_mul_hlp( i - 1, A->
p, X->
p + j - 1, B->
p[j - 1] );
1184 mpi X, Y, Z, T1, T2;
1228 for( i = n; i > t ; i-- )
1230 if( X.
p[i] >= Y.
p[t] )
1231 Z.
p[i - t - 1] = ~0;
1234 #if defined(POLARSSL_HAVE_UDBL)
1240 if( r > ((
t_udbl) 1 << biL) - 1)
1241 r = ((
t_udbl) 1 << biL) - 1;
1252 d0 = ( d << biH ) >> biH;
1256 r1 = X.
p[i] - d1 * q1;
1258 r1 |= ( X.
p[i - 1] >> biH );
1264 while( r1 >= d && r1 < m )
1272 r0 |= ( X.
p[i - 1] << biH ) >> biH;
1278 while( r0 >= d && r0 < m )
1283 Z.
p[i - t - 1] = ( q1 << biH ) | q0;
1293 T1.
p[0] = (t < 1) ? 0 : Y.
p[t - 1];
1298 T2.
p[0] = (i < 2) ? 0 : X.
p[i - 2];
1299 T2.
p[1] = (i < 1) ? 0 : X.
p[i - 1];
1349 p[0] = ( b < 0 ) ? -b : b;
1350 _B.
s = ( b < 0 ) ? -1 : 1;
1412 for( i = A->
n, y = 0; i > 0; i-- )
1415 y = ( y << biH ) | ( x >> biH );
1420 y = ( y << biH ) | ( x >> biH );
1429 if( A->
s < 0 && y != 0 )
1440 static void mpi_montg_init(
t_uint *mm,
const mpi *N )
1445 x += ( ( m0 + 2 ) & 4 ) << 1;
1446 x *= ( 2 - ( m0 * x ) );
1448 if( biL >= 16 ) x *= ( 2 - ( m0 * x ) );
1449 if( biL >= 32 ) x *= ( 2 - ( m0 * x ) );
1450 if( biL >= 64 ) x *= ( 2 - ( m0 * x ) );
1458 static void mpi_montmul(
mpi *A,
const mpi *B,
const mpi *N,
t_uint mm,
const mpi *T )
1463 memset( T->
p, 0, T->
n * ciL );
1467 m = ( B->
n < n ) ? B->
n : n;
1469 for( i = 0; i < n; i++ )
1475 u1 = ( d[0] + u0 * B->
p[0] ) * mm;
1477 mpi_mul_hlp( m, B->
p, d, u0 );
1478 mpi_mul_hlp( n, N->
p, d, u1 );
1480 *d++ = u0; d[n + 1] = 0;
1483 memcpy( A->
p, d, (n + 1) * ciL );
1486 mpi_sub_hlp( n, N->
p, A->
p );
1489 mpi_sub_hlp( n, A->
p, T->
p );
1495 static void mpi_montred(
mpi *A,
const mpi *N,
t_uint mm,
const mpi *T )
1500 U.
n = U.
s = (int) z;
1503 mpi_montmul( A, &U, N, mm, T );
1512 size_t wbits, wsize, one = 1;
1513 size_t i, j, nblimbs;
1514 size_t bufsize, nbits;
1528 mpi_montg_init( &mm, N );
1530 memset( W, 0,
sizeof( W ) );
1534 wsize = ( i > 671 ) ? 6 : ( i > 239 ) ? 5 :
1535 ( i > 79 ) ? 4 : ( i > 23 ) ? 3 : 1;
1548 neg = ( A->
s == -1 );
1561 if( _RR == NULL || _RR->
p == NULL )
1568 memcpy( _RR, &RR,
sizeof(
mpi ) );
1571 memcpy( &RR, _RR,
sizeof(
mpi ) );
1580 mpi_montmul( &W[1], &RR, N, mm, &T );
1586 mpi_montred( X, N, mm, &T );
1593 j = one << (wsize - 1);
1598 for( i = 0; i < wsize - 1; i++ )
1599 mpi_montmul( &W[j], &W[j], N, mm, &T );
1604 for( i = j + 1; i < (one << wsize); i++ )
1609 mpi_montmul( &W[i], &W[1], N, mm, &T );
1628 bufsize =
sizeof(
t_uint ) << 3;
1633 ei = (E->
p[nblimbs] >> bufsize) & 1;
1638 if( ei == 0 && state == 0 )
1641 if( ei == 0 && state == 1 )
1646 mpi_montmul( X, X, N, mm, &T );
1656 wbits |= (ei << (wsize - nbits));
1658 if( nbits == wsize )
1663 for( i = 0; i < wsize; i++ )
1664 mpi_montmul( X, X, N, mm, &T );
1669 mpi_montmul( X, &W[wbits], N, mm, &T );
1680 for( i = 0; i < nbits; i++ )
1682 mpi_montmul( X, X, N, mm, &T );
1686 if( (wbits & (one << wsize)) != 0 )
1687 mpi_montmul( X, &W[1], N, mm, &T );
1693 mpi_montred( X, N, mm, &T );
1703 for( i = (one << (wsize - 1)); i < (one << wsize); i++ )
1767 int (*f_rng)(
void *,
unsigned char *,
size_t),
1775 MPI_CHK( f_rng( p_rng, (
unsigned char *) X->
p, size ) );
1787 mpi G, TA, TU, U1, U2, TB, TV, V1, V2;
1816 while( ( TU.
p[0] & 1 ) == 0 )
1820 if( ( U1.
p[0] & 1 ) != 0 || ( U2.
p[0] & 1 ) != 0 )
1830 while( ( TV.
p[0] & 1 ) == 0 )
1834 if( ( V1.
p[0] & 1 ) != 0 || ( V2.
p[0] & 1 ) != 0 )
1876 #if defined(POLARSSL_GENPRIME)
1878 static const int small_prime[] =
1880 3, 5, 7, 11, 13, 17, 19, 23,
1881 29, 31, 37, 41, 43, 47, 53, 59,
1882 61, 67, 71, 73, 79, 83, 89, 97,
1883 101, 103, 107, 109, 113, 127, 131, 137,
1884 139, 149, 151, 157, 163, 167, 173, 179,
1885 181, 191, 193, 197, 199, 211, 223, 227,
1886 229, 233, 239, 241, 251, 257, 263, 269,
1887 271, 277, 281, 283, 293, 307, 311, 313,
1888 317, 331, 337, 347, 349, 353, 359, 367,
1889 373, 379, 383, 389, 397, 401, 409, 419,
1890 421, 431, 433, 439, 443, 449, 457, 461,
1891 463, 467, 479, 487, 491, 499, 503, 509,
1892 521, 523, 541, 547, 557, 563, 569, 571,
1893 577, 587, 593, 599, 601, 607, 613, 617,
1894 619, 631, 641, 643, 647, 653, 659, 661,
1895 673, 677, 683, 691, 701, 709, 719, 727,
1896 733, 739, 743, 751, 757, 761, 769, 773,
1897 787, 797, 809, 811, 821, 823, 827, 829,
1898 839, 853, 857, 859, 863, 877, 881, 883,
1899 887, 907, 911, 919, 929, 937, 941, 947,
1900 953, 967, 971, 977, 983, 991, 997, -103
1912 static int mpi_check_small_factors(
const mpi *X )
1918 if( ( X->
p[0] & 1 ) == 0 )
1921 for( i = 0; small_prime[i] > 0; i++ )
1939 static int mpi_miller_rabin(
const mpi *X,
1940 int (*f_rng)(
void *,
unsigned char *,
size_t),
1963 n = ( ( i >= 1300 ) ? 2 : ( i >= 850 ) ? 3 :
1964 ( i >= 650 ) ? 4 : ( i >= 350 ) ? 8 :
1965 ( i >= 250 ) ? 12 : ( i >= 150 ) ? 18 : 27 );
1967 for( i = 0; i < n; i++ )
2027 int (*f_rng)(
void *,
unsigned char *,
size_t),
2031 const mpi XX = { 1, X->
n, X->
p };
2040 if( ( ret = mpi_check_small_factors( &XX ) ) != 0 )
2048 return( mpi_miller_rabin( &XX, f_rng, p_rng ) );
2055 int (*f_rng)(
void *,
unsigned char *,
size_t),
2068 n = BITS_TO_LIMBS( nbits );
2080 while( ( ret =
mpi_is_prime( X, f_rng, p_rng ) ) != 0 )
2111 if( ( ret = mpi_check_small_factors( X ) ) == 0 &&
2112 ( ret = mpi_check_small_factors( &Y ) ) == 0 &&
2113 ( ret = mpi_miller_rabin( X, f_rng, p_rng ) ) == 0 &&
2114 ( ret = mpi_miller_rabin( &Y, f_rng, p_rng ) ) == 0 )
2141 #if defined(POLARSSL_SELF_TEST)
2143 #define GCD_PAIR_COUNT 3
2145 static const int gcd_pairs[GCD_PAIR_COUNT][3] =
2149 { 768454923, 542167814, 1 }
2158 mpi A, E, N, X, Y, U, V;
2164 "EFE021C2645FD1DC586E69184AF4A31E" \
2165 "D5F53E93B5F123FA41680867BA110131" \
2166 "944FE7952E2517337780CB0DB80E61AA" \
2167 "E7C8DDC6C5C6AADEB34EB38A2F40D5E6" ) );
2170 "B2E7EFD37075B9F03FF989C7C5051C20" \
2171 "34D2A323810251127E7BF8625A4F49A5" \
2172 "F3E27F4DA8BD59C47D6DAABA4C8127BD" \
2173 "5B5C25763222FEFCCFC38B832366C29E" ) );
2176 "0066A198186C18C10B2F5ED9B522752A" \
2177 "9830B69916E535C8F047518A889A43A5" \
2178 "94B6BED27A168D31D4A52F88925AA8F5" ) );
2183 "602AB7ECA597A3D6B56FF9829A5E8B85" \
2184 "9E857EA95A03512E2BAE7391688D264A" \
2185 "A5663B0341DB9CCFD2C4C5F421FEC814" \
2186 "8001B72E848A38CAE1C65F78E56ABDEF" \
2187 "E12D3C039B8A02D6BE593F0BBBDA56F1" \
2188 "ECF677152EF804370C1A305CAF3B5BF1" \
2189 "30879B56C61DE584A0F53A2447A51E" ) );
2192 printf(
" MPI test #1 (mul_mpi): " );
2197 printf(
"failed\n" );
2203 printf(
"passed\n" );
2208 "256567336059E52CAE22925474705F39A94" ) );
2211 "6613F26162223DF488E9CD48CC132C7A" \
2212 "0AC93C701B001B092E4E5B9F73BCD27B" \
2213 "9EE50D0657C77F374E903CDFA4C642" ) );
2216 printf(
" MPI test #2 (div_mpi): " );
2222 printf(
"failed\n" );
2228 printf(
"passed\n" );
2233 "36E139AEA55215609D2816998ED020BB" \
2234 "BD96C37890F65171D948E9BC7CBAA4D9" \
2235 "325D24D6A3C12710F10A09FA08AB87" ) );
2238 printf(
" MPI test #3 (exp_mod): " );
2243 printf(
"failed\n" );
2249 printf(
"passed\n" );
2254 "003A0AAEDD7E784FC07D8F9EC6E3BFD5" \
2255 "C3DBA76456363A10869622EAC2DD84EC" \
2256 "C5B8A74DAC4D09E03B5E0BE779F2DF61" ) );
2259 printf(
" MPI test #4 (inv_mod): " );
2264 printf(
"failed\n" );
2270 printf(
"passed\n" );
2273 printf(
" MPI test #5 (simple gcd): " );
2275 for ( i = 0; i < GCD_PAIR_COUNT; i++)
2285 printf(
"failed at %d\n", i );
2292 printf(
"passed\n" );
2296 if( ret != 0 && verbose != 0 )
2297 printf(
"Unexpected error, return code = %08X\n", ret );
int mpi_cmp_int(const mpi *X, t_sint z)
Compare signed values.
#define POLARSSL_ERR_MPI_INVALID_CHARACTER
There is an invalid character in the digit string.
void mpi_swap(mpi *X, mpi *Y)
Swap the contents of X and Y.
int mpi_shrink(mpi *X, size_t nblimbs)
Resize down, keeping at least the specified number of limbs.
int mpi_safe_cond_assign(mpi *X, const mpi *Y, unsigned char assign)
Safe conditional assignement X = Y if assign is 1.
void *(* polarssl_malloc)(size_t len)
int mpi_div_int(mpi *Q, mpi *R, const mpi *A, t_sint b)
Division by int: A = Q * b + R.
#define POLARSSL_ERR_MPI_NEGATIVE_VALUE
The input arguments are negative or result in illegal output.
int mpi_gcd(mpi *G, const mpi *A, const mpi *B)
Greatest common divisor: G = gcd(A, B)
int mpi_fill_random(mpi *X, size_t size, int(*f_rng)(void *, unsigned char *, size_t), void *p_rng)
Fill an MPI X with size bytes of random.
int mpi_sub_abs(mpi *X, const mpi *A, const mpi *B)
Unsigned subtraction: X = |A| - |B|.
#define POLARSSL_MPI_WINDOW_SIZE
Maximum windows size used.
int mpi_cmp_abs(const mpi *X, const mpi *Y)
Compare unsigned values.
Configuration options (set of defines)
int mpi_add_int(mpi *X, const mpi *A, t_sint b)
Signed addition: X = A + b.
int mpi_read_file(mpi *X, int radix, FILE *fin)
Read X from an opened file.
int mpi_div_mpi(mpi *Q, mpi *R, const mpi *A, const mpi *B)
Division by mpi: A = Q * B + R.
int mpi_lset(mpi *X, t_sint z)
Set value from integer.
int mpi_is_prime(mpi *X, int(*f_rng)(void *, unsigned char *, size_t), void *p_rng)
Miller-Rabin primality test.
#define POLARSSL_ERR_MPI_BAD_INPUT_DATA
Bad input parameters to function.
int mpi_write_file(const char *p, const mpi *X, int radix, FILE *fout)
Write X into an opened file, or stdout if fout is NULL.
void mpi_init(mpi *X)
Initialize one MPI.
int mpi_cmp_mpi(const mpi *X, const mpi *Y)
Compare signed values.
unsigned long long t_udbl
Multi-precision integer library.
int mpi_shift_r(mpi *X, size_t count)
Right-shift: X >>= count.
int mpi_add_mpi(mpi *X, const mpi *A, const mpi *B)
Signed addition: X = A + B.
asn1_buf val
The named value.
#define POLARSSL_ERR_MPI_DIVISION_BY_ZERO
The input argument for division is zero, which is not allowed.
int mpi_write_string(const mpi *X, int radix, char *s, size_t *slen)
Export into an ASCII string.
size_t mpi_lsb(const mpi *X)
Return the number of zero-bits before the least significant '1' bit.
void(* polarssl_free)(void *ptr)
#define POLARSSL_ERR_MPI_BUFFER_TOO_SMALL
The buffer is too small to write to.
int mpi_inv_mod(mpi *X, const mpi *A, const mpi *N)
Modular inverse: X = A^-1 mod N.
Multi-precision integer library.
void mpi_free(mpi *X)
Unallocate one MPI.
int mpi_mul_int(mpi *X, const mpi *A, t_sint b)
Baseline multiplication: X = A * b Note: despite the functon signature, b is treated as a t_uint...
int mpi_grow(mpi *X, size_t nblimbs)
Enlarge to the specified number of limbs.
int mpi_mod_int(t_uint *r, const mpi *A, t_sint b)
Modulo: r = A mod b.
int mpi_exp_mod(mpi *X, const mpi *A, const mpi *E, const mpi *N, mpi *_RR)
Sliding-window exponentiation: X = A^E mod N.
int mpi_gen_prime(mpi *X, size_t nbits, int dh_flag, int(*f_rng)(void *, unsigned char *, size_t), void *p_rng)
Prime number generation.
size_t mpi_msb(const mpi *X)
Return the number of bits up to and including the most significant '1' bit'.
#define POLARSSL_MPI_MAX_BITS
Maximum number of bits for usable MPIs.
int mpi_add_abs(mpi *X, const mpi *A, const mpi *B)
Unsigned addition: X = |A| + |B|.
int mpi_read_string(mpi *X, int radix, const char *s)
Import from an ASCII string.
int mpi_read_binary(mpi *X, const unsigned char *buf, size_t buflen)
Import X from unsigned binary data, big endian.
int mpi_self_test(int verbose)
Checkup routine.
#define POLARSSL_ERR_MPI_MALLOC_FAILED
Memory allocation failed.
size_t mpi_size(const mpi *X)
Return the total size in bytes.
int mpi_copy(mpi *X, const mpi *Y)
Copy the contents of Y into X.
int mpi_mod_mpi(mpi *R, const mpi *A, const mpi *B)
Modulo: R = A mod B.
int mpi_get_bit(const mpi *X, size_t pos)
Get a specific bit from X.
int mpi_write_binary(const mpi *X, unsigned char *buf, size_t buflen)
Export X into unsigned binary data, big endian.
#define POLARSSL_ERR_MPI_FILE_IO_ERROR
An error occurred while reading from or writing to a file.
int mpi_shift_l(mpi *X, size_t count)
Left-shift: X <<= count.
int mpi_safe_cond_swap(mpi *X, mpi *Y, unsigned char assign)
Safe conditional swap X <-> Y if swap is 1.
#define POLARSSL_MPI_RW_BUFFER_SIZE
int mpi_mul_mpi(mpi *X, const mpi *A, const mpi *B)
Baseline multiplication: X = A * B.
int mpi_sub_mpi(mpi *X, const mpi *A, const mpi *B)
Signed subtraction: X = A - B.
int mpi_set_bit(mpi *X, size_t pos, unsigned char val)
Set a bit of X to a specific value of 0 or 1.
#define POLARSSL_MPI_MAX_LIMBS
int mpi_sub_int(mpi *X, const mpi *A, t_sint b)
Signed subtraction: X = A - b.
#define POLARSSL_ERR_MPI_NOT_ACCEPTABLE
The input arguments are not acceptable.