bn.h 24 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575
  1. /*
  2. * Copyright 1995-2016 The OpenSSL Project Authors. All Rights Reserved.
  3. *
  4. * Licensed under the OpenSSL license (the "License"). You may not use
  5. * this file except in compliance with the License. You can obtain a copy
  6. * in the file LICENSE in the source distribution or at
  7. * https://www.openssl.org/source/license.html
  8. */
  9. /* ====================================================================
  10. * Copyright 2002 Sun Microsystems, Inc. ALL RIGHTS RESERVED.
  11. *
  12. * Portions of the attached software ("Contribution") are developed by
  13. * SUN MICROSYSTEMS, INC., and are contributed to the OpenSSL project.
  14. *
  15. * The Contribution is licensed pursuant to the Eric Young open source
  16. * license provided above.
  17. *
  18. * The binary polynomial arithmetic software is originally written by
  19. * Sheueling Chang Shantz and Douglas Stebila of Sun Microsystems Laboratories.
  20. *
  21. */
  22. #ifndef HEADER_BN_H
  23. # define HEADER_BN_H
  24. # include <openssl/e_os2.h>
  25. # ifndef OPENSSL_NO_STDIO
  26. # include <stdio.h>
  27. # endif
  28. # include <openssl/opensslconf.h>
  29. # include <openssl/ossl_typ.h>
  30. # include <openssl/crypto.h>
  31. #ifdef __cplusplus
  32. extern "C" {
  33. #endif
  34. /*
  35. * 64-bit processor with LP64 ABI
  36. */
  37. # ifdef SIXTY_FOUR_BIT_LONG
  38. # define BN_ULONG unsigned long
  39. # define BN_BYTES 8
  40. # endif
  41. /*
  42. * 64-bit processor other than LP64 ABI
  43. */
  44. # ifdef SIXTY_FOUR_BIT
  45. # define BN_ULONG unsigned long long
  46. # define BN_BYTES 8
  47. # endif
  48. # ifdef THIRTY_TWO_BIT
  49. # define BN_ULONG unsigned int
  50. # define BN_BYTES 4
  51. # endif
  52. # define BN_BITS2 (BN_BYTES * 8)
  53. # define BN_BITS (BN_BITS2 * 2)
  54. # define BN_TBIT ((BN_ULONG)1 << (BN_BITS2 - 1))
  55. # define BN_FLG_MALLOCED 0x01
  56. # define BN_FLG_STATIC_DATA 0x02
  57. /*
  58. * avoid leaking exponent information through timing,
  59. * BN_mod_exp_mont() will call BN_mod_exp_mont_consttime,
  60. * BN_div() will call BN_div_no_branch,
  61. * BN_mod_inverse() will call BN_mod_inverse_no_branch.
  62. */
  63. # define BN_FLG_CONSTTIME 0x04
  64. # define BN_FLG_SECURE 0x08
  65. # if OPENSSL_API_COMPAT < 0x00908000L
  66. /* deprecated name for the flag */
  67. # define BN_FLG_EXP_CONSTTIME BN_FLG_CONSTTIME
  68. # define BN_FLG_FREE 0x8000 /* used for debugging */
  69. # endif
  70. void BN_set_flags(BIGNUM *b, int n);
  71. int BN_get_flags(const BIGNUM *b, int n);
  72. /* Values for |top| in BN_rand() */
  73. #define BN_RAND_TOP_ANY -1
  74. #define BN_RAND_TOP_ONE 0
  75. #define BN_RAND_TOP_TWO 1
  76. /* Values for |bottom| in BN_rand() */
  77. #define BN_RAND_BOTTOM_ANY 0
  78. #define BN_RAND_BOTTOM_ODD 1
  79. /*
  80. * get a clone of a BIGNUM with changed flags, for *temporary* use only (the
  81. * two BIGNUMs cannot be used in parallel!). Also only for *read only* use. The
  82. * value |dest| should be a newly allocated BIGNUM obtained via BN_new() that
  83. * has not been otherwise initialised or used.
  84. */
  85. void BN_with_flags(BIGNUM *dest, const BIGNUM *b, int flags);
  86. /* Wrapper function to make using BN_GENCB easier */
  87. int BN_GENCB_call(BN_GENCB *cb, int a, int b);
  88. BN_GENCB *BN_GENCB_new(void);
  89. void BN_GENCB_free(BN_GENCB *cb);
  90. /* Populate a BN_GENCB structure with an "old"-style callback */
  91. void BN_GENCB_set_old(BN_GENCB *gencb, void (*callback) (int, int, void *),
  92. void *cb_arg);
  93. /* Populate a BN_GENCB structure with a "new"-style callback */
  94. void BN_GENCB_set(BN_GENCB *gencb, int (*callback) (int, int, BN_GENCB *),
  95. void *cb_arg);
  96. void *BN_GENCB_get_arg(BN_GENCB *cb);
  97. # define BN_prime_checks 0 /* default: select number of iterations based
  98. * on the size of the number */
  99. /*
  100. * number of Miller-Rabin iterations for an error rate of less than 2^-80 for
  101. * random 'b'-bit input, b >= 100 (taken from table 4.4 in the Handbook of
  102. * Applied Cryptography [Menezes, van Oorschot, Vanstone; CRC Press 1996];
  103. * original paper: Damgaard, Landrock, Pomerance: Average case error
  104. * estimates for the strong probable prime test. -- Math. Comp. 61 (1993)
  105. * 177-194)
  106. */
  107. # define BN_prime_checks_for_size(b) ((b) >= 1300 ? 2 : \
  108. (b) >= 850 ? 3 : \
  109. (b) >= 650 ? 4 : \
  110. (b) >= 550 ? 5 : \
  111. (b) >= 450 ? 6 : \
  112. (b) >= 400 ? 7 : \
  113. (b) >= 350 ? 8 : \
  114. (b) >= 300 ? 9 : \
  115. (b) >= 250 ? 12 : \
  116. (b) >= 200 ? 15 : \
  117. (b) >= 150 ? 18 : \
  118. /* b >= 100 */ 27)
  119. # define BN_num_bytes(a) ((BN_num_bits(a)+7)/8)
  120. int BN_abs_is_word(const BIGNUM *a, const BN_ULONG w);
  121. int BN_is_zero(const BIGNUM *a);
  122. int BN_is_one(const BIGNUM *a);
  123. int BN_is_word(const BIGNUM *a, const BN_ULONG w);
  124. int BN_is_odd(const BIGNUM *a);
  125. # define BN_one(a) (BN_set_word((a),1))
  126. void BN_zero_ex(BIGNUM *a);
  127. # if OPENSSL_API_COMPAT >= 0x00908000L
  128. # define BN_zero(a) BN_zero_ex(a)
  129. # else
  130. # define BN_zero(a) (BN_set_word((a),0))
  131. # endif
  132. const BIGNUM *BN_value_one(void);
  133. char *BN_options(void);
  134. BN_CTX *BN_CTX_new(void);
  135. BN_CTX *BN_CTX_secure_new(void);
  136. void BN_CTX_free(BN_CTX *c);
  137. void BN_CTX_start(BN_CTX *ctx);
  138. BIGNUM *BN_CTX_get(BN_CTX *ctx);
  139. void BN_CTX_end(BN_CTX *ctx);
  140. int BN_rand(BIGNUM *rnd, int bits, int top, int bottom);
  141. int BN_pseudo_rand(BIGNUM *rnd, int bits, int top, int bottom);
  142. int BN_rand_range(BIGNUM *rnd, const BIGNUM *range);
  143. int BN_pseudo_rand_range(BIGNUM *rnd, const BIGNUM *range);
  144. int BN_num_bits(const BIGNUM *a);
  145. int BN_num_bits_word(BN_ULONG l);
  146. int BN_security_bits(int L, int N);
  147. BIGNUM *BN_new(void);
  148. BIGNUM *BN_secure_new(void);
  149. void BN_clear_free(BIGNUM *a);
  150. BIGNUM *BN_copy(BIGNUM *a, const BIGNUM *b);
  151. void BN_swap(BIGNUM *a, BIGNUM *b);
  152. BIGNUM *BN_bin2bn(const unsigned char *s, int len, BIGNUM *ret);
  153. int BN_bn2bin(const BIGNUM *a, unsigned char *to);
  154. int BN_bn2binpad(const BIGNUM *a, unsigned char *to, int tolen);
  155. BIGNUM *BN_lebin2bn(const unsigned char *s, int len, BIGNUM *ret);
  156. int BN_bn2lebinpad(const BIGNUM *a, unsigned char *to, int tolen);
  157. BIGNUM *BN_mpi2bn(const unsigned char *s, int len, BIGNUM *ret);
  158. int BN_bn2mpi(const BIGNUM *a, unsigned char *to);
  159. int BN_sub(BIGNUM *r, const BIGNUM *a, const BIGNUM *b);
  160. int BN_usub(BIGNUM *r, const BIGNUM *a, const BIGNUM *b);
  161. int BN_uadd(BIGNUM *r, const BIGNUM *a, const BIGNUM *b);
  162. int BN_add(BIGNUM *r, const BIGNUM *a, const BIGNUM *b);
  163. int BN_mul(BIGNUM *r, const BIGNUM *a, const BIGNUM *b, BN_CTX *ctx);
  164. int BN_sqr(BIGNUM *r, const BIGNUM *a, BN_CTX *ctx);
  165. /** BN_set_negative sets sign of a BIGNUM
  166. * \param b pointer to the BIGNUM object
  167. * \param n 0 if the BIGNUM b should be positive and a value != 0 otherwise
  168. */
  169. void BN_set_negative(BIGNUM *b, int n);
  170. /** BN_is_negative returns 1 if the BIGNUM is negative
  171. * \param b pointer to the BIGNUM object
  172. * \return 1 if a < 0 and 0 otherwise
  173. */
  174. int BN_is_negative(const BIGNUM *b);
  175. int BN_div(BIGNUM *dv, BIGNUM *rem, const BIGNUM *m, const BIGNUM *d,
  176. BN_CTX *ctx);
  177. # define BN_mod(rem,m,d,ctx) BN_div(NULL,(rem),(m),(d),(ctx))
  178. int BN_nnmod(BIGNUM *r, const BIGNUM *m, const BIGNUM *d, BN_CTX *ctx);
  179. int BN_mod_add(BIGNUM *r, const BIGNUM *a, const BIGNUM *b, const BIGNUM *m,
  180. BN_CTX *ctx);
  181. int BN_mod_add_quick(BIGNUM *r, const BIGNUM *a, const BIGNUM *b,
  182. const BIGNUM *m);
  183. int BN_mod_sub(BIGNUM *r, const BIGNUM *a, const BIGNUM *b, const BIGNUM *m,
  184. BN_CTX *ctx);
  185. int BN_mod_sub_quick(BIGNUM *r, const BIGNUM *a, const BIGNUM *b,
  186. const BIGNUM *m);
  187. int BN_mod_mul(BIGNUM *r, const BIGNUM *a, const BIGNUM *b, const BIGNUM *m,
  188. BN_CTX *ctx);
  189. int BN_mod_sqr(BIGNUM *r, const BIGNUM *a, const BIGNUM *m, BN_CTX *ctx);
  190. int BN_mod_lshift1(BIGNUM *r, const BIGNUM *a, const BIGNUM *m, BN_CTX *ctx);
  191. int BN_mod_lshift1_quick(BIGNUM *r, const BIGNUM *a, const BIGNUM *m);
  192. int BN_mod_lshift(BIGNUM *r, const BIGNUM *a, int n, const BIGNUM *m,
  193. BN_CTX *ctx);
  194. int BN_mod_lshift_quick(BIGNUM *r, const BIGNUM *a, int n, const BIGNUM *m);
  195. BN_ULONG BN_mod_word(const BIGNUM *a, BN_ULONG w);
  196. BN_ULONG BN_div_word(BIGNUM *a, BN_ULONG w);
  197. int BN_mul_word(BIGNUM *a, BN_ULONG w);
  198. int BN_add_word(BIGNUM *a, BN_ULONG w);
  199. int BN_sub_word(BIGNUM *a, BN_ULONG w);
  200. int BN_set_word(BIGNUM *a, BN_ULONG w);
  201. BN_ULONG BN_get_word(const BIGNUM *a);
  202. int BN_cmp(const BIGNUM *a, const BIGNUM *b);
  203. void BN_free(BIGNUM *a);
  204. int BN_is_bit_set(const BIGNUM *a, int n);
  205. int BN_lshift(BIGNUM *r, const BIGNUM *a, int n);
  206. int BN_lshift1(BIGNUM *r, const BIGNUM *a);
  207. int BN_exp(BIGNUM *r, const BIGNUM *a, const BIGNUM *p, BN_CTX *ctx);
  208. int BN_mod_exp(BIGNUM *r, const BIGNUM *a, const BIGNUM *p,
  209. const BIGNUM *m, BN_CTX *ctx);
  210. int BN_mod_exp_mont(BIGNUM *r, const BIGNUM *a, const BIGNUM *p,
  211. const BIGNUM *m, BN_CTX *ctx, BN_MONT_CTX *m_ctx);
  212. int BN_mod_exp_mont_consttime(BIGNUM *rr, const BIGNUM *a, const BIGNUM *p,
  213. const BIGNUM *m, BN_CTX *ctx,
  214. BN_MONT_CTX *in_mont);
  215. int BN_mod_exp_mont_word(BIGNUM *r, BN_ULONG a, const BIGNUM *p,
  216. const BIGNUM *m, BN_CTX *ctx, BN_MONT_CTX *m_ctx);
  217. int BN_mod_exp2_mont(BIGNUM *r, const BIGNUM *a1, const BIGNUM *p1,
  218. const BIGNUM *a2, const BIGNUM *p2, const BIGNUM *m,
  219. BN_CTX *ctx, BN_MONT_CTX *m_ctx);
  220. int BN_mod_exp_simple(BIGNUM *r, const BIGNUM *a, const BIGNUM *p,
  221. const BIGNUM *m, BN_CTX *ctx);
  222. int BN_mask_bits(BIGNUM *a, int n);
  223. # ifndef OPENSSL_NO_STDIO
  224. int BN_print_fp(FILE *fp, const BIGNUM *a);
  225. # endif
  226. int BN_print(BIO *bio, const BIGNUM *a);
  227. int BN_reciprocal(BIGNUM *r, const BIGNUM *m, int len, BN_CTX *ctx);
  228. int BN_rshift(BIGNUM *r, const BIGNUM *a, int n);
  229. int BN_rshift1(BIGNUM *r, const BIGNUM *a);
  230. void BN_clear(BIGNUM *a);
  231. BIGNUM *BN_dup(const BIGNUM *a);
  232. int BN_ucmp(const BIGNUM *a, const BIGNUM *b);
  233. int BN_set_bit(BIGNUM *a, int n);
  234. int BN_clear_bit(BIGNUM *a, int n);
  235. char *BN_bn2hex(const BIGNUM *a);
  236. char *BN_bn2dec(const BIGNUM *a);
  237. int BN_hex2bn(BIGNUM **a, const char *str);
  238. int BN_dec2bn(BIGNUM **a, const char *str);
  239. int BN_asc2bn(BIGNUM **a, const char *str);
  240. int BN_gcd(BIGNUM *r, const BIGNUM *a, const BIGNUM *b, BN_CTX *ctx);
  241. int BN_kronecker(const BIGNUM *a, const BIGNUM *b, BN_CTX *ctx); /* returns
  242. * -2 for
  243. * error */
  244. BIGNUM *BN_mod_inverse(BIGNUM *ret,
  245. const BIGNUM *a, const BIGNUM *n, BN_CTX *ctx);
  246. BIGNUM *BN_mod_sqrt(BIGNUM *ret,
  247. const BIGNUM *a, const BIGNUM *n, BN_CTX *ctx);
  248. void BN_consttime_swap(BN_ULONG swap, BIGNUM *a, BIGNUM *b, int nwords);
  249. /* Deprecated versions */
  250. DEPRECATEDIN_0_9_8(BIGNUM *BN_generate_prime(BIGNUM *ret, int bits, int safe,
  251. const BIGNUM *add,
  252. const BIGNUM *rem,
  253. void (*callback) (int, int,
  254. void *),
  255. void *cb_arg))
  256. DEPRECATEDIN_0_9_8(int
  257. BN_is_prime(const BIGNUM *p, int nchecks,
  258. void (*callback) (int, int, void *),
  259. BN_CTX *ctx, void *cb_arg))
  260. DEPRECATEDIN_0_9_8(int
  261. BN_is_prime_fasttest(const BIGNUM *p, int nchecks,
  262. void (*callback) (int, int, void *),
  263. BN_CTX *ctx, void *cb_arg,
  264. int do_trial_division))
  265. /* Newer versions */
  266. int BN_generate_prime_ex(BIGNUM *ret, int bits, int safe, const BIGNUM *add,
  267. const BIGNUM *rem, BN_GENCB *cb);
  268. int BN_is_prime_ex(const BIGNUM *p, int nchecks, BN_CTX *ctx, BN_GENCB *cb);
  269. int BN_is_prime_fasttest_ex(const BIGNUM *p, int nchecks, BN_CTX *ctx,
  270. int do_trial_division, BN_GENCB *cb);
  271. int BN_X931_generate_Xpq(BIGNUM *Xp, BIGNUM *Xq, int nbits, BN_CTX *ctx);
  272. int BN_X931_derive_prime_ex(BIGNUM *p, BIGNUM *p1, BIGNUM *p2,
  273. const BIGNUM *Xp, const BIGNUM *Xp1,
  274. const BIGNUM *Xp2, const BIGNUM *e, BN_CTX *ctx,
  275. BN_GENCB *cb);
  276. int BN_X931_generate_prime_ex(BIGNUM *p, BIGNUM *p1, BIGNUM *p2, BIGNUM *Xp1,
  277. BIGNUM *Xp2, const BIGNUM *Xp, const BIGNUM *e,
  278. BN_CTX *ctx, BN_GENCB *cb);
  279. BN_MONT_CTX *BN_MONT_CTX_new(void);
  280. int BN_mod_mul_montgomery(BIGNUM *r, const BIGNUM *a, const BIGNUM *b,
  281. BN_MONT_CTX *mont, BN_CTX *ctx);
  282. int BN_to_montgomery(BIGNUM *r, const BIGNUM *a, BN_MONT_CTX *mont,
  283. BN_CTX *ctx);
  284. int BN_from_montgomery(BIGNUM *r, const BIGNUM *a, BN_MONT_CTX *mont,
  285. BN_CTX *ctx);
  286. void BN_MONT_CTX_free(BN_MONT_CTX *mont);
  287. int BN_MONT_CTX_set(BN_MONT_CTX *mont, const BIGNUM *mod, BN_CTX *ctx);
  288. BN_MONT_CTX *BN_MONT_CTX_copy(BN_MONT_CTX *to, BN_MONT_CTX *from);
  289. BN_MONT_CTX *BN_MONT_CTX_set_locked(BN_MONT_CTX **pmont, CRYPTO_RWLOCK *lock,
  290. const BIGNUM *mod, BN_CTX *ctx);
  291. /* BN_BLINDING flags */
  292. # define BN_BLINDING_NO_UPDATE 0x00000001
  293. # define BN_BLINDING_NO_RECREATE 0x00000002
  294. BN_BLINDING *BN_BLINDING_new(const BIGNUM *A, const BIGNUM *Ai, BIGNUM *mod);
  295. void BN_BLINDING_free(BN_BLINDING *b);
  296. int BN_BLINDING_update(BN_BLINDING *b, BN_CTX *ctx);
  297. int BN_BLINDING_convert(BIGNUM *n, BN_BLINDING *b, BN_CTX *ctx);
  298. int BN_BLINDING_invert(BIGNUM *n, BN_BLINDING *b, BN_CTX *ctx);
  299. int BN_BLINDING_convert_ex(BIGNUM *n, BIGNUM *r, BN_BLINDING *b, BN_CTX *);
  300. int BN_BLINDING_invert_ex(BIGNUM *n, const BIGNUM *r, BN_BLINDING *b,
  301. BN_CTX *);
  302. int BN_BLINDING_is_current_thread(BN_BLINDING *b);
  303. void BN_BLINDING_set_current_thread(BN_BLINDING *b);
  304. int BN_BLINDING_lock(BN_BLINDING *b);
  305. int BN_BLINDING_unlock(BN_BLINDING *b);
  306. unsigned long BN_BLINDING_get_flags(const BN_BLINDING *);
  307. void BN_BLINDING_set_flags(BN_BLINDING *, unsigned long);
  308. BN_BLINDING *BN_BLINDING_create_param(BN_BLINDING *b,
  309. const BIGNUM *e, BIGNUM *m, BN_CTX *ctx,
  310. int (*bn_mod_exp) (BIGNUM *r,
  311. const BIGNUM *a,
  312. const BIGNUM *p,
  313. const BIGNUM *m,
  314. BN_CTX *ctx,
  315. BN_MONT_CTX *m_ctx),
  316. BN_MONT_CTX *m_ctx);
  317. DEPRECATEDIN_0_9_8(void BN_set_params(int mul, int high, int low, int mont))
  318. DEPRECATEDIN_0_9_8(int BN_get_params(int which)) /* 0, mul, 1 high, 2 low, 3
  319. * mont */
  320. BN_RECP_CTX *BN_RECP_CTX_new(void);
  321. void BN_RECP_CTX_free(BN_RECP_CTX *recp);
  322. int BN_RECP_CTX_set(BN_RECP_CTX *recp, const BIGNUM *rdiv, BN_CTX *ctx);
  323. int BN_mod_mul_reciprocal(BIGNUM *r, const BIGNUM *x, const BIGNUM *y,
  324. BN_RECP_CTX *recp, BN_CTX *ctx);
  325. int BN_mod_exp_recp(BIGNUM *r, const BIGNUM *a, const BIGNUM *p,
  326. const BIGNUM *m, BN_CTX *ctx);
  327. int BN_div_recp(BIGNUM *dv, BIGNUM *rem, const BIGNUM *m,
  328. BN_RECP_CTX *recp, BN_CTX *ctx);
  329. # ifndef OPENSSL_NO_EC2M
  330. /*
  331. * Functions for arithmetic over binary polynomials represented by BIGNUMs.
  332. * The BIGNUM::neg property of BIGNUMs representing binary polynomials is
  333. * ignored. Note that input arguments are not const so that their bit arrays
  334. * can be expanded to the appropriate size if needed.
  335. */
  336. /*
  337. * r = a + b
  338. */
  339. int BN_GF2m_add(BIGNUM *r, const BIGNUM *a, const BIGNUM *b);
  340. # define BN_GF2m_sub(r, a, b) BN_GF2m_add(r, a, b)
  341. /*
  342. * r=a mod p
  343. */
  344. int BN_GF2m_mod(BIGNUM *r, const BIGNUM *a, const BIGNUM *p);
  345. /* r = (a * b) mod p */
  346. int BN_GF2m_mod_mul(BIGNUM *r, const BIGNUM *a, const BIGNUM *b,
  347. const BIGNUM *p, BN_CTX *ctx);
  348. /* r = (a * a) mod p */
  349. int BN_GF2m_mod_sqr(BIGNUM *r, const BIGNUM *a, const BIGNUM *p, BN_CTX *ctx);
  350. /* r = (1 / b) mod p */
  351. int BN_GF2m_mod_inv(BIGNUM *r, const BIGNUM *b, const BIGNUM *p, BN_CTX *ctx);
  352. /* r = (a / b) mod p */
  353. int BN_GF2m_mod_div(BIGNUM *r, const BIGNUM *a, const BIGNUM *b,
  354. const BIGNUM *p, BN_CTX *ctx);
  355. /* r = (a ^ b) mod p */
  356. int BN_GF2m_mod_exp(BIGNUM *r, const BIGNUM *a, const BIGNUM *b,
  357. const BIGNUM *p, BN_CTX *ctx);
  358. /* r = sqrt(a) mod p */
  359. int BN_GF2m_mod_sqrt(BIGNUM *r, const BIGNUM *a, const BIGNUM *p,
  360. BN_CTX *ctx);
  361. /* r^2 + r = a mod p */
  362. int BN_GF2m_mod_solve_quad(BIGNUM *r, const BIGNUM *a, const BIGNUM *p,
  363. BN_CTX *ctx);
  364. # define BN_GF2m_cmp(a, b) BN_ucmp((a), (b))
  365. /*-
  366. * Some functions allow for representation of the irreducible polynomials
  367. * as an unsigned int[], say p. The irreducible f(t) is then of the form:
  368. * t^p[0] + t^p[1] + ... + t^p[k]
  369. * where m = p[0] > p[1] > ... > p[k] = 0.
  370. */
  371. /* r = a mod p */
  372. int BN_GF2m_mod_arr(BIGNUM *r, const BIGNUM *a, const int p[]);
  373. /* r = (a * b) mod p */
  374. int BN_GF2m_mod_mul_arr(BIGNUM *r, const BIGNUM *a, const BIGNUM *b,
  375. const int p[], BN_CTX *ctx);
  376. /* r = (a * a) mod p */
  377. int BN_GF2m_mod_sqr_arr(BIGNUM *r, const BIGNUM *a, const int p[],
  378. BN_CTX *ctx);
  379. /* r = (1 / b) mod p */
  380. int BN_GF2m_mod_inv_arr(BIGNUM *r, const BIGNUM *b, const int p[],
  381. BN_CTX *ctx);
  382. /* r = (a / b) mod p */
  383. int BN_GF2m_mod_div_arr(BIGNUM *r, const BIGNUM *a, const BIGNUM *b,
  384. const int p[], BN_CTX *ctx);
  385. /* r = (a ^ b) mod p */
  386. int BN_GF2m_mod_exp_arr(BIGNUM *r, const BIGNUM *a, const BIGNUM *b,
  387. const int p[], BN_CTX *ctx);
  388. /* r = sqrt(a) mod p */
  389. int BN_GF2m_mod_sqrt_arr(BIGNUM *r, const BIGNUM *a,
  390. const int p[], BN_CTX *ctx);
  391. /* r^2 + r = a mod p */
  392. int BN_GF2m_mod_solve_quad_arr(BIGNUM *r, const BIGNUM *a,
  393. const int p[], BN_CTX *ctx);
  394. int BN_GF2m_poly2arr(const BIGNUM *a, int p[], int max);
  395. int BN_GF2m_arr2poly(const int p[], BIGNUM *a);
  396. # endif
  397. /*
  398. * faster mod functions for the 'NIST primes' 0 <= a < p^2
  399. */
  400. int BN_nist_mod_192(BIGNUM *r, const BIGNUM *a, const BIGNUM *p, BN_CTX *ctx);
  401. int BN_nist_mod_224(BIGNUM *r, const BIGNUM *a, const BIGNUM *p, BN_CTX *ctx);
  402. int BN_nist_mod_256(BIGNUM *r, const BIGNUM *a, const BIGNUM *p, BN_CTX *ctx);
  403. int BN_nist_mod_384(BIGNUM *r, const BIGNUM *a, const BIGNUM *p, BN_CTX *ctx);
  404. int BN_nist_mod_521(BIGNUM *r, const BIGNUM *a, const BIGNUM *p, BN_CTX *ctx);
  405. const BIGNUM *BN_get0_nist_prime_192(void);
  406. const BIGNUM *BN_get0_nist_prime_224(void);
  407. const BIGNUM *BN_get0_nist_prime_256(void);
  408. const BIGNUM *BN_get0_nist_prime_384(void);
  409. const BIGNUM *BN_get0_nist_prime_521(void);
  410. int (*BN_nist_mod_func(const BIGNUM *p)) (BIGNUM *r, const BIGNUM *a,
  411. const BIGNUM *field, BN_CTX *ctx);
  412. int BN_generate_dsa_nonce(BIGNUM *out, const BIGNUM *range,
  413. const BIGNUM *priv, const unsigned char *message,
  414. size_t message_len, BN_CTX *ctx);
  415. /* Primes from RFC 2409 */
  416. BIGNUM *BN_get_rfc2409_prime_768(BIGNUM *bn);
  417. BIGNUM *BN_get_rfc2409_prime_1024(BIGNUM *bn);
  418. /* Primes from RFC 3526 */
  419. BIGNUM *BN_get_rfc3526_prime_1536(BIGNUM *bn);
  420. BIGNUM *BN_get_rfc3526_prime_2048(BIGNUM *bn);
  421. BIGNUM *BN_get_rfc3526_prime_3072(BIGNUM *bn);
  422. BIGNUM *BN_get_rfc3526_prime_4096(BIGNUM *bn);
  423. BIGNUM *BN_get_rfc3526_prime_6144(BIGNUM *bn);
  424. BIGNUM *BN_get_rfc3526_prime_8192(BIGNUM *bn);
  425. # if OPENSSL_API_COMPAT < 0x10100000L
  426. # define get_rfc2409_prime_768 BN_get_rfc2409_prime_768
  427. # define get_rfc2409_prime_1024 BN_get_rfc2409_prime_1024
  428. # define get_rfc3526_prime_1536 BN_get_rfc3526_prime_1536
  429. # define get_rfc3526_prime_2048 BN_get_rfc3526_prime_2048
  430. # define get_rfc3526_prime_3072 BN_get_rfc3526_prime_3072
  431. # define get_rfc3526_prime_4096 BN_get_rfc3526_prime_4096
  432. # define get_rfc3526_prime_6144 BN_get_rfc3526_prime_6144
  433. # define get_rfc3526_prime_8192 BN_get_rfc3526_prime_8192
  434. # endif
  435. int BN_bntest_rand(BIGNUM *rnd, int bits, int top, int bottom);
  436. /* BEGIN ERROR CODES */
  437. /*
  438. * The following lines are auto generated by the script mkerr.pl. Any changes
  439. * made after this point may be overwritten when the script is next run.
  440. */
  441. int ERR_load_BN_strings(void);
  442. /* Error codes for the BN functions. */
  443. /* Function codes. */
  444. # define BN_F_BNRAND 127
  445. # define BN_F_BN_BLINDING_CONVERT_EX 100
  446. # define BN_F_BN_BLINDING_CREATE_PARAM 128
  447. # define BN_F_BN_BLINDING_INVERT_EX 101
  448. # define BN_F_BN_BLINDING_NEW 102
  449. # define BN_F_BN_BLINDING_UPDATE 103
  450. # define BN_F_BN_BN2DEC 104
  451. # define BN_F_BN_BN2HEX 105
  452. # define BN_F_BN_COMPUTE_WNAF 142
  453. # define BN_F_BN_CTX_GET 116
  454. # define BN_F_BN_CTX_NEW 106
  455. # define BN_F_BN_CTX_START 129
  456. # define BN_F_BN_DIV 107
  457. # define BN_F_BN_DIV_RECP 130
  458. # define BN_F_BN_EXP 123
  459. # define BN_F_BN_EXPAND_INTERNAL 120
  460. # define BN_F_BN_GENCB_NEW 143
  461. # define BN_F_BN_GENERATE_DSA_NONCE 140
  462. # define BN_F_BN_GENERATE_PRIME_EX 141
  463. # define BN_F_BN_GF2M_MOD 131
  464. # define BN_F_BN_GF2M_MOD_EXP 132
  465. # define BN_F_BN_GF2M_MOD_MUL 133
  466. # define BN_F_BN_GF2M_MOD_SOLVE_QUAD 134
  467. # define BN_F_BN_GF2M_MOD_SOLVE_QUAD_ARR 135
  468. # define BN_F_BN_GF2M_MOD_SQR 136
  469. # define BN_F_BN_GF2M_MOD_SQRT 137
  470. # define BN_F_BN_LSHIFT 145
  471. # define BN_F_BN_MOD_EXP2_MONT 118
  472. # define BN_F_BN_MOD_EXP_MONT 109
  473. # define BN_F_BN_MOD_EXP_MONT_CONSTTIME 124
  474. # define BN_F_BN_MOD_EXP_MONT_WORD 117
  475. # define BN_F_BN_MOD_EXP_RECP 125
  476. # define BN_F_BN_MOD_EXP_SIMPLE 126
  477. # define BN_F_BN_MOD_INVERSE 110
  478. # define BN_F_BN_MOD_INVERSE_NO_BRANCH 139
  479. # define BN_F_BN_MOD_LSHIFT_QUICK 119
  480. # define BN_F_BN_MOD_SQRT 121
  481. # define BN_F_BN_MPI2BN 112
  482. # define BN_F_BN_NEW 113
  483. # define BN_F_BN_RAND 114
  484. # define BN_F_BN_RAND_RANGE 122
  485. # define BN_F_BN_RSHIFT 146
  486. # define BN_F_BN_SET_WORDS 144
  487. # define BN_F_BN_USUB 115
  488. /* Reason codes. */
  489. # define BN_R_ARG2_LT_ARG3 100
  490. # define BN_R_BAD_RECIPROCAL 101
  491. # define BN_R_BIGNUM_TOO_LONG 114
  492. # define BN_R_BITS_TOO_SMALL 118
  493. # define BN_R_CALLED_WITH_EVEN_MODULUS 102
  494. # define BN_R_DIV_BY_ZERO 103
  495. # define BN_R_ENCODING_ERROR 104
  496. # define BN_R_EXPAND_ON_STATIC_BIGNUM_DATA 105
  497. # define BN_R_INPUT_NOT_REDUCED 110
  498. # define BN_R_INVALID_LENGTH 106
  499. # define BN_R_INVALID_RANGE 115
  500. # define BN_R_INVALID_SHIFT 119
  501. # define BN_R_NOT_A_SQUARE 111
  502. # define BN_R_NOT_INITIALIZED 107
  503. # define BN_R_NO_INVERSE 108
  504. # define BN_R_NO_SOLUTION 116
  505. # define BN_R_PRIVATE_KEY_TOO_LARGE 117
  506. # define BN_R_P_IS_NOT_PRIME 112
  507. # define BN_R_TOO_MANY_ITERATIONS 113
  508. # define BN_R_TOO_MANY_TEMPORARY_VARIABLES 109
  509. # ifdef __cplusplus
  510. }
  511. # endif
  512. #endif