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
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