33 #if !defined(POLARSSL_CONFIG_FILE)
36 #include POLARSSL_CONFIG_FILE
39 #if defined(POLARSSL_BIGNUM_C)
44 #if defined(POLARSSL_PLATFORM_C)
47 #define polarssl_printf printf
48 #define polarssl_malloc malloc
49 #define polarssl_free free
54 #define ciL (sizeof(t_uint))
55 #define biL (ciL << 3)
56 #define biH (ciL << 2)
61 #define BITS_TO_LIMBS(i) (((i) + biL - 1) / biL)
62 #define CHARS_TO_LIMBS(i) (((i) + ciL - 1) / ciL)
87 memset( X->
p, 0, X->
n * ciL );
111 memset( p, 0, nblimbs * ciL );
115 memcpy( p, X->
p, X->
n * ciL );
116 memset( X->
p, 0, X->
n * ciL );
137 if( X->
n <= nblimbs )
140 for( i = X->
n - 1; i > 0; i-- )
151 memset( p, 0, i * ciL );
155 memcpy( p, X->
p, i * ciL );
156 memset( X->
p, 0, X->
n * ciL );
183 for( i = Y->
n - 1; i > 0; i-- )
192 memset( X->
p, 0, X->
n * ciL );
193 memcpy( X->
p, Y->
p, i * ciL );
207 memcpy( &T, X,
sizeof(
mpi ) );
208 memcpy( X, Y,
sizeof(
mpi ) );
209 memcpy( Y, &T,
sizeof(
mpi ) );
223 assign = ( assign != 0 );
227 X->
s = X->
s * (1 - assign) + Y->
s * assign;
229 for( i = 0; i < Y->n; i++ )
230 X->
p[i] = X->
p[i] * (1 - assign) + Y->
p[i] * assign;
232 for( ; i < X->n; i++ )
233 X->
p[i] *= (1 - assign);
255 swap = ( swap != 0 );
261 X->
s = X->
s * (1 - swap) + Y->
s * swap;
262 Y->
s = Y->
s * (1 - swap) + s * swap;
265 for( i = 0; i < X->
n; i++ )
268 X->
p[i] = X->
p[i] * (1 - swap) + Y->
p[i] * swap;
269 Y->
p[i] = Y->
p[i] * (1 - swap) + tmp * swap;
284 memset( X->
p, 0, X->
n * ciL );
286 X->
p[0] = ( z < 0 ) ? -z : z;
287 X->
s = ( z < 0 ) ? -1 : 1;
299 if( X->
n * biL <= pos )
302 return ( X->
p[pos / biL] >> ( pos % biL ) ) & 0x01;
311 size_t off = pos / biL;
312 size_t idx = pos % biL;
314 if( val != 0 && val != 1 )
317 if( X->
n * biL <= pos )
325 X->
p[off] &= ~( (
t_uint) 0x01 << idx );
326 X->
p[off] |= (
t_uint) val << idx;
338 size_t i, j, count = 0;
340 for( i = 0; i < X->
n; i++ )
341 for( j = 0; j < biL; j++, count++ )
342 if( ( ( X->
p[i] >> j ) & 1 ) != 0 )
355 for( i = X->
n - 1; i > 0; i-- )
359 for( j = biL; j > 0; j-- )
360 if( ( ( X->
p[i] >> ( j - 1 ) ) & 1 ) != 0 )
363 return( ( i * biL ) + j );
371 return( (
mpi_msb( X ) + 7 ) >> 3 );
377 static int mpi_get_digit(
t_uint *d,
int radix,
char c )
381 if( c >= 0x30 && c <= 0x39 ) *d = c - 0x30;
382 if( c >= 0x41 && c <= 0x46 ) *d = c - 0x37;
383 if( c >= 0x61 && c <= 0x66 ) *d = c - 0x57;
385 if( *d >= (
t_uint) radix )
397 size_t i, j, slen, n;
401 if( radix < 2 || radix > 16 )
410 n = BITS_TO_LIMBS( slen << 2 );
415 for( i = slen, j = 0; i > 0; i--, j++ )
417 if( i == 1 && s[i - 1] ==
'-' )
423 MPI_CHK( mpi_get_digit( &d, radix, s[i - 1] ) );
424 X->
p[j / (2 * ciL)] |= d << ( (j % (2 * ciL)) << 2 );
431 for( i = 0; i < slen; i++ )
433 if( i == 0 && s[i] ==
'-' )
439 MPI_CHK( mpi_get_digit( &d, radix, s[i] ) );
463 static int mpi_write_hlp(
mpi *X,
int radix,
char **p )
468 if( radix < 2 || radix > 16 )
475 MPI_CHK( mpi_write_hlp( X, radix, p ) );
478 *(*p)++ = (char)( r + 0x30 );
480 *(*p)++ = (char)( r + 0x37 );
497 if( radix < 2 || radix > 16 )
501 if( radix >= 4 ) n >>= 1;
502 if( radix >= 16 ) n >>= 1;
522 for( i = X->
n, k = 0; i > 0; i-- )
524 for( j = ciL; j > 0; j-- )
526 c = ( X->
p[i - 1] >> ( ( j - 1 ) << 3) ) & 0xFF;
528 if( c == 0 && k == 0 && ( i + j + 3 ) != 0 )
531 *(p++) =
"0123456789ABCDEF" [c / 16];
532 *(p++) =
"0123456789ABCDEF" [c % 16];
544 MPI_CHK( mpi_write_hlp( &T, radix, &p ) );
557 #if defined(POLARSSL_FS_IO)
572 memset( s, 0,
sizeof( s ) );
573 if( fgets( s,
sizeof( s ) - 1, fin ) == NULL )
577 if( slen ==
sizeof( s ) - 2 )
580 if( s[slen - 1] ==
'\n' ) { slen--; s[slen] =
'\0'; }
581 if( s[slen - 1] ==
'\r' ) { slen--; s[slen] =
'\0'; }
585 if( mpi_get_digit( &d, radix, *p ) != 0 )
597 size_t n, slen, plen;
610 if( p == NULL ) p =
"";
619 if( fwrite( p, 1, plen, fout ) != plen ||
620 fwrite( s, 1, slen, fout ) != slen )
640 for( n = 0; n < buflen; n++ )
647 for( i = buflen, j = 0; i > n; i--, j++ )
648 X->
p[j / ciL] |= ((
t_uint) buf[i - 1]) << ((j % ciL) << 3);
667 memset( buf, 0, buflen );
669 for( i = buflen - 1, j = 0; n > 0; i--, j++, n-- )
670 buf[i] = (
unsigned char)( X->
p[j / ciL] >> ((j % ciL) << 3) );
685 t1 = count & (biL - 1);
699 for( i = X->
n; i > v0; i-- )
700 X->
p[i - 1] = X->
p[i - v0 - 1];
711 for( i = v0; i < X->
n; i++ )
713 r1 = X->
p[i] >> (biL - t1);
734 v1 = count & (biL - 1);
736 if( v0 > X->
n || ( v0 == X->
n && v1 > 0 ) )
744 for( i = 0; i < X->
n - v0; i++ )
745 X->
p[i] = X->
p[i + v0];
747 for( ; i < X->n; i++ )
756 for( i = X->
n; i > 0; i-- )
758 r1 = X->
p[i - 1] << (biL - v1);
775 for( i = X->
n; i > 0; i-- )
776 if( X->
p[i - 1] != 0 )
779 for( j = Y->
n; j > 0; j-- )
780 if( Y->
p[j - 1] != 0 )
783 if( i == 0 && j == 0 )
786 if( i > j )
return( 1 );
787 if( j > i )
return( -1 );
791 if( X->
p[i - 1] > Y->
p[i - 1] )
return( 1 );
792 if( X->
p[i - 1] < Y->
p[i - 1] )
return( -1 );
805 for( i = X->
n; i > 0; i-- )
806 if( X->
p[i - 1] != 0 )
809 for( j = Y->
n; j > 0; j-- )
810 if( Y->
p[j - 1] != 0 )
813 if( i == 0 && j == 0 )
816 if( i > j )
return( X->
s );
817 if( j > i )
return( -Y->
s );
819 if( X->
s > 0 && Y->
s < 0 )
return( 1 );
820 if( Y->
s > 0 && X->
s < 0 )
return( -1 );
824 if( X->
p[i - 1] > Y->
p[i - 1] )
return( X->
s );
825 if( X->
p[i - 1] < Y->
p[i - 1] )
return( -X->
s );
839 *p = ( z < 0 ) ? -z : z;
840 Y.
s = ( z < 0 ) ? -1 : 1;
858 const mpi *T = A; A = X; B = T;
869 for( j = B->
n; j > 0; j-- )
870 if( B->
p[j - 1] != 0 )
875 o = B->
p; p = X->
p; c = 0;
877 for( i = 0; i < j; i++, o++, p++ )
879 *p += c; c = ( *p < c );
880 *p += *o; c += ( *p < *o );
891 *p += c; c = ( *p < c ); i++; p++;
902 static void mpi_sub_hlp(
size_t n,
t_uint *s,
t_uint *d )
907 for( i = c = 0; i < n; i++, s++, d++ )
909 z = ( *d < c ); *d -= c;
910 c = ( *d < *s ) + z; *d -= *s;
915 z = ( *d < c ); *d -= c;
950 for( n = B->
n; n > 0; n-- )
951 if( B->
p[n - 1] != 0 )
954 mpi_sub_hlp( n, B->
p, X->
p );
970 if( A->
s * B->
s < 0 )
1001 if( A->
s * B->
s > 0 )
1033 p[0] = ( b < 0 ) ? -b : b;
1034 _B.
s = ( b < 0 ) ? -1 : 1;
1049 p[0] = ( b < 0 ) ? -b : b;
1050 _B.
s = ( b < 0 ) ? -1 : 1;
1061 #if defined(__APPLE__) && defined(__arm__)
1066 __attribute__ ((noinline))
1072 #if defined(MULADDC_HUIT)
1073 for( ; i >= 8; i -= 8 )
1087 for( ; i >= 16; i -= 16 )
1102 for( ; i >= 8; i -= 8 )
1124 *d += c; c = ( *d < c ); d++;
1143 for( i = A->
n; i > 0; i-- )
1144 if( A->
p[i - 1] != 0 )
1147 for( j = B->
n; j > 0; j-- )
1148 if( B->
p[j - 1] != 0 )
1154 for( i++; j > 0; j-- )
1155 mpi_mul_hlp( i - 1, A->
p, X->
p + j - 1, B->
p[j - 1] );
1189 mpi X, Y, Z, T1, T2;
1233 for( i = n; i > t ; i-- )
1235 if( X.
p[i] >= Y.
p[t] )
1236 Z.
p[i - t - 1] = ~0;
1246 #if defined(POLARSSL_HAVE_UDBL) && \
1247 ! ( defined(__x86_64__) && defined(__APPLE__) && \
1248 defined(__clang_major__) && __clang_major__ == 5 && \
1249 defined(__clang_minor__) && __clang_minor__ == 0 )
1255 if( r > ((
t_udbl) 1 << biL) - 1)
1256 r = ((
t_udbl) 1 << biL) - 1;
1267 d0 = ( d << biH ) >> biH;
1271 r1 = X.
p[i] - d1 * q1;
1273 r1 |= ( X.
p[i - 1] >> biH );
1279 while( r1 >= d && r1 < m )
1287 r0 |= ( X.
p[i - 1] << biH ) >> biH;
1293 while( r0 >= d && r0 < m )
1298 Z.
p[i - t - 1] = ( q1 << biH ) | q0;
1308 T1.
p[0] = (t < 1) ? 0 : Y.
p[t - 1];
1313 T2.
p[0] = (i < 2) ? 0 : X.
p[i - 2];
1314 T2.
p[1] = (i < 1) ? 0 : X.
p[i - 1];
1364 p[0] = ( b < 0 ) ? -b : b;
1365 _B.
s = ( b < 0 ) ? -1 : 1;
1427 for( i = A->
n, y = 0; i > 0; i-- )
1430 y = ( y << biH ) | ( x >> biH );
1435 y = ( y << biH ) | ( x >> biH );
1444 if( A->
s < 0 && y != 0 )
1455 static void mpi_montg_init(
t_uint *mm,
const mpi *N )
1461 x += ( ( m0 + 2 ) & 4 ) << 1;
1463 for( i = biL; i >= 8; i /= 2 )
1464 x *= ( 2 - ( m0 * x ) );
1472 static void mpi_montmul(
mpi *A,
const mpi *B,
const mpi *N,
t_uint mm,
1478 memset( T->
p, 0, T->
n * ciL );
1482 m = ( B->
n < n ) ? B->
n : n;
1484 for( i = 0; i < n; i++ )
1490 u1 = ( d[0] + u0 * B->
p[0] ) * mm;
1492 mpi_mul_hlp( m, B->
p, d, u0 );
1493 mpi_mul_hlp( n, N->
p, d, u1 );
1495 *d++ = u0; d[n + 1] = 0;
1498 memcpy( A->
p, d, (n + 1) * ciL );
1501 mpi_sub_hlp( n, N->
p, A->
p );
1504 mpi_sub_hlp( n, A->
p, T->
p );
1510 static void mpi_montred(
mpi *A,
const mpi *N,
t_uint mm,
const mpi *T )
1515 U.
n = U.
s = (int) z;
1518 mpi_montmul( A, &U, N, mm, T );
1527 size_t wbits, wsize, one = 1;
1528 size_t i, j, nblimbs;
1529 size_t bufsize, nbits;
1543 mpi_montg_init( &mm, N );
1546 memset( W, 0,
sizeof( W ) );
1550 wsize = ( i > 671 ) ? 6 : ( i > 239 ) ? 5 :
1551 ( i > 79 ) ? 4 : ( i > 23 ) ? 3 : 1;
1564 neg = ( A->
s == -1 );
1575 if( _RR == NULL || _RR->
p == NULL )
1582 memcpy( _RR, &RR,
sizeof(
mpi ) );
1585 memcpy( &RR, _RR,
sizeof(
mpi ) );
1595 mpi_montmul( &W[1], &RR, N, mm, &T );
1601 mpi_montred( X, N, mm, &T );
1608 j = one << (wsize - 1);
1613 for( i = 0; i < wsize - 1; i++ )
1614 mpi_montmul( &W[j], &W[j], N, mm, &T );
1619 for( i = j + 1; i < (one << wsize); i++ )
1624 mpi_montmul( &W[i], &W[1], N, mm, &T );
1643 bufsize =
sizeof(
t_uint ) << 3;
1648 ei = (E->
p[nblimbs] >> bufsize) & 1;
1653 if( ei == 0 && state == 0 )
1656 if( ei == 0 && state == 1 )
1661 mpi_montmul( X, X, N, mm, &T );
1671 wbits |= (ei << (wsize - nbits));
1673 if( nbits == wsize )
1678 for( i = 0; i < wsize; i++ )
1679 mpi_montmul( X, X, N, mm, &T );
1684 mpi_montmul( X, &W[wbits], N, mm, &T );
1695 for( i = 0; i < nbits; i++ )
1697 mpi_montmul( X, X, N, mm, &T );
1701 if( (wbits & (one << wsize)) != 0 )
1702 mpi_montmul( X, &W[1], N, mm, &T );
1708 mpi_montred( X, N, mm, &T );
1718 for( i = (one << (wsize - 1)); i < (one << wsize); i++ )
1723 if( _RR == NULL || _RR->
p == NULL )
1789 int (*f_rng)(
void *,
unsigned char *,
size_t),
1798 MPI_CHK( f_rng( p_rng, buf, size ) );
1811 mpi G, TA, TU, U1, U2, TB, TV, V1, V2;
1840 while( ( TU.
p[0] & 1 ) == 0 )
1844 if( ( U1.
p[0] & 1 ) != 0 || ( U2.
p[0] & 1 ) != 0 )
1854 while( ( TV.
p[0] & 1 ) == 0 )
1858 if( ( V1.
p[0] & 1 ) != 0 || ( V2.
p[0] & 1 ) != 0 )
1900 #if defined(POLARSSL_GENPRIME)
1902 static const int small_prime[] =
1904 3, 5, 7, 11, 13, 17, 19, 23,
1905 29, 31, 37, 41, 43, 47, 53, 59,
1906 61, 67, 71, 73, 79, 83, 89, 97,
1907 101, 103, 107, 109, 113, 127, 131, 137,
1908 139, 149, 151, 157, 163, 167, 173, 179,
1909 181, 191, 193, 197, 199, 211, 223, 227,
1910 229, 233, 239, 241, 251, 257, 263, 269,
1911 271, 277, 281, 283, 293, 307, 311, 313,
1912 317, 331, 337, 347, 349, 353, 359, 367,
1913 373, 379, 383, 389, 397, 401, 409, 419,
1914 421, 431, 433, 439, 443, 449, 457, 461,
1915 463, 467, 479, 487, 491, 499, 503, 509,
1916 521, 523, 541, 547, 557, 563, 569, 571,
1917 577, 587, 593, 599, 601, 607, 613, 617,
1918 619, 631, 641, 643, 647, 653, 659, 661,
1919 673, 677, 683, 691, 701, 709, 719, 727,
1920 733, 739, 743, 751, 757, 761, 769, 773,
1921 787, 797, 809, 811, 821, 823, 827, 829,
1922 839, 853, 857, 859, 863, 877, 881, 883,
1923 887, 907, 911, 919, 929, 937, 941, 947,
1924 953, 967, 971, 977, 983, 991, 997, -103
1936 static int mpi_check_small_factors(
const mpi *X )
1942 if( ( X->
p[0] & 1 ) == 0 )
1945 for( i = 0; small_prime[i] > 0; i++ )
1963 static int mpi_miller_rabin(
const mpi *X,
1964 int (*f_rng)(
void *,
unsigned char *,
size_t),
1987 n = ( ( i >= 1300 ) ? 2 : ( i >= 850 ) ? 3 :
1988 ( i >= 650 ) ? 4 : ( i >= 350 ) ? 8 :
1989 ( i >= 250 ) ? 12 : ( i >= 150 ) ? 18 : 27 );
1991 for( i = 0; i < n; i++ )
2051 int (*f_rng)(
void *,
unsigned char *,
size_t),
2055 const mpi XX = { 1, X->
n, X->
p };
2064 if( ( ret = mpi_check_small_factors( &XX ) ) != 0 )
2072 return( mpi_miller_rabin( &XX, f_rng, p_rng ) );
2079 int (*f_rng)(
void *,
unsigned char *,
size_t),
2092 n = BITS_TO_LIMBS( nbits );
2104 while( ( ret =
mpi_is_prime( X, f_rng, p_rng ) ) != 0 )
2135 if( ( ret = mpi_check_small_factors( X ) ) == 0 &&
2136 ( ret = mpi_check_small_factors( &Y ) ) == 0 &&
2137 ( ret = mpi_miller_rabin( X, f_rng, p_rng ) ) == 0 &&
2138 ( ret = mpi_miller_rabin( &Y, f_rng, p_rng ) ) == 0 )
2165 #if defined(POLARSSL_SELF_TEST)
2167 #define GCD_PAIR_COUNT 3
2169 static const int gcd_pairs[GCD_PAIR_COUNT][3] =
2173 { 768454923, 542167814, 1 }
2182 mpi A, E, N, X, Y, U, V;
2188 "EFE021C2645FD1DC586E69184AF4A31E" \
2189 "D5F53E93B5F123FA41680867BA110131" \
2190 "944FE7952E2517337780CB0DB80E61AA" \
2191 "E7C8DDC6C5C6AADEB34EB38A2F40D5E6" ) );
2194 "B2E7EFD37075B9F03FF989C7C5051C20" \
2195 "34D2A323810251127E7BF8625A4F49A5" \
2196 "F3E27F4DA8BD59C47D6DAABA4C8127BD" \
2197 "5B5C25763222FEFCCFC38B832366C29E" ) );
2200 "0066A198186C18C10B2F5ED9B522752A" \
2201 "9830B69916E535C8F047518A889A43A5" \
2202 "94B6BED27A168D31D4A52F88925AA8F5" ) );
2207 "602AB7ECA597A3D6B56FF9829A5E8B85" \
2208 "9E857EA95A03512E2BAE7391688D264A" \
2209 "A5663B0341DB9CCFD2C4C5F421FEC814" \
2210 "8001B72E848A38CAE1C65F78E56ABDEF" \
2211 "E12D3C039B8A02D6BE593F0BBBDA56F1" \
2212 "ECF677152EF804370C1A305CAF3B5BF1" \
2213 "30879B56C61DE584A0F53A2447A51E" ) );
2233 "256567336059E52CAE22925474705F39A94" ) );
2236 "6613F26162223DF488E9CD48CC132C7A" \
2237 "0AC93C701B001B092E4E5B9F73BCD27B" \
2238 "9EE50D0657C77F374E903CDFA4C642" ) );
2259 "36E139AEA55215609D2816998ED020BB" \
2260 "BD96C37890F65171D948E9BC7CBAA4D9" \
2261 "325D24D6A3C12710F10A09FA08AB87" ) );
2281 "003A0AAEDD7E784FC07D8F9EC6E3BFD5" \
2282 "C3DBA76456363A10869622EAC2DD84EC" \
2283 "C5B8A74DAC4D09E03B5E0BE779F2DF61" ) );
2303 for ( i = 0; i < GCD_PAIR_COUNT; i++)
2325 if( ret != 0 && verbose != 0 )
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.
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.
#define POLARSSL_MPI_MAX_SIZE
Maximum number of bytes for usable MPIs.
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.
#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.