1 /* crypto/bn/bn.h */ 2 /* Copyright (C) 1995-1997 Eric Young (eay@cryptsoft.com) 3 * All rights reserved. 4 * 5 * This package is an SSL implementation written 6 * by Eric Young (eay@cryptsoft.com). 7 * The implementation was written so as to conform with Netscapes SSL. 8 * 9 * This library is free for commercial and non-commercial use as long as 10 * the following conditions are aheared to. The following conditions 11 * apply to all code found in this distribution, be it the RC4, RSA, 12 * lhash, DES, etc., code; not just the SSL code. The SSL documentation 13 * included with this distribution is covered by the same copyright terms 14 * except that the holder is Tim Hudson (tjh@cryptsoft.com). 15 * 16 * Copyright remains Eric Young's, and as such any Copyright notices in 17 * the code are not to be removed. 18 * If this package is used in a product, Eric Young should be given attribution 19 * as the author of the parts of the library used. 20 * This can be in the form of a textual message at program startup or 21 * in documentation (online or textual) provided with the package. 22 * 23 * Redistribution and use in source and binary forms, with or without 24 * modification, are permitted provided that the following conditions 25 * are met: 26 * 1. Redistributions of source code must retain the copyright 27 * notice, this list of conditions and the following disclaimer. 28 * 2. Redistributions in binary form must reproduce the above copyright 29 * notice, this list of conditions and the following disclaimer in the 30 * documentation and/or other materials provided with the distribution. 31 * 3. All advertising materials mentioning features or use of this software 32 * must display the following acknowledgement: 33 * "This product includes cryptographic software written by 34 * Eric Young (eay@cryptsoft.com)" 35 * The word 'cryptographic' can be left out if the rouines from the library 36 * being used are not cryptographic related :-). 37 * 4. If you include any Windows specific code (or a derivative thereof) from 38 * the apps directory (application code) you must include an acknowledgement: 39 * "This product includes software written by Tim Hudson (tjh@cryptsoft.com)" 40 * 41 * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND 42 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 43 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 44 * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE 45 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 46 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 47 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 48 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 49 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 50 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 51 * SUCH DAMAGE. 52 * 53 * The licence and distribution terms for any publically available version or 54 * derivative of this code cannot be changed. i.e. this code cannot simply be 55 * copied and put under another distribution licence 56 * [including the GNU Public Licence.] 57 */ 58 /* ==================================================================== 59 * Copyright (c) 1998-2006 The OpenSSL Project. All rights reserved. 60 * 61 * Redistribution and use in source and binary forms, with or without 62 * modification, are permitted provided that the following conditions 63 * are met: 64 * 65 * 1. Redistributions of source code must retain the above copyright 66 * notice, this list of conditions and the following disclaimer. 67 * 68 * 2. Redistributions in binary form must reproduce the above copyright 69 * notice, this list of conditions and the following disclaimer in 70 * the documentation and/or other materials provided with the 71 * distribution. 72 * 73 * 3. All advertising materials mentioning features or use of this 74 * software must display the following acknowledgment: 75 * "This product includes software developed by the OpenSSL Project 76 * for use in the OpenSSL Toolkit. (http://www.openssl.org/)" 77 * 78 * 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to 79 * endorse or promote products derived from this software without 80 * prior written permission. For written permission, please contact 81 * openssl-core@openssl.org. 82 * 83 * 5. Products derived from this software may not be called "OpenSSL" 84 * nor may "OpenSSL" appear in their names without prior written 85 * permission of the OpenSSL Project. 86 * 87 * 6. Redistributions of any form whatsoever must retain the following 88 * acknowledgment: 89 * "This product includes software developed by the OpenSSL Project 90 * for use in the OpenSSL Toolkit (http://www.openssl.org/)" 91 * 92 * THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY 93 * EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 94 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 95 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE OpenSSL PROJECT OR 96 * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 97 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT 98 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; 99 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 100 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, 101 * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 102 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED 103 * OF THE POSSIBILITY OF SUCH DAMAGE. 104 * ==================================================================== 105 * 106 * This product includes cryptographic software written by Eric Young 107 * (eay@cryptsoft.com). This product includes software written by Tim 108 * Hudson (tjh@cryptsoft.com). 109 * 110 */ 111 /* ==================================================================== 112 * Copyright 2002 Sun Microsystems, Inc. ALL RIGHTS RESERVED. 113 * 114 * Portions of the attached software ("Contribution") are developed by 115 * SUN MICROSYSTEMS, INC., and are contributed to the OpenSSL project. 116 * 117 * The Contribution is licensed pursuant to the Eric Young open source 118 * license provided above. 119 * 120 * The binary polynomial arithmetic software is originally written by 121 * Sheueling Chang Shantz and Douglas Stebila of Sun Microsystems Laboratories. 122 * 123 */ 124 125 module deimos.openssl.bn; 126 127 import deimos.openssl._d_util; 128 129 public import deimos.openssl.e_os2; 130 version(OPENSSL_NO_FP_API) {} else { 131 import core.stdc.stdio; /* FILE */ 132 } 133 public import deimos.openssl.ossl_typ; 134 public import deimos.openssl.crypto; 135 136 extern (C): 137 nothrow: 138 139 /+ Not ported, internal only. 140 /* These preprocessor symbols control various aspects of the bignum headers and 141 * library code. They're not defined by any "normal" configuration, as they are 142 * intended for development and testing purposes. NB: defining all three can be 143 * useful for debugging application code as well as openssl itself. 144 * 145 * BN_DEBUG - turn on various debugging alterations to the bignum code 146 * BN_DEBUG_RAND - uses random poisoning of unused words to trip up 147 * mismanagement of bignum internals. You must also define BN_DEBUG. 148 */ 149 /* #define BN_DEBUG */ 150 /* #define BN_DEBUG_RAND */ 151 152 // #ifndef OPENSSL_SMALL_FOOTPRINT 153 // #define BN_MUL_COMBA 154 // #define BN_SQR_COMBA 155 // #define BN_RECURSION 156 // #endif 157 158 /* This next option uses the C libraries (2 word)/(1 word) function. 159 * If it is not defined, I use my C version (which is slower). 160 * The reason for this flag is that when the particular C compiler 161 * library routine is used, and the library is linked with a different 162 * compiler, the library is missing. This mostly happens when the 163 * library is built with gcc and then linked using normal cc. This would 164 * be a common occurrence because gcc normally produces code that is 165 * 2 times faster than system compilers for the big number stuff. 166 * For machines with only one compiler (or shared libraries), this should 167 * be on. Again this in only really a problem on machines 168 * using "long long's", are 32bit, and are not using my assembler code. */ 169 #if defined(OPENSSL_SYS_MSDOS) || defined(OPENSSL_SYS_WINDOWS) || \ 170 defined(OPENSSL_SYS_WIN32) || defined(linux) 171 # ifndef BN_DIV2W 172 # define BN_DIV2W 173 # endif 174 #endif 175 176 177 /* assuming c_long is 64bit - this is the DEC Alpha 178 * c_ulong c_long is only 64 bits :-(, don't define 179 * BN_LLONG for the DEC Alpha */ 180 #ifdef SIXTY_FOUR_BIT_LONG 181 alias c_ulong BN_ULLONG; c_long 182 alias c_ulong BN_ULONG; 183 alias c_long BN_LONG; 184 enum BN_BITS = 128; 185 enum BN_BYTES = 8; 186 enum BN_BITS2 = 64; 187 enum BN_BITS4 = 32; 188 #define BN_MASK (0xffffffffffffffffffffffffffffffffLL) 189 #define BN_MASK2 (0xffffffffffffffffL) 190 #define BN_MASK2l (0xffffffffL) 191 #define BN_MASK2h (0xffffffff00000000L) 192 #define BN_MASK2h1 (0xffffffff80000000L) 193 #define BN_TBIT (0x8000000000000000L) 194 enum BN_DEC_CONV = (10000000000000000000UL); 195 enum BN_DEC_FMT1 = "%lu"; 196 enum BN_DEC_FMT2 = "%019lu"; 197 enum BN_DEC_NUM = 19; 198 enum BN_HEX_FMT1 = "%lX"; 199 enum BN_HEX_FMT2 = "%016lX"; 200 #endif 201 202 /* This is where the c_long long data type is 64 bits, but c_long is 32. 203 * For machines where there are 64bit registers, this is the mode to use. 204 * IRIX, on R4000 and above should use this mode, along with the relevant 205 * assembler code :-). Do NOT define BN_LLONG. 206 */ 207 #ifdef SIXTY_FOUR_BIT 208 #undef BN_LLONG 209 #undef BN_ULLONG 210 alias c_ulong BN_ULONG; c_long 211 alias c_long BN_LONG; long 212 enum BN_BITS = 128; 213 enum BN_BYTES = 8; 214 enum BN_BITS2 = 64; 215 enum BN_BITS4 = 32; 216 #define BN_MASK2 (0xffffffffffffffffLL) 217 #define BN_MASK2l (0xffffffffL) 218 #define BN_MASK2h (0xffffffff00000000LL) 219 #define BN_MASK2h1 (0xffffffff80000000LL) 220 #define BN_TBIT (0x8000000000000000LL) 221 enum BN_DEC_CONV = (10000000000000000000ULL); 222 enum BN_DEC_FMT1 = "%llu"; 223 enum BN_DEC_FMT2 = "%019llu"; 224 enum BN_DEC_NUM = 19; 225 enum BN_HEX_FMT1 = "%llX"; 226 enum BN_HEX_FMT2 = "%016llX"; 227 #endif 228 229 #ifdef THIRTY_TWO_BIT+/ 230 // #ifdef BN_LLONG 231 // # if defined(_WIN32) && !defined(__GNUC__) 232 // # define BN_ULLONG unsigned __int64 233 // # define BN_MASK (0xffffffffffffffffI64) 234 // # else 235 // # define BN_ULLONG c_ulong c_long 236 // # define BN_MASK (0xffffffffffffffffLL) 237 // # endif 238 // #endif 239 // FIXME: Is this correct? 240 alias ulong BN_ULLONG; 241 alias uint BN_ULONG; 242 alias int BN_LONG; 243 enum BN_BITS = 64; 244 enum BN_BYTES = 4; 245 enum BN_BITS2 = 32; 246 enum BN_BITS4 = 16; 247 enum BN_MASK2 = 0xffffffff; 248 enum BN_MASK2l = 0xffff; 249 enum BN_MASK2h1 = 0xffff8000; 250 enum BN_MASK2h = 0xffff0000; 251 enum BN_TBIT = 0x80000000; 252 enum BN_DEC_CONV = 1000000000; 253 enum BN_DEC_FMT1 = "%u"; 254 enum BN_DEC_FMT2 = "%09u"; 255 enum BN_DEC_NUM = 9; 256 enum BN_HEX_FMT1 = "%X"; 257 enum BN_HEX_FMT2 = "%08X"; 258 /+#endif 259 260 /* 2011-02-22 SMS. 261 * In various places, a size_t variable or a type cast to size_t was 262 * used to perform integer-only operations on pointers. This failed on 263 * VMS with 64-bit pointers (CC /POINTER_SIZE = 64) because size_t is 264 * still only 32 bits. What's needed in these cases is an integer type 265 * with the same size as a pointer, which size_t is not certain to be. 266 * The only fix here is VMS-specific. 267 */ 268 #if defined(OPENSSL_SYS_VMS) 269 # if __INITIAL_POINTER_SIZE == 64 270 # define PTR_SIZE_INT c_long long 271 # else /* __INITIAL_POINTER_SIZE == 64 */ 272 # define PTR_SIZE_INT int 273 # endif /* __INITIAL_POINTER_SIZE == 64 [else] */ 274 #else /* defined(OPENSSL_SYS_VMS) */ 275 # define PTR_SIZE_INT size_t 276 #endif /* defined(OPENSSL_SYS_VMS) [else] */ 277 +/ 278 enum BN_DEFAULT_BITS = 1280; 279 280 enum BN_FLG_MALLOCED = 0x01; 281 enum BN_FLG_STATIC_DATA = 0x02; 282 enum BN_FLG_CONSTTIME = 0x04; /* avoid leaking exponent information through timing, 283 * BN_mod_exp_mont() will call BN_mod_exp_mont_consttime, 284 * BN_div() will call BN_div_no_branch, 285 * BN_mod_inverse() will call BN_mod_inverse_no_branch. 286 */ 287 288 version(OPENSSL_NO_DEPRECATED) {} else { 289 alias BN_FLG_CONSTTIME BN_FLG_EXP_CONSTTIME; /* deprecated name for the flag */ 290 /* avoid leaking exponent information through timings 291 * (BN_mod_exp_mont() will call BN_mod_exp_mont_consttime) */ 292 } 293 294 version(OPENSSL_NO_DEPRECATED) {} else { 295 enum BN_FLG_FREE = 0x8000; /* used for debuging */ 296 } 297 void BN_set_flags()(BIGNUM* b, int n) { b.flags |= n; } 298 int BN_get_flags()(const(BIGNUM)* b, int n) { return b.flags & n; } 299 300 /* get a clone of a BIGNUM with changed flags, for* temporary* use only 301 * (the two BIGNUMs cannot not be used in parallel!) */ 302 void BN_with_flags()(BIGNUM* dest, BIGNUM* b, int n) { 303 dest.d=b.d; 304 dest.top=b.top; 305 dest.dmax=b.dmax; 306 dest.neg=b.neg; 307 dest.flags=(dest.flags & BN_FLG_MALLOCED) 308 | (b.flags & ~BN_FLG_MALLOCED) 309 | BN_FLG_STATIC_DATA 310 | n; 311 } 312 313 /* Already declared in ossl_typ.h */ 314 version (none) { 315 alias bignum_st BIGNUM; 316 /* Used for temp variables (declaration hidden in bn_lcl.h) */ 317 alias bignum_ctx BN_CTX; 318 alias bn_blinding_st BN_BLINDING; 319 alias bn_mont_ctx_st BN_MONT_CTX; 320 alias bn_recp_ctx_st BN_RECP_CTX; 321 alias bn_gencb_st BN_GENCB; 322 } 323 324 struct bignum_st 325 { 326 BN_ULONG* d; /* Pointer to an array of 'BN_BITS2' bit chunks. */ 327 int top; /* Index of last used d +1. */ 328 /* The next are internal book keeping for bn_expand. */ 329 int dmax; /* Size of the d array. */ 330 int neg; /* one if the number is negative */ 331 int flags; 332 }; 333 334 /* Used for montgomery multiplication */ 335 struct bn_mont_ctx_st 336 { 337 int ri; /* number of bits in R */ 338 BIGNUM RR; /* used to convert to montgomery form */ 339 BIGNUM N; /* The modulus */ 340 BIGNUM Ni; /* R*(1/R mod N) - N*Ni = 1 341 * (Ni is only stored for bignum algorithm) */ 342 BN_ULONG[2] n0;/* least significant word(s) of Ni; 343 (type changed with 0.9.9, was "BN_ULONG n0;" before) */ 344 int flags; 345 }; 346 347 /* Used for reciprocal division/mod functions 348 * It cannot be shared between threads 349 */ 350 struct bn_recp_ctx_st 351 { 352 BIGNUM N; /* the divisor */ 353 BIGNUM Nr; /* the reciprocal */ 354 int num_bits; 355 int shift; 356 int flags; 357 }; 358 359 /* Used for slow "generation" functions. */ 360 struct bn_gencb_st 361 { 362 uint ver; /* To handle binary (in)compatibility */ 363 void* arg; /* callback-specific data */ 364 union cb_ 365 { 366 /* if(ver==1) - handles old style callbacks */ 367 ExternC!(void function(int, int, void*)) cb_1; 368 /* if(ver==2) - new callback style */ 369 ExternC!(int function(int, int, BN_GENCB*)) cb_2; 370 } 371 cb_ cb; 372 }; 373 /* Wrapper function to make using BN_GENCB easier, */ 374 int BN_GENCB_call(BN_GENCB* cb, int a, int b); 375 /* Macro to populate a BN_GENCB structure with an "old"-style callback */ 376 void BN_GENCB_set_old()(gencb, callback, cb_arg) { 377 BN_GENCB* tmp_gencb = (gencb); 378 tmp_gencb.ver = 1; 379 tmp_gencb.arg = (cb_arg); 380 tmp_gencb.cb.cb_1 = (callback); 381 } 382 /* Macro to populate a BN_GENCB structure with a "new"-style callback */ 383 void BN_GENCB_set()(gencb, callback, cb_arg) { 384 BN_GENCB* tmp_gencb = (gencb); 385 tmp_gencb.ver = 2; 386 tmp_gencb.arg = (cb_arg); 387 tmp_gencb.cb.cb_2 = (callback); 388 } 389 390 enum BN_prime_checks = 0; /* default: select number of iterations 391 based on the size of the number */ 392 393 /* number of Miller-Rabin iterations for an error rate of less than 2^-80 394 * for random 'b'-bit input, b >= 100 (taken from table 4.4 in the Handbook 395 * of Applied Cryptography [Menezes, van Oorschot, Vanstone; CRC Press 1996]; 396 * original paper: Damgaard, Landrock, Pomerance: Average case error estimates 397 * for the strong probable prime test. -- Math. Comp. 61 (1993) 177-194) */ 398 auto BN_prime_checks_for_size(T)(T b) { 399 return ((b) >= 1300 ? 2 : 400 (b) >= 850 ? 3 : 401 (b) >= 650 ? 4 : 402 (b) >= 550 ? 5 : 403 (b) >= 450 ? 6 : 404 (b) >= 400 ? 7 : 405 (b) >= 350 ? 8 : 406 (b) >= 300 ? 9 : 407 (b) >= 250 ? 12 : 408 (b) >= 200 ? 15 : 409 (b) >= 150 ? 18 : 410 /* b >= 100 */ 27); 411 } 412 413 auto BN_num_bytes()(const(BIGNUM)* a) { return (BN_num_bits(a)+7)/8; } 414 415 /* Note that BN_abs_is_word didn't work reliably for w == 0 until 0.9.8 */ 416 auto BN_abs_is_word()(const(BIGNUM)* a, BN_ULONG w) { return (((a.top == 1) && (a.d[0] == (w))) || 417 (((w) == 0) && (a.top == 0))); } 418 auto BN_is_zero()(const(BIGNUM)* a) { return (a.top == 0); } 419 auto BN_is_one()(const(BIGNUM)* a) { return (BN_abs_is_word((a),1) && !a.neg); } 420 auto BN_is_word()(const(BIGNUM)* a, BN_ULONG w) { return (BN_abs_is_word((a),(w)) && (!(w) || !a.neg)); } 421 auto BN_is_odd()(const(BIGNUM)* a) { return ((a.top > 0) && (a.d[0] & 1)); } 422 423 auto BN_one()(BIGNUM* a) { return BN_set_word((a),1); } 424 auto BN_zero_ex()(BIGNUM* a) { 425 a.top = 0; 426 a.neg = 0; 427 } 428 version (OPENSSL_NO_DEPRECATED) { 429 alias BN_zero_ex BN_zero; 430 } else { 431 auto BN_zero()(BIGNUM* a) { return BN_set_word(a,0); } 432 } 433 434 const(BIGNUM)* BN_value_one(); 435 char* BN_options(); 436 BN_CTX* BN_CTX_new(); 437 version(OPENSSL_NO_DEPRECATED) {} else { 438 void BN_CTX_init(BN_CTX* c); 439 } 440 void BN_CTX_free(BN_CTX* c); 441 void BN_CTX_start(BN_CTX* ctx); 442 BIGNUM* BN_CTX_get(BN_CTX* ctx); 443 void BN_CTX_end(BN_CTX* ctx); 444 int BN_rand(BIGNUM* rnd, int bits, int top,int bottom); 445 int BN_pseudo_rand(BIGNUM* rnd, int bits, int top,int bottom); 446 int BN_rand_range(BIGNUM* rnd, const(BIGNUM)* range); 447 int BN_pseudo_rand_range(BIGNUM* rnd, const(BIGNUM)* range); 448 int BN_num_bits(const(BIGNUM)* a); 449 int BN_num_bits_word(BN_ULONG); 450 BIGNUM* BN_new(); 451 void BN_init(BIGNUM*); 452 void BN_clear_free(BIGNUM* a); 453 BIGNUM* BN_copy(BIGNUM* a, const(BIGNUM)* b); 454 void BN_swap(BIGNUM* a, BIGNUM* b); 455 BIGNUM* BN_bin2bn(const(ubyte)* s,int len,BIGNUM* ret); 456 int BN_bn2bin(const(BIGNUM)* a, ubyte* to); 457 BIGNUM* BN_mpi2bn(const(ubyte)* s,int len,BIGNUM* ret); 458 int BN_bn2mpi(const(BIGNUM)* a, ubyte* to); 459 int BN_sub(BIGNUM* r, const(BIGNUM)* a, const(BIGNUM)* b); 460 int BN_usub(BIGNUM* r, const(BIGNUM)* a, const(BIGNUM)* b); 461 int BN_uadd(BIGNUM* r, const(BIGNUM)* a, const(BIGNUM)* b); 462 int BN_add(BIGNUM* r, const(BIGNUM)* a, const(BIGNUM)* b); 463 int BN_mul(BIGNUM* r, const(BIGNUM)* a, const(BIGNUM)* b, BN_CTX* ctx); 464 int BN_sqr(BIGNUM* r, const(BIGNUM)* a,BN_CTX* ctx); 465 /** BN_set_negative sets sign of a BIGNUM 466 * \param b pointer to the BIGNUM object 467 * \param n 0 if the BIGNUM b should be positive and a value != 0 otherwise 468 */ 469 void BN_set_negative(BIGNUM* b, int n); 470 /** BN_is_negative returns 1 if the BIGNUM is negative 471 * \param a pointer to the BIGNUM object 472 * \return 1 if a < 0 and 0 otherwise 473 */ 474 auto BN_is_negative()(const(BIGNUM)* a) { return a.neg != 0; } 475 476 int BN_div(BIGNUM* dv, BIGNUM* rem, const(BIGNUM)* m, const(BIGNUM)* d, 477 BN_CTX* ctx); 478 auto BN_mod()(BIGNUM* rem,const(BIGNUM)* m,const(BIGNUM)* d,BN_CTX* ctx) { return BN_div(null,(rem),(m),(d),(ctx)); } 479 int BN_nnmod(BIGNUM* r, const(BIGNUM)* m, const(BIGNUM)* d, BN_CTX* ctx); 480 int BN_mod_add(BIGNUM* r, const(BIGNUM)* a, const(BIGNUM)* b, const(BIGNUM)* m, BN_CTX* ctx); 481 int BN_mod_add_quick(BIGNUM* r, const(BIGNUM)* a, const(BIGNUM)* b, const(BIGNUM)* m); 482 int BN_mod_sub(BIGNUM* r, const(BIGNUM)* a, const(BIGNUM)* b, const(BIGNUM)* m, BN_CTX* ctx); 483 int BN_mod_sub_quick(BIGNUM* r, const(BIGNUM)* a, const(BIGNUM)* b, const(BIGNUM)* m); 484 int BN_mod_mul(BIGNUM* r, const(BIGNUM)* a, const(BIGNUM)* b, 485 const(BIGNUM)* m, BN_CTX* ctx); 486 int BN_mod_sqr(BIGNUM* r, const(BIGNUM)* a, const(BIGNUM)* m, BN_CTX* ctx); 487 int BN_mod_lshift1(BIGNUM* r, const(BIGNUM)* a, const(BIGNUM)* m, BN_CTX* ctx); 488 int BN_mod_lshift1_quick(BIGNUM* r, const(BIGNUM)* a, const(BIGNUM)* m); 489 int BN_mod_lshift(BIGNUM* r, const(BIGNUM)* a, int n, const(BIGNUM)* m, BN_CTX* ctx); 490 int BN_mod_lshift_quick(BIGNUM* r, const(BIGNUM)* a, int n, const(BIGNUM)* m); 491 492 BN_ULONG BN_mod_word(const(BIGNUM)* a, BN_ULONG w); 493 BN_ULONG BN_div_word(BIGNUM* a, BN_ULONG w); 494 int BN_mul_word(BIGNUM* a, BN_ULONG w); 495 int BN_add_word(BIGNUM* a, BN_ULONG w); 496 int BN_sub_word(BIGNUM* a, BN_ULONG w); 497 int BN_set_word(BIGNUM* a, BN_ULONG w); 498 BN_ULONG BN_get_word(const(BIGNUM)* a); 499 500 int BN_cmp(const(BIGNUM)* a, const(BIGNUM)* b); 501 void BN_free(BIGNUM* a); 502 int BN_is_bit_set(const(BIGNUM)* a, int n); 503 int BN_lshift(BIGNUM* r, const(BIGNUM)* a, int n); 504 int BN_lshift1(BIGNUM* r, const(BIGNUM)* a); 505 int BN_exp(BIGNUM* r, const(BIGNUM)* a, const(BIGNUM)* p,BN_CTX* ctx); 506 507 int BN_mod_exp(BIGNUM* r, const(BIGNUM)* a, const(BIGNUM)* p, 508 const(BIGNUM)* m,BN_CTX* ctx); 509 int BN_mod_exp_mont(BIGNUM* r, const(BIGNUM)* a, const(BIGNUM)* p, 510 const(BIGNUM)* m, BN_CTX* ctx, BN_MONT_CTX* m_ctx); 511 int BN_mod_exp_mont_consttime(BIGNUM* rr, const(BIGNUM)* a, const(BIGNUM)* p, 512 const(BIGNUM)* m, BN_CTX* ctx, BN_MONT_CTX* in_mont); 513 int BN_mod_exp_mont_word(BIGNUM* r, BN_ULONG a, const(BIGNUM)* p, 514 const(BIGNUM)* m, BN_CTX* ctx, BN_MONT_CTX* m_ctx); 515 int BN_mod_exp2_mont(BIGNUM* r, const(BIGNUM)* a1, const(BIGNUM)* p1, 516 const(BIGNUM)* a2, const(BIGNUM)* p2,const(BIGNUM)* m, 517 BN_CTX* ctx,BN_MONT_CTX* m_ctx); 518 int BN_mod_exp_simple(BIGNUM* r, const(BIGNUM)* a, const(BIGNUM)* p, 519 const(BIGNUM)* m,BN_CTX* ctx); 520 521 int BN_mask_bits(BIGNUM* a,int n); 522 version(OPENSSL_NO_FP_API) {} else { 523 int BN_print_fp(FILE* fp, const(BIGNUM)* a); 524 } 525 // #ifdef HEADER_BIO_H 526 import deimos.openssl.bio; 527 int BN_print(BIO* fp, const(BIGNUM)* a); 528 // #else 529 // int BN_print(void* fp, const(BIGNUM)* a); 530 // #endif 531 int BN_reciprocal(BIGNUM* r, const(BIGNUM)* m, int len, BN_CTX* ctx); 532 int BN_rshift(BIGNUM* r, const(BIGNUM)* a, int n); 533 int BN_rshift1(BIGNUM* r, const(BIGNUM)* a); 534 void BN_clear(BIGNUM* a); 535 BIGNUM* BN_dup(const(BIGNUM)* a); 536 int BN_ucmp(const(BIGNUM)* a, const(BIGNUM)* b); 537 int BN_set_bit(BIGNUM* a, int n); 538 int BN_clear_bit(BIGNUM* a, int n); 539 char* BN_bn2hex(const(BIGNUM)* a); 540 char* BN_bn2dec(const(BIGNUM)* a); 541 int BN_hex2bn(BIGNUM** a, const(char)* str); 542 int BN_dec2bn(BIGNUM** a, const(char)* str); 543 int BN_asc2bn(BIGNUM** a, const(char)* str); 544 int BN_gcd(BIGNUM* r,const(BIGNUM)* a,const(BIGNUM)* b,BN_CTX* ctx); 545 int BN_kronecker(const(BIGNUM)* a,const(BIGNUM)* b,BN_CTX* ctx); /* returns -2 for error */ 546 BIGNUM* BN_mod_inverse(BIGNUM* ret, 547 const(BIGNUM)* a, const(BIGNUM)* n,BN_CTX* ctx); 548 BIGNUM* BN_mod_sqrt(BIGNUM* ret, 549 const(BIGNUM)* a, const(BIGNUM)* n,BN_CTX* ctx); 550 551 void BN_consttime_swap(BN_ULONG swap, BIGNUM *a, BIGNUM *b, int nwords); 552 553 /* Deprecated versions */ 554 version(OPENSSL_NO_DEPRECATED) {} else { 555 BIGNUM* BN_generate_prime(BIGNUM* ret,int bits,int safe, 556 const(BIGNUM)* add, const(BIGNUM)* rem, 557 ExternC!(void function(int,int,void*)) callback,void* cb_arg); 558 int BN_is_prime(const(BIGNUM)* p,int nchecks, 559 ExternC!(void function(int,int,void*)) callback, 560 BN_CTX* ctx,void* cb_arg); 561 int BN_is_prime_fasttest(const(BIGNUM)* p,int nchecks, 562 ExternC!(void function(int,int,void*)) callback,BN_CTX* ctx,void* cb_arg, 563 int do_trial_division); 564 } /* !defined(OPENSSL_NO_DEPRECATED) */ 565 566 /* Newer versions */ 567 int BN_generate_prime_ex(BIGNUM* ret,int bits,int safe, const(BIGNUM)* add, 568 const(BIGNUM)* rem, BN_GENCB* cb); 569 int BN_is_prime_ex(const(BIGNUM)* p,int nchecks, BN_CTX* ctx, BN_GENCB* cb); 570 int BN_is_prime_fasttest_ex(const(BIGNUM)* p,int nchecks, BN_CTX* ctx, 571 int do_trial_division, BN_GENCB* cb); 572 573 int BN_X931_generate_Xpq(BIGNUM *Xp, BIGNUM *Xq, int nbits, BN_CTX *ctx); 574 575 int BN_X931_derive_prime_ex(BIGNUM *p, BIGNUM *p1, BIGNUM *p2, 576 const(BIGNUM)* Xp, const(BIGNUM)* Xp1, const(BIGNUM)* Xp2, 577 const(BIGNUM)* e, BN_CTX *ctx, BN_GENCB *cb); 578 int BN_X931_generate_prime_ex(BIGNUM *p, BIGNUM *p1, BIGNUM *p2, 579 BIGNUM *Xp1, BIGNUM *Xp2, 580 const(BIGNUM)* Xp, 581 const(BIGNUM)* e, BN_CTX *ctx, 582 BN_GENCB *cb); 583 584 BN_MONT_CTX* BN_MONT_CTX_new(); 585 void BN_MONT_CTX_init(BN_MONT_CTX* ctx); 586 int BN_mod_mul_montgomery(BIGNUM* r,const(BIGNUM)* a,const(BIGNUM)* b, 587 BN_MONT_CTX* mont, BN_CTX* ctx); 588 auto BN_to_montgomery()(BIGNUM* r,const(BIGNUM)* a,BN_MONT_CTX* mont,BN_CTX* ctx) { 589 BN_mod_mul_montgomery((r),(a),&(mont.RR),(mont),(ctx)); 590 } 591 int BN_from_montgomery(BIGNUM* r,const(BIGNUM)* a, 592 BN_MONT_CTX* mont, BN_CTX* ctx); 593 void BN_MONT_CTX_free(BN_MONT_CTX* mont); 594 int BN_MONT_CTX_set(BN_MONT_CTX* mont,const(BIGNUM)* mod,BN_CTX* ctx); 595 BN_MONT_CTX* BN_MONT_CTX_copy(BN_MONT_CTX* to,BN_MONT_CTX* from); 596 BN_MONT_CTX* BN_MONT_CTX_set_locked(BN_MONT_CTX** pmont, int lock, 597 const(BIGNUM)* mod, BN_CTX* ctx); 598 599 /* BN_BLINDING flags */ 600 enum BN_BLINDING_NO_UPDATE = 0x00000001; 601 enum BN_BLINDING_NO_RECREATE = 0x00000002; 602 603 BN_BLINDING* BN_BLINDING_new(const(BIGNUM)* A, const(BIGNUM)* Ai, BIGNUM* mod); 604 void BN_BLINDING_free(BN_BLINDING* b); 605 int BN_BLINDING_update(BN_BLINDING* b,BN_CTX* ctx); 606 int BN_BLINDING_convert(BIGNUM* n, BN_BLINDING* b, BN_CTX* ctx); 607 int BN_BLINDING_invert(BIGNUM* n, BN_BLINDING* b, BN_CTX* ctx); 608 int BN_BLINDING_convert_ex(BIGNUM* n, BIGNUM* r, BN_BLINDING* b, BN_CTX*); 609 int BN_BLINDING_invert_ex(BIGNUM* n, const(BIGNUM)* r, BN_BLINDING* b, BN_CTX*); 610 version(OPENSSL_NO_DEPRECATED) {} else { 611 c_ulong BN_BLINDING_get_thread_id(const(BN_BLINDING)*); 612 void BN_BLINDING_set_thread_id(BN_BLINDING*, c_ulong); 613 } 614 CRYPTO_THREADID* BN_BLINDING_thread_id(BN_BLINDING*); 615 c_ulong BN_BLINDING_get_flags(const(BN_BLINDING)*); 616 void BN_BLINDING_set_flags(BN_BLINDING*, c_ulong); 617 BN_BLINDING* BN_BLINDING_create_param(BN_BLINDING* b, 618 const(BIGNUM)* e, BIGNUM* m, BN_CTX* ctx, 619 ExternC!(int function(BIGNUM* r, const(BIGNUM)* a, const(BIGNUM)* p, 620 const(BIGNUM)* m, BN_CTX* ctx, BN_MONT_CTX* m_ctx)) bn_mod_exp, 621 BN_MONT_CTX* m_ctx); 622 623 version(OPENSSL_NO_DEPRECATED) {} else { 624 void BN_set_params(int mul,int high,int low,int mont); 625 int BN_get_params(int which); /* 0, mul, 1 high, 2 low, 3 mont */ 626 } 627 628 void BN_RECP_CTX_init(BN_RECP_CTX* recp); 629 BN_RECP_CTX* BN_RECP_CTX_new(); 630 void BN_RECP_CTX_free(BN_RECP_CTX* recp); 631 int BN_RECP_CTX_set(BN_RECP_CTX* recp,const(BIGNUM)* rdiv,BN_CTX* ctx); 632 int BN_mod_mul_reciprocal(BIGNUM* r, const(BIGNUM)* x, const(BIGNUM)* y, 633 BN_RECP_CTX* recp,BN_CTX* ctx); 634 int BN_mod_exp_recp(BIGNUM* r, const(BIGNUM)* a, const(BIGNUM)* p, 635 const(BIGNUM)* m, BN_CTX* ctx); 636 int BN_div_recp(BIGNUM* dv, BIGNUM* rem, const(BIGNUM)* m, 637 BN_RECP_CTX* recp, BN_CTX* ctx); 638 639 version(OPENSSL_NO_EC2M) {} else { 640 641 /* Functions for arithmetic over binary polynomials represented by BIGNUMs. 642 * 643 * The BIGNUM::neg property of BIGNUMs representing binary polynomials is 644 * ignored. 645 * 646 * Note that input arguments are not const so that their bit arrays can 647 * be expanded to the appropriate size if needed. 648 */ 649 650 int BN_GF2m_add(BIGNUM* r, const(BIGNUM)* a, const(BIGNUM)* b); /*r = a + b*/ 651 alias BN_GF2m_add BN_GF2m_sub; 652 int BN_GF2m_mod(BIGNUM* r, const(BIGNUM)* a, const(BIGNUM)* p); /*r=a mod p*/ 653 int BN_GF2m_mod_mul(BIGNUM* r, const(BIGNUM)* a, const(BIGNUM)* b, 654 const(BIGNUM)* p, BN_CTX* ctx); /* r = (a* b) mod p */ 655 int BN_GF2m_mod_sqr(BIGNUM* r, const(BIGNUM)* a, const(BIGNUM)* p, 656 BN_CTX* ctx); /* r = (a* a) mod p */ 657 int BN_GF2m_mod_inv(BIGNUM* r, const(BIGNUM)* b, const(BIGNUM)* p, 658 BN_CTX* ctx); /* r = (1 / b) mod p */ 659 int BN_GF2m_mod_div(BIGNUM* r, const(BIGNUM)* a, const(BIGNUM)* b, 660 const(BIGNUM)* p, BN_CTX* ctx); /* r = (a / b) mod p */ 661 int BN_GF2m_mod_exp(BIGNUM* r, const(BIGNUM)* a, const(BIGNUM)* b, 662 const(BIGNUM)* p, BN_CTX* ctx); /* r = (a ^ b) mod p */ 663 int BN_GF2m_mod_sqrt(BIGNUM* r, const(BIGNUM)* a, const(BIGNUM)* p, 664 BN_CTX* ctx); /* r = sqrt(a) mod p */ 665 int BN_GF2m_mod_solve_quad(BIGNUM* r, const(BIGNUM)* a, const(BIGNUM)* p, 666 BN_CTX* ctx); /* r^2 + r = a mod p */ 667 alias BN_ucmp BN_GF2m_cmp; 668 /* Some functions allow for representation of the irreducible polynomials 669 * as an uint[], say p. The irreducible f(t) is then of the form: 670 * t^p[0] + t^p[1] + ... + t^p[k] 671 * where m = p[0] > p[1] > ... > p[k] = 0. 672 */ 673 int BN_GF2m_mod_arr(BIGNUM* r, const(BIGNUM)* a, const int[] p); 674 /* r = a mod p */ 675 int BN_GF2m_mod_mul_arr(BIGNUM* r, const(BIGNUM)* a, const(BIGNUM)* b, 676 const int[] p, BN_CTX* ctx); /* r = (a* b) mod p */ 677 int BN_GF2m_mod_sqr_arr(BIGNUM* r, const(BIGNUM)* a, const int[] p, 678 BN_CTX* ctx); /* r = (a* a) mod p */ 679 int BN_GF2m_mod_inv_arr(BIGNUM* r, const(BIGNUM)* b, const int[] p, 680 BN_CTX* ctx); /* r = (1 / b) mod p */ 681 int BN_GF2m_mod_div_arr(BIGNUM* r, const(BIGNUM)* a, const(BIGNUM)* b, 682 const int[] p, BN_CTX* ctx); /* r = (a / b) mod p */ 683 int BN_GF2m_mod_exp_arr(BIGNUM* r, const(BIGNUM)* a, const(BIGNUM)* b, 684 const int[] p, BN_CTX* ctx); /* r = (a ^ b) mod p */ 685 int BN_GF2m_mod_sqrt_arr(BIGNUM* r, const(BIGNUM)* a, 686 const int[] p, BN_CTX* ctx); /* r = sqrt(a) mod p */ 687 int BN_GF2m_mod_solve_quad_arr(BIGNUM* r, const(BIGNUM)* a, 688 const int[] p, BN_CTX* ctx); /* r^2 + r = a mod p */ 689 int BN_GF2m_poly2arr(const(BIGNUM)* a, int[] p, int max); 690 int BN_GF2m_arr2poly(const int[] p, BIGNUM* a); 691 692 } 693 694 /* faster mod functions for the 'NIST primes' 695 * 0 <= a < p^2 */ 696 int BN_nist_mod_192(BIGNUM* r, const(BIGNUM)* a, const(BIGNUM)* p, BN_CTX* ctx); 697 int BN_nist_mod_224(BIGNUM* r, const(BIGNUM)* a, const(BIGNUM)* p, BN_CTX* ctx); 698 int BN_nist_mod_256(BIGNUM* r, const(BIGNUM)* a, const(BIGNUM)* p, BN_CTX* ctx); 699 int BN_nist_mod_384(BIGNUM* r, const(BIGNUM)* a, const(BIGNUM)* p, BN_CTX* ctx); 700 int BN_nist_mod_521(BIGNUM* r, const(BIGNUM)* a, const(BIGNUM)* p, BN_CTX* ctx); 701 702 const(BIGNUM)* BN_get0_nist_prime_192(); 703 const(BIGNUM)* BN_get0_nist_prime_224(); 704 const(BIGNUM)* BN_get0_nist_prime_256(); 705 const(BIGNUM)* BN_get0_nist_prime_384(); 706 const(BIGNUM)* BN_get0_nist_prime_521(); 707 708 /* library internal functions */ 709 710 auto bn_expand()(BIGNUM* a, int bits) { return ((((((bits+BN_BITS2-1))/BN_BITS2)) <= a.dmax)? 711 (a):bn_expand2((a),(bits+BN_BITS2-1)/BN_BITS2)); } 712 auto bn_wexpand()(BIGNUM* a, int words) { return (((words) <= a.dmax)?(a):bn_expand2((a),(words))); } 713 BIGNUM* bn_expand2(BIGNUM* a, int words); 714 version(OPENSSL_NO_DEPRECATED) {} else { 715 BIGNUM* bn_dup_expand(const(BIGNUM)* a, int words); /* unused */ 716 } 717 718 /+ FIXME: Not yet ported. 719 /* Bignum consistency macros 720 * There is one "API" macro, bn_fix_top(), for stripping leading zeroes from 721 * bignum data after direct manipulations on the data. There is also an 722 * "internal" macro, bn_check_top(), for verifying that there are no leading 723 * zeroes. Unfortunately, some auditing is required due to the fact that 724 * bn_fix_top() has become an overabused duct-tape because bignum data is 725 * occasionally passed around in an inconsistent state. So the following 726 * changes have been made to sort this out_; 727 * - bn_fix_top()s implementation has been moved to bn_correct_top() 728 * - if BN_DEBUG isn't defined, bn_fix_top() maps to bn_correct_top(), and 729 * bn_check_top() is as before. 730 * - if BN_DEBUG* is* defined; 731 * - bn_check_top() tries to pollute unused words even if the bignum 'top' is 732 * consistent. (ed: only if BN_DEBUG_RAND is defined) 733 * - bn_fix_top() maps to bn_check_top() rather than "fixing" anything. 734 * The idea is to have debug builds flag up inconsistent bignums when they 735 * occur. If that occurs in a bn_fix_top(), we examine the code in question; if 736 * the use of bn_fix_top() was appropriate (ie. it follows directly after code 737 * that manipulates the bignum) it is converted to bn_correct_top(), and if it 738 * was not appropriate, we convert it permanently to bn_check_top() and track 739 * down the cause of the bug. Eventually, no internal code should be using the 740 * bn_fix_top() macro. External applications and libraries should try this with 741 * their own code too, both in terms of building against the openssl headers 742 * with BN_DEBUG defined* and* linking with a version of OpenSSL built with it 743 * defined. This not only improves external code, it provides more test 744 * coverage for openssl's own code. 745 */ 746 747 #ifdef BN_DEBUG 748 749 /* We only need assert() when debugging */ 750 #include <assert.h> 751 752 #ifdef BN_DEBUG_RAND 753 /* To avoid "make update" cvs wars due to BN_DEBUG, use some tricks */ 754 #ifndef RAND_pseudo_bytes 755 int RAND_pseudo_bytes(ubyte* buf,int num); 756 #define BN_DEBUG_TRIX 757 #endif 758 #define bn_pollute(a) \ 759 do { \ 760 const(BIGNUM)* _bnum1 = (a); \ 761 if(_bnum1->top < _bnum1->dmax) { \ 762 ubyte _tmp_char; \ 763 /* We cast away const without the compiler knowing, any \ 764 ** genuinely* constant variables that aren't mutable \ 765 * wouldn't be constructed with top!=dmax. */ \ 766 BN_ULONG* _not_const; \ 767 memcpy(&_not_const, &_bnum1->d, sizeof(BN_ULONG*)); \ 768 RAND_pseudo_bytes(&_tmp_char, 1); \ 769 memset((ubyte*)(_not_const + _bnum1->top), _tmp_char, \ 770 (_bnum1->dmax - _bnum1->top) * sizeof(BN_ULONG)); \ 771 } \ 772 } while(0) 773 #ifdef BN_DEBUG_TRIX 774 #undef RAND_pseudo_bytes 775 #endif 776 #else 777 #define bn_pollute(a) 778 #endif 779 #define bn_check_top(a) \ 780 do { \ 781 const(BIGNUM)* _bnum2 = (a); \ 782 if (_bnum2 != NULL) { \ 783 assert((_bnum2->top == 0) || \ 784 (_bnum2->d[_bnum2->top - 1] != 0)); \ 785 bn_pollute(_bnum2); \ 786 } \ 787 } while(0) 788 789 #define bn_fix_top(a) bn_check_top(a) 790 791 #define bn_check_size(bn, bits) bn_wcheck_size(bn, ((bits+BN_BITS2-1))/BN_BITS2) 792 #define bn_wcheck_size(bn, words) \ 793 do { \ 794 const BIGNUM *_bnum2 = (bn); \ 795 assert(words <= (_bnum2)->dmax && words >= (_bnum2)->top); \ 796 } while(0) 797 798 #else /* !BN_DEBUG */ 799 +/ 800 void bn_pollute()(BIGNUM* a) {} 801 void bn_check_top()(BIGNUM* a) {} 802 alias bn_correct_top bn_fix_top; 803 void bn_check_size()(BIGNUM* bn, size_t bits) {} 804 void bn_wcheck_size()(BIGNUM* bn, size_t words) {} 805 806 // #endif 807 808 auto bn_correct_top()(BIGNUM* a) { 809 BN_ULONG* ftl; 810 int tmp_top = a.top; 811 if (tmp_top > 0) 812 { 813 for (ftl= &(a.d[tmp_top-1]); tmp_top > 0; tmp_top--) 814 if (*(ftl--)) break; 815 a.top = tmp_top; 816 } 817 bn_pollute(a); 818 } 819 820 BN_ULONG bn_mul_add_words(BN_ULONG* rp, const(BN_ULONG)* ap, int num, BN_ULONG w); 821 BN_ULONG bn_mul_words(BN_ULONG* rp, const(BN_ULONG)* ap, int num, BN_ULONG w); 822 void bn_sqr_words(BN_ULONG* rp, const(BN_ULONG)* ap, int num); 823 BN_ULONG bn_div_words(BN_ULONG h, BN_ULONG l, BN_ULONG d); 824 BN_ULONG bn_add_words(BN_ULONG* rp, const(BN_ULONG)* ap, const(BN_ULONG)* bp,int num); 825 BN_ULONG bn_sub_words(BN_ULONG* rp, const(BN_ULONG)* ap, const(BN_ULONG)* bp,int num); 826 827 /* Primes from RFC 2409 */ 828 BIGNUM* get_rfc2409_prime_768(BIGNUM* bn); 829 BIGNUM* get_rfc2409_prime_1024(BIGNUM* bn); 830 831 /* Primes from RFC 3526 */ 832 BIGNUM* get_rfc3526_prime_1536(BIGNUM* bn); 833 BIGNUM* get_rfc3526_prime_2048(BIGNUM* bn); 834 BIGNUM* get_rfc3526_prime_3072(BIGNUM* bn); 835 BIGNUM* get_rfc3526_prime_4096(BIGNUM* bn); 836 BIGNUM* get_rfc3526_prime_6144(BIGNUM* bn); 837 BIGNUM* get_rfc3526_prime_8192(BIGNUM* bn); 838 839 int BN_bntest_rand(BIGNUM* rnd, int bits, int top,int bottom); 840 841 /* BEGIN ERROR CODES */ 842 /* The following lines are auto generated by the script mkerr.pl. Any changes 843 * made after this point may be overwritten when the script is next run. 844 */ 845 void ERR_load_BN_strings(); 846 847 /* Error codes for the BN functions. */ 848 849 /* Function codes. */ 850 enum BN_F_BNRAND = 127; 851 enum BN_F_BN_BLINDING_CONVERT_EX = 100; 852 enum BN_F_BN_BLINDING_CREATE_PARAM = 128; 853 enum BN_F_BN_BLINDING_INVERT_EX = 101; 854 enum BN_F_BN_BLINDING_NEW = 102; 855 enum BN_F_BN_BLINDING_UPDATE = 103; 856 enum BN_F_BN_BN2DEC = 104; 857 enum BN_F_BN_BN2HEX = 105; 858 enum BN_F_BN_CTX_GET = 116; 859 enum BN_F_BN_CTX_NEW = 106; 860 enum BN_F_BN_CTX_START = 129; 861 enum BN_F_BN_DIV = 107; 862 enum BN_F_BN_DIV_NO_BRANCH = 138; 863 enum BN_F_BN_DIV_RECP = 130; 864 enum BN_F_BN_EXP = 123; 865 enum BN_F_BN_EXPAND2 = 108; 866 enum BN_F_BN_EXPAND_INTERNAL = 120; 867 enum BN_F_BN_GF2M_MOD = 131; 868 enum BN_F_BN_GF2M_MOD_EXP = 132; 869 enum BN_F_BN_GF2M_MOD_MUL = 133; 870 enum BN_F_BN_GF2M_MOD_SOLVE_QUAD = 134; 871 enum BN_F_BN_GF2M_MOD_SOLVE_QUAD_ARR = 135; 872 enum BN_F_BN_GF2M_MOD_SQR = 136; 873 enum BN_F_BN_GF2M_MOD_SQRT = 137; 874 enum BN_F_BN_MOD_EXP2_MONT = 118; 875 enum BN_F_BN_MOD_EXP_MONT = 109; 876 enum BN_F_BN_MOD_EXP_MONT_CONSTTIME = 124; 877 enum BN_F_BN_MOD_EXP_MONT_WORD = 117; 878 enum BN_F_BN_MOD_EXP_RECP = 125; 879 enum BN_F_BN_MOD_EXP_SIMPLE = 126; 880 enum BN_F_BN_MOD_INVERSE = 110; 881 enum BN_F_BN_MOD_INVERSE_NO_BRANCH = 139; 882 enum BN_F_BN_MOD_LSHIFT_QUICK = 119; 883 enum BN_F_BN_MOD_MUL_RECIPROCAL = 111; 884 enum BN_F_BN_MOD_SQRT = 121; 885 enum BN_F_BN_MPI2BN = 112; 886 enum BN_F_BN_NEW = 113; 887 enum BN_F_BN_RAND = 114; 888 enum BN_F_BN_RAND_RANGE = 122; 889 enum BN_F_BN_USUB = 115; 890 891 /* Reason codes. */ 892 enum BN_R_ARG2_LT_ARG3 = 100; 893 enum BN_R_BAD_RECIPROCAL = 101; 894 enum BN_R_BIGNUM_TOO_LONG = 114; 895 enum BN_R_CALLED_WITH_EVEN_MODULUS = 102; 896 enum BN_R_DIV_BY_ZERO = 103; 897 enum BN_R_ENCODING_ERROR = 104; 898 enum BN_R_EXPAND_ON_STATIC_BIGNUM_DATA = 105; 899 enum BN_R_INPUT_NOT_REDUCED = 110; 900 enum BN_R_INVALID_LENGTH = 106; 901 enum BN_R_INVALID_RANGE = 115; 902 enum BN_R_NOT_A_SQUARE = 111; 903 enum BN_R_NOT_INITIALIZED = 107; 904 enum BN_R_NO_INVERSE = 108; 905 enum BN_R_NO_SOLUTION = 116; 906 enum BN_R_P_IS_NOT_PRIME = 112; 907 enum BN_R_TOO_MANY_ITERATIONS = 113; 908 enum BN_R_TOO_MANY_TEMPORARY_VARIABLES = 109;