📄 bn.h
字号:
void BN_set_params(int mul,int high,int low,int mont);int BN_get_params(int which); /* 0, mul, 1 high, 2 low, 3 mont */#endifvoid BN_RECP_CTX_init(BN_RECP_CTX *recp);BN_RECP_CTX *BN_RECP_CTX_new(void);void BN_RECP_CTX_free(BN_RECP_CTX *recp);int BN_RECP_CTX_set(BN_RECP_CTX *recp,const BIGNUM *rdiv,BN_CTX *ctx);int BN_mod_mul_reciprocal(BIGNUM *r, const BIGNUM *x, const BIGNUM *y, BN_RECP_CTX *recp,BN_CTX *ctx);int BN_mod_exp_recp(BIGNUM *r, const BIGNUM *a, const BIGNUM *p, const BIGNUM *m, BN_CTX *ctx);int BN_div_recp(BIGNUM *dv, BIGNUM *rem, const BIGNUM *m, BN_RECP_CTX *recp, BN_CTX *ctx);/* Functions for arithmetic over binary polynomials represented by BIGNUMs. * * The BIGNUM::neg property of BIGNUMs representing binary polynomials is * ignored. * * Note that input arguments are not const so that their bit arrays can * be expanded to the appropriate size if needed. */int BN_GF2m_add(BIGNUM *r, const BIGNUM *a, const BIGNUM *b); /*r = a + b*/#define BN_GF2m_sub(r, a, b) BN_GF2m_add(r, a, b)int BN_GF2m_mod(BIGNUM *r, const BIGNUM *a, const BIGNUM *p); /*r=a mod p*/int BN_GF2m_mod_mul(BIGNUM *r, const BIGNUM *a, const BIGNUM *b, const BIGNUM *p, BN_CTX *ctx); /* r = (a * b) mod p */int BN_GF2m_mod_sqr(BIGNUM *r, const BIGNUM *a, const BIGNUM *p, BN_CTX *ctx); /* r = (a * a) mod p */int BN_GF2m_mod_inv(BIGNUM *r, const BIGNUM *b, const BIGNUM *p, BN_CTX *ctx); /* r = (1 / b) mod p */int BN_GF2m_mod_div(BIGNUM *r, const BIGNUM *a, const BIGNUM *b, const BIGNUM *p, BN_CTX *ctx); /* r = (a / b) mod p */int BN_GF2m_mod_exp(BIGNUM *r, const BIGNUM *a, const BIGNUM *b, const BIGNUM *p, BN_CTX *ctx); /* r = (a ^ b) mod p */int BN_GF2m_mod_sqrt(BIGNUM *r, const BIGNUM *a, const BIGNUM *p, BN_CTX *ctx); /* r = sqrt(a) mod p */int BN_GF2m_mod_solve_quad(BIGNUM *r, const BIGNUM *a, const BIGNUM *p, BN_CTX *ctx); /* r^2 + r = a mod p */#define BN_GF2m_cmp(a, b) BN_ucmp((a), (b))/* Some functions allow for representation of the irreducible polynomials * as an unsigned int[], say p. The irreducible f(t) is then of the form: * t^p[0] + t^p[1] + ... + t^p[k] * where m = p[0] > p[1] > ... > p[k] = 0. */int BN_GF2m_mod_arr(BIGNUM *r, const BIGNUM *a, const unsigned int p[]); /* r = a mod p */int BN_GF2m_mod_mul_arr(BIGNUM *r, const BIGNUM *a, const BIGNUM *b, const unsigned int p[], BN_CTX *ctx); /* r = (a * b) mod p */int BN_GF2m_mod_sqr_arr(BIGNUM *r, const BIGNUM *a, const unsigned int p[], BN_CTX *ctx); /* r = (a * a) mod p */int BN_GF2m_mod_inv_arr(BIGNUM *r, const BIGNUM *b, const unsigned int p[], BN_CTX *ctx); /* r = (1 / b) mod p */int BN_GF2m_mod_div_arr(BIGNUM *r, const BIGNUM *a, const BIGNUM *b, const unsigned int p[], BN_CTX *ctx); /* r = (a / b) mod p */int BN_GF2m_mod_exp_arr(BIGNUM *r, const BIGNUM *a, const BIGNUM *b, const unsigned int p[], BN_CTX *ctx); /* r = (a ^ b) mod p */int BN_GF2m_mod_sqrt_arr(BIGNUM *r, const BIGNUM *a, const unsigned int p[], BN_CTX *ctx); /* r = sqrt(a) mod p */int BN_GF2m_mod_solve_quad_arr(BIGNUM *r, const BIGNUM *a, const unsigned int p[], BN_CTX *ctx); /* r^2 + r = a mod p */int BN_GF2m_poly2arr(const BIGNUM *a, unsigned int p[], int max);int BN_GF2m_arr2poly(const unsigned int p[], BIGNUM *a);/* faster mod functions for the 'NIST primes' * 0 <= a < p^2 */int BN_nist_mod_192(BIGNUM *r, const BIGNUM *a, const BIGNUM *p, BN_CTX *ctx);int BN_nist_mod_224(BIGNUM *r, const BIGNUM *a, const BIGNUM *p, BN_CTX *ctx);int BN_nist_mod_256(BIGNUM *r, const BIGNUM *a, const BIGNUM *p, BN_CTX *ctx);int BN_nist_mod_384(BIGNUM *r, const BIGNUM *a, const BIGNUM *p, BN_CTX *ctx);int BN_nist_mod_521(BIGNUM *r, const BIGNUM *a, const BIGNUM *p, BN_CTX *ctx);const BIGNUM *BN_get0_nist_prime_192(void);const BIGNUM *BN_get0_nist_prime_224(void);const BIGNUM *BN_get0_nist_prime_256(void);const BIGNUM *BN_get0_nist_prime_384(void);const BIGNUM *BN_get0_nist_prime_521(void);/* library internal functions */#define bn_expand(a,bits) ((((((bits+BN_BITS2-1))/BN_BITS2)) <= (a)->dmax)?\ (a):bn_expand2((a),(bits+BN_BITS2-1)/BN_BITS2))#define bn_wexpand(a,words) (((words) <= (a)->dmax)?(a):bn_expand2((a),(words)))BIGNUM *bn_expand2(BIGNUM *a, int words);#ifndef OPENSSL_NO_DEPRECATEDBIGNUM *bn_dup_expand(const BIGNUM *a, int words); /* unused */#endif/* Bignum consistency macros * There is one "API" macro, bn_fix_top(), for stripping leading zeroes from * bignum data after direct manipulations on the data. There is also an * "internal" macro, bn_check_top(), for verifying that there are no leading * zeroes. Unfortunately, some auditing is required due to the fact that * bn_fix_top() has become an overabused duct-tape because bignum data is * occasionally passed around in an inconsistent state. So the following * changes have been made to sort this out; * - bn_fix_top()s implementation has been moved to bn_correct_top() * - if BN_DEBUG isn't defined, bn_fix_top() maps to bn_correct_top(), and * bn_check_top() is as before. * - if BN_DEBUG *is* defined; * - bn_check_top() tries to pollute unused words even if the bignum 'top' is * consistent. (ed: only if BN_DEBUG_RAND is defined) * - bn_fix_top() maps to bn_check_top() rather than "fixing" anything. * The idea is to have debug builds flag up inconsistent bignums when they * occur. If that occurs in a bn_fix_top(), we examine the code in question; if * the use of bn_fix_top() was appropriate (ie. it follows directly after code * that manipulates the bignum) it is converted to bn_correct_top(), and if it * was not appropriate, we convert it permanently to bn_check_top() and track * down the cause of the bug. Eventually, no internal code should be using the * bn_fix_top() macro. External applications and libraries should try this with * their own code too, both in terms of building against the openssl headers * with BN_DEBUG defined *and* linking with a version of OpenSSL built with it * defined. This not only improves external code, it provides more test * coverage for openssl's own code. */#ifdef BN_DEBUG/* We only need assert() when debugging */#include <assert.h>#ifdef BN_DEBUG_RAND/* To avoid "make update" cvs wars due to BN_DEBUG, use some tricks */#ifndef RAND_pseudo_bytesint RAND_pseudo_bytes(unsigned char *buf,int num);#define BN_DEBUG_TRIX#endif#define bn_pollute(a) \ do { \ const BIGNUM *_bnum1 = (a); \ if(_bnum1->top < _bnum1->dmax) { \ unsigned char _tmp_char; \ /* We cast away const without the compiler knowing, any \ * *genuinely* constant variables that aren't mutable \ * wouldn't be constructed with top!=dmax. */ \ BN_ULONG *_not_const; \ memcpy(&_not_const, &_bnum1->d, sizeof(BN_ULONG*)); \ RAND_pseudo_bytes(&_tmp_char, 1); \ memset((unsigned char *)(_not_const + _bnum1->top), _tmp_char, \ (_bnum1->dmax - _bnum1->top) * sizeof(BN_ULONG)); \ } \ } while(0)#ifdef BN_DEBUG_TRIX#undef RAND_pseudo_bytes#endif#else#define bn_pollute(a)#endif#define bn_check_top(a) \ do { \ const BIGNUM *_bnum2 = (a); \ if (_bnum2 != NULL) { \ assert((_bnum2->top == 0) || \ (_bnum2->d[_bnum2->top - 1] != 0)); \ bn_pollute(_bnum2); \ } \ } while(0)#define bn_fix_top(a) bn_check_top(a)#else /* !BN_DEBUG */#define bn_pollute(a)#define bn_check_top(a)#define bn_fix_top(a) bn_correct_top(a)#endif#define bn_correct_top(a) \ { \ BN_ULONG *ftl; \ if ((a)->top > 0) \ { \ for (ftl= &((a)->d[(a)->top-1]); (a)->top > 0; (a)->top--) \ if (*(ftl--)) break; \ } \ bn_pollute(a); \ }BN_ULONG bn_mul_add_words(BN_ULONG *rp, const BN_ULONG *ap, int num, BN_ULONG w);BN_ULONG bn_mul_words(BN_ULONG *rp, const BN_ULONG *ap, int num, BN_ULONG w);void bn_sqr_words(BN_ULONG *rp, const BN_ULONG *ap, int num);BN_ULONG bn_div_words(BN_ULONG h, BN_ULONG l, BN_ULONG d);BN_ULONG bn_add_words(BN_ULONG *rp, const BN_ULONG *ap, const BN_ULONG *bp,int num);BN_ULONG bn_sub_words(BN_ULONG *rp, const BN_ULONG *ap, const BN_ULONG *bp,int num);/* Primes from RFC 2409 */BIGNUM *get_rfc2409_prime_768(BIGNUM *bn);BIGNUM *get_rfc2409_prime_1024(BIGNUM *bn);/* Primes from RFC 3526 */BIGNUM *get_rfc3526_prime_1536(BIGNUM *bn);BIGNUM *get_rfc3526_prime_2048(BIGNUM *bn);BIGNUM *get_rfc3526_prime_3072(BIGNUM *bn);BIGNUM *get_rfc3526_prime_4096(BIGNUM *bn);BIGNUM *get_rfc3526_prime_6144(BIGNUM *bn);BIGNUM *get_rfc3526_prime_8192(BIGNUM *bn);int BN_bntest_rand(BIGNUM *rnd, int bits, int top,int bottom);/* BEGIN ERROR CODES *//* The following lines are auto generated by the script mkerr.pl. Any changes * made after this point may be overwritten when the script is next run. */void ERR_load_BN_strings(void);/* Error codes for the BN functions. *//* Function codes. */#define BN_F_BNRAND 127#define BN_F_BN_BLINDING_CONVERT_EX 100#define BN_F_BN_BLINDING_CREATE_PARAM 128#define BN_F_BN_BLINDING_INVERT_EX 101#define BN_F_BN_BLINDING_NEW 102#define BN_F_BN_BLINDING_UPDATE 103#define BN_F_BN_BN2DEC 104#define BN_F_BN_BN2HEX 105#define BN_F_BN_CTX_GET 116#define BN_F_BN_CTX_NEW 106#define BN_F_BN_CTX_START 129#define BN_F_BN_DIV 107#define BN_F_BN_DIV_RECP 130#define BN_F_BN_EXP 123#define BN_F_BN_EXPAND2 108#define BN_F_BN_EXPAND_INTERNAL 120#define BN_F_BN_GF2M_MOD 131#define BN_F_BN_GF2M_MOD_EXP 132#define BN_F_BN_GF2M_MOD_MUL 133#define BN_F_BN_GF2M_MOD_SOLVE_QUAD 134#define BN_F_BN_GF2M_MOD_SOLVE_QUAD_ARR 135#define BN_F_BN_GF2M_MOD_SQR 136#define BN_F_BN_GF2M_MOD_SQRT 137#define BN_F_BN_MOD_EXP2_MONT 118#define BN_F_BN_MOD_EXP_MONT 109#define BN_F_BN_MOD_EXP_MONT_CONSTTIME 124#define BN_F_BN_MOD_EXP_MONT_WORD 117#define BN_F_BN_MOD_EXP_RECP 125#define BN_F_BN_MOD_EXP_SIMPLE 126#define BN_F_BN_MOD_INVERSE 110#define BN_F_BN_MOD_LSHIFT_QUICK 119#define BN_F_BN_MOD_MUL_RECIPROCAL 111#define BN_F_BN_MOD_SQRT 121#define BN_F_BN_MPI2BN 112#define BN_F_BN_NEW 113#define BN_F_BN_RAND 114#define BN_F_BN_RAND_RANGE 122#define BN_F_BN_USUB 115/* Reason codes. */#define BN_R_ARG2_LT_ARG3 100#define BN_R_BAD_RECIPROCAL 101#define BN_R_BIGNUM_TOO_LONG 114#define BN_R_CALLED_WITH_EVEN_MODULUS 102#define BN_R_DIV_BY_ZERO 103#define BN_R_ENCODING_ERROR 104#define BN_R_EXPAND_ON_STATIC_BIGNUM_DATA 105#define BN_R_INPUT_NOT_REDUCED 110#define BN_R_INVALID_LENGTH 106#define BN_R_INVALID_RANGE 115#define BN_R_NOT_A_SQUARE 111#define BN_R_NOT_INITIALIZED 107#define BN_R_NO_INVERSE 108#define BN_R_NO_SOLUTION 116#define BN_R_P_IS_NOT_PRIME 112#define BN_R_TOO_MANY_ITERATIONS 113#define BN_R_TOO_MANY_TEMPORARY_VARIABLES 109#ifdef __cplusplus}#endif#endif
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -