00001 00004 #ifndef XYSSL_BIGNUM_H 00005 #define XYSSL_BIGNUM_H 00006 00007 #include <stdio.h> 00008 00009 #define XYSSL_ERR_MPI_FILE_IO_ERROR -0x0002 00010 #define XYSSL_ERR_MPI_BAD_INPUT_DATA -0x0004 00011 #define XYSSL_ERR_MPI_INVALID_CHARACTER -0x0006 00012 #define XYSSL_ERR_MPI_BUFFER_TOO_SMALL -0x0008 00013 #define XYSSL_ERR_MPI_NEGATIVE_VALUE -0x000A 00014 #define XYSSL_ERR_MPI_DIVISION_BY_ZERO -0x000C 00015 #define XYSSL_ERR_MPI_NOT_ACCEPTABLE -0x000E 00016 00017 #define MPI_CHK(f) if( ( ret = f ) != 0 ) goto cleanup 00018 00019 /* 00020 * Define the base integer type, architecture-wise 00021 */ 00022 #if defined(XYSSL_HAVE_INT8) 00023 typedef unsigned char t_int; 00024 typedef unsigned short t_dbl; 00025 #else 00026 #if defined(XYSSL_HAVE_INT16) 00027 typedef unsigned short t_int; 00028 typedef unsigned long t_dbl; 00029 #else 00030 typedef unsigned long t_int; 00031 #if defined(_MSC_VER) && defined(_M_IX86) 00032 typedef unsigned __int64 t_dbl; 00033 #else 00034 #if defined(__amd64__) || defined(__x86_64__) || \ 00035 defined(__ppc64__) || defined(__powerpc64__) || \ 00036 defined(__ia64__) || defined(__alpha__) 00037 typedef unsigned int t_dbl __attribute__((mode(TI))); 00038 #else 00039 typedef unsigned long long t_dbl; 00040 #endif 00041 #endif 00042 #endif 00043 #endif 00044 00048 typedef struct 00049 { 00050 int s; 00051 int n; 00052 t_int *p; 00053 } 00054 mpi; 00055 00056 #ifdef __cplusplus 00057 extern "C" { 00058 #endif 00059 00063 void mpi_init( mpi *X, ... ); 00064 00068 void mpi_free( mpi *X, ... ); 00069 00076 int mpi_grow( mpi *X, int nblimbs ); 00077 00084 int mpi_copy( mpi *X, mpi *Y ); 00085 00089 void mpi_swap( mpi *X, mpi *Y ); 00090 00097 int mpi_lset( mpi *X, int z ); 00098 00102 int mpi_lsb( mpi *X ); 00103 00107 int mpi_msb( mpi *X ); 00108 00112 int mpi_size( mpi *X ); 00113 00123 int mpi_read_string( mpi *X, int radix, char *s ); 00124 00138 int mpi_write_string( mpi *X, int radix, char *s, int *slen ); 00139 00149 int mpi_read_file( mpi *X, int radix, FILE *fin ); 00150 00163 int mpi_write_file( char *p, mpi *X, int radix, FILE *fout ); 00164 00175 int mpi_read_binary( mpi *X, unsigned char *buf, int buflen ); 00176 00190 int mpi_write_binary( mpi *X, unsigned char *buf, int buflen ); 00191 00198 int mpi_shift_l( mpi *X, int count ); 00199 00206 int mpi_shift_r( mpi *X, int count ); 00207 00215 int mpi_cmp_abs( mpi *X, mpi *Y ); 00216 00224 int mpi_cmp_mpi( mpi *X, mpi *Y ); 00225 00233 int mpi_cmp_int( mpi *X, int z ); 00234 00241 int mpi_add_abs( mpi *X, mpi *A, mpi *B ); 00242 00249 int mpi_sub_abs( mpi *X, mpi *A, mpi *B ); 00250 00257 int mpi_add_mpi( mpi *X, mpi *A, mpi *B ); 00258 00265 int mpi_sub_mpi( mpi *X, mpi *A, mpi *B ); 00266 00273 int mpi_add_int( mpi *X, mpi *A, int b ); 00274 00281 int mpi_sub_int( mpi *X, mpi *A, int b ); 00282 00289 int mpi_mul_mpi( mpi *X, mpi *A, mpi *B ); 00290 00297 int mpi_mul_int( mpi *X, mpi *A, t_int b ); 00298 00308 int mpi_div_mpi( mpi *Q, mpi *R, mpi *A, mpi *B ); 00309 00319 int mpi_div_int( mpi *Q, mpi *R, mpi *A, int b ); 00320 00328 int mpi_mod_mpi( mpi *R, mpi *A, mpi *B ); 00329 00337 int mpi_mod_int( t_int *r, mpi *A, int b ); 00338 00350 int mpi_exp_mod( mpi *X, mpi *A, mpi *E, mpi *N, mpi *_RR ); 00351 00358 int mpi_gcd( mpi *G, mpi *A, mpi *B ); 00359 00368 int mpi_inv_mod( mpi *X, mpi *A, mpi *N ); 00369 00377 int mpi_is_prime( mpi *X, int (*f_rng)(void *), void *p_rng ); 00378 00392 int mpi_gen_prime( mpi *X, int nbits, int dh_flag, 00393 int (*f_rng)(void *), void *p_rng ); 00394 00400 int mpi_self_test( int verbose ); 00401 00402 #ifdef __cplusplus 00403 } 00404 #endif 00405 00406 #endif /* bignum.h */