blob: 626bbe8585e620ad32a2b8fc6136950e746254e9 [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
Robert Sloan8f860b12017-08-28 07:37:06 -070083 // 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
David Benjamin4969cc92016-04-22 15:02:23 -040092 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
Robert Sloan8f860b12017-08-28 07:37:06 -070099 // 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.
David Benjamin4969cc92016-04-22 15:02:23 -0400103 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:
Robert Sloan8f860b12017-08-28 07:37:06 -0700157 // Use the default parameters: SHA-1 for both hashes and no label.
Adam Langleyd9e397b2015-01-22 14:27:53 -0800158 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) {
Robert Sloan8f860b12017-08-28 07:37:06 -0700178 // usually the padding functions would catch this
Robert Sloanf6200e72017-07-10 08:09:18 -0700179 OPENSSL_PUT_ERROR(RSA, RSA_R_DATA_TOO_LARGE);
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
Robert Sloan8f860b12017-08-28 07:37:06 -0700188 // put in leading 0 bytes if the number is less than the length of the
189 // modulus
Adam Langleyd9e397b2015-01-22 14:27:53 -0800190 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 }
Robert Sloan2e9e66a2017-09-25 09:08:29 -0700203 OPENSSL_free(buf);
Adam Langleyd9e397b2015-01-22 14:27:53 -0800204
205 return ret;
206}
207
Robert Sloan8f860b12017-08-28 07:37:06 -0700208// MAX_BLINDINGS_PER_RSA defines the maximum number of cached BN_BLINDINGs per
209// RSA*. Then this limit is exceeded, BN_BLINDING objects will be created and
210// destroyed as needed.
Adam Langleyd9e397b2015-01-22 14:27:53 -0800211#define MAX_BLINDINGS_PER_RSA 1024
212
Robert Sloan8f860b12017-08-28 07:37:06 -0700213// rsa_blinding_get returns a BN_BLINDING to use with |rsa|. It does this by
214// allocating one of the cached BN_BLINDING objects in |rsa->blindings|. If
215// none are free, the cache will be extended by a extra element and the new
216// BN_BLINDING is returned.
217//
218// On success, the index of the assigned BN_BLINDING is written to
219// |*index_used| and must be passed to |rsa_blinding_release| when finished.
Adam Langleyd9e397b2015-01-22 14:27:53 -0800220static BN_BLINDING *rsa_blinding_get(RSA *rsa, unsigned *index_used,
221 BN_CTX *ctx) {
David Benjamin4969cc92016-04-22 15:02:23 -0400222 assert(ctx != NULL);
223 assert(rsa->mont_n != NULL);
224
Adam Langleyd9e397b2015-01-22 14:27:53 -0800225 BN_BLINDING *ret = NULL;
226 BN_BLINDING **new_blindings;
227 uint8_t *new_blindings_inuse;
228 char overflow = 0;
229
Adam Langleye9ada862015-05-11 17:20:37 -0700230 CRYPTO_MUTEX_lock_write(&rsa->lock);
Adam Langleyd9e397b2015-01-22 14:27:53 -0800231
Adam Langleye9ada862015-05-11 17:20:37 -0700232 unsigned i;
233 for (i = 0; i < rsa->num_blindings; i++) {
234 if (rsa->blindings_inuse[i] == 0) {
235 rsa->blindings_inuse[i] = 1;
236 ret = rsa->blindings[i];
237 *index_used = i;
238 break;
Adam Langleyd9e397b2015-01-22 14:27:53 -0800239 }
240 }
241
242 if (ret != NULL) {
David Benjamind316cba2016-06-02 16:17:39 -0400243 CRYPTO_MUTEX_unlock_write(&rsa->lock);
Adam Langleyd9e397b2015-01-22 14:27:53 -0800244 return ret;
245 }
246
247 overflow = rsa->num_blindings >= MAX_BLINDINGS_PER_RSA;
248
Robert Sloan8f860b12017-08-28 07:37:06 -0700249 // We didn't find a free BN_BLINDING to use so increase the length of
250 // the arrays by one and use the newly created element.
Adam Langleyd9e397b2015-01-22 14:27:53 -0800251
David Benjamind316cba2016-06-02 16:17:39 -0400252 CRYPTO_MUTEX_unlock_write(&rsa->lock);
David Benjamin4969cc92016-04-22 15:02:23 -0400253 ret = BN_BLINDING_new();
Adam Langleyd9e397b2015-01-22 14:27:53 -0800254 if (ret == NULL) {
255 return NULL;
256 }
257
258 if (overflow) {
Robert Sloan8f860b12017-08-28 07:37:06 -0700259 // We cannot add any more cached BN_BLINDINGs so we use |ret|
260 // and mark it for destruction in |rsa_blinding_release|.
Adam Langleyd9e397b2015-01-22 14:27:53 -0800261 *index_used = MAX_BLINDINGS_PER_RSA;
262 return ret;
263 }
264
Adam Langleye9ada862015-05-11 17:20:37 -0700265 CRYPTO_MUTEX_lock_write(&rsa->lock);
Adam Langleyd9e397b2015-01-22 14:27:53 -0800266
267 new_blindings =
268 OPENSSL_malloc(sizeof(BN_BLINDING *) * (rsa->num_blindings + 1));
269 if (new_blindings == NULL) {
270 goto err1;
271 }
Robert Sloan69939df2017-01-09 10:53:07 -0800272 OPENSSL_memcpy(new_blindings, rsa->blindings,
Adam Langleyd9e397b2015-01-22 14:27:53 -0800273 sizeof(BN_BLINDING *) * rsa->num_blindings);
274 new_blindings[rsa->num_blindings] = ret;
275
276 new_blindings_inuse = OPENSSL_malloc(rsa->num_blindings + 1);
277 if (new_blindings_inuse == NULL) {
278 goto err2;
279 }
Robert Sloan69939df2017-01-09 10:53:07 -0800280 OPENSSL_memcpy(new_blindings_inuse, rsa->blindings_inuse, rsa->num_blindings);
Adam Langleyd9e397b2015-01-22 14:27:53 -0800281 new_blindings_inuse[rsa->num_blindings] = 1;
282 *index_used = rsa->num_blindings;
283
Adam Langleye9ada862015-05-11 17:20:37 -0700284 OPENSSL_free(rsa->blindings);
Adam Langleyd9e397b2015-01-22 14:27:53 -0800285 rsa->blindings = new_blindings;
Adam Langleye9ada862015-05-11 17:20:37 -0700286 OPENSSL_free(rsa->blindings_inuse);
Adam Langleyd9e397b2015-01-22 14:27:53 -0800287 rsa->blindings_inuse = new_blindings_inuse;
288 rsa->num_blindings++;
289
David Benjamind316cba2016-06-02 16:17:39 -0400290 CRYPTO_MUTEX_unlock_write(&rsa->lock);
Adam Langleyd9e397b2015-01-22 14:27:53 -0800291 return ret;
292
293err2:
294 OPENSSL_free(new_blindings);
295
296err1:
David Benjamind316cba2016-06-02 16:17:39 -0400297 CRYPTO_MUTEX_unlock_write(&rsa->lock);
Adam Langleyd9e397b2015-01-22 14:27:53 -0800298 BN_BLINDING_free(ret);
299 return NULL;
300}
301
Robert Sloan8f860b12017-08-28 07:37:06 -0700302// rsa_blinding_release marks the cached BN_BLINDING at the given index as free
303// for other threads to use.
Adam Langleyd9e397b2015-01-22 14:27:53 -0800304static void rsa_blinding_release(RSA *rsa, BN_BLINDING *blinding,
305 unsigned blinding_index) {
306 if (blinding_index == MAX_BLINDINGS_PER_RSA) {
Robert Sloan8f860b12017-08-28 07:37:06 -0700307 // This blinding wasn't cached.
Adam Langleyd9e397b2015-01-22 14:27:53 -0800308 BN_BLINDING_free(blinding);
309 return;
310 }
311
Adam Langleye9ada862015-05-11 17:20:37 -0700312 CRYPTO_MUTEX_lock_write(&rsa->lock);
Adam Langleyd9e397b2015-01-22 14:27:53 -0800313 rsa->blindings_inuse[blinding_index] = 0;
David Benjamind316cba2016-06-02 16:17:39 -0400314 CRYPTO_MUTEX_unlock_write(&rsa->lock);
Adam Langleyd9e397b2015-01-22 14:27:53 -0800315}
316
Robert Sloan8f860b12017-08-28 07:37:06 -0700317// signing
Adam Langleyfad63272015-11-12 12:15:39 -0800318int rsa_default_sign_raw(RSA *rsa, size_t *out_len, uint8_t *out,
319 size_t max_out, const uint8_t *in, size_t in_len,
320 int padding) {
Adam Langleyd9e397b2015-01-22 14:27:53 -0800321 const unsigned rsa_size = RSA_size(rsa);
322 uint8_t *buf = NULL;
323 int i, ret = 0;
324
325 if (max_out < rsa_size) {
Kenny Rootb8494592015-09-25 02:29:14 +0000326 OPENSSL_PUT_ERROR(RSA, RSA_R_OUTPUT_BUFFER_TOO_SMALL);
Adam Langleyd9e397b2015-01-22 14:27:53 -0800327 return 0;
328 }
329
330 buf = OPENSSL_malloc(rsa_size);
331 if (buf == NULL) {
Kenny Rootb8494592015-09-25 02:29:14 +0000332 OPENSSL_PUT_ERROR(RSA, ERR_R_MALLOC_FAILURE);
Adam Langleyd9e397b2015-01-22 14:27:53 -0800333 goto err;
334 }
335
336 switch (padding) {
337 case RSA_PKCS1_PADDING:
338 i = RSA_padding_add_PKCS1_type_1(buf, rsa_size, in, in_len);
339 break;
340 case RSA_NO_PADDING:
341 i = RSA_padding_add_none(buf, rsa_size, in, in_len);
342 break;
343 default:
Kenny Rootb8494592015-09-25 02:29:14 +0000344 OPENSSL_PUT_ERROR(RSA, RSA_R_UNKNOWN_PADDING_TYPE);
Adam Langleyd9e397b2015-01-22 14:27:53 -0800345 goto err;
346 }
347
348 if (i <= 0) {
349 goto err;
350 }
351
352 if (!RSA_private_transform(rsa, out, buf, rsa_size)) {
Adam Langleye9ada862015-05-11 17:20:37 -0700353 goto err;
Adam Langleyd9e397b2015-01-22 14:27:53 -0800354 }
355
356 *out_len = rsa_size;
357 ret = 1;
358
359err:
Robert Sloan2e9e66a2017-09-25 09:08:29 -0700360 OPENSSL_free(buf);
Adam Langleyd9e397b2015-01-22 14:27:53 -0800361
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 {
Robert Sloan8f860b12017-08-28 07:37:06 -0700379 // Allocate a temporary buffer to hold the padded plaintext.
Kenny Rootb8494592015-09-25 02:29:14 +0000380 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:
Robert Sloan8f860b12017-08-28 07:37:06 -0700402 // 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:
Robert Sloan2e9e66a2017-09-25 09:08:29 -0700420 if (padding != RSA_NO_PADDING) {
Adam Langleyd9e397b2015-01-22 14:27:53 -0800421 OPENSSL_free(buf);
422 }
423
424 return ret;
425}
426
David Benjamin4969cc92016-04-22 15:02:23 -0400427static int mod_exp(BIGNUM *r0, const BIGNUM *I, RSA *rsa, BN_CTX *ctx);
428
429int RSA_verify_raw(RSA *rsa, size_t *out_len, uint8_t *out, size_t max_out,
430 const uint8_t *in, size_t in_len, int padding) {
431 if (rsa->n == NULL || rsa->e == NULL) {
432 OPENSSL_PUT_ERROR(RSA, RSA_R_VALUE_MISSING);
433 return 0;
434 }
435
Adam Langleyd9e397b2015-01-22 14:27:53 -0800436 const unsigned rsa_size = RSA_size(rsa);
437 BIGNUM *f, *result;
Adam Langleyd9e397b2015-01-22 14:27:53 -0800438
439 if (max_out < rsa_size) {
Kenny Rootb8494592015-09-25 02:29:14 +0000440 OPENSSL_PUT_ERROR(RSA, RSA_R_OUTPUT_BUFFER_TOO_SMALL);
Adam Langleyd9e397b2015-01-22 14:27:53 -0800441 return 0;
442 }
443
David Benjamin4969cc92016-04-22 15:02:23 -0400444 if (in_len != rsa_size) {
445 OPENSSL_PUT_ERROR(RSA, RSA_R_DATA_LEN_NOT_EQUAL_TO_MOD_LEN);
Adam Langleyd9e397b2015-01-22 14:27:53 -0800446 return 0;
447 }
448
David Benjamin4969cc92016-04-22 15:02:23 -0400449 if (!check_modulus_and_exponent_sizes(rsa)) {
450 return 0;
Adam Langleyd9e397b2015-01-22 14:27:53 -0800451 }
452
David Benjamin4969cc92016-04-22 15:02:23 -0400453 BN_CTX *ctx = BN_CTX_new();
454 if (ctx == NULL) {
455 return 0;
456 }
457
458 int ret = 0;
459 uint8_t *buf = NULL;
460
Adam Langleyd9e397b2015-01-22 14:27:53 -0800461 BN_CTX_start(ctx);
462 f = BN_CTX_get(ctx);
463 result = BN_CTX_get(ctx);
David Benjamin4969cc92016-04-22 15:02:23 -0400464 if (f == NULL || result == NULL) {
465 OPENSSL_PUT_ERROR(RSA, ERR_R_MALLOC_FAILURE);
466 goto err;
467 }
468
Kenny Rootb8494592015-09-25 02:29:14 +0000469 if (padding == RSA_NO_PADDING) {
470 buf = out;
471 } else {
Robert Sloan8f860b12017-08-28 07:37:06 -0700472 // Allocate a temporary buffer to hold the padded plaintext.
Kenny Rootb8494592015-09-25 02:29:14 +0000473 buf = OPENSSL_malloc(rsa_size);
474 if (buf == NULL) {
475 OPENSSL_PUT_ERROR(RSA, ERR_R_MALLOC_FAILURE);
476 goto err;
477 }
478 }
Adam Langleyd9e397b2015-01-22 14:27:53 -0800479
480 if (BN_bin2bn(in, in_len, f) == NULL) {
481 goto err;
482 }
483
484 if (BN_ucmp(f, rsa->n) >= 0) {
Robert Sloanf6200e72017-07-10 08:09:18 -0700485 OPENSSL_PUT_ERROR(RSA, RSA_R_DATA_TOO_LARGE);
Adam Langleyd9e397b2015-01-22 14:27:53 -0800486 goto err;
487 }
488
David Benjamin4969cc92016-04-22 15:02:23 -0400489 if (!BN_MONT_CTX_set_locked(&rsa->mont_n, &rsa->lock, rsa->n, ctx) ||
490 !BN_mod_exp_mont(result, f, rsa->e, rsa->n, ctx, rsa->mont_n)) {
Adam Langleyd9e397b2015-01-22 14:27:53 -0800491 goto err;
492 }
493
494 if (!BN_bn2bin_padded(buf, rsa_size, result)) {
Kenny Rootb8494592015-09-25 02:29:14 +0000495 OPENSSL_PUT_ERROR(RSA, ERR_R_INTERNAL_ERROR);
Adam Langleyd9e397b2015-01-22 14:27:53 -0800496 goto err;
497 }
498
499 switch (padding) {
500 case RSA_PKCS1_PADDING:
Robert Sloan6f79a502017-04-03 09:16:40 -0700501 ret =
502 RSA_padding_check_PKCS1_type_1(out, out_len, rsa_size, buf, rsa_size);
Adam Langleyd9e397b2015-01-22 14:27:53 -0800503 break;
504 case RSA_NO_PADDING:
Robert Sloan6f79a502017-04-03 09:16:40 -0700505 ret = 1;
506 *out_len = rsa_size;
Adam Langleyd9e397b2015-01-22 14:27:53 -0800507 break;
508 default:
Kenny Rootb8494592015-09-25 02:29:14 +0000509 OPENSSL_PUT_ERROR(RSA, RSA_R_UNKNOWN_PADDING_TYPE);
Adam Langleyd9e397b2015-01-22 14:27:53 -0800510 goto err;
511 }
512
Robert Sloan6f79a502017-04-03 09:16:40 -0700513 if (!ret) {
Kenny Rootb8494592015-09-25 02:29:14 +0000514 OPENSSL_PUT_ERROR(RSA, RSA_R_PADDING_CHECK_FAILED);
Robert Sloan6f79a502017-04-03 09:16:40 -0700515 goto err;
Adam Langleyd9e397b2015-01-22 14:27:53 -0800516 }
517
518err:
David Benjamin4969cc92016-04-22 15:02:23 -0400519 BN_CTX_end(ctx);
520 BN_CTX_free(ctx);
521 if (buf != out) {
Adam Langleyd9e397b2015-01-22 14:27:53 -0800522 OPENSSL_free(buf);
523 }
524 return ret;
525}
526
Adam Langleyfad63272015-11-12 12:15:39 -0800527int rsa_default_private_transform(RSA *rsa, uint8_t *out, const uint8_t *in,
528 size_t len) {
Robert Sloane56da3e2017-06-26 08:26:42 -0700529 if (rsa->n == NULL || rsa->d == NULL) {
530 OPENSSL_PUT_ERROR(RSA, RSA_R_VALUE_MISSING);
531 return 0;
532 }
533
Adam Langleyd9e397b2015-01-22 14:27:53 -0800534 BIGNUM *f, *result;
535 BN_CTX *ctx = NULL;
536 unsigned blinding_index = 0;
537 BN_BLINDING *blinding = NULL;
538 int ret = 0;
539
540 ctx = BN_CTX_new();
541 if (ctx == NULL) {
542 goto err;
543 }
544 BN_CTX_start(ctx);
545 f = BN_CTX_get(ctx);
546 result = BN_CTX_get(ctx);
547
548 if (f == NULL || result == NULL) {
Kenny Rootb8494592015-09-25 02:29:14 +0000549 OPENSSL_PUT_ERROR(RSA, ERR_R_MALLOC_FAILURE);
Adam Langleyd9e397b2015-01-22 14:27:53 -0800550 goto err;
551 }
552
553 if (BN_bin2bn(in, len, f) == NULL) {
554 goto err;
555 }
556
557 if (BN_ucmp(f, rsa->n) >= 0) {
Robert Sloan8f860b12017-08-28 07:37:06 -0700558 // Usually the padding functions would catch this.
Robert Sloanf6200e72017-07-10 08:09:18 -0700559 OPENSSL_PUT_ERROR(RSA, RSA_R_DATA_TOO_LARGE);
Adam Langleyd9e397b2015-01-22 14:27:53 -0800560 goto err;
561 }
562
David Benjamin9aaebef2016-04-22 15:02:23 -0400563 if (!BN_MONT_CTX_set_locked(&rsa->mont_n, &rsa->lock, rsa->n, ctx)) {
564 OPENSSL_PUT_ERROR(RSA, ERR_R_INTERNAL_ERROR);
565 goto err;
566 }
567
Robert Sloan8ff03552017-06-14 12:40:58 -0700568 const int do_blinding = (rsa->flags & RSA_FLAG_NO_BLINDING) == 0;
David Benjamin9aaebef2016-04-22 15:02:23 -0400569
Robert Sloan8ff03552017-06-14 12:40:58 -0700570 if (rsa->e == NULL && do_blinding) {
Robert Sloan8f860b12017-08-28 07:37:06 -0700571 // We cannot do blinding or verification without |e|, and continuing without
572 // those countermeasures is dangerous. However, the Java/Android RSA API
573 // requires support for keys where only |d| and |n| (and not |e|) are known.
574 // The callers that require that bad behavior set |RSA_FLAG_NO_BLINDING|.
Robert Sloan8ff03552017-06-14 12:40:58 -0700575 OPENSSL_PUT_ERROR(RSA, RSA_R_NO_PUBLIC_EXPONENT);
576 goto err;
577 }
David Benjamin4969cc92016-04-22 15:02:23 -0400578
Robert Sloan8ff03552017-06-14 12:40:58 -0700579 if (do_blinding) {
Adam Langleyd9e397b2015-01-22 14:27:53 -0800580 blinding = rsa_blinding_get(rsa, &blinding_index, ctx);
581 if (blinding == NULL) {
Kenny Rootb8494592015-09-25 02:29:14 +0000582 OPENSSL_PUT_ERROR(RSA, ERR_R_INTERNAL_ERROR);
Adam Langleyd9e397b2015-01-22 14:27:53 -0800583 goto err;
584 }
David Benjamin4969cc92016-04-22 15:02:23 -0400585 if (!BN_BLINDING_convert(f, blinding, rsa->e, rsa->mont_n, ctx)) {
Adam Langleyd9e397b2015-01-22 14:27:53 -0800586 goto err;
587 }
588 }
589
David Benjamin4969cc92016-04-22 15:02:23 -0400590 if (rsa->p != NULL && rsa->q != NULL && rsa->e != NULL && rsa->dmp1 != NULL &&
591 rsa->dmq1 != NULL && rsa->iqmp != NULL) {
592 if (!mod_exp(result, f, rsa, ctx)) {
Adam Langleyd9e397b2015-01-22 14:27:53 -0800593 goto err;
594 }
Robert Sloan69939df2017-01-09 10:53:07 -0800595 } else if (!BN_mod_exp_mont_consttime(result, f, rsa->d, rsa->n, ctx,
596 rsa->mont_n)) {
597 goto err;
Adam Langleyd9e397b2015-01-22 14:27:53 -0800598 }
599
Robert Sloan8f860b12017-08-28 07:37:06 -0700600 // Verify the result to protect against fault attacks as described in the
601 // 1997 paper "On the Importance of Checking Cryptographic Protocols for
602 // Faults" by Dan Boneh, Richard A. DeMillo, and Richard J. Lipton. Some
603 // implementations do this only when the CRT is used, but we do it in all
604 // cases. Section 6 of the aforementioned paper describes an attack that
605 // works when the CRT isn't used. That attack is much less likely to succeed
606 // than the CRT attack, but there have likely been improvements since 1997.
607 //
608 // This check is cheap assuming |e| is small; it almost always is.
Robert Sloan8ff03552017-06-14 12:40:58 -0700609 if (rsa->e != NULL) {
David Benjamin9aaebef2016-04-22 15:02:23 -0400610 BIGNUM *vrfy = BN_CTX_get(ctx);
611 if (vrfy == NULL ||
612 !BN_mod_exp_mont(vrfy, result, rsa->e, rsa->n, ctx, rsa->mont_n) ||
613 !BN_equal_consttime(vrfy, f)) {
614 OPENSSL_PUT_ERROR(RSA, ERR_R_INTERNAL_ERROR);
615 goto err;
616 }
617
Robert Sloan8ff03552017-06-14 12:40:58 -0700618 }
619
620 if (do_blinding &&
621 !BN_BLINDING_invert(result, blinding, rsa->mont_n, ctx)) {
622 goto err;
Adam Langleyd9e397b2015-01-22 14:27:53 -0800623 }
624
625 if (!BN_bn2bin_padded(out, len, result)) {
Kenny Rootb8494592015-09-25 02:29:14 +0000626 OPENSSL_PUT_ERROR(RSA, ERR_R_INTERNAL_ERROR);
Adam Langleyd9e397b2015-01-22 14:27:53 -0800627 goto err;
628 }
629
630 ret = 1;
631
632err:
633 if (ctx != NULL) {
634 BN_CTX_end(ctx);
635 BN_CTX_free(ctx);
636 }
637 if (blinding != NULL) {
638 rsa_blinding_release(rsa, blinding, blinding_index);
639 }
640
641 return ret;
642}
643
Robert Sloan55818102017-12-18 11:26:17 -0800644// mod_montgomery sets |r| to |I| mod |p|. |I| must already be fully reduced
645// modulo |p| times |q|. It returns one on success and zero on error.
646static int mod_montgomery(BIGNUM *r, const BIGNUM *I, const BIGNUM *p,
647 const BN_MONT_CTX *mont_p, const BIGNUM *q,
648 BN_CTX *ctx) {
Robert Sloan8542c082018-02-05 09:07:34 -0800649 // Reducing in constant-time with Montgomery reduction requires I <= p * R. We
650 // have I < p * q, so this follows if q < R. In particular, this always holds
651 // if p and q are the same size, which is true for any RSA keys we or anyone
652 // sane generates. For other keys, we fall back to |BN_mod|.
653 if (!bn_less_than_montgomery_R(q, mont_p)) {
Robert Sloan55818102017-12-18 11:26:17 -0800654 return BN_mod(r, I, p, ctx);
655 }
656
657 if (// Reduce mod p with Montgomery reduction. This computes I * R^-1 mod p.
658 !BN_from_montgomery(r, I, mont_p, ctx) ||
659 // Multiply by R^2 and do another Montgomery reduction to compute
660 // I * R^-1 * R^2 * R^-1 = I mod p.
661 !BN_to_montgomery(r, r, mont_p, ctx)) {
662 return 0;
663 }
664
665 // By precomputing R^3 mod p (normally |BN_MONT_CTX| only uses R^2 mod p) and
666 // adjusting the API for |BN_mod_exp_mont_consttime|, we could instead compute
667 // I * R mod p here and save a reduction per prime. But this would require
668 // changing the RSAZ code and may not be worth it.
669 return 1;
670}
671
Adam Langleyd9e397b2015-01-22 14:27:53 -0800672static int mod_exp(BIGNUM *r0, const BIGNUM *I, RSA *rsa, BN_CTX *ctx) {
David Benjamin4969cc92016-04-22 15:02:23 -0400673 assert(ctx != NULL);
674
675 assert(rsa->n != NULL);
676 assert(rsa->e != NULL);
677 assert(rsa->d != NULL);
678 assert(rsa->p != NULL);
679 assert(rsa->q != NULL);
680 assert(rsa->dmp1 != NULL);
681 assert(rsa->dmq1 != NULL);
682 assert(rsa->iqmp != NULL);
683
Adam Langleyd9e397b2015-01-22 14:27:53 -0800684 BIGNUM *r1, *m1, *vrfy;
Adam Langleyd9e397b2015-01-22 14:27:53 -0800685 int ret = 0;
686
687 BN_CTX_start(ctx);
688 r1 = BN_CTX_get(ctx);
689 m1 = BN_CTX_get(ctx);
690 vrfy = BN_CTX_get(ctx);
David Benjamin4969cc92016-04-22 15:02:23 -0400691 if (r1 == NULL ||
692 m1 == NULL ||
693 vrfy == NULL) {
694 goto err;
695 }
Adam Langleyd9e397b2015-01-22 14:27:53 -0800696
Robert Sloan69939df2017-01-09 10:53:07 -0800697 if (!BN_MONT_CTX_set_locked(&rsa->mont_p, &rsa->lock, rsa->p, ctx) ||
698 !BN_MONT_CTX_set_locked(&rsa->mont_q, &rsa->lock, rsa->q, ctx)) {
699 goto err;
Adam Langleyd9e397b2015-01-22 14:27:53 -0800700 }
701
David Benjamin4969cc92016-04-22 15:02:23 -0400702 if (!BN_MONT_CTX_set_locked(&rsa->mont_n, &rsa->lock, rsa->n, ctx)) {
703 goto err;
Adam Langleyd9e397b2015-01-22 14:27:53 -0800704 }
705
Robert Sloan55818102017-12-18 11:26:17 -0800706 // This is a pre-condition for |mod_montgomery|. It was already checked by the
707 // caller.
708 assert(BN_ucmp(I, rsa->n) < 0);
709
Robert Sloan8f860b12017-08-28 07:37:06 -0700710 // compute I mod q
Robert Sloan55818102017-12-18 11:26:17 -0800711 if (!mod_montgomery(r1, I, rsa->q, rsa->mont_q, rsa->p, ctx)) {
Adam Langleyd9e397b2015-01-22 14:27:53 -0800712 goto err;
713 }
714
Robert Sloan8f860b12017-08-28 07:37:06 -0700715 // compute r1^dmq1 mod q
Robert Sloan69939df2017-01-09 10:53:07 -0800716 if (!BN_mod_exp_mont_consttime(m1, r1, rsa->dmq1, rsa->q, ctx, rsa->mont_q)) {
Adam Langleyd9e397b2015-01-22 14:27:53 -0800717 goto err;
718 }
719
Robert Sloan8f860b12017-08-28 07:37:06 -0700720 // compute I mod p
Robert Sloan55818102017-12-18 11:26:17 -0800721 if (!mod_montgomery(r1, I, rsa->p, rsa->mont_p, rsa->q, ctx)) {
Adam Langleyd9e397b2015-01-22 14:27:53 -0800722 goto err;
723 }
724
Robert Sloan8f860b12017-08-28 07:37:06 -0700725 // compute r1^dmp1 mod p
Robert Sloan69939df2017-01-09 10:53:07 -0800726 if (!BN_mod_exp_mont_consttime(r0, r1, rsa->dmp1, rsa->p, ctx, rsa->mont_p)) {
Adam Langleyd9e397b2015-01-22 14:27:53 -0800727 goto err;
728 }
729
Robert Sloan55818102017-12-18 11:26:17 -0800730 // TODO(davidben): The code below is not constant-time, even ignoring
731 // |bn_correct_top|. To fix this:
732 //
733 // 1. Canonicalize keys on p > q. (p > q for keys we generate, but not ones we
734 // import.) We have exposed structs, but we can generalize the
735 // |BN_MONT_CTX_set_locked| trick to do a one-time canonicalization of the
736 // private key where we optionally swap p and q (re-computing iqmp if
737 // necessary) and fill in mont_*. This removes the p < q case below.
738 //
739 // 2. Compute r0 - m1 (mod p) in constant-time. With (1) done, this is just a
740 // constant-time modular subtraction. It should be doable with
741 // |bn_sub_words| and a select on the borrow bit.
742 //
743 // 3. When computing mont_*, additionally compute iqmp_mont, iqmp in
744 // Montgomery form. The |BN_mul| and |BN_mod| pair can then be replaced
745 // with |BN_mod_mul_montgomery|.
746
Adam Langleyd9e397b2015-01-22 14:27:53 -0800747 if (!BN_sub(r0, r0, m1)) {
748 goto err;
749 }
Robert Sloan8f860b12017-08-28 07:37:06 -0700750 // This will help stop the size of r0 increasing, which does
751 // affect the multiply if it optimised for a power of 2 size
Adam Langleyd9e397b2015-01-22 14:27:53 -0800752 if (BN_is_negative(r0)) {
753 if (!BN_add(r0, r0, rsa->p)) {
754 goto err;
755 }
756 }
757
758 if (!BN_mul(r1, r0, rsa->iqmp, ctx)) {
759 goto err;
760 }
761
Robert Sloan69939df2017-01-09 10:53:07 -0800762 if (!BN_mod(r0, r1, rsa->p, ctx)) {
Adam Langleyd9e397b2015-01-22 14:27:53 -0800763 goto err;
764 }
765
Robert Sloan8f860b12017-08-28 07:37:06 -0700766 // If p < q it is occasionally possible for the correction of
767 // adding 'p' if r0 is negative above to leave the result still
768 // negative. This can break the private key operations: the following
769 // second correction should *always* correct this rare occurrence.
770 // This will *never* happen with OpenSSL generated keys because
771 // they ensure p > q [steve]
Adam Langleyd9e397b2015-01-22 14:27:53 -0800772 if (BN_is_negative(r0)) {
773 if (!BN_add(r0, r0, rsa->p)) {
774 goto err;
775 }
776 }
777 if (!BN_mul(r1, r0, rsa->q, ctx)) {
778 goto err;
779 }
780 if (!BN_add(r0, r1, m1)) {
781 goto err;
782 }
783
Adam Langleyd9e397b2015-01-22 14:27:53 -0800784 ret = 1;
785
786err:
787 BN_CTX_end(ctx);
788 return ret;
789}
790
Robert Sloan572a4e22017-04-17 10:52:19 -0700791static int ensure_bignum(BIGNUM **out) {
792 if (*out == NULL) {
793 *out = BN_new();
794 }
795 return *out != NULL;
796}
Kenny Rootb8494592015-09-25 02:29:14 +0000797
Robert Sloan8f860b12017-08-28 07:37:06 -0700798// kBoringSSLRSASqrtTwo is the BIGNUM representation of ⌊2¹⁵³⁵×√2⌋. This is
799// chosen to give enough precision for 3072-bit RSA, the largest key size FIPS
800// specifies. Key sizes beyond this will round up.
801//
802// To verify this number, check that n² < 2³⁰⁷¹ < (n+1)², where n is value
803// represented here. Note the components are listed in little-endian order. Here
804// is some sample Python code to check:
805//
806// >>> TOBN = lambda a, b: a << 32 | b
807// >>> l = [ <paste the contents of kSqrtTwo> ]
808// >>> n = sum(a * 2**(64*i) for i, a in enumerate(l))
809// >>> n**2 < 2**3071 < (n+1)**2
810// True
Robert Sloan572a4e22017-04-17 10:52:19 -0700811const BN_ULONG kBoringSSLRSASqrtTwo[] = {
812 TOBN(0xdea06241, 0xf7aa81c2), TOBN(0xf6a1be3f, 0xca221307),
813 TOBN(0x332a5e9f, 0x7bda1ebf), TOBN(0x0104dc01, 0xfe32352f),
814 TOBN(0xb8cf341b, 0x6f8236c7), TOBN(0x4264dabc, 0xd528b651),
815 TOBN(0xf4d3a02c, 0xebc93e0c), TOBN(0x81394ab6, 0xd8fd0efd),
816 TOBN(0xeaa4a089, 0x9040ca4a), TOBN(0xf52f120f, 0x836e582e),
817 TOBN(0xcb2a6343, 0x31f3c84d), TOBN(0xc6d5a8a3, 0x8bb7e9dc),
818 TOBN(0x460abc72, 0x2f7c4e33), TOBN(0xcab1bc91, 0x1688458a),
819 TOBN(0x53059c60, 0x11bc337b), TOBN(0xd2202e87, 0x42af1f4e),
820 TOBN(0x78048736, 0x3dfa2768), TOBN(0x0f74a85e, 0x439c7b4a),
821 TOBN(0xa8b1fe6f, 0xdc83db39), TOBN(0x4afc8304, 0x3ab8a2c3),
822 TOBN(0xed17ac85, 0x83339915), TOBN(0x1d6f60ba, 0x893ba84c),
823 TOBN(0x597d89b3, 0x754abe9f), TOBN(0xb504f333, 0xf9de6484),
824};
825const size_t kBoringSSLRSASqrtTwoLen = OPENSSL_ARRAY_SIZE(kBoringSSLRSASqrtTwo);
826
Robert Sloan572a4e22017-04-17 10:52:19 -0700827int rsa_greater_than_pow2(const BIGNUM *b, int n) {
828 if (BN_is_negative(b) || n == INT_MAX) {
829 return 0;
830 }
831
832 int b_bits = BN_num_bits(b);
833 return b_bits > n + 1 || (b_bits == n + 1 && !BN_is_pow2(b));
834}
835
Robert Sloan8f860b12017-08-28 07:37:06 -0700836// generate_prime sets |out| to a prime with length |bits| such that |out|-1 is
837// relatively prime to |e|. If |p| is non-NULL, |out| will also not be close to
838// |p|.
Robert Sloan572a4e22017-04-17 10:52:19 -0700839static int generate_prime(BIGNUM *out, int bits, const BIGNUM *e,
Robert Sloan8542c082018-02-05 09:07:34 -0800840 const BIGNUM *p, const BIGNUM *sqrt2, BN_CTX *ctx,
841 BN_GENCB *cb) {
Robert Sloan572a4e22017-04-17 10:52:19 -0700842 if (bits < 128 || (bits % BN_BITS2) != 0) {
843 OPENSSL_PUT_ERROR(RSA, ERR_R_INTERNAL_ERROR);
844 return 0;
845 }
846
Robert Sloanb1b54b82017-11-06 13:50:02 -0800847 // See FIPS 186-4 appendix B.3.3, steps 4 and 5. Note |bits| here is nlen/2.
848
849 // Use the limit from steps 4.7 and 5.8 for most values of |e|. When |e| is 3,
850 // the 186-4 limit is too low, so we use a higher one. Note this case is not
851 // reachable from |RSA_generate_key_fips|.
852 if (bits >= INT_MAX/32) {
Robert Sloan572a4e22017-04-17 10:52:19 -0700853 OPENSSL_PUT_ERROR(RSA, RSA_R_MODULUS_TOO_LARGE);
854 return 0;
855 }
Robert Sloanb1b54b82017-11-06 13:50:02 -0800856 int limit = BN_is_word(e, 3) ? bits * 32 : bits * 5;
Robert Sloan572a4e22017-04-17 10:52:19 -0700857
858 int ret = 0, tries = 0, rand_tries = 0;
859 BN_CTX_start(ctx);
860 BIGNUM *tmp = BN_CTX_get(ctx);
861 if (tmp == NULL) {
Kenny Rootb8494592015-09-25 02:29:14 +0000862 goto err;
863 }
Adam Langleyd9e397b2015-01-22 14:27:53 -0800864
Robert Sloan572a4e22017-04-17 10:52:19 -0700865 for (;;) {
Robert Sloan8f860b12017-08-28 07:37:06 -0700866 // Generate a random number of length |bits| where the bottom bit is set
867 // (steps 4.2, 4.3, 5.2 and 5.3) and the top bit is set (implied by the
868 // bound checked below in steps 4.4 and 5.5).
Robert Sloan572a4e22017-04-17 10:52:19 -0700869 if (!BN_rand(out, bits, BN_RAND_TOP_ONE, BN_RAND_BOTTOM_ODD) ||
870 !BN_GENCB_call(cb, BN_GENCB_GENERATED, rand_tries++)) {
871 goto err;
872 }
873
874 if (p != NULL) {
Robert Sloan8f860b12017-08-28 07:37:06 -0700875 // If |p| and |out| are too close, try again (step 5.4).
Robert Sloan572a4e22017-04-17 10:52:19 -0700876 if (!BN_sub(tmp, out, p)) {
877 goto err;
878 }
879 BN_set_negative(tmp, 0);
880 if (!rsa_greater_than_pow2(tmp, bits - 100)) {
881 continue;
882 }
883 }
884
Robert Sloan8542c082018-02-05 09:07:34 -0800885 // If out < 2^(bits-1)×√2, try again (steps 4.4 and 5.5). This is equivalent
886 // to out <= ⌊2^(bits-1)×√2⌋, or out <= sqrt2 for FIPS key sizes.
Robert Sloan8f860b12017-08-28 07:37:06 -0700887 //
888 // For larger keys, the comparison is approximate, leaning towards
889 // retrying. That is, we reject a negligible fraction of primes that are
890 // within the FIPS bound, but we will never accept a prime outside the
Robert Sloan8542c082018-02-05 09:07:34 -0800891 // bound, ensuring the resulting RSA key is the right size.
892 if (!BN_less_than_consttime(sqrt2, out)) {
Robert Sloan572a4e22017-04-17 10:52:19 -0700893 continue;
894 }
895
Robert Sloan8f860b12017-08-28 07:37:06 -0700896 // Check gcd(out-1, e) is one (steps 4.5 and 5.6).
Robert Sloan572a4e22017-04-17 10:52:19 -0700897 if (!BN_sub(tmp, out, BN_value_one()) ||
898 !BN_gcd(tmp, tmp, e, ctx)) {
899 goto err;
900 }
901 if (BN_is_one(tmp)) {
Robert Sloan8f860b12017-08-28 07:37:06 -0700902 // Test |out| for primality (steps 4.5.1 and 5.6.1).
Robert Sloan572a4e22017-04-17 10:52:19 -0700903 int is_probable_prime;
904 if (!BN_primality_test(&is_probable_prime, out, BN_prime_checks, ctx, 1,
905 cb)) {
906 goto err;
907 }
908 if (is_probable_prime) {
909 ret = 1;
910 goto err;
911 }
912 }
913
Robert Sloan8f860b12017-08-28 07:37:06 -0700914 // If we've tried too many times to find a prime, abort (steps 4.7 and
915 // 5.8).
Robert Sloan572a4e22017-04-17 10:52:19 -0700916 tries++;
Robert Sloanb1b54b82017-11-06 13:50:02 -0800917 if (tries >= limit) {
Robert Sloan572a4e22017-04-17 10:52:19 -0700918 OPENSSL_PUT_ERROR(RSA, RSA_R_TOO_MANY_ITERATIONS);
919 goto err;
920 }
921 if (!BN_GENCB_call(cb, 2, tries)) {
922 goto err;
923 }
924 }
925
926err:
927 BN_CTX_end(ctx);
928 return ret;
929}
930
Robert Sloan8ff03552017-06-14 12:40:58 -0700931int RSA_generate_key_ex(RSA *rsa, int bits, BIGNUM *e_value, BN_GENCB *cb) {
Robert Sloan8f860b12017-08-28 07:37:06 -0700932 // See FIPS 186-4 appendix B.3. This function implements a generalized version
933 // of the FIPS algorithm. |RSA_generate_key_fips| performs additional checks
934 // for FIPS-compliant key generation.
Robert Sloan572a4e22017-04-17 10:52:19 -0700935
Robert Sloan8f860b12017-08-28 07:37:06 -0700936 // Always generate RSA keys which are a multiple of 128 bits. Round |bits|
937 // down as needed.
Robert Sloan572a4e22017-04-17 10:52:19 -0700938 bits &= ~127;
939
Robert Sloan8f860b12017-08-28 07:37:06 -0700940 // Reject excessively small keys.
Robert Sloan572a4e22017-04-17 10:52:19 -0700941 if (bits < 256) {
942 OPENSSL_PUT_ERROR(RSA, RSA_R_KEY_SIZE_TOO_SMALL);
943 return 0;
944 }
945
946 int ret = 0;
947 BN_CTX *ctx = BN_CTX_new();
Adam Langleyd9e397b2015-01-22 14:27:53 -0800948 if (ctx == NULL) {
Robert Sloan572a4e22017-04-17 10:52:19 -0700949 goto bn_err;
Adam Langleyd9e397b2015-01-22 14:27:53 -0800950 }
951 BN_CTX_start(ctx);
Robert Sloan8ff03552017-06-14 12:40:58 -0700952 BIGNUM *totient = BN_CTX_get(ctx);
953 BIGNUM *pm1 = BN_CTX_get(ctx);
954 BIGNUM *qm1 = BN_CTX_get(ctx);
955 BIGNUM *gcd = BN_CTX_get(ctx);
Robert Sloan8542c082018-02-05 09:07:34 -0800956 BIGNUM *sqrt2 = BN_CTX_get(ctx);
957 if (totient == NULL || pm1 == NULL || qm1 == NULL || gcd == NULL ||
958 sqrt2 == NULL) {
Robert Sloan572a4e22017-04-17 10:52:19 -0700959 goto bn_err;
Adam Langleyd9e397b2015-01-22 14:27:53 -0800960 }
961
Robert Sloan8f860b12017-08-28 07:37:06 -0700962 // We need the RSA components non-NULL.
Robert Sloan572a4e22017-04-17 10:52:19 -0700963 if (!ensure_bignum(&rsa->n) ||
964 !ensure_bignum(&rsa->d) ||
965 !ensure_bignum(&rsa->e) ||
966 !ensure_bignum(&rsa->p) ||
967 !ensure_bignum(&rsa->q) ||
968 !ensure_bignum(&rsa->dmp1) ||
969 !ensure_bignum(&rsa->dmq1) ||
970 !ensure_bignum(&rsa->iqmp)) {
971 goto bn_err;
Adam Langleye9ada862015-05-11 17:20:37 -0700972 }
Adam Langleyd9e397b2015-01-22 14:27:53 -0800973
Kenny Rootb8494592015-09-25 02:29:14 +0000974 if (!BN_copy(rsa->e, e_value)) {
Robert Sloan572a4e22017-04-17 10:52:19 -0700975 goto bn_err;
Kenny Rootb8494592015-09-25 02:29:14 +0000976 }
Adam Langleyd9e397b2015-01-22 14:27:53 -0800977
Robert Sloan572a4e22017-04-17 10:52:19 -0700978 int prime_bits = bits / 2;
Robert Sloan8542c082018-02-05 09:07:34 -0800979
980 // Compute sqrt2 >= ⌊2^(prime_bits-1)×√2⌋.
981 if (!bn_set_words(sqrt2, kBoringSSLRSASqrtTwo, kBoringSSLRSASqrtTwoLen)) {
982 goto bn_err;
983 }
984 int sqrt2_bits = kBoringSSLRSASqrtTwoLen * BN_BITS2;
985 assert(sqrt2_bits == (int)BN_num_bits(sqrt2));
986 if (sqrt2_bits > prime_bits) {
987 // For key sizes up to 3072 (prime_bits = 1536), this is exactly
988 // ⌊2^(prime_bits-1)×√2⌋.
989 if (!BN_rshift(sqrt2, sqrt2, sqrt2_bits - prime_bits)) {
990 goto bn_err;
991 }
992 } else if (prime_bits > sqrt2_bits) {
993 // For key sizes beyond 3072, this is approximate. We err towards retrying
994 // to ensure our key is the right size and round up.
995 if (!BN_add_word(sqrt2, 1) ||
996 !BN_lshift(sqrt2, sqrt2, prime_bits - sqrt2_bits)) {
997 goto bn_err;
998 }
999 }
1000 assert(prime_bits == (int)BN_num_bits(sqrt2));
1001
Robert Sloan572a4e22017-04-17 10:52:19 -07001002 do {
Robert Sloan8f860b12017-08-28 07:37:06 -07001003 // Generate p and q, each of size |prime_bits|, using the steps outlined in
1004 // appendix FIPS 186-4 appendix B.3.3.
Robert Sloan8542c082018-02-05 09:07:34 -08001005 if (!generate_prime(rsa->p, prime_bits, rsa->e, NULL, sqrt2, ctx, cb) ||
Robert Sloan572a4e22017-04-17 10:52:19 -07001006 !BN_GENCB_call(cb, 3, 0) ||
Robert Sloan8542c082018-02-05 09:07:34 -08001007 !generate_prime(rsa->q, prime_bits, rsa->e, rsa->p, sqrt2, ctx, cb) ||
Robert Sloan572a4e22017-04-17 10:52:19 -07001008 !BN_GENCB_call(cb, 3, 1)) {
1009 goto bn_err;
Kenny Rootb8494592015-09-25 02:29:14 +00001010 }
1011
Robert Sloan572a4e22017-04-17 10:52:19 -07001012 if (BN_cmp(rsa->p, rsa->q) < 0) {
1013 BIGNUM *tmp = rsa->p;
1014 rsa->p = rsa->q;
1015 rsa->q = tmp;
Kenny Rootb8494592015-09-25 02:29:14 +00001016 }
1017
Robert Sloan8f860b12017-08-28 07:37:06 -07001018 // Calculate d = e^(-1) (mod lcm(p-1, q-1)), per FIPS 186-4. This differs
1019 // from typical RSA implementations which use (p-1)*(q-1).
1020 //
1021 // Note this means the size of d might reveal information about p-1 and
1022 // q-1. However, we do operations with Chinese Remainder Theorem, so we only
1023 // use d (mod p-1) and d (mod q-1) as exponents. Using a minimal totient
1024 // does not affect those two values.
Robert Sloan8ff03552017-06-14 12:40:58 -07001025 if (!BN_sub(pm1, rsa->p, BN_value_one()) ||
1026 !BN_sub(qm1, rsa->q, BN_value_one()) ||
1027 !BN_mul(totient, pm1, qm1, ctx) ||
1028 !BN_gcd(gcd, pm1, qm1, ctx) ||
1029 !BN_div(totient, NULL, totient, gcd, ctx) ||
1030 !BN_mod_inverse(rsa->d, rsa->e, totient, ctx)) {
Robert Sloan572a4e22017-04-17 10:52:19 -07001031 goto bn_err;
Kenny Rootb8494592015-09-25 02:29:14 +00001032 }
Robert Sloan572a4e22017-04-17 10:52:19 -07001033
Robert Sloan8f860b12017-08-28 07:37:06 -07001034 // Check that |rsa->d| > 2^|prime_bits| and try again if it fails. See
1035 // appendix B.3.1's guidance on values for d.
Robert Sloan572a4e22017-04-17 10:52:19 -07001036 } while (!rsa_greater_than_pow2(rsa->d, prime_bits));
1037
Robert Sloan8f860b12017-08-28 07:37:06 -07001038 if (// Calculate n.
Robert Sloan572a4e22017-04-17 10:52:19 -07001039 !BN_mul(rsa->n, rsa->p, rsa->q, ctx) ||
Robert Sloan8f860b12017-08-28 07:37:06 -07001040 // Calculate d mod (p-1).
Robert Sloan8ff03552017-06-14 12:40:58 -07001041 !BN_mod(rsa->dmp1, rsa->d, pm1, ctx) ||
Robert Sloan8f860b12017-08-28 07:37:06 -07001042 // Calculate d mod (q-1)
Robert Sloan8ff03552017-06-14 12:40:58 -07001043 !BN_mod(rsa->dmq1, rsa->d, qm1, ctx)) {
Robert Sloan572a4e22017-04-17 10:52:19 -07001044 goto bn_err;
Kenny Rootb8494592015-09-25 02:29:14 +00001045 }
1046
Robert Sloan8f860b12017-08-28 07:37:06 -07001047 // Sanity-check that |rsa->n| has the specified size. This is implied by
1048 // |generate_prime|'s bounds.
Robert Sloan572a4e22017-04-17 10:52:19 -07001049 if (BN_num_bits(rsa->n) != (unsigned)bits) {
1050 OPENSSL_PUT_ERROR(RSA, ERR_R_INTERNAL_ERROR);
Adam Langleyd9e397b2015-01-22 14:27:53 -08001051 goto err;
Adam Langleye9ada862015-05-11 17:20:37 -07001052 }
Adam Langleyd9e397b2015-01-22 14:27:53 -08001053
Robert Sloan8f860b12017-08-28 07:37:06 -07001054 // Calculate inverse of q mod p. Note that although RSA key generation is far
1055 // from constant-time, |bn_mod_inverse_secret_prime| uses the same modular
1056 // exponentation logic as in RSA private key operations and, if the RSAZ-1024
1057 // code is enabled, will be optimized for common RSA prime sizes.
Robert Sloan69939df2017-01-09 10:53:07 -08001058 if (!BN_MONT_CTX_set_locked(&rsa->mont_p, &rsa->lock, rsa->p, ctx) ||
Steven Valdezb0b45c62017-01-17 16:23:54 -05001059 !bn_mod_inverse_secret_prime(rsa->iqmp, rsa->q, rsa->p, ctx,
1060 rsa->mont_p)) {
Robert Sloan572a4e22017-04-17 10:52:19 -07001061 goto bn_err;
Adam Langleye9ada862015-05-11 17:20:37 -07001062 }
Adam Langleyd9e397b2015-01-22 14:27:53 -08001063
Robert Sloan8f860b12017-08-28 07:37:06 -07001064 // The key generation process is complex and thus error-prone. It could be
1065 // disastrous to generate and then use a bad key so double-check that the key
1066 // makes sense.
Robert Sloan572a4e22017-04-17 10:52:19 -07001067 if (!RSA_check_key(rsa)) {
Robert Sloan69939df2017-01-09 10:53:07 -08001068 OPENSSL_PUT_ERROR(RSA, RSA_R_INTERNAL_ERROR);
Robert Sloan572a4e22017-04-17 10:52:19 -07001069 goto err;
Robert Sloan69939df2017-01-09 10:53:07 -08001070 }
1071
Robert Sloan572a4e22017-04-17 10:52:19 -07001072 ret = 1;
1073
1074bn_err:
1075 if (!ret) {
Kenny Rootb8494592015-09-25 02:29:14 +00001076 OPENSSL_PUT_ERROR(RSA, ERR_LIB_BN);
Adam Langleyd9e397b2015-01-22 14:27:53 -08001077 }
Robert Sloan572a4e22017-04-17 10:52:19 -07001078err:
Adam Langleyd9e397b2015-01-22 14:27:53 -08001079 if (ctx != NULL) {
1080 BN_CTX_end(ctx);
1081 BN_CTX_free(ctx);
1082 }
Robert Sloan572a4e22017-04-17 10:52:19 -07001083 return ret;
Kenny Rootb8494592015-09-25 02:29:14 +00001084}
1085
Robert Sloan8ff03552017-06-14 12:40:58 -07001086int RSA_generate_key_fips(RSA *rsa, int bits, BN_GENCB *cb) {
Robert Sloan8f860b12017-08-28 07:37:06 -07001087 // FIPS 186-4 allows 2048-bit and 3072-bit RSA keys (1024-bit and 1536-bit
1088 // primes, respectively) with the prime generation method we use.
Robert Sloan8ff03552017-06-14 12:40:58 -07001089 if (bits != 2048 && bits != 3072) {
1090 OPENSSL_PUT_ERROR(RSA, RSA_R_BAD_RSA_PARAMETERS);
1091 return 0;
1092 }
Adam Langleyd9e397b2015-01-22 14:27:53 -08001093
Robert Sloan8ff03552017-06-14 12:40:58 -07001094 BIGNUM *e = BN_new();
1095 int ret = e != NULL &&
1096 BN_set_word(e, RSA_F4) &&
1097 RSA_generate_key_ex(rsa, bits, e, cb) &&
1098 RSA_check_fips(rsa);
1099 BN_free(e);
1100 return ret;
1101}
Adam Langleyd9e397b2015-01-22 14:27:53 -08001102
Robert Sloan8ff03552017-06-14 12:40:58 -07001103DEFINE_METHOD_FUNCTION(RSA_METHOD, RSA_default_method) {
Robert Sloan8f860b12017-08-28 07:37:06 -07001104 // All of the methods are NULL to make it easier for the compiler/linker to
1105 // drop unused functions. The wrapper functions will select the appropriate
1106 // |rsa_default_*| implementation.
Robert Sloan8ff03552017-06-14 12:40:58 -07001107 OPENSSL_memset(out, 0, sizeof(RSA_METHOD));
1108 out->common.is_static = 1;
Robert Sloan8ff03552017-06-14 12:40:58 -07001109}