33#include <wolfssl/wolfcrypt/settings.h>
34#include <wolfssl/wolfcrypt/integer.h>
40typedef struct WOLFSSL_BIGNUM {
45#elif defined(USE_FAST_MATH) && !defined(HAVE_WOLF_BIGINT)
51#define BN_ULONG WOLFSSL_BN_ULONG
52#define WOLFSSL_BN_ULONG mp_digit
54typedef struct WOLFSSL_BN_CTX WOLFSSL_BN_CTX;
55typedef struct WOLFSSL_BN_GENCB WOLFSSL_BN_GENCB;
57WOLFSSL_API WOLFSSL_BN_CTX* wolfSSL_BN_CTX_new(
void);
58WOLFSSL_API
void wolfSSL_BN_CTX_init(WOLFSSL_BN_CTX*);
59WOLFSSL_API
void wolfSSL_BN_CTX_free(WOLFSSL_BN_CTX*);
61WOLFSSL_API WOLFSSL_BIGNUM* wolfSSL_BN_new(
void);
62#if defined(USE_FAST_MATH) && !defined(HAVE_WOLF_BIGINT)
63WOLFSSL_API
void wolfSSL_BN_init(WOLFSSL_BIGNUM *);
65WOLFSSL_API
void wolfSSL_BN_free(WOLFSSL_BIGNUM*);
66WOLFSSL_API
void wolfSSL_BN_clear_free(WOLFSSL_BIGNUM*);
67WOLFSSL_API
void wolfSSL_BN_clear(WOLFSSL_BIGNUM*);
70WOLFSSL_API
int wolfSSL_BN_sub(WOLFSSL_BIGNUM*,
const WOLFSSL_BIGNUM*,
71 const WOLFSSL_BIGNUM*);
72WOLFSSL_API
int wolfSSL_BN_mod(WOLFSSL_BIGNUM*,
const WOLFSSL_BIGNUM*,
73 const WOLFSSL_BIGNUM*,
const WOLFSSL_BN_CTX*);
75 const WOLFSSL_BIGNUM *p,
const WOLFSSL_BIGNUM *m, WOLFSSL_BN_CTX *ctx);
76WOLFSSL_API
int wolfSSL_BN_mod_mul(WOLFSSL_BIGNUM *r,
const WOLFSSL_BIGNUM *a,
77 const WOLFSSL_BIGNUM *b,
const WOLFSSL_BIGNUM *m, WOLFSSL_BN_CTX *ctx);
78WOLFSSL_API
const WOLFSSL_BIGNUM* wolfSSL_BN_value_one(
void);
81WOLFSSL_API
int wolfSSL_BN_num_bytes(
const WOLFSSL_BIGNUM*);
82WOLFSSL_API
int wolfSSL_BN_num_bits(
const WOLFSSL_BIGNUM*);
84WOLFSSL_API
int wolfSSL_BN_is_zero(
const WOLFSSL_BIGNUM*);
85WOLFSSL_API
int wolfSSL_BN_is_one(
const WOLFSSL_BIGNUM*);
86WOLFSSL_API
int wolfSSL_BN_is_odd(
const WOLFSSL_BIGNUM*);
87WOLFSSL_API
int wolfSSL_BN_is_negative(
const WOLFSSL_BIGNUM*);
88WOLFSSL_API
int wolfSSL_BN_is_word(
const WOLFSSL_BIGNUM*, WOLFSSL_BN_ULONG);
90WOLFSSL_API
int wolfSSL_BN_cmp(
const WOLFSSL_BIGNUM*,
const WOLFSSL_BIGNUM*);
92WOLFSSL_API
int wolfSSL_BN_bn2bin(
const WOLFSSL_BIGNUM*,
unsigned char*);
93WOLFSSL_API WOLFSSL_BIGNUM* wolfSSL_BN_bin2bn(
const unsigned char*,
int len,
96WOLFSSL_API
int wolfSSL_mask_bits(WOLFSSL_BIGNUM*,
int n);
98WOLFSSL_API
int wolfSSL_BN_pseudo_rand(WOLFSSL_BIGNUM*,
int bits,
int top,
100WOLFSSL_API
int wolfSSL_BN_rand(WOLFSSL_BIGNUM*,
int bits,
int top,
int bottom);
101WOLFSSL_API
int wolfSSL_BN_is_bit_set(
const WOLFSSL_BIGNUM*,
int n);
102WOLFSSL_API
int wolfSSL_BN_hex2bn(WOLFSSL_BIGNUM**,
const char* str);
104WOLFSSL_API WOLFSSL_BIGNUM* wolfSSL_BN_dup(
const WOLFSSL_BIGNUM*);
105WOLFSSL_API WOLFSSL_BIGNUM* wolfSSL_BN_copy(WOLFSSL_BIGNUM*,
106 const WOLFSSL_BIGNUM*);
108WOLFSSL_API
int wolfSSL_BN_dec2bn(WOLFSSL_BIGNUM**,
const char* str);
109WOLFSSL_API
char* wolfSSL_BN_bn2dec(
const WOLFSSL_BIGNUM*);
111WOLFSSL_API
int wolfSSL_BN_lshift(WOLFSSL_BIGNUM*,
const WOLFSSL_BIGNUM*,
int);
112WOLFSSL_API
int wolfSSL_BN_add_word(WOLFSSL_BIGNUM*, WOLFSSL_BN_ULONG);
113WOLFSSL_API
int wolfSSL_BN_set_bit(WOLFSSL_BIGNUM*,
int);
114WOLFSSL_API
int wolfSSL_BN_clear_bit(WOLFSSL_BIGNUM*,
int);
115WOLFSSL_API
int wolfSSL_BN_set_word(WOLFSSL_BIGNUM*, WOLFSSL_BN_ULONG);
116WOLFSSL_API
unsigned long wolfSSL_BN_get_word(
const WOLFSSL_BIGNUM*);
118WOLFSSL_API
int wolfSSL_BN_add(WOLFSSL_BIGNUM*, WOLFSSL_BIGNUM*,
120WOLFSSL_API
int wolfSSL_BN_mod_add(WOLFSSL_BIGNUM *r,
const WOLFSSL_BIGNUM *a,
121 const WOLFSSL_BIGNUM *b,
const WOLFSSL_BIGNUM *m,
122 WOLFSSL_BN_CTX *ctx);
123WOLFSSL_API
char *wolfSSL_BN_bn2hex(
const WOLFSSL_BIGNUM*);
124WOLFSSL_API
int wolfSSL_BN_is_prime_ex(
const WOLFSSL_BIGNUM*,
int,
125 WOLFSSL_BN_CTX*, WOLFSSL_BN_GENCB*);
126WOLFSSL_API WOLFSSL_BN_ULONG wolfSSL_BN_mod_word(
const WOLFSSL_BIGNUM*,
128#if !defined(NO_FILESYSTEM) && !defined(NO_STDIO_FILESYSTEM)
129 WOLFSSL_API
int wolfSSL_BN_print_fp(XFILE,
const WOLFSSL_BIGNUM*);
131WOLFSSL_API
int wolfSSL_BN_rshift(WOLFSSL_BIGNUM*,
const WOLFSSL_BIGNUM*,
int);
132WOLFSSL_API WOLFSSL_BIGNUM *wolfSSL_BN_CTX_get(WOLFSSL_BN_CTX *ctx);
133WOLFSSL_API
void wolfSSL_BN_CTX_start(WOLFSSL_BN_CTX *ctx);
134WOLFSSL_API WOLFSSL_BIGNUM *wolfSSL_BN_mod_inverse(WOLFSSL_BIGNUM*, WOLFSSL_BIGNUM*,
135 const WOLFSSL_BIGNUM*, WOLFSSL_BN_CTX *ctx);
137typedef WOLFSSL_BIGNUM BIGNUM;
138typedef WOLFSSL_BN_CTX BN_CTX;
139typedef WOLFSSL_BN_GENCB BN_GENCB;
141#define BN_CTX_new wolfSSL_BN_CTX_new
142#define BN_CTX_init wolfSSL_BN_CTX_init
143#define BN_CTX_free wolfSSL_BN_CTX_free
145#define BN_new wolfSSL_BN_new
146#define BN_init wolfSSL_BN_init
147#define BN_free wolfSSL_BN_free
148#define BN_clear_free wolfSSL_BN_clear_free
149#define BN_clear wolfSSL_BN_clear
151#define BN_num_bytes wolfSSL_BN_num_bytes
152#define BN_num_bits wolfSSL_BN_num_bits
154#define BN_is_zero wolfSSL_BN_is_zero
155#define BN_is_one wolfSSL_BN_is_one
156#define BN_is_odd wolfSSL_BN_is_odd
157#define BN_is_negative wolfSSL_BN_is_negative
158#define BN_is_word wolfSSL_BN_is_word
160#define BN_cmp wolfSSL_BN_cmp
162#define BN_bn2bin wolfSSL_BN_bn2bin
163#define BN_bin2bn wolfSSL_BN_bin2bn
165#define BN_mod wolfSSL_BN_mod
166#define BN_mod_exp wolfSSL_BN_mod_exp
167#define BN_mod_mul wolfSSL_BN_mod_mul
168#define BN_sub wolfSSL_BN_sub
169#define BN_value_one wolfSSL_BN_value_one
171#define BN_mask_bits wolfSSL_mask_bits
173#define BN_pseudo_rand wolfSSL_BN_pseudo_rand
174#define BN_rand wolfSSL_BN_rand
175#define BN_is_bit_set wolfSSL_BN_is_bit_set
176#define BN_hex2bn wolfSSL_BN_hex2bn
178#define BN_dup wolfSSL_BN_dup
179#define BN_copy wolfSSL_BN_copy
181#define BN_get_word wolfSSL_BN_get_word
182#define BN_set_word wolfSSL_BN_set_word
184#define BN_dec2bn wolfSSL_BN_dec2bn
185#define BN_bn2dec wolfSSL_BN_bn2dec
186#define BN_bn2hex wolfSSL_BN_bn2hex
188#define BN_lshift wolfSSL_BN_lshift
189#define BN_add_word wolfSSL_BN_add_word
190#define BN_add wolfSSL_BN_add
191#define BN_mod_add wolfSSL_BN_mod_add
192#define BN_set_word wolfSSL_BN_set_word
193#define BN_set_bit wolfSSL_BN_set_bit
194#define BN_clear_bit wolfSSL_BN_clear_bit
197#define BN_is_prime_ex wolfSSL_BN_is_prime_ex
198#define BN_print_fp wolfSSL_BN_print_fp
199#define BN_rshift wolfSSL_BN_rshift
200#define BN_mod_word wolfSSL_BN_mod_word
202#define BN_CTX_get wolfSSL_BN_CTX_get
203#define BN_CTX_start wolfSSL_BN_CTX_start
205#define BN_mod_inverse wolfSSL_BN_mod_inverse
207#define BN_set_flags(x1, x2)
209#if defined(OPENSSL_VERSION_NUMBER) && OPENSSL_VERSION_NUMBER >= 0x10100000L
210#define BN_get_rfc2409_prime_768 wolfSSL_DH_768_prime
211#define BN_get_rfc2409_prime_1024 wolfSSL_DH_1024_prime
212#define BN_get_rfc3526_prime_1536 wolfSSL_DH_1536_prime
213#define BN_get_rfc3526_prime_2048 wolfSSL_DH_2048_prime
214#define BN_get_rfc3526_prime_3072 wolfSSL_DH_3072_prime
215#define BN_get_rfc3526_prime_4096 wolfSSL_DH_4096_prime
216#define BN_get_rfc3526_prime_6144 wolfSSL_DH_6144_prime
217#define BN_get_rfc3526_prime_8192 wolfSSL_DH_8192_prime
WOLFSSL_API int wolfSSL_BN_mod_exp(WOLFSSL_BIGNUM *r, const WOLFSSL_BIGNUM *a, const WOLFSSL_BIGNUM *p, const WOLFSSL_BIGNUM *m, WOLFSSL_BN_CTX *ctx)
This function performs the following math “r = (a^p) % m”.
Definition ssl.c:44883