1 /* bn.h
2  *
3  * Copyright (C) 2006-2021 wolfSSL Inc.
4  *
5  * This file is part of wolfSSL.
6  *
7  * wolfSSL is free software; you can redistribute it and/or modify
8  * it under the terms of the GNU General Public License as published by
9  * the Free Software Foundation; either version 2 of the License, or
10  * (at your option) any later version.
11  *
12  * wolfSSL is distributed in the hope that it will be useful,
13  * but WITHOUT ANY WARRANTY; without even the implied warranty of
14  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15  * GNU General Public License for more details.
16  *
17  * You should have received a copy of the GNU General Public License
18  * along with this program; if not, write to the Free Software
19  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1335, USA
20  */
21 
22 /* bn.h for openssl */
23 
24 /*!
25     \file wolfssl/openssl/bn.h
26     \brief bn.h for openssl
27 */
28 
29 
30 #ifndef WOLFSSL_BN_H_
31 #define WOLFSSL_BN_H_
32 
33 #include <wolfssl/wolfcrypt/settings.h>
34 #include <wolfssl/wolfcrypt/integer.h>
35 
36 #ifdef __cplusplus
37     extern "C" {
38 #endif
39 
40 typedef struct WOLFSSL_BIGNUM {
41     int neg;        /* openssh deference */
42     void *internal; /* our big num */
43 #if defined(WOLFSSL_SP_MATH) || defined(WOLFSSL_SP_MATH_ALL)
44     sp_int fp;
45 #elif defined(USE_FAST_MATH) && !defined(HAVE_WOLF_BIGINT)
46     fp_int fp;
47 #endif
48 } WOLFSSL_BIGNUM;
49 
50 #define BN_ULONG WOLFSSL_BN_ULONG
51 #define WOLFSSL_BN_ULONG unsigned long
52 
53 typedef struct WOLFSSL_BN_CTX WOLFSSL_BN_CTX;
54 typedef struct WOLFSSL_BN_GENCB WOLFSSL_BN_GENCB;
55 
56 WOLFSSL_API WOLFSSL_BN_CTX* wolfSSL_BN_CTX_new(void);
57 WOLFSSL_API void           wolfSSL_BN_CTX_init(WOLFSSL_BN_CTX*);
58 WOLFSSL_API void           wolfSSL_BN_CTX_free(WOLFSSL_BN_CTX*);
59 
60 WOLFSSL_API WOLFSSL_BIGNUM* wolfSSL_BN_new(void);
61 #if defined(USE_FAST_MATH) && !defined(HAVE_WOLF_BIGINT)
62 WOLFSSL_API void           wolfSSL_BN_init(WOLFSSL_BIGNUM *);
63 #endif
64 WOLFSSL_API void           wolfSSL_BN_free(WOLFSSL_BIGNUM*);
65 WOLFSSL_API void           wolfSSL_BN_clear_free(WOLFSSL_BIGNUM*);
66 WOLFSSL_API void           wolfSSL_BN_clear(WOLFSSL_BIGNUM*);
67 
68 
69 WOLFSSL_API int wolfSSL_BN_sub(WOLFSSL_BIGNUM*, const WOLFSSL_BIGNUM*,
70                              const WOLFSSL_BIGNUM*);
71 WOLFSSL_API int wolfSSL_BN_mul(WOLFSSL_BIGNUM*, WOLFSSL_BIGNUM*,
72         WOLFSSL_BIGNUM*, WOLFSSL_BN_CTX*);
73 WOLFSSL_API int wolfSSL_BN_div(WOLFSSL_BIGNUM*, WOLFSSL_BIGNUM*,
74         const WOLFSSL_BIGNUM*, const WOLFSSL_BIGNUM*, WOLFSSL_BN_CTX*);
75 #if defined(WOLFSSL_KEY_GEN) && !defined(NO_RSA)
76 WOLFSSL_API int wolfSSL_BN_gcd(WOLFSSL_BIGNUM*, WOLFSSL_BIGNUM*,
77                                WOLFSSL_BIGNUM*, WOLFSSL_BN_CTX*);
78 #endif
79 WOLFSSL_API int wolfSSL_BN_mod(WOLFSSL_BIGNUM*, const WOLFSSL_BIGNUM*,
80                              const WOLFSSL_BIGNUM*, const WOLFSSL_BN_CTX*);
81 WOLFSSL_API int wolfSSL_BN_mod_exp(WOLFSSL_BIGNUM *r, const WOLFSSL_BIGNUM *a,
82         const WOLFSSL_BIGNUM *p, const WOLFSSL_BIGNUM *m, WOLFSSL_BN_CTX *ctx);
83 WOLFSSL_API int wolfSSL_BN_mod_mul(WOLFSSL_BIGNUM *r, const WOLFSSL_BIGNUM *a,
84         const WOLFSSL_BIGNUM *b, const WOLFSSL_BIGNUM *m, WOLFSSL_BN_CTX *ctx);
85 WOLFSSL_API const WOLFSSL_BIGNUM* wolfSSL_BN_value_one(void);
86 
87 
88 WOLFSSL_API int wolfSSL_BN_num_bytes(const WOLFSSL_BIGNUM*);
89 WOLFSSL_API int wolfSSL_BN_num_bits(const WOLFSSL_BIGNUM*);
90 
91 WOLFSSL_API void wolfSSL_BN_zero(WOLFSSL_BIGNUM*);
92 WOLFSSL_API int wolfSSL_BN_one(WOLFSSL_BIGNUM*);
93 WOLFSSL_API int wolfSSL_BN_is_zero(const WOLFSSL_BIGNUM*);
94 WOLFSSL_API int wolfSSL_BN_is_one(const WOLFSSL_BIGNUM*);
95 WOLFSSL_API int wolfSSL_BN_is_odd(const WOLFSSL_BIGNUM*);
96 WOLFSSL_API int wolfSSL_BN_is_negative(const WOLFSSL_BIGNUM*);
97 WOLFSSL_API int wolfSSL_BN_is_word(const WOLFSSL_BIGNUM*, WOLFSSL_BN_ULONG);
98 
99 WOLFSSL_API int wolfSSL_BN_cmp(const WOLFSSL_BIGNUM*, const WOLFSSL_BIGNUM*);
100 
101 WOLFSSL_API int wolfSSL_BN_bn2bin(const WOLFSSL_BIGNUM*, unsigned char*);
102 WOLFSSL_API WOLFSSL_BIGNUM* wolfSSL_BN_bin2bn(const unsigned char*, int len,
103                                 WOLFSSL_BIGNUM* ret);
104 
105 WOLFSSL_API int wolfSSL_mask_bits(WOLFSSL_BIGNUM*, int n);
106 
107 WOLFSSL_API int wolfSSL_BN_pseudo_rand(WOLFSSL_BIGNUM*, int bits, int top,
108         int bottom);
109 WOLFSSL_API int wolfSSL_BN_rand_range(WOLFSSL_BIGNUM *r, const WOLFSSL_BIGNUM *range);
110 WOLFSSL_API int wolfSSL_BN_rand(WOLFSSL_BIGNUM*, int bits, int top, int bottom);
111 WOLFSSL_API int wolfSSL_BN_is_bit_set(const WOLFSSL_BIGNUM*, int n);
112 WOLFSSL_API int wolfSSL_BN_hex2bn(WOLFSSL_BIGNUM**, const char* str);
113 
114 WOLFSSL_API WOLFSSL_BIGNUM* wolfSSL_BN_dup(const WOLFSSL_BIGNUM*);
115 WOLFSSL_API WOLFSSL_BIGNUM* wolfSSL_BN_copy(WOLFSSL_BIGNUM*,
116                                             const WOLFSSL_BIGNUM*);
117 
118 WOLFSSL_API int   wolfSSL_BN_dec2bn(WOLFSSL_BIGNUM**, const char* str);
119 WOLFSSL_API char* wolfSSL_BN_bn2dec(const WOLFSSL_BIGNUM*);
120 
121 WOLFSSL_API int wolfSSL_BN_lshift(WOLFSSL_BIGNUM*, const WOLFSSL_BIGNUM*, int);
122 WOLFSSL_API int wolfSSL_BN_add_word(WOLFSSL_BIGNUM*, WOLFSSL_BN_ULONG);
123 WOLFSSL_API int wolfSSL_BN_sub_word(WOLFSSL_BIGNUM*, WOLFSSL_BN_ULONG);
124 WOLFSSL_API int wolfSSL_BN_set_bit(WOLFSSL_BIGNUM*, int);
125 WOLFSSL_API int wolfSSL_BN_clear_bit(WOLFSSL_BIGNUM*, int);
126 WOLFSSL_API int wolfSSL_BN_set_word(WOLFSSL_BIGNUM*, WOLFSSL_BN_ULONG);
127 WOLFSSL_API WOLFSSL_BN_ULONG wolfSSL_BN_get_word(const WOLFSSL_BIGNUM*);
128 
129 WOLFSSL_API int wolfSSL_BN_add(WOLFSSL_BIGNUM*, WOLFSSL_BIGNUM*,
130                                WOLFSSL_BIGNUM*);
131 WOLFSSL_API int wolfSSL_BN_mod_add(WOLFSSL_BIGNUM *r, const WOLFSSL_BIGNUM *a,
132                                    const WOLFSSL_BIGNUM *b, const WOLFSSL_BIGNUM *m,
133                                    WOLFSSL_BN_CTX *ctx);
134 WOLFSSL_API char *wolfSSL_BN_bn2hex(const WOLFSSL_BIGNUM*);
135 #if defined(WOLFSSL_KEY_GEN) && (!defined(NO_RSA) || !defined(NO_DH) || !defined(NO_DSA))
136 WOLFSSL_API int wolfSSL_BN_generate_prime_ex(WOLFSSL_BIGNUM*, int, int,
137     const WOLFSSL_BIGNUM*, const WOLFSSL_BIGNUM*, WOLFSSL_BN_GENCB*);
138 WOLFSSL_API int wolfSSL_BN_is_prime_ex(const WOLFSSL_BIGNUM*, int,
139                                        WOLFSSL_BN_CTX*, WOLFSSL_BN_GENCB*);
140 WOLFSSL_API WOLFSSL_BN_ULONG wolfSSL_BN_mod_word(const WOLFSSL_BIGNUM*,
141                                                  WOLFSSL_BN_ULONG);
142 #endif
143 #if !defined(NO_FILESYSTEM) && !defined(NO_STDIO_FILESYSTEM)
144     WOLFSSL_API int wolfSSL_BN_print_fp(XFILE, const WOLFSSL_BIGNUM*);
145 #endif
146 WOLFSSL_API int wolfSSL_BN_rshift(WOLFSSL_BIGNUM*, const WOLFSSL_BIGNUM*, int);
147 WOLFSSL_API WOLFSSL_BIGNUM *wolfSSL_BN_CTX_get(WOLFSSL_BN_CTX *ctx);
148 WOLFSSL_API void wolfSSL_BN_CTX_start(WOLFSSL_BN_CTX *ctx);
149 WOLFSSL_API WOLFSSL_BIGNUM *wolfSSL_BN_mod_inverse(WOLFSSL_BIGNUM*, WOLFSSL_BIGNUM*,
150                                         const WOLFSSL_BIGNUM*, WOLFSSL_BN_CTX *ctx);
151 
152 typedef WOLFSSL_BIGNUM BIGNUM;
153 typedef WOLFSSL_BN_CTX BN_CTX;
154 typedef WOLFSSL_BN_GENCB BN_GENCB;
155 
156 #define BN_CTX_new        wolfSSL_BN_CTX_new
157 #define BN_CTX_init       wolfSSL_BN_CTX_init
158 #define BN_CTX_free       wolfSSL_BN_CTX_free
159 
160 #define BN_new        wolfSSL_BN_new
161 #define BN_init       wolfSSL_BN_init
162 #define BN_free       wolfSSL_BN_free
163 #define BN_clear_free wolfSSL_BN_clear_free
164 #define BN_clear      wolfSSL_BN_clear
165 
166 #define BN_num_bytes wolfSSL_BN_num_bytes
167 #define BN_num_bits  wolfSSL_BN_num_bits
168 
169 #define BN_zero        wolfSSL_BN_zero
170 #define BN_one         wolfSSL_BN_one
171 #define BN_is_zero     wolfSSL_BN_is_zero
172 #define BN_is_one      wolfSSL_BN_is_one
173 #define BN_is_odd      wolfSSL_BN_is_odd
174 #define BN_is_negative wolfSSL_BN_is_negative
175 #define BN_is_word     wolfSSL_BN_is_word
176 
177 #define BN_cmp    wolfSSL_BN_cmp
178 
179 #define BN_bn2bin  wolfSSL_BN_bn2bin
180 #define BN_bin2bn  wolfSSL_BN_bin2bn
181 
182 #define BN_mod       wolfSSL_BN_mod
183 #define BN_mod_exp   wolfSSL_BN_mod_exp
184 #define BN_mod_mul   wolfSSL_BN_mod_mul
185 #define BN_sub       wolfSSL_BN_sub
186 #define BN_mul       wolfSSL_BN_mul
187 #define BN_div       wolfSSL_BN_div
188 #define BN_gcd       wolfSSL_BN_gcd
189 #define BN_value_one wolfSSL_BN_value_one
190 
191 #define BN_mask_bits wolfSSL_mask_bits
192 
193 #define BN_pseudo_rand wolfSSL_BN_pseudo_rand
194 #define BN_rand        wolfSSL_BN_rand
195 #define BN_rand_range  wolfSSL_BN_rand_range
196 #define BN_is_bit_set  wolfSSL_BN_is_bit_set
197 #define BN_hex2bn      wolfSSL_BN_hex2bn
198 
199 #define BN_dup  wolfSSL_BN_dup
200 #define BN_copy wolfSSL_BN_copy
201 
202 #define BN_get_word wolfSSL_BN_get_word
203 #define BN_set_word wolfSSL_BN_set_word
204 
205 #define BN_dec2bn wolfSSL_BN_dec2bn
206 #define BN_bn2dec wolfSSL_BN_bn2dec
207 #define BN_bn2hex wolfSSL_BN_bn2hex
208 
209 #define BN_lshift wolfSSL_BN_lshift
210 #define BN_add_word wolfSSL_BN_add_word
211 #define BN_sub_word wolfSSL_BN_sub_word
212 #define BN_add wolfSSL_BN_add
213 #define BN_mod_add wolfSSL_BN_mod_add
214 #define BN_set_word wolfSSL_BN_set_word
215 #define BN_set_bit wolfSSL_BN_set_bit
216 #define BN_clear_bit wolfSSL_BN_clear_bit
217 
218 #define BN_generate_prime_ex wolfSSL_BN_generate_prime_ex
219 #define BN_is_prime_ex wolfSSL_BN_is_prime_ex
220 #define BN_print_fp wolfSSL_BN_print_fp
221 #define BN_rshift wolfSSL_BN_rshift
222 #define BN_rshift1(r, a) wolfSSL_BN_rshift((r), (a), 1)
223 #define BN_mod_word wolfSSL_BN_mod_word
224 
225 #define BN_CTX_get wolfSSL_BN_CTX_get
226 #define BN_CTX_start wolfSSL_BN_CTX_start
227 
228 #define BN_mod_inverse wolfSSL_BN_mod_inverse
229 
230 #define BN_set_flags(x1, x2)
231 
232 #if defined(OPENSSL_VERSION_NUMBER) && OPENSSL_VERSION_NUMBER >= 0x10100000L
233 #define BN_get_rfc2409_prime_768   wolfSSL_DH_768_prime
234 #define BN_get_rfc2409_prime_1024  wolfSSL_DH_1024_prime
235 #define BN_get_rfc3526_prime_1536  wolfSSL_DH_1536_prime
236 #define BN_get_rfc3526_prime_2048  wolfSSL_DH_2048_prime
237 #define BN_get_rfc3526_prime_3072  wolfSSL_DH_3072_prime
238 #define BN_get_rfc3526_prime_4096  wolfSSL_DH_4096_prime
239 #define BN_get_rfc3526_prime_6144  wolfSSL_DH_6144_prime
240 #define BN_get_rfc3526_prime_8192  wolfSSL_DH_8192_prime
241 #endif
242 
243 #define BN_prime_checks 0
244 
245 #ifdef __cplusplus
246     }  /* extern "C" */
247 #endif
248 
249 
250 #endif /* WOLFSSL__H_ */
251