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 #ifndef MBEDTLS_BIGNUM_H
00050 #define MBEDTLS_BIGNUM_H
00051
00052 #if !defined(MBEDTLS_CONFIG_FILE)
00053 #include "config.h"
00054 #else
00055 #include MBEDTLS_CONFIG_FILE
00056 #endif
00057
00058 #include <stddef.h>
00059 #include <stdint.h>
00060
00061 #if defined(MBEDTLS_FS_IO)
00062 #include <stdio.h>
00063 #endif
00064
00065 #define MBEDTLS_ERR_MPI_FILE_IO_ERROR -0x0002
00066 #define MBEDTLS_ERR_MPI_BAD_INPUT_DATA -0x0004
00067 #define MBEDTLS_ERR_MPI_INVALID_CHARACTER -0x0006
00068 #define MBEDTLS_ERR_MPI_BUFFER_TOO_SMALL -0x0008
00069 #define MBEDTLS_ERR_MPI_NEGATIVE_VALUE -0x000A
00070 #define MBEDTLS_ERR_MPI_DIVISION_BY_ZERO -0x000C
00071 #define MBEDTLS_ERR_MPI_NOT_ACCEPTABLE -0x000E
00072 #define MBEDTLS_ERR_MPI_ALLOC_FAILED -0x0010
00074 #define MBEDTLS_MPI_CHK(f) do { if( ( ret = f ) != 0 ) goto cleanup; } while( 0 )
00075
00076
00077
00078
00079 #define MBEDTLS_MPI_MAX_LIMBS 10000
00080
00081 #if !defined(MBEDTLS_MPI_WINDOW_SIZE)
00082
00083
00084
00085
00086
00087
00088
00089
00090
00091 #define MBEDTLS_MPI_WINDOW_SIZE 6
00092 #endif
00093
00094 #if !defined(MBEDTLS_MPI_MAX_SIZE)
00095
00096
00097
00098
00099
00100
00101
00102 #define MBEDTLS_MPI_MAX_SIZE 1024
00103 #endif
00104
00105 #define MBEDTLS_MPI_MAX_BITS ( 8 * MBEDTLS_MPI_MAX_SIZE )
00107
00108
00109
00110
00111
00112
00113
00114
00115
00116
00117
00118
00119
00120
00121
00122
00123
00124
00125 #define MBEDTLS_MPI_MAX_BITS_SCALE100 ( 100 * MBEDTLS_MPI_MAX_BITS )
00126 #define MBEDTLS_LN_2_DIV_LN_10_SCALE100 332
00127 #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 )
00128
00129
00130
00131
00132
00133
00134
00135
00136
00137
00138
00139 #if !defined(MBEDTLS_HAVE_INT32)
00140 #if defined(_MSC_VER) && defined(_M_AMD64)
00141
00142 #if !defined(MBEDTLS_HAVE_INT64)
00143 #define MBEDTLS_HAVE_INT64
00144 #endif
00145 typedef int64_t mbedtls_mpi_sint;
00146 typedef uint64_t mbedtls_mpi_uint;
00147 #elif defined(__GNUC__) && ( \
00148 defined(__amd64__) || defined(__x86_64__) || \
00149 defined(__ppc64__) || defined(__powerpc64__) || \
00150 defined(__ia64__) || defined(__alpha__) || \
00151 ( defined(__sparc__) && defined(__arch64__) ) || \
00152 defined(__s390x__) || defined(__mips64) )
00153 #if !defined(MBEDTLS_HAVE_INT64)
00154 #define MBEDTLS_HAVE_INT64
00155 #endif
00156 typedef int64_t mbedtls_mpi_sint;
00157 typedef uint64_t mbedtls_mpi_uint;
00158 #if !defined(MBEDTLS_NO_UDBL_DIVISION)
00159
00160 typedef unsigned int mbedtls_t_udbl __attribute__((mode(TI)));
00161 #define MBEDTLS_HAVE_UDBL
00162 #endif
00163 #elif defined(__ARMCC_VERSION) && defined(__aarch64__)
00164
00165
00166
00167
00168 #if !defined(MBEDTLS_HAVE_INT64)
00169 #define MBEDTLS_HAVE_INT64
00170 #endif
00171 typedef int64_t mbedtls_mpi_sint;
00172 typedef uint64_t mbedtls_mpi_uint;
00173 #if !defined(MBEDTLS_NO_UDBL_DIVISION)
00174
00175 typedef __uint128_t mbedtls_t_udbl;
00176 #define MBEDTLS_HAVE_UDBL
00177 #endif
00178 #elif defined(MBEDTLS_HAVE_INT64)
00179
00180 typedef int64_t mbedtls_mpi_sint;
00181 typedef uint64_t mbedtls_mpi_uint;
00182 #endif
00183 #endif
00184
00185 #if !defined(MBEDTLS_HAVE_INT64)
00186
00187 #if !defined(MBEDTLS_HAVE_INT32)
00188 #define MBEDTLS_HAVE_INT32
00189 #endif
00190 typedef int32_t mbedtls_mpi_sint;
00191 typedef uint32_t mbedtls_mpi_uint;
00192 #if !defined(MBEDTLS_NO_UDBL_DIVISION)
00193 typedef uint64_t mbedtls_t_udbl;
00194 #define MBEDTLS_HAVE_UDBL
00195 #endif
00196 #endif
00197
00198 #ifdef __cplusplus
00199 extern "C" {
00200 #endif
00201
00205 typedef struct
00206 {
00207 int s;
00208 size_t n;
00209 mbedtls_mpi_uint *p;
00210 }
00211 mbedtls_mpi;
00212
00220 void mbedtls_mpi_init( mbedtls_mpi *X );
00221
00227 void mbedtls_mpi_free( mbedtls_mpi *X );
00228
00238 int mbedtls_mpi_grow( mbedtls_mpi *X, size_t nblimbs );
00239
00249 int mbedtls_mpi_shrink( mbedtls_mpi *X, size_t nblimbs );
00250
00260 int mbedtls_mpi_copy( mbedtls_mpi *X, const mbedtls_mpi *Y );
00261
00268 void mbedtls_mpi_swap( mbedtls_mpi *X, mbedtls_mpi *Y );
00269
00287 int mbedtls_mpi_safe_cond_assign( mbedtls_mpi *X, const mbedtls_mpi *Y, unsigned char assign );
00288
00306 int mbedtls_mpi_safe_cond_swap( mbedtls_mpi *X, mbedtls_mpi *Y, unsigned char assign );
00307
00317 int mbedtls_mpi_lset( mbedtls_mpi *X, mbedtls_mpi_sint z );
00318
00327 int mbedtls_mpi_get_bit( const mbedtls_mpi *X, size_t pos );
00328
00343 int mbedtls_mpi_set_bit( mbedtls_mpi *X, size_t pos, unsigned char val );
00344
00353 size_t mbedtls_mpi_lsb( const mbedtls_mpi *X );
00354
00363 size_t mbedtls_mpi_bitlen( const mbedtls_mpi *X );
00364
00370 size_t mbedtls_mpi_size( const mbedtls_mpi *X );
00371
00381 int mbedtls_mpi_read_string( mbedtls_mpi *X, int radix, const char *s );
00382
00399 int mbedtls_mpi_write_string( const mbedtls_mpi *X, int radix,
00400 char *buf, size_t buflen, size_t *olen );
00401
00402 #if defined(MBEDTLS_FS_IO)
00403
00423 int mbedtls_mpi_read_file( mbedtls_mpi *X, int radix, FILE *fin );
00424
00437 int mbedtls_mpi_write_file( const char *p, const mbedtls_mpi *X, int radix, FILE *fout );
00438 #endif
00439
00450 int mbedtls_mpi_read_binary( mbedtls_mpi *X, const unsigned char *buf, size_t buflen );
00451
00464 int mbedtls_mpi_write_binary( const mbedtls_mpi *X, unsigned char *buf, size_t buflen );
00465
00475 int mbedtls_mpi_shift_l( mbedtls_mpi *X, size_t count );
00476
00486 int mbedtls_mpi_shift_r( mbedtls_mpi *X, size_t count );
00487
00498 int mbedtls_mpi_cmp_abs( const mbedtls_mpi *X, const mbedtls_mpi *Y );
00499
00510 int mbedtls_mpi_cmp_mpi( const mbedtls_mpi *X, const mbedtls_mpi *Y );
00511
00527 int mbedtls_mpi_lt_mpi_ct( const mbedtls_mpi *X, const mbedtls_mpi *Y,
00528 unsigned *ret );
00529
00540 int mbedtls_mpi_cmp_int( const mbedtls_mpi *X, mbedtls_mpi_sint z );
00541
00552 int mbedtls_mpi_add_abs( mbedtls_mpi *X, const mbedtls_mpi *A, const mbedtls_mpi *B );
00553
00564 int mbedtls_mpi_sub_abs( mbedtls_mpi *X, const mbedtls_mpi *A, const mbedtls_mpi *B );
00565
00576 int mbedtls_mpi_add_mpi( mbedtls_mpi *X, const mbedtls_mpi *A, const mbedtls_mpi *B );
00577
00588 int mbedtls_mpi_sub_mpi( mbedtls_mpi *X, const mbedtls_mpi *A, const mbedtls_mpi *B );
00589
00600 int mbedtls_mpi_add_int( mbedtls_mpi *X, const mbedtls_mpi *A, mbedtls_mpi_sint b );
00601
00612 int mbedtls_mpi_sub_int( mbedtls_mpi *X, const mbedtls_mpi *A, mbedtls_mpi_sint b );
00613
00624 int mbedtls_mpi_mul_mpi( mbedtls_mpi *X, const mbedtls_mpi *A, const mbedtls_mpi *B );
00625
00638 int mbedtls_mpi_mul_int( mbedtls_mpi *X, const mbedtls_mpi *A, mbedtls_mpi_uint b );
00639
00654 int mbedtls_mpi_div_mpi( mbedtls_mpi *Q, mbedtls_mpi *R, const mbedtls_mpi *A, const mbedtls_mpi *B );
00655
00670 int mbedtls_mpi_div_int( mbedtls_mpi *Q, mbedtls_mpi *R, const mbedtls_mpi *A, mbedtls_mpi_sint b );
00671
00684 int mbedtls_mpi_mod_mpi( mbedtls_mpi *R, const mbedtls_mpi *A, const mbedtls_mpi *B );
00685
00698 int mbedtls_mpi_mod_int( mbedtls_mpi_uint *r, const mbedtls_mpi *A, mbedtls_mpi_sint b );
00699
00718 int mbedtls_mpi_exp_mod( mbedtls_mpi *X, const mbedtls_mpi *A, const mbedtls_mpi *E, const mbedtls_mpi *N, mbedtls_mpi *_RR );
00719
00735 int mbedtls_mpi_fill_random( mbedtls_mpi *X, size_t size,
00736 int (*f_rng)(void *, unsigned char *, size_t),
00737 void *p_rng );
00738
00749 int mbedtls_mpi_gcd( mbedtls_mpi *G, const mbedtls_mpi *A, const mbedtls_mpi *B );
00750
00763 int mbedtls_mpi_inv_mod( mbedtls_mpi *X, const mbedtls_mpi *A, const mbedtls_mpi *N );
00764
00776 int mbedtls_mpi_is_prime( const mbedtls_mpi *X,
00777 int (*f_rng)(void *, unsigned char *, size_t),
00778 void *p_rng );
00779
00794 int mbedtls_mpi_gen_prime( mbedtls_mpi *X, size_t nbits, int dh_flag,
00795 int (*f_rng)(void *, unsigned char *, size_t),
00796 void *p_rng );
00797
00803 int mbedtls_mpi_self_test( int verbose );
00804
00805 #ifdef __cplusplus
00806 }
00807 #endif
00808
00809 #endif