00001
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024 #ifndef MBEDTLS_BIGNUM_H
00025 #define MBEDTLS_BIGNUM_H
00026
00027 #if !defined(MBEDTLS_CONFIG_FILE)
00028 #include "config.h"
00029 #else
00030 #include MBEDTLS_CONFIG_FILE
00031 #endif
00032
00033 #include <stddef.h>
00034 #include <stdint.h>
00035
00036 #if defined(MBEDTLS_FS_IO)
00037 #include <stdio.h>
00038 #endif
00039
00040 #define MBEDTLS_ERR_MPI_FILE_IO_ERROR -0x0002
00041 #define MBEDTLS_ERR_MPI_BAD_INPUT_DATA -0x0004
00042 #define MBEDTLS_ERR_MPI_INVALID_CHARACTER -0x0006
00043 #define MBEDTLS_ERR_MPI_BUFFER_TOO_SMALL -0x0008
00044 #define MBEDTLS_ERR_MPI_NEGATIVE_VALUE -0x000A
00045 #define MBEDTLS_ERR_MPI_DIVISION_BY_ZERO -0x000C
00046 #define MBEDTLS_ERR_MPI_NOT_ACCEPTABLE -0x000E
00047 #define MBEDTLS_ERR_MPI_ALLOC_FAILED -0x0010
00049 #define MBEDTLS_MPI_CHK(f) do { if( ( ret = f ) != 0 ) goto cleanup; } while( 0 )
00050
00051
00052
00053
00054 #define MBEDTLS_MPI_MAX_LIMBS 10000
00055
00056 #if !defined(MBEDTLS_MPI_WINDOW_SIZE)
00057
00058
00059
00060
00061
00062
00063
00064
00065
00066 #define MBEDTLS_MPI_WINDOW_SIZE 6
00067 #endif
00068
00069 #if !defined(MBEDTLS_MPI_MAX_SIZE)
00070
00071
00072
00073
00074
00075
00076
00077 #define MBEDTLS_MPI_MAX_SIZE 1024
00078 #endif
00079
00080 #define MBEDTLS_MPI_MAX_BITS ( 8 * MBEDTLS_MPI_MAX_SIZE )
00082
00083
00084
00085
00086
00087
00088
00089
00090
00091
00092
00093
00094
00095
00096
00097
00098
00099
00100 #define MBEDTLS_MPI_MAX_BITS_SCALE100 ( 100 * MBEDTLS_MPI_MAX_BITS )
00101 #define MBEDTLS_LN_2_DIV_LN_10_SCALE100 332
00102 #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 )
00103
00104
00105
00106
00107
00108
00109
00110
00111
00112
00113
00114 #if !defined(MBEDTLS_HAVE_INT32)
00115 #if defined(_MSC_VER) && defined(_M_AMD64)
00116
00117 #if !defined(MBEDTLS_HAVE_INT64)
00118 #define MBEDTLS_HAVE_INT64
00119 #endif
00120 typedef int64_t mbedtls_mpi_sint;
00121 typedef uint64_t mbedtls_mpi_uint;
00122 #elif defined(__GNUC__) && ( \
00123 defined(__amd64__) || defined(__x86_64__) || \
00124 defined(__ppc64__) || defined(__powerpc64__) || \
00125 defined(__ia64__) || defined(__alpha__) || \
00126 ( defined(__sparc__) && defined(__arch64__) ) || \
00127 defined(__s390x__) || defined(__mips64) )
00128 #if !defined(MBEDTLS_HAVE_INT64)
00129 #define MBEDTLS_HAVE_INT64
00130 #endif
00131 typedef int64_t mbedtls_mpi_sint;
00132 typedef uint64_t mbedtls_mpi_uint;
00133 #if !defined(MBEDTLS_NO_UDBL_DIVISION)
00134
00135 typedef unsigned int mbedtls_t_udbl __attribute__((mode(TI)));
00136 #define MBEDTLS_HAVE_UDBL
00137 #endif
00138 #elif defined(__ARMCC_VERSION) && defined(__aarch64__)
00139
00140
00141
00142
00143 #if !defined(MBEDTLS_HAVE_INT64)
00144 #define MBEDTLS_HAVE_INT64
00145 #endif
00146 typedef int64_t mbedtls_mpi_sint;
00147 typedef uint64_t mbedtls_mpi_uint;
00148 #if !defined(MBEDTLS_NO_UDBL_DIVISION)
00149
00150 typedef __uint128_t mbedtls_t_udbl;
00151 #define MBEDTLS_HAVE_UDBL
00152 #endif
00153 #elif defined(MBEDTLS_HAVE_INT64)
00154
00155 typedef int64_t mbedtls_mpi_sint;
00156 typedef uint64_t mbedtls_mpi_uint;
00157 #endif
00158 #endif
00159
00160 #if !defined(MBEDTLS_HAVE_INT64)
00161
00162 #if !defined(MBEDTLS_HAVE_INT32)
00163 #define MBEDTLS_HAVE_INT32
00164 #endif
00165 typedef int32_t mbedtls_mpi_sint;
00166 typedef uint32_t mbedtls_mpi_uint;
00167 #if !defined(MBEDTLS_NO_UDBL_DIVISION)
00168 typedef uint64_t mbedtls_t_udbl;
00169 #define MBEDTLS_HAVE_UDBL
00170 #endif
00171 #endif
00172
00173 #ifdef __cplusplus
00174 extern "C" {
00175 #endif
00176
00180 typedef struct
00181 {
00182 int s;
00183 size_t n;
00184 mbedtls_mpi_uint *p;
00185 }
00186 mbedtls_mpi;
00187
00195 void mbedtls_mpi_init( mbedtls_mpi *X );
00196
00202 void mbedtls_mpi_free( mbedtls_mpi *X );
00203
00213 int mbedtls_mpi_grow( mbedtls_mpi *X, size_t nblimbs );
00214
00224 int mbedtls_mpi_shrink( mbedtls_mpi *X, size_t nblimbs );
00225
00235 int mbedtls_mpi_copy( mbedtls_mpi *X, const mbedtls_mpi *Y );
00236
00243 void mbedtls_mpi_swap( mbedtls_mpi *X, mbedtls_mpi *Y );
00244
00262 int mbedtls_mpi_safe_cond_assign( mbedtls_mpi *X, const mbedtls_mpi *Y, unsigned char assign );
00263
00281 int mbedtls_mpi_safe_cond_swap( mbedtls_mpi *X, mbedtls_mpi *Y, unsigned char assign );
00282
00292 int mbedtls_mpi_lset( mbedtls_mpi *X, mbedtls_mpi_sint z );
00293
00302 int mbedtls_mpi_get_bit( const mbedtls_mpi *X, size_t pos );
00303
00318 int mbedtls_mpi_set_bit( mbedtls_mpi *X, size_t pos, unsigned char val );
00319
00328 size_t mbedtls_mpi_lsb( const mbedtls_mpi *X );
00329
00338 size_t mbedtls_mpi_bitlen( const mbedtls_mpi *X );
00339
00345 size_t mbedtls_mpi_size( const mbedtls_mpi *X );
00346
00356 int mbedtls_mpi_read_string( mbedtls_mpi *X, int radix, const char *s );
00357
00374 int mbedtls_mpi_write_string( const mbedtls_mpi *X, int radix,
00375 char *buf, size_t buflen, size_t *olen );
00376
00377 #if defined(MBEDTLS_FS_IO)
00378
00398 int mbedtls_mpi_read_file( mbedtls_mpi *X, int radix, FILE *fin );
00399
00412 int mbedtls_mpi_write_file( const char *p, const mbedtls_mpi *X, int radix, FILE *fout );
00413 #endif
00414
00425 int mbedtls_mpi_read_binary( mbedtls_mpi *X, const unsigned char *buf, size_t buflen );
00426
00439 int mbedtls_mpi_write_binary( const mbedtls_mpi *X, unsigned char *buf, size_t buflen );
00440
00450 int mbedtls_mpi_shift_l( mbedtls_mpi *X, size_t count );
00451
00461 int mbedtls_mpi_shift_r( mbedtls_mpi *X, size_t count );
00462
00473 int mbedtls_mpi_cmp_abs( const mbedtls_mpi *X, const mbedtls_mpi *Y );
00474
00485 int mbedtls_mpi_cmp_mpi( const mbedtls_mpi *X, const mbedtls_mpi *Y );
00486
00497 int mbedtls_mpi_cmp_int( const mbedtls_mpi *X, mbedtls_mpi_sint z );
00498
00509 int mbedtls_mpi_add_abs( mbedtls_mpi *X, const mbedtls_mpi *A, const mbedtls_mpi *B );
00510
00521 int mbedtls_mpi_sub_abs( mbedtls_mpi *X, const mbedtls_mpi *A, const mbedtls_mpi *B );
00522
00533 int mbedtls_mpi_add_mpi( mbedtls_mpi *X, const mbedtls_mpi *A, const mbedtls_mpi *B );
00534
00545 int mbedtls_mpi_sub_mpi( mbedtls_mpi *X, const mbedtls_mpi *A, const mbedtls_mpi *B );
00546
00557 int mbedtls_mpi_add_int( mbedtls_mpi *X, const mbedtls_mpi *A, mbedtls_mpi_sint b );
00558
00569 int mbedtls_mpi_sub_int( mbedtls_mpi *X, const mbedtls_mpi *A, mbedtls_mpi_sint b );
00570
00581 int mbedtls_mpi_mul_mpi( mbedtls_mpi *X, const mbedtls_mpi *A, const mbedtls_mpi *B );
00582
00595 int mbedtls_mpi_mul_int( mbedtls_mpi *X, const mbedtls_mpi *A, mbedtls_mpi_uint b );
00596
00611 int mbedtls_mpi_div_mpi( mbedtls_mpi *Q, mbedtls_mpi *R, const mbedtls_mpi *A, const mbedtls_mpi *B );
00612
00627 int mbedtls_mpi_div_int( mbedtls_mpi *Q, mbedtls_mpi *R, const mbedtls_mpi *A, mbedtls_mpi_sint b );
00628
00641 int mbedtls_mpi_mod_mpi( mbedtls_mpi *R, const mbedtls_mpi *A, const mbedtls_mpi *B );
00642
00655 int mbedtls_mpi_mod_int( mbedtls_mpi_uint *r, const mbedtls_mpi *A, mbedtls_mpi_sint b );
00656
00675 int mbedtls_mpi_exp_mod( mbedtls_mpi *X, const mbedtls_mpi *A, const mbedtls_mpi *E, const mbedtls_mpi *N, mbedtls_mpi *_RR );
00676
00692 int mbedtls_mpi_fill_random( mbedtls_mpi *X, size_t size,
00693 int (*f_rng)(void *, unsigned char *, size_t),
00694 void *p_rng );
00695
00706 int mbedtls_mpi_gcd( mbedtls_mpi *G, const mbedtls_mpi *A, const mbedtls_mpi *B );
00707
00720 int mbedtls_mpi_inv_mod( mbedtls_mpi *X, const mbedtls_mpi *A, const mbedtls_mpi *N );
00721
00733 int mbedtls_mpi_is_prime( const mbedtls_mpi *X,
00734 int (*f_rng)(void *, unsigned char *, size_t),
00735 void *p_rng );
00736
00751 int mbedtls_mpi_gen_prime( mbedtls_mpi *X, size_t nbits, int dh_flag,
00752 int (*f_rng)(void *, unsigned char *, size_t),
00753 void *p_rng );
00754
00760 int mbedtls_mpi_self_test( int verbose );
00761
00762 #ifdef __cplusplus
00763 }
00764 #endif
00765
00766 #endif