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
00151
00152 int mpi_read_mystring( mpi *X, int radix, char *s );
00153
00166 int mpi_write_file( char *p, mpi *X, int radix, FILE *fout );
00167
00178 int mpi_read_binary( mpi *X, unsigned char *buf, int buflen );
00179
00193 int mpi_write_binary( mpi *X, unsigned char *buf, int buflen );
00194
00201 int mpi_shift_l( mpi *X, int count );
00202
00209 int mpi_shift_r( mpi *X, int count );
00210
00218 int mpi_cmp_abs( mpi *X, mpi *Y );
00219
00227 int mpi_cmp_mpi( mpi *X, mpi *Y );
00228
00236 int mpi_cmp_int( mpi *X, int z );
00237
00244 int mpi_add_abs( mpi *X, mpi *A, mpi *B );
00245
00252 int mpi_sub_abs( mpi *X, mpi *A, mpi *B );
00253
00260 int mpi_add_mpi( mpi *X, mpi *A, mpi *B );
00261
00268 int mpi_sub_mpi( mpi *X, mpi *A, mpi *B );
00269
00276 int mpi_add_int( mpi *X, mpi *A, int b );
00277
00284 int mpi_sub_int( mpi *X, mpi *A, int b );
00285
00292 int mpi_mul_mpi( mpi *X, mpi *A, mpi *B );
00293
00300 int mpi_mul_int( mpi *X, mpi *A, t_int b );
00301
00311 int mpi_div_mpi( mpi *Q, mpi *R, mpi *A, mpi *B );
00312
00322 int mpi_div_int( mpi *Q, mpi *R, mpi *A, int b );
00323
00331 int mpi_mod_mpi( mpi *R, mpi *A, mpi *B );
00332
00340 int mpi_mod_int( t_int *r, mpi *A, int b );
00341
00353 int mpi_exp_mod( mpi *X, mpi *A, mpi *E, mpi *N, mpi *_RR );
00354
00361 int mpi_gcd( mpi *G, mpi *A, mpi *B );
00362
00371 int mpi_inv_mod( mpi *X, mpi *A, mpi *N );
00372
00380 int mpi_is_prime( mpi *X, int (*f_rng)(void *), void *p_rng );
00381
00395 int mpi_gen_prime( mpi *X, int nbits, int dh_flag,
00396 int (*f_rng)(void *), void *p_rng );
00397
00403 int mpi_self_test( int verbose );
00404
00405 #ifdef __cplusplus
00406 }
00407 #endif
00408
00409 #endif