blob: 4f9b4e6d65a94fe96497868a2a37c5e2d7bbe5ab [file] [log] [blame]
Adam Langley95c29f32014-06-20 12:00:00 -07001/* 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
David Benjamincfa9de82016-03-14 14:19:41 -040059#include <assert.h>
David Benjaminfb8b7632017-04-10 18:35:22 -040060#include <limits.h>
Adam Langley2b2d66d2015-01-30 17:08:37 -080061#include <string.h>
62
Adam Langley95c29f32014-06-20 12:00:00 -070063#include <openssl/bn.h>
64#include <openssl/err.h>
65#include <openssl/mem.h>
Brian Smith054e6822015-03-27 21:12:01 -100066#include <openssl/thread.h>
David Benjaminfb8b7632017-04-10 18:35:22 -040067#include <openssl/type_check.h>
Adam Langley95c29f32014-06-20 12:00:00 -070068
69#include "internal.h"
Adam Langley5c38c052017-04-28 14:47:06 -070070#include "../fipsmodule/bn/internal.h"
Adam Langley683d7bd2015-04-13 11:04:14 -070071#include "../internal.h"
Adam Langley95c29f32014-06-20 12:00:00 -070072
73
Brian Smith625475f2016-01-12 10:47:25 -100074static int check_modulus_and_exponent_sizes(const RSA *rsa) {
75 unsigned rsa_bits = BN_num_bits(rsa->n);
David Benjamincfa9de82016-03-14 14:19:41 -040076
Brian Smith625475f2016-01-12 10:47:25 -100077 if (rsa_bits > 16 * 1024) {
78 OPENSSL_PUT_ERROR(RSA, RSA_R_MODULUS_TOO_LARGE);
79 return 0;
80 }
Adam Langley95c29f32014-06-20 12:00:00 -070081
David Benjamincfa9de82016-03-14 14:19:41 -040082 /* Mitigate DoS attacks by limiting the exponent size. 33 bits was chosen as
83 * the limit based on the recommendations in [1] and [2]. Windows CryptoAPI
84 * doesn't support values larger than 32 bits [3], so it is unlikely that
85 * exponents larger than 32 bits are being used for anything Windows commonly
86 * does.
87 *
88 * [1] https://www.imperialviolet.org/2012/03/16/rsae.html
89 * [2] https://www.imperialviolet.org/2012/03/17/rsados.html
90 * [3] https://msdn.microsoft.com/en-us/library/aa387685(VS.85).aspx */
91 static const unsigned kMaxExponentBits = 33;
92
93 if (BN_num_bits(rsa->e) > kMaxExponentBits) {
Brian Smith625475f2016-01-12 10:47:25 -100094 OPENSSL_PUT_ERROR(RSA, RSA_R_BAD_E_VALUE);
95 return 0;
96 }
97
David Benjamincfa9de82016-03-14 14:19:41 -040098 /* Verify |n > e|. Comparing |rsa_bits| to |kMaxExponentBits| is a small
99 * shortcut to comparing |n| and |e| directly. In reality, |kMaxExponentBits|
100 * is much smaller than the minimum RSA key size that any application should
101 * accept. */
102 if (rsa_bits <= kMaxExponentBits) {
103 OPENSSL_PUT_ERROR(RSA, RSA_R_KEY_SIZE_TOO_SMALL);
Brian Smith625475f2016-01-12 10:47:25 -1000104 return 0;
105 }
David Benjamincfa9de82016-03-14 14:19:41 -0400106 assert(BN_ucmp(rsa->n, rsa->e) > 0);
Brian Smith625475f2016-01-12 10:47:25 -1000107
108 return 1;
109}
Adam Langley95c29f32014-06-20 12:00:00 -0700110
David Benjamind93831d2015-10-29 13:19:12 -0400111size_t rsa_default_size(const RSA *rsa) {
David Benjamin925fee32014-07-11 14:14:08 -0400112 return BN_num_bytes(rsa->n);
113}
114
David Benjamind93831d2015-10-29 13:19:12 -0400115int rsa_default_encrypt(RSA *rsa, size_t *out_len, uint8_t *out, size_t max_out,
116 const uint8_t *in, size_t in_len, int padding) {
Adam Langley95c29f32014-06-20 12:00:00 -0700117 const unsigned rsa_size = RSA_size(rsa);
Adam Langley95c29f32014-06-20 12:00:00 -0700118 BIGNUM *f, *result;
119 uint8_t *buf = NULL;
120 BN_CTX *ctx = NULL;
Adam Langley6887edb2014-06-20 12:00:00 -0700121 int i, ret = 0;
Adam Langley95c29f32014-06-20 12:00:00 -0700122
Adam Langley95c29f32014-06-20 12:00:00 -0700123 if (max_out < rsa_size) {
David Benjamin3570d732015-06-29 00:28:17 -0400124 OPENSSL_PUT_ERROR(RSA, RSA_R_OUTPUT_BUFFER_TOO_SMALL);
Adam Langley95c29f32014-06-20 12:00:00 -0700125 return 0;
126 }
127
Brian Smith625475f2016-01-12 10:47:25 -1000128 if (!check_modulus_and_exponent_sizes(rsa)) {
Adam Langley95c29f32014-06-20 12:00:00 -0700129 return 0;
130 }
131
132 ctx = BN_CTX_new();
133 if (ctx == NULL) {
134 goto err;
135 }
136
137 BN_CTX_start(ctx);
138 f = BN_CTX_get(ctx);
139 result = BN_CTX_get(ctx);
140 buf = OPENSSL_malloc(rsa_size);
141 if (!f || !result || !buf) {
David Benjamin3570d732015-06-29 00:28:17 -0400142 OPENSSL_PUT_ERROR(RSA, ERR_R_MALLOC_FAILURE);
Adam Langley95c29f32014-06-20 12:00:00 -0700143 goto err;
144 }
145
146 switch (padding) {
147 case RSA_PKCS1_PADDING:
148 i = RSA_padding_add_PKCS1_type_2(buf, rsa_size, in, in_len);
149 break;
150 case RSA_PKCS1_OAEP_PADDING:
Adam Langley6887edb2014-06-20 12:00:00 -0700151 /* Use the default parameters: SHA-1 for both hashes and no label. */
152 i = RSA_padding_add_PKCS1_OAEP_mgf1(buf, rsa_size, in, in_len,
153 NULL, 0, NULL, NULL);
Adam Langley95c29f32014-06-20 12:00:00 -0700154 break;
Adam Langley95c29f32014-06-20 12:00:00 -0700155 case RSA_NO_PADDING:
156 i = RSA_padding_add_none(buf, rsa_size, in, in_len);
157 break;
158 default:
David Benjamin3570d732015-06-29 00:28:17 -0400159 OPENSSL_PUT_ERROR(RSA, RSA_R_UNKNOWN_PADDING_TYPE);
Adam Langley95c29f32014-06-20 12:00:00 -0700160 goto err;
161 }
162
163 if (i <= 0) {
164 goto err;
165 }
166
167 if (BN_bin2bn(buf, rsa_size, f) == NULL) {
168 goto err;
169 }
170
171 if (BN_ucmp(f, rsa->n) >= 0) {
172 /* usually the padding functions would catch this */
David Benjamin3570d732015-06-29 00:28:17 -0400173 OPENSSL_PUT_ERROR(RSA, RSA_R_DATA_TOO_LARGE_FOR_MODULUS);
Adam Langley95c29f32014-06-20 12:00:00 -0700174 goto err;
175 }
176
Brian Smithd0357302016-03-25 10:11:04 -1000177 if (!BN_MONT_CTX_set_locked(&rsa->mont_n, &rsa->lock, rsa->n, ctx) ||
Brian Smith24493a42016-03-25 09:12:48 -1000178 !BN_mod_exp_mont(result, f, rsa->e, rsa->n, ctx, rsa->mont_n)) {
Adam Langley95c29f32014-06-20 12:00:00 -0700179 goto err;
180 }
181
182 /* put in leading 0 bytes if the number is less than the length of the
183 * modulus */
Adam Langley6887edb2014-06-20 12:00:00 -0700184 if (!BN_bn2bin_padded(out, rsa_size, result)) {
David Benjamin3570d732015-06-29 00:28:17 -0400185 OPENSSL_PUT_ERROR(RSA, ERR_R_INTERNAL_ERROR);
Adam Langley6887edb2014-06-20 12:00:00 -0700186 goto err;
Adam Langley95c29f32014-06-20 12:00:00 -0700187 }
188
189 *out_len = rsa_size;
190 ret = 1;
191
192err:
193 if (ctx != NULL) {
194 BN_CTX_end(ctx);
195 BN_CTX_free(ctx);
196 }
197 if (buf != NULL) {
198 OPENSSL_cleanse(buf, rsa_size);
199 OPENSSL_free(buf);
200 }
201
202 return ret;
203}
204
205/* MAX_BLINDINGS_PER_RSA defines the maximum number of cached BN_BLINDINGs per
206 * RSA*. Then this limit is exceeded, BN_BLINDING objects will be created and
207 * destroyed as needed. */
208#define MAX_BLINDINGS_PER_RSA 1024
209
210/* rsa_blinding_get returns a BN_BLINDING to use with |rsa|. It does this by
211 * allocating one of the cached BN_BLINDING objects in |rsa->blindings|. If
212 * none are free, the cache will be extended by a extra element and the new
213 * BN_BLINDING is returned.
214 *
215 * On success, the index of the assigned BN_BLINDING is written to
216 * |*index_used| and must be passed to |rsa_blinding_release| when finished. */
217static BN_BLINDING *rsa_blinding_get(RSA *rsa, unsigned *index_used,
218 BN_CTX *ctx) {
Brian Smith3426d102016-03-17 16:10:04 -1000219 assert(ctx != NULL);
Brian Smithcbf56a52016-03-21 11:25:39 -1000220 assert(rsa->mont_n != NULL);
221
Adam Langley95c29f32014-06-20 12:00:00 -0700222 BN_BLINDING *ret = NULL;
223 BN_BLINDING **new_blindings;
224 uint8_t *new_blindings_inuse;
225 char overflow = 0;
226
Adam Langley683d7bd2015-04-13 11:04:14 -0700227 CRYPTO_MUTEX_lock_write(&rsa->lock);
Adam Langley95c29f32014-06-20 12:00:00 -0700228
Adam Langley33672732015-03-31 18:55:53 -0700229 unsigned i;
230 for (i = 0; i < rsa->num_blindings; i++) {
231 if (rsa->blindings_inuse[i] == 0) {
232 rsa->blindings_inuse[i] = 1;
233 ret = rsa->blindings[i];
234 *index_used = i;
235 break;
Adam Langley95c29f32014-06-20 12:00:00 -0700236 }
237 }
238
239 if (ret != NULL) {
David Benjamin29270de2016-05-24 15:28:36 +0000240 CRYPTO_MUTEX_unlock_write(&rsa->lock);
Adam Langley95c29f32014-06-20 12:00:00 -0700241 return ret;
242 }
243
244 overflow = rsa->num_blindings >= MAX_BLINDINGS_PER_RSA;
245
246 /* We didn't find a free BN_BLINDING to use so increase the length of
247 * the arrays by one and use the newly created element. */
248
David Benjamin29270de2016-05-24 15:28:36 +0000249 CRYPTO_MUTEX_unlock_write(&rsa->lock);
Brian Smith86361a32016-03-26 19:42:31 -1000250 ret = BN_BLINDING_new();
Adam Langley95c29f32014-06-20 12:00:00 -0700251 if (ret == NULL) {
252 return NULL;
253 }
254
255 if (overflow) {
256 /* We cannot add any more cached BN_BLINDINGs so we use |ret|
257 * and mark it for destruction in |rsa_blinding_release|. */
258 *index_used = MAX_BLINDINGS_PER_RSA;
259 return ret;
260 }
261
Adam Langley683d7bd2015-04-13 11:04:14 -0700262 CRYPTO_MUTEX_lock_write(&rsa->lock);
Adam Langley95c29f32014-06-20 12:00:00 -0700263
264 new_blindings =
265 OPENSSL_malloc(sizeof(BN_BLINDING *) * (rsa->num_blindings + 1));
266 if (new_blindings == NULL) {
267 goto err1;
268 }
David Benjamin17cf2cb2016-12-13 01:07:13 -0500269 OPENSSL_memcpy(new_blindings, rsa->blindings,
Adam Langley95c29f32014-06-20 12:00:00 -0700270 sizeof(BN_BLINDING *) * rsa->num_blindings);
271 new_blindings[rsa->num_blindings] = ret;
272
273 new_blindings_inuse = OPENSSL_malloc(rsa->num_blindings + 1);
274 if (new_blindings_inuse == NULL) {
275 goto err2;
276 }
David Benjamin17cf2cb2016-12-13 01:07:13 -0500277 OPENSSL_memcpy(new_blindings_inuse, rsa->blindings_inuse, rsa->num_blindings);
Adam Langley95c29f32014-06-20 12:00:00 -0700278 new_blindings_inuse[rsa->num_blindings] = 1;
279 *index_used = rsa->num_blindings;
280
David Benjamind8b65c82015-04-22 16:09:09 -0400281 OPENSSL_free(rsa->blindings);
Adam Langley95c29f32014-06-20 12:00:00 -0700282 rsa->blindings = new_blindings;
David Benjamind8b65c82015-04-22 16:09:09 -0400283 OPENSSL_free(rsa->blindings_inuse);
Adam Langley95c29f32014-06-20 12:00:00 -0700284 rsa->blindings_inuse = new_blindings_inuse;
285 rsa->num_blindings++;
286
David Benjamin29270de2016-05-24 15:28:36 +0000287 CRYPTO_MUTEX_unlock_write(&rsa->lock);
Adam Langley95c29f32014-06-20 12:00:00 -0700288 return ret;
289
290err2:
291 OPENSSL_free(new_blindings);
292
293err1:
David Benjamin29270de2016-05-24 15:28:36 +0000294 CRYPTO_MUTEX_unlock_write(&rsa->lock);
Adam Langley95c29f32014-06-20 12:00:00 -0700295 BN_BLINDING_free(ret);
296 return NULL;
297}
298
299/* rsa_blinding_release marks the cached BN_BLINDING at the given index as free
300 * for other threads to use. */
301static void rsa_blinding_release(RSA *rsa, BN_BLINDING *blinding,
302 unsigned blinding_index) {
303 if (blinding_index == MAX_BLINDINGS_PER_RSA) {
304 /* This blinding wasn't cached. */
305 BN_BLINDING_free(blinding);
306 return;
307 }
308
Adam Langley683d7bd2015-04-13 11:04:14 -0700309 CRYPTO_MUTEX_lock_write(&rsa->lock);
Adam Langley95c29f32014-06-20 12:00:00 -0700310 rsa->blindings_inuse[blinding_index] = 0;
David Benjamin29270de2016-05-24 15:28:36 +0000311 CRYPTO_MUTEX_unlock_write(&rsa->lock);
Adam Langley95c29f32014-06-20 12:00:00 -0700312}
313
314/* signing */
David Benjamind93831d2015-10-29 13:19:12 -0400315int rsa_default_sign_raw(RSA *rsa, size_t *out_len, uint8_t *out,
316 size_t max_out, const uint8_t *in, size_t in_len,
317 int padding) {
Adam Langley95c29f32014-06-20 12:00:00 -0700318 const unsigned rsa_size = RSA_size(rsa);
Adam Langley95c29f32014-06-20 12:00:00 -0700319 uint8_t *buf = NULL;
Adam Langley6887edb2014-06-20 12:00:00 -0700320 int i, ret = 0;
Adam Langley95c29f32014-06-20 12:00:00 -0700321
322 if (max_out < rsa_size) {
David Benjamin3570d732015-06-29 00:28:17 -0400323 OPENSSL_PUT_ERROR(RSA, RSA_R_OUTPUT_BUFFER_TOO_SMALL);
Adam Langley95c29f32014-06-20 12:00:00 -0700324 return 0;
325 }
326
Adam Langley95c29f32014-06-20 12:00:00 -0700327 buf = OPENSSL_malloc(rsa_size);
Adam Langley6bc658d2014-08-18 13:29:45 -0700328 if (buf == NULL) {
David Benjamin3570d732015-06-29 00:28:17 -0400329 OPENSSL_PUT_ERROR(RSA, ERR_R_MALLOC_FAILURE);
Adam Langley95c29f32014-06-20 12:00:00 -0700330 goto err;
331 }
332
333 switch (padding) {
334 case RSA_PKCS1_PADDING:
335 i = RSA_padding_add_PKCS1_type_1(buf, rsa_size, in, in_len);
336 break;
337 case RSA_NO_PADDING:
338 i = RSA_padding_add_none(buf, rsa_size, in, in_len);
339 break;
340 default:
David Benjamin3570d732015-06-29 00:28:17 -0400341 OPENSSL_PUT_ERROR(RSA, RSA_R_UNKNOWN_PADDING_TYPE);
Adam Langley95c29f32014-06-20 12:00:00 -0700342 goto err;
343 }
Adam Langley6bc658d2014-08-18 13:29:45 -0700344
Adam Langley95c29f32014-06-20 12:00:00 -0700345 if (i <= 0) {
346 goto err;
347 }
348
Adam Langley6bc658d2014-08-18 13:29:45 -0700349 if (!RSA_private_transform(rsa, out, buf, rsa_size)) {
Adam Langley5f5bf6f2015-02-24 13:49:41 -0800350 goto err;
Adam Langley95c29f32014-06-20 12:00:00 -0700351 }
352
353 *out_len = rsa_size;
354 ret = 1;
355
356err:
Adam Langley95c29f32014-06-20 12:00:00 -0700357 if (buf != NULL) {
358 OPENSSL_cleanse(buf, rsa_size);
359 OPENSSL_free(buf);
360 }
Adam Langley95c29f32014-06-20 12:00:00 -0700361
362 return ret;
363}
364
David Benjamind93831d2015-10-29 13:19:12 -0400365int rsa_default_decrypt(RSA *rsa, size_t *out_len, uint8_t *out, size_t max_out,
366 const uint8_t *in, size_t in_len, int padding) {
Adam Langley95c29f32014-06-20 12:00:00 -0700367 const unsigned rsa_size = RSA_size(rsa);
Adam Langley95c29f32014-06-20 12:00:00 -0700368 uint8_t *buf = NULL;
Adam Langley95c29f32014-06-20 12:00:00 -0700369 int ret = 0;
370
371 if (max_out < rsa_size) {
David Benjamin3570d732015-06-29 00:28:17 -0400372 OPENSSL_PUT_ERROR(RSA, RSA_R_OUTPUT_BUFFER_TOO_SMALL);
Adam Langley95c29f32014-06-20 12:00:00 -0700373 return 0;
374 }
375
David Benjamin74279b62014-07-24 13:09:19 -0400376 if (padding == RSA_NO_PADDING) {
377 buf = out;
378 } else {
379 /* Allocate a temporary buffer to hold the padded plaintext. */
380 buf = OPENSSL_malloc(rsa_size);
381 if (buf == NULL) {
382 OPENSSL_PUT_ERROR(RSA, ERR_R_MALLOC_FAILURE);
383 goto err;
384 }
Adam Langley95c29f32014-06-20 12:00:00 -0700385 }
386
Adam Langley6bc658d2014-08-18 13:29:45 -0700387 if (in_len != rsa_size) {
David Benjamin3570d732015-06-29 00:28:17 -0400388 OPENSSL_PUT_ERROR(RSA, RSA_R_DATA_LEN_NOT_EQUAL_TO_MOD_LEN);
Adam Langley95c29f32014-06-20 12:00:00 -0700389 goto err;
390 }
391
Adam Langley6bc658d2014-08-18 13:29:45 -0700392 if (!RSA_private_transform(rsa, buf, in, rsa_size)) {
Adam Langley6887edb2014-06-20 12:00:00 -0700393 goto err;
394 }
Adam Langley95c29f32014-06-20 12:00:00 -0700395
396 switch (padding) {
397 case RSA_PKCS1_PADDING:
David Benjaminb0ad3d72017-03-16 13:15:31 -0400398 ret =
399 RSA_padding_check_PKCS1_type_2(out, out_len, rsa_size, buf, rsa_size);
Adam Langley95c29f32014-06-20 12:00:00 -0700400 break;
401 case RSA_PKCS1_OAEP_PADDING:
Adam Langley6887edb2014-06-20 12:00:00 -0700402 /* Use the default parameters: SHA-1 for both hashes and no label. */
David Benjaminb0ad3d72017-03-16 13:15:31 -0400403 ret = RSA_padding_check_PKCS1_OAEP_mgf1(out, out_len, rsa_size, buf,
404 rsa_size, NULL, 0, NULL, NULL);
Adam Langley95c29f32014-06-20 12:00:00 -0700405 break;
Adam Langley95c29f32014-06-20 12:00:00 -0700406 case RSA_NO_PADDING:
David Benjaminb0ad3d72017-03-16 13:15:31 -0400407 *out_len = rsa_size;
408 ret = 1;
Adam Langley95c29f32014-06-20 12:00:00 -0700409 break;
410 default:
David Benjamin3570d732015-06-29 00:28:17 -0400411 OPENSSL_PUT_ERROR(RSA, RSA_R_UNKNOWN_PADDING_TYPE);
Adam Langley95c29f32014-06-20 12:00:00 -0700412 goto err;
413 }
414
David Benjaminb0ad3d72017-03-16 13:15:31 -0400415 if (!ret) {
David Benjamin3570d732015-06-29 00:28:17 -0400416 OPENSSL_PUT_ERROR(RSA, RSA_R_PADDING_CHECK_FAILED);
Adam Langley95c29f32014-06-20 12:00:00 -0700417 }
418
419err:
David Benjamin74279b62014-07-24 13:09:19 -0400420 if (padding != RSA_NO_PADDING && buf != NULL) {
Adam Langley95c29f32014-06-20 12:00:00 -0700421 OPENSSL_cleanse(buf, rsa_size);
422 OPENSSL_free(buf);
423 }
Adam Langley95c29f32014-06-20 12:00:00 -0700424
425 return ret;
426}
427
Brian Smithf08c1c62016-03-25 13:24:46 -1000428static int mod_exp(BIGNUM *r0, const BIGNUM *I, RSA *rsa, BN_CTX *ctx);
429
Brian Smithc0b196d2016-03-04 08:54:07 -1000430int RSA_verify_raw(RSA *rsa, size_t *out_len, uint8_t *out, size_t max_out,
431 const uint8_t *in, size_t in_len, int padding) {
432 if (rsa->n == NULL || rsa->e == NULL) {
433 OPENSSL_PUT_ERROR(RSA, RSA_R_VALUE_MISSING);
434 return 0;
435 }
436
Adam Langley95c29f32014-06-20 12:00:00 -0700437 const unsigned rsa_size = RSA_size(rsa);
438 BIGNUM *f, *result;
Adam Langley95c29f32014-06-20 12:00:00 -0700439
Adam Langley95c29f32014-06-20 12:00:00 -0700440 if (max_out < rsa_size) {
David Benjamin3570d732015-06-29 00:28:17 -0400441 OPENSSL_PUT_ERROR(RSA, RSA_R_OUTPUT_BUFFER_TOO_SMALL);
Adam Langley95c29f32014-06-20 12:00:00 -0700442 return 0;
443 }
444
Brian Smith99022622016-03-04 09:20:07 -1000445 if (in_len != rsa_size) {
446 OPENSSL_PUT_ERROR(RSA, RSA_R_DATA_LEN_NOT_EQUAL_TO_MOD_LEN);
447 return 0;
448 }
449
Brian Smith625475f2016-01-12 10:47:25 -1000450 if (!check_modulus_and_exponent_sizes(rsa)) {
Adam Langley95c29f32014-06-20 12:00:00 -0700451 return 0;
452 }
453
Brian Smith2a920312016-03-04 13:42:47 -1000454 BN_CTX *ctx = BN_CTX_new();
Adam Langley95c29f32014-06-20 12:00:00 -0700455 if (ctx == NULL) {
Brian Smith2a920312016-03-04 13:42:47 -1000456 return 0;
Adam Langley95c29f32014-06-20 12:00:00 -0700457 }
458
Brian Smith2a920312016-03-04 13:42:47 -1000459 int ret = 0;
460 uint8_t *buf = NULL;
461
Adam Langley95c29f32014-06-20 12:00:00 -0700462 BN_CTX_start(ctx);
463 f = BN_CTX_get(ctx);
464 result = BN_CTX_get(ctx);
Brian Smith2a920312016-03-04 13:42:47 -1000465 if (f == NULL || result == NULL) {
466 OPENSSL_PUT_ERROR(RSA, ERR_R_MALLOC_FAILURE);
467 goto err;
468 }
469
David Benjamin74279b62014-07-24 13:09:19 -0400470 if (padding == RSA_NO_PADDING) {
471 buf = out;
472 } else {
473 /* Allocate a temporary buffer to hold the padded plaintext. */
474 buf = OPENSSL_malloc(rsa_size);
475 if (buf == NULL) {
476 OPENSSL_PUT_ERROR(RSA, ERR_R_MALLOC_FAILURE);
477 goto err;
478 }
479 }
Adam Langley95c29f32014-06-20 12:00:00 -0700480
Adam Langley95c29f32014-06-20 12:00:00 -0700481 if (BN_bin2bn(in, in_len, f) == NULL) {
482 goto err;
483 }
484
485 if (BN_ucmp(f, rsa->n) >= 0) {
David Benjamin3570d732015-06-29 00:28:17 -0400486 OPENSSL_PUT_ERROR(RSA, RSA_R_DATA_TOO_LARGE_FOR_MODULUS);
Adam Langley95c29f32014-06-20 12:00:00 -0700487 goto err;
488 }
489
Brian Smithd0357302016-03-25 10:11:04 -1000490 if (!BN_MONT_CTX_set_locked(&rsa->mont_n, &rsa->lock, rsa->n, ctx) ||
Brian Smith24493a42016-03-25 09:12:48 -1000491 !BN_mod_exp_mont(result, f, rsa->e, rsa->n, ctx, rsa->mont_n)) {
Adam Langley95c29f32014-06-20 12:00:00 -0700492 goto err;
493 }
494
Adam Langley6887edb2014-06-20 12:00:00 -0700495 if (!BN_bn2bin_padded(buf, rsa_size, result)) {
David Benjamin3570d732015-06-29 00:28:17 -0400496 OPENSSL_PUT_ERROR(RSA, ERR_R_INTERNAL_ERROR);
Adam Langley6887edb2014-06-20 12:00:00 -0700497 goto err;
498 }
Adam Langley95c29f32014-06-20 12:00:00 -0700499
500 switch (padding) {
501 case RSA_PKCS1_PADDING:
David Benjamin43ea2042017-03-16 11:54:11 -0400502 ret =
503 RSA_padding_check_PKCS1_type_1(out, out_len, rsa_size, buf, rsa_size);
Adam Langley95c29f32014-06-20 12:00:00 -0700504 break;
505 case RSA_NO_PADDING:
David Benjamin43ea2042017-03-16 11:54:11 -0400506 ret = 1;
507 *out_len = rsa_size;
Adam Langley95c29f32014-06-20 12:00:00 -0700508 break;
509 default:
David Benjamin3570d732015-06-29 00:28:17 -0400510 OPENSSL_PUT_ERROR(RSA, RSA_R_UNKNOWN_PADDING_TYPE);
Adam Langley95c29f32014-06-20 12:00:00 -0700511 goto err;
512 }
513
David Benjamin43ea2042017-03-16 11:54:11 -0400514 if (!ret) {
David Benjamin3570d732015-06-29 00:28:17 -0400515 OPENSSL_PUT_ERROR(RSA, RSA_R_PADDING_CHECK_FAILED);
David Benjamin43ea2042017-03-16 11:54:11 -0400516 goto err;
Adam Langley95c29f32014-06-20 12:00:00 -0700517 }
518
519err:
Brian Smith2a920312016-03-04 13:42:47 -1000520 BN_CTX_end(ctx);
521 BN_CTX_free(ctx);
522 if (buf != out) {
Adam Langley95c29f32014-06-20 12:00:00 -0700523 OPENSSL_free(buf);
524 }
525 return ret;
526}
527
David Benjamind93831d2015-10-29 13:19:12 -0400528int rsa_default_private_transform(RSA *rsa, uint8_t *out, const uint8_t *in,
529 size_t len) {
Adam Langley6bc658d2014-08-18 13:29:45 -0700530 BIGNUM *f, *result;
531 BN_CTX *ctx = NULL;
532 unsigned blinding_index = 0;
533 BN_BLINDING *blinding = NULL;
534 int ret = 0;
535
536 ctx = BN_CTX_new();
537 if (ctx == NULL) {
538 goto err;
539 }
540 BN_CTX_start(ctx);
541 f = BN_CTX_get(ctx);
542 result = BN_CTX_get(ctx);
543
544 if (f == NULL || result == NULL) {
David Benjamin3570d732015-06-29 00:28:17 -0400545 OPENSSL_PUT_ERROR(RSA, ERR_R_MALLOC_FAILURE);
Adam Langley6bc658d2014-08-18 13:29:45 -0700546 goto err;
547 }
548
549 if (BN_bin2bn(in, len, f) == NULL) {
550 goto err;
551 }
552
553 if (BN_ucmp(f, rsa->n) >= 0) {
554 /* Usually the padding functions would catch this. */
David Benjamin3570d732015-06-29 00:28:17 -0400555 OPENSSL_PUT_ERROR(RSA, RSA_R_DATA_TOO_LARGE_FOR_MODULUS);
Adam Langley6bc658d2014-08-18 13:29:45 -0700556 goto err;
557 }
558
Brian Smith86080c32016-03-25 12:23:16 -1000559 if (!BN_MONT_CTX_set_locked(&rsa->mont_n, &rsa->lock, rsa->n, ctx)) {
560 OPENSSL_PUT_ERROR(RSA, ERR_R_INTERNAL_ERROR);
561 goto err;
562 }
563
Brian Smith598e55a2016-03-26 20:17:37 -1000564 /* We cannot do blinding or verification without |e|, and continuing without
565 * those countermeasures is dangerous. However, the Java/Android RSA API
566 * requires support for keys where only |d| and |n| (and not |e|) are known.
567 * The callers that require that bad behavior set |RSA_FLAG_NO_BLINDING|. */
568 int disable_security = (rsa->flags & RSA_FLAG_NO_BLINDING) && rsa->e == NULL;
569
570 if (!disable_security) {
Brian Smith86361a32016-03-26 19:42:31 -1000571 /* Keys without public exponents must have blinding explicitly disabled to
572 * be used. */
573 if (rsa->e == NULL) {
574 OPENSSL_PUT_ERROR(RSA, RSA_R_NO_PUBLIC_EXPONENT);
575 goto err;
576 }
577
Adam Langley6bc658d2014-08-18 13:29:45 -0700578 blinding = rsa_blinding_get(rsa, &blinding_index, ctx);
579 if (blinding == NULL) {
David Benjamin3570d732015-06-29 00:28:17 -0400580 OPENSSL_PUT_ERROR(RSA, ERR_R_INTERNAL_ERROR);
Adam Langley6bc658d2014-08-18 13:29:45 -0700581 goto err;
582 }
Brian Smith86361a32016-03-26 19:42:31 -1000583 if (!BN_BLINDING_convert(f, blinding, rsa->e, rsa->mont_n, ctx)) {
Adam Langley6bc658d2014-08-18 13:29:45 -0700584 goto err;
585 }
586 }
587
Brian Smith51b0d5b2016-03-25 13:15:39 -1000588 if (rsa->p != NULL && rsa->q != NULL && rsa->e != NULL && rsa->dmp1 != NULL &&
589 rsa->dmq1 != NULL && rsa->iqmp != NULL) {
Brian Smithf08c1c62016-03-25 13:24:46 -1000590 if (!mod_exp(result, f, rsa, ctx)) {
Adam Langley6bc658d2014-08-18 13:29:45 -0700591 goto err;
592 }
Brian Smith9f05de42016-08-02 18:21:18 -1000593 } else if (!BN_mod_exp_mont_consttime(result, f, rsa->d, rsa->n, ctx,
594 rsa->mont_n)) {
595 goto err;
Brian Smith86080c32016-03-25 12:23:16 -1000596 }
597
598 /* Verify the result to protect against fault attacks as described in the
599 * 1997 paper "On the Importance of Checking Cryptographic Protocols for
600 * Faults" by Dan Boneh, Richard A. DeMillo, and Richard J. Lipton. Some
601 * implementations do this only when the CRT is used, but we do it in all
602 * cases. Section 6 of the aforementioned paper describes an attack that
603 * works when the CRT isn't used. That attack is much less likely to succeed
604 * than the CRT attack, but there have likely been improvements since 1997.
605 *
Brian Smith598e55a2016-03-26 20:17:37 -1000606 * This check is cheap assuming |e| is small; it almost always is. */
607 if (!disable_security) {
Brian Smith86080c32016-03-25 12:23:16 -1000608 BIGNUM *vrfy = BN_CTX_get(ctx);
609 if (vrfy == NULL ||
610 !BN_mod_exp_mont(vrfy, result, rsa->e, rsa->n, ctx, rsa->mont_n) ||
611 !BN_equal_consttime(vrfy, f)) {
612 OPENSSL_PUT_ERROR(RSA, ERR_R_INTERNAL_ERROR);
Adam Langley6bc658d2014-08-18 13:29:45 -0700613 goto err;
614 }
Adam Langley6bc658d2014-08-18 13:29:45 -0700615
Brian Smith3426d102016-03-17 16:10:04 -1000616 if (!BN_BLINDING_invert(result, blinding, rsa->mont_n, ctx)) {
Adam Langley6bc658d2014-08-18 13:29:45 -0700617 goto err;
618 }
619 }
620
621 if (!BN_bn2bin_padded(out, len, result)) {
David Benjamin3570d732015-06-29 00:28:17 -0400622 OPENSSL_PUT_ERROR(RSA, ERR_R_INTERNAL_ERROR);
Adam Langley6bc658d2014-08-18 13:29:45 -0700623 goto err;
624 }
625
626 ret = 1;
627
628err:
629 if (ctx != NULL) {
630 BN_CTX_end(ctx);
631 BN_CTX_free(ctx);
632 }
633 if (blinding != NULL) {
634 rsa_blinding_release(rsa, blinding, blinding_index);
635 }
636
637 return ret;
638}
639
Adam Langley95c29f32014-06-20 12:00:00 -0700640static int mod_exp(BIGNUM *r0, const BIGNUM *I, RSA *rsa, BN_CTX *ctx) {
Brian Smithf08c1c62016-03-25 13:24:46 -1000641 assert(ctx != NULL);
642
Brian Smith51b0d5b2016-03-25 13:15:39 -1000643 assert(rsa->n != NULL);
644 assert(rsa->e != NULL);
645 assert(rsa->d != NULL);
646 assert(rsa->p != NULL);
647 assert(rsa->q != NULL);
648 assert(rsa->dmp1 != NULL);
649 assert(rsa->dmq1 != NULL);
650 assert(rsa->iqmp != NULL);
651
Adam Langley95c29f32014-06-20 12:00:00 -0700652 BIGNUM *r1, *m1, *vrfy;
Adam Langley95c29f32014-06-20 12:00:00 -0700653 int ret = 0;
654
655 BN_CTX_start(ctx);
656 r1 = BN_CTX_get(ctx);
657 m1 = BN_CTX_get(ctx);
658 vrfy = BN_CTX_get(ctx);
Brian Smith7cf60852016-03-19 22:39:37 -1000659 if (r1 == NULL ||
660 m1 == NULL ||
661 vrfy == NULL) {
662 goto err;
663 }
Adam Langley95c29f32014-06-20 12:00:00 -0700664
Brian Smith9f05de42016-08-02 18:21:18 -1000665 if (!BN_MONT_CTX_set_locked(&rsa->mont_p, &rsa->lock, rsa->p, ctx) ||
666 !BN_MONT_CTX_set_locked(&rsa->mont_q, &rsa->lock, rsa->q, ctx)) {
667 goto err;
Adam Langley95c29f32014-06-20 12:00:00 -0700668 }
669
Brian Smithd0357302016-03-25 10:11:04 -1000670 if (!BN_MONT_CTX_set_locked(&rsa->mont_n, &rsa->lock, rsa->n, ctx)) {
Brian Smith24493a42016-03-25 09:12:48 -1000671 goto err;
Adam Langley95c29f32014-06-20 12:00:00 -0700672 }
673
674 /* compute I mod q */
Brian Smith9f05de42016-08-02 18:21:18 -1000675 if (!BN_mod(r1, I, rsa->q, ctx)) {
Adam Langley95c29f32014-06-20 12:00:00 -0700676 goto err;
677 }
678
679 /* compute r1^dmq1 mod q */
Brian Smith9f05de42016-08-02 18:21:18 -1000680 if (!BN_mod_exp_mont_consttime(m1, r1, rsa->dmq1, rsa->q, ctx, rsa->mont_q)) {
Adam Langley95c29f32014-06-20 12:00:00 -0700681 goto err;
682 }
683
684 /* compute I mod p */
Brian Smith9f05de42016-08-02 18:21:18 -1000685 if (!BN_mod(r1, I, rsa->p, ctx)) {
Adam Langley95c29f32014-06-20 12:00:00 -0700686 goto err;
687 }
688
689 /* compute r1^dmp1 mod p */
Brian Smith9f05de42016-08-02 18:21:18 -1000690 if (!BN_mod_exp_mont_consttime(r0, r1, rsa->dmp1, rsa->p, ctx, rsa->mont_p)) {
Adam Langley95c29f32014-06-20 12:00:00 -0700691 goto err;
692 }
693
694 if (!BN_sub(r0, r0, m1)) {
695 goto err;
696 }
697 /* This will help stop the size of r0 increasing, which does
698 * affect the multiply if it optimised for a power of 2 size */
699 if (BN_is_negative(r0)) {
700 if (!BN_add(r0, r0, rsa->p)) {
701 goto err;
702 }
703 }
704
705 if (!BN_mul(r1, r0, rsa->iqmp, ctx)) {
706 goto err;
707 }
708
Brian Smith9f05de42016-08-02 18:21:18 -1000709 if (!BN_mod(r0, r1, rsa->p, ctx)) {
Adam Langley95c29f32014-06-20 12:00:00 -0700710 goto err;
711 }
712
713 /* If p < q it is occasionally possible for the correction of
714 * adding 'p' if r0 is negative above to leave the result still
715 * negative. This can break the private key operations: the following
716 * second correction should *always* correct this rare occurrence.
717 * This will *never* happen with OpenSSL generated keys because
718 * they ensure p > q [steve] */
719 if (BN_is_negative(r0)) {
720 if (!BN_add(r0, r0, rsa->p)) {
721 goto err;
722 }
723 }
724 if (!BN_mul(r1, r0, rsa->q, ctx)) {
725 goto err;
726 }
727 if (!BN_add(r0, r1, m1)) {
728 goto err;
729 }
730
Adam Langley95c29f32014-06-20 12:00:00 -0700731 ret = 1;
732
733err:
734 BN_CTX_end(ctx);
735 return ret;
736}
737
David Benjamin43780cb2017-04-10 18:05:19 -0400738static int ensure_bignum(BIGNUM **out) {
739 if (*out == NULL) {
740 *out = BN_new();
741 }
742 return *out != NULL;
743}
744
David Benjaminfb8b7632017-04-10 18:35:22 -0400745/* kBoringSSLRSASqrtTwo is the BIGNUM representation of ⌊2¹⁵³⁵×√2⌋. This is
746 * chosen to give enough precision for 3072-bit RSA, the largest key size FIPS
747 * specifies. Key sizes beyond this will round up.
748 *
749 * To verify this number, check that n² < 2³⁰⁷¹ < (n+1)², where n is value
750 * represented here. Note the components are listed in little-endian order. Here
751 * is some sample Python code to check:
752 *
753 * >>> TOBN = lambda a, b: a << 32 | b
754 * >>> l = [ <paste the contents of kSqrtTwo> ]
755 * >>> n = sum(a * 2**(64*i) for i, a in enumerate(l))
756 * >>> n**2 < 2**3071 < (n+1)**2
757 * True
758 */
759const BN_ULONG kBoringSSLRSASqrtTwo[] = {
760 TOBN(0xdea06241, 0xf7aa81c2), TOBN(0xf6a1be3f, 0xca221307),
761 TOBN(0x332a5e9f, 0x7bda1ebf), TOBN(0x0104dc01, 0xfe32352f),
762 TOBN(0xb8cf341b, 0x6f8236c7), TOBN(0x4264dabc, 0xd528b651),
763 TOBN(0xf4d3a02c, 0xebc93e0c), TOBN(0x81394ab6, 0xd8fd0efd),
764 TOBN(0xeaa4a089, 0x9040ca4a), TOBN(0xf52f120f, 0x836e582e),
765 TOBN(0xcb2a6343, 0x31f3c84d), TOBN(0xc6d5a8a3, 0x8bb7e9dc),
766 TOBN(0x460abc72, 0x2f7c4e33), TOBN(0xcab1bc91, 0x1688458a),
767 TOBN(0x53059c60, 0x11bc337b), TOBN(0xd2202e87, 0x42af1f4e),
768 TOBN(0x78048736, 0x3dfa2768), TOBN(0x0f74a85e, 0x439c7b4a),
769 TOBN(0xa8b1fe6f, 0xdc83db39), TOBN(0x4afc8304, 0x3ab8a2c3),
770 TOBN(0xed17ac85, 0x83339915), TOBN(0x1d6f60ba, 0x893ba84c),
771 TOBN(0x597d89b3, 0x754abe9f), TOBN(0xb504f333, 0xf9de6484),
772};
773const size_t kBoringSSLRSASqrtTwoLen = OPENSSL_ARRAY_SIZE(kBoringSSLRSASqrtTwo);
774
775int rsa_less_than_words(const BN_ULONG *a, const BN_ULONG *b, size_t len) {
Adam Langley518ba072017-04-20 13:51:11 -0700776 OPENSSL_COMPILE_ASSERT(sizeof(BN_ULONG) <= sizeof(crypto_word_t),
777 crypto_word_t_too_small);
David Benjaminfb8b7632017-04-10 18:35:22 -0400778 int ret = 0;
779 /* Process the words in little-endian order. */
780 for (size_t i = 0; i < len; i++) {
Adam Langley518ba072017-04-20 13:51:11 -0700781 crypto_word_t eq = constant_time_eq_w(a[i], b[i]);
782 crypto_word_t lt = constant_time_lt_w(a[i], b[i]);
David Benjaminfb8b7632017-04-10 18:35:22 -0400783 ret = constant_time_select_int(eq, ret, constant_time_select_int(lt, 1, 0));
784 }
785 return ret;
786}
787
788int rsa_greater_than_pow2(const BIGNUM *b, int n) {
789 if (BN_is_negative(b) || n == INT_MAX) {
790 return 0;
791 }
792
793 int b_bits = BN_num_bits(b);
794 return b_bits > n + 1 || (b_bits == n + 1 && !BN_is_pow2(b));
795}
796
797/* generate_prime sets |out| to a prime with length |bits| such that |out|-1 is
798 * relatively prime to |e|. If |p| is non-NULL, |out| will also not be close to
799 * |p|. */
800static int generate_prime(BIGNUM *out, int bits, const BIGNUM *e,
801 const BIGNUM *p, BN_CTX *ctx, BN_GENCB *cb) {
802 if (bits < 128 || (bits % BN_BITS2) != 0) {
803 OPENSSL_PUT_ERROR(RSA, ERR_R_INTERNAL_ERROR);
804 return 0;
805 }
806
807 /* Ensure the bound on |tries| does not overflow. */
808 if (bits >= INT_MAX/5) {
809 OPENSSL_PUT_ERROR(RSA, RSA_R_MODULUS_TOO_LARGE);
810 return 0;
811 }
812
813 int ret = 0, tries = 0, rand_tries = 0;
814 BN_CTX_start(ctx);
815 BIGNUM *tmp = BN_CTX_get(ctx);
816 if (tmp == NULL) {
817 goto err;
818 }
819
820 /* See FIPS 186-4 appendix B.3.3, steps 4 and 5. Note |bits| here is
821 * nlen/2. */
822 for (;;) {
823 /* Generate a random number of length |bits| where the bottom bit is set
824 * (steps 4.2, 4.3, 5.2 and 5.3) and the top bit is set (implied by the
825 * bound checked below in steps 4.4 and 5.5). */
826 if (!BN_rand(out, bits, BN_RAND_TOP_ONE, BN_RAND_BOTTOM_ODD) ||
827 !BN_GENCB_call(cb, BN_GENCB_GENERATED, rand_tries++)) {
828 goto err;
829 }
830
831 if (p != NULL) {
832 /* If |p| and |out| are too close, try again (step 5.4). */
833 if (!BN_sub(tmp, out, p)) {
834 goto err;
835 }
836 BN_set_negative(tmp, 0);
837 if (!rsa_greater_than_pow2(tmp, bits - 100)) {
838 continue;
839 }
840 }
841
842 /* If out < 2^(bits-1)×√2, try again (steps 4.4 and 5.5).
843 *
844 * We check the most significant words, so we retry if ⌊out/2^k⌋ <= ⌊b/2^k⌋,
845 * where b = 2^(bits-1)×√2 and k = max(0, bits - 1536). For key sizes up to
846 * 3072 (bits = 1536), k = 0, so we are testing that ⌊out⌋ <= ⌊b⌋. out is an
847 * integer and b is not, so this is equivalent to out < b. That is, the
848 * comparison is exact for FIPS key sizes.
849 *
850 * For larger keys, the comparison is approximate, leaning towards
851 * retrying. That is, we reject a negligible fraction of primes that are
852 * within the FIPS bound, but we will never accept a prime outside the
853 * bound, ensuring the resulting RSA key is the right size. Specifically, if
854 * the FIPS bound holds, we have ⌊out/2^k⌋ < out/2^k < b/2^k. This implies
855 * ⌊out/2^k⌋ <= ⌊b/2^k⌋. That is, the FIPS bound implies our bound and so we
856 * are slightly tighter. */
857 size_t out_len = (size_t)out->top;
858 assert(out_len == (size_t)bits / BN_BITS2);
859 size_t to_check = kBoringSSLRSASqrtTwoLen;
860 if (to_check > out_len) {
861 to_check = out_len;
862 }
863 if (!rsa_less_than_words(
864 kBoringSSLRSASqrtTwo + kBoringSSLRSASqrtTwoLen - to_check,
865 out->d + out_len - to_check, to_check)) {
866 continue;
867 }
868
869 /* Check gcd(out-1, e) is one (steps 4.5 and 5.6). */
870 if (!BN_sub(tmp, out, BN_value_one()) ||
871 !BN_gcd(tmp, tmp, e, ctx)) {
872 goto err;
873 }
874 if (BN_is_one(tmp)) {
875 /* Test |out| for primality (steps 4.5.1 and 5.6.1).
876 * TODO(davidben): Align the primality test with FIPS 186-4. */
877 int is_probable_prime;
878 if (!BN_primality_test(&is_probable_prime, out, BN_prime_checks, ctx, 1,
879 cb)) {
880 goto err;
881 }
882 if (is_probable_prime) {
883 ret = 1;
884 goto err;
885 }
886 }
887
888 /* If we've tried too many times to find a prime, abort (steps 4.7 and
889 * 5.8). */
890 tries++;
891 if (tries >= bits * 5) {
892 OPENSSL_PUT_ERROR(RSA, RSA_R_TOO_MANY_ITERATIONS);
893 goto err;
894 }
895 if (!BN_GENCB_call(cb, 2, tries)) {
896 goto err;
897 }
898 }
899
900err:
901 BN_CTX_end(ctx);
902 return ret;
903}
904
David Benjamin4a2cc282017-04-10 18:20:55 -0400905int rsa_default_keygen(RSA *rsa, int bits, BIGNUM *e_value, BN_GENCB *cb) {
David Benjaminfb8b7632017-04-10 18:35:22 -0400906 /* See FIPS 186-4 appendix B.3. This function implements a generalized version
907 * of the FIPS algorithm. For FIPS compliance, the caller is responsible for
908 * passing in 2048 or 3072 to |bits| and 65537 for |e_value|. */
909
David Benjaminb7ded432017-04-11 13:24:31 -0400910 /* Always generate RSA keys which are a multiple of 128 bits. Round |bits|
911 * down as needed. */
912 bits &= ~127;
913
914 /* Reject excessively small keys. */
915 if (bits < 256) {
916 OPENSSL_PUT_ERROR(RSA, RSA_R_KEY_SIZE_TOO_SMALL);
917 return 0;
918 }
919
David Benjaminfb8b7632017-04-10 18:35:22 -0400920 int ret = 0;
921 BN_CTX *ctx = BN_CTX_new();
Adam Langley95c29f32014-06-20 12:00:00 -0700922 if (ctx == NULL) {
David Benjaminfb8b7632017-04-10 18:35:22 -0400923 goto bn_err;
Adam Langley95c29f32014-06-20 12:00:00 -0700924 }
925 BN_CTX_start(ctx);
David Benjaminfb8b7632017-04-10 18:35:22 -0400926 BIGNUM *r0 = BN_CTX_get(ctx);
927 BIGNUM *r1 = BN_CTX_get(ctx);
928 BIGNUM *r2 = BN_CTX_get(ctx);
929 BIGNUM *r3 = BN_CTX_get(ctx);
Brian Smithf4bbc2a2015-08-06 10:42:27 -0400930 if (r0 == NULL || r1 == NULL || r2 == NULL || r3 == NULL) {
David Benjaminfb8b7632017-04-10 18:35:22 -0400931 goto bn_err;
Adam Langley95c29f32014-06-20 12:00:00 -0700932 }
933
David Benjaminfb8b7632017-04-10 18:35:22 -0400934 /* We need the RSA components non-NULL. */
David Benjamin43780cb2017-04-10 18:05:19 -0400935 if (!ensure_bignum(&rsa->n) ||
936 !ensure_bignum(&rsa->d) ||
937 !ensure_bignum(&rsa->e) ||
938 !ensure_bignum(&rsa->p) ||
939 !ensure_bignum(&rsa->q) ||
940 !ensure_bignum(&rsa->dmp1) ||
941 !ensure_bignum(&rsa->dmq1) ||
942 !ensure_bignum(&rsa->iqmp)) {
David Benjaminfb8b7632017-04-10 18:35:22 -0400943 goto bn_err;
David Benjamin6eb000d2015-02-11 01:17:41 -0500944 }
Adam Langley95c29f32014-06-20 12:00:00 -0700945
David Benjamin1c703cb2015-06-11 21:42:14 -0400946 if (!BN_copy(rsa->e, e_value)) {
David Benjaminfb8b7632017-04-10 18:35:22 -0400947 goto bn_err;
David Benjamin1c703cb2015-06-11 21:42:14 -0400948 }
Adam Langley95c29f32014-06-20 12:00:00 -0700949
David Benjaminfb8b7632017-04-10 18:35:22 -0400950 int prime_bits = bits / 2;
951 do {
952 /* Generate p and q, each of size |prime_bits|, using the steps outlined in
953 * appendix FIPS 186-4 appendix B.3.3. */
954 if (!generate_prime(rsa->p, prime_bits, rsa->e, NULL, ctx, cb) ||
955 !BN_GENCB_call(cb, 3, 0) ||
956 !generate_prime(rsa->q, prime_bits, rsa->e, rsa->p, ctx, cb) ||
957 !BN_GENCB_call(cb, 3, 1)) {
958 goto bn_err;
David Benjamin6eb000d2015-02-11 01:17:41 -0500959 }
David Benjaminfb8b7632017-04-10 18:35:22 -0400960
961 if (BN_cmp(rsa->p, rsa->q) < 0) {
962 BIGNUM *tmp = rsa->p;
963 rsa->p = rsa->q;
964 rsa->q = tmp;
David Benjamin6eb000d2015-02-11 01:17:41 -0500965 }
David Benjaminfb8b7632017-04-10 18:35:22 -0400966
967 /* Calculate d. */
968 if (!BN_sub(r1 /* p-1 */, rsa->p, BN_value_one()) ||
969 !BN_sub(r2 /* q-1 */, rsa->q, BN_value_one()) ||
970 !BN_mul(r0 /* (p-1)(q-1) */, r1, r2, ctx) ||
971 !BN_mod_inverse(rsa->d, rsa->e, r0, ctx)) {
972 goto bn_err;
David Benjamin6eb000d2015-02-11 01:17:41 -0500973 }
David Benjaminfb8b7632017-04-10 18:35:22 -0400974
975 /* Check that |rsa->d| > 2^|prime_bits| and try again if it fails. See
976 * appendix B.3.1's guidance on values for d. */
977 } while (!rsa_greater_than_pow2(rsa->d, prime_bits));
978
979 if (/* Calculate n. */
980 !BN_mul(rsa->n, rsa->p, rsa->q, ctx) ||
981 /* Calculate d mod (p-1). */
982 !BN_mod(rsa->dmp1, rsa->d, r1, ctx) ||
983 /* Calculate d mod (q-1) */
984 !BN_mod(rsa->dmq1, rsa->d, r2, ctx)) {
985 goto bn_err;
Adam Langley95c29f32014-06-20 12:00:00 -0700986 }
Adam Langley839b8812015-05-26 11:36:46 -0700987
David Benjaminfb8b7632017-04-10 18:35:22 -0400988 /* Sanity-check that |rsa->n| has the specified size. This is implied by
989 * |generate_prime|'s bounds. */
990 if (BN_num_bits(rsa->n) != (unsigned)bits) {
991 OPENSSL_PUT_ERROR(RSA, ERR_R_INTERNAL_ERROR);
Adam Langley95c29f32014-06-20 12:00:00 -0700992 goto err;
David Benjamin6eb000d2015-02-11 01:17:41 -0500993 }
Adam Langley95c29f32014-06-20 12:00:00 -0700994
David Benjamin0b8dc302016-12-17 14:27:16 -0500995 /* Calculate inverse of q mod p. Note that although RSA key generation is far
996 * from constant-time, |bn_mod_inverse_secret_prime| uses the same modular
997 * exponentation logic as in RSA private key operations and, if the RSAZ-1024
998 * code is enabled, will be optimized for common RSA prime sizes. */
David Benjamin0b8dc302016-12-17 14:27:16 -0500999 if (!BN_MONT_CTX_set_locked(&rsa->mont_p, &rsa->lock, rsa->p, ctx) ||
David Benjamin0a211df2016-12-17 15:25:55 -05001000 !bn_mod_inverse_secret_prime(rsa->iqmp, rsa->q, rsa->p, ctx,
1001 rsa->mont_p)) {
David Benjaminfb8b7632017-04-10 18:35:22 -04001002 goto bn_err;
David Benjamin6eb000d2015-02-11 01:17:41 -05001003 }
Adam Langley95c29f32014-06-20 12:00:00 -07001004
Brian Smithfebf7712016-03-21 13:47:32 -10001005 /* The key generation process is complex and thus error-prone. It could be
1006 * disastrous to generate and then use a bad key so double-check that the key
1007 * makes sense. */
David Benjaminfb8b7632017-04-10 18:35:22 -04001008 if (!RSA_check_key(rsa)) {
Brian Smithfebf7712016-03-21 13:47:32 -10001009 OPENSSL_PUT_ERROR(RSA, RSA_R_INTERNAL_ERROR);
David Benjaminfb8b7632017-04-10 18:35:22 -04001010 goto err;
Brian Smithfebf7712016-03-21 13:47:32 -10001011 }
1012
David Benjaminfb8b7632017-04-10 18:35:22 -04001013 ret = 1;
1014
1015bn_err:
1016 if (!ret) {
David Benjamin3570d732015-06-29 00:28:17 -04001017 OPENSSL_PUT_ERROR(RSA, ERR_LIB_BN);
Adam Langley95c29f32014-06-20 12:00:00 -07001018 }
David Benjaminfb8b7632017-04-10 18:35:22 -04001019err:
Adam Langley95c29f32014-06-20 12:00:00 -07001020 if (ctx != NULL) {
1021 BN_CTX_end(ctx);
1022 BN_CTX_free(ctx);
1023 }
David Benjaminfb8b7632017-04-10 18:35:22 -04001024 return ret;
Adam Langley95c29f32014-06-20 12:00:00 -07001025}
1026
Brian Smithf08c1c62016-03-25 13:24:46 -10001027/* All of the methods are NULL to make it easier for the compiler/linker to drop
1028 * unused functions. The wrapper functions will select the appropriate
1029 * |rsa_default_*| implementation. */
David Benjamind93831d2015-10-29 13:19:12 -04001030const RSA_METHOD RSA_default_method = {
Adam Langley95c29f32014-06-20 12:00:00 -07001031 {
1032 0 /* references */,
1033 1 /* is_static */,
1034 },
1035 NULL /* app_data */,
1036
1037 NULL /* init */,
David Benjamind93831d2015-10-29 13:19:12 -04001038 NULL /* finish (defaults to rsa_default_finish) */,
Adam Langley95c29f32014-06-20 12:00:00 -07001039
David Benjamind93831d2015-10-29 13:19:12 -04001040 NULL /* size (defaults to rsa_default_size) */,
David Benjamin925fee32014-07-11 14:14:08 -04001041
Adam Langley95c29f32014-06-20 12:00:00 -07001042 NULL /* sign */,
1043 NULL /* verify */,
1044
David Benjamind93831d2015-10-29 13:19:12 -04001045 NULL /* encrypt (defaults to rsa_default_encrypt) */,
1046 NULL /* sign_raw (defaults to rsa_default_sign_raw) */,
1047 NULL /* decrypt (defaults to rsa_default_decrypt) */,
1048 NULL /* verify_raw (defaults to rsa_default_verify_raw) */,
Adam Langley95c29f32014-06-20 12:00:00 -07001049
David Benjamind93831d2015-10-29 13:19:12 -04001050 NULL /* private_transform (defaults to rsa_default_private_transform) */,
Adam Langley6bc658d2014-08-18 13:29:45 -07001051
Brian Smithf08c1c62016-03-25 13:24:46 -10001052 NULL /* mod_exp (ignored) */,
1053 NULL /* bn_mod_exp (ignored) */,
Adam Langley95c29f32014-06-20 12:00:00 -07001054
1055 RSA_FLAG_CACHE_PUBLIC | RSA_FLAG_CACHE_PRIVATE,
1056
David Benjamind93831d2015-10-29 13:19:12 -04001057 NULL /* keygen (defaults to rsa_default_keygen) */,
David Benjamin4a2cc282017-04-10 18:20:55 -04001058 NULL /* multi_prime_keygen (ignored) */,
Adam Langley626c6862015-09-11 16:17:44 -07001059
1060 NULL /* supports_digest */,
Adam Langley95c29f32014-06-20 12:00:00 -07001061};