blob: c807831b8802fd9f6983b111b9c27991091d1a63 [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"
Adam Langleye9ada862015-05-11 17:20:37 -070071#include "../internal.h"
Adam Langleyd9e397b2015-01-22 14:27:53 -080072
73
David Benjamin4969cc92016-04-22 15:02:23 -040074static int check_modulus_and_exponent_sizes(const RSA *rsa) {
75 unsigned rsa_bits = BN_num_bits(rsa->n);
Adam Langleyd9e397b2015-01-22 14:27:53 -080076
David Benjamin4969cc92016-04-22 15:02:23 -040077 if (rsa_bits > 16 * 1024) {
78 OPENSSL_PUT_ERROR(RSA, RSA_R_MODULUS_TOO_LARGE);
79 return 0;
80 }
81
82 /* 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) {
94 OPENSSL_PUT_ERROR(RSA, RSA_R_BAD_E_VALUE);
95 return 0;
96 }
97
98 /* 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);
104 return 0;
105 }
106 assert(BN_ucmp(rsa->n, rsa->e) > 0);
107
108 return 1;
109}
Adam Langleyd9e397b2015-01-22 14:27:53 -0800110
Adam Langleyfad63272015-11-12 12:15:39 -0800111size_t rsa_default_size(const RSA *rsa) {
Adam Langleyd9e397b2015-01-22 14:27:53 -0800112 return BN_num_bytes(rsa->n);
113}
114
Adam Langleyfad63272015-11-12 12:15:39 -0800115int 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 Langleyd9e397b2015-01-22 14:27:53 -0800117 const unsigned rsa_size = RSA_size(rsa);
118 BIGNUM *f, *result;
119 uint8_t *buf = NULL;
120 BN_CTX *ctx = NULL;
121 int i, ret = 0;
122
Adam Langleyd9e397b2015-01-22 14:27:53 -0800123 if (max_out < rsa_size) {
Kenny Rootb8494592015-09-25 02:29:14 +0000124 OPENSSL_PUT_ERROR(RSA, RSA_R_OUTPUT_BUFFER_TOO_SMALL);
Adam Langleyd9e397b2015-01-22 14:27:53 -0800125 return 0;
126 }
127
David Benjamin4969cc92016-04-22 15:02:23 -0400128 if (!check_modulus_and_exponent_sizes(rsa)) {
Adam Langleyd9e397b2015-01-22 14:27:53 -0800129 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) {
Kenny Rootb8494592015-09-25 02:29:14 +0000142 OPENSSL_PUT_ERROR(RSA, ERR_R_MALLOC_FAILURE);
Adam Langleyd9e397b2015-01-22 14:27:53 -0800143 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:
151 /* 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);
154 break;
155 case RSA_NO_PADDING:
156 i = RSA_padding_add_none(buf, rsa_size, in, in_len);
157 break;
158 default:
Kenny Rootb8494592015-09-25 02:29:14 +0000159 OPENSSL_PUT_ERROR(RSA, RSA_R_UNKNOWN_PADDING_TYPE);
Adam Langleyd9e397b2015-01-22 14:27:53 -0800160 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 */
Kenny Rootb8494592015-09-25 02:29:14 +0000173 OPENSSL_PUT_ERROR(RSA, RSA_R_DATA_TOO_LARGE_FOR_MODULUS);
Adam Langleyd9e397b2015-01-22 14:27:53 -0800174 goto err;
175 }
176
David Benjamin4969cc92016-04-22 15:02:23 -0400177 if (!BN_MONT_CTX_set_locked(&rsa->mont_n, &rsa->lock, rsa->n, ctx) ||
178 !BN_mod_exp_mont(result, f, rsa->e, rsa->n, ctx, rsa->mont_n)) {
Adam Langleyd9e397b2015-01-22 14:27:53 -0800179 goto err;
180 }
181
182 /* put in leading 0 bytes if the number is less than the length of the
183 * modulus */
184 if (!BN_bn2bin_padded(out, rsa_size, result)) {
Kenny Rootb8494592015-09-25 02:29:14 +0000185 OPENSSL_PUT_ERROR(RSA, ERR_R_INTERNAL_ERROR);
Adam Langleyd9e397b2015-01-22 14:27:53 -0800186 goto err;
187 }
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) {
David Benjamin4969cc92016-04-22 15:02:23 -0400219 assert(ctx != NULL);
220 assert(rsa->mont_n != NULL);
221
Adam Langleyd9e397b2015-01-22 14:27:53 -0800222 BN_BLINDING *ret = NULL;
223 BN_BLINDING **new_blindings;
224 uint8_t *new_blindings_inuse;
225 char overflow = 0;
226
Adam Langleye9ada862015-05-11 17:20:37 -0700227 CRYPTO_MUTEX_lock_write(&rsa->lock);
Adam Langleyd9e397b2015-01-22 14:27:53 -0800228
Adam Langleye9ada862015-05-11 17:20:37 -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 Langleyd9e397b2015-01-22 14:27:53 -0800236 }
237 }
238
239 if (ret != NULL) {
David Benjamind316cba2016-06-02 16:17:39 -0400240 CRYPTO_MUTEX_unlock_write(&rsa->lock);
Adam Langleyd9e397b2015-01-22 14:27:53 -0800241 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 Benjamind316cba2016-06-02 16:17:39 -0400249 CRYPTO_MUTEX_unlock_write(&rsa->lock);
David Benjamin4969cc92016-04-22 15:02:23 -0400250 ret = BN_BLINDING_new();
Adam Langleyd9e397b2015-01-22 14:27:53 -0800251 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 Langleye9ada862015-05-11 17:20:37 -0700262 CRYPTO_MUTEX_lock_write(&rsa->lock);
Adam Langleyd9e397b2015-01-22 14:27:53 -0800263
264 new_blindings =
265 OPENSSL_malloc(sizeof(BN_BLINDING *) * (rsa->num_blindings + 1));
266 if (new_blindings == NULL) {
267 goto err1;
268 }
Robert Sloan69939df2017-01-09 10:53:07 -0800269 OPENSSL_memcpy(new_blindings, rsa->blindings,
Adam Langleyd9e397b2015-01-22 14:27:53 -0800270 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 }
Robert Sloan69939df2017-01-09 10:53:07 -0800277 OPENSSL_memcpy(new_blindings_inuse, rsa->blindings_inuse, rsa->num_blindings);
Adam Langleyd9e397b2015-01-22 14:27:53 -0800278 new_blindings_inuse[rsa->num_blindings] = 1;
279 *index_used = rsa->num_blindings;
280
Adam Langleye9ada862015-05-11 17:20:37 -0700281 OPENSSL_free(rsa->blindings);
Adam Langleyd9e397b2015-01-22 14:27:53 -0800282 rsa->blindings = new_blindings;
Adam Langleye9ada862015-05-11 17:20:37 -0700283 OPENSSL_free(rsa->blindings_inuse);
Adam Langleyd9e397b2015-01-22 14:27:53 -0800284 rsa->blindings_inuse = new_blindings_inuse;
285 rsa->num_blindings++;
286
David Benjamind316cba2016-06-02 16:17:39 -0400287 CRYPTO_MUTEX_unlock_write(&rsa->lock);
Adam Langleyd9e397b2015-01-22 14:27:53 -0800288 return ret;
289
290err2:
291 OPENSSL_free(new_blindings);
292
293err1:
David Benjamind316cba2016-06-02 16:17:39 -0400294 CRYPTO_MUTEX_unlock_write(&rsa->lock);
Adam Langleyd9e397b2015-01-22 14:27:53 -0800295 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 Langleye9ada862015-05-11 17:20:37 -0700309 CRYPTO_MUTEX_lock_write(&rsa->lock);
Adam Langleyd9e397b2015-01-22 14:27:53 -0800310 rsa->blindings_inuse[blinding_index] = 0;
David Benjamind316cba2016-06-02 16:17:39 -0400311 CRYPTO_MUTEX_unlock_write(&rsa->lock);
Adam Langleyd9e397b2015-01-22 14:27:53 -0800312}
313
314/* signing */
Adam Langleyfad63272015-11-12 12:15:39 -0800315int 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 Langleyd9e397b2015-01-22 14:27:53 -0800318 const unsigned rsa_size = RSA_size(rsa);
319 uint8_t *buf = NULL;
320 int i, ret = 0;
321
322 if (max_out < rsa_size) {
Kenny Rootb8494592015-09-25 02:29:14 +0000323 OPENSSL_PUT_ERROR(RSA, RSA_R_OUTPUT_BUFFER_TOO_SMALL);
Adam Langleyd9e397b2015-01-22 14:27:53 -0800324 return 0;
325 }
326
327 buf = OPENSSL_malloc(rsa_size);
328 if (buf == NULL) {
Kenny Rootb8494592015-09-25 02:29:14 +0000329 OPENSSL_PUT_ERROR(RSA, ERR_R_MALLOC_FAILURE);
Adam Langleyd9e397b2015-01-22 14:27:53 -0800330 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:
Kenny Rootb8494592015-09-25 02:29:14 +0000341 OPENSSL_PUT_ERROR(RSA, RSA_R_UNKNOWN_PADDING_TYPE);
Adam Langleyd9e397b2015-01-22 14:27:53 -0800342 goto err;
343 }
344
345 if (i <= 0) {
346 goto err;
347 }
348
349 if (!RSA_private_transform(rsa, out, buf, rsa_size)) {
Adam Langleye9ada862015-05-11 17:20:37 -0700350 goto err;
Adam Langleyd9e397b2015-01-22 14:27:53 -0800351 }
352
353 *out_len = rsa_size;
354 ret = 1;
355
356err:
357 if (buf != NULL) {
358 OPENSSL_cleanse(buf, rsa_size);
359 OPENSSL_free(buf);
360 }
361
362 return ret;
363}
364
Adam Langleyfad63272015-11-12 12:15:39 -0800365int 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 Langleyd9e397b2015-01-22 14:27:53 -0800367 const unsigned rsa_size = RSA_size(rsa);
Adam Langleyd9e397b2015-01-22 14:27:53 -0800368 uint8_t *buf = NULL;
369 int ret = 0;
370
371 if (max_out < rsa_size) {
Kenny Rootb8494592015-09-25 02:29:14 +0000372 OPENSSL_PUT_ERROR(RSA, RSA_R_OUTPUT_BUFFER_TOO_SMALL);
Adam Langleyd9e397b2015-01-22 14:27:53 -0800373 return 0;
374 }
375
Kenny Rootb8494592015-09-25 02:29:14 +0000376 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 Langleyd9e397b2015-01-22 14:27:53 -0800385 }
386
387 if (in_len != rsa_size) {
Kenny Rootb8494592015-09-25 02:29:14 +0000388 OPENSSL_PUT_ERROR(RSA, RSA_R_DATA_LEN_NOT_EQUAL_TO_MOD_LEN);
Adam Langleyd9e397b2015-01-22 14:27:53 -0800389 goto err;
390 }
391
392 if (!RSA_private_transform(rsa, buf, in, rsa_size)) {
Adam Langleyd9e397b2015-01-22 14:27:53 -0800393 goto err;
394 }
395
396 switch (padding) {
397 case RSA_PKCS1_PADDING:
Robert Sloan6f79a502017-04-03 09:16:40 -0700398 ret =
399 RSA_padding_check_PKCS1_type_2(out, out_len, rsa_size, buf, rsa_size);
Adam Langleyd9e397b2015-01-22 14:27:53 -0800400 break;
401 case RSA_PKCS1_OAEP_PADDING:
402 /* Use the default parameters: SHA-1 for both hashes and no label. */
Robert Sloan6f79a502017-04-03 09:16:40 -0700403 ret = RSA_padding_check_PKCS1_OAEP_mgf1(out, out_len, rsa_size, buf,
404 rsa_size, NULL, 0, NULL, NULL);
Adam Langleyd9e397b2015-01-22 14:27:53 -0800405 break;
406 case RSA_NO_PADDING:
Robert Sloan6f79a502017-04-03 09:16:40 -0700407 *out_len = rsa_size;
408 ret = 1;
Adam Langleyd9e397b2015-01-22 14:27:53 -0800409 break;
410 default:
Kenny Rootb8494592015-09-25 02:29:14 +0000411 OPENSSL_PUT_ERROR(RSA, RSA_R_UNKNOWN_PADDING_TYPE);
Adam Langleyd9e397b2015-01-22 14:27:53 -0800412 goto err;
413 }
414
Robert Sloan6f79a502017-04-03 09:16:40 -0700415 if (!ret) {
Kenny Rootb8494592015-09-25 02:29:14 +0000416 OPENSSL_PUT_ERROR(RSA, RSA_R_PADDING_CHECK_FAILED);
Adam Langleyd9e397b2015-01-22 14:27:53 -0800417 }
418
419err:
Kenny Rootb8494592015-09-25 02:29:14 +0000420 if (padding != RSA_NO_PADDING && buf != NULL) {
Adam Langleyd9e397b2015-01-22 14:27:53 -0800421 OPENSSL_cleanse(buf, rsa_size);
422 OPENSSL_free(buf);
423 }
424
425 return ret;
426}
427
David Benjamin4969cc92016-04-22 15:02:23 -0400428static int mod_exp(BIGNUM *r0, const BIGNUM *I, RSA *rsa, BN_CTX *ctx);
429
430int 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 Langleyd9e397b2015-01-22 14:27:53 -0800437 const unsigned rsa_size = RSA_size(rsa);
438 BIGNUM *f, *result;
Adam Langleyd9e397b2015-01-22 14:27:53 -0800439
440 if (max_out < rsa_size) {
Kenny Rootb8494592015-09-25 02:29:14 +0000441 OPENSSL_PUT_ERROR(RSA, RSA_R_OUTPUT_BUFFER_TOO_SMALL);
Adam Langleyd9e397b2015-01-22 14:27:53 -0800442 return 0;
443 }
444
David Benjamin4969cc92016-04-22 15:02:23 -0400445 if (in_len != rsa_size) {
446 OPENSSL_PUT_ERROR(RSA, RSA_R_DATA_LEN_NOT_EQUAL_TO_MOD_LEN);
Adam Langleyd9e397b2015-01-22 14:27:53 -0800447 return 0;
448 }
449
David Benjamin4969cc92016-04-22 15:02:23 -0400450 if (!check_modulus_and_exponent_sizes(rsa)) {
451 return 0;
Adam Langleyd9e397b2015-01-22 14:27:53 -0800452 }
453
David Benjamin4969cc92016-04-22 15:02:23 -0400454 BN_CTX *ctx = BN_CTX_new();
455 if (ctx == NULL) {
456 return 0;
457 }
458
459 int ret = 0;
460 uint8_t *buf = NULL;
461
Adam Langleyd9e397b2015-01-22 14:27:53 -0800462 BN_CTX_start(ctx);
463 f = BN_CTX_get(ctx);
464 result = BN_CTX_get(ctx);
David Benjamin4969cc92016-04-22 15:02:23 -0400465 if (f == NULL || result == NULL) {
466 OPENSSL_PUT_ERROR(RSA, ERR_R_MALLOC_FAILURE);
467 goto err;
468 }
469
Kenny Rootb8494592015-09-25 02:29:14 +0000470 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 Langleyd9e397b2015-01-22 14:27:53 -0800480
481 if (BN_bin2bn(in, in_len, f) == NULL) {
482 goto err;
483 }
484
485 if (BN_ucmp(f, rsa->n) >= 0) {
Kenny Rootb8494592015-09-25 02:29:14 +0000486 OPENSSL_PUT_ERROR(RSA, RSA_R_DATA_TOO_LARGE_FOR_MODULUS);
Adam Langleyd9e397b2015-01-22 14:27:53 -0800487 goto err;
488 }
489
David Benjamin4969cc92016-04-22 15:02:23 -0400490 if (!BN_MONT_CTX_set_locked(&rsa->mont_n, &rsa->lock, rsa->n, ctx) ||
491 !BN_mod_exp_mont(result, f, rsa->e, rsa->n, ctx, rsa->mont_n)) {
Adam Langleyd9e397b2015-01-22 14:27:53 -0800492 goto err;
493 }
494
495 if (!BN_bn2bin_padded(buf, rsa_size, result)) {
Kenny Rootb8494592015-09-25 02:29:14 +0000496 OPENSSL_PUT_ERROR(RSA, ERR_R_INTERNAL_ERROR);
Adam Langleyd9e397b2015-01-22 14:27:53 -0800497 goto err;
498 }
499
500 switch (padding) {
501 case RSA_PKCS1_PADDING:
Robert Sloan6f79a502017-04-03 09:16:40 -0700502 ret =
503 RSA_padding_check_PKCS1_type_1(out, out_len, rsa_size, buf, rsa_size);
Adam Langleyd9e397b2015-01-22 14:27:53 -0800504 break;
505 case RSA_NO_PADDING:
Robert Sloan6f79a502017-04-03 09:16:40 -0700506 ret = 1;
507 *out_len = rsa_size;
Adam Langleyd9e397b2015-01-22 14:27:53 -0800508 break;
509 default:
Kenny Rootb8494592015-09-25 02:29:14 +0000510 OPENSSL_PUT_ERROR(RSA, RSA_R_UNKNOWN_PADDING_TYPE);
Adam Langleyd9e397b2015-01-22 14:27:53 -0800511 goto err;
512 }
513
Robert Sloan6f79a502017-04-03 09:16:40 -0700514 if (!ret) {
Kenny Rootb8494592015-09-25 02:29:14 +0000515 OPENSSL_PUT_ERROR(RSA, RSA_R_PADDING_CHECK_FAILED);
Robert Sloan6f79a502017-04-03 09:16:40 -0700516 goto err;
Adam Langleyd9e397b2015-01-22 14:27:53 -0800517 }
518
519err:
David Benjamin4969cc92016-04-22 15:02:23 -0400520 BN_CTX_end(ctx);
521 BN_CTX_free(ctx);
522 if (buf != out) {
Adam Langleyd9e397b2015-01-22 14:27:53 -0800523 OPENSSL_free(buf);
524 }
525 return ret;
526}
527
Adam Langleyfad63272015-11-12 12:15:39 -0800528int rsa_default_private_transform(RSA *rsa, uint8_t *out, const uint8_t *in,
529 size_t len) {
Adam Langleyd9e397b2015-01-22 14:27:53 -0800530 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) {
Kenny Rootb8494592015-09-25 02:29:14 +0000545 OPENSSL_PUT_ERROR(RSA, ERR_R_MALLOC_FAILURE);
Adam Langleyd9e397b2015-01-22 14:27:53 -0800546 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. */
Kenny Rootb8494592015-09-25 02:29:14 +0000555 OPENSSL_PUT_ERROR(RSA, RSA_R_DATA_TOO_LARGE_FOR_MODULUS);
Adam Langleyd9e397b2015-01-22 14:27:53 -0800556 goto err;
557 }
558
David Benjamin9aaebef2016-04-22 15:02:23 -0400559 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
564 /* 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) {
David Benjamin4969cc92016-04-22 15:02:23 -0400571 /* 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 Langleyd9e397b2015-01-22 14:27:53 -0800578 blinding = rsa_blinding_get(rsa, &blinding_index, ctx);
579 if (blinding == NULL) {
Kenny Rootb8494592015-09-25 02:29:14 +0000580 OPENSSL_PUT_ERROR(RSA, ERR_R_INTERNAL_ERROR);
Adam Langleyd9e397b2015-01-22 14:27:53 -0800581 goto err;
582 }
David Benjamin4969cc92016-04-22 15:02:23 -0400583 if (!BN_BLINDING_convert(f, blinding, rsa->e, rsa->mont_n, ctx)) {
Adam Langleyd9e397b2015-01-22 14:27:53 -0800584 goto err;
585 }
586 }
587
David Benjamin4969cc92016-04-22 15:02:23 -0400588 if (rsa->p != NULL && rsa->q != NULL && rsa->e != NULL && rsa->dmp1 != NULL &&
589 rsa->dmq1 != NULL && rsa->iqmp != NULL) {
590 if (!mod_exp(result, f, rsa, ctx)) {
Adam Langleyd9e397b2015-01-22 14:27:53 -0800591 goto err;
592 }
Robert Sloan69939df2017-01-09 10:53:07 -0800593 } else if (!BN_mod_exp_mont_consttime(result, f, rsa->d, rsa->n, ctx,
594 rsa->mont_n)) {
595 goto err;
Adam Langleyd9e397b2015-01-22 14:27:53 -0800596 }
597
David Benjamin9aaebef2016-04-22 15:02:23 -0400598 /* 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 *
606 * This check is cheap assuming |e| is small; it almost always is. */
607 if (!disable_security) {
608 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);
613 goto err;
614 }
615
David Benjamin4969cc92016-04-22 15:02:23 -0400616 if (!BN_BLINDING_invert(result, blinding, rsa->mont_n, ctx)) {
Adam Langleyd9e397b2015-01-22 14:27:53 -0800617 goto err;
618 }
619 }
620
621 if (!BN_bn2bin_padded(out, len, result)) {
Kenny Rootb8494592015-09-25 02:29:14 +0000622 OPENSSL_PUT_ERROR(RSA, ERR_R_INTERNAL_ERROR);
Adam Langleyd9e397b2015-01-22 14:27:53 -0800623 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
640static int mod_exp(BIGNUM *r0, const BIGNUM *I, RSA *rsa, BN_CTX *ctx) {
David Benjamin4969cc92016-04-22 15:02:23 -0400641 assert(ctx != NULL);
642
643 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 Langleyd9e397b2015-01-22 14:27:53 -0800652 BIGNUM *r1, *m1, *vrfy;
Adam Langleyd9e397b2015-01-22 14:27:53 -0800653 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);
David Benjamin4969cc92016-04-22 15:02:23 -0400659 if (r1 == NULL ||
660 m1 == NULL ||
661 vrfy == NULL) {
662 goto err;
663 }
Adam Langleyd9e397b2015-01-22 14:27:53 -0800664
Robert Sloan69939df2017-01-09 10:53:07 -0800665 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 Langleyd9e397b2015-01-22 14:27:53 -0800668 }
669
David Benjamin4969cc92016-04-22 15:02:23 -0400670 if (!BN_MONT_CTX_set_locked(&rsa->mont_n, &rsa->lock, rsa->n, ctx)) {
671 goto err;
Adam Langleyd9e397b2015-01-22 14:27:53 -0800672 }
673
674 /* compute I mod q */
Robert Sloan69939df2017-01-09 10:53:07 -0800675 if (!BN_mod(r1, I, rsa->q, ctx)) {
Adam Langleyd9e397b2015-01-22 14:27:53 -0800676 goto err;
677 }
678
679 /* compute r1^dmq1 mod q */
Robert Sloan69939df2017-01-09 10:53:07 -0800680 if (!BN_mod_exp_mont_consttime(m1, r1, rsa->dmq1, rsa->q, ctx, rsa->mont_q)) {
Adam Langleyd9e397b2015-01-22 14:27:53 -0800681 goto err;
682 }
683
684 /* compute I mod p */
Robert Sloan69939df2017-01-09 10:53:07 -0800685 if (!BN_mod(r1, I, rsa->p, ctx)) {
Adam Langleyd9e397b2015-01-22 14:27:53 -0800686 goto err;
687 }
688
689 /* compute r1^dmp1 mod p */
Robert Sloan69939df2017-01-09 10:53:07 -0800690 if (!BN_mod_exp_mont_consttime(r0, r1, rsa->dmp1, rsa->p, ctx, rsa->mont_p)) {
Adam Langleyd9e397b2015-01-22 14:27:53 -0800691 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
Robert Sloan69939df2017-01-09 10:53:07 -0800709 if (!BN_mod(r0, r1, rsa->p, ctx)) {
Adam Langleyd9e397b2015-01-22 14:27:53 -0800710 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 Langleyd9e397b2015-01-22 14:27:53 -0800731 ret = 1;
732
733err:
734 BN_CTX_end(ctx);
735 return ret;
736}
737
Robert Sloan572a4e22017-04-17 10:52:19 -0700738static int ensure_bignum(BIGNUM **out) {
739 if (*out == NULL) {
740 *out = BN_new();
741 }
742 return *out != NULL;
743}
Kenny Rootb8494592015-09-25 02:29:14 +0000744
Robert Sloan572a4e22017-04-17 10:52:19 -0700745/* 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) {
Robert Sloan9254e682017-04-24 09:42:06 -0700776 OPENSSL_COMPILE_ASSERT(sizeof(BN_ULONG) <= sizeof(crypto_word_t),
777 crypto_word_t_too_small);
Robert Sloan572a4e22017-04-17 10:52:19 -0700778 int ret = 0;
779 /* Process the words in little-endian order. */
780 for (size_t i = 0; i < len; i++) {
Robert Sloan9254e682017-04-24 09:42:06 -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]);
Robert Sloan572a4e22017-04-17 10:52:19 -0700783 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) {
Kenny Rootb8494592015-09-25 02:29:14 +0000817 goto err;
818 }
Adam Langleyd9e397b2015-01-22 14:27:53 -0800819
Robert Sloan572a4e22017-04-17 10:52:19 -0700820 /* 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
905int rsa_default_keygen(RSA *rsa, int bits, BIGNUM *e_value, BN_GENCB *cb) {
906 /* 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
910 /* 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
920 int ret = 0;
921 BN_CTX *ctx = BN_CTX_new();
Adam Langleyd9e397b2015-01-22 14:27:53 -0800922 if (ctx == NULL) {
Robert Sloan572a4e22017-04-17 10:52:19 -0700923 goto bn_err;
Adam Langleyd9e397b2015-01-22 14:27:53 -0800924 }
925 BN_CTX_start(ctx);
Robert Sloan572a4e22017-04-17 10:52:19 -0700926 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);
Kenny Rootb8494592015-09-25 02:29:14 +0000930 if (r0 == NULL || r1 == NULL || r2 == NULL || r3 == NULL) {
Robert Sloan572a4e22017-04-17 10:52:19 -0700931 goto bn_err;
Adam Langleyd9e397b2015-01-22 14:27:53 -0800932 }
933
Robert Sloan572a4e22017-04-17 10:52:19 -0700934 /* We need the RSA components non-NULL. */
935 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)) {
943 goto bn_err;
Adam Langleye9ada862015-05-11 17:20:37 -0700944 }
Adam Langleyd9e397b2015-01-22 14:27:53 -0800945
Kenny Rootb8494592015-09-25 02:29:14 +0000946 if (!BN_copy(rsa->e, e_value)) {
Robert Sloan572a4e22017-04-17 10:52:19 -0700947 goto bn_err;
Kenny Rootb8494592015-09-25 02:29:14 +0000948 }
Adam Langleyd9e397b2015-01-22 14:27:53 -0800949
Robert Sloan572a4e22017-04-17 10:52:19 -0700950 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;
Kenny Rootb8494592015-09-25 02:29:14 +0000959 }
960
Robert Sloan572a4e22017-04-17 10:52:19 -0700961 if (BN_cmp(rsa->p, rsa->q) < 0) {
962 BIGNUM *tmp = rsa->p;
963 rsa->p = rsa->q;
964 rsa->q = tmp;
Kenny Rootb8494592015-09-25 02:29:14 +0000965 }
966
Robert Sloan572a4e22017-04-17 10:52:19 -0700967 /* 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;
Kenny Rootb8494592015-09-25 02:29:14 +0000973 }
Robert Sloan572a4e22017-04-17 10:52:19 -0700974
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;
Kenny Rootb8494592015-09-25 02:29:14 +0000986 }
987
Robert Sloan572a4e22017-04-17 10:52:19 -0700988 /* 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 Langleyd9e397b2015-01-22 14:27:53 -0800992 goto err;
Adam Langleye9ada862015-05-11 17:20:37 -0700993 }
Adam Langleyd9e397b2015-01-22 14:27:53 -0800994
Robert Sloan69939df2017-01-09 10:53:07 -0800995 /* 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. */
Robert Sloan69939df2017-01-09 10:53:07 -0800999 if (!BN_MONT_CTX_set_locked(&rsa->mont_p, &rsa->lock, rsa->p, ctx) ||
Steven Valdezb0b45c62017-01-17 16:23:54 -05001000 !bn_mod_inverse_secret_prime(rsa->iqmp, rsa->q, rsa->p, ctx,
1001 rsa->mont_p)) {
Robert Sloan572a4e22017-04-17 10:52:19 -07001002 goto bn_err;
Adam Langleye9ada862015-05-11 17:20:37 -07001003 }
Adam Langleyd9e397b2015-01-22 14:27:53 -08001004
Robert Sloan69939df2017-01-09 10:53:07 -08001005 /* 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. */
Robert Sloan572a4e22017-04-17 10:52:19 -07001008 if (!RSA_check_key(rsa)) {
Robert Sloan69939df2017-01-09 10:53:07 -08001009 OPENSSL_PUT_ERROR(RSA, RSA_R_INTERNAL_ERROR);
Robert Sloan572a4e22017-04-17 10:52:19 -07001010 goto err;
Robert Sloan69939df2017-01-09 10:53:07 -08001011 }
1012
Robert Sloan572a4e22017-04-17 10:52:19 -07001013 ret = 1;
1014
1015bn_err:
1016 if (!ret) {
Kenny Rootb8494592015-09-25 02:29:14 +00001017 OPENSSL_PUT_ERROR(RSA, ERR_LIB_BN);
Adam Langleyd9e397b2015-01-22 14:27:53 -08001018 }
Robert Sloan572a4e22017-04-17 10:52:19 -07001019err:
Adam Langleyd9e397b2015-01-22 14:27:53 -08001020 if (ctx != NULL) {
1021 BN_CTX_end(ctx);
1022 BN_CTX_free(ctx);
1023 }
Robert Sloan572a4e22017-04-17 10:52:19 -07001024 return ret;
Kenny Rootb8494592015-09-25 02:29:14 +00001025}
1026
David Benjamin4969cc92016-04-22 15:02:23 -04001027/* 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. */
Adam Langleyfad63272015-11-12 12:15:39 -08001030const RSA_METHOD RSA_default_method = {
Adam Langleyd9e397b2015-01-22 14:27:53 -08001031 {
1032 0 /* references */,
1033 1 /* is_static */,
1034 },
1035 NULL /* app_data */,
1036
1037 NULL /* init */,
Adam Langleyfad63272015-11-12 12:15:39 -08001038 NULL /* finish (defaults to rsa_default_finish) */,
Adam Langleyd9e397b2015-01-22 14:27:53 -08001039
Adam Langleyfad63272015-11-12 12:15:39 -08001040 NULL /* size (defaults to rsa_default_size) */,
Adam Langleyd9e397b2015-01-22 14:27:53 -08001041
1042 NULL /* sign */,
1043 NULL /* verify */,
1044
Adam Langleyfad63272015-11-12 12:15:39 -08001045 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 Langleyd9e397b2015-01-22 14:27:53 -08001049
Adam Langleyfad63272015-11-12 12:15:39 -08001050 NULL /* private_transform (defaults to rsa_default_private_transform) */,
Adam Langleyd9e397b2015-01-22 14:27:53 -08001051
David Benjamin4969cc92016-04-22 15:02:23 -04001052 NULL /* mod_exp (ignored) */,
1053 NULL /* bn_mod_exp (ignored) */,
Adam Langleyd9e397b2015-01-22 14:27:53 -08001054
1055 RSA_FLAG_CACHE_PUBLIC | RSA_FLAG_CACHE_PRIVATE,
1056
Adam Langleyfad63272015-11-12 12:15:39 -08001057 NULL /* keygen (defaults to rsa_default_keygen) */,
Robert Sloan572a4e22017-04-17 10:52:19 -07001058 NULL /* multi_prime_keygen (ignored) */,
Kenny Rootb8494592015-09-25 02:29:14 +00001059
1060 NULL /* supports_digest */,
Adam Langleyd9e397b2015-01-22 14:27:53 -08001061};