blob: 342f1c2cb75c45ac4038d59168728f92398da53f [file] [log] [blame]
Adam Langleyd9e397b2015-01-22 14:27:53 -08001/* 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 Benjamin4969cc92016-04-22 15:02:23 -040059#include <assert.h>
Robert Sloan572a4e22017-04-17 10:52:19 -070060#include <limits.h>
Adam Langleyd9e397b2015-01-22 14:27:53 -080061#include <string.h>
62
63#include <openssl/bn.h>
64#include <openssl/err.h>
65#include <openssl/mem.h>
Adam Langleye9ada862015-05-11 17:20:37 -070066#include <openssl/thread.h>
Robert Sloan572a4e22017-04-17 10:52:19 -070067#include <openssl/type_check.h>
Adam Langleyd9e397b2015-01-22 14:27:53 -080068
69#include "internal.h"
Robert Sloan69939df2017-01-09 10:53:07 -080070#include "../bn/internal.h"
Robert Sloan8ff03552017-06-14 12:40:58 -070071#include "../../internal.h"
72#include "../delocate.h"
Adam Langleyd9e397b2015-01-22 14:27:53 -080073
74
David Benjamin4969cc92016-04-22 15:02:23 -040075static int check_modulus_and_exponent_sizes(const RSA *rsa) {
76 unsigned rsa_bits = BN_num_bits(rsa->n);
Adam Langleyd9e397b2015-01-22 14:27:53 -080077
David Benjamin4969cc92016-04-22 15:02:23 -040078 if (rsa_bits > 16 * 1024) {
79 OPENSSL_PUT_ERROR(RSA, RSA_R_MODULUS_TOO_LARGE);
80 return 0;
81 }
82
83 /* Mitigate DoS attacks by limiting the exponent size. 33 bits was chosen as
84 * the limit based on the recommendations in [1] and [2]. Windows CryptoAPI
85 * doesn't support values larger than 32 bits [3], so it is unlikely that
86 * exponents larger than 32 bits are being used for anything Windows commonly
87 * does.
88 *
89 * [1] https://www.imperialviolet.org/2012/03/16/rsae.html
90 * [2] https://www.imperialviolet.org/2012/03/17/rsados.html
91 * [3] https://msdn.microsoft.com/en-us/library/aa387685(VS.85).aspx */
92 static const unsigned kMaxExponentBits = 33;
93
94 if (BN_num_bits(rsa->e) > kMaxExponentBits) {
95 OPENSSL_PUT_ERROR(RSA, RSA_R_BAD_E_VALUE);
96 return 0;
97 }
98
99 /* Verify |n > e|. Comparing |rsa_bits| to |kMaxExponentBits| is a small
100 * shortcut to comparing |n| and |e| directly. In reality, |kMaxExponentBits|
101 * is much smaller than the minimum RSA key size that any application should
102 * accept. */
103 if (rsa_bits <= kMaxExponentBits) {
104 OPENSSL_PUT_ERROR(RSA, RSA_R_KEY_SIZE_TOO_SMALL);
105 return 0;
106 }
107 assert(BN_ucmp(rsa->n, rsa->e) > 0);
108
109 return 1;
110}
Adam Langleyd9e397b2015-01-22 14:27:53 -0800111
Adam Langleyfad63272015-11-12 12:15:39 -0800112size_t rsa_default_size(const RSA *rsa) {
Adam Langleyd9e397b2015-01-22 14:27:53 -0800113 return BN_num_bytes(rsa->n);
114}
115
Robert Sloan8ff03552017-06-14 12:40:58 -0700116int RSA_encrypt(RSA *rsa, size_t *out_len, uint8_t *out, size_t max_out,
117 const uint8_t *in, size_t in_len, int padding) {
118 if (rsa->n == NULL || rsa->e == NULL) {
119 OPENSSL_PUT_ERROR(RSA, RSA_R_VALUE_MISSING);
120 return 0;
121 }
122
Adam Langleyd9e397b2015-01-22 14:27:53 -0800123 const unsigned rsa_size = RSA_size(rsa);
124 BIGNUM *f, *result;
125 uint8_t *buf = NULL;
126 BN_CTX *ctx = NULL;
127 int i, ret = 0;
128
Adam Langleyd9e397b2015-01-22 14:27:53 -0800129 if (max_out < rsa_size) {
Kenny Rootb8494592015-09-25 02:29:14 +0000130 OPENSSL_PUT_ERROR(RSA, RSA_R_OUTPUT_BUFFER_TOO_SMALL);
Adam Langleyd9e397b2015-01-22 14:27:53 -0800131 return 0;
132 }
133
David Benjamin4969cc92016-04-22 15:02:23 -0400134 if (!check_modulus_and_exponent_sizes(rsa)) {
Adam Langleyd9e397b2015-01-22 14:27:53 -0800135 return 0;
136 }
137
138 ctx = BN_CTX_new();
139 if (ctx == NULL) {
140 goto err;
141 }
142
143 BN_CTX_start(ctx);
144 f = BN_CTX_get(ctx);
145 result = BN_CTX_get(ctx);
146 buf = OPENSSL_malloc(rsa_size);
147 if (!f || !result || !buf) {
Kenny Rootb8494592015-09-25 02:29:14 +0000148 OPENSSL_PUT_ERROR(RSA, ERR_R_MALLOC_FAILURE);
Adam Langleyd9e397b2015-01-22 14:27:53 -0800149 goto err;
150 }
151
152 switch (padding) {
153 case RSA_PKCS1_PADDING:
154 i = RSA_padding_add_PKCS1_type_2(buf, rsa_size, in, in_len);
155 break;
156 case RSA_PKCS1_OAEP_PADDING:
157 /* Use the default parameters: SHA-1 for both hashes and no label. */
158 i = RSA_padding_add_PKCS1_OAEP_mgf1(buf, rsa_size, in, in_len,
159 NULL, 0, NULL, NULL);
160 break;
161 case RSA_NO_PADDING:
162 i = RSA_padding_add_none(buf, rsa_size, in, in_len);
163 break;
164 default:
Kenny Rootb8494592015-09-25 02:29:14 +0000165 OPENSSL_PUT_ERROR(RSA, RSA_R_UNKNOWN_PADDING_TYPE);
Adam Langleyd9e397b2015-01-22 14:27:53 -0800166 goto err;
167 }
168
169 if (i <= 0) {
170 goto err;
171 }
172
173 if (BN_bin2bn(buf, rsa_size, f) == NULL) {
174 goto err;
175 }
176
177 if (BN_ucmp(f, rsa->n) >= 0) {
178 /* usually the padding functions would catch this */
Kenny Rootb8494592015-09-25 02:29:14 +0000179 OPENSSL_PUT_ERROR(RSA, RSA_R_DATA_TOO_LARGE_FOR_MODULUS);
Adam Langleyd9e397b2015-01-22 14:27:53 -0800180 goto err;
181 }
182
David Benjamin4969cc92016-04-22 15:02:23 -0400183 if (!BN_MONT_CTX_set_locked(&rsa->mont_n, &rsa->lock, rsa->n, ctx) ||
184 !BN_mod_exp_mont(result, f, rsa->e, rsa->n, ctx, rsa->mont_n)) {
Adam Langleyd9e397b2015-01-22 14:27:53 -0800185 goto err;
186 }
187
188 /* put in leading 0 bytes if the number is less than the length of the
189 * modulus */
190 if (!BN_bn2bin_padded(out, rsa_size, result)) {
Kenny Rootb8494592015-09-25 02:29:14 +0000191 OPENSSL_PUT_ERROR(RSA, ERR_R_INTERNAL_ERROR);
Adam Langleyd9e397b2015-01-22 14:27:53 -0800192 goto err;
193 }
194
195 *out_len = rsa_size;
196 ret = 1;
197
198err:
199 if (ctx != NULL) {
200 BN_CTX_end(ctx);
201 BN_CTX_free(ctx);
202 }
203 if (buf != NULL) {
204 OPENSSL_cleanse(buf, rsa_size);
205 OPENSSL_free(buf);
206 }
207
208 return ret;
209}
210
211/* MAX_BLINDINGS_PER_RSA defines the maximum number of cached BN_BLINDINGs per
212 * RSA*. Then this limit is exceeded, BN_BLINDING objects will be created and
213 * destroyed as needed. */
214#define MAX_BLINDINGS_PER_RSA 1024
215
216/* rsa_blinding_get returns a BN_BLINDING to use with |rsa|. It does this by
217 * allocating one of the cached BN_BLINDING objects in |rsa->blindings|. If
218 * none are free, the cache will be extended by a extra element and the new
219 * BN_BLINDING is returned.
220 *
221 * On success, the index of the assigned BN_BLINDING is written to
222 * |*index_used| and must be passed to |rsa_blinding_release| when finished. */
223static BN_BLINDING *rsa_blinding_get(RSA *rsa, unsigned *index_used,
224 BN_CTX *ctx) {
David Benjamin4969cc92016-04-22 15:02:23 -0400225 assert(ctx != NULL);
226 assert(rsa->mont_n != NULL);
227
Adam Langleyd9e397b2015-01-22 14:27:53 -0800228 BN_BLINDING *ret = NULL;
229 BN_BLINDING **new_blindings;
230 uint8_t *new_blindings_inuse;
231 char overflow = 0;
232
Adam Langleye9ada862015-05-11 17:20:37 -0700233 CRYPTO_MUTEX_lock_write(&rsa->lock);
Adam Langleyd9e397b2015-01-22 14:27:53 -0800234
Adam Langleye9ada862015-05-11 17:20:37 -0700235 unsigned i;
236 for (i = 0; i < rsa->num_blindings; i++) {
237 if (rsa->blindings_inuse[i] == 0) {
238 rsa->blindings_inuse[i] = 1;
239 ret = rsa->blindings[i];
240 *index_used = i;
241 break;
Adam Langleyd9e397b2015-01-22 14:27:53 -0800242 }
243 }
244
245 if (ret != NULL) {
David Benjamind316cba2016-06-02 16:17:39 -0400246 CRYPTO_MUTEX_unlock_write(&rsa->lock);
Adam Langleyd9e397b2015-01-22 14:27:53 -0800247 return ret;
248 }
249
250 overflow = rsa->num_blindings >= MAX_BLINDINGS_PER_RSA;
251
252 /* We didn't find a free BN_BLINDING to use so increase the length of
253 * the arrays by one and use the newly created element. */
254
David Benjamind316cba2016-06-02 16:17:39 -0400255 CRYPTO_MUTEX_unlock_write(&rsa->lock);
David Benjamin4969cc92016-04-22 15:02:23 -0400256 ret = BN_BLINDING_new();
Adam Langleyd9e397b2015-01-22 14:27:53 -0800257 if (ret == NULL) {
258 return NULL;
259 }
260
261 if (overflow) {
262 /* We cannot add any more cached BN_BLINDINGs so we use |ret|
263 * and mark it for destruction in |rsa_blinding_release|. */
264 *index_used = MAX_BLINDINGS_PER_RSA;
265 return ret;
266 }
267
Adam Langleye9ada862015-05-11 17:20:37 -0700268 CRYPTO_MUTEX_lock_write(&rsa->lock);
Adam Langleyd9e397b2015-01-22 14:27:53 -0800269
270 new_blindings =
271 OPENSSL_malloc(sizeof(BN_BLINDING *) * (rsa->num_blindings + 1));
272 if (new_blindings == NULL) {
273 goto err1;
274 }
Robert Sloan69939df2017-01-09 10:53:07 -0800275 OPENSSL_memcpy(new_blindings, rsa->blindings,
Adam Langleyd9e397b2015-01-22 14:27:53 -0800276 sizeof(BN_BLINDING *) * rsa->num_blindings);
277 new_blindings[rsa->num_blindings] = ret;
278
279 new_blindings_inuse = OPENSSL_malloc(rsa->num_blindings + 1);
280 if (new_blindings_inuse == NULL) {
281 goto err2;
282 }
Robert Sloan69939df2017-01-09 10:53:07 -0800283 OPENSSL_memcpy(new_blindings_inuse, rsa->blindings_inuse, rsa->num_blindings);
Adam Langleyd9e397b2015-01-22 14:27:53 -0800284 new_blindings_inuse[rsa->num_blindings] = 1;
285 *index_used = rsa->num_blindings;
286
Adam Langleye9ada862015-05-11 17:20:37 -0700287 OPENSSL_free(rsa->blindings);
Adam Langleyd9e397b2015-01-22 14:27:53 -0800288 rsa->blindings = new_blindings;
Adam Langleye9ada862015-05-11 17:20:37 -0700289 OPENSSL_free(rsa->blindings_inuse);
Adam Langleyd9e397b2015-01-22 14:27:53 -0800290 rsa->blindings_inuse = new_blindings_inuse;
291 rsa->num_blindings++;
292
David Benjamind316cba2016-06-02 16:17:39 -0400293 CRYPTO_MUTEX_unlock_write(&rsa->lock);
Adam Langleyd9e397b2015-01-22 14:27:53 -0800294 return ret;
295
296err2:
297 OPENSSL_free(new_blindings);
298
299err1:
David Benjamind316cba2016-06-02 16:17:39 -0400300 CRYPTO_MUTEX_unlock_write(&rsa->lock);
Adam Langleyd9e397b2015-01-22 14:27:53 -0800301 BN_BLINDING_free(ret);
302 return NULL;
303}
304
305/* rsa_blinding_release marks the cached BN_BLINDING at the given index as free
306 * for other threads to use. */
307static void rsa_blinding_release(RSA *rsa, BN_BLINDING *blinding,
308 unsigned blinding_index) {
309 if (blinding_index == MAX_BLINDINGS_PER_RSA) {
310 /* This blinding wasn't cached. */
311 BN_BLINDING_free(blinding);
312 return;
313 }
314
Adam Langleye9ada862015-05-11 17:20:37 -0700315 CRYPTO_MUTEX_lock_write(&rsa->lock);
Adam Langleyd9e397b2015-01-22 14:27:53 -0800316 rsa->blindings_inuse[blinding_index] = 0;
David Benjamind316cba2016-06-02 16:17:39 -0400317 CRYPTO_MUTEX_unlock_write(&rsa->lock);
Adam Langleyd9e397b2015-01-22 14:27:53 -0800318}
319
320/* signing */
Adam Langleyfad63272015-11-12 12:15:39 -0800321int rsa_default_sign_raw(RSA *rsa, size_t *out_len, uint8_t *out,
322 size_t max_out, const uint8_t *in, size_t in_len,
323 int padding) {
Adam Langleyd9e397b2015-01-22 14:27:53 -0800324 const unsigned rsa_size = RSA_size(rsa);
325 uint8_t *buf = NULL;
326 int i, ret = 0;
327
328 if (max_out < rsa_size) {
Kenny Rootb8494592015-09-25 02:29:14 +0000329 OPENSSL_PUT_ERROR(RSA, RSA_R_OUTPUT_BUFFER_TOO_SMALL);
Adam Langleyd9e397b2015-01-22 14:27:53 -0800330 return 0;
331 }
332
333 buf = OPENSSL_malloc(rsa_size);
334 if (buf == NULL) {
Kenny Rootb8494592015-09-25 02:29:14 +0000335 OPENSSL_PUT_ERROR(RSA, ERR_R_MALLOC_FAILURE);
Adam Langleyd9e397b2015-01-22 14:27:53 -0800336 goto err;
337 }
338
339 switch (padding) {
340 case RSA_PKCS1_PADDING:
341 i = RSA_padding_add_PKCS1_type_1(buf, rsa_size, in, in_len);
342 break;
343 case RSA_NO_PADDING:
344 i = RSA_padding_add_none(buf, rsa_size, in, in_len);
345 break;
346 default:
Kenny Rootb8494592015-09-25 02:29:14 +0000347 OPENSSL_PUT_ERROR(RSA, RSA_R_UNKNOWN_PADDING_TYPE);
Adam Langleyd9e397b2015-01-22 14:27:53 -0800348 goto err;
349 }
350
351 if (i <= 0) {
352 goto err;
353 }
354
355 if (!RSA_private_transform(rsa, out, buf, rsa_size)) {
Adam Langleye9ada862015-05-11 17:20:37 -0700356 goto err;
Adam Langleyd9e397b2015-01-22 14:27:53 -0800357 }
358
359 *out_len = rsa_size;
360 ret = 1;
361
362err:
363 if (buf != NULL) {
364 OPENSSL_cleanse(buf, rsa_size);
365 OPENSSL_free(buf);
366 }
367
368 return ret;
369}
370
Adam Langleyfad63272015-11-12 12:15:39 -0800371int rsa_default_decrypt(RSA *rsa, size_t *out_len, uint8_t *out, size_t max_out,
372 const uint8_t *in, size_t in_len, int padding) {
Adam Langleyd9e397b2015-01-22 14:27:53 -0800373 const unsigned rsa_size = RSA_size(rsa);
Adam Langleyd9e397b2015-01-22 14:27:53 -0800374 uint8_t *buf = NULL;
375 int ret = 0;
376
377 if (max_out < rsa_size) {
Kenny Rootb8494592015-09-25 02:29:14 +0000378 OPENSSL_PUT_ERROR(RSA, RSA_R_OUTPUT_BUFFER_TOO_SMALL);
Adam Langleyd9e397b2015-01-22 14:27:53 -0800379 return 0;
380 }
381
Kenny Rootb8494592015-09-25 02:29:14 +0000382 if (padding == RSA_NO_PADDING) {
383 buf = out;
384 } else {
385 /* Allocate a temporary buffer to hold the padded plaintext. */
386 buf = OPENSSL_malloc(rsa_size);
387 if (buf == NULL) {
388 OPENSSL_PUT_ERROR(RSA, ERR_R_MALLOC_FAILURE);
389 goto err;
390 }
Adam Langleyd9e397b2015-01-22 14:27:53 -0800391 }
392
393 if (in_len != rsa_size) {
Kenny Rootb8494592015-09-25 02:29:14 +0000394 OPENSSL_PUT_ERROR(RSA, RSA_R_DATA_LEN_NOT_EQUAL_TO_MOD_LEN);
Adam Langleyd9e397b2015-01-22 14:27:53 -0800395 goto err;
396 }
397
398 if (!RSA_private_transform(rsa, buf, in, rsa_size)) {
Adam Langleyd9e397b2015-01-22 14:27:53 -0800399 goto err;
400 }
401
402 switch (padding) {
403 case RSA_PKCS1_PADDING:
Robert Sloan6f79a502017-04-03 09:16:40 -0700404 ret =
405 RSA_padding_check_PKCS1_type_2(out, out_len, rsa_size, buf, rsa_size);
Adam Langleyd9e397b2015-01-22 14:27:53 -0800406 break;
407 case RSA_PKCS1_OAEP_PADDING:
408 /* Use the default parameters: SHA-1 for both hashes and no label. */
Robert Sloan6f79a502017-04-03 09:16:40 -0700409 ret = RSA_padding_check_PKCS1_OAEP_mgf1(out, out_len, rsa_size, buf,
410 rsa_size, NULL, 0, NULL, NULL);
Adam Langleyd9e397b2015-01-22 14:27:53 -0800411 break;
412 case RSA_NO_PADDING:
Robert Sloan6f79a502017-04-03 09:16:40 -0700413 *out_len = rsa_size;
414 ret = 1;
Adam Langleyd9e397b2015-01-22 14:27:53 -0800415 break;
416 default:
Kenny Rootb8494592015-09-25 02:29:14 +0000417 OPENSSL_PUT_ERROR(RSA, RSA_R_UNKNOWN_PADDING_TYPE);
Adam Langleyd9e397b2015-01-22 14:27:53 -0800418 goto err;
419 }
420
Robert Sloan6f79a502017-04-03 09:16:40 -0700421 if (!ret) {
Kenny Rootb8494592015-09-25 02:29:14 +0000422 OPENSSL_PUT_ERROR(RSA, RSA_R_PADDING_CHECK_FAILED);
Adam Langleyd9e397b2015-01-22 14:27:53 -0800423 }
424
425err:
Kenny Rootb8494592015-09-25 02:29:14 +0000426 if (padding != RSA_NO_PADDING && buf != NULL) {
Adam Langleyd9e397b2015-01-22 14:27:53 -0800427 OPENSSL_cleanse(buf, rsa_size);
428 OPENSSL_free(buf);
429 }
430
431 return ret;
432}
433
David Benjamin4969cc92016-04-22 15:02:23 -0400434static int mod_exp(BIGNUM *r0, const BIGNUM *I, RSA *rsa, BN_CTX *ctx);
435
436int RSA_verify_raw(RSA *rsa, size_t *out_len, uint8_t *out, size_t max_out,
437 const uint8_t *in, size_t in_len, int padding) {
438 if (rsa->n == NULL || rsa->e == NULL) {
439 OPENSSL_PUT_ERROR(RSA, RSA_R_VALUE_MISSING);
440 return 0;
441 }
442
Adam Langleyd9e397b2015-01-22 14:27:53 -0800443 const unsigned rsa_size = RSA_size(rsa);
444 BIGNUM *f, *result;
Adam Langleyd9e397b2015-01-22 14:27:53 -0800445
446 if (max_out < rsa_size) {
Kenny Rootb8494592015-09-25 02:29:14 +0000447 OPENSSL_PUT_ERROR(RSA, RSA_R_OUTPUT_BUFFER_TOO_SMALL);
Adam Langleyd9e397b2015-01-22 14:27:53 -0800448 return 0;
449 }
450
David Benjamin4969cc92016-04-22 15:02:23 -0400451 if (in_len != rsa_size) {
452 OPENSSL_PUT_ERROR(RSA, RSA_R_DATA_LEN_NOT_EQUAL_TO_MOD_LEN);
Adam Langleyd9e397b2015-01-22 14:27:53 -0800453 return 0;
454 }
455
David Benjamin4969cc92016-04-22 15:02:23 -0400456 if (!check_modulus_and_exponent_sizes(rsa)) {
457 return 0;
Adam Langleyd9e397b2015-01-22 14:27:53 -0800458 }
459
David Benjamin4969cc92016-04-22 15:02:23 -0400460 BN_CTX *ctx = BN_CTX_new();
461 if (ctx == NULL) {
462 return 0;
463 }
464
465 int ret = 0;
466 uint8_t *buf = NULL;
467
Adam Langleyd9e397b2015-01-22 14:27:53 -0800468 BN_CTX_start(ctx);
469 f = BN_CTX_get(ctx);
470 result = BN_CTX_get(ctx);
David Benjamin4969cc92016-04-22 15:02:23 -0400471 if (f == NULL || result == NULL) {
472 OPENSSL_PUT_ERROR(RSA, ERR_R_MALLOC_FAILURE);
473 goto err;
474 }
475
Kenny Rootb8494592015-09-25 02:29:14 +0000476 if (padding == RSA_NO_PADDING) {
477 buf = out;
478 } else {
479 /* Allocate a temporary buffer to hold the padded plaintext. */
480 buf = OPENSSL_malloc(rsa_size);
481 if (buf == NULL) {
482 OPENSSL_PUT_ERROR(RSA, ERR_R_MALLOC_FAILURE);
483 goto err;
484 }
485 }
Adam Langleyd9e397b2015-01-22 14:27:53 -0800486
487 if (BN_bin2bn(in, in_len, f) == NULL) {
488 goto err;
489 }
490
491 if (BN_ucmp(f, rsa->n) >= 0) {
Kenny Rootb8494592015-09-25 02:29:14 +0000492 OPENSSL_PUT_ERROR(RSA, RSA_R_DATA_TOO_LARGE_FOR_MODULUS);
Adam Langleyd9e397b2015-01-22 14:27:53 -0800493 goto err;
494 }
495
David Benjamin4969cc92016-04-22 15:02:23 -0400496 if (!BN_MONT_CTX_set_locked(&rsa->mont_n, &rsa->lock, rsa->n, ctx) ||
497 !BN_mod_exp_mont(result, f, rsa->e, rsa->n, ctx, rsa->mont_n)) {
Adam Langleyd9e397b2015-01-22 14:27:53 -0800498 goto err;
499 }
500
501 if (!BN_bn2bin_padded(buf, rsa_size, result)) {
Kenny Rootb8494592015-09-25 02:29:14 +0000502 OPENSSL_PUT_ERROR(RSA, ERR_R_INTERNAL_ERROR);
Adam Langleyd9e397b2015-01-22 14:27:53 -0800503 goto err;
504 }
505
506 switch (padding) {
507 case RSA_PKCS1_PADDING:
Robert Sloan6f79a502017-04-03 09:16:40 -0700508 ret =
509 RSA_padding_check_PKCS1_type_1(out, out_len, rsa_size, buf, rsa_size);
Adam Langleyd9e397b2015-01-22 14:27:53 -0800510 break;
511 case RSA_NO_PADDING:
Robert Sloan6f79a502017-04-03 09:16:40 -0700512 ret = 1;
513 *out_len = rsa_size;
Adam Langleyd9e397b2015-01-22 14:27:53 -0800514 break;
515 default:
Kenny Rootb8494592015-09-25 02:29:14 +0000516 OPENSSL_PUT_ERROR(RSA, RSA_R_UNKNOWN_PADDING_TYPE);
Adam Langleyd9e397b2015-01-22 14:27:53 -0800517 goto err;
518 }
519
Robert Sloan6f79a502017-04-03 09:16:40 -0700520 if (!ret) {
Kenny Rootb8494592015-09-25 02:29:14 +0000521 OPENSSL_PUT_ERROR(RSA, RSA_R_PADDING_CHECK_FAILED);
Robert Sloan6f79a502017-04-03 09:16:40 -0700522 goto err;
Adam Langleyd9e397b2015-01-22 14:27:53 -0800523 }
524
525err:
David Benjamin4969cc92016-04-22 15:02:23 -0400526 BN_CTX_end(ctx);
527 BN_CTX_free(ctx);
528 if (buf != out) {
Adam Langleyd9e397b2015-01-22 14:27:53 -0800529 OPENSSL_free(buf);
530 }
531 return ret;
532}
533
Adam Langleyfad63272015-11-12 12:15:39 -0800534int rsa_default_private_transform(RSA *rsa, uint8_t *out, const uint8_t *in,
535 size_t len) {
Adam Langleyd9e397b2015-01-22 14:27:53 -0800536 BIGNUM *f, *result;
537 BN_CTX *ctx = NULL;
538 unsigned blinding_index = 0;
539 BN_BLINDING *blinding = NULL;
540 int ret = 0;
541
542 ctx = BN_CTX_new();
543 if (ctx == NULL) {
544 goto err;
545 }
546 BN_CTX_start(ctx);
547 f = BN_CTX_get(ctx);
548 result = BN_CTX_get(ctx);
549
550 if (f == NULL || result == NULL) {
Kenny Rootb8494592015-09-25 02:29:14 +0000551 OPENSSL_PUT_ERROR(RSA, ERR_R_MALLOC_FAILURE);
Adam Langleyd9e397b2015-01-22 14:27:53 -0800552 goto err;
553 }
554
555 if (BN_bin2bn(in, len, f) == NULL) {
556 goto err;
557 }
558
559 if (BN_ucmp(f, rsa->n) >= 0) {
560 /* Usually the padding functions would catch this. */
Kenny Rootb8494592015-09-25 02:29:14 +0000561 OPENSSL_PUT_ERROR(RSA, RSA_R_DATA_TOO_LARGE_FOR_MODULUS);
Adam Langleyd9e397b2015-01-22 14:27:53 -0800562 goto err;
563 }
564
David Benjamin9aaebef2016-04-22 15:02:23 -0400565 if (!BN_MONT_CTX_set_locked(&rsa->mont_n, &rsa->lock, rsa->n, ctx)) {
566 OPENSSL_PUT_ERROR(RSA, ERR_R_INTERNAL_ERROR);
567 goto err;
568 }
569
Robert Sloan8ff03552017-06-14 12:40:58 -0700570 const int do_blinding = (rsa->flags & RSA_FLAG_NO_BLINDING) == 0;
David Benjamin9aaebef2016-04-22 15:02:23 -0400571
Robert Sloan8ff03552017-06-14 12:40:58 -0700572 if (rsa->e == NULL && do_blinding) {
573 /* We cannot do blinding or verification without |e|, and continuing without
574 * those countermeasures is dangerous. However, the Java/Android RSA API
575 * requires support for keys where only |d| and |n| (and not |e|) are known.
576 * The callers that require that bad behavior set |RSA_FLAG_NO_BLINDING|. */
577 OPENSSL_PUT_ERROR(RSA, RSA_R_NO_PUBLIC_EXPONENT);
578 goto err;
579 }
David Benjamin4969cc92016-04-22 15:02:23 -0400580
Robert Sloan8ff03552017-06-14 12:40:58 -0700581 if (do_blinding) {
Adam Langleyd9e397b2015-01-22 14:27:53 -0800582 blinding = rsa_blinding_get(rsa, &blinding_index, ctx);
583 if (blinding == NULL) {
Kenny Rootb8494592015-09-25 02:29:14 +0000584 OPENSSL_PUT_ERROR(RSA, ERR_R_INTERNAL_ERROR);
Adam Langleyd9e397b2015-01-22 14:27:53 -0800585 goto err;
586 }
David Benjamin4969cc92016-04-22 15:02:23 -0400587 if (!BN_BLINDING_convert(f, blinding, rsa->e, rsa->mont_n, ctx)) {
Adam Langleyd9e397b2015-01-22 14:27:53 -0800588 goto err;
589 }
590 }
591
David Benjamin4969cc92016-04-22 15:02:23 -0400592 if (rsa->p != NULL && rsa->q != NULL && rsa->e != NULL && rsa->dmp1 != NULL &&
593 rsa->dmq1 != NULL && rsa->iqmp != NULL) {
594 if (!mod_exp(result, f, rsa, ctx)) {
Adam Langleyd9e397b2015-01-22 14:27:53 -0800595 goto err;
596 }
Robert Sloan69939df2017-01-09 10:53:07 -0800597 } else if (!BN_mod_exp_mont_consttime(result, f, rsa->d, rsa->n, ctx,
598 rsa->mont_n)) {
599 goto err;
Adam Langleyd9e397b2015-01-22 14:27:53 -0800600 }
601
David Benjamin9aaebef2016-04-22 15:02:23 -0400602 /* Verify the result to protect against fault attacks as described in the
603 * 1997 paper "On the Importance of Checking Cryptographic Protocols for
604 * Faults" by Dan Boneh, Richard A. DeMillo, and Richard J. Lipton. Some
605 * implementations do this only when the CRT is used, but we do it in all
606 * cases. Section 6 of the aforementioned paper describes an attack that
607 * works when the CRT isn't used. That attack is much less likely to succeed
608 * than the CRT attack, but there have likely been improvements since 1997.
609 *
610 * This check is cheap assuming |e| is small; it almost always is. */
Robert Sloan8ff03552017-06-14 12:40:58 -0700611 if (rsa->e != NULL) {
David Benjamin9aaebef2016-04-22 15:02:23 -0400612 BIGNUM *vrfy = BN_CTX_get(ctx);
613 if (vrfy == NULL ||
614 !BN_mod_exp_mont(vrfy, result, rsa->e, rsa->n, ctx, rsa->mont_n) ||
615 !BN_equal_consttime(vrfy, f)) {
616 OPENSSL_PUT_ERROR(RSA, ERR_R_INTERNAL_ERROR);
617 goto err;
618 }
619
Robert Sloan8ff03552017-06-14 12:40:58 -0700620 }
621
622 if (do_blinding &&
623 !BN_BLINDING_invert(result, blinding, rsa->mont_n, ctx)) {
624 goto err;
Adam Langleyd9e397b2015-01-22 14:27:53 -0800625 }
626
627 if (!BN_bn2bin_padded(out, len, result)) {
Kenny Rootb8494592015-09-25 02:29:14 +0000628 OPENSSL_PUT_ERROR(RSA, ERR_R_INTERNAL_ERROR);
Adam Langleyd9e397b2015-01-22 14:27:53 -0800629 goto err;
630 }
631
632 ret = 1;
633
634err:
635 if (ctx != NULL) {
636 BN_CTX_end(ctx);
637 BN_CTX_free(ctx);
638 }
639 if (blinding != NULL) {
640 rsa_blinding_release(rsa, blinding, blinding_index);
641 }
642
643 return ret;
644}
645
646static int mod_exp(BIGNUM *r0, const BIGNUM *I, RSA *rsa, BN_CTX *ctx) {
David Benjamin4969cc92016-04-22 15:02:23 -0400647 assert(ctx != NULL);
648
649 assert(rsa->n != NULL);
650 assert(rsa->e != NULL);
651 assert(rsa->d != NULL);
652 assert(rsa->p != NULL);
653 assert(rsa->q != NULL);
654 assert(rsa->dmp1 != NULL);
655 assert(rsa->dmq1 != NULL);
656 assert(rsa->iqmp != NULL);
657
Adam Langleyd9e397b2015-01-22 14:27:53 -0800658 BIGNUM *r1, *m1, *vrfy;
Adam Langleyd9e397b2015-01-22 14:27:53 -0800659 int ret = 0;
660
661 BN_CTX_start(ctx);
662 r1 = BN_CTX_get(ctx);
663 m1 = BN_CTX_get(ctx);
664 vrfy = BN_CTX_get(ctx);
David Benjamin4969cc92016-04-22 15:02:23 -0400665 if (r1 == NULL ||
666 m1 == NULL ||
667 vrfy == NULL) {
668 goto err;
669 }
Adam Langleyd9e397b2015-01-22 14:27:53 -0800670
Robert Sloan69939df2017-01-09 10:53:07 -0800671 if (!BN_MONT_CTX_set_locked(&rsa->mont_p, &rsa->lock, rsa->p, ctx) ||
672 !BN_MONT_CTX_set_locked(&rsa->mont_q, &rsa->lock, rsa->q, ctx)) {
673 goto err;
Adam Langleyd9e397b2015-01-22 14:27:53 -0800674 }
675
David Benjamin4969cc92016-04-22 15:02:23 -0400676 if (!BN_MONT_CTX_set_locked(&rsa->mont_n, &rsa->lock, rsa->n, ctx)) {
677 goto err;
Adam Langleyd9e397b2015-01-22 14:27:53 -0800678 }
679
680 /* compute I mod q */
Robert Sloan69939df2017-01-09 10:53:07 -0800681 if (!BN_mod(r1, I, rsa->q, ctx)) {
Adam Langleyd9e397b2015-01-22 14:27:53 -0800682 goto err;
683 }
684
685 /* compute r1^dmq1 mod q */
Robert Sloan69939df2017-01-09 10:53:07 -0800686 if (!BN_mod_exp_mont_consttime(m1, r1, rsa->dmq1, rsa->q, ctx, rsa->mont_q)) {
Adam Langleyd9e397b2015-01-22 14:27:53 -0800687 goto err;
688 }
689
690 /* compute I mod p */
Robert Sloan69939df2017-01-09 10:53:07 -0800691 if (!BN_mod(r1, I, rsa->p, ctx)) {
Adam Langleyd9e397b2015-01-22 14:27:53 -0800692 goto err;
693 }
694
695 /* compute r1^dmp1 mod p */
Robert Sloan69939df2017-01-09 10:53:07 -0800696 if (!BN_mod_exp_mont_consttime(r0, r1, rsa->dmp1, rsa->p, ctx, rsa->mont_p)) {
Adam Langleyd9e397b2015-01-22 14:27:53 -0800697 goto err;
698 }
699
700 if (!BN_sub(r0, r0, m1)) {
701 goto err;
702 }
703 /* This will help stop the size of r0 increasing, which does
704 * affect the multiply if it optimised for a power of 2 size */
705 if (BN_is_negative(r0)) {
706 if (!BN_add(r0, r0, rsa->p)) {
707 goto err;
708 }
709 }
710
711 if (!BN_mul(r1, r0, rsa->iqmp, ctx)) {
712 goto err;
713 }
714
Robert Sloan69939df2017-01-09 10:53:07 -0800715 if (!BN_mod(r0, r1, rsa->p, ctx)) {
Adam Langleyd9e397b2015-01-22 14:27:53 -0800716 goto err;
717 }
718
719 /* If p < q it is occasionally possible for the correction of
720 * adding 'p' if r0 is negative above to leave the result still
721 * negative. This can break the private key operations: the following
722 * second correction should *always* correct this rare occurrence.
723 * This will *never* happen with OpenSSL generated keys because
724 * they ensure p > q [steve] */
725 if (BN_is_negative(r0)) {
726 if (!BN_add(r0, r0, rsa->p)) {
727 goto err;
728 }
729 }
730 if (!BN_mul(r1, r0, rsa->q, ctx)) {
731 goto err;
732 }
733 if (!BN_add(r0, r1, m1)) {
734 goto err;
735 }
736
Adam Langleyd9e397b2015-01-22 14:27:53 -0800737 ret = 1;
738
739err:
740 BN_CTX_end(ctx);
741 return ret;
742}
743
Robert Sloan572a4e22017-04-17 10:52:19 -0700744static int ensure_bignum(BIGNUM **out) {
745 if (*out == NULL) {
746 *out = BN_new();
747 }
748 return *out != NULL;
749}
Kenny Rootb8494592015-09-25 02:29:14 +0000750
Robert Sloan572a4e22017-04-17 10:52:19 -0700751/* kBoringSSLRSASqrtTwo is the BIGNUM representation of ⌊2¹⁵³⁵×√2⌋. This is
752 * chosen to give enough precision for 3072-bit RSA, the largest key size FIPS
753 * specifies. Key sizes beyond this will round up.
754 *
755 * To verify this number, check that n² < 2³⁰⁷¹ < (n+1)², where n is value
756 * represented here. Note the components are listed in little-endian order. Here
757 * is some sample Python code to check:
758 *
759 * >>> TOBN = lambda a, b: a << 32 | b
760 * >>> l = [ <paste the contents of kSqrtTwo> ]
761 * >>> n = sum(a * 2**(64*i) for i, a in enumerate(l))
762 * >>> n**2 < 2**3071 < (n+1)**2
763 * True
764 */
765const BN_ULONG kBoringSSLRSASqrtTwo[] = {
766 TOBN(0xdea06241, 0xf7aa81c2), TOBN(0xf6a1be3f, 0xca221307),
767 TOBN(0x332a5e9f, 0x7bda1ebf), TOBN(0x0104dc01, 0xfe32352f),
768 TOBN(0xb8cf341b, 0x6f8236c7), TOBN(0x4264dabc, 0xd528b651),
769 TOBN(0xf4d3a02c, 0xebc93e0c), TOBN(0x81394ab6, 0xd8fd0efd),
770 TOBN(0xeaa4a089, 0x9040ca4a), TOBN(0xf52f120f, 0x836e582e),
771 TOBN(0xcb2a6343, 0x31f3c84d), TOBN(0xc6d5a8a3, 0x8bb7e9dc),
772 TOBN(0x460abc72, 0x2f7c4e33), TOBN(0xcab1bc91, 0x1688458a),
773 TOBN(0x53059c60, 0x11bc337b), TOBN(0xd2202e87, 0x42af1f4e),
774 TOBN(0x78048736, 0x3dfa2768), TOBN(0x0f74a85e, 0x439c7b4a),
775 TOBN(0xa8b1fe6f, 0xdc83db39), TOBN(0x4afc8304, 0x3ab8a2c3),
776 TOBN(0xed17ac85, 0x83339915), TOBN(0x1d6f60ba, 0x893ba84c),
777 TOBN(0x597d89b3, 0x754abe9f), TOBN(0xb504f333, 0xf9de6484),
778};
779const size_t kBoringSSLRSASqrtTwoLen = OPENSSL_ARRAY_SIZE(kBoringSSLRSASqrtTwo);
780
781int rsa_less_than_words(const BN_ULONG *a, const BN_ULONG *b, size_t len) {
Robert Sloan9254e682017-04-24 09:42:06 -0700782 OPENSSL_COMPILE_ASSERT(sizeof(BN_ULONG) <= sizeof(crypto_word_t),
783 crypto_word_t_too_small);
Robert Sloan572a4e22017-04-17 10:52:19 -0700784 int ret = 0;
785 /* Process the words in little-endian order. */
786 for (size_t i = 0; i < len; i++) {
Robert Sloan9254e682017-04-24 09:42:06 -0700787 crypto_word_t eq = constant_time_eq_w(a[i], b[i]);
788 crypto_word_t lt = constant_time_lt_w(a[i], b[i]);
Robert Sloan572a4e22017-04-17 10:52:19 -0700789 ret = constant_time_select_int(eq, ret, constant_time_select_int(lt, 1, 0));
790 }
791 return ret;
792}
793
794int rsa_greater_than_pow2(const BIGNUM *b, int n) {
795 if (BN_is_negative(b) || n == INT_MAX) {
796 return 0;
797 }
798
799 int b_bits = BN_num_bits(b);
800 return b_bits > n + 1 || (b_bits == n + 1 && !BN_is_pow2(b));
801}
802
803/* generate_prime sets |out| to a prime with length |bits| such that |out|-1 is
804 * relatively prime to |e|. If |p| is non-NULL, |out| will also not be close to
805 * |p|. */
806static int generate_prime(BIGNUM *out, int bits, const BIGNUM *e,
807 const BIGNUM *p, BN_CTX *ctx, BN_GENCB *cb) {
808 if (bits < 128 || (bits % BN_BITS2) != 0) {
809 OPENSSL_PUT_ERROR(RSA, ERR_R_INTERNAL_ERROR);
810 return 0;
811 }
812
813 /* Ensure the bound on |tries| does not overflow. */
814 if (bits >= INT_MAX/5) {
815 OPENSSL_PUT_ERROR(RSA, RSA_R_MODULUS_TOO_LARGE);
816 return 0;
817 }
818
819 int ret = 0, tries = 0, rand_tries = 0;
820 BN_CTX_start(ctx);
821 BIGNUM *tmp = BN_CTX_get(ctx);
822 if (tmp == NULL) {
Kenny Rootb8494592015-09-25 02:29:14 +0000823 goto err;
824 }
Adam Langleyd9e397b2015-01-22 14:27:53 -0800825
Robert Sloan572a4e22017-04-17 10:52:19 -0700826 /* See FIPS 186-4 appendix B.3.3, steps 4 and 5. Note |bits| here is
827 * nlen/2. */
828 for (;;) {
829 /* Generate a random number of length |bits| where the bottom bit is set
830 * (steps 4.2, 4.3, 5.2 and 5.3) and the top bit is set (implied by the
831 * bound checked below in steps 4.4 and 5.5). */
832 if (!BN_rand(out, bits, BN_RAND_TOP_ONE, BN_RAND_BOTTOM_ODD) ||
833 !BN_GENCB_call(cb, BN_GENCB_GENERATED, rand_tries++)) {
834 goto err;
835 }
836
837 if (p != NULL) {
838 /* If |p| and |out| are too close, try again (step 5.4). */
839 if (!BN_sub(tmp, out, p)) {
840 goto err;
841 }
842 BN_set_negative(tmp, 0);
843 if (!rsa_greater_than_pow2(tmp, bits - 100)) {
844 continue;
845 }
846 }
847
848 /* If out < 2^(bits-1)×√2, try again (steps 4.4 and 5.5).
849 *
850 * We check the most significant words, so we retry if ⌊out/2^k⌋ <= ⌊b/2^k⌋,
851 * where b = 2^(bits-1)×√2 and k = max(0, bits - 1536). For key sizes up to
852 * 3072 (bits = 1536), k = 0, so we are testing that ⌊out⌋ <= ⌊b⌋. out is an
853 * integer and b is not, so this is equivalent to out < b. That is, the
854 * comparison is exact for FIPS key sizes.
855 *
856 * For larger keys, the comparison is approximate, leaning towards
857 * retrying. That is, we reject a negligible fraction of primes that are
858 * within the FIPS bound, but we will never accept a prime outside the
859 * bound, ensuring the resulting RSA key is the right size. Specifically, if
860 * the FIPS bound holds, we have ⌊out/2^k⌋ < out/2^k < b/2^k. This implies
861 * ⌊out/2^k⌋ <= ⌊b/2^k⌋. That is, the FIPS bound implies our bound and so we
862 * are slightly tighter. */
863 size_t out_len = (size_t)out->top;
864 assert(out_len == (size_t)bits / BN_BITS2);
865 size_t to_check = kBoringSSLRSASqrtTwoLen;
866 if (to_check > out_len) {
867 to_check = out_len;
868 }
869 if (!rsa_less_than_words(
870 kBoringSSLRSASqrtTwo + kBoringSSLRSASqrtTwoLen - to_check,
871 out->d + out_len - to_check, to_check)) {
872 continue;
873 }
874
875 /* Check gcd(out-1, e) is one (steps 4.5 and 5.6). */
876 if (!BN_sub(tmp, out, BN_value_one()) ||
877 !BN_gcd(tmp, tmp, e, ctx)) {
878 goto err;
879 }
880 if (BN_is_one(tmp)) {
Robert Sloan8ff03552017-06-14 12:40:58 -0700881 /* Test |out| for primality (steps 4.5.1 and 5.6.1). */
Robert Sloan572a4e22017-04-17 10:52:19 -0700882 int is_probable_prime;
883 if (!BN_primality_test(&is_probable_prime, out, BN_prime_checks, ctx, 1,
884 cb)) {
885 goto err;
886 }
887 if (is_probable_prime) {
888 ret = 1;
889 goto err;
890 }
891 }
892
893 /* If we've tried too many times to find a prime, abort (steps 4.7 and
894 * 5.8). */
895 tries++;
896 if (tries >= bits * 5) {
897 OPENSSL_PUT_ERROR(RSA, RSA_R_TOO_MANY_ITERATIONS);
898 goto err;
899 }
900 if (!BN_GENCB_call(cb, 2, tries)) {
901 goto err;
902 }
903 }
904
905err:
906 BN_CTX_end(ctx);
907 return ret;
908}
909
Robert Sloan8ff03552017-06-14 12:40:58 -0700910int RSA_generate_key_ex(RSA *rsa, int bits, BIGNUM *e_value, BN_GENCB *cb) {
Robert Sloan572a4e22017-04-17 10:52:19 -0700911 /* See FIPS 186-4 appendix B.3. This function implements a generalized version
Robert Sloan8ff03552017-06-14 12:40:58 -0700912 * of the FIPS algorithm. |RSA_generate_key_fips| performs additional checks
913 * for FIPS-compliant key generation. */
Robert Sloan572a4e22017-04-17 10:52:19 -0700914
915 /* Always generate RSA keys which are a multiple of 128 bits. Round |bits|
916 * down as needed. */
917 bits &= ~127;
918
919 /* Reject excessively small keys. */
920 if (bits < 256) {
921 OPENSSL_PUT_ERROR(RSA, RSA_R_KEY_SIZE_TOO_SMALL);
922 return 0;
923 }
924
925 int ret = 0;
926 BN_CTX *ctx = BN_CTX_new();
Adam Langleyd9e397b2015-01-22 14:27:53 -0800927 if (ctx == NULL) {
Robert Sloan572a4e22017-04-17 10:52:19 -0700928 goto bn_err;
Adam Langleyd9e397b2015-01-22 14:27:53 -0800929 }
930 BN_CTX_start(ctx);
Robert Sloan8ff03552017-06-14 12:40:58 -0700931 BIGNUM *totient = BN_CTX_get(ctx);
932 BIGNUM *pm1 = BN_CTX_get(ctx);
933 BIGNUM *qm1 = BN_CTX_get(ctx);
934 BIGNUM *gcd = BN_CTX_get(ctx);
935 if (totient == NULL || pm1 == NULL || qm1 == NULL || gcd == NULL) {
Robert Sloan572a4e22017-04-17 10:52:19 -0700936 goto bn_err;
Adam Langleyd9e397b2015-01-22 14:27:53 -0800937 }
938
Robert Sloan572a4e22017-04-17 10:52:19 -0700939 /* We need the RSA components non-NULL. */
940 if (!ensure_bignum(&rsa->n) ||
941 !ensure_bignum(&rsa->d) ||
942 !ensure_bignum(&rsa->e) ||
943 !ensure_bignum(&rsa->p) ||
944 !ensure_bignum(&rsa->q) ||
945 !ensure_bignum(&rsa->dmp1) ||
946 !ensure_bignum(&rsa->dmq1) ||
947 !ensure_bignum(&rsa->iqmp)) {
948 goto bn_err;
Adam Langleye9ada862015-05-11 17:20:37 -0700949 }
Adam Langleyd9e397b2015-01-22 14:27:53 -0800950
Kenny Rootb8494592015-09-25 02:29:14 +0000951 if (!BN_copy(rsa->e, e_value)) {
Robert Sloan572a4e22017-04-17 10:52:19 -0700952 goto bn_err;
Kenny Rootb8494592015-09-25 02:29:14 +0000953 }
Adam Langleyd9e397b2015-01-22 14:27:53 -0800954
Robert Sloan572a4e22017-04-17 10:52:19 -0700955 int prime_bits = bits / 2;
956 do {
957 /* Generate p and q, each of size |prime_bits|, using the steps outlined in
958 * appendix FIPS 186-4 appendix B.3.3. */
959 if (!generate_prime(rsa->p, prime_bits, rsa->e, NULL, ctx, cb) ||
960 !BN_GENCB_call(cb, 3, 0) ||
961 !generate_prime(rsa->q, prime_bits, rsa->e, rsa->p, ctx, cb) ||
962 !BN_GENCB_call(cb, 3, 1)) {
963 goto bn_err;
Kenny Rootb8494592015-09-25 02:29:14 +0000964 }
965
Robert Sloan572a4e22017-04-17 10:52:19 -0700966 if (BN_cmp(rsa->p, rsa->q) < 0) {
967 BIGNUM *tmp = rsa->p;
968 rsa->p = rsa->q;
969 rsa->q = tmp;
Kenny Rootb8494592015-09-25 02:29:14 +0000970 }
971
Robert Sloan8ff03552017-06-14 12:40:58 -0700972 /* Calculate d = e^(-1) (mod lcm(p-1, q-1)), per FIPS 186-4. This differs
973 * from typical RSA implementations which use (p-1)*(q-1).
974 *
975 * Note this means the size of d might reveal information about p-1 and
976 * q-1. However, we do operations with Chinese Remainder Theorem, so we only
977 * use d (mod p-1) and d (mod q-1) as exponents. Using a minimal totient
978 * does not affect those two values. */
979 if (!BN_sub(pm1, rsa->p, BN_value_one()) ||
980 !BN_sub(qm1, rsa->q, BN_value_one()) ||
981 !BN_mul(totient, pm1, qm1, ctx) ||
982 !BN_gcd(gcd, pm1, qm1, ctx) ||
983 !BN_div(totient, NULL, totient, gcd, ctx) ||
984 !BN_mod_inverse(rsa->d, rsa->e, totient, ctx)) {
Robert Sloan572a4e22017-04-17 10:52:19 -0700985 goto bn_err;
Kenny Rootb8494592015-09-25 02:29:14 +0000986 }
Robert Sloan572a4e22017-04-17 10:52:19 -0700987
988 /* Check that |rsa->d| > 2^|prime_bits| and try again if it fails. See
989 * appendix B.3.1's guidance on values for d. */
990 } while (!rsa_greater_than_pow2(rsa->d, prime_bits));
991
992 if (/* Calculate n. */
993 !BN_mul(rsa->n, rsa->p, rsa->q, ctx) ||
994 /* Calculate d mod (p-1). */
Robert Sloan8ff03552017-06-14 12:40:58 -0700995 !BN_mod(rsa->dmp1, rsa->d, pm1, ctx) ||
Robert Sloan572a4e22017-04-17 10:52:19 -0700996 /* Calculate d mod (q-1) */
Robert Sloan8ff03552017-06-14 12:40:58 -0700997 !BN_mod(rsa->dmq1, rsa->d, qm1, ctx)) {
Robert Sloan572a4e22017-04-17 10:52:19 -0700998 goto bn_err;
Kenny Rootb8494592015-09-25 02:29:14 +0000999 }
1000
Robert Sloan572a4e22017-04-17 10:52:19 -07001001 /* Sanity-check that |rsa->n| has the specified size. This is implied by
1002 * |generate_prime|'s bounds. */
1003 if (BN_num_bits(rsa->n) != (unsigned)bits) {
1004 OPENSSL_PUT_ERROR(RSA, ERR_R_INTERNAL_ERROR);
Adam Langleyd9e397b2015-01-22 14:27:53 -08001005 goto err;
Adam Langleye9ada862015-05-11 17:20:37 -07001006 }
Adam Langleyd9e397b2015-01-22 14:27:53 -08001007
Robert Sloan69939df2017-01-09 10:53:07 -08001008 /* Calculate inverse of q mod p. Note that although RSA key generation is far
1009 * from constant-time, |bn_mod_inverse_secret_prime| uses the same modular
1010 * exponentation logic as in RSA private key operations and, if the RSAZ-1024
1011 * code is enabled, will be optimized for common RSA prime sizes. */
Robert Sloan69939df2017-01-09 10:53:07 -08001012 if (!BN_MONT_CTX_set_locked(&rsa->mont_p, &rsa->lock, rsa->p, ctx) ||
Steven Valdezb0b45c62017-01-17 16:23:54 -05001013 !bn_mod_inverse_secret_prime(rsa->iqmp, rsa->q, rsa->p, ctx,
1014 rsa->mont_p)) {
Robert Sloan572a4e22017-04-17 10:52:19 -07001015 goto bn_err;
Adam Langleye9ada862015-05-11 17:20:37 -07001016 }
Adam Langleyd9e397b2015-01-22 14:27:53 -08001017
Robert Sloan69939df2017-01-09 10:53:07 -08001018 /* The key generation process is complex and thus error-prone. It could be
1019 * disastrous to generate and then use a bad key so double-check that the key
1020 * makes sense. */
Robert Sloan572a4e22017-04-17 10:52:19 -07001021 if (!RSA_check_key(rsa)) {
Robert Sloan69939df2017-01-09 10:53:07 -08001022 OPENSSL_PUT_ERROR(RSA, RSA_R_INTERNAL_ERROR);
Robert Sloan572a4e22017-04-17 10:52:19 -07001023 goto err;
Robert Sloan69939df2017-01-09 10:53:07 -08001024 }
1025
Robert Sloan572a4e22017-04-17 10:52:19 -07001026 ret = 1;
1027
1028bn_err:
1029 if (!ret) {
Kenny Rootb8494592015-09-25 02:29:14 +00001030 OPENSSL_PUT_ERROR(RSA, ERR_LIB_BN);
Adam Langleyd9e397b2015-01-22 14:27:53 -08001031 }
Robert Sloan572a4e22017-04-17 10:52:19 -07001032err:
Adam Langleyd9e397b2015-01-22 14:27:53 -08001033 if (ctx != NULL) {
1034 BN_CTX_end(ctx);
1035 BN_CTX_free(ctx);
1036 }
Robert Sloan572a4e22017-04-17 10:52:19 -07001037 return ret;
Kenny Rootb8494592015-09-25 02:29:14 +00001038}
1039
Robert Sloan8ff03552017-06-14 12:40:58 -07001040int RSA_generate_key_fips(RSA *rsa, int bits, BN_GENCB *cb) {
1041 /* FIPS 186-4 allows 2048-bit and 3072-bit RSA keys (1024-bit and 1536-bit
1042 * primes, respectively) with the prime generation method we use. */
1043 if (bits != 2048 && bits != 3072) {
1044 OPENSSL_PUT_ERROR(RSA, RSA_R_BAD_RSA_PARAMETERS);
1045 return 0;
1046 }
Adam Langleyd9e397b2015-01-22 14:27:53 -08001047
Robert Sloan8ff03552017-06-14 12:40:58 -07001048 BIGNUM *e = BN_new();
1049 int ret = e != NULL &&
1050 BN_set_word(e, RSA_F4) &&
1051 RSA_generate_key_ex(rsa, bits, e, cb) &&
1052 RSA_check_fips(rsa);
1053 BN_free(e);
1054 return ret;
1055}
Adam Langleyd9e397b2015-01-22 14:27:53 -08001056
Robert Sloan8ff03552017-06-14 12:40:58 -07001057DEFINE_METHOD_FUNCTION(RSA_METHOD, RSA_default_method) {
1058 /* All of the methods are NULL to make it easier for the compiler/linker to
1059 * drop unused functions. The wrapper functions will select the appropriate
1060 * |rsa_default_*| implementation. */
1061 OPENSSL_memset(out, 0, sizeof(RSA_METHOD));
1062 out->common.is_static = 1;
1063 out->flags = RSA_FLAG_CACHE_PUBLIC | RSA_FLAG_CACHE_PRIVATE;
1064}