00001
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037
00038
00039
00040
00041
00042
00043
00044
00045
00046
00047
00048
00049
00050
00051 #ifndef MBEDTLS_BIGNUM_H
00052 #define MBEDTLS_BIGNUM_H
00053
00054 #if !defined(MBEDTLS_CONFIG_FILE)
00055 #include "config.h"
00056 #else
00057 #include MBEDTLS_CONFIG_FILE
00058 #endif
00059
00060 #include <stddef.h>
00061 #include <stdint.h>
00062
00063 #if defined(MBEDTLS_FS_IO)
00064 #include <stdio.h>
00065 #endif
00066
00067 #define MBEDTLS_ERR_MPI_FILE_IO_ERROR -0x0002
00068 #define MBEDTLS_ERR_MPI_BAD_INPUT_DATA -0x0004
00069 #define MBEDTLS_ERR_MPI_INVALID_CHARACTER -0x0006
00070 #define MBEDTLS_ERR_MPI_BUFFER_TOO_SMALL -0x0008
00071 #define MBEDTLS_ERR_MPI_NEGATIVE_VALUE -0x000A
00072 #define MBEDTLS_ERR_MPI_DIVISION_BY_ZERO -0x000C
00073 #define MBEDTLS_ERR_MPI_NOT_ACCEPTABLE -0x000E
00074 #define MBEDTLS_ERR_MPI_ALLOC_FAILED -0x0010
00076 #define MBEDTLS_MPI_CHK(f) do { if( ( ret = f ) != 0 ) goto cleanup; } while( 0 )
00077
00078
00079
00080
00081 #define MBEDTLS_MPI_MAX_LIMBS 10000
00082
00083 #if !defined(MBEDTLS_MPI_WINDOW_SIZE)
00084
00085
00086
00087
00088
00089
00090
00091
00092
00093 #define MBEDTLS_MPI_WINDOW_SIZE 6
00094 #endif
00095
00096 #if !defined(MBEDTLS_MPI_MAX_SIZE)
00097
00098
00099
00100
00101
00102
00103
00104 #define MBEDTLS_MPI_MAX_SIZE 1024
00105 #endif
00106
00107 #define MBEDTLS_MPI_MAX_BITS ( 8 * MBEDTLS_MPI_MAX_SIZE )
00109
00110
00111
00112
00113
00114
00115
00116
00117
00118
00119
00120
00121
00122
00123
00124
00125
00126
00127 #define MBEDTLS_MPI_MAX_BITS_SCALE100 ( 100 * MBEDTLS_MPI_MAX_BITS )
00128 #define MBEDTLS_LN_2_DIV_LN_10_SCALE100 332
00129 #define MBEDTLS_MPI_RW_BUFFER_SIZE ( ((MBEDTLS_MPI_MAX_BITS_SCALE100 + MBEDTLS_LN_2_DIV_LN_10_SCALE100 - 1) / MBEDTLS_LN_2_DIV_LN_10_SCALE100) + 10 + 6 )
00130
00131
00132
00133
00134
00135
00136
00137
00138
00139
00140
00141 #if !defined(MBEDTLS_HAVE_INT32)
00142 #if defined(_MSC_VER) && defined(_M_AMD64)
00143
00144 #if !defined(MBEDTLS_HAVE_INT64)
00145 #define MBEDTLS_HAVE_INT64
00146 #endif
00147 typedef int64_t mbedtls_mpi_sint;
00148 typedef uint64_t mbedtls_mpi_uint;
00149 #elif defined(__GNUC__) && ( \
00150 defined(__amd64__) || defined(__x86_64__) || \
00151 defined(__ppc64__) || defined(__powerpc64__) || \
00152 defined(__ia64__) || defined(__alpha__) || \
00153 ( defined(__sparc__) && defined(__arch64__) ) || \
00154 defined(__s390x__) || defined(__mips64) )
00155 #if !defined(MBEDTLS_HAVE_INT64)
00156 #define MBEDTLS_HAVE_INT64
00157 #endif
00158 typedef int64_t mbedtls_mpi_sint;
00159 typedef uint64_t mbedtls_mpi_uint;
00160 #if !defined(MBEDTLS_NO_UDBL_DIVISION)
00161
00162 typedef unsigned int mbedtls_t_udbl __attribute__((mode(TI)));
00163 #define MBEDTLS_HAVE_UDBL
00164 #endif
00165 #elif defined(__ARMCC_VERSION) && defined(__aarch64__)
00166
00167
00168
00169
00170 #if !defined(MBEDTLS_HAVE_INT64)
00171 #define MBEDTLS_HAVE_INT64
00172 #endif
00173 typedef int64_t mbedtls_mpi_sint;
00174 typedef uint64_t mbedtls_mpi_uint;
00175 #if !defined(MBEDTLS_NO_UDBL_DIVISION)
00176
00177 typedef __uint128_t mbedtls_t_udbl;
00178 #define MBEDTLS_HAVE_UDBL
00179 #endif
00180 #elif defined(MBEDTLS_HAVE_INT64)
00181
00182 typedef int64_t mbedtls_mpi_sint;
00183 typedef uint64_t mbedtls_mpi_uint;
00184 #endif
00185 #endif
00186
00187 #if !defined(MBEDTLS_HAVE_INT64)
00188
00189 #if !defined(MBEDTLS_HAVE_INT32)
00190 #define MBEDTLS_HAVE_INT32
00191 #endif
00192 typedef int32_t mbedtls_mpi_sint;
00193 typedef uint32_t mbedtls_mpi_uint;
00194 #if !defined(MBEDTLS_NO_UDBL_DIVISION)
00195 typedef uint64_t mbedtls_t_udbl;
00196 #define MBEDTLS_HAVE_UDBL
00197 #endif
00198 #endif
00199
00200 #ifdef __cplusplus
00201 extern "C" {
00202 #endif
00203
00207 typedef struct
00208 {
00209 int s;
00210 size_t n;
00211 mbedtls_mpi_uint *p;
00212 }
00213 mbedtls_mpi;
00214
00222 void mbedtls_mpi_init( mbedtls_mpi *X );
00223
00229 void mbedtls_mpi_free( mbedtls_mpi *X );
00230
00240 int mbedtls_mpi_grow( mbedtls_mpi *X, size_t nblimbs );
00241
00251 int mbedtls_mpi_shrink( mbedtls_mpi *X, size_t nblimbs );
00252
00262 int mbedtls_mpi_copy( mbedtls_mpi *X, const mbedtls_mpi *Y );
00263
00270 void mbedtls_mpi_swap( mbedtls_mpi *X, mbedtls_mpi *Y );
00271
00289 int mbedtls_mpi_safe_cond_assign( mbedtls_mpi *X, const mbedtls_mpi *Y, unsigned char assign );
00290
00308 int mbedtls_mpi_safe_cond_swap( mbedtls_mpi *X, mbedtls_mpi *Y, unsigned char assign );
00309
00319 int mbedtls_mpi_lset( mbedtls_mpi *X, mbedtls_mpi_sint z );
00320
00329 int mbedtls_mpi_get_bit( const mbedtls_mpi *X, size_t pos );
00330
00345 int mbedtls_mpi_set_bit( mbedtls_mpi *X, size_t pos, unsigned char val );
00346
00355 size_t mbedtls_mpi_lsb( const mbedtls_mpi *X );
00356
00365 size_t mbedtls_mpi_bitlen( const mbedtls_mpi *X );
00366
00372 size_t mbedtls_mpi_size( const mbedtls_mpi *X );
00373
00383 int mbedtls_mpi_read_string( mbedtls_mpi *X, int radix, const char *s );
00384
00401 int mbedtls_mpi_write_string( const mbedtls_mpi *X, int radix,
00402 char *buf, size_t buflen, size_t *olen );
00403
00404 #if defined(MBEDTLS_FS_IO)
00405
00425 int mbedtls_mpi_read_file( mbedtls_mpi *X, int radix, FILE *fin );
00426
00439 int mbedtls_mpi_write_file( const char *p, const mbedtls_mpi *X, int radix, FILE *fout );
00440 #endif
00441
00452 int mbedtls_mpi_read_binary( mbedtls_mpi *X, const unsigned char *buf, size_t buflen );
00453
00466 int mbedtls_mpi_write_binary( const mbedtls_mpi *X, unsigned char *buf, size_t buflen );
00467
00477 int mbedtls_mpi_shift_l( mbedtls_mpi *X, size_t count );
00478
00488 int mbedtls_mpi_shift_r( mbedtls_mpi *X, size_t count );
00489
00500 int mbedtls_mpi_cmp_abs( const mbedtls_mpi *X, const mbedtls_mpi *Y );
00501
00512 int mbedtls_mpi_cmp_mpi( const mbedtls_mpi *X, const mbedtls_mpi *Y );
00513
00529 int mbedtls_mpi_lt_mpi_ct( const mbedtls_mpi *X, const mbedtls_mpi *Y,
00530 unsigned *ret );
00531
00542 int mbedtls_mpi_cmp_int( const mbedtls_mpi *X, mbedtls_mpi_sint z );
00543
00554 int mbedtls_mpi_add_abs( mbedtls_mpi *X, const mbedtls_mpi *A, const mbedtls_mpi *B );
00555
00566 int mbedtls_mpi_sub_abs( mbedtls_mpi *X, const mbedtls_mpi *A, const mbedtls_mpi *B );
00567
00578 int mbedtls_mpi_add_mpi( mbedtls_mpi *X, const mbedtls_mpi *A, const mbedtls_mpi *B );
00579
00590 int mbedtls_mpi_sub_mpi( mbedtls_mpi *X, const mbedtls_mpi *A, const mbedtls_mpi *B );
00591
00602 int mbedtls_mpi_add_int( mbedtls_mpi *X, const mbedtls_mpi *A, mbedtls_mpi_sint b );
00603
00614 int mbedtls_mpi_sub_int( mbedtls_mpi *X, const mbedtls_mpi *A, mbedtls_mpi_sint b );
00615
00626 int mbedtls_mpi_mul_mpi( mbedtls_mpi *X, const mbedtls_mpi *A, const mbedtls_mpi *B );
00627
00640 int mbedtls_mpi_mul_int( mbedtls_mpi *X, const mbedtls_mpi *A, mbedtls_mpi_uint b );
00641
00656 int mbedtls_mpi_div_mpi( mbedtls_mpi *Q, mbedtls_mpi *R, const mbedtls_mpi *A, const mbedtls_mpi *B );
00657
00672 int mbedtls_mpi_div_int( mbedtls_mpi *Q, mbedtls_mpi *R, const mbedtls_mpi *A, mbedtls_mpi_sint b );
00673
00686 int mbedtls_mpi_mod_mpi( mbedtls_mpi *R, const mbedtls_mpi *A, const mbedtls_mpi *B );
00687
00700 int mbedtls_mpi_mod_int( mbedtls_mpi_uint *r, const mbedtls_mpi *A, mbedtls_mpi_sint b );
00701
00720 int mbedtls_mpi_exp_mod( mbedtls_mpi *X, const mbedtls_mpi *A, const mbedtls_mpi *E, const mbedtls_mpi *N, mbedtls_mpi *_RR );
00721
00737 int mbedtls_mpi_fill_random( mbedtls_mpi *X, size_t size,
00738 int (*f_rng)(void *, unsigned char *, size_t),
00739 void *p_rng );
00740
00751 int mbedtls_mpi_gcd( mbedtls_mpi *G, const mbedtls_mpi *A, const mbedtls_mpi *B );
00752
00765 int mbedtls_mpi_inv_mod( mbedtls_mpi *X, const mbedtls_mpi *A, const mbedtls_mpi *N );
00766
00778 int mbedtls_mpi_is_prime( const mbedtls_mpi *X,
00779 int (*f_rng)(void *, unsigned char *, size_t),
00780 void *p_rng );
00781
00796 int mbedtls_mpi_gen_prime( mbedtls_mpi *X, size_t nbits, int dh_flag,
00797 int (*f_rng)(void *, unsigned char *, size_t),
00798 void *p_rng );
00799
00805 int mbedtls_mpi_self_test( int verbose );
00806
00807 #ifdef __cplusplus
00808 }
00809 #endif
00810
00811 #endif