00001
00002
00003
00004
00005
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
00050
00051
00052
00053
00054
00055
00056
00057
00058
00059
00060
00061
00062
00063
00064
00065
00066
00067
00068
00069
00070
00071
00072
00073
00074
00075 #ifndef HEADER_BN_H
00076 #define HEADER_BN_H
00077
00078 #if (defined(__SYMBIAN32__) && !defined(SYMBIAN))
00079 #define SYMBIAN
00080 #endif
00081
00082 #ifdef SYMBIAN
00083 #include <e32def.h>
00084 #endif
00085 #include <openssl/e_os2.h>
00086 #ifndef OPENSSL_NO_FP_API
00087 #include <stdio.h>
00088 #endif
00089 #include <openssl/ossl_typ.h>
00090
00091 #ifdef __cplusplus
00092 extern "C" {
00093 #endif
00094
00095
00096
00097
00098
00099
00100
00101
00102
00103
00104
00105
00106
00107 #define BN_MUL_COMBA
00108 #define BN_SQR_COMBA
00109 #define BN_RECURSION
00110
00111
00112
00113
00114
00115
00116
00117
00118
00119
00120
00121
00122 #if defined(OPENSSL_SYS_MSDOS) || defined(OPENSSL_SYS_WINDOWS) || \
00123 defined(OPENSSL_SYS_WIN32) || defined(linux)
00124 # ifndef BN_DIV2W
00125 # define BN_DIV2W
00126 # endif
00127 #endif
00128
00129
00130
00131
00132 #ifdef SIXTY_FOUR_BIT_LONG
00133 #define BN_ULLONG unsigned long long
00134 #define BN_ULONG unsigned long
00135 #define BN_LONG long
00136 #define BN_BITS 128
00137 #define BN_BYTES 8
00138 #define BN_BITS2 64
00139 #define BN_BITS4 32
00140 #define BN_MASK (0xffffffffffffffffffffffffffffffffLL)
00141 #define BN_MASK2 (0xffffffffffffffffL)
00142 #define BN_MASK2l (0xffffffffL)
00143 #define BN_MASK2h (0xffffffff00000000L)
00144 #define BN_MASK2h1 (0xffffffff80000000L)
00145 #define BN_TBIT (0x8000000000000000L)
00146 #define BN_DEC_CONV (10000000000000000000UL)
00147 #define BN_DEC_FMT1 "%lu"
00148 #define BN_DEC_FMT2 "%019lu"
00149 #define BN_DEC_NUM 19
00150 #endif
00151
00152
00153
00154
00155
00156
00157 #ifdef SIXTY_FOUR_BIT
00158 #undef BN_LLONG
00159 #undef BN_ULLONG
00160 #define BN_ULONG unsigned long long
00161 #define BN_LONG long long
00162 #define BN_BITS 128
00163 #define BN_BYTES 8
00164 #define BN_BITS2 64
00165 #define BN_BITS4 32
00166 #define BN_MASK2 (0xffffffffffffffffLL)
00167 #define BN_MASK2l (0xffffffffL)
00168 #define BN_MASK2h (0xffffffff00000000LL)
00169 #define BN_MASK2h1 (0xffffffff80000000LL)
00170 #define BN_TBIT (0x8000000000000000LL)
00171 #define BN_DEC_CONV (10000000000000000000ULL)
00172 #define BN_DEC_FMT1 "%llu"
00173 #define BN_DEC_FMT2 "%019llu"
00174 #define BN_DEC_NUM 19
00175 #endif
00176
00177 #ifdef THIRTY_TWO_BIT
00178 #ifdef BN_LLONG
00179 # if defined(OPENSSL_SYS_WIN32) && !defined(__GNUC__)
00180 # define BN_ULLONG unsigned __int64
00181 # else
00182 # define BN_ULLONG unsigned long long
00183 # endif
00184 #endif
00185 #define BN_ULONG unsigned long
00186 #define BN_LONG long
00187 #define BN_BITS 64
00188 #define BN_BYTES 4
00189 #define BN_BITS2 32
00190 #define BN_BITS4 16
00191 #ifdef OPENSSL_SYS_WIN32
00192
00193 #define BN_MASK (0xffffffffffffffffL)
00194 #else
00195 #define BN_MASK (0xffffffffffffffffLL)
00196 #endif
00197 #define BN_MASK2 (0xffffffffL)
00198 #define BN_MASK2l (0xffff)
00199 #define BN_MASK2h1 (0xffff8000L)
00200 #define BN_MASK2h (0xffff0000L)
00201 #define BN_TBIT (0x80000000L)
00202 #define BN_DEC_CONV (1000000000L)
00203 #define BN_DEC_FMT1 "%lu"
00204 #define BN_DEC_FMT2 "%09lu"
00205 #define BN_DEC_NUM 9
00206 #endif
00207
00208 #ifdef SIXTEEN_BIT
00209 #ifndef BN_DIV2W
00210 #define BN_DIV2W
00211 #endif
00212 #define BN_ULLONG unsigned long
00213 #define BN_ULONG unsigned short
00214 #define BN_LONG short
00215 #define BN_BITS 32
00216 #define BN_BYTES 2
00217 #define BN_BITS2 16
00218 #define BN_BITS4 8
00219 #define BN_MASK (0xffffffff)
00220 #define BN_MASK2 (0xffff)
00221 #define BN_MASK2l (0xff)
00222 #define BN_MASK2h1 (0xff80)
00223 #define BN_MASK2h (0xff00)
00224 #define BN_TBIT (0x8000)
00225 #define BN_DEC_CONV (100000)
00226 #define BN_DEC_FMT1 "%u"
00227 #define BN_DEC_FMT2 "%05u"
00228 #define BN_DEC_NUM 5
00229 #endif
00230
00231 #ifdef EIGHT_BIT
00232 #ifndef BN_DIV2W
00233 #define BN_DIV2W
00234 #endif
00235 #define BN_ULLONG unsigned short
00236 #define BN_ULONG unsigned char
00237 #define BN_LONG char
00238 #define BN_BITS 16
00239 #define BN_BYTES 1
00240 #define BN_BITS2 8
00241 #define BN_BITS4 4
00242 #define BN_MASK (0xffff)
00243 #define BN_MASK2 (0xff)
00244 #define BN_MASK2l (0xf)
00245 #define BN_MASK2h1 (0xf8)
00246 #define BN_MASK2h (0xf0)
00247 #define BN_TBIT (0x80)
00248 #define BN_DEC_CONV (100)
00249 #define BN_DEC_FMT1 "%u"
00250 #define BN_DEC_FMT2 "%02u"
00251 #define BN_DEC_NUM 2
00252 #endif
00253
00254 #define BN_DEFAULT_BITS 1280
00255
00256 #define BN_FLG_MALLOCED 0x01
00257 #define BN_FLG_STATIC_DATA 0x02
00258 #define BN_FLG_EXP_CONSTTIME 0x04
00259
00260 #ifndef OPENSSL_NO_DEPRECATED
00261 #define BN_FLG_FREE 0x8000
00262 #endif
00263 #define BN_set_flags(b,n) ((b)->flags|=(n))
00264 #define BN_get_flags(b,n) ((b)->flags&(n))
00265
00266
00267
00268 #define BN_with_flags(dest,b,n) ((dest)->d=(b)->d, \
00269 (dest)->top=(b)->top, \
00270 (dest)->dmax=(b)->dmax, \
00271 (dest)->neg=(b)->neg, \
00272 (dest)->flags=(((dest)->flags & BN_FLG_MALLOCED) \
00273 | ((b)->flags & ~BN_FLG_MALLOCED) \
00274 | BN_FLG_STATIC_DATA \
00275 | (n)))
00276
00277
00278 #if 0
00279 typedef struct bignum_st BIGNUM;
00280
00281 typedef struct bignum_ctx BN_CTX;
00282 typedef struct bn_blinding_st BN_BLINDING;
00283 typedef struct bn_mont_ctx_st BN_MONT_CTX;
00284 typedef struct bn_recp_ctx_st BN_RECP_CTX;
00285 typedef struct bn_gencb_st BN_GENCB;
00286 #endif
00287
00288 struct bignum_st
00289 {
00290 BN_ULONG *d;
00291 int top;
00292
00293 int dmax;
00294 int neg;
00295 int flags;
00296 };
00297
00298
00299 struct bn_mont_ctx_st
00300 {
00301 int ri;
00302 BIGNUM RR;
00303 BIGNUM N;
00304 BIGNUM Ni;
00305
00306 BN_ULONG n0;
00307 int flags;
00308 };
00309
00310
00311
00312
00313 struct bn_recp_ctx_st
00314 {
00315 BIGNUM N;
00316 BIGNUM Nr;
00317 int num_bits;
00318 int shift;
00319 int flags;
00320 };
00321
00322
00323 struct bn_gencb_st
00324 {
00325 unsigned int ver;
00326 void *arg;
00327 union
00328 {
00329
00330 void (*cb_1)(int, int, void *);
00331
00332 int (*cb_2)(int, int, BN_GENCB *);
00333 } cb;
00334 };
00335
00336 int BN_GENCB_call(BN_GENCB *cb, int a, int b);
00337
00338 #define BN_GENCB_set_old(gencb, callback, cb_arg) { \
00339 BN_GENCB *tmp_gencb = (gencb); \
00340 tmp_gencb->ver = 1; \
00341 tmp_gencb->arg = (cb_arg); \
00342 tmp_gencb->cb.cb_1 = (callback); }
00343
00344 #define BN_GENCB_set(gencb, callback, cb_arg) { \
00345 BN_GENCB *tmp_gencb = (gencb); \
00346 tmp_gencb->ver = 2; \
00347 tmp_gencb->arg = (cb_arg); \
00348 tmp_gencb->cb.cb_2 = (callback); }
00349
00350 #define BN_prime_checks 0
00351
00352
00353
00354
00355
00356
00357
00358 #define BN_prime_checks_for_size(b) ((b) >= 1300 ? 2 : \
00359 (b) >= 850 ? 3 : \
00360 (b) >= 650 ? 4 : \
00361 (b) >= 550 ? 5 : \
00362 (b) >= 450 ? 6 : \
00363 (b) >= 400 ? 7 : \
00364 (b) >= 350 ? 8 : \
00365 (b) >= 300 ? 9 : \
00366 (b) >= 250 ? 12 : \
00367 (b) >= 200 ? 15 : \
00368 (b) >= 150 ? 18 : \
00369 27)
00370
00371 #define BN_num_bytes(a) ((BN_num_bits(a)+7)/8)
00372
00373
00374 #define BN_abs_is_word(a,w) ((((a)->top == 1) && ((a)->d[0] == (BN_ULONG)(w))) || \
00375 (((w) == 0) && ((a)->top == 0)))
00376 #define BN_is_zero(a) ((a)->top == 0)
00377 #define BN_is_one(a) (BN_abs_is_word((a),1) && !(a)->neg)
00378 #define BN_is_word(a,w) (BN_abs_is_word((a),(w)) && (!(w) || !(a)->neg))
00379 #define BN_is_odd(a) (((a)->top > 0) && ((a)->d[0] & 1))
00380
00381 #define BN_one(a) (BN_set_word((a),1))
00382 #define BN_zero_ex(a) \
00383 do { \
00384 BIGNUM *_tmp_bn = (a); \
00385 _tmp_bn->top = 0; \
00386 _tmp_bn->neg = 0; \
00387 } while(0)
00388 #ifdef OPENSSL_NO_DEPRECATED
00389 #define BN_zero(a) BN_zero_ex(a)
00390 #else
00391 #define BN_zero(a) (BN_set_word((a),0))
00392 #endif
00393
00394 IMPORT_C const BIGNUM *BN_value_one(void);
00395 IMPORT_C char * BN_options(void);
00396 IMPORT_C BN_CTX *BN_CTX_new(void);
00397 IMPORT_C void BN_CTX_free(BN_CTX *c);
00398 IMPORT_C void BN_CTX_start(BN_CTX *ctx);
00399 IMPORT_C BIGNUM *BN_CTX_get(BN_CTX *ctx);
00400 IMPORT_C void BN_CTX_end(BN_CTX *ctx);
00401 IMPORT_C int BN_rand(BIGNUM *rnd, int bits, int top,int bottom);
00402 IMPORT_C int BN_pseudo_rand(BIGNUM *rnd, int bits, int top,int bottom);
00403 IMPORT_C int BN_rand_range(BIGNUM *rnd, BIGNUM *range);
00404 IMPORT_C int BN_pseudo_rand_range(BIGNUM *rnd, BIGNUM *range);
00405 IMPORT_C int BN_num_bits(const BIGNUM *a);
00406 IMPORT_C int BN_num_bits_word(BN_ULONG);
00407 IMPORT_C BIGNUM *BN_new(void);
00408 IMPORT_C void BN_init(BIGNUM *);
00409 IMPORT_C void BN_clear_free(BIGNUM *a);
00410 IMPORT_C BIGNUM *BN_copy(BIGNUM *a, const BIGNUM *b);
00411 IMPORT_C void BN_swap(BIGNUM *a, BIGNUM *b);
00412 IMPORT_C BIGNUM *BN_bin2bn(const unsigned char *s,int len,BIGNUM *ret);
00413 IMPORT_C int BN_bn2bin(const BIGNUM *a, unsigned char *to);
00414 IMPORT_C BIGNUM *BN_mpi2bn(const unsigned char *s,int len,BIGNUM *ret);
00415 IMPORT_C int BN_bn2mpi(const BIGNUM *a, unsigned char *to);
00416 IMPORT_C int BN_sub(BIGNUM *r, const BIGNUM *a, const BIGNUM *b);
00417 IMPORT_C int BN_usub(BIGNUM *r, const BIGNUM *a, const BIGNUM *b);
00418 IMPORT_C int BN_uadd(BIGNUM *r, const BIGNUM *a, const BIGNUM *b);
00419 IMPORT_C int BN_add(BIGNUM *r, const BIGNUM *a, const BIGNUM *b);
00420 IMPORT_C int BN_mul(BIGNUM *r, const BIGNUM *a, const BIGNUM *b, BN_CTX *ctx);
00421 IMPORT_C int BN_sqr(BIGNUM *r, const BIGNUM *a,BN_CTX *ctx);
00422
00423 IMPORT_C void BN_set_negative(BIGNUM *b, int n);
00424
00425 #define BN_is_negative(a) ((a)->neg != 0)
00426
00427 IMPORT_C int BN_div(BIGNUM *dv, BIGNUM *rem, const BIGNUM *m, const BIGNUM *d,
00428 BN_CTX *ctx);
00429 #define BN_mod(rem,m,d,ctx) BN_div(NULL,(rem),(m),(d),(ctx))
00430 IMPORT_C int BN_nnmod(BIGNUM *r, const BIGNUM *m, const BIGNUM *d, BN_CTX *ctx);
00431 IMPORT_C int BN_mod_add(BIGNUM *r, const BIGNUM *a, const BIGNUM *b, const BIGNUM *m, BN_CTX *ctx);
00432 IMPORT_C int BN_mod_add_quick(BIGNUM *r, const BIGNUM *a, const BIGNUM *b, const BIGNUM *m);
00433 IMPORT_C int BN_mod_sub(BIGNUM *r, const BIGNUM *a, const BIGNUM *b, const BIGNUM *m, BN_CTX *ctx);
00434 IMPORT_C int BN_mod_sub_quick(BIGNUM *r, const BIGNUM *a, const BIGNUM *b, const BIGNUM *m);
00435 IMPORT_C int BN_mod_mul(BIGNUM *r, const BIGNUM *a, const BIGNUM *b,
00436 const BIGNUM *m, BN_CTX *ctx);
00437 IMPORT_C int BN_mod_sqr(BIGNUM *r, const BIGNUM *a, const BIGNUM *m, BN_CTX *ctx);
00438 IMPORT_C int BN_mod_lshift1(BIGNUM *r, const BIGNUM *a, const BIGNUM *m, BN_CTX *ctx);
00439 IMPORT_C int BN_mod_lshift1_quick(BIGNUM *r, const BIGNUM *a, const BIGNUM *m);
00440 IMPORT_C int BN_mod_lshift(BIGNUM *r, const BIGNUM *a, int n, const BIGNUM *m, BN_CTX *ctx);
00441 IMPORT_C int BN_mod_lshift_quick(BIGNUM *r, const BIGNUM *a, int n, const BIGNUM *m);
00442
00443 IMPORT_C BN_ULONG BN_mod_word(const BIGNUM *a, BN_ULONG w);
00444 IMPORT_C BN_ULONG BN_div_word(BIGNUM *a, BN_ULONG w);
00445 IMPORT_C int BN_mul_word(BIGNUM *a, BN_ULONG w);
00446 IMPORT_C int BN_add_word(BIGNUM *a, BN_ULONG w);
00447 IMPORT_C int BN_sub_word(BIGNUM *a, BN_ULONG w);
00448 IMPORT_C int BN_set_word(BIGNUM *a, BN_ULONG w);
00449 IMPORT_C BN_ULONG BN_get_word(const BIGNUM *a);
00450
00451 IMPORT_C int BN_cmp(const BIGNUM *a, const BIGNUM *b);
00452 IMPORT_C void BN_free(BIGNUM *a);
00453 IMPORT_C int BN_is_bit_set(const BIGNUM *a, int n);
00454 IMPORT_C int BN_lshift(BIGNUM *r, const BIGNUM *a, int n);
00455 IMPORT_C int BN_lshift1(BIGNUM *r, const BIGNUM *a);
00456 IMPORT_C int BN_exp(BIGNUM *r, const BIGNUM *a, const BIGNUM *p,BN_CTX *ctx);
00457
00458 IMPORT_C int BN_mod_exp(BIGNUM *r, const BIGNUM *a, const BIGNUM *p,
00459 const BIGNUM *m,BN_CTX *ctx);
00460 IMPORT_C int BN_mod_exp_mont(BIGNUM *r, const BIGNUM *a, const BIGNUM *p,
00461 const BIGNUM *m, BN_CTX *ctx, BN_MONT_CTX *m_ctx);
00462 IMPORT_C int BN_mod_exp_mont_consttime(BIGNUM *rr, const BIGNUM *a, const BIGNUM *p,
00463 const BIGNUM *m, BN_CTX *ctx, BN_MONT_CTX *in_mont);
00464 IMPORT_C int BN_mod_exp_mont_word(BIGNUM *r, BN_ULONG a, const BIGNUM *p,
00465 const BIGNUM *m, BN_CTX *ctx, BN_MONT_CTX *m_ctx);
00466 IMPORT_C int BN_mod_exp2_mont(BIGNUM *r, const BIGNUM *a1, const BIGNUM *p1,
00467 const BIGNUM *a2, const BIGNUM *p2,const BIGNUM *m,
00468 BN_CTX *ctx,BN_MONT_CTX *m_ctx);
00469 IMPORT_C int BN_mod_exp_simple(BIGNUM *r, const BIGNUM *a, const BIGNUM *p,
00470 const BIGNUM *m,BN_CTX *ctx);
00471
00472 IMPORT_C int BN_mask_bits(BIGNUM *a,int n);
00473 #ifndef OPENSSL_NO_FP_API
00474 IMPORT_C int BN_print_fp(FILE *fp, const BIGNUM *a);
00475 #endif
00476 #ifdef HEADER_BIO_H
00477 IMPORT_C int BN_print(BIO *fp, const BIGNUM *a);
00478 #else
00479 IMPORT_C int BN_print(void *fp, const BIGNUM *a);
00480 #endif
00481 IMPORT_C int BN_reciprocal(BIGNUM *r, const BIGNUM *m, int len, BN_CTX *ctx);
00482 IMPORT_C int BN_rshift(BIGNUM *r, const BIGNUM *a, int n);
00483 IMPORT_C int BN_rshift1(BIGNUM *r, const BIGNUM *a);
00484 IMPORT_C void BN_clear(BIGNUM *a);
00485 IMPORT_C BIGNUM *BN_dup(const BIGNUM *a);
00486 IMPORT_C int BN_ucmp(const BIGNUM *a, const BIGNUM *b);
00487 IMPORT_C int BN_set_bit(BIGNUM *a, int n);
00488 IMPORT_C int BN_clear_bit(BIGNUM *a, int n);
00489 IMPORT_C char * BN_bn2hex(const BIGNUM *a);
00490 IMPORT_C char * BN_bn2dec(const BIGNUM *a);
00491 IMPORT_C int BN_hex2bn(BIGNUM **a, const char *str);
00492 IMPORT_C int BN_dec2bn(BIGNUM **a, const char *str);
00493 IMPORT_C int BN_gcd(BIGNUM *r,const BIGNUM *a,const BIGNUM *b,BN_CTX *ctx);
00494 IMPORT_C int BN_kronecker(const BIGNUM *a,const BIGNUM *b,BN_CTX *ctx);
00495 IMPORT_C BIGNUM *BN_mod_inverse(BIGNUM *ret,
00496 const BIGNUM *a, const BIGNUM *n,BN_CTX *ctx);
00497 IMPORT_C BIGNUM *BN_mod_sqrt(BIGNUM *ret,
00498 const BIGNUM *a, const BIGNUM *n,BN_CTX *ctx);
00499
00500
00501
00502 IMPORT_C int BN_generate_prime_ex(BIGNUM *ret,int bits,int safe, const BIGNUM *add,
00503 const BIGNUM *rem, BN_GENCB *cb);
00504 IMPORT_C int BN_is_prime_ex(const BIGNUM *p,int nchecks, BN_CTX *ctx, BN_GENCB *cb);
00505 IMPORT_C int BN_is_prime_fasttest_ex(const BIGNUM *p,int nchecks, BN_CTX *ctx,
00506 int do_trial_division, BN_GENCB *cb);
00507
00508 IMPORT_C BN_MONT_CTX *BN_MONT_CTX_new(void );
00509 IMPORT_C void BN_MONT_CTX_init(BN_MONT_CTX *ctx);
00510 IMPORT_C int BN_mod_mul_montgomery(BIGNUM *r,const BIGNUM *a,const BIGNUM *b,
00511 BN_MONT_CTX *mont, BN_CTX *ctx);
00512 #define BN_to_montgomery(r,a,mont,ctx) BN_mod_mul_montgomery(\
00513 (r),(a),&((mont)->RR),(mont),(ctx))
00514 IMPORT_C int BN_from_montgomery(BIGNUM *r,const BIGNUM *a,
00515 BN_MONT_CTX *mont, BN_CTX *ctx);
00516 IMPORT_C void BN_MONT_CTX_free(BN_MONT_CTX *mont);
00517 IMPORT_C int BN_MONT_CTX_set(BN_MONT_CTX *mont,const BIGNUM *mod,BN_CTX *ctx);
00518 IMPORT_C BN_MONT_CTX *BN_MONT_CTX_copy(BN_MONT_CTX *to,BN_MONT_CTX *from);
00519 IMPORT_C BN_MONT_CTX *BN_MONT_CTX_set_locked(BN_MONT_CTX **pmont, int lock,
00520 const BIGNUM *mod, BN_CTX *ctx);
00521
00522
00523 #define BN_BLINDING_NO_UPDATE 0x00000001
00524 #define BN_BLINDING_NO_RECREATE 0x00000002
00525
00526 IMPORT_C BN_BLINDING *BN_BLINDING_new(const BIGNUM *A, const BIGNUM *Ai, BIGNUM *mod);
00527 IMPORT_C void BN_BLINDING_free(BN_BLINDING *b);
00528 IMPORT_C int BN_BLINDING_update(BN_BLINDING *b,BN_CTX *ctx);
00529 IMPORT_C int BN_BLINDING_convert(BIGNUM *n, BN_BLINDING *b, BN_CTX *ctx);
00530 IMPORT_C int BN_BLINDING_invert(BIGNUM *n, BN_BLINDING *b, BN_CTX *ctx);
00531 IMPORT_C int BN_BLINDING_convert_ex(BIGNUM *n, BIGNUM *r, BN_BLINDING *b, BN_CTX *);
00532 IMPORT_C int BN_BLINDING_invert_ex(BIGNUM *n, const BIGNUM *r, BN_BLINDING *b, BN_CTX *);
00533 IMPORT_C unsigned long BN_BLINDING_get_thread_id(const BN_BLINDING *);
00534 IMPORT_C void BN_BLINDING_set_thread_id(BN_BLINDING *, unsigned long);
00535 IMPORT_C unsigned long BN_BLINDING_get_flags(const BN_BLINDING *);
00536 IMPORT_C void BN_BLINDING_set_flags(BN_BLINDING *, unsigned long);
00537 IMPORT_C BN_BLINDING *BN_BLINDING_create_param(BN_BLINDING *b,
00538 const BIGNUM *e, BIGNUM *m, BN_CTX *ctx,
00539 int (*bn_mod_exp)(BIGNUM *r, const BIGNUM *a, const BIGNUM *p,
00540 const BIGNUM *m, BN_CTX *ctx, BN_MONT_CTX *m_ctx),
00541 BN_MONT_CTX *m_ctx);
00542
00543
00544 IMPORT_C void BN_RECP_CTX_init(BN_RECP_CTX *recp);
00545 IMPORT_C BN_RECP_CTX *BN_RECP_CTX_new(void);
00546 IMPORT_C void BN_RECP_CTX_free(BN_RECP_CTX *recp);
00547 IMPORT_C int BN_RECP_CTX_set(BN_RECP_CTX *recp,const BIGNUM *rdiv,BN_CTX *ctx);
00548 IMPORT_C int BN_mod_mul_reciprocal(BIGNUM *r, const BIGNUM *x, const BIGNUM *y,
00549 BN_RECP_CTX *recp,BN_CTX *ctx);
00550 IMPORT_C int BN_mod_exp_recp(BIGNUM *r, const BIGNUM *a, const BIGNUM *p,
00551 const BIGNUM *m, BN_CTX *ctx);
00552 IMPORT_C int BN_div_recp(BIGNUM *dv, BIGNUM *rem, const BIGNUM *m,
00553 BN_RECP_CTX *recp, BN_CTX *ctx);
00554
00555
00556
00557
00558
00559
00560
00561
00562
00563
00564 IMPORT_C int BN_GF2m_add(BIGNUM *r, const BIGNUM *a, const BIGNUM *b);
00565 #define BN_GF2m_sub(r, a, b) BN_GF2m_add(r, a, b)
00566 IMPORT_C int BN_GF2m_mod(BIGNUM *r, const BIGNUM *a, const BIGNUM *p);
00567 IMPORT_C int BN_GF2m_mod_mul(BIGNUM *r, const BIGNUM *a, const BIGNUM *b,
00568 const BIGNUM *p, BN_CTX *ctx);
00569 IMPORT_C int BN_GF2m_mod_sqr(BIGNUM *r, const BIGNUM *a, const BIGNUM *p,
00570 BN_CTX *ctx);
00571 IMPORT_C int BN_GF2m_mod_inv(BIGNUM *r, const BIGNUM *b, const BIGNUM *p,
00572 BN_CTX *ctx);
00573 IMPORT_C int BN_GF2m_mod_div(BIGNUM *r, const BIGNUM *a, const BIGNUM *b,
00574 const BIGNUM *p, BN_CTX *ctx);
00575 IMPORT_C int BN_GF2m_mod_exp(BIGNUM *r, const BIGNUM *a, const BIGNUM *b,
00576 const BIGNUM *p, BN_CTX *ctx);
00577 IMPORT_C int BN_GF2m_mod_sqrt(BIGNUM *r, const BIGNUM *a, const BIGNUM *p,
00578 BN_CTX *ctx);
00579 IMPORT_C int BN_GF2m_mod_solve_quad(BIGNUM *r, const BIGNUM *a, const BIGNUM *p,
00580 BN_CTX *ctx);
00581 #define BN_GF2m_cmp(a, b) BN_ucmp((a), (b))
00582
00583
00584
00585
00586
00587 IMPORT_C int BN_GF2m_mod_arr(BIGNUM *r, const BIGNUM *a, const unsigned int p[]);
00588
00589 IMPORT_C int BN_GF2m_mod_mul_arr(BIGNUM *r, const BIGNUM *a, const BIGNUM *b,
00590 const unsigned int p[], BN_CTX *ctx);
00591 IMPORT_C int BN_GF2m_mod_sqr_arr(BIGNUM *r, const BIGNUM *a, const unsigned int p[],
00592 BN_CTX *ctx);
00593 IMPORT_C int BN_GF2m_mod_inv_arr(BIGNUM *r, const BIGNUM *b, const unsigned int p[],
00594 BN_CTX *ctx);
00595 IMPORT_C int BN_GF2m_mod_div_arr(BIGNUM *r, const BIGNUM *a, const BIGNUM *b,
00596 const unsigned int p[], BN_CTX *ctx);
00597 IMPORT_C int BN_GF2m_mod_exp_arr(BIGNUM *r, const BIGNUM *a, const BIGNUM *b,
00598 const unsigned int p[], BN_CTX *ctx);
00599 IMPORT_C int BN_GF2m_mod_sqrt_arr(BIGNUM *r, const BIGNUM *a,
00600 const unsigned int p[], BN_CTX *ctx);
00601 IMPORT_C int BN_GF2m_mod_solve_quad_arr(BIGNUM *r, const BIGNUM *a,
00602 const unsigned int p[], BN_CTX *ctx);
00603 IMPORT_C int BN_GF2m_poly2arr(const BIGNUM *a, unsigned int p[], int max);
00604 IMPORT_C int BN_GF2m_arr2poly(const unsigned int p[], BIGNUM *a);
00605
00606
00607
00608 IMPORT_C int BN_nist_mod_192(BIGNUM *r, const BIGNUM *a, const BIGNUM *p, BN_CTX *ctx);
00609 IMPORT_C int BN_nist_mod_224(BIGNUM *r, const BIGNUM *a, const BIGNUM *p, BN_CTX *ctx);
00610 IMPORT_C int BN_nist_mod_256(BIGNUM *r, const BIGNUM *a, const BIGNUM *p, BN_CTX *ctx);
00611 IMPORT_C int BN_nist_mod_384(BIGNUM *r, const BIGNUM *a, const BIGNUM *p, BN_CTX *ctx);
00612 IMPORT_C int BN_nist_mod_521(BIGNUM *r, const BIGNUM *a, const BIGNUM *p, BN_CTX *ctx);
00613
00614 IMPORT_C const BIGNUM *BN_get0_nist_prime_192(void);
00615 IMPORT_C const BIGNUM *BN_get0_nist_prime_224(void);
00616 IMPORT_C const BIGNUM *BN_get0_nist_prime_256(void);
00617 IMPORT_C const BIGNUM *BN_get0_nist_prime_384(void);
00618 IMPORT_C const BIGNUM *BN_get0_nist_prime_521(void);
00619
00620
00621
00622 #define bn_expand(a,bits) ((((((bits+BN_BITS2-1))/BN_BITS2)) <= (a)->dmax)?\
00623 (a):bn_expand2((a),(bits+BN_BITS2-1)/BN_BITS2))
00624 #define bn_wexpand(a,words) (((words) <= (a)->dmax)?(a):bn_expand2((a),(words)))
00625 BIGNUM *bn_expand2(BIGNUM *a, int words);
00626
00627
00628
00629
00630
00631
00632
00633
00634
00635
00636
00637
00638
00639
00640
00641
00642
00643
00644
00645
00646
00647
00648
00649
00650
00651
00652
00653
00654
00655 #ifdef BN_DEBUG
00656
00657
00658 #include <assert.h>
00659
00660 #ifdef BN_DEBUG_RAND
00661
00662 #ifndef RAND_pseudo_bytes
00663 int RAND_pseudo_bytes(unsigned char *buf,int num);
00664 #define BN_DEBUG_TRIX
00665 #endif
00666 #define bn_pollute(a) \
00667 do { \
00668 const BIGNUM *_bnum1 = (a); \
00669 if(_bnum1->top < _bnum1->dmax) { \
00670 unsigned char _tmp_char; \
00671
00672
00673 \
00674 BN_ULONG *_not_const; \
00675 memcpy(&_not_const, &_bnum1->d, sizeof(BN_ULONG*)); \
00676 RAND_pseudo_bytes(&_tmp_char, 1); \
00677 memset((unsigned char *)(_not_const + _bnum1->top), _tmp_char, \
00678 (_bnum1->dmax - _bnum1->top) * sizeof(BN_ULONG)); \
00679 } \
00680 } while(0)
00681 #ifdef BN_DEBUG_TRIX
00682 #undef RAND_pseudo_bytes
00683 #endif
00684 #else
00685 #define bn_pollute(a)
00686 #endif
00687 #define bn_check_top(a) \
00688 do { \
00689 const BIGNUM *_bnum2 = (a); \
00690 if (_bnum2 != NULL) { \
00691 assert((_bnum2->top == 0) || \
00692 (_bnum2->d[_bnum2->top - 1] != 0)); \
00693 bn_pollute(_bnum2); \
00694 } \
00695 } while(0)
00696
00697 #define bn_fix_top(a) bn_check_top(a)
00698
00699 #else
00700
00701 #define bn_pollute(a)
00702 #define bn_check_top(a)
00703 #define bn_fix_top(a) bn_correct_top(a)
00704
00705 #endif
00706
00707 #define bn_correct_top(a) \
00708 { \
00709 BN_ULONG *ftl; \
00710 if ((a)->top > 0) \
00711 { \
00712 for (ftl= &((a)->d[(a)->top-1]); (a)->top > 0; (a)->top--) \
00713 if (*(ftl--)) break; \
00714 } \
00715 bn_pollute(a); \
00716 }
00717
00718 IMPORT_C BN_ULONG bn_mul_add_words(BN_ULONG *rp, const BN_ULONG *ap, int num, BN_ULONG w);
00719 IMPORT_C BN_ULONG bn_mul_words(BN_ULONG *rp, const BN_ULONG *ap, int num, BN_ULONG w);
00720 IMPORT_C void bn_sqr_words(BN_ULONG *rp, const BN_ULONG *ap, int num);
00721 IMPORT_C BN_ULONG bn_div_words(BN_ULONG h, BN_ULONG l, BN_ULONG d);
00722 IMPORT_C BN_ULONG bn_add_words(BN_ULONG *rp, const BN_ULONG *ap, const BN_ULONG *bp,int num);
00723 IMPORT_C BN_ULONG bn_sub_words(BN_ULONG *rp, const BN_ULONG *ap, const BN_ULONG *bp,int num);
00724
00725
00726 IMPORT_C BIGNUM *get_rfc2409_prime_768(BIGNUM *bn);
00727 IMPORT_C BIGNUM *get_rfc2409_prime_1024(BIGNUM *bn);
00728
00729
00730 IMPORT_C BIGNUM *get_rfc3526_prime_1536(BIGNUM *bn);
00731 IMPORT_C BIGNUM *get_rfc3526_prime_2048(BIGNUM *bn);
00732 IMPORT_C BIGNUM *get_rfc3526_prime_3072(BIGNUM *bn);
00733 IMPORT_C BIGNUM *get_rfc3526_prime_4096(BIGNUM *bn);
00734 IMPORT_C BIGNUM *get_rfc3526_prime_6144(BIGNUM *bn);
00735 IMPORT_C BIGNUM *get_rfc3526_prime_8192(BIGNUM *bn);
00736
00737 IMPORT_C int BN_bntest_rand(BIGNUM *rnd, int bits, int top,int bottom);
00738
00739
00740
00741
00742
00743 void ERR_load_BN_strings(void);
00744
00745
00746
00747
00748 #define BN_F_BNRAND 127
00749 #define BN_F_BN_BLINDING_CONVERT_EX 100
00750 #define BN_F_BN_BLINDING_CREATE_PARAM 128
00751 #define BN_F_BN_BLINDING_INVERT_EX 101
00752 #define BN_F_BN_BLINDING_NEW 102
00753 #define BN_F_BN_BLINDING_UPDATE 103
00754 #define BN_F_BN_BN2DEC 104
00755 #define BN_F_BN_BN2HEX 105
00756 #define BN_F_BN_CTX_GET 116
00757 #define BN_F_BN_CTX_NEW 106
00758 #define BN_F_BN_CTX_START 129
00759 #define BN_F_BN_DIV 107
00760 #define BN_F_BN_DIV_RECP 130
00761 #define BN_F_BN_EXP 123
00762 #define BN_F_BN_EXPAND2 108
00763 #define BN_F_BN_EXPAND_INTERNAL 120
00764 #define BN_F_BN_GF2M_MOD 131
00765 #define BN_F_BN_GF2M_MOD_EXP 132
00766 #define BN_F_BN_GF2M_MOD_MUL 133
00767 #define BN_F_BN_GF2M_MOD_SOLVE_QUAD 134
00768 #define BN_F_BN_GF2M_MOD_SOLVE_QUAD_ARR 135
00769 #define BN_F_BN_GF2M_MOD_SQR 136
00770 #define BN_F_BN_GF2M_MOD_SQRT 137
00771 #define BN_F_BN_MOD_EXP2_MONT 118
00772 #define BN_F_BN_MOD_EXP_MONT 109
00773 #define BN_F_BN_MOD_EXP_MONT_CONSTTIME 124
00774 #define BN_F_BN_MOD_EXP_MONT_WORD 117
00775 #define BN_F_BN_MOD_EXP_RECP 125
00776 #define BN_F_BN_MOD_EXP_SIMPLE 126
00777 #define BN_F_BN_MOD_INVERSE 110
00778 #define BN_F_BN_MOD_LSHIFT_QUICK 119
00779 #define BN_F_BN_MOD_MUL_RECIPROCAL 111
00780 #define BN_F_BN_MOD_SQRT 121
00781 #define BN_F_BN_MPI2BN 112
00782 #define BN_F_BN_NEW 113
00783 #define BN_F_BN_RAND 114
00784 #define BN_F_BN_RAND_RANGE 122
00785 #define BN_F_BN_USUB 115
00786
00787
00788 #define BN_R_ARG2_LT_ARG3 100
00789 #define BN_R_BAD_RECIPROCAL 101
00790 #define BN_R_BIGNUM_TOO_LONG 114
00791 #define BN_R_CALLED_WITH_EVEN_MODULUS 102
00792 #define BN_R_DIV_BY_ZERO 103
00793 #define BN_R_ENCODING_ERROR 104
00794 #define BN_R_EXPAND_ON_STATIC_BIGNUM_DATA 105
00795 #define BN_R_INPUT_NOT_REDUCED 110
00796 #define BN_R_INVALID_LENGTH 106
00797 #define BN_R_INVALID_RANGE 115
00798 #define BN_R_NOT_A_SQUARE 111
00799 #define BN_R_NOT_INITIALIZED 107
00800 #define BN_R_NO_INVERSE 108
00801 #define BN_R_NO_SOLUTION 116
00802 #define BN_R_P_IS_NOT_PRIME 112
00803 #define BN_R_TOO_MANY_ITERATIONS 113
00804 #define BN_R_TOO_MANY_TEMPORARY_VARIABLES 109
00805
00806 #ifdef __cplusplus
00807 }
00808 #endif
00809 #endif