/src/boringssl/include/openssl/bn.h
Line | Count | Source |
1 | | // Copyright 1995-2016 The OpenSSL Project Authors. All Rights Reserved. |
2 | | // Copyright (c) 2002, Oracle and/or its affiliates. All rights reserved. |
3 | | // |
4 | | // Licensed under the Apache License, Version 2.0 (the "License"); |
5 | | // you may not use this file except in compliance with the License. |
6 | | // You may obtain a copy of the License at |
7 | | // |
8 | | // https://www.apache.org/licenses/LICENSE-2.0 |
9 | | // |
10 | | // Unless required by applicable law or agreed to in writing, software |
11 | | // distributed under the License is distributed on an "AS IS" BASIS, |
12 | | // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
13 | | // See the License for the specific language governing permissions and |
14 | | // limitations under the License. |
15 | | |
16 | | #ifndef OPENSSL_HEADER_BN_H |
17 | | #define OPENSSL_HEADER_BN_H |
18 | | |
19 | | #include <openssl/base.h> // IWYU pragma: export |
20 | | |
21 | | #include <inttypes.h> // for PRIu64 and friends |
22 | | #include <stdio.h> // for FILE* |
23 | | |
24 | | #if defined(__cplusplus) |
25 | | extern "C" { |
26 | | #endif |
27 | | |
28 | | |
29 | | // BN provides support for working with arbitrary sized integers. For example, |
30 | | // although the largest integer supported by the compiler might be 64 bits, BN |
31 | | // will allow you to work with much larger numbers. |
32 | | // |
33 | | // This library is developed for use inside BoringSSL, and uses implementation |
34 | | // strategies that may not be ideal for other applications. Non-cryptographic |
35 | | // uses should use a more general-purpose integer library, especially if |
36 | | // performance-sensitive. |
37 | | // |
38 | | // Many functions in BN scale quadratically or higher in the bit length of their |
39 | | // input. Callers at this layer are assumed to have capped input sizes within |
40 | | // their performance tolerances. |
41 | | |
42 | | |
43 | | // BN_ULONG is the native word size when working with big integers. |
44 | | // |
45 | | // Note: on some platforms, inttypes.h does not define print format macros in |
46 | | // C++ unless |__STDC_FORMAT_MACROS| defined. This is due to text in C99 which |
47 | | // was never adopted in any C++ standard and explicitly overruled in C++11. As |
48 | | // this is a public header, bn.h does not define |__STDC_FORMAT_MACROS| itself. |
49 | | // Projects which use |BN_*_FMT*| with outdated C headers may need to define it |
50 | | // externally. |
51 | | #if defined(OPENSSL_64_BIT) |
52 | | typedef uint64_t BN_ULONG; |
53 | | #define BN_BITS2 64 |
54 | | #define BN_DEC_FMT1 "%" PRIu64 |
55 | | #define BN_HEX_FMT1 "%" PRIx64 |
56 | | #define BN_HEX_FMT2 "%016" PRIx64 |
57 | | #elif defined(OPENSSL_32_BIT) |
58 | | typedef uint32_t BN_ULONG; |
59 | | #define BN_BITS2 32 |
60 | | #define BN_DEC_FMT1 "%" PRIu32 |
61 | | #define BN_HEX_FMT1 "%" PRIx32 |
62 | | #define BN_HEX_FMT2 "%08" PRIx32 |
63 | | #else |
64 | | #error "Must define either OPENSSL_32_BIT or OPENSSL_64_BIT" |
65 | | #endif |
66 | | |
67 | | |
68 | | // Allocation and freeing. |
69 | | |
70 | | // BN_new creates a new, allocated BIGNUM and initialises it. |
71 | | OPENSSL_EXPORT BIGNUM *BN_new(void); |
72 | | |
73 | | // BN_init initialises a stack allocated |BIGNUM|. |
74 | | OPENSSL_EXPORT void BN_init(BIGNUM *bn); |
75 | | |
76 | | // BN_free frees the data referenced by |bn| and, if |bn| was originally |
77 | | // allocated on the heap, frees |bn| also. |
78 | | OPENSSL_EXPORT void BN_free(BIGNUM *bn); |
79 | | |
80 | | // BN_clear_free erases and frees the data referenced by |bn| and, if |bn| was |
81 | | // originally allocated on the heap, frees |bn| also. |
82 | | OPENSSL_EXPORT void BN_clear_free(BIGNUM *bn); |
83 | | |
84 | | // BN_dup allocates a new BIGNUM and sets it equal to |src|. It returns the |
85 | | // allocated BIGNUM on success or NULL otherwise. |
86 | | OPENSSL_EXPORT BIGNUM *BN_dup(const BIGNUM *src); |
87 | | |
88 | | // BN_copy sets |dest| equal to |src| and returns |dest| or NULL on allocation |
89 | | // failure. |
90 | | OPENSSL_EXPORT BIGNUM *BN_copy(BIGNUM *dest, const BIGNUM *src); |
91 | | |
92 | | // BN_clear sets |bn| to zero and erases the old data. |
93 | | OPENSSL_EXPORT void BN_clear(BIGNUM *bn); |
94 | | |
95 | | // BN_value_one returns a static BIGNUM with value 1. |
96 | | OPENSSL_EXPORT const BIGNUM *BN_value_one(void); |
97 | | |
98 | | |
99 | | // Basic functions. |
100 | | |
101 | | // BN_num_bits returns the minimum number of bits needed to represent the |
102 | | // absolute value of |bn|. |
103 | | OPENSSL_EXPORT unsigned BN_num_bits(const BIGNUM *bn); |
104 | | |
105 | | // BN_num_bytes returns the minimum number of bytes needed to represent the |
106 | | // absolute value of |bn|. |
107 | | // |
108 | | // While |size_t| is the preferred type for byte counts, callers can assume that |
109 | | // |BIGNUM|s are bounded such that this value, and its corresponding bit count, |
110 | | // will always fit in |int|. |
111 | | OPENSSL_EXPORT unsigned BN_num_bytes(const BIGNUM *bn); |
112 | | |
113 | | // BN_zero sets |bn| to zero. |
114 | | OPENSSL_EXPORT void BN_zero(BIGNUM *bn); |
115 | | |
116 | | // BN_one sets |bn| to one. It returns one on success or zero on allocation |
117 | | // failure. |
118 | | OPENSSL_EXPORT int BN_one(BIGNUM *bn); |
119 | | |
120 | | // BN_set_word sets |bn| to |value|. It returns one on success or zero on |
121 | | // allocation failure. |
122 | | OPENSSL_EXPORT int BN_set_word(BIGNUM *bn, BN_ULONG value); |
123 | | |
124 | | // BN_set_u64 sets |bn| to |value|. It returns one on success or zero on |
125 | | // allocation failure. |
126 | | OPENSSL_EXPORT int BN_set_u64(BIGNUM *bn, uint64_t value); |
127 | | |
128 | | // BN_set_negative sets the sign of |bn|. |
129 | | OPENSSL_EXPORT void BN_set_negative(BIGNUM *bn, int sign); |
130 | | |
131 | | // BN_is_negative returns one if |bn| is negative and zero otherwise. |
132 | | OPENSSL_EXPORT int BN_is_negative(const BIGNUM *bn); |
133 | | |
134 | | |
135 | | // Conversion functions. |
136 | | |
137 | | // BN_bin2bn sets |*ret| to the value of |len| bytes from |in|, interpreted as |
138 | | // a big-endian number, and returns |ret|. If |ret| is NULL then a fresh |
139 | | // |BIGNUM| is allocated and returned. It returns NULL on allocation |
140 | | // failure. |
141 | | OPENSSL_EXPORT BIGNUM *BN_bin2bn(const uint8_t *in, size_t len, BIGNUM *ret); |
142 | | |
143 | | // BN_bn2bin serialises the absolute value of |in| to |out| as a big-endian |
144 | | // integer, which must have |BN_num_bytes| of space available. It returns the |
145 | | // number of bytes written. Note this function leaks the magnitude of |in|. If |
146 | | // |in| is secret, use |BN_bn2bin_padded| instead. |
147 | | OPENSSL_EXPORT size_t BN_bn2bin(const BIGNUM *in, uint8_t *out); |
148 | | |
149 | | // BN_lebin2bn sets |*ret| to the value of |len| bytes from |in|, interpreted as |
150 | | // a little-endian number, and returns |ret|. If |ret| is NULL then a fresh |
151 | | // |BIGNUM| is allocated and returned. It returns NULL on allocation |
152 | | // failure. |
153 | | OPENSSL_EXPORT BIGNUM *BN_lebin2bn(const uint8_t *in, size_t len, BIGNUM *ret); |
154 | | |
155 | | // BN_bn2le_padded serialises the absolute value of |in| to |out| as a |
156 | | // little-endian integer, which must have |len| of space available, padding |
157 | | // out the remainder of out with zeros. If |len| is smaller than |BN_num_bytes|, |
158 | | // the function fails and returns 0. Otherwise, it returns 1. |
159 | | OPENSSL_EXPORT int BN_bn2le_padded(uint8_t *out, size_t len, const BIGNUM *in); |
160 | | |
161 | | // BN_bn2bin_padded serialises the absolute value of |in| to |out| as a |
162 | | // big-endian integer. The integer is padded with leading zeros up to size |
163 | | // |len|. If |len| is smaller than |BN_num_bytes|, the function fails and |
164 | | // returns 0. Otherwise, it returns 1. |
165 | | OPENSSL_EXPORT int BN_bn2bin_padded(uint8_t *out, size_t len, const BIGNUM *in); |
166 | | |
167 | | // BN_bn2cbb_padded behaves like |BN_bn2bin_padded| but writes to a |CBB|. |
168 | | OPENSSL_EXPORT int BN_bn2cbb_padded(CBB *out, size_t len, const BIGNUM *in); |
169 | | |
170 | | // BN_bn2hex returns an allocated string that contains a NUL-terminated, hex |
171 | | // representation of |bn|. If |bn| is negative, the first char in the resulting |
172 | | // string will be '-'. Returns NULL on allocation failure. |
173 | | OPENSSL_EXPORT char *BN_bn2hex(const BIGNUM *bn); |
174 | | |
175 | | // BN_hex2bn parses the leading hex number from |in|, which may be proceeded by |
176 | | // a '-' to indicate a negative number and may contain trailing, non-hex data. |
177 | | // If |outp| is not NULL, it constructs a BIGNUM equal to the hex number and |
178 | | // stores it in |*outp|. If |*outp| is NULL then it allocates a new BIGNUM and |
179 | | // updates |*outp|. It returns the number of bytes of |in| processed or zero on |
180 | | // error. |
181 | | OPENSSL_EXPORT int BN_hex2bn(BIGNUM **outp, const char *in); |
182 | | |
183 | | // BN_bn2dec returns an allocated string that contains a NUL-terminated, |
184 | | // decimal representation of |bn|. If |bn| is negative, the first char in the |
185 | | // resulting string will be '-'. Returns NULL on allocation failure. |
186 | | // |
187 | | // Converting an arbitrarily large integer to decimal is quadratic in the bit |
188 | | // length of |a|. This function assumes the caller has capped the input within |
189 | | // performance tolerances. |
190 | | OPENSSL_EXPORT char *BN_bn2dec(const BIGNUM *a); |
191 | | |
192 | | // BN_dec2bn parses the leading decimal number from |in|, which may be |
193 | | // proceeded by a '-' to indicate a negative number and may contain trailing, |
194 | | // non-decimal data. If |outp| is not NULL, it constructs a BIGNUM equal to the |
195 | | // decimal number and stores it in |*outp|. If |*outp| is NULL then it |
196 | | // allocates a new BIGNUM and updates |*outp|. It returns the number of bytes |
197 | | // of |in| processed or zero on error. |
198 | | // |
199 | | // Converting an arbitrarily large integer to decimal is quadratic in the bit |
200 | | // length of |a|. This function assumes the caller has capped the input within |
201 | | // performance tolerances. |
202 | | OPENSSL_EXPORT int BN_dec2bn(BIGNUM **outp, const char *in); |
203 | | |
204 | | // BN_asc2bn acts like |BN_dec2bn| or |BN_hex2bn| depending on whether |in| |
205 | | // begins with "0X" or "0x" (indicating hex) or not (indicating decimal). A |
206 | | // leading '-' is still permitted and comes before the optional 0X/0x. It |
207 | | // returns one on success or zero on error. |
208 | | OPENSSL_EXPORT int BN_asc2bn(BIGNUM **outp, const char *in); |
209 | | |
210 | | // BN_print writes a hex encoding of |a| to |bio|. It returns one on success |
211 | | // and zero on error. |
212 | | OPENSSL_EXPORT int BN_print(BIO *bio, const BIGNUM *a); |
213 | | |
214 | | // BN_print_fp acts like |BIO_print|, but wraps |fp| in a |BIO| first. |
215 | | OPENSSL_EXPORT int BN_print_fp(FILE *fp, const BIGNUM *a); |
216 | | |
217 | | // BN_get_word returns the absolute value of |bn| as a single word. If |bn| is |
218 | | // too large to be represented as a single word, the maximum possible value |
219 | | // will be returned. |
220 | | OPENSSL_EXPORT BN_ULONG BN_get_word(const BIGNUM *bn); |
221 | | |
222 | | // BN_get_u64 sets |*out| to the absolute value of |bn| as a |uint64_t| and |
223 | | // returns one. If |bn| is too large to be represented as a |uint64_t|, it |
224 | | // returns zero. |
225 | | OPENSSL_EXPORT int BN_get_u64(const BIGNUM *bn, uint64_t *out); |
226 | | |
227 | | |
228 | | // ASN.1 functions. |
229 | | |
230 | | // BN_parse_asn1_unsigned parses a non-negative DER INTEGER from |cbs| writes |
231 | | // the result to |ret|. It returns one on success and zero on failure. |
232 | | OPENSSL_EXPORT int BN_parse_asn1_unsigned(CBS *cbs, BIGNUM *ret); |
233 | | |
234 | | // BN_marshal_asn1 marshals |bn| as a non-negative DER INTEGER and appends the |
235 | | // result to |cbb|. It returns one on success and zero on failure. |
236 | | OPENSSL_EXPORT int BN_marshal_asn1(CBB *cbb, const BIGNUM *bn); |
237 | | |
238 | | |
239 | | // BIGNUM pools. |
240 | | // |
241 | | // Certain BIGNUM operations need to use many temporary variables and |
242 | | // allocating and freeing them can be quite slow. Thus such operations typically |
243 | | // take a |BN_CTX| parameter, which contains a pool of |BIGNUMs|. The |ctx| |
244 | | // argument to a public function may be NULL, in which case a local |BN_CTX| |
245 | | // will be created just for the lifetime of that call. |
246 | | // |
247 | | // A function must call |BN_CTX_start| first. Then, |BN_CTX_get| may be called |
248 | | // repeatedly to obtain temporary |BIGNUM|s. All |BN_CTX_get| calls must be made |
249 | | // before calling any other functions that use the |ctx| as an argument. |
250 | | // |
251 | | // Finally, |BN_CTX_end| must be called before returning from the function. |
252 | | // When |BN_CTX_end| is called, the |BIGNUM| pointers obtained from |
253 | | // |BN_CTX_get| become invalid. |
254 | | |
255 | | // BN_CTX_new returns a new, empty BN_CTX or NULL on allocation failure. |
256 | | OPENSSL_EXPORT BN_CTX *BN_CTX_new(void); |
257 | | |
258 | | // BN_CTX_free frees all BIGNUMs contained in |ctx| and then frees |ctx| |
259 | | // itself. |
260 | | OPENSSL_EXPORT void BN_CTX_free(BN_CTX *ctx); |
261 | | |
262 | | // BN_CTX_start "pushes" a new entry onto the |ctx| stack and allows future |
263 | | // calls to |BN_CTX_get|. |
264 | | OPENSSL_EXPORT void BN_CTX_start(BN_CTX *ctx); |
265 | | |
266 | | // BN_CTX_get returns a new |BIGNUM|, or NULL on allocation failure. Once |
267 | | // |BN_CTX_get| has returned NULL, all future calls will also return NULL until |
268 | | // |BN_CTX_end| is called. |
269 | | OPENSSL_EXPORT BIGNUM *BN_CTX_get(BN_CTX *ctx); |
270 | | |
271 | | // BN_CTX_end invalidates all |BIGNUM|s returned from |BN_CTX_get| since the |
272 | | // matching |BN_CTX_start| call. |
273 | | OPENSSL_EXPORT void BN_CTX_end(BN_CTX *ctx); |
274 | | |
275 | | |
276 | | // Simple arithmetic |
277 | | |
278 | | // BN_add sets |r| = |a| + |b|, where |r| may be the same pointer as either |a| |
279 | | // or |b|. It returns one on success and zero on allocation failure. |
280 | | OPENSSL_EXPORT int BN_add(BIGNUM *r, const BIGNUM *a, const BIGNUM *b); |
281 | | |
282 | | // BN_uadd sets |r| = |a| + |b|, considering only the absolute values of |a| and |
283 | | // |b|. |r| may be the same pointer as either |a| or |b|. It returns one on |
284 | | // success and zero on allocation failure. |
285 | | OPENSSL_EXPORT int BN_uadd(BIGNUM *r, const BIGNUM *a, const BIGNUM *b); |
286 | | |
287 | | // BN_add_word adds |w| to |a|. It returns one on success and zero otherwise. |
288 | | OPENSSL_EXPORT int BN_add_word(BIGNUM *a, BN_ULONG w); |
289 | | |
290 | | // BN_sub sets |r| = |a| - |b|, where |r| may be the same pointer as either |a| |
291 | | // or |b|. It returns one on success and zero on allocation failure. |
292 | | OPENSSL_EXPORT int BN_sub(BIGNUM *r, const BIGNUM *a, const BIGNUM *b); |
293 | | |
294 | | // BN_usub sets |r| = |a| - |b|, considering only the absolute values of |a| and |
295 | | // |b|. The result must be non-negative, i.e. |b| <= |a|. |r| may be the same |
296 | | // pointer as either |a| or |b|. It returns one on success and zero on error. |
297 | | OPENSSL_EXPORT int BN_usub(BIGNUM *r, const BIGNUM *a, const BIGNUM *b); |
298 | | |
299 | | // BN_sub_word subtracts |w| from |a|. It returns one on success and zero on |
300 | | // allocation failure. |
301 | | OPENSSL_EXPORT int BN_sub_word(BIGNUM *a, BN_ULONG w); |
302 | | |
303 | | // BN_mul sets |r| = |a| * |b|, where |r| may be the same pointer as |a| or |
304 | | // |b|. Returns one on success and zero otherwise. |
305 | | OPENSSL_EXPORT int BN_mul(BIGNUM *r, const BIGNUM *a, const BIGNUM *b, |
306 | | BN_CTX *ctx); |
307 | | |
308 | | // BN_mul_word sets |bn| = |bn| * |w|. It returns one on success or zero on |
309 | | // allocation failure. |
310 | | OPENSSL_EXPORT int BN_mul_word(BIGNUM *bn, BN_ULONG w); |
311 | | |
312 | | // BN_sqr sets |r| = |a|^2 (i.e. squares), where |r| may be the same pointer as |
313 | | // |a|. Returns one on success and zero otherwise. This is more efficient than |
314 | | // BN_mul(r, a, a, ctx). |
315 | | OPENSSL_EXPORT int BN_sqr(BIGNUM *r, const BIGNUM *a, BN_CTX *ctx); |
316 | | |
317 | | // BN_div divides |numerator| by |divisor| and places the result in |quotient| |
318 | | // and the remainder in |rem|. Either of |quotient| or |rem| may be NULL, in |
319 | | // which case the respective value is not returned. It returns one on success or |
320 | | // zero on error. It is an error condition if |divisor| is zero. |
321 | | // |
322 | | // The outputs will be such that |quotient| * |divisor| + |rem| = |numerator|, |
323 | | // with the quotient rounded towards zero. Thus, if |numerator| is negative, |
324 | | // |rem| will be zero or negative. If |divisor| is negative, the sign of |
325 | | // |quotient| will be flipped to compensate but otherwise rounding will be as if |
326 | | // |divisor| were its absolute value. |
327 | | OPENSSL_EXPORT int BN_div(BIGNUM *quotient, BIGNUM *rem, |
328 | | const BIGNUM *numerator, const BIGNUM *divisor, |
329 | | BN_CTX *ctx); |
330 | | |
331 | | // BN_div_word sets |numerator| = |numerator|/|divisor| and returns the |
332 | | // remainder or (BN_ULONG)-1 on error. |
333 | | OPENSSL_EXPORT BN_ULONG BN_div_word(BIGNUM *numerator, BN_ULONG divisor); |
334 | | |
335 | | // BN_sqrt sets |*out_sqrt| (which may be the same |BIGNUM| as |in|) to the |
336 | | // square root of |in|, using |ctx|. It returns one on success or zero on |
337 | | // error. Negative numbers and non-square numbers will result in an error with |
338 | | // appropriate errors on the error queue. |
339 | | OPENSSL_EXPORT int BN_sqrt(BIGNUM *out_sqrt, const BIGNUM *in, BN_CTX *ctx); |
340 | | |
341 | | |
342 | | // Comparison functions |
343 | | |
344 | | // BN_cmp returns a value less than, equal to or greater than zero if |a| is |
345 | | // less than, equal to or greater than |b|, respectively. |
346 | | OPENSSL_EXPORT int BN_cmp(const BIGNUM *a, const BIGNUM *b); |
347 | | |
348 | | // BN_cmp_word is like |BN_cmp| except it takes its second argument as a |
349 | | // |BN_ULONG| instead of a |BIGNUM|. |
350 | | OPENSSL_EXPORT int BN_cmp_word(const BIGNUM *a, BN_ULONG b); |
351 | | |
352 | | // BN_ucmp returns a value less than, equal to or greater than zero if the |
353 | | // absolute value of |a| is less than, equal to or greater than the absolute |
354 | | // value of |b|, respectively. |
355 | | OPENSSL_EXPORT int BN_ucmp(const BIGNUM *a, const BIGNUM *b); |
356 | | |
357 | | // BN_equal_consttime returns one if |a| is equal to |b|, and zero otherwise. |
358 | | // It takes an amount of time dependent on the sizes of |a| and |b|, but |
359 | | // independent of the contents (including the signs) of |a| and |b|. |
360 | | OPENSSL_EXPORT int BN_equal_consttime(const BIGNUM *a, const BIGNUM *b); |
361 | | |
362 | | // BN_abs_is_word returns one if the absolute value of |bn| equals |w| and zero |
363 | | // otherwise. |
364 | | OPENSSL_EXPORT int BN_abs_is_word(const BIGNUM *bn, BN_ULONG w); |
365 | | |
366 | | // BN_is_zero returns one if |bn| is zero and zero otherwise. |
367 | | OPENSSL_EXPORT int BN_is_zero(const BIGNUM *bn); |
368 | | |
369 | | // BN_is_one returns one if |bn| equals one and zero otherwise. |
370 | | OPENSSL_EXPORT int BN_is_one(const BIGNUM *bn); |
371 | | |
372 | | // BN_is_word returns one if |bn| is exactly |w| and zero otherwise. |
373 | | OPENSSL_EXPORT int BN_is_word(const BIGNUM *bn, BN_ULONG w); |
374 | | |
375 | | // BN_is_odd returns one if |bn| is odd and zero otherwise. |
376 | | OPENSSL_EXPORT int BN_is_odd(const BIGNUM *bn); |
377 | | |
378 | | // BN_is_pow2 returns 1 if |a| is a power of two, and 0 otherwise. |
379 | | OPENSSL_EXPORT int BN_is_pow2(const BIGNUM *a); |
380 | | |
381 | | |
382 | | // Bitwise operations. |
383 | | |
384 | | // BN_lshift sets |r| equal to |a| << n. The |a| and |r| arguments may be the |
385 | | // same |BIGNUM|. It returns one on success and zero on allocation failure. |
386 | | OPENSSL_EXPORT int BN_lshift(BIGNUM *r, const BIGNUM *a, int n); |
387 | | |
388 | | // BN_lshift1 sets |r| equal to |a| << 1, where |r| and |a| may be the same |
389 | | // pointer. It returns one on success and zero on allocation failure. |
390 | | OPENSSL_EXPORT int BN_lshift1(BIGNUM *r, const BIGNUM *a); |
391 | | |
392 | | // BN_rshift sets |r| equal to |a| >> n, where |r| and |a| may be the same |
393 | | // pointer. It returns one on success and zero on allocation failure. |
394 | | OPENSSL_EXPORT int BN_rshift(BIGNUM *r, const BIGNUM *a, int n); |
395 | | |
396 | | // BN_rshift1 sets |r| equal to |a| >> 1, where |r| and |a| may be the same |
397 | | // pointer. It returns one on success and zero on allocation failure. |
398 | | OPENSSL_EXPORT int BN_rshift1(BIGNUM *r, const BIGNUM *a); |
399 | | |
400 | | // BN_set_bit sets the |n|th, least-significant bit in |a|. For example, if |a| |
401 | | // is 2 then setting bit zero will make it 3. It returns one on success or zero |
402 | | // on allocation failure. |
403 | | OPENSSL_EXPORT int BN_set_bit(BIGNUM *a, int n); |
404 | | |
405 | | // BN_clear_bit clears the |n|th, least-significant bit in |a|. For example, if |
406 | | // |a| is 3, clearing bit zero will make it two. It returns one on success or |
407 | | // zero on allocation failure. |
408 | | OPENSSL_EXPORT int BN_clear_bit(BIGNUM *a, int n); |
409 | | |
410 | | // BN_is_bit_set returns one if the |n|th least-significant bit in |a| exists |
411 | | // and is set. Otherwise, it returns zero. |
412 | | OPENSSL_EXPORT int BN_is_bit_set(const BIGNUM *a, int n); |
413 | | |
414 | | // BN_mask_bits truncates |a| so that it is only |n| bits long. It returns one |
415 | | // on success or zero if |n| is negative. |
416 | | // |
417 | | // This differs from OpenSSL which additionally returns zero if |a|'s word |
418 | | // length is less than or equal to |n|, rounded down to a number of words. Note |
419 | | // word size is platform-dependent, so this behavior is also difficult to rely |
420 | | // on in OpenSSL and not very useful. |
421 | | OPENSSL_EXPORT int BN_mask_bits(BIGNUM *a, int n); |
422 | | |
423 | | // BN_count_low_zero_bits returns the number of low-order zero bits in |bn|, or |
424 | | // the number of factors of two which divide it. It returns zero if |bn| is |
425 | | // zero. |
426 | | OPENSSL_EXPORT int BN_count_low_zero_bits(const BIGNUM *bn); |
427 | | |
428 | | |
429 | | // Modulo arithmetic. |
430 | | |
431 | | // BN_mod_word returns |a| mod |w| or (BN_ULONG)-1 on error. |
432 | | OPENSSL_EXPORT BN_ULONG BN_mod_word(const BIGNUM *a, BN_ULONG w); |
433 | | |
434 | | // BN_mod_pow2 sets |r| = |a| mod 2^|e|. It returns 1 on success and |
435 | | // 0 on error. |
436 | | OPENSSL_EXPORT int BN_mod_pow2(BIGNUM *r, const BIGNUM *a, size_t e); |
437 | | |
438 | | // BN_nnmod_pow2 sets |r| = |a| mod 2^|e| where |r| is always positive. |
439 | | // It returns 1 on success and 0 on error. |
440 | | OPENSSL_EXPORT int BN_nnmod_pow2(BIGNUM *r, const BIGNUM *a, size_t e); |
441 | | |
442 | | // BN_mod is a helper macro that calls |BN_div| and discards the quotient. |
443 | | #define BN_mod(rem, numerator, divisor, ctx) \ |
444 | 7.03M | BN_div(NULL, (rem), (numerator), (divisor), (ctx)) |
445 | | |
446 | | // BN_nnmod is a non-negative modulo function. It acts like |BN_mod|, but 0 <= |
447 | | // |rem| < |divisor| is always true. It returns one on success and zero on |
448 | | // error. |
449 | | OPENSSL_EXPORT int BN_nnmod(BIGNUM *rem, const BIGNUM *numerator, |
450 | | const BIGNUM *divisor, BN_CTX *ctx); |
451 | | |
452 | | // BN_mod_add sets |r| = |a| + |b| mod |m|. It returns one on success and zero |
453 | | // on error. |
454 | | OPENSSL_EXPORT int BN_mod_add(BIGNUM *r, const BIGNUM *a, const BIGNUM *b, |
455 | | const BIGNUM *m, BN_CTX *ctx); |
456 | | |
457 | | // BN_mod_add_quick acts like |BN_mod_add| but requires that |a| and |b| be |
458 | | // non-negative and less than |m|. |
459 | | OPENSSL_EXPORT int BN_mod_add_quick(BIGNUM *r, const BIGNUM *a, const BIGNUM *b, |
460 | | const BIGNUM *m); |
461 | | |
462 | | // BN_mod_sub sets |r| = |a| - |b| mod |m|. It returns one on success and zero |
463 | | // on error. |
464 | | OPENSSL_EXPORT int BN_mod_sub(BIGNUM *r, const BIGNUM *a, const BIGNUM *b, |
465 | | const BIGNUM *m, BN_CTX *ctx); |
466 | | |
467 | | // BN_mod_sub_quick acts like |BN_mod_sub| but requires that |a| and |b| be |
468 | | // non-negative and less than |m|. |
469 | | OPENSSL_EXPORT int BN_mod_sub_quick(BIGNUM *r, const BIGNUM *a, const BIGNUM *b, |
470 | | const BIGNUM *m); |
471 | | |
472 | | // BN_mod_mul sets |r| = |a|*|b| mod |m|. It returns one on success and zero |
473 | | // on error. |
474 | | OPENSSL_EXPORT int BN_mod_mul(BIGNUM *r, const BIGNUM *a, const BIGNUM *b, |
475 | | const BIGNUM *m, BN_CTX *ctx); |
476 | | |
477 | | // BN_mod_sqr sets |r| = |a|^2 mod |m|. It returns one on success and zero |
478 | | // on error. |
479 | | OPENSSL_EXPORT int BN_mod_sqr(BIGNUM *r, const BIGNUM *a, const BIGNUM *m, |
480 | | BN_CTX *ctx); |
481 | | |
482 | | // BN_mod_lshift sets |r| = (|a| << n) mod |m|, where |r| and |a| may be the |
483 | | // same pointer. It returns one on success and zero on error. |
484 | | OPENSSL_EXPORT int BN_mod_lshift(BIGNUM *r, const BIGNUM *a, int n, |
485 | | const BIGNUM *m, BN_CTX *ctx); |
486 | | |
487 | | // BN_mod_lshift_quick acts like |BN_mod_lshift| but requires that |a| be |
488 | | // non-negative and less than |m|. |
489 | | OPENSSL_EXPORT int BN_mod_lshift_quick(BIGNUM *r, const BIGNUM *a, int n, |
490 | | const BIGNUM *m); |
491 | | |
492 | | // BN_mod_lshift1 sets |r| = (|a| << 1) mod |m|, where |r| and |a| may be the |
493 | | // same pointer. It returns one on success and zero on error. |
494 | | OPENSSL_EXPORT int BN_mod_lshift1(BIGNUM *r, const BIGNUM *a, const BIGNUM *m, |
495 | | BN_CTX *ctx); |
496 | | |
497 | | // BN_mod_lshift1_quick acts like |BN_mod_lshift1| but requires that |a| be |
498 | | // non-negative and less than |m|. |
499 | | OPENSSL_EXPORT int BN_mod_lshift1_quick(BIGNUM *r, const BIGNUM *a, |
500 | | const BIGNUM *m); |
501 | | |
502 | | // BN_mod_sqrt returns a newly-allocated |BIGNUM|, r, such that |
503 | | // r^2 == a (mod p). It returns NULL on error or if |a| is not a square mod |p|. |
504 | | // In the latter case, it will add |BN_R_NOT_A_SQUARE| to the error queue. |
505 | | // If |a| is a square and |p| > 2, there are two possible square roots. This |
506 | | // function may return either and may even select one non-deterministically. |
507 | | // |
508 | | // If |in| is non-NULL, the function, instead of allocating the result, stores |
509 | | // the result in |in| and returns |in| on success or NULL on failure. |
510 | | // |
511 | | // This function only works if |p| is a prime. If |p| is composite, it may fail |
512 | | // or return an arbitrary value. Callers should not pass attacker-controlled |
513 | | // values of |p|. |
514 | | OPENSSL_EXPORT BIGNUM *BN_mod_sqrt(BIGNUM *in, const BIGNUM *a, const BIGNUM *p, |
515 | | BN_CTX *ctx); |
516 | | |
517 | | |
518 | | // Random and prime number generation. |
519 | | |
520 | | // The following are values for the |top| parameter of |BN_rand|. |
521 | 0 | #define BN_RAND_TOP_ANY (-1) |
522 | 0 | #define BN_RAND_TOP_ONE 0 |
523 | 0 | #define BN_RAND_TOP_TWO 1 |
524 | | |
525 | | // The following are values for the |bottom| parameter of |BN_rand|. |
526 | 0 | #define BN_RAND_BOTTOM_ANY 0 |
527 | 0 | #define BN_RAND_BOTTOM_ODD 1 |
528 | | |
529 | | // BN_rand sets |rnd| to a random number of length |bits|. It returns one on |
530 | | // success and zero otherwise. |
531 | | // |
532 | | // |top| must be one of the |BN_RAND_TOP_*| values. If |BN_RAND_TOP_ONE|, the |
533 | | // most-significant bit, if any, will be set. If |BN_RAND_TOP_TWO|, the two |
534 | | // most significant bits, if any, will be set. If |BN_RAND_TOP_ANY|, no extra |
535 | | // action will be taken and |BN_num_bits(rnd)| may not equal |bits| if the most |
536 | | // significant bits randomly ended up as zeros. |
537 | | // |
538 | | // |bottom| must be one of the |BN_RAND_BOTTOM_*| values. If |
539 | | // |BN_RAND_BOTTOM_ODD|, the least-significant bit, if any, will be set. If |
540 | | // |BN_RAND_BOTTOM_ANY|, no extra action will be taken. |
541 | | OPENSSL_EXPORT int BN_rand(BIGNUM *rnd, int bits, int top, int bottom); |
542 | | |
543 | | // BN_pseudo_rand is an alias for |BN_rand|. |
544 | | OPENSSL_EXPORT int BN_pseudo_rand(BIGNUM *rnd, int bits, int top, int bottom); |
545 | | |
546 | | // BN_rand_range is equivalent to |BN_rand_range_ex| with |min_inclusive| set |
547 | | // to zero and |max_exclusive| set to |range|. |
548 | | OPENSSL_EXPORT int BN_rand_range(BIGNUM *rnd, const BIGNUM *range); |
549 | | |
550 | | // BN_rand_range_ex sets |rnd| to a random value in |
551 | | // [min_inclusive..max_exclusive). It returns one on success and zero |
552 | | // otherwise. |
553 | | OPENSSL_EXPORT int BN_rand_range_ex(BIGNUM *r, BN_ULONG min_inclusive, |
554 | | const BIGNUM *max_exclusive); |
555 | | |
556 | | // BN_pseudo_rand_range is an alias for BN_rand_range. |
557 | | OPENSSL_EXPORT int BN_pseudo_rand_range(BIGNUM *rnd, const BIGNUM *range); |
558 | | |
559 | 0 | #define BN_GENCB_GENERATED 0 |
560 | 0 | #define BN_GENCB_PRIME_TEST 1 |
561 | | |
562 | | // bn_gencb_st, or |BN_GENCB|, holds a callback function that is used by |
563 | | // generation functions that can take a very long time to complete. Use |
564 | | // |BN_GENCB_set| to initialise a |BN_GENCB| structure. |
565 | | // |
566 | | // The callback receives the address of that |BN_GENCB| structure as its last |
567 | | // argument and the user is free to put an arbitrary pointer in |arg|. The other |
568 | | // arguments are set as follows: |
569 | | // - event=BN_GENCB_GENERATED, n=i: after generating the i'th possible prime |
570 | | // number. |
571 | | // - event=BN_GENCB_PRIME_TEST, n=-1: when finished trial division primality |
572 | | // checks. |
573 | | // - event=BN_GENCB_PRIME_TEST, n=i: when the i'th primality test has finished. |
574 | | // |
575 | | // The callback can return zero to abort the generation progress or one to |
576 | | // allow it to continue. |
577 | | // |
578 | | // When other code needs to call a BN generation function it will often take a |
579 | | // BN_GENCB argument and may call the function with other argument values. |
580 | | struct bn_gencb_st { |
581 | | void *arg; // callback-specific data |
582 | | int (*callback)(int event, int n, struct bn_gencb_st *); |
583 | | }; |
584 | | |
585 | | // BN_GENCB_new returns a newly-allocated |BN_GENCB| object, or NULL on |
586 | | // allocation failure. The result must be released with |BN_GENCB_free| when |
587 | | // done. |
588 | | OPENSSL_EXPORT BN_GENCB *BN_GENCB_new(void); |
589 | | |
590 | | // BN_GENCB_free releases memory associated with |callback|. |
591 | | OPENSSL_EXPORT void BN_GENCB_free(BN_GENCB *callback); |
592 | | |
593 | | // BN_GENCB_set configures |callback| to call |f| and sets |callout->arg| to |
594 | | // |arg|. |
595 | | OPENSSL_EXPORT void BN_GENCB_set(BN_GENCB *callback, |
596 | | int (*f)(int event, int n, BN_GENCB *), |
597 | | void *arg); |
598 | | |
599 | | // BN_GENCB_call calls |callback|, if not NULL, and returns the return value of |
600 | | // the callback, or 1 if |callback| is NULL. |
601 | | OPENSSL_EXPORT int BN_GENCB_call(BN_GENCB *callback, int event, int n); |
602 | | |
603 | | // BN_GENCB_get_arg returns |callback->arg|. |
604 | | OPENSSL_EXPORT void *BN_GENCB_get_arg(const BN_GENCB *callback); |
605 | | |
606 | | // BN_generate_prime_ex sets |ret| to a prime number of |bits| length. If safe |
607 | | // is non-zero then the prime will be such that (ret-1)/2 is also a prime. |
608 | | // (This is needed for Diffie-Hellman groups to ensure that the only subgroups |
609 | | // are of size 2 and (p-1)/2.). |
610 | | // |
611 | | // If |add| is not NULL, the prime will fulfill the condition |ret| % |add| == |
612 | | // |rem| in order to suit a given generator. (If |rem| is NULL then |ret| % |
613 | | // |add| == 1.) |
614 | | // |
615 | | // If |cb| is not NULL, it will be called during processing to give an |
616 | | // indication of progress. See the comments for |BN_GENCB|. It returns one on |
617 | | // success and zero otherwise. |
618 | | OPENSSL_EXPORT int BN_generate_prime_ex(BIGNUM *ret, int bits, int safe, |
619 | | const BIGNUM *add, const BIGNUM *rem, |
620 | | BN_GENCB *cb); |
621 | | |
622 | | // BN_prime_checks_for_validation can be used as the |checks| argument to the |
623 | | // primarily testing functions when validating an externally-supplied candidate |
624 | | // prime. It gives a false positive rate of at most 2^{-128}. (The worst case |
625 | | // false positive rate for a single iteration is 1/4 per |
626 | | // https://eprint.iacr.org/2018/749. (1/4)^64 = 2^{-128}.) |
627 | 0 | #define BN_prime_checks_for_validation 64 |
628 | | |
629 | | // BN_prime_checks_for_generation can be used as the |checks| argument to the |
630 | | // primality testing functions when generating random primes. It gives a false |
631 | | // positive rate at most the security level of the corresponding RSA key size. |
632 | | // |
633 | | // Note this value only performs enough checks if the candidate prime was |
634 | | // selected randomly. If validating an externally-supplied candidate, especially |
635 | | // one that may be selected adversarially, use |BN_prime_checks_for_validation| |
636 | | // instead. |
637 | 0 | #define BN_prime_checks_for_generation 0 |
638 | | |
639 | | // bn_primality_result_t enumerates the outcomes of primality-testing. |
640 | | enum bn_primality_result_t { |
641 | | bn_probably_prime, |
642 | | bn_composite, |
643 | | bn_non_prime_power_composite, |
644 | | }; |
645 | | |
646 | | // BN_enhanced_miller_rabin_primality_test tests whether |w| is probably a prime |
647 | | // number using the Enhanced Miller-Rabin Test (FIPS 186-5 B.3.2) with |
648 | | // |checks| iterations and returns the result in |out_result|. Enhanced |
649 | | // Miller-Rabin tests primality for odd integers greater than 3, returning |
650 | | // |bn_probably_prime| if the number is probably prime, |
651 | | // |bn_non_prime_power_composite| if the number is a composite that is not the |
652 | | // power of a single prime, and |bn_composite| otherwise. It returns one on |
653 | | // success and zero on failure. If |cb| is not NULL, then it is called during |
654 | | // each iteration of the primality test. |
655 | | // |
656 | | // See |BN_prime_checks_for_validation| and |BN_prime_checks_for_generation| for |
657 | | // recommended values of |checks|. |
658 | | OPENSSL_EXPORT int BN_enhanced_miller_rabin_primality_test( |
659 | | enum bn_primality_result_t *out_result, const BIGNUM *w, int checks, |
660 | | BN_CTX *ctx, BN_GENCB *cb); |
661 | | |
662 | | // BN_primality_test sets |*is_probably_prime| to one if |candidate| is |
663 | | // probably a prime number by the Miller-Rabin test or zero if it's certainly |
664 | | // not. |
665 | | // |
666 | | // If |do_trial_division| is non-zero then |candidate| will be tested against a |
667 | | // list of small primes before Miller-Rabin tests. The probability of this |
668 | | // function returning a false positive is at most 2^{2*checks}. See |
669 | | // |BN_prime_checks_for_validation| and |BN_prime_checks_for_generation| for |
670 | | // recommended values of |checks|. |
671 | | // |
672 | | // If |cb| is not NULL then it is called during the checking process. See the |
673 | | // comment above |BN_GENCB|. |
674 | | // |
675 | | // The function returns one on success and zero on error. |
676 | | OPENSSL_EXPORT int BN_primality_test(int *is_probably_prime, |
677 | | const BIGNUM *candidate, int checks, |
678 | | BN_CTX *ctx, int do_trial_division, |
679 | | BN_GENCB *cb); |
680 | | |
681 | | // BN_is_prime_fasttest_ex returns one if |candidate| is probably a prime |
682 | | // number by the Miller-Rabin test, zero if it's certainly not and -1 on error. |
683 | | // |
684 | | // If |do_trial_division| is non-zero then |candidate| will be tested against a |
685 | | // list of small primes before Miller-Rabin tests. The probability of this |
686 | | // function returning one when |candidate| is composite is at most 2^{2*checks}. |
687 | | // See |BN_prime_checks_for_validation| and |BN_prime_checks_for_generation| for |
688 | | // recommended values of |checks|. |
689 | | // |
690 | | // If |cb| is not NULL then it is called during the checking process. See the |
691 | | // comment above |BN_GENCB|. |
692 | | // |
693 | | // WARNING: deprecated. Use |BN_primality_test|. |
694 | | OPENSSL_EXPORT int BN_is_prime_fasttest_ex(const BIGNUM *candidate, int checks, |
695 | | BN_CTX *ctx, int do_trial_division, |
696 | | BN_GENCB *cb); |
697 | | |
698 | | // BN_is_prime_ex acts the same as |BN_is_prime_fasttest_ex| with |
699 | | // |do_trial_division| set to zero. |
700 | | // |
701 | | // WARNING: deprecated: Use |BN_primality_test|. |
702 | | OPENSSL_EXPORT int BN_is_prime_ex(const BIGNUM *candidate, int checks, |
703 | | BN_CTX *ctx, BN_GENCB *cb); |
704 | | |
705 | | |
706 | | // Number theory functions |
707 | | |
708 | | // BN_gcd sets |r| = gcd(|a|, |b|). It returns one on success and zero |
709 | | // otherwise. |
710 | | OPENSSL_EXPORT int BN_gcd(BIGNUM *r, const BIGNUM *a, const BIGNUM *b, |
711 | | BN_CTX *ctx); |
712 | | |
713 | | // BN_mod_inverse sets |out| equal to |a|^-1, mod |n|. If |out| is NULL, a |
714 | | // fresh BIGNUM is allocated. It returns the result or NULL on error. |
715 | | // |
716 | | // If |n| is even then the operation is performed using an algorithm that avoids |
717 | | // some branches but which isn't constant-time. This function shouldn't be used |
718 | | // for secret values; use |BN_mod_inverse_blinded| instead. Or, if |n| is |
719 | | // guaranteed to be prime, use |
720 | | // |BN_mod_exp_mont_consttime(out, a, m_minus_2, m, ctx, m_mont)|, taking |
721 | | // advantage of Fermat's Little Theorem. |
722 | | OPENSSL_EXPORT BIGNUM *BN_mod_inverse(BIGNUM *out, const BIGNUM *a, |
723 | | const BIGNUM *n, BN_CTX *ctx); |
724 | | |
725 | | // BN_mod_inverse_blinded sets |out| equal to |a|^-1, mod |n|, where |n| is the |
726 | | // Montgomery modulus for |mont|. |a| must be non-negative and must be less |
727 | | // than |n|. |n| must be greater than 1. |a| is blinded (masked by a random |
728 | | // value) to protect it against side-channel attacks. On failure, if the failure |
729 | | // was caused by |a| having no inverse mod |n| then |*out_no_inverse| will be |
730 | | // set to one; otherwise it will be set to zero. |
731 | | // |
732 | | // Note this function may incorrectly report |a| has no inverse if the random |
733 | | // blinding value has no inverse. It should only be used when |n| has few |
734 | | // non-invertible elements, such as an RSA modulus. |
735 | | OPENSSL_EXPORT int BN_mod_inverse_blinded(BIGNUM *out, int *out_no_inverse, |
736 | | const BIGNUM *a, |
737 | | const BN_MONT_CTX *mont, BN_CTX *ctx); |
738 | | |
739 | | // BN_mod_inverse_odd sets |out| equal to |a|^-1, mod |n|. |a| must be |
740 | | // non-negative and must be less than |n|. |n| must be odd. This function |
741 | | // shouldn't be used for secret values; use |BN_mod_inverse_blinded| instead. |
742 | | // Or, if |n| is guaranteed to be prime, use |
743 | | // |BN_mod_exp_mont_consttime(out, a, m_minus_2, m, ctx, m_mont)|, taking |
744 | | // advantage of Fermat's Little Theorem. It returns one on success or zero on |
745 | | // failure. On failure, if the failure was caused by |a| having no inverse mod |
746 | | // |n| then |*out_no_inverse| will be set to one; otherwise it will be set to |
747 | | // zero. |
748 | | int BN_mod_inverse_odd(BIGNUM *out, int *out_no_inverse, const BIGNUM *a, |
749 | | const BIGNUM *n, BN_CTX *ctx); |
750 | | |
751 | | |
752 | | // Montgomery arithmetic. |
753 | | |
754 | | // BN_MONT_CTX contains the precomputed values needed to work in a specific |
755 | | // Montgomery domain. |
756 | | |
757 | | // BN_MONT_CTX_new_for_modulus returns a fresh |BN_MONT_CTX| given the modulus, |
758 | | // |mod| or NULL on error. Note this function assumes |mod| is public. |
759 | | OPENSSL_EXPORT BN_MONT_CTX *BN_MONT_CTX_new_for_modulus(const BIGNUM *mod, |
760 | | BN_CTX *ctx); |
761 | | |
762 | | // BN_MONT_CTX_new_consttime behaves like |BN_MONT_CTX_new_for_modulus| but |
763 | | // treats |mod| as secret. |
764 | | OPENSSL_EXPORT BN_MONT_CTX *BN_MONT_CTX_new_consttime(const BIGNUM *mod, |
765 | | BN_CTX *ctx); |
766 | | |
767 | | // BN_MONT_CTX_free frees memory associated with |mont|. |
768 | | OPENSSL_EXPORT void BN_MONT_CTX_free(BN_MONT_CTX *mont); |
769 | | |
770 | | // BN_MONT_CTX_copy sets |to| equal to |from|. It returns |to| on success or |
771 | | // NULL on error. |
772 | | OPENSSL_EXPORT BN_MONT_CTX *BN_MONT_CTX_copy(BN_MONT_CTX *to, |
773 | | const BN_MONT_CTX *from); |
774 | | |
775 | | // BN_to_montgomery sets |ret| equal to |a| in the Montgomery domain. |a| is |
776 | | // assumed to be in the range [0, n), where |n| is the Montgomery modulus. It |
777 | | // returns one on success or zero on error. |
778 | | OPENSSL_EXPORT int BN_to_montgomery(BIGNUM *ret, const BIGNUM *a, |
779 | | const BN_MONT_CTX *mont, BN_CTX *ctx); |
780 | | |
781 | | // BN_from_montgomery sets |ret| equal to |a| * R^-1, i.e. translates values out |
782 | | // of the Montgomery domain. |a| is assumed to be in the range [0, n*R), where |
783 | | // |n| is the Montgomery modulus. Note n < R, so inputs in the range [0, n*n) |
784 | | // are valid. This function returns one on success or zero on error. |
785 | | OPENSSL_EXPORT int BN_from_montgomery(BIGNUM *ret, const BIGNUM *a, |
786 | | const BN_MONT_CTX *mont, BN_CTX *ctx); |
787 | | |
788 | | // BN_mod_mul_montgomery set |r| equal to |a| * |b|, in the Montgomery domain. |
789 | | // Both |a| and |b| must already be in the Montgomery domain (by |
790 | | // |BN_to_montgomery|). In particular, |a| and |b| are assumed to be in the |
791 | | // range [0, n), where |n| is the Montgomery modulus. It returns one on success |
792 | | // or zero on error. |
793 | | OPENSSL_EXPORT int BN_mod_mul_montgomery(BIGNUM *r, const BIGNUM *a, |
794 | | const BIGNUM *b, |
795 | | const BN_MONT_CTX *mont, BN_CTX *ctx); |
796 | | |
797 | | |
798 | | // Exponentiation. |
799 | | |
800 | | // BN_exp sets |r| equal to |a|^{|p|}. It does so with a square-and-multiply |
801 | | // algorithm that leaks side-channel information. It returns one on success or |
802 | | // zero otherwise. |
803 | | OPENSSL_EXPORT int BN_exp(BIGNUM *r, const BIGNUM *a, const BIGNUM *p, |
804 | | BN_CTX *ctx); |
805 | | |
806 | | // BN_mod_exp sets |r| equal to |a|^{|p|} mod |m|. It does so with the best |
807 | | // algorithm for the values provided. It returns one on success or zero |
808 | | // otherwise. The |BN_mod_exp_mont_consttime| variant must be used if the |
809 | | // exponent is secret. |
810 | | OPENSSL_EXPORT int BN_mod_exp(BIGNUM *r, const BIGNUM *a, const BIGNUM *p, |
811 | | const BIGNUM *m, BN_CTX *ctx); |
812 | | |
813 | | // BN_mod_exp_mont behaves like |BN_mod_exp| but treats |a| as secret and |
814 | | // requires 0 <= |a| < |m|. |
815 | | OPENSSL_EXPORT int BN_mod_exp_mont(BIGNUM *r, const BIGNUM *a, const BIGNUM *p, |
816 | | const BIGNUM *m, BN_CTX *ctx, |
817 | | const BN_MONT_CTX *mont); |
818 | | |
819 | | // BN_mod_exp_mont_consttime behaves like |BN_mod_exp| but treats |a|, |p|, and |
820 | | // |m| as secret and requires 0 <= |a| < |m|. |
821 | | OPENSSL_EXPORT int BN_mod_exp_mont_consttime(BIGNUM *rr, const BIGNUM *a, |
822 | | const BIGNUM *p, const BIGNUM *m, |
823 | | BN_CTX *ctx, |
824 | | const BN_MONT_CTX *mont); |
825 | | |
826 | | |
827 | | // Deprecated functions |
828 | | |
829 | | // BN_bn2mpi serialises the value of |in| to |out|, using a format that consists |
830 | | // of the number's length in bytes represented as a 4-byte big-endian number, |
831 | | // and the number itself in big-endian format, where the most significant bit |
832 | | // signals a negative number. (The representation of numbers with the MSB set is |
833 | | // prefixed with null byte). |out| must have sufficient space available; to |
834 | | // find the needed amount of space, call the function with |out| set to NULL. |
835 | | OPENSSL_EXPORT size_t BN_bn2mpi(const BIGNUM *in, uint8_t *out); |
836 | | |
837 | | // BN_mpi2bn parses |len| bytes from |in| and returns the resulting value. The |
838 | | // bytes at |in| are expected to be in the format emitted by |BN_bn2mpi|. |
839 | | // |
840 | | // If |out| is NULL then a fresh |BIGNUM| is allocated and returned, otherwise |
841 | | // |out| is reused and returned. On error, NULL is returned and the error queue |
842 | | // is updated. |
843 | | OPENSSL_EXPORT BIGNUM *BN_mpi2bn(const uint8_t *in, size_t len, BIGNUM *out); |
844 | | |
845 | | // BN_mod_exp_mont_word is like |BN_mod_exp_mont| except that the base |a| is |
846 | | // given as a |BN_ULONG| instead of a |BIGNUM *|. It returns one on success |
847 | | // or zero otherwise. |
848 | | OPENSSL_EXPORT int BN_mod_exp_mont_word(BIGNUM *r, BN_ULONG a, const BIGNUM *p, |
849 | | const BIGNUM *m, BN_CTX *ctx, |
850 | | const BN_MONT_CTX *mont); |
851 | | |
852 | | // BN_mod_exp2_mont calculates (a1^p1) * (a2^p2) mod m. It returns 1 on success |
853 | | // or zero otherwise. |
854 | | OPENSSL_EXPORT int BN_mod_exp2_mont(BIGNUM *r, const BIGNUM *a1, |
855 | | const BIGNUM *p1, const BIGNUM *a2, |
856 | | const BIGNUM *p2, const BIGNUM *m, |
857 | | BN_CTX *ctx, const BN_MONT_CTX *mont); |
858 | | |
859 | | // BN_MONT_CTX_new returns a fresh |BN_MONT_CTX| or NULL on allocation failure. |
860 | | // Use |BN_MONT_CTX_new_for_modulus| instead. |
861 | | OPENSSL_EXPORT BN_MONT_CTX *BN_MONT_CTX_new(void); |
862 | | |
863 | | // BN_MONT_CTX_set sets up a Montgomery context given the modulus, |mod|. It |
864 | | // returns one on success and zero on error. Use |BN_MONT_CTX_new_for_modulus| |
865 | | // instead. |
866 | | OPENSSL_EXPORT int BN_MONT_CTX_set(BN_MONT_CTX *mont, const BIGNUM *mod, |
867 | | BN_CTX *ctx); |
868 | | |
869 | | // BN_bn2binpad behaves like |BN_bn2bin_padded|, but it returns |len| on success |
870 | | // and -1 on error. |
871 | | // |
872 | | // Use |BN_bn2bin_padded| instead. It is |size_t|-clean. |
873 | | OPENSSL_EXPORT int BN_bn2binpad(const BIGNUM *in, uint8_t *out, int len); |
874 | | |
875 | | // BN_bn2lebinpad behaves like |BN_bn2le_padded|, but it returns |len| on |
876 | | // success and -1 on error. |
877 | | // |
878 | | // Use |BN_bn2le_padded| instead. It is |size_t|-clean. |
879 | | OPENSSL_EXPORT int BN_bn2lebinpad(const BIGNUM *in, uint8_t *out, int len); |
880 | | |
881 | | // BN_prime_checks is a deprecated alias for |BN_prime_checks_for_validation|. |
882 | | // Use |BN_prime_checks_for_generation| or |BN_prime_checks_for_validation| |
883 | | // instead. (This defaults to the |_for_validation| value in order to be |
884 | | // conservative.) |
885 | | #define BN_prime_checks BN_prime_checks_for_validation |
886 | | |
887 | | // BN_secure_new calls |BN_new|. |
888 | | OPENSSL_EXPORT BIGNUM *BN_secure_new(void); |
889 | | |
890 | | // BN_le2bn calls |BN_lebin2bn|. |
891 | | OPENSSL_EXPORT BIGNUM *BN_le2bn(const uint8_t *in, size_t len, BIGNUM *ret); |
892 | | |
893 | | |
894 | | // Private functions |
895 | | |
896 | | struct bignum_st { |
897 | | // d is a pointer to an array of |width| |BN_BITS2|-bit chunks in |
898 | | // little-endian order. This stores the absolute value of the number. |
899 | | BN_ULONG *d; |
900 | | // width is the number of elements of |d| which are valid. This value is not |
901 | | // necessarily minimal; the most-significant words of |d| may be zero. |
902 | | // |width| determines a potentially loose upper-bound on the absolute value |
903 | | // of the |BIGNUM|. |
904 | | // |
905 | | // Functions taking |BIGNUM| inputs must compute the same answer for all |
906 | | // possible widths. |bn_minimal_width|, |bn_set_minimal_width|, and other |
907 | | // helpers may be used to recover the minimal width, provided it is not |
908 | | // secret. If it is secret, use a different algorithm. Functions may output |
909 | | // minimal or non-minimal |BIGNUM|s depending on secrecy requirements, but |
910 | | // those which cause widths to unboundedly grow beyond the minimal value |
911 | | // should be documented such. |
912 | | // |
913 | | // Note this is different from historical |BIGNUM| semantics. |
914 | | int width; |
915 | | // dmax is number of elements of |d| which are allocated. |
916 | | int dmax; |
917 | | // neg is one if the number if negative and zero otherwise. |
918 | | int neg; |
919 | | // flags is a bitmask of |BN_FLG_*| values |
920 | | int flags; |
921 | | }; |
922 | | |
923 | | OPENSSL_EXPORT unsigned BN_num_bits_word(BN_ULONG l); |
924 | | |
925 | 1.48M | #define BN_FLG_MALLOCED 0x01 |
926 | 1.75M | #define BN_FLG_STATIC_DATA 0x02 |
927 | | // |BN_FLG_CONSTTIME| has been removed and intentionally omitted so code relying |
928 | | // on it will not compile. Consumers outside BoringSSL should use the |
929 | | // higher-level cryptographic algorithms exposed by other modules. Consumers |
930 | | // within the library should call the appropriate timing-sensitive algorithm |
931 | | // directly. |
932 | | |
933 | | |
934 | | #if defined(__cplusplus) |
935 | | } // extern C |
936 | | |
937 | | #if !defined(BORINGSSL_NO_CXX) |
938 | | extern "C++" { |
939 | | |
940 | | BSSL_NAMESPACE_BEGIN |
941 | | |
942 | | BORINGSSL_MAKE_DELETER(BIGNUM, BN_free) |
943 | | BORINGSSL_MAKE_DELETER(BN_CTX, BN_CTX_free) |
944 | | BORINGSSL_MAKE_DELETER(BN_MONT_CTX, BN_MONT_CTX_free) |
945 | | |
946 | | class BN_CTXScope { |
947 | | public: |
948 | 21.3M | BN_CTXScope(BN_CTX *ctx) : ctx_(ctx) { BN_CTX_start(ctx_); } |
949 | 21.3M | ~BN_CTXScope() { BN_CTX_end(ctx_); } |
950 | | |
951 | | private: |
952 | | BN_CTX *ctx_; |
953 | | |
954 | | BN_CTXScope(BN_CTXScope &) = delete; |
955 | | BN_CTXScope &operator=(BN_CTXScope &) = delete; |
956 | | }; |
957 | | |
958 | | BSSL_NAMESPACE_END |
959 | | |
960 | | } // extern C++ |
961 | | #endif |
962 | | |
963 | | #endif |
964 | | |
965 | | #define BN_R_ARG2_LT_ARG3 100 |
966 | | #define BN_R_BAD_RECIPROCAL 101 |
967 | | #define BN_R_BIGNUM_TOO_LONG 102 |
968 | | #define BN_R_BITS_TOO_SMALL 103 |
969 | | #define BN_R_CALLED_WITH_EVEN_MODULUS 104 |
970 | | #define BN_R_DIV_BY_ZERO 105 |
971 | | #define BN_R_EXPAND_ON_STATIC_BIGNUM_DATA 106 |
972 | | #define BN_R_INPUT_NOT_REDUCED 107 |
973 | | #define BN_R_INVALID_RANGE 108 |
974 | | #define BN_R_NEGATIVE_NUMBER 109 |
975 | 938 | #define BN_R_NOT_A_SQUARE 110 |
976 | | #define BN_R_NOT_INITIALIZED 111 |
977 | | #define BN_R_NO_INVERSE 112 |
978 | | #define BN_R_PRIVATE_KEY_TOO_LARGE 113 |
979 | | #define BN_R_P_IS_NOT_PRIME 114 |
980 | | #define BN_R_TOO_MANY_ITERATIONS 115 |
981 | | #define BN_R_TOO_MANY_TEMPORARY_VARIABLES 116 |
982 | | #define BN_R_BAD_ENCODING 117 |
983 | | #define BN_R_ENCODE_ERROR 118 |
984 | | #define BN_R_INVALID_INPUT 119 |
985 | | |
986 | | #endif // OPENSSL_HEADER_BN_H |