/* Modified from ssleay/crypto/bn/bn.h */ #ifndef librock_INC_BIGNUM_H #define librock_INC_BIGNUM_H /* Only one for the following should be defined */ /* The prime number generation stuff may not work when * EIGHT_BIT but I don't care since I've only used this mode * for debuging the librock_BIGNUM libraries */ #if 0 /* Out for librock */ #undef SIXTY_FOUR_BIT #define THIRTY_TWO_BIT #undef SIXTEEN_BIT #undef EIGHT_BIT #endif #include /* assuming long is 64bit - this is the DEC Alpha * unsigned long long is only 64 bits :-(, don't define * BN_LLONG for the DEC Alpha */ #ifdef librock_uint128_t_defined #define librock_BN_SIXTY_FOUR_BIT #define librock_BN_ULLONG librock_uint128_t #define librock_BN_ULONG librock_uint64_t #define librock_BN_LONG librock_int64_t #define librock_BN_BITS 128 #define librock_BN_BYTES 8 #define librock_BN_BITS2 64 #define librock_BN_BITS4 32 #define librock_BN_MASK2 (0xffffffffffffffffL) #define librock_BN_MASK2l (0xffffffffL) #define librock_BN_MASK2h (0xffffffff00000000L) #define librock_BN_MASK2h1 (0xffffffff80000000L) #define librock_BN_CBIT ((BN_ULLONG)0x10000000000000000LL) #define librock_BN_TBIT (0x8000000000000000) #define librock_BN_NOT_MASK2 ((BN_ULLONG)0xffffffffffffffff0000000000000000LL) #elif defined(librock_uint64_t_defined) #define librock_BN_THIRTY_TWO_BIT #define librock_BN_ULLONG librock_uint64_t #define librock_BN_ULONG librock_uint32_t #define librock_BN_LONG librock_int32_t #define librock_BN_BITS 64 #define librock_BN_BYTES 4 #define librock_BN_BITS2 32 #define librock_BN_BITS4 16 #define librock_BN_MASK2 (0xffffffffL) #define librock_BN_MASK2l (0xffff) #define librock_BN_MASK2h1 (0xffff8000L) #define librock_BN_MASK2h (0xffff0000L) #define librock_BN_CBIT ((BN_ULLONG)0x100000000LL) #define librock_BN_TBIT (0x80000000L) #define librock_BN_NOT_MASK2 ((BN_ULLONG)0xffffffff00000000LL) #elif defined(librock_uint32_t_defined) #define librock_BN_SIXTEEN_BIT #ifndef BN_DIV2W #define librock_BN_DIV2W #endif #define librock_BN_ULLONG librock_uint32_t #define librock_BN_ULONG librock_uint16_t #define librock_BN_LONG librock_int16_t #define librock_BN_BITS 32 #define librock_BN_BYTES 2 #define librock_BN_BITS2 16 #define librock_BN_BITS4 8 #define librock_BN_MASK2 (0xffff) #define librock_BN_MASK2l (0xff) #define librock_BN_MASK2h1 (0xff80) #define librock_BN_MASK2h (0xff00) #define librock_BN_CBIT ((BN_ULLONG)0x10000L) #define librock_BN_TBIT (0x8000) #define librock_BN_NOT_MASK2 ((BN_ULLONG)0xffff0000L) #elif defined(librock_uint16_t_defined) #define librock_BN_EIGHT_BIT #ifndef librock_BN_DIV2W #define librock_BN_DIV2W #endif #define librock_BN_ULLONG librock_uint16_t #define librock_BN_ULONG librock_uint8_t #define librock_BN_LONG librock_int8_t #define librock_BN_BITS 16 #define librock_BN_BYTES 1 #define librock_BN_BITS2 8 #define librock_BN_BITS4 4 #define librock_BN_MASK2 (0xff) #define librock_BN_MASK2l (0xf) #define librock_BN_MASK2h1 (0xf8) #define librock_BN_MASK2h (0xf0) #define librock_BN_CBIT ((BN_ULLONG)0x100L) #define librock_BN_TBIT (0x80) #define librock_BN_NOT_MASK2 ((BN_ULLONG)0xff00L) #else #error Unknown word sizes #endif #define librock_BN_DEFAULT_BITS 1280 typedef struct librock_bignum_st { librock_BN_ULONG *d; /* Pointer to an array of 'BN_BITS2' bit chunks. */ int top; /* Index of last used d +1. */ /* The next are internal book keeping for bn_expand. */ int max; /* Size of the d array. */ int neg; /* one if the number is negative */ } librock_BIGNUM; /* Used for temp variables */ #define librock_BN_CTX_NUM 12 typedef struct librock_bignum_ctx { int tos; librock_BIGNUM *bn[librock_BN_CTX_NUM]; } librock_BN_CTX; /* Used for montgomery multiplication */ typedef struct librock_bn_mont_ctx_st { int ri; /* number of bits in R */ librock_BIGNUM *RR; /* used to convert to montgomery form */ librock_BIGNUM *N; /* The modulus */ librock_BIGNUM *Ni; /* The inverse of N */ librock_BN_ULONG n0; /* word form of inverse, normally only one of * Ni or n0 is defined */ } librock_BN_MONT_CTX; char * librock_BN_options(void); librock_BN_CTX *librock_BN_CTX_new(void); void librock_BN_CTX_free(librock_BN_CTX *c); int librock_BN_rand(librock_BIGNUM *rnd, int bits, int top,int bottom); int librock_BN_num_bits(librock_BIGNUM *a); int librock_BN_num_bits_word(librock_BN_ULONG); librock_BIGNUM *librock_BN_new(void); void librock_BN_clear_free(librock_BIGNUM *a); librock_BIGNUM *librock_BN_copy(librock_BIGNUM *a, librock_BIGNUM *b); librock_BIGNUM *librock_BN_bin2bn(unsigned char *s,int len,librock_BIGNUM *ret); int librock_BN_bn2bin(librock_BIGNUM *a, unsigned char *to); int librock_BN_sub(librock_BIGNUM *r, librock_BIGNUM *a, librock_BIGNUM *b); void librock_bn_qsub(librock_BIGNUM *r, librock_BIGNUM *a, librock_BIGNUM *b); void librock_bn_qadd(librock_BIGNUM *r, librock_BIGNUM *a, librock_BIGNUM *b); int librock_BN_add(librock_BIGNUM *r, librock_BIGNUM *a, librock_BIGNUM *b); int librock_BN_mod(librock_BIGNUM *rem, librock_BIGNUM *m, librock_BIGNUM *d, librock_BN_CTX *ctx); int librock_BN_div(librock_BIGNUM *dv, librock_BIGNUM *rem, librock_BIGNUM *m, librock_BIGNUM *d, librock_BN_CTX *ctx); int librock_BN_mul(librock_BIGNUM *r, librock_BIGNUM *a, librock_BIGNUM *b); int librock_BN_sqr(librock_BIGNUM *r, librock_BIGNUM *a,librock_BN_CTX *ctx); librock_BN_ULONG librock_BN_mod_word(librock_BIGNUM *a, librock_BN_ULONG w); int librock_BN_add_word(librock_BIGNUM *a, librock_BN_ULONG w); int librock_BN_set_word(librock_BIGNUM *a, unsigned long w); unsigned long librock_BN_get_word(librock_BIGNUM *a); int librock_BN_cmp(librock_BIGNUM *a, librock_BIGNUM *b); void librock_BN_free(librock_BIGNUM *a); int librock_BN_is_bit_set(librock_BIGNUM *a, int n); int librock_BN_lshift(librock_BIGNUM *r, librock_BIGNUM *a, int n); int librock_BN_lshift1(librock_BIGNUM *r, librock_BIGNUM *a); int librock_BN_mod_exp(librock_BIGNUM *r, librock_BIGNUM *a, librock_BIGNUM *p, librock_BIGNUM *m,librock_BN_CTX *ctx); int librock_BN_mod_exp_mont(librock_BIGNUM *r, librock_BIGNUM *a, librock_BIGNUM *p, librock_BIGNUM *m,librock_BN_CTX *ctx); int librock_BN_mod_exp_recp(librock_BIGNUM *r, librock_BIGNUM *a, librock_BIGNUM *p, librock_BIGNUM *m,librock_BN_CTX *ctx); int librock_BN_mod_exp_simple(librock_BIGNUM *r, librock_BIGNUM *a, librock_BIGNUM *p, librock_BIGNUM *m,librock_BN_CTX *ctx); int librock_BN_mask_bits(librock_BIGNUM *a,int n); int librock_BN_mod_mul_reciprocal(librock_BIGNUM *r, librock_BIGNUM *x, librock_BIGNUM *y, librock_BIGNUM *m, librock_BIGNUM *i, int nb, librock_BN_CTX *ctx); int librock_BN_mod_mul(librock_BIGNUM *ret, librock_BIGNUM *a, librock_BIGNUM *b, librock_BIGNUM *m, librock_BN_CTX *ctx); #ifdef librock_FILE int librock_BN_print_fp(librock_FILE *fp, librock_BIGNUM *a); #endif #ifdef HEADER_BUFFER_H int librock_BN_print(BIO *fp, librock_BIGNUM *a); #else int librock_BN_print(char *fp, librock_BIGNUM *a); #endif int librock_BN_reciprocal(librock_BIGNUM *r, librock_BIGNUM *m, librock_BN_CTX *ctx); int librock_BN_rshift(librock_BIGNUM *r, librock_BIGNUM *a, int n); int librock_BN_rshift1(librock_BIGNUM *r, librock_BIGNUM *a); void librock_BN_clear(librock_BIGNUM *a); librock_BIGNUM *librock_bn_expand2(librock_BIGNUM *b, int bits); librock_BIGNUM *librock_BN_dup(librock_BIGNUM *a); int librock_BN_ucmp(librock_BIGNUM *a, librock_BIGNUM *b); int librock_BN_set_bit(librock_BIGNUM *a, int n); int librock_BN_clear_bit(librock_BIGNUM *a, int n); char * librock_BN_bn2ascii(librock_BIGNUM *a); int librock_BN_gcd(librock_BIGNUM *r,librock_BIGNUM *in_a,librock_BIGNUM *in_b,librock_BN_CTX *ctx); librock_BIGNUM *librock_BN_mod_inverse(librock_BIGNUM *a, librock_BIGNUM *n,librock_BN_CTX *ctx); librock_BIGNUM *librock_BN_generate_prime(int bits,int strong,librock_BIGNUM *add, librock_BIGNUM *rem,void (*callback)(int,int)); int librock_BN_is_prime(librock_BIGNUM *p,int nchecks,void (*callback)(int,int), librock_BN_CTX *ctx); void librock_ERR_load_BN_strings(void ); librock_BN_ULONG librock_bn_mul_add_word(librock_BN_ULONG *rp, librock_BN_ULONG *ap, int num, librock_BN_ULONG w); librock_BN_ULONG librock_bn_mul_word(librock_BN_ULONG *rp, librock_BN_ULONG *ap, int num, librock_BN_ULONG w); void librock_bn_sqr_words(librock_BN_ULONG *rp, librock_BN_ULONG *ap, int num); librock_BN_ULONG librock_bn_div64(librock_BN_ULONG h, librock_BN_ULONG l, librock_BN_ULONG d); int librock_BN_mod_mul_montgomery(librock_BIGNUM *r,librock_BIGNUM *a,librock_BIGNUM *b,librock_BN_MONT_CTX *mont, librock_BN_CTX *ctx); int librock_BN_from_montgomery(librock_BIGNUM *r,librock_BIGNUM *a,librock_BN_MONT_CTX *mont,librock_BN_CTX *ctx); librock_BN_MONT_CTX *librock_BN_MONT_CTX_new(); void librock_BN_MONT_CTX_free(librock_BN_MONT_CTX *mont); int librock_BN_MONT_CTX_set(librock_BN_MONT_CTX *mont,librock_BIGNUM *modulus,librock_BN_CTX *ctx); #endif /* BIGNUM_H */