rsa_impl.c
Go to the documentation of this file.
1 /* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com)
2  * All rights reserved.
3  *
4  * This package is an SSL implementation written
5  * by Eric Young (eay@cryptsoft.com).
6  * The implementation was written so as to conform with Netscapes SSL.
7  *
8  * This library is free for commercial and non-commercial use as long as
9  * the following conditions are aheared to. The following conditions
10  * apply to all code found in this distribution, be it the RC4, RSA,
11  * lhash, DES, etc., code; not just the SSL code. The SSL documentation
12  * included with this distribution is covered by the same copyright terms
13  * except that the holder is Tim Hudson (tjh@cryptsoft.com).
14  *
15  * Copyright remains Eric Young's, and as such any Copyright notices in
16  * the code are not to be removed.
17  * If this package is used in a product, Eric Young should be given attribution
18  * as the author of the parts of the library used.
19  * This can be in the form of a textual message at program startup or
20  * in documentation (online or textual) provided with the package.
21  *
22  * Redistribution and use in source and binary forms, with or without
23  * modification, are permitted provided that the following conditions
24  * are met:
25  * 1. Redistributions of source code must retain the copyright
26  * notice, this list of conditions and the following disclaimer.
27  * 2. Redistributions in binary form must reproduce the above copyright
28  * notice, this list of conditions and the following disclaimer in the
29  * documentation and/or other materials provided with the distribution.
30  * 3. All advertising materials mentioning features or use of this software
31  * must display the following acknowledgement:
32  * "This product includes cryptographic software written by
33  * Eric Young (eay@cryptsoft.com)"
34  * The word 'cryptographic' can be left out if the rouines from the library
35  * being used are not cryptographic related :-).
36  * 4. If you include any Windows specific code (or a derivative thereof) from
37  * the apps directory (application code) you must include an acknowledgement:
38  * "This product includes software written by Tim Hudson (tjh@cryptsoft.com)"
39  *
40  * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND
41  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
42  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
43  * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
44  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
45  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
46  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
47  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
48  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
49  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
50  * SUCH DAMAGE.
51  *
52  * The licence and distribution terms for any publically available version or
53  * derivative of this code cannot be changed. i.e. this code cannot simply be
54  * copied and put under another distribution licence
55  * [including the GNU Public Licence.] */
56 
57 #include <openssl/rsa.h>
58 
59 #include <assert.h>
60 #include <limits.h>
61 #include <string.h>
62 
63 #include <openssl/bn.h>
64 #include <openssl/err.h>
65 #include <openssl/mem.h>
66 #include <openssl/thread.h>
67 #include <openssl/type_check.h>
68 
69 #include "internal.h"
70 #include "../bn/internal.h"
71 #include "../../internal.h"
72 #include "../delocate.h"
73 #include "../rand/fork_detect.h"
74 
75 
76 int rsa_check_public_key(const RSA *rsa) {
77  if (rsa->n == NULL || rsa->e == NULL) {
79  return 0;
80  }
81 
82  unsigned n_bits = BN_num_bits(rsa->n);
83  if (n_bits > 16 * 1024) {
85  return 0;
86  }
87 
88  // Mitigate DoS attacks by limiting the exponent size. 33 bits was chosen as
89  // the limit based on the recommendations in [1] and [2]. Windows CryptoAPI
90  // doesn't support values larger than 32 bits [3], so it is unlikely that
91  // exponents larger than 32 bits are being used for anything Windows commonly
92  // does.
93  //
94  // [1] https://www.imperialviolet.org/2012/03/16/rsae.html
95  // [2] https://www.imperialviolet.org/2012/03/17/rsados.html
96  // [3] https://msdn.microsoft.com/en-us/library/aa387685(VS.85).aspx
97  static const unsigned kMaxExponentBits = 33;
98  unsigned e_bits = BN_num_bits(rsa->e);
99  if (e_bits > kMaxExponentBits ||
100  // Additionally reject e = 1 or even e. e must be odd to be relatively
101  // prime with phi(n).
102  e_bits < 2 ||
103  !BN_is_odd(rsa->e)) {
105  return 0;
106  }
107 
108  // Verify |n > e|. Comparing |n_bits| to |kMaxExponentBits| is a small
109  // shortcut to comparing |n| and |e| directly. In reality, |kMaxExponentBits|
110  // is much smaller than the minimum RSA key size that any application should
111  // accept.
112  if (n_bits <= kMaxExponentBits) {
114  return 0;
115  }
116  assert(BN_ucmp(rsa->n, rsa->e) > 0);
117 
118  return 1;
119 }
120 
121 static int ensure_fixed_copy(BIGNUM **out, const BIGNUM *in, int width) {
122  if (*out != NULL) {
123  return 1;
124  }
125  BIGNUM *copy = BN_dup(in);
126  if (copy == NULL ||
128  BN_free(copy);
129  return 0;
130  }
131  *out = copy;
132  CONSTTIME_SECRET(copy->d, sizeof(BN_ULONG) * width);
133 
134  return 1;
135 }
136 
137 // freeze_private_key finishes initializing |rsa|'s private key components.
138 // After this function has returned, |rsa| may not be changed. This is needed
139 // because |RSA| is a public struct and, additionally, OpenSSL 1.1.0 opaquified
140 // it wrong (see https://github.com/openssl/openssl/issues/5158).
141 static int freeze_private_key(RSA *rsa, BN_CTX *ctx) {
143  int frozen = rsa->private_key_frozen;
145  if (frozen) {
146  return 1;
147  }
148 
149  int ret = 0;
151  if (rsa->private_key_frozen) {
152  ret = 1;
153  goto err;
154  }
155 
156  // Pre-compute various intermediate values, as well as copies of private
157  // exponents with correct widths. Note that other threads may concurrently
158  // read from |rsa->n|, |rsa->e|, etc., so any fixes must be in separate
159  // copies. We use |mont_n->N|, |mont_p->N|, and |mont_q->N| as copies of |n|,
160  // |p|, and |q| with the correct minimal widths.
161 
162  if (rsa->mont_n == NULL) {
163  rsa->mont_n = BN_MONT_CTX_new_for_modulus(rsa->n, ctx);
164  if (rsa->mont_n == NULL) {
165  goto err;
166  }
167  }
168  const BIGNUM *n_fixed = &rsa->mont_n->N;
169 
170  // The only public upper-bound of |rsa->d| is the bit length of |rsa->n|. The
171  // ASN.1 serialization of RSA private keys unfortunately leaks the byte length
172  // of |rsa->d|, but normalize it so we only leak it once, rather than per
173  // operation.
174  if (rsa->d != NULL &&
175  !ensure_fixed_copy(&rsa->d_fixed, rsa->d, n_fixed->width)) {
176  goto err;
177  }
178 
179  if (rsa->p != NULL && rsa->q != NULL) {
180  // TODO: p and q are also CONSTTIME_SECRET but not yet marked as such
181  // because the Montgomery code does things like test whether or not values
182  // are zero. So the secret marking probably needs to happen inside that
183  // code.
184 
185  if (rsa->mont_p == NULL) {
186  rsa->mont_p = BN_MONT_CTX_new_consttime(rsa->p, ctx);
187  if (rsa->mont_p == NULL) {
188  goto err;
189  }
190  }
191  const BIGNUM *p_fixed = &rsa->mont_p->N;
192 
193  if (rsa->mont_q == NULL) {
194  rsa->mont_q = BN_MONT_CTX_new_consttime(rsa->q, ctx);
195  if (rsa->mont_q == NULL) {
196  goto err;
197  }
198  }
199  const BIGNUM *q_fixed = &rsa->mont_q->N;
200 
201  if (rsa->dmp1 != NULL && rsa->dmq1 != NULL) {
202  // Key generation relies on this function to compute |iqmp|.
203  if (rsa->iqmp == NULL) {
204  BIGNUM *iqmp = BN_new();
205  if (iqmp == NULL ||
206  !bn_mod_inverse_secret_prime(iqmp, rsa->q, rsa->p, ctx,
207  rsa->mont_p)) {
208  BN_free(iqmp);
209  goto err;
210  }
211  rsa->iqmp = iqmp;
212  }
213 
214  // CRT components are only publicly bounded by their corresponding
215  // moduli's bit lengths. |rsa->iqmp| is unused outside of this one-time
216  // setup, so we do not compute a fixed-width version of it.
217  if (!ensure_fixed_copy(&rsa->dmp1_fixed, rsa->dmp1, p_fixed->width) ||
218  !ensure_fixed_copy(&rsa->dmq1_fixed, rsa->dmq1, q_fixed->width)) {
219  goto err;
220  }
221 
222  // Compute |inv_small_mod_large_mont|. Note that it is always modulo the
223  // larger prime, independent of what is stored in |rsa->iqmp|.
224  if (rsa->inv_small_mod_large_mont == NULL) {
225  BIGNUM *inv_small_mod_large_mont = BN_new();
226  int ok;
227  if (BN_cmp(rsa->p, rsa->q) < 0) {
228  ok = inv_small_mod_large_mont != NULL &&
229  bn_mod_inverse_secret_prime(inv_small_mod_large_mont, rsa->p,
230  rsa->q, ctx, rsa->mont_q) &&
231  BN_to_montgomery(inv_small_mod_large_mont,
232  inv_small_mod_large_mont, rsa->mont_q, ctx);
233  } else {
234  ok = inv_small_mod_large_mont != NULL &&
235  BN_to_montgomery(inv_small_mod_large_mont, rsa->iqmp,
236  rsa->mont_p, ctx);
237  }
238  if (!ok) {
239  BN_free(inv_small_mod_large_mont);
240  goto err;
241  }
242  rsa->inv_small_mod_large_mont = inv_small_mod_large_mont;
245  sizeof(BN_ULONG) * rsa->inv_small_mod_large_mont->width);
246  }
247  }
248  }
249 
250  rsa->private_key_frozen = 1;
251  ret = 1;
252 
253 err:
255  return ret;
256 }
257 
258 size_t rsa_default_size(const RSA *rsa) {
259  return BN_num_bytes(rsa->n);
260 }
261 
262 int RSA_encrypt(RSA *rsa, size_t *out_len, uint8_t *out, size_t max_out,
263  const uint8_t *in, size_t in_len, int padding) {
264  if (!rsa_check_public_key(rsa)) {
265  return 0;
266  }
267 
268  const unsigned rsa_size = RSA_size(rsa);
269  BIGNUM *f, *result;
270  uint8_t *buf = NULL;
271  BN_CTX *ctx = NULL;
272  int i, ret = 0;
273 
274  if (max_out < rsa_size) {
276  return 0;
277  }
278 
279  ctx = BN_CTX_new();
280  if (ctx == NULL) {
281  goto err;
282  }
283 
284  BN_CTX_start(ctx);
285  f = BN_CTX_get(ctx);
286  result = BN_CTX_get(ctx);
287  buf = OPENSSL_malloc(rsa_size);
288  if (!f || !result || !buf) {
290  goto err;
291  }
292 
293  switch (padding) {
294  case RSA_PKCS1_PADDING:
295  i = RSA_padding_add_PKCS1_type_2(buf, rsa_size, in, in_len);
296  break;
298  // Use the default parameters: SHA-1 for both hashes and no label.
299  i = RSA_padding_add_PKCS1_OAEP_mgf1(buf, rsa_size, in, in_len,
300  NULL, 0, NULL, NULL);
301  break;
302  case RSA_NO_PADDING:
303  i = RSA_padding_add_none(buf, rsa_size, in, in_len);
304  break;
305  default:
307  goto err;
308  }
309 
310  if (i <= 0) {
311  goto err;
312  }
313 
314  if (BN_bin2bn(buf, rsa_size, f) == NULL) {
315  goto err;
316  }
317 
318  if (BN_ucmp(f, rsa->n) >= 0) {
319  // usually the padding functions would catch this
321  goto err;
322  }
323 
324  if (!BN_MONT_CTX_set_locked(&rsa->mont_n, &rsa->lock, rsa->n, ctx) ||
325  !BN_mod_exp_mont(result, f, rsa->e, &rsa->mont_n->N, ctx, rsa->mont_n)) {
326  goto err;
327  }
328 
329  // put in leading 0 bytes if the number is less than the length of the
330  // modulus
331  if (!BN_bn2bin_padded(out, rsa_size, result)) {
333  goto err;
334  }
335 
336  *out_len = rsa_size;
337  ret = 1;
338 
339 err:
340  if (ctx != NULL) {
341  BN_CTX_end(ctx);
342  BN_CTX_free(ctx);
343  }
344  OPENSSL_free(buf);
345 
346  return ret;
347 }
348 
349 // MAX_BLINDINGS_PER_RSA defines the maximum number of cached BN_BLINDINGs per
350 // RSA*. Then this limit is exceeded, BN_BLINDING objects will be created and
351 // destroyed as needed.
352 #if defined(OPENSSL_TSAN)
353 // Smaller under TSAN so that the edge case can be hit with fewer threads.
354 #define MAX_BLINDINGS_PER_RSA 2
355 #else
356 #define MAX_BLINDINGS_PER_RSA 1024
357 #endif
358 
359 // rsa_blinding_get returns a BN_BLINDING to use with |rsa|. It does this by
360 // allocating one of the cached BN_BLINDING objects in |rsa->blindings|. If
361 // none are free, the cache will be extended by a extra element and the new
362 // BN_BLINDING is returned.
363 //
364 // On success, the index of the assigned BN_BLINDING is written to
365 // |*index_used| and must be passed to |rsa_blinding_release| when finished.
366 static BN_BLINDING *rsa_blinding_get(RSA *rsa, unsigned *index_used,
367  BN_CTX *ctx) {
368  assert(ctx != NULL);
369  assert(rsa->mont_n != NULL);
370 
371  BN_BLINDING *ret = NULL;
372  const uint64_t fork_generation = CRYPTO_get_fork_generation();
374 
375  // Wipe the blinding cache on |fork|.
376  if (rsa->blinding_fork_generation != fork_generation) {
377  for (unsigned i = 0; i < rsa->num_blindings; i++) {
378  // The inuse flag must be zero unless we were forked from a
379  // multi-threaded process, in which case calling back into BoringSSL is
380  // forbidden.
381  assert(rsa->blindings_inuse[i] == 0);
383  }
384  rsa->blinding_fork_generation = fork_generation;
385  }
386 
387  uint8_t *const free_inuse_flag =
389  if (free_inuse_flag != NULL) {
390  *free_inuse_flag = 1;
391  *index_used = free_inuse_flag - rsa->blindings_inuse;
392  ret = rsa->blindings[*index_used];
393  goto out;
394  }
395 
396  if (rsa->num_blindings >= MAX_BLINDINGS_PER_RSA) {
397  // No |BN_BLINDING| is free and nor can the cache be extended. This index
398  // value is magic and indicates to |rsa_blinding_release| that a
399  // |BN_BLINDING| was not inserted into the array.
400  *index_used = MAX_BLINDINGS_PER_RSA;
401  ret = BN_BLINDING_new();
402  goto out;
403  }
404 
405  // Double the length of the cache.
407  "MAX_BLINDINGS_PER_RSA too large");
408  unsigned new_num_blindings = rsa->num_blindings * 2;
409  if (new_num_blindings == 0) {
410  new_num_blindings = 1;
411  }
412  if (new_num_blindings > MAX_BLINDINGS_PER_RSA) {
413  new_num_blindings = MAX_BLINDINGS_PER_RSA;
414  }
415  assert(new_num_blindings > rsa->num_blindings);
416 
418  MAX_BLINDINGS_PER_RSA < UINT_MAX / sizeof(BN_BLINDING *),
419  "MAX_BLINDINGS_PER_RSA too large");
420  BN_BLINDING **new_blindings =
421  OPENSSL_malloc(sizeof(BN_BLINDING *) * new_num_blindings);
422  uint8_t *new_blindings_inuse = OPENSSL_malloc(new_num_blindings);
423  if (new_blindings == NULL || new_blindings_inuse == NULL) {
424  goto err;
425  }
426 
427  OPENSSL_memcpy(new_blindings, rsa->blindings,
428  sizeof(BN_BLINDING *) * rsa->num_blindings);
429  OPENSSL_memcpy(new_blindings_inuse, rsa->blindings_inuse, rsa->num_blindings);
430 
431  for (unsigned i = rsa->num_blindings; i < new_num_blindings; i++) {
432  new_blindings[i] = BN_BLINDING_new();
433  if (new_blindings[i] == NULL) {
434  for (unsigned j = rsa->num_blindings; j < i; j++) {
435  BN_BLINDING_free(new_blindings[j]);
436  }
437  goto err;
438  }
439  }
440  memset(&new_blindings_inuse[rsa->num_blindings], 0,
441  new_num_blindings - rsa->num_blindings);
442 
443  new_blindings_inuse[rsa->num_blindings] = 1;
444  *index_used = rsa->num_blindings;
445  assert(*index_used != MAX_BLINDINGS_PER_RSA);
446  ret = new_blindings[rsa->num_blindings];
447 
448  OPENSSL_free(rsa->blindings);
449  rsa->blindings = new_blindings;
451  rsa->blindings_inuse = new_blindings_inuse;
452  rsa->num_blindings = new_num_blindings;
453 
454  goto out;
455 
456 err:
457  OPENSSL_free(new_blindings_inuse);
458  OPENSSL_free(new_blindings);
459 
460 out:
462  return ret;
463 }
464 
465 // rsa_blinding_release marks the cached BN_BLINDING at the given index as free
466 // for other threads to use.
467 static void rsa_blinding_release(RSA *rsa, BN_BLINDING *blinding,
468  unsigned blinding_index) {
469  if (blinding_index == MAX_BLINDINGS_PER_RSA) {
470  // This blinding wasn't cached.
471  BN_BLINDING_free(blinding);
472  return;
473  }
474 
476  rsa->blindings_inuse[blinding_index] = 0;
478 }
479 
480 // signing
481 int rsa_default_sign_raw(RSA *rsa, size_t *out_len, uint8_t *out,
482  size_t max_out, const uint8_t *in, size_t in_len,
483  int padding) {
484  const unsigned rsa_size = RSA_size(rsa);
485  uint8_t *buf = NULL;
486  int i, ret = 0;
487 
488  if (max_out < rsa_size) {
490  return 0;
491  }
492 
493  buf = OPENSSL_malloc(rsa_size);
494  if (buf == NULL) {
496  goto err;
497  }
498 
499  switch (padding) {
500  case RSA_PKCS1_PADDING:
501  i = RSA_padding_add_PKCS1_type_1(buf, rsa_size, in, in_len);
502  break;
503  case RSA_NO_PADDING:
504  i = RSA_padding_add_none(buf, rsa_size, in, in_len);
505  break;
506  default:
508  goto err;
509  }
510 
511  if (i <= 0) {
512  goto err;
513  }
514 
515  if (!RSA_private_transform(rsa, out, buf, rsa_size)) {
516  goto err;
517  }
518 
519  CONSTTIME_DECLASSIFY(out, rsa_size);
520  *out_len = rsa_size;
521  ret = 1;
522 
523 err:
524  OPENSSL_free(buf);
525 
526  return ret;
527 }
528 
529 int rsa_default_decrypt(RSA *rsa, size_t *out_len, uint8_t *out, size_t max_out,
530  const uint8_t *in, size_t in_len, int padding) {
531  const unsigned rsa_size = RSA_size(rsa);
532  uint8_t *buf = NULL;
533  int ret = 0;
534 
535  if (max_out < rsa_size) {
537  return 0;
538  }
539 
540  if (padding == RSA_NO_PADDING) {
541  buf = out;
542  } else {
543  // Allocate a temporary buffer to hold the padded plaintext.
544  buf = OPENSSL_malloc(rsa_size);
545  if (buf == NULL) {
547  goto err;
548  }
549  }
550 
551  if (in_len != rsa_size) {
553  goto err;
554  }
555 
556  if (!RSA_private_transform(rsa, buf, in, rsa_size)) {
557  goto err;
558  }
559 
560  switch (padding) {
561  case RSA_PKCS1_PADDING:
562  ret =
563  RSA_padding_check_PKCS1_type_2(out, out_len, rsa_size, buf, rsa_size);
564  break;
566  // Use the default parameters: SHA-1 for both hashes and no label.
567  ret = RSA_padding_check_PKCS1_OAEP_mgf1(out, out_len, rsa_size, buf,
568  rsa_size, NULL, 0, NULL, NULL);
569  break;
570  case RSA_NO_PADDING:
571  *out_len = rsa_size;
572  ret = 1;
573  break;
574  default:
576  goto err;
577  }
578 
579  CONSTTIME_DECLASSIFY(&ret, sizeof(ret));
580  if (!ret) {
582  } else {
583  CONSTTIME_DECLASSIFY(out, *out_len);
584  }
585 
586 err:
587  if (padding != RSA_NO_PADDING) {
588  OPENSSL_free(buf);
589  }
590 
591  return ret;
592 }
593 
594 static int mod_exp(BIGNUM *r0, const BIGNUM *I, RSA *rsa, BN_CTX *ctx);
595 
596 int RSA_verify_raw(RSA *rsa, size_t *out_len, uint8_t *out, size_t max_out,
597  const uint8_t *in, size_t in_len, int padding) {
598  if (!rsa_check_public_key(rsa)) {
599  return 0;
600  }
601 
602  const unsigned rsa_size = RSA_size(rsa);
603  BIGNUM *f, *result;
604 
605  if (max_out < rsa_size) {
607  return 0;
608  }
609 
610  if (in_len != rsa_size) {
612  return 0;
613  }
614 
615  BN_CTX *ctx = BN_CTX_new();
616  if (ctx == NULL) {
617  return 0;
618  }
619 
620  int ret = 0;
621  uint8_t *buf = NULL;
622 
623  BN_CTX_start(ctx);
624  f = BN_CTX_get(ctx);
625  result = BN_CTX_get(ctx);
626  if (f == NULL || result == NULL) {
628  goto err;
629  }
630 
631  if (padding == RSA_NO_PADDING) {
632  buf = out;
633  } else {
634  // Allocate a temporary buffer to hold the padded plaintext.
635  buf = OPENSSL_malloc(rsa_size);
636  if (buf == NULL) {
638  goto err;
639  }
640  }
641 
642  if (BN_bin2bn(in, in_len, f) == NULL) {
643  goto err;
644  }
645 
646  if (BN_ucmp(f, rsa->n) >= 0) {
648  goto err;
649  }
650 
651  if (!BN_MONT_CTX_set_locked(&rsa->mont_n, &rsa->lock, rsa->n, ctx) ||
652  !BN_mod_exp_mont(result, f, rsa->e, &rsa->mont_n->N, ctx, rsa->mont_n)) {
653  goto err;
654  }
655 
656  if (!BN_bn2bin_padded(buf, rsa_size, result)) {
658  goto err;
659  }
660 
661  switch (padding) {
662  case RSA_PKCS1_PADDING:
663  ret =
664  RSA_padding_check_PKCS1_type_1(out, out_len, rsa_size, buf, rsa_size);
665  break;
666  case RSA_NO_PADDING:
667  ret = 1;
668  *out_len = rsa_size;
669  break;
670  default:
672  goto err;
673  }
674 
675  if (!ret) {
677  goto err;
678  }
679 
680 err:
681  BN_CTX_end(ctx);
682  BN_CTX_free(ctx);
683  if (buf != out) {
684  OPENSSL_free(buf);
685  }
686  return ret;
687 }
688 
690  size_t len) {
691  if (rsa->n == NULL || rsa->d == NULL) {
693  return 0;
694  }
695 
696  BIGNUM *f, *result;
697  BN_CTX *ctx = NULL;
698  unsigned blinding_index = 0;
699  BN_BLINDING *blinding = NULL;
700  int ret = 0;
701 
702  ctx = BN_CTX_new();
703  if (ctx == NULL) {
704  goto err;
705  }
706  BN_CTX_start(ctx);
707  f = BN_CTX_get(ctx);
708  result = BN_CTX_get(ctx);
709 
710  if (f == NULL || result == NULL) {
712  goto err;
713  }
714 
715  if (BN_bin2bn(in, len, f) == NULL) {
716  goto err;
717  }
718 
719  if (BN_ucmp(f, rsa->n) >= 0) {
720  // Usually the padding functions would catch this.
722  goto err;
723  }
724 
725  if (!freeze_private_key(rsa, ctx)) {
727  goto err;
728  }
729 
730  const int do_blinding = (rsa->flags & RSA_FLAG_NO_BLINDING) == 0;
731 
732  if (rsa->e == NULL && do_blinding) {
733  // We cannot do blinding or verification without |e|, and continuing without
734  // those countermeasures is dangerous. However, the Java/Android RSA API
735  // requires support for keys where only |d| and |n| (and not |e|) are known.
736  // The callers that require that bad behavior set |RSA_FLAG_NO_BLINDING|.
738  goto err;
739  }
740 
741  if (do_blinding) {
742  blinding = rsa_blinding_get(rsa, &blinding_index, ctx);
743  if (blinding == NULL) {
745  goto err;
746  }
747  if (!BN_BLINDING_convert(f, blinding, rsa->e, rsa->mont_n, ctx)) {
748  goto err;
749  }
750  }
751 
752  if (rsa->p != NULL && rsa->q != NULL && rsa->e != NULL && rsa->dmp1 != NULL &&
753  rsa->dmq1 != NULL && rsa->iqmp != NULL &&
754  // Require that we can reduce |f| by |rsa->p| and |rsa->q| in constant
755  // time, which requires primes be the same size, rounded to the Montgomery
756  // coefficient. (See |mod_montgomery|.) This is not required by RFC 8017,
757  // but it is true for keys generated by us and all common implementations.
758  bn_less_than_montgomery_R(rsa->q, rsa->mont_p) &&
759  bn_less_than_montgomery_R(rsa->p, rsa->mont_q)) {
760  if (!mod_exp(result, f, rsa, ctx)) {
761  goto err;
762  }
763  } else if (!BN_mod_exp_mont_consttime(result, f, rsa->d_fixed, rsa->n, ctx,
764  rsa->mont_n)) {
765  goto err;
766  }
767 
768  // Verify the result to protect against fault attacks as described in the
769  // 1997 paper "On the Importance of Checking Cryptographic Protocols for
770  // Faults" by Dan Boneh, Richard A. DeMillo, and Richard J. Lipton. Some
771  // implementations do this only when the CRT is used, but we do it in all
772  // cases. Section 6 of the aforementioned paper describes an attack that
773  // works when the CRT isn't used. That attack is much less likely to succeed
774  // than the CRT attack, but there have likely been improvements since 1997.
775  //
776  // This check is cheap assuming |e| is small; it almost always is.
777  if (rsa->e != NULL) {
778  BIGNUM *vrfy = BN_CTX_get(ctx);
779  if (vrfy == NULL ||
780  !BN_mod_exp_mont(vrfy, result, rsa->e, rsa->n, ctx, rsa->mont_n) ||
781  !BN_equal_consttime(vrfy, f)) {
783  goto err;
784  }
785 
786  }
787 
788  if (do_blinding &&
789  !BN_BLINDING_invert(result, blinding, rsa->mont_n, ctx)) {
790  goto err;
791  }
792 
793  // The computation should have left |result| as a maximally-wide number, so
794  // that it and serializing does not leak information about the magnitude of
795  // the result.
796  //
797  // See Falko Strenzke, "Manger's Attack revisited", ICICS 2010.
798  assert(result->width == rsa->mont_n->N.width);
799  if (!BN_bn2bin_padded(out, len, result)) {
801  goto err;
802  }
803 
804  ret = 1;
805 
806 err:
807  if (ctx != NULL) {
808  BN_CTX_end(ctx);
809  BN_CTX_free(ctx);
810  }
811  if (blinding != NULL) {
812  rsa_blinding_release(rsa, blinding, blinding_index);
813  }
814 
815  return ret;
816 }
817 
818 // mod_montgomery sets |r| to |I| mod |p|. |I| must already be fully reduced
819 // modulo |p| times |q|. It returns one on success and zero on error.
820 static int mod_montgomery(BIGNUM *r, const BIGNUM *I, const BIGNUM *p,
821  const BN_MONT_CTX *mont_p, const BIGNUM *q,
822  BN_CTX *ctx) {
823  // Reducing in constant-time with Montgomery reduction requires I <= p * R. We
824  // have I < p * q, so this follows if q < R. The caller should have checked
825  // this already.
826  if (!bn_less_than_montgomery_R(q, mont_p)) {
828  return 0;
829  }
830 
831  if (// Reduce mod p with Montgomery reduction. This computes I * R^-1 mod p.
832  !BN_from_montgomery(r, I, mont_p, ctx) ||
833  // Multiply by R^2 and do another Montgomery reduction to compute
834  // I * R^-1 * R^2 * R^-1 = I mod p.
835  !BN_to_montgomery(r, r, mont_p, ctx)) {
836  return 0;
837  }
838 
839  // By precomputing R^3 mod p (normally |BN_MONT_CTX| only uses R^2 mod p) and
840  // adjusting the API for |BN_mod_exp_mont_consttime|, we could instead compute
841  // I * R mod p here and save a reduction per prime. But this would require
842  // changing the RSAZ code and may not be worth it. Note that the RSAZ code
843  // uses a different radix, so it uses R' = 2^1044. There we'd actually want
844  // R^2 * R', and would futher benefit from a precomputed R'^2. It currently
845  // converts |mont_p->RR| to R'^2.
846  return 1;
847 }
848 
849 static int mod_exp(BIGNUM *r0, const BIGNUM *I, RSA *rsa, BN_CTX *ctx) {
850  assert(ctx != NULL);
851 
852  assert(rsa->n != NULL);
853  assert(rsa->e != NULL);
854  assert(rsa->d != NULL);
855  assert(rsa->p != NULL);
856  assert(rsa->q != NULL);
857  assert(rsa->dmp1 != NULL);
858  assert(rsa->dmq1 != NULL);
859  assert(rsa->iqmp != NULL);
860 
861  BIGNUM *r1, *m1;
862  int ret = 0;
863 
864  BN_CTX_start(ctx);
865  r1 = BN_CTX_get(ctx);
866  m1 = BN_CTX_get(ctx);
867  if (r1 == NULL ||
868  m1 == NULL) {
869  goto err;
870  }
871 
872  if (!freeze_private_key(rsa, ctx)) {
873  goto err;
874  }
875 
876  // Implementing RSA with CRT in constant-time is sensitive to which prime is
877  // larger. Canonicalize fields so that |p| is the larger prime.
878  const BIGNUM *dmp1 = rsa->dmp1_fixed, *dmq1 = rsa->dmq1_fixed;
879  const BN_MONT_CTX *mont_p = rsa->mont_p, *mont_q = rsa->mont_q;
880  if (BN_cmp(rsa->p, rsa->q) < 0) {
881  mont_p = rsa->mont_q;
882  mont_q = rsa->mont_p;
883  dmp1 = rsa->dmq1_fixed;
884  dmq1 = rsa->dmp1_fixed;
885  }
886 
887  // Use the minimal-width versions of |n|, |p|, and |q|. Either works, but if
888  // someone gives us non-minimal values, these will be slightly more efficient
889  // on the non-Montgomery operations.
890  const BIGNUM *n = &rsa->mont_n->N;
891  const BIGNUM *p = &mont_p->N;
892  const BIGNUM *q = &mont_q->N;
893 
894  // This is a pre-condition for |mod_montgomery|. It was already checked by the
895  // caller.
896  assert(BN_ucmp(I, n) < 0);
897 
898  if (// |m1| is the result modulo |q|.
899  !mod_montgomery(r1, I, q, mont_q, p, ctx) ||
900  !BN_mod_exp_mont_consttime(m1, r1, dmq1, q, ctx, mont_q) ||
901  // |r0| is the result modulo |p|.
902  !mod_montgomery(r1, I, p, mont_p, q, ctx) ||
903  !BN_mod_exp_mont_consttime(r0, r1, dmp1, p, ctx, mont_p) ||
904  // Compute r0 = r0 - m1 mod p. |p| is the larger prime, so |m1| is already
905  // fully reduced mod |p|.
906  !bn_mod_sub_consttime(r0, r0, m1, p, ctx) ||
907  // r0 = r0 * iqmp mod p. We use Montgomery multiplication to compute this
908  // in constant time. |inv_small_mod_large_mont| is in Montgomery form and
909  // r0 is not, so the result is taken out of Montgomery form.
910  !BN_mod_mul_montgomery(r0, r0, rsa->inv_small_mod_large_mont, mont_p,
911  ctx) ||
912  // r0 = r0 * q + m1 gives the final result. Reducing modulo q gives m1, so
913  // it is correct mod p. Reducing modulo p gives (r0-m1)*iqmp*q + m1 = r0,
914  // so it is correct mod q. Finally, the result is bounded by [m1, n + m1),
915  // and the result is at least |m1|, so this must be the unique answer in
916  // [0, n).
917  !bn_mul_consttime(r0, r0, q, ctx) ||
918  !bn_uadd_consttime(r0, r0, m1) ||
919  // The result should be bounded by |n|, but fixed-width operations may
920  // bound the width slightly higher, so fix it.
921  !bn_resize_words(r0, n->width)) {
922  goto err;
923  }
924 
925  ret = 1;
926 
927 err:
928  BN_CTX_end(ctx);
929  return ret;
930 }
931 
932 static int ensure_bignum(BIGNUM **out) {
933  if (*out == NULL) {
934  *out = BN_new();
935  }
936  return *out != NULL;
937 }
938 
939 // kBoringSSLRSASqrtTwo is the BIGNUM representation of ⌊2²⁰⁴⁷×√2⌋. This is
940 // chosen to give enough precision for 4096-bit RSA, the largest key size FIPS
941 // specifies. Key sizes beyond this will round up.
942 //
943 // To calculate, use the following Haskell code:
944 //
945 // import Text.Printf (printf)
946 // import Data.List (intercalate)
947 //
948 // pow2 = 4095
949 // target = 2^pow2
950 //
951 // f x = x*x - (toRational target)
952 //
953 // fprime x = 2*x
954 //
955 // newtonIteration x = x - (f x) / (fprime x)
956 //
957 // converge x =
958 // let n = floor x in
959 // if n*n - target < 0 && (n+1)*(n+1) - target > 0
960 // then n
961 // else converge (newtonIteration x)
962 //
963 // divrem bits x = (x `div` (2^bits), x `rem` (2^bits))
964 //
965 // bnWords :: Integer -> [Integer]
966 // bnWords x =
967 // if x == 0
968 // then []
969 // else let (high, low) = divrem 64 x in low : bnWords high
970 //
971 // showWord x = let (high, low) = divrem 32 x in printf "TOBN(0x%08x, 0x%08x)" high low
972 //
973 // output :: String
974 // output = intercalate ", " $ map showWord $ bnWords $ converge (2 ^ (pow2 `div` 2))
975 //
976 // To verify this number, check that n² < 2⁴⁰⁹⁵ < (n+1)², where n is value
977 // represented here. Note the components are listed in little-endian order. Here
978 // is some sample Python code to check:
979 //
980 // >>> TOBN = lambda a, b: a << 32 | b
981 // >>> l = [ <paste the contents of kSqrtTwo> ]
982 // >>> n = sum(a * 2**(64*i) for i, a in enumerate(l))
983 // >>> n**2 < 2**4095 < (n+1)**2
984 // True
985 const BN_ULONG kBoringSSLRSASqrtTwo[] = {
986  TOBN(0x4d7c60a5, 0xe633e3e1), TOBN(0x5fcf8f7b, 0xca3ea33b),
987  TOBN(0xc246785e, 0x92957023), TOBN(0xf9acce41, 0x797f2805),
988  TOBN(0xfdfe170f, 0xd3b1f780), TOBN(0xd24f4a76, 0x3facb882),
989  TOBN(0x18838a2e, 0xaff5f3b2), TOBN(0xc1fcbdde, 0xa2f7dc33),
990  TOBN(0xdea06241, 0xf7aa81c2), TOBN(0xf6a1be3f, 0xca221307),
991  TOBN(0x332a5e9f, 0x7bda1ebf), TOBN(0x0104dc01, 0xfe32352f),
992  TOBN(0xb8cf341b, 0x6f8236c7), TOBN(0x4264dabc, 0xd528b651),
993  TOBN(0xf4d3a02c, 0xebc93e0c), TOBN(0x81394ab6, 0xd8fd0efd),
994  TOBN(0xeaa4a089, 0x9040ca4a), TOBN(0xf52f120f, 0x836e582e),
995  TOBN(0xcb2a6343, 0x31f3c84d), TOBN(0xc6d5a8a3, 0x8bb7e9dc),
996  TOBN(0x460abc72, 0x2f7c4e33), TOBN(0xcab1bc91, 0x1688458a),
997  TOBN(0x53059c60, 0x11bc337b), TOBN(0xd2202e87, 0x42af1f4e),
998  TOBN(0x78048736, 0x3dfa2768), TOBN(0x0f74a85e, 0x439c7b4a),
999  TOBN(0xa8b1fe6f, 0xdc83db39), TOBN(0x4afc8304, 0x3ab8a2c3),
1000  TOBN(0xed17ac85, 0x83339915), TOBN(0x1d6f60ba, 0x893ba84c),
1001  TOBN(0x597d89b3, 0x754abe9f), TOBN(0xb504f333, 0xf9de6484),
1002 };
1004 
1005 // generate_prime sets |out| to a prime with length |bits| such that |out|-1 is
1006 // relatively prime to |e|. If |p| is non-NULL, |out| will also not be close to
1007 // |p|. |sqrt2| must be ⌊2^(bits-1)×√2⌋ (or a slightly overestimate for large
1008 // sizes), and |pow2_bits_100| must be 2^(bits-100).
1009 //
1010 // This function fails with probability around 2^-21.
1011 static int generate_prime(BIGNUM *out, int bits, const BIGNUM *e,
1012  const BIGNUM *p, const BIGNUM *sqrt2,
1013  const BIGNUM *pow2_bits_100, BN_CTX *ctx,
1014  BN_GENCB *cb) {
1015  if (bits < 128 || (bits % BN_BITS2) != 0) {
1017  return 0;
1018  }
1019  assert(BN_is_pow2(pow2_bits_100));
1020  assert(BN_is_bit_set(pow2_bits_100, bits - 100));
1021 
1022  // See FIPS 186-4 appendix B.3.3, steps 4 and 5. Note |bits| here is nlen/2.
1023 
1024  // Use the limit from steps 4.7 and 5.8 for most values of |e|. When |e| is 3,
1025  // the 186-4 limit is too low, so we use a higher one. Note this case is not
1026  // reachable from |RSA_generate_key_fips|.
1027  //
1028  // |limit| determines the failure probability. We must find a prime that is
1029  // not 1 mod |e|. By the prime number theorem, we'll find one with probability
1030  // p = (e-1)/e * 2/(ln(2)*bits). Note the second term is doubled because we
1031  // discard even numbers.
1032  //
1033  // The failure probability is thus (1-p)^limit. To convert that to a power of
1034  // two, we take logs. -log_2((1-p)^limit) = -limit * ln(1-p) / ln(2).
1035  //
1036  // >>> def f(bits, e, limit):
1037  // ... p = (e-1.0)/e * 2.0/(math.log(2)*bits)
1038  // ... return -limit * math.log(1 - p) / math.log(2)
1039  // ...
1040  // >>> f(1024, 65537, 5*1024)
1041  // 20.842750558272634
1042  // >>> f(1536, 65537, 5*1536)
1043  // 20.83294549602474
1044  // >>> f(2048, 65537, 5*2048)
1045  // 20.828047576234948
1046  // >>> f(1024, 3, 8*1024)
1047  // 22.222147925962307
1048  // >>> f(1536, 3, 8*1536)
1049  // 22.21518251065506
1050  // >>> f(2048, 3, 8*2048)
1051  // 22.211701985875937
1052  if (bits >= INT_MAX/32) {
1054  return 0;
1055  }
1056  int limit = BN_is_word(e, 3) ? bits * 8 : bits * 5;
1057 
1058  int ret = 0, tries = 0, rand_tries = 0;
1059  BN_CTX_start(ctx);
1060  BIGNUM *tmp = BN_CTX_get(ctx);
1061  if (tmp == NULL) {
1062  goto err;
1063  }
1064 
1065  for (;;) {
1066  // Generate a random number of length |bits| where the bottom bit is set
1067  // (steps 4.2, 4.3, 5.2 and 5.3) and the top bit is set (implied by the
1068  // bound checked below in steps 4.4 and 5.5).
1070  !BN_GENCB_call(cb, BN_GENCB_GENERATED, rand_tries++)) {
1071  goto err;
1072  }
1073 
1074  if (p != NULL) {
1075  // If |p| and |out| are too close, try again (step 5.4).
1076  if (!bn_abs_sub_consttime(tmp, out, p, ctx)) {
1077  goto err;
1078  }
1079  if (BN_cmp(tmp, pow2_bits_100) <= 0) {
1080  continue;
1081  }
1082  }
1083 
1084  // If out < 2^(bits-1)×√2, try again (steps 4.4 and 5.5). This is equivalent
1085  // to out <= ⌊2^(bits-1)×√2⌋, or out <= sqrt2 for FIPS key sizes.
1086  //
1087  // For larger keys, the comparison is approximate, leaning towards
1088  // retrying. That is, we reject a negligible fraction of primes that are
1089  // within the FIPS bound, but we will never accept a prime outside the
1090  // bound, ensuring the resulting RSA key is the right size.
1091  if (BN_cmp(out, sqrt2) <= 0) {
1092  continue;
1093  }
1094 
1095  // RSA key generation's bottleneck is discarding composites. If it fails
1096  // trial division, do not bother computing a GCD or performing Miller-Rabin.
1098  // Check gcd(out-1, e) is one (steps 4.5 and 5.6).
1099  int relatively_prime;
1100  if (!BN_sub(tmp, out, BN_value_one()) ||
1101  !bn_is_relatively_prime(&relatively_prime, tmp, e, ctx)) {
1102  goto err;
1103  }
1104  if (relatively_prime) {
1105  // Test |out| for primality (steps 4.5.1 and 5.6.1).
1106  int is_probable_prime;
1107  if (!BN_primality_test(&is_probable_prime, out,
1109  goto err;
1110  }
1111  if (is_probable_prime) {
1112  ret = 1;
1113  goto err;
1114  }
1115  }
1116  }
1117 
1118  // If we've tried too many times to find a prime, abort (steps 4.7 and
1119  // 5.8).
1120  tries++;
1121  if (tries >= limit) {
1123  goto err;
1124  }
1125  if (!BN_GENCB_call(cb, 2, tries)) {
1126  goto err;
1127  }
1128  }
1129 
1130 err:
1131  BN_CTX_end(ctx);
1132  return ret;
1133 }
1134 
1135 // rsa_generate_key_impl generates an RSA key using a generalized version of
1136 // FIPS 186-4 appendix B.3. |RSA_generate_key_fips| performs additional checks
1137 // for FIPS-compliant key generation.
1138 //
1139 // This function returns one on success and zero on failure. It has a failure
1140 // probability of about 2^-20.
1141 static int rsa_generate_key_impl(RSA *rsa, int bits, const BIGNUM *e_value,
1142  BN_GENCB *cb) {
1143  // See FIPS 186-4 appendix B.3. This function implements a generalized version
1144  // of the FIPS algorithm. |RSA_generate_key_fips| performs additional checks
1145  // for FIPS-compliant key generation.
1146 
1147  // Always generate RSA keys which are a multiple of 128 bits. Round |bits|
1148  // down as needed.
1149  bits &= ~127;
1150 
1151  // Reject excessively small keys.
1152  if (bits < 256) {
1154  return 0;
1155  }
1156 
1157  // Reject excessively large public exponents. Windows CryptoAPI and Go don't
1158  // support values larger than 32 bits, so match their limits for generating
1159  // keys. (|rsa_check_public_key| uses a slightly more conservative value, but
1160  // we don't need to support generating such keys.)
1161  // https://github.com/golang/go/issues/3161
1162  // https://msdn.microsoft.com/en-us/library/aa387685(VS.85).aspx
1163  if (BN_num_bits(e_value) > 32) {
1165  return 0;
1166  }
1167 
1168  int ret = 0;
1169  int prime_bits = bits / 2;
1170  BN_CTX *ctx = BN_CTX_new();
1171  if (ctx == NULL) {
1172  goto bn_err;
1173  }
1174  BN_CTX_start(ctx);
1175  BIGNUM *totient = BN_CTX_get(ctx);
1176  BIGNUM *pm1 = BN_CTX_get(ctx);
1177  BIGNUM *qm1 = BN_CTX_get(ctx);
1178  BIGNUM *sqrt2 = BN_CTX_get(ctx);
1179  BIGNUM *pow2_prime_bits_100 = BN_CTX_get(ctx);
1180  BIGNUM *pow2_prime_bits = BN_CTX_get(ctx);
1181  if (totient == NULL || pm1 == NULL || qm1 == NULL || sqrt2 == NULL ||
1182  pow2_prime_bits_100 == NULL || pow2_prime_bits == NULL ||
1183  !BN_set_bit(pow2_prime_bits_100, prime_bits - 100) ||
1184  !BN_set_bit(pow2_prime_bits, prime_bits)) {
1185  goto bn_err;
1186  }
1187 
1188  // We need the RSA components non-NULL.
1189  if (!ensure_bignum(&rsa->n) ||
1190  !ensure_bignum(&rsa->d) ||
1191  !ensure_bignum(&rsa->e) ||
1192  !ensure_bignum(&rsa->p) ||
1193  !ensure_bignum(&rsa->q) ||
1194  !ensure_bignum(&rsa->dmp1) ||
1195  !ensure_bignum(&rsa->dmq1)) {
1196  goto bn_err;
1197  }
1198 
1199  if (!BN_copy(rsa->e, e_value)) {
1200  goto bn_err;
1201  }
1202 
1203  // Compute sqrt2 >= ⌊2^(prime_bits-1)×√2⌋.
1205  goto bn_err;
1206  }
1207  int sqrt2_bits = kBoringSSLRSASqrtTwoLen * BN_BITS2;
1208  assert(sqrt2_bits == (int)BN_num_bits(sqrt2));
1209  if (sqrt2_bits > prime_bits) {
1210  // For key sizes up to 4096 (prime_bits = 2048), this is exactly
1211  // ⌊2^(prime_bits-1)×√2⌋.
1212  if (!BN_rshift(sqrt2, sqrt2, sqrt2_bits - prime_bits)) {
1213  goto bn_err;
1214  }
1215  } else if (prime_bits > sqrt2_bits) {
1216  // For key sizes beyond 4096, this is approximate. We err towards retrying
1217  // to ensure our key is the right size and round up.
1218  if (!BN_add_word(sqrt2, 1) ||
1219  !BN_lshift(sqrt2, sqrt2, prime_bits - sqrt2_bits)) {
1220  goto bn_err;
1221  }
1222  }
1223  assert(prime_bits == (int)BN_num_bits(sqrt2));
1224 
1225  do {
1226  // Generate p and q, each of size |prime_bits|, using the steps outlined in
1227  // appendix FIPS 186-4 appendix B.3.3.
1228  //
1229  // Each call to |generate_prime| fails with probability p = 2^-21. The
1230  // probability that either call fails is 1 - (1-p)^2, which is around 2^-20.
1231  if (!generate_prime(rsa->p, prime_bits, rsa->e, NULL, sqrt2,
1232  pow2_prime_bits_100, ctx, cb) ||
1233  !BN_GENCB_call(cb, 3, 0) ||
1234  !generate_prime(rsa->q, prime_bits, rsa->e, rsa->p, sqrt2,
1235  pow2_prime_bits_100, ctx, cb) ||
1236  !BN_GENCB_call(cb, 3, 1)) {
1237  goto bn_err;
1238  }
1239 
1240  if (BN_cmp(rsa->p, rsa->q) < 0) {
1241  BIGNUM *tmp = rsa->p;
1242  rsa->p = rsa->q;
1243  rsa->q = tmp;
1244  }
1245 
1246  // Calculate d = e^(-1) (mod lcm(p-1, q-1)), per FIPS 186-4. This differs
1247  // from typical RSA implementations which use (p-1)*(q-1).
1248  //
1249  // Note this means the size of d might reveal information about p-1 and
1250  // q-1. However, we do operations with Chinese Remainder Theorem, so we only
1251  // use d (mod p-1) and d (mod q-1) as exponents. Using a minimal totient
1252  // does not affect those two values.
1253  int no_inverse;
1254  if (!bn_usub_consttime(pm1, rsa->p, BN_value_one()) ||
1255  !bn_usub_consttime(qm1, rsa->q, BN_value_one()) ||
1256  !bn_lcm_consttime(totient, pm1, qm1, ctx) ||
1257  !bn_mod_inverse_consttime(rsa->d, &no_inverse, rsa->e, totient, ctx)) {
1258  goto bn_err;
1259  }
1260 
1261  // Retry if |rsa->d| <= 2^|prime_bits|. See appendix B.3.1's guidance on
1262  // values for d.
1263  } while (BN_cmp(rsa->d, pow2_prime_bits) <= 0);
1264 
1265  assert(BN_num_bits(pm1) == (unsigned)prime_bits);
1266  assert(BN_num_bits(qm1) == (unsigned)prime_bits);
1267  if (// Calculate n.
1268  !bn_mul_consttime(rsa->n, rsa->p, rsa->q, ctx) ||
1269  // Calculate d mod (p-1).
1270  !bn_div_consttime(NULL, rsa->dmp1, rsa->d, pm1, prime_bits, ctx) ||
1271  // Calculate d mod (q-1)
1272  !bn_div_consttime(NULL, rsa->dmq1, rsa->d, qm1, prime_bits, ctx)) {
1273  goto bn_err;
1274  }
1275  bn_set_minimal_width(rsa->n);
1276 
1277  // Sanity-check that |rsa->n| has the specified size. This is implied by
1278  // |generate_prime|'s bounds.
1279  if (BN_num_bits(rsa->n) != (unsigned)bits) {
1281  goto err;
1282  }
1283 
1284  // Call |freeze_private_key| to compute the inverse of q mod p, by way of
1285  // |rsa->mont_p|.
1286  if (!freeze_private_key(rsa, ctx)) {
1287  goto bn_err;
1288  }
1289 
1290  // The key generation process is complex and thus error-prone. It could be
1291  // disastrous to generate and then use a bad key so double-check that the key
1292  // makes sense.
1293  if (!RSA_check_key(rsa)) {
1295  goto err;
1296  }
1297 
1298  ret = 1;
1299 
1300 bn_err:
1301  if (!ret) {
1303  }
1304 err:
1305  if (ctx != NULL) {
1306  BN_CTX_end(ctx);
1307  BN_CTX_free(ctx);
1308  }
1309  return ret;
1310 }
1311 
1312 static void replace_bignum(BIGNUM **out, BIGNUM **in) {
1313  BN_free(*out);
1314  *out = *in;
1315  *in = NULL;
1316 }
1317 
1320  *out = *in;
1321  *in = NULL;
1322 }
1323 
1325  const BIGNUM *e_value, BN_GENCB *cb,
1326  int check_fips) {
1327  RSA *tmp = NULL;
1328  uint32_t err;
1329  int ret = 0;
1330 
1331  // |rsa_generate_key_impl|'s 2^-20 failure probability is too high at scale,
1332  // so we run the FIPS algorithm four times, bringing it down to 2^-80. We
1333  // should just adjust the retry limit, but FIPS 186-4 prescribes that value
1334  // and thus results in unnecessary complexity.
1335  int failures = 0;
1336  do {
1337  ERR_clear_error();
1338  // Generate into scratch space, to avoid leaving partial work on failure.
1339  tmp = RSA_new();
1340  if (tmp == NULL) {
1341  goto out;
1342  }
1343 
1344  if (rsa_generate_key_impl(tmp, bits, e_value, cb)) {
1345  break;
1346  }
1347 
1348  err = ERR_peek_error();
1349  RSA_free(tmp);
1350  tmp = NULL;
1351  failures++;
1352 
1353  // Only retry on |RSA_R_TOO_MANY_ITERATIONS|. This is so a caller-induced
1354  // failure in |BN_GENCB_call| is still fatal.
1355  } while (failures < 4 && ERR_GET_LIB(err) == ERR_LIB_RSA &&
1357 
1358  if (tmp == NULL || (check_fips && !RSA_check_fips(tmp))) {
1359  goto out;
1360  }
1361 
1362  replace_bignum(&rsa->n, &tmp->n);
1363  replace_bignum(&rsa->e, &tmp->e);
1364  replace_bignum(&rsa->d, &tmp->d);
1365  replace_bignum(&rsa->p, &tmp->p);
1366  replace_bignum(&rsa->q, &tmp->q);
1367  replace_bignum(&rsa->dmp1, &tmp->dmp1);
1368  replace_bignum(&rsa->dmq1, &tmp->dmq1);
1369  replace_bignum(&rsa->iqmp, &tmp->iqmp);
1370  replace_bn_mont_ctx(&rsa->mont_n, &tmp->mont_n);
1371  replace_bn_mont_ctx(&rsa->mont_p, &tmp->mont_p);
1372  replace_bn_mont_ctx(&rsa->mont_q, &tmp->mont_q);
1373  replace_bignum(&rsa->d_fixed, &tmp->d_fixed);
1374  replace_bignum(&rsa->dmp1_fixed, &tmp->dmp1_fixed);
1375  replace_bignum(&rsa->dmq1_fixed, &tmp->dmq1_fixed);
1377  &tmp->inv_small_mod_large_mont);
1378  rsa->private_key_frozen = tmp->private_key_frozen;
1379  ret = 1;
1380 
1381 out:
1382  RSA_free(tmp);
1383  return ret;
1384 }
1385 
1386 int RSA_generate_key_ex(RSA *rsa, int bits, const BIGNUM *e_value,
1387  BN_GENCB *cb) {
1388  return RSA_generate_key_ex_maybe_fips(rsa, bits, e_value, cb,
1389  /*check_fips=*/0);
1390 }
1391 
1393  // FIPS 186-4 allows 2048-bit and 3072-bit RSA keys (1024-bit and 1536-bit
1394  // primes, respectively) with the prime generation method we use.
1395  // Subsequently, IG A.14 stated that larger modulus sizes can be used and ACVP
1396  // testing supports 4096 bits.
1397  if (bits != 2048 && bits != 3072 && bits != 4096) {
1399  return 0;
1400  }
1401 
1402  BIGNUM *e = BN_new();
1403  int ret = e != NULL &&
1404  BN_set_word(e, RSA_F4) &&
1405  RSA_generate_key_ex_maybe_fips(rsa, bits, e, cb, /*check_fips=*/1);
1406  BN_free(e);
1407  return ret;
1408 }
1409 
1411  // All of the methods are NULL to make it easier for the compiler/linker to
1412  // drop unused functions. The wrapper functions will select the appropriate
1413  // |rsa_default_*| implementation.
1414  OPENSSL_memset(out, 0, sizeof(RSA_METHOD));
1415  out->common.is_static = 1;
1416 }
BN_MONT_CTX_new_consttime
#define BN_MONT_CTX_new_consttime
Definition: boringssl_prefix_symbols.h:892
RSA_R_VALUE_MISSING
#define RSA_R_VALUE_MISSING
Definition: rsa.h:849
rsa_st::dmp1_fixed
BIGNUM * dmp1_fixed
Definition: rsa.h:765
_gevent_test_main.result
result
Definition: _gevent_test_main.py:96
bn.h
width
int width
Definition: libuv/docs/code/tty-gravity/main.c:10
RSA_check_fips
#define RSA_check_fips
Definition: boringssl_prefix_symbols.h:2084
BN_BLINDING_new
#define BN_BLINDING_new
Definition: boringssl_prefix_symbols.h:881
RSA_default_method
const RSA_METHOD * RSA_default_method(void)
gen_build_yaml.out
dictionary out
Definition: src/benchmark/gen_build_yaml.py:24
BN_set_bit
#define BN_set_bit
Definition: boringssl_prefix_symbols.h:989
bn_set_minimal_width
#define bn_set_minimal_width
Definition: boringssl_prefix_symbols.h:2905
ctx
Definition: benchmark-async.c:30
BN_dup
#define BN_dup
Definition: boringssl_prefix_symbols.h:919
bn_resize_words
#define bn_resize_words
Definition: boringssl_prefix_symbols.h:2899
RSA_encrypt
int RSA_encrypt(RSA *rsa, size_t *out_len, uint8_t *out, size_t max_out, const uint8_t *in, size_t in_len, int padding)
Definition: rsa_impl.c:262
CRYPTO_get_fork_generation
#define CRYPTO_get_fork_generation
Definition: boringssl_prefix_symbols.h:1166
rsa_st::d
BIGNUM * d
Definition: rsa.h:740
BN_is_bit_set
#define BN_is_bit_set
Definition: boringssl_prefix_symbols.h:932
memset
return memset(p, 0, total)
rsa_blinding_release
static void rsa_blinding_release(RSA *rsa, BN_BLINDING *blinding, unsigned blinding_index)
Definition: rsa_impl.c:467
RSA_size
#define RSA_size
Definition: boringssl_prefix_symbols.h:2139
BN_add_word
#define BN_add_word
Definition: boringssl_prefix_symbols.h:898
BN_primality_test
#define BN_primality_test
Definition: boringssl_prefix_symbols.h:979
bn_mod_sub_consttime
#define bn_mod_sub_consttime
Definition: boringssl_prefix_symbols.h:2880
RSA_F4
#define RSA_F4
Definition: rsa.h:607
bn_blinding_st
Definition: blinding.c:123
BN_bin2bn
#define BN_bin2bn
Definition: boringssl_prefix_symbols.h:900
OPENSSL_PUT_ERROR
#define OPENSSL_PUT_ERROR(library, reason)
Definition: err.h:423
bignum_st::width
int width
Definition: bn.h:975
string.h
copy
static int copy(grpc_slice_buffer *input, grpc_slice_buffer *output)
Definition: message_compress.cc:145
OPENSSL_ARRAY_SIZE
#define OPENSSL_ARRAY_SIZE(array)
Definition: third_party/boringssl-with-bazel/src/crypto/internal.h:179
BN_rand
#define BN_rand
Definition: boringssl_prefix_symbols.h:984
bn_lcm_consttime
#define bn_lcm_consttime
Definition: boringssl_prefix_symbols.h:2863
framework.infrastructure.gcp.network_security.frozen
frozen
Definition: network_security.py:31
rsa_st::num_blindings
unsigned num_blindings
Definition: rsa.h:775
buf
voidpf void * buf
Definition: bloaty/third_party/zlib/contrib/minizip/ioapi.h:136
replace_bn_mont_ctx
static void replace_bn_mont_ctx(BN_MONT_CTX **out, BN_MONT_CTX **in)
Definition: rsa_impl.c:1318
rsa_blinding_get
static BN_BLINDING * rsa_blinding_get(RSA *rsa, unsigned *index_used, BN_CTX *ctx)
Definition: rsa_impl.c:366
CRYPTO_MUTEX_unlock_read
#define CRYPTO_MUTEX_unlock_read
Definition: boringssl_prefix_symbols.h:1127
error_ref_leak.err
err
Definition: error_ref_leak.py:35
rsa_default_sign_raw
int rsa_default_sign_raw(RSA *rsa, size_t *out_len, uint8_t *out, size_t max_out, const uint8_t *in, size_t in_len, int padding)
Definition: rsa_impl.c:481
OPENSSL_memchr
static void * OPENSSL_memchr(const void *s, int c, size_t n)
Definition: third_party/boringssl-with-bazel/src/crypto/internal.h:801
rsa_st::dmq1
BIGNUM * dmq1
Definition: rsa.h:744
RSA_padding_add_PKCS1_type_1
#define RSA_padding_add_PKCS1_type_1
Definition: boringssl_prefix_symbols.h:2114
bn_mont_ctx_st
Definition: bn.h:984
CONSTTIME_DECLASSIFY
#define CONSTTIME_DECLASSIFY(x, y)
Definition: third_party/boringssl-with-bazel/src/crypto/internal.h:462
BN_free
#define BN_free
Definition: boringssl_prefix_symbols.h:923
BN_GENCB_GENERATED
#define BN_GENCB_GENERATED
Definition: bn.h:635
bignum_ctx
Definition: ctx.c:91
BN_CTX_get
#define BN_CTX_get
Definition: boringssl_prefix_symbols.h:884
xds_manager.p
p
Definition: xds_manager.py:60
RSA_R_NO_PUBLIC_EXPONENT
#define RSA_R_NO_PUBLIC_EXPONENT
Definition: rsa.h:835
rsa_default_decrypt
int rsa_default_decrypt(RSA *rsa, size_t *out_len, uint8_t *out, size_t max_out, const uint8_t *in, size_t in_len, int padding)
Definition: rsa_impl.c:529
RSA_R_BAD_E_VALUE
#define RSA_R_BAD_E_VALUE
Definition: rsa.h:806
BN_num_bytes
#define BN_num_bytes
Definition: boringssl_prefix_symbols.h:976
rsa_default_size
size_t rsa_default_size(const RSA *rsa)
Definition: rsa_impl.c:258
BN_set_word
#define BN_set_word
Definition: boringssl_prefix_symbols.h:992
uint8_t
unsigned char uint8_t
Definition: stdint-msvc2008.h:78
RSA_R_INTERNAL_ERROR
#define RSA_R_INTERNAL_ERROR
Definition: rsa.h:829
OPENSSL_memset
static void * OPENSSL_memset(void *dst, int c, size_t n)
Definition: third_party/boringssl-with-bazel/src/crypto/internal.h:835
BN_sub
#define BN_sub
Definition: boringssl_prefix_symbols.h:995
BN_to_montgomery
#define BN_to_montgomery
Definition: boringssl_prefix_symbols.h:999
RSA_R_DATA_LEN_NOT_EQUAL_TO_MOD_LEN
#define RSA_R_DATA_LEN_NOT_EQUAL_TO_MOD_LEN
Definition: rsa.h:817
failures
std::atomic< uint64_t > failures
Definition: outlier_detection.cc:233
BN_value_one
const OPENSSL_EXPORT BIGNUM * BN_value_one(void)
RSA_R_OUTPUT_BUFFER_TOO_SMALL
#define RSA_R_OUTPUT_BUFFER_TOO_SMALL
Definition: rsa.h:840
BN_lshift
#define BN_lshift
Definition: boringssl_prefix_symbols.h:942
uint32_t
unsigned int uint32_t
Definition: stdint-msvc2008.h:80
RSA_PKCS1_PADDING
#define RSA_PKCS1_PADDING
Definition: rsa.h:210
OPENSSL_malloc
#define OPENSSL_malloc
Definition: boringssl_prefix_symbols.h:1885
rsa_generate_key_impl
static int rsa_generate_key_impl(RSA *rsa, int bits, const BIGNUM *e_value, BN_GENCB *cb)
Definition: rsa_impl.c:1141
rsa_default_private_transform
int rsa_default_private_transform(RSA *rsa, uint8_t *out, const uint8_t *in, size_t len)
Definition: rsa_impl.c:689
in
const char * in
Definition: third_party/abseil-cpp/absl/strings/internal/str_format/parser_test.cc:391
autogen_x86imm.f
f
Definition: autogen_x86imm.py:9
MAX_BLINDINGS_PER_RSA
#define MAX_BLINDINGS_PER_RSA
Definition: rsa_impl.c:356
bn_uadd_consttime
#define bn_uadd_consttime
Definition: boringssl_prefix_symbols.h:2917
ERR_GET_REASON
#define ERR_GET_REASON(packed_error)
Definition: err.h:171
rsa_st::mont_p
BN_MONT_CTX * mont_p
Definition: rsa.h:757
RSA_free
#define RSA_free
Definition: boringssl_prefix_symbols.h:2090
rsa_check_public_key
int rsa_check_public_key(const RSA *rsa)
Definition: rsa_impl.c:76
rsa_st::inv_small_mod_large_mont
BIGNUM * inv_small_mod_large_mont
Definition: rsa.h:770
rsa_st::p
BIGNUM * p
Definition: rsa.h:741
RSA_R_KEY_SIZE_TOO_SMALL
#define RSA_R_KEY_SIZE_TOO_SMALL
Definition: rsa.h:831
bn_usub_consttime
#define bn_usub_consttime
Definition: boringssl_prefix_symbols.h:2918
rsa_st::e
BIGNUM * e
Definition: rsa.h:739
BN_mod_exp_mont
#define BN_mod_exp_mont
Definition: boringssl_prefix_symbols.h:950
bn_div_consttime
#define bn_div_consttime
Definition: boringssl_prefix_symbols.h:2853
DEFINE_METHOD_FUNCTION
DEFINE_METHOD_FUNCTION(RSA_METHOD, RSA_default_method)
Definition: rsa_impl.c:1410
rsa_st::dmp1
BIGNUM * dmp1
Definition: rsa.h:743
ERR_peek_error
#define ERR_peek_error
Definition: boringssl_prefix_symbols.h:1428
RSA_R_UNKNOWN_PADDING_TYPE
#define RSA_R_UNKNOWN_PADDING_TYPE
Definition: rsa.h:848
uint64_t
unsigned __int64 uint64_t
Definition: stdint-msvc2008.h:90
BN_BLINDING_free
#define BN_BLINDING_free
Definition: boringssl_prefix_symbols.h:878
OPENSSL_memcpy
static void * OPENSSL_memcpy(void *dst, const void *src, size_t n)
Definition: third_party/boringssl-with-bazel/src/crypto/internal.h:819
ERR_GET_LIB
#define ERR_GET_LIB(packed_error)
Definition: err.h:166
bits
OPENSSL_EXPORT ASN1_BIT_STRING * bits
Definition: x509v3.h:482
ERR_LIB_BN
@ ERR_LIB_BN
Definition: err.h:294
RSA_padding_check_PKCS1_OAEP_mgf1
#define RSA_padding_check_PKCS1_OAEP_mgf1
Definition: boringssl_prefix_symbols.h:2117
err.h
ensure_bignum
static int ensure_bignum(BIGNUM **out)
Definition: rsa_impl.c:932
ERR_R_INTERNAL_ERROR
#define ERR_R_INTERNAL_ERROR
Definition: err.h:374
rsa.h
rsa_st::dmq1_fixed
BIGNUM * dmq1_fixed
Definition: rsa.h:765
BN_is_word
#define BN_is_word
Definition: boringssl_prefix_symbols.h:939
mod_montgomery
static int mod_montgomery(BIGNUM *r, const BIGNUM *I, const BIGNUM *p, const BN_MONT_CTX *mont_p, const BIGNUM *q, BN_CTX *ctx)
Definition: rsa_impl.c:820
BN_GENCB_call
#define BN_GENCB_call
Definition: boringssl_prefix_symbols.h:887
RSA_R_PADDING_CHECK_FAILED
#define RSA_R_PADDING_CHECK_FAILED
Definition: rsa.h:841
BN_is_odd
#define BN_is_odd
Definition: boringssl_prefix_symbols.h:934
RSA_R_DATA_TOO_LARGE_FOR_MODULUS
#define RSA_R_DATA_TOO_LARGE_FOR_MODULUS
Definition: rsa.h:820
bn_mod_inverse_consttime
#define bn_mod_inverse_consttime
Definition: boringssl_prefix_symbols.h:2874
BN_RAND_BOTTOM_ODD
#define BN_RAND_BOTTOM_ODD
Definition: bn.h:603
BN_ucmp
#define BN_ucmp
Definition: boringssl_prefix_symbols.h:1001
RSA_R_BAD_RSA_PARAMETERS
#define RSA_R_BAD_RSA_PARAMETERS
Definition: rsa.h:809
BN_CTX_new
#define BN_CTX_new
Definition: boringssl_prefix_symbols.h:885
RSA_padding_check_PKCS1_type_1
#define RSA_padding_check_PKCS1_type_1
Definition: boringssl_prefix_symbols.h:2118
RSA_new
#define RSA_new
Definition: boringssl_prefix_symbols.h:2110
bn_mod_inverse_secret_prime
#define bn_mod_inverse_secret_prime
Definition: boringssl_prefix_symbols.h:2876
RSA_padding_check_PKCS1_type_2
#define RSA_padding_check_PKCS1_type_2
Definition: boringssl_prefix_symbols.h:2119
kBoringSSLRSASqrtTwoLen
const size_t kBoringSSLRSASqrtTwoLen
Definition: rsa_impl.c:1003
RSA_R_TOO_MANY_ITERATIONS
#define RSA_R_TOO_MANY_ITERATIONS
Definition: rsa.h:846
n
int n
Definition: abseil-cpp/absl/container/btree_test.cc:1080
RSA_NO_PADDING
#define RSA_NO_PADDING
Definition: rsa.h:213
bn_mul_consttime
#define bn_mul_consttime
Definition: boringssl_prefix_symbols.h:2887
bn_odd_number_is_obviously_composite
#define bn_odd_number_is_obviously_composite
Definition: boringssl_prefix_symbols.h:2892
bn_mont_ctx_st::N
BIGNUM N
Definition: bn.h:990
BN_MONT_CTX_set_locked
#define BN_MONT_CTX_set_locked
Definition: boringssl_prefix_symbols.h:895
BN_RAND_TOP_ONE
#define BN_RAND_TOP_ONE
Definition: bn.h:598
BN_MONT_CTX_new_for_modulus
#define BN_MONT_CTX_new_for_modulus
Definition: boringssl_prefix_symbols.h:893
rsa_st::q
BIGNUM * q
Definition: rsa.h:742
bn_gencb_st
Definition: bn.h:656
rsa_st::blindings_inuse
unsigned char * blindings_inuse
Definition: rsa.h:780
BN_copy
#define BN_copy
Definition: boringssl_prefix_symbols.h:914
BN_num_bits
#define BN_num_bits
Definition: boringssl_prefix_symbols.h:974
RSA_generate_key_fips
int RSA_generate_key_fips(RSA *rsa, int bits, BN_GENCB *cb)
Definition: rsa_impl.c:1392
RSA_FLAG_NO_BLINDING
#define RSA_FLAG_NO_BLINDING
Definition: rsa.h:598
CRYPTO_MUTEX_lock_read
#define CRYPTO_MUTEX_lock_read
Definition: boringssl_prefix_symbols.h:1125
BN_BLINDING_convert
#define BN_BLINDING_convert
Definition: boringssl_prefix_symbols.h:877
RSA_generate_key_ex_maybe_fips
static int RSA_generate_key_ex_maybe_fips(RSA *rsa, int bits, const BIGNUM *e_value, BN_GENCB *cb, int check_fips)
Definition: rsa_impl.c:1324
RSA_padding_add_PKCS1_type_2
#define RSA_padding_add_PKCS1_type_2
Definition: boringssl_prefix_symbols.h:2115
rsa_st::iqmp
BIGNUM * iqmp
Definition: rsa.h:745
ERR_LIB_RSA
@ ERR_LIB_RSA
Definition: err.h:295
freeze_private_key
static int freeze_private_key(RSA *rsa, BN_CTX *ctx)
Definition: rsa_impl.c:141
ensure_fixed_copy
static int ensure_fixed_copy(BIGNUM **out, const BIGNUM *in, int width)
Definition: rsa_impl.c:121
RSA_R_MODULUS_TOO_LARGE
#define RSA_R_MODULUS_TOO_LARGE
Definition: rsa.h:833
I
#define I(b, c, d)
Definition: md5.c:120
generate_prime
static int generate_prime(BIGNUM *out, int bits, const BIGNUM *e, const BIGNUM *p, const BIGNUM *sqrt2, const BIGNUM *pow2_bits_100, BN_CTX *ctx, BN_GENCB *cb)
Definition: rsa_impl.c:1011
BN_CTX_start
#define BN_CTX_start
Definition: boringssl_prefix_symbols.h:886
bn_set_words
#define bn_set_words
Definition: boringssl_prefix_symbols.h:2907
rsa_st::blinding_fork_generation
uint64_t blinding_fork_generation
Definition: rsa.h:781
bignum_st
Definition: bn.h:957
RSA_PKCS1_OAEP_PADDING
#define RSA_PKCS1_OAEP_PADDING
Definition: rsa.h:216
internal.h
BN_CTX_free
#define BN_CTX_free
Definition: boringssl_prefix_symbols.h:883
ret
UniquePtr< SSL_SESSION > ret
Definition: ssl_x509.cc:1029
RSA_check_key
#define RSA_check_key
Definition: boringssl_prefix_symbols.h:2085
RSA_private_transform
#define RSA_private_transform
Definition: boringssl_prefix_symbols.h:2127
fix_build_deps.r
r
Definition: fix_build_deps.py:491
bignum_st::d
BN_ULONG * d
Definition: bn.h:960
CRYPTO_MUTEX_lock_write
#define CRYPTO_MUTEX_lock_write
Definition: boringssl_prefix_symbols.h:1126
BN_cmp
#define BN_cmp
Definition: boringssl_prefix_symbols.h:912
replace_bignum
static void replace_bignum(BIGNUM **out, BIGNUM **in)
Definition: rsa_impl.c:1312
BN_mod_exp_mont_consttime
#define BN_mod_exp_mont_consttime
Definition: boringssl_prefix_symbols.h:951
rsa_st::d_fixed
BIGNUM * d_fixed
Definition: rsa.h:765
rsa_st::private_key_frozen
unsigned private_key_frozen
Definition: rsa.h:785
ok
bool ok
Definition: async_end2end_test.cc:197
ERR_clear_error
#define ERR_clear_error
Definition: boringssl_prefix_symbols.h:1413
BN_equal_consttime
#define BN_equal_consttime
Definition: boringssl_prefix_symbols.h:921
BN_bn2bin_padded
#define BN_bn2bin_padded
Definition: boringssl_prefix_symbols.h:902
BN_MONT_CTX_free
#define BN_MONT_CTX_free
Definition: boringssl_prefix_symbols.h:890
rsa_meth_st
Definition: rsa.h:689
bn_abs_sub_consttime
#define bn_abs_sub_consttime
Definition: boringssl_prefix_symbols.h:2850
BN_CTX_end
#define BN_CTX_end
Definition: boringssl_prefix_symbols.h:882
mem.h
type_check.h
CONSTTIME_SECRET
#define CONSTTIME_SECRET(x, y)
Definition: third_party/boringssl-with-bazel/src/crypto/internal.h:461
RSA_verify_raw
int RSA_verify_raw(RSA *rsa, size_t *out_len, uint8_t *out, size_t max_out, const uint8_t *in, size_t in_len, int padding)
Definition: rsa_impl.c:596
rsa_st
Definition: rsa.h:732
len
int len
Definition: abseil-cpp/absl/base/internal/low_level_alloc_test.cc:46
autogen_x86imm.tmp
tmp
Definition: autogen_x86imm.py:12
RSA_generate_key_ex
int RSA_generate_key_ex(RSA *rsa, int bits, const BIGNUM *e_value, BN_GENCB *cb)
Definition: rsa_impl.c:1386
rsa_st::mont_n
BN_MONT_CTX * mont_n
Definition: rsa.h:756
BN_mod_mul_montgomery
#define BN_mod_mul_montgomery
Definition: boringssl_prefix_symbols.h:961
BN_rshift
#define BN_rshift
Definition: boringssl_prefix_symbols.h:987
thread.h
rsa_st::blindings
BN_BLINDING ** blindings
Definition: rsa.h:779
rsa_st::lock
CRYPTO_MUTEX lock
Definition: rsa.h:752
OPENSSL_free
#define OPENSSL_free
Definition: boringssl_prefix_symbols.h:1869
rsa_st::flags
int flags
Definition: rsa.h:750
BN_BLINDING_invalidate
#define BN_BLINDING_invalidate
Definition: boringssl_prefix_symbols.h:879
CRYPTO_MUTEX_unlock_write
#define CRYPTO_MUTEX_unlock_write
Definition: boringssl_prefix_symbols.h:1128
BN_from_montgomery
#define BN_from_montgomery
Definition: boringssl_prefix_symbols.h:924
RSA_padding_add_PKCS1_OAEP_mgf1
#define RSA_padding_add_PKCS1_OAEP_mgf1
Definition: boringssl_prefix_symbols.h:2112
BN_new
#define BN_new
Definition: boringssl_prefix_symbols.h:971
rsa_st::n
BIGNUM * n
Definition: rsa.h:738
cb
OPENSSL_EXPORT pem_password_cb * cb
Definition: pem.h:351
BN_BLINDING_invert
#define BN_BLINDING_invert
Definition: boringssl_prefix_symbols.h:880
kBoringSSLRSASqrtTwo
const BN_ULONG kBoringSSLRSASqrtTwo[]
Definition: rsa_impl.c:985
OPENSSL_STATIC_ASSERT
#define OPENSSL_STATIC_ASSERT(cond, msg)
Definition: type_check.h:75
rsa_st::mont_q
BN_MONT_CTX * mont_q
Definition: rsa.h:758
i
uint64_t i
Definition: abseil-cpp/absl/container/btree_benchmark.cc:230
bn_is_relatively_prime
#define bn_is_relatively_prime
Definition: boringssl_prefix_symbols.h:2861
ERR_R_MALLOC_FAILURE
#define ERR_R_MALLOC_FAILURE
Definition: err.h:371
BN_is_pow2
#define BN_is_pow2
Definition: boringssl_prefix_symbols.h:936
RSA_padding_add_none
#define RSA_padding_add_none
Definition: boringssl_prefix_symbols.h:2116
mod_exp
static int mod_exp(BIGNUM *r0, const BIGNUM *I, RSA *rsa, BN_CTX *ctx)
Definition: rsa_impl.c:849
BN_prime_checks_for_generation
#define BN_prime_checks_for_generation
Definition: bn.h:702
bn_less_than_montgomery_R
#define bn_less_than_montgomery_R
Definition: boringssl_prefix_symbols.h:2864


grpc
Author(s):
autogenerated on Thu Mar 13 2025 03:01:13