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