blob: f8cb9e3682d31fc348aea484f22352fce15fbbd2 [file] [log] [blame]
Adam Langley95c29f32014-06-20 12:00:00 -07001/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com)
2 * All rights reserved.
3 *
4 * This package is an SSL implementation written
5 * by Eric Young (eay@cryptsoft.com).
6 * The implementation was written so as to conform with Netscapes SSL.
7 *
8 * This library is free for commercial and non-commercial use as long as
9 * the following conditions are aheared to. The following conditions
10 * apply to all code found in this distribution, be it the RC4, RSA,
11 * lhash, DES, etc., code; not just the SSL code. The SSL documentation
12 * included with this distribution is covered by the same copyright terms
13 * except that the holder is Tim Hudson (tjh@cryptsoft.com).
14 *
15 * Copyright remains Eric Young's, and as such any Copyright notices in
16 * the code are not to be removed.
17 * If this package is used in a product, Eric Young should be given attribution
18 * as the author of the parts of the library used.
19 * This can be in the form of a textual message at program startup or
20 * in documentation (online or textual) provided with the package.
21 *
22 * Redistribution and use in source and binary forms, with or without
23 * modification, are permitted provided that the following conditions
24 * are met:
25 * 1. Redistributions of source code must retain the copyright
26 * notice, this list of conditions and the following disclaimer.
27 * 2. Redistributions in binary form must reproduce the above copyright
28 * notice, this list of conditions and the following disclaimer in the
29 * documentation and/or other materials provided with the distribution.
30 * 3. All advertising materials mentioning features or use of this software
31 * must display the following acknowledgement:
32 * "This product includes cryptographic software written by
33 * Eric Young (eay@cryptsoft.com)"
34 * The word 'cryptographic' can be left out if the rouines from the library
35 * being used are not cryptographic related :-).
36 * 4. If you include any Windows specific code (or a derivative thereof) from
37 * the apps directory (application code) you must include an acknowledgement:
38 * "This product includes software written by Tim Hudson (tjh@cryptsoft.com)"
39 *
40 * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND
41 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
42 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
43 * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
44 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
45 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
46 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
47 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
48 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
49 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
50 * SUCH DAMAGE.
51 *
52 * The licence and distribution terms for any publically available version or
53 * derivative of this code cannot be changed. i.e. this code cannot simply be
54 * copied and put under another distribution licence
55 * [including the GNU Public Licence.] */
56
57#include <openssl/rsa.h>
58
David Benjamincfa9de82016-03-14 14:19:41 -040059#include <assert.h>
David Benjaminfb8b7632017-04-10 18:35:22 -040060#include <limits.h>
Adam Langley2b2d66d2015-01-30 17:08:37 -080061#include <string.h>
62
Adam Langley95c29f32014-06-20 12:00:00 -070063#include <openssl/bn.h>
64#include <openssl/err.h>
65#include <openssl/mem.h>
Brian Smith054e6822015-03-27 21:12:01 -100066#include <openssl/thread.h>
David Benjaminfb8b7632017-04-10 18:35:22 -040067#include <openssl/type_check.h>
Adam Langley95c29f32014-06-20 12:00:00 -070068
69#include "internal.h"
Adam Langley96dec442017-05-03 11:50:51 -070070#include "../bn/internal.h"
71#include "../../internal.h"
72#include "../delocate.h"
Adam Langley95c29f32014-06-20 12:00:00 -070073
74
Brian Smith625475f2016-01-12 10:47:25 -100075static int check_modulus_and_exponent_sizes(const RSA *rsa) {
76 unsigned rsa_bits = BN_num_bits(rsa->n);
David Benjamincfa9de82016-03-14 14:19:41 -040077
Brian Smith625475f2016-01-12 10:47:25 -100078 if (rsa_bits > 16 * 1024) {
79 OPENSSL_PUT_ERROR(RSA, RSA_R_MODULUS_TOO_LARGE);
80 return 0;
81 }
Adam Langley95c29f32014-06-20 12:00:00 -070082
David Benjamin808f8322017-08-18 14:06:02 -040083 // 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 Benjamincfa9de82016-03-14 14:19:41 -040092 static const unsigned kMaxExponentBits = 33;
93
94 if (BN_num_bits(rsa->e) > kMaxExponentBits) {
Brian Smith625475f2016-01-12 10:47:25 -100095 OPENSSL_PUT_ERROR(RSA, RSA_R_BAD_E_VALUE);
96 return 0;
97 }
98
David Benjamin808f8322017-08-18 14:06:02 -040099 // 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 Benjamincfa9de82016-03-14 14:19:41 -0400103 if (rsa_bits <= kMaxExponentBits) {
104 OPENSSL_PUT_ERROR(RSA, RSA_R_KEY_SIZE_TOO_SMALL);
Brian Smith625475f2016-01-12 10:47:25 -1000105 return 0;
106 }
David Benjamincfa9de82016-03-14 14:19:41 -0400107 assert(BN_ucmp(rsa->n, rsa->e) > 0);
Brian Smith625475f2016-01-12 10:47:25 -1000108
109 return 1;
110}
Adam Langley95c29f32014-06-20 12:00:00 -0700111
David Benjamind93831d2015-10-29 13:19:12 -0400112size_t rsa_default_size(const RSA *rsa) {
David Benjamin925fee32014-07-11 14:14:08 -0400113 return BN_num_bytes(rsa->n);
114}
115
David Benjamin073391f2017-05-03 15:03:35 -0400116int 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 Langley95c29f32014-06-20 12:00:00 -0700123 const unsigned rsa_size = RSA_size(rsa);
Adam Langley95c29f32014-06-20 12:00:00 -0700124 BIGNUM *f, *result;
125 uint8_t *buf = NULL;
126 BN_CTX *ctx = NULL;
Adam Langley6887edb2014-06-20 12:00:00 -0700127 int i, ret = 0;
Adam Langley95c29f32014-06-20 12:00:00 -0700128
Adam Langley95c29f32014-06-20 12:00:00 -0700129 if (max_out < rsa_size) {
David Benjamin3570d732015-06-29 00:28:17 -0400130 OPENSSL_PUT_ERROR(RSA, RSA_R_OUTPUT_BUFFER_TOO_SMALL);
Adam Langley95c29f32014-06-20 12:00:00 -0700131 return 0;
132 }
133
Brian Smith625475f2016-01-12 10:47:25 -1000134 if (!check_modulus_and_exponent_sizes(rsa)) {
Adam Langley95c29f32014-06-20 12:00:00 -0700135 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) {
David Benjamin3570d732015-06-29 00:28:17 -0400148 OPENSSL_PUT_ERROR(RSA, ERR_R_MALLOC_FAILURE);
Adam Langley95c29f32014-06-20 12:00:00 -0700149 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:
David Benjamin808f8322017-08-18 14:06:02 -0400157 // Use the default parameters: SHA-1 for both hashes and no label.
Adam Langley6887edb2014-06-20 12:00:00 -0700158 i = RSA_padding_add_PKCS1_OAEP_mgf1(buf, rsa_size, in, in_len,
159 NULL, 0, NULL, NULL);
Adam Langley95c29f32014-06-20 12:00:00 -0700160 break;
Adam Langley95c29f32014-06-20 12:00:00 -0700161 case RSA_NO_PADDING:
162 i = RSA_padding_add_none(buf, rsa_size, in, in_len);
163 break;
164 default:
David Benjamin3570d732015-06-29 00:28:17 -0400165 OPENSSL_PUT_ERROR(RSA, RSA_R_UNKNOWN_PADDING_TYPE);
Adam Langley95c29f32014-06-20 12:00:00 -0700166 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) {
David Benjamin808f8322017-08-18 14:06:02 -0400178 // usually the padding functions would catch this
David Benjamin2ec3b312017-07-01 16:03:06 -0400179 OPENSSL_PUT_ERROR(RSA, RSA_R_DATA_TOO_LARGE);
Adam Langley95c29f32014-06-20 12:00:00 -0700180 goto err;
181 }
182
Brian Smithd0357302016-03-25 10:11:04 -1000183 if (!BN_MONT_CTX_set_locked(&rsa->mont_n, &rsa->lock, rsa->n, ctx) ||
Brian Smith24493a42016-03-25 09:12:48 -1000184 !BN_mod_exp_mont(result, f, rsa->e, rsa->n, ctx, rsa->mont_n)) {
Adam Langley95c29f32014-06-20 12:00:00 -0700185 goto err;
186 }
187
David Benjamin808f8322017-08-18 14:06:02 -0400188 // put in leading 0 bytes if the number is less than the length of the
189 // modulus
Adam Langley6887edb2014-06-20 12:00:00 -0700190 if (!BN_bn2bin_padded(out, rsa_size, result)) {
David Benjamin3570d732015-06-29 00:28:17 -0400191 OPENSSL_PUT_ERROR(RSA, ERR_R_INTERNAL_ERROR);
Adam Langley6887edb2014-06-20 12:00:00 -0700192 goto err;
Adam Langley95c29f32014-06-20 12:00:00 -0700193 }
194
195 *out_len = rsa_size;
196 ret = 1;
197
198err:
199 if (ctx != NULL) {
200 BN_CTX_end(ctx);
201 BN_CTX_free(ctx);
202 }
203 if (buf != NULL) {
204 OPENSSL_cleanse(buf, rsa_size);
205 OPENSSL_free(buf);
206 }
207
208 return ret;
209}
210
David Benjamin808f8322017-08-18 14:06:02 -0400211// MAX_BLINDINGS_PER_RSA defines the maximum number of cached BN_BLINDINGs per
212// RSA*. Then this limit is exceeded, BN_BLINDING objects will be created and
213// destroyed as needed.
Adam Langley95c29f32014-06-20 12:00:00 -0700214#define MAX_BLINDINGS_PER_RSA 1024
215
David Benjamin808f8322017-08-18 14:06:02 -0400216// rsa_blinding_get returns a BN_BLINDING to use with |rsa|. It does this by
217// allocating one of the cached BN_BLINDING objects in |rsa->blindings|. If
218// none are free, the cache will be extended by a extra element and the new
219// BN_BLINDING is returned.
220//
221// On success, the index of the assigned BN_BLINDING is written to
222// |*index_used| and must be passed to |rsa_blinding_release| when finished.
Adam Langley95c29f32014-06-20 12:00:00 -0700223static BN_BLINDING *rsa_blinding_get(RSA *rsa, unsigned *index_used,
224 BN_CTX *ctx) {
Brian Smith3426d102016-03-17 16:10:04 -1000225 assert(ctx != NULL);
Brian Smithcbf56a52016-03-21 11:25:39 -1000226 assert(rsa->mont_n != NULL);
227
Adam Langley95c29f32014-06-20 12:00:00 -0700228 BN_BLINDING *ret = NULL;
229 BN_BLINDING **new_blindings;
230 uint8_t *new_blindings_inuse;
231 char overflow = 0;
232
Adam Langley683d7bd2015-04-13 11:04:14 -0700233 CRYPTO_MUTEX_lock_write(&rsa->lock);
Adam Langley95c29f32014-06-20 12:00:00 -0700234
Adam Langley33672732015-03-31 18:55:53 -0700235 unsigned i;
236 for (i = 0; i < rsa->num_blindings; i++) {
237 if (rsa->blindings_inuse[i] == 0) {
238 rsa->blindings_inuse[i] = 1;
239 ret = rsa->blindings[i];
240 *index_used = i;
241 break;
Adam Langley95c29f32014-06-20 12:00:00 -0700242 }
243 }
244
245 if (ret != NULL) {
David Benjamin29270de2016-05-24 15:28:36 +0000246 CRYPTO_MUTEX_unlock_write(&rsa->lock);
Adam Langley95c29f32014-06-20 12:00:00 -0700247 return ret;
248 }
249
250 overflow = rsa->num_blindings >= MAX_BLINDINGS_PER_RSA;
251
David Benjamin808f8322017-08-18 14:06:02 -0400252 // We didn't find a free BN_BLINDING to use so increase the length of
253 // the arrays by one and use the newly created element.
Adam Langley95c29f32014-06-20 12:00:00 -0700254
David Benjamin29270de2016-05-24 15:28:36 +0000255 CRYPTO_MUTEX_unlock_write(&rsa->lock);
Brian Smith86361a32016-03-26 19:42:31 -1000256 ret = BN_BLINDING_new();
Adam Langley95c29f32014-06-20 12:00:00 -0700257 if (ret == NULL) {
258 return NULL;
259 }
260
261 if (overflow) {
David Benjamin808f8322017-08-18 14:06:02 -0400262 // We cannot add any more cached BN_BLINDINGs so we use |ret|
263 // and mark it for destruction in |rsa_blinding_release|.
Adam Langley95c29f32014-06-20 12:00:00 -0700264 *index_used = MAX_BLINDINGS_PER_RSA;
265 return ret;
266 }
267
Adam Langley683d7bd2015-04-13 11:04:14 -0700268 CRYPTO_MUTEX_lock_write(&rsa->lock);
Adam Langley95c29f32014-06-20 12:00:00 -0700269
270 new_blindings =
271 OPENSSL_malloc(sizeof(BN_BLINDING *) * (rsa->num_blindings + 1));
272 if (new_blindings == NULL) {
273 goto err1;
274 }
David Benjamin17cf2cb2016-12-13 01:07:13 -0500275 OPENSSL_memcpy(new_blindings, rsa->blindings,
Adam Langley95c29f32014-06-20 12:00:00 -0700276 sizeof(BN_BLINDING *) * rsa->num_blindings);
277 new_blindings[rsa->num_blindings] = ret;
278
279 new_blindings_inuse = OPENSSL_malloc(rsa->num_blindings + 1);
280 if (new_blindings_inuse == NULL) {
281 goto err2;
282 }
David Benjamin17cf2cb2016-12-13 01:07:13 -0500283 OPENSSL_memcpy(new_blindings_inuse, rsa->blindings_inuse, rsa->num_blindings);
Adam Langley95c29f32014-06-20 12:00:00 -0700284 new_blindings_inuse[rsa->num_blindings] = 1;
285 *index_used = rsa->num_blindings;
286
David Benjamind8b65c82015-04-22 16:09:09 -0400287 OPENSSL_free(rsa->blindings);
Adam Langley95c29f32014-06-20 12:00:00 -0700288 rsa->blindings = new_blindings;
David Benjamind8b65c82015-04-22 16:09:09 -0400289 OPENSSL_free(rsa->blindings_inuse);
Adam Langley95c29f32014-06-20 12:00:00 -0700290 rsa->blindings_inuse = new_blindings_inuse;
291 rsa->num_blindings++;
292
David Benjamin29270de2016-05-24 15:28:36 +0000293 CRYPTO_MUTEX_unlock_write(&rsa->lock);
Adam Langley95c29f32014-06-20 12:00:00 -0700294 return ret;
295
296err2:
297 OPENSSL_free(new_blindings);
298
299err1:
David Benjamin29270de2016-05-24 15:28:36 +0000300 CRYPTO_MUTEX_unlock_write(&rsa->lock);
Adam Langley95c29f32014-06-20 12:00:00 -0700301 BN_BLINDING_free(ret);
302 return NULL;
303}
304
David Benjamin808f8322017-08-18 14:06:02 -0400305// rsa_blinding_release marks the cached BN_BLINDING at the given index as free
306// for other threads to use.
Adam Langley95c29f32014-06-20 12:00:00 -0700307static void rsa_blinding_release(RSA *rsa, BN_BLINDING *blinding,
308 unsigned blinding_index) {
309 if (blinding_index == MAX_BLINDINGS_PER_RSA) {
David Benjamin808f8322017-08-18 14:06:02 -0400310 // This blinding wasn't cached.
Adam Langley95c29f32014-06-20 12:00:00 -0700311 BN_BLINDING_free(blinding);
312 return;
313 }
314
Adam Langley683d7bd2015-04-13 11:04:14 -0700315 CRYPTO_MUTEX_lock_write(&rsa->lock);
Adam Langley95c29f32014-06-20 12:00:00 -0700316 rsa->blindings_inuse[blinding_index] = 0;
David Benjamin29270de2016-05-24 15:28:36 +0000317 CRYPTO_MUTEX_unlock_write(&rsa->lock);
Adam Langley95c29f32014-06-20 12:00:00 -0700318}
319
David Benjamin808f8322017-08-18 14:06:02 -0400320// signing
David Benjamind93831d2015-10-29 13:19:12 -0400321int rsa_default_sign_raw(RSA *rsa, size_t *out_len, uint8_t *out,
322 size_t max_out, const uint8_t *in, size_t in_len,
323 int padding) {
Adam Langley95c29f32014-06-20 12:00:00 -0700324 const unsigned rsa_size = RSA_size(rsa);
Adam Langley95c29f32014-06-20 12:00:00 -0700325 uint8_t *buf = NULL;
Adam Langley6887edb2014-06-20 12:00:00 -0700326 int i, ret = 0;
Adam Langley95c29f32014-06-20 12:00:00 -0700327
328 if (max_out < rsa_size) {
David Benjamin3570d732015-06-29 00:28:17 -0400329 OPENSSL_PUT_ERROR(RSA, RSA_R_OUTPUT_BUFFER_TOO_SMALL);
Adam Langley95c29f32014-06-20 12:00:00 -0700330 return 0;
331 }
332
Adam Langley95c29f32014-06-20 12:00:00 -0700333 buf = OPENSSL_malloc(rsa_size);
Adam Langley6bc658d2014-08-18 13:29:45 -0700334 if (buf == NULL) {
David Benjamin3570d732015-06-29 00:28:17 -0400335 OPENSSL_PUT_ERROR(RSA, ERR_R_MALLOC_FAILURE);
Adam Langley95c29f32014-06-20 12:00:00 -0700336 goto err;
337 }
338
339 switch (padding) {
340 case RSA_PKCS1_PADDING:
341 i = RSA_padding_add_PKCS1_type_1(buf, rsa_size, in, in_len);
342 break;
343 case RSA_NO_PADDING:
344 i = RSA_padding_add_none(buf, rsa_size, in, in_len);
345 break;
346 default:
David Benjamin3570d732015-06-29 00:28:17 -0400347 OPENSSL_PUT_ERROR(RSA, RSA_R_UNKNOWN_PADDING_TYPE);
Adam Langley95c29f32014-06-20 12:00:00 -0700348 goto err;
349 }
Adam Langley6bc658d2014-08-18 13:29:45 -0700350
Adam Langley95c29f32014-06-20 12:00:00 -0700351 if (i <= 0) {
352 goto err;
353 }
354
Adam Langley6bc658d2014-08-18 13:29:45 -0700355 if (!RSA_private_transform(rsa, out, buf, rsa_size)) {
Adam Langley5f5bf6f2015-02-24 13:49:41 -0800356 goto err;
Adam Langley95c29f32014-06-20 12:00:00 -0700357 }
358
359 *out_len = rsa_size;
360 ret = 1;
361
362err:
Adam Langley95c29f32014-06-20 12:00:00 -0700363 if (buf != NULL) {
364 OPENSSL_cleanse(buf, rsa_size);
365 OPENSSL_free(buf);
366 }
Adam Langley95c29f32014-06-20 12:00:00 -0700367
368 return ret;
369}
370
David Benjamind93831d2015-10-29 13:19:12 -0400371int rsa_default_decrypt(RSA *rsa, size_t *out_len, uint8_t *out, size_t max_out,
372 const uint8_t *in, size_t in_len, int padding) {
Adam Langley95c29f32014-06-20 12:00:00 -0700373 const unsigned rsa_size = RSA_size(rsa);
Adam Langley95c29f32014-06-20 12:00:00 -0700374 uint8_t *buf = NULL;
Adam Langley95c29f32014-06-20 12:00:00 -0700375 int ret = 0;
376
377 if (max_out < rsa_size) {
David Benjamin3570d732015-06-29 00:28:17 -0400378 OPENSSL_PUT_ERROR(RSA, RSA_R_OUTPUT_BUFFER_TOO_SMALL);
Adam Langley95c29f32014-06-20 12:00:00 -0700379 return 0;
380 }
381
David Benjamin74279b62014-07-24 13:09:19 -0400382 if (padding == RSA_NO_PADDING) {
383 buf = out;
384 } else {
David Benjamin808f8322017-08-18 14:06:02 -0400385 // Allocate a temporary buffer to hold the padded plaintext.
David Benjamin74279b62014-07-24 13:09:19 -0400386 buf = OPENSSL_malloc(rsa_size);
387 if (buf == NULL) {
388 OPENSSL_PUT_ERROR(RSA, ERR_R_MALLOC_FAILURE);
389 goto err;
390 }
Adam Langley95c29f32014-06-20 12:00:00 -0700391 }
392
Adam Langley6bc658d2014-08-18 13:29:45 -0700393 if (in_len != rsa_size) {
David Benjamin3570d732015-06-29 00:28:17 -0400394 OPENSSL_PUT_ERROR(RSA, RSA_R_DATA_LEN_NOT_EQUAL_TO_MOD_LEN);
Adam Langley95c29f32014-06-20 12:00:00 -0700395 goto err;
396 }
397
Adam Langley6bc658d2014-08-18 13:29:45 -0700398 if (!RSA_private_transform(rsa, buf, in, rsa_size)) {
Adam Langley6887edb2014-06-20 12:00:00 -0700399 goto err;
400 }
Adam Langley95c29f32014-06-20 12:00:00 -0700401
402 switch (padding) {
403 case RSA_PKCS1_PADDING:
David Benjaminb0ad3d72017-03-16 13:15:31 -0400404 ret =
405 RSA_padding_check_PKCS1_type_2(out, out_len, rsa_size, buf, rsa_size);
Adam Langley95c29f32014-06-20 12:00:00 -0700406 break;
407 case RSA_PKCS1_OAEP_PADDING:
David Benjamin808f8322017-08-18 14:06:02 -0400408 // Use the default parameters: SHA-1 for both hashes and no label.
David Benjaminb0ad3d72017-03-16 13:15:31 -0400409 ret = RSA_padding_check_PKCS1_OAEP_mgf1(out, out_len, rsa_size, buf,
410 rsa_size, NULL, 0, NULL, NULL);
Adam Langley95c29f32014-06-20 12:00:00 -0700411 break;
Adam Langley95c29f32014-06-20 12:00:00 -0700412 case RSA_NO_PADDING:
David Benjaminb0ad3d72017-03-16 13:15:31 -0400413 *out_len = rsa_size;
414 ret = 1;
Adam Langley95c29f32014-06-20 12:00:00 -0700415 break;
416 default:
David Benjamin3570d732015-06-29 00:28:17 -0400417 OPENSSL_PUT_ERROR(RSA, RSA_R_UNKNOWN_PADDING_TYPE);
Adam Langley95c29f32014-06-20 12:00:00 -0700418 goto err;
419 }
420
David Benjaminb0ad3d72017-03-16 13:15:31 -0400421 if (!ret) {
David Benjamin3570d732015-06-29 00:28:17 -0400422 OPENSSL_PUT_ERROR(RSA, RSA_R_PADDING_CHECK_FAILED);
Adam Langley95c29f32014-06-20 12:00:00 -0700423 }
424
425err:
David Benjamin74279b62014-07-24 13:09:19 -0400426 if (padding != RSA_NO_PADDING && buf != NULL) {
Adam Langley95c29f32014-06-20 12:00:00 -0700427 OPENSSL_cleanse(buf, rsa_size);
428 OPENSSL_free(buf);
429 }
Adam Langley95c29f32014-06-20 12:00:00 -0700430
431 return ret;
432}
433
Brian Smithf08c1c62016-03-25 13:24:46 -1000434static int mod_exp(BIGNUM *r0, const BIGNUM *I, RSA *rsa, BN_CTX *ctx);
435
Brian Smithc0b196d2016-03-04 08:54:07 -1000436int RSA_verify_raw(RSA *rsa, size_t *out_len, uint8_t *out, size_t max_out,
437 const uint8_t *in, size_t in_len, int padding) {
438 if (rsa->n == NULL || rsa->e == NULL) {
439 OPENSSL_PUT_ERROR(RSA, RSA_R_VALUE_MISSING);
440 return 0;
441 }
442
Adam Langley95c29f32014-06-20 12:00:00 -0700443 const unsigned rsa_size = RSA_size(rsa);
444 BIGNUM *f, *result;
Adam Langley95c29f32014-06-20 12:00:00 -0700445
Adam Langley95c29f32014-06-20 12:00:00 -0700446 if (max_out < rsa_size) {
David Benjamin3570d732015-06-29 00:28:17 -0400447 OPENSSL_PUT_ERROR(RSA, RSA_R_OUTPUT_BUFFER_TOO_SMALL);
Adam Langley95c29f32014-06-20 12:00:00 -0700448 return 0;
449 }
450
Brian Smith99022622016-03-04 09:20:07 -1000451 if (in_len != rsa_size) {
452 OPENSSL_PUT_ERROR(RSA, RSA_R_DATA_LEN_NOT_EQUAL_TO_MOD_LEN);
453 return 0;
454 }
455
Brian Smith625475f2016-01-12 10:47:25 -1000456 if (!check_modulus_and_exponent_sizes(rsa)) {
Adam Langley95c29f32014-06-20 12:00:00 -0700457 return 0;
458 }
459
Brian Smith2a920312016-03-04 13:42:47 -1000460 BN_CTX *ctx = BN_CTX_new();
Adam Langley95c29f32014-06-20 12:00:00 -0700461 if (ctx == NULL) {
Brian Smith2a920312016-03-04 13:42:47 -1000462 return 0;
Adam Langley95c29f32014-06-20 12:00:00 -0700463 }
464
Brian Smith2a920312016-03-04 13:42:47 -1000465 int ret = 0;
466 uint8_t *buf = NULL;
467
Adam Langley95c29f32014-06-20 12:00:00 -0700468 BN_CTX_start(ctx);
469 f = BN_CTX_get(ctx);
470 result = BN_CTX_get(ctx);
Brian Smith2a920312016-03-04 13:42:47 -1000471 if (f == NULL || result == NULL) {
472 OPENSSL_PUT_ERROR(RSA, ERR_R_MALLOC_FAILURE);
473 goto err;
474 }
475
David Benjamin74279b62014-07-24 13:09:19 -0400476 if (padding == RSA_NO_PADDING) {
477 buf = out;
478 } else {
David Benjamin808f8322017-08-18 14:06:02 -0400479 // Allocate a temporary buffer to hold the padded plaintext.
David Benjamin74279b62014-07-24 13:09:19 -0400480 buf = OPENSSL_malloc(rsa_size);
481 if (buf == NULL) {
482 OPENSSL_PUT_ERROR(RSA, ERR_R_MALLOC_FAILURE);
483 goto err;
484 }
485 }
Adam Langley95c29f32014-06-20 12:00:00 -0700486
Adam Langley95c29f32014-06-20 12:00:00 -0700487 if (BN_bin2bn(in, in_len, f) == NULL) {
488 goto err;
489 }
490
491 if (BN_ucmp(f, rsa->n) >= 0) {
David Benjamin2ec3b312017-07-01 16:03:06 -0400492 OPENSSL_PUT_ERROR(RSA, RSA_R_DATA_TOO_LARGE);
Adam Langley95c29f32014-06-20 12:00:00 -0700493 goto err;
494 }
495
Brian Smithd0357302016-03-25 10:11:04 -1000496 if (!BN_MONT_CTX_set_locked(&rsa->mont_n, &rsa->lock, rsa->n, ctx) ||
Brian Smith24493a42016-03-25 09:12:48 -1000497 !BN_mod_exp_mont(result, f, rsa->e, rsa->n, ctx, rsa->mont_n)) {
Adam Langley95c29f32014-06-20 12:00:00 -0700498 goto err;
499 }
500
Adam Langley6887edb2014-06-20 12:00:00 -0700501 if (!BN_bn2bin_padded(buf, rsa_size, result)) {
David Benjamin3570d732015-06-29 00:28:17 -0400502 OPENSSL_PUT_ERROR(RSA, ERR_R_INTERNAL_ERROR);
Adam Langley6887edb2014-06-20 12:00:00 -0700503 goto err;
504 }
Adam Langley95c29f32014-06-20 12:00:00 -0700505
506 switch (padding) {
507 case RSA_PKCS1_PADDING:
David Benjamin43ea2042017-03-16 11:54:11 -0400508 ret =
509 RSA_padding_check_PKCS1_type_1(out, out_len, rsa_size, buf, rsa_size);
Adam Langley95c29f32014-06-20 12:00:00 -0700510 break;
511 case RSA_NO_PADDING:
David Benjamin43ea2042017-03-16 11:54:11 -0400512 ret = 1;
513 *out_len = rsa_size;
Adam Langley95c29f32014-06-20 12:00:00 -0700514 break;
515 default:
David Benjamin3570d732015-06-29 00:28:17 -0400516 OPENSSL_PUT_ERROR(RSA, RSA_R_UNKNOWN_PADDING_TYPE);
Adam Langley95c29f32014-06-20 12:00:00 -0700517 goto err;
518 }
519
David Benjamin43ea2042017-03-16 11:54:11 -0400520 if (!ret) {
David Benjamin3570d732015-06-29 00:28:17 -0400521 OPENSSL_PUT_ERROR(RSA, RSA_R_PADDING_CHECK_FAILED);
David Benjamin43ea2042017-03-16 11:54:11 -0400522 goto err;
Adam Langley95c29f32014-06-20 12:00:00 -0700523 }
524
525err:
Brian Smith2a920312016-03-04 13:42:47 -1000526 BN_CTX_end(ctx);
527 BN_CTX_free(ctx);
528 if (buf != out) {
Adam Langley95c29f32014-06-20 12:00:00 -0700529 OPENSSL_free(buf);
530 }
531 return ret;
532}
533
David Benjamind93831d2015-10-29 13:19:12 -0400534int rsa_default_private_transform(RSA *rsa, uint8_t *out, const uint8_t *in,
535 size_t len) {
David Benjamine55b32d2017-06-22 10:53:25 -0400536 if (rsa->n == NULL || rsa->d == NULL) {
537 OPENSSL_PUT_ERROR(RSA, RSA_R_VALUE_MISSING);
538 return 0;
539 }
540
Adam Langley6bc658d2014-08-18 13:29:45 -0700541 BIGNUM *f, *result;
542 BN_CTX *ctx = NULL;
543 unsigned blinding_index = 0;
544 BN_BLINDING *blinding = NULL;
545 int ret = 0;
546
547 ctx = BN_CTX_new();
548 if (ctx == NULL) {
549 goto err;
550 }
551 BN_CTX_start(ctx);
552 f = BN_CTX_get(ctx);
553 result = BN_CTX_get(ctx);
554
555 if (f == NULL || result == NULL) {
David Benjamin3570d732015-06-29 00:28:17 -0400556 OPENSSL_PUT_ERROR(RSA, ERR_R_MALLOC_FAILURE);
Adam Langley6bc658d2014-08-18 13:29:45 -0700557 goto err;
558 }
559
560 if (BN_bin2bn(in, len, f) == NULL) {
561 goto err;
562 }
563
564 if (BN_ucmp(f, rsa->n) >= 0) {
David Benjamin808f8322017-08-18 14:06:02 -0400565 // Usually the padding functions would catch this.
David Benjamin2ec3b312017-07-01 16:03:06 -0400566 OPENSSL_PUT_ERROR(RSA, RSA_R_DATA_TOO_LARGE);
Adam Langley6bc658d2014-08-18 13:29:45 -0700567 goto err;
568 }
569
Brian Smith86080c32016-03-25 12:23:16 -1000570 if (!BN_MONT_CTX_set_locked(&rsa->mont_n, &rsa->lock, rsa->n, ctx)) {
571 OPENSSL_PUT_ERROR(RSA, ERR_R_INTERNAL_ERROR);
572 goto err;
573 }
574
Adam Langley83799782017-06-13 13:00:25 -0700575 const int do_blinding = (rsa->flags & RSA_FLAG_NO_BLINDING) == 0;
Brian Smith598e55a2016-03-26 20:17:37 -1000576
Adam Langley83799782017-06-13 13:00:25 -0700577 if (rsa->e == NULL && do_blinding) {
David Benjamin808f8322017-08-18 14:06:02 -0400578 // We cannot do blinding or verification without |e|, and continuing without
579 // those countermeasures is dangerous. However, the Java/Android RSA API
580 // requires support for keys where only |d| and |n| (and not |e|) are known.
581 // The callers that require that bad behavior set |RSA_FLAG_NO_BLINDING|.
Adam Langley83799782017-06-13 13:00:25 -0700582 OPENSSL_PUT_ERROR(RSA, RSA_R_NO_PUBLIC_EXPONENT);
583 goto err;
584 }
Brian Smith86361a32016-03-26 19:42:31 -1000585
Adam Langley83799782017-06-13 13:00:25 -0700586 if (do_blinding) {
Adam Langley6bc658d2014-08-18 13:29:45 -0700587 blinding = rsa_blinding_get(rsa, &blinding_index, ctx);
588 if (blinding == NULL) {
David Benjamin3570d732015-06-29 00:28:17 -0400589 OPENSSL_PUT_ERROR(RSA, ERR_R_INTERNAL_ERROR);
Adam Langley6bc658d2014-08-18 13:29:45 -0700590 goto err;
591 }
Brian Smith86361a32016-03-26 19:42:31 -1000592 if (!BN_BLINDING_convert(f, blinding, rsa->e, rsa->mont_n, ctx)) {
Adam Langley6bc658d2014-08-18 13:29:45 -0700593 goto err;
594 }
595 }
596
Brian Smith51b0d5b2016-03-25 13:15:39 -1000597 if (rsa->p != NULL && rsa->q != NULL && rsa->e != NULL && rsa->dmp1 != NULL &&
598 rsa->dmq1 != NULL && rsa->iqmp != NULL) {
Brian Smithf08c1c62016-03-25 13:24:46 -1000599 if (!mod_exp(result, f, rsa, ctx)) {
Adam Langley6bc658d2014-08-18 13:29:45 -0700600 goto err;
601 }
Brian Smith9f05de42016-08-02 18:21:18 -1000602 } else if (!BN_mod_exp_mont_consttime(result, f, rsa->d, rsa->n, ctx,
603 rsa->mont_n)) {
604 goto err;
Brian Smith86080c32016-03-25 12:23:16 -1000605 }
606
David Benjamin808f8322017-08-18 14:06:02 -0400607 // Verify the result to protect against fault attacks as described in the
608 // 1997 paper "On the Importance of Checking Cryptographic Protocols for
609 // Faults" by Dan Boneh, Richard A. DeMillo, and Richard J. Lipton. Some
610 // implementations do this only when the CRT is used, but we do it in all
611 // cases. Section 6 of the aforementioned paper describes an attack that
612 // works when the CRT isn't used. That attack is much less likely to succeed
613 // than the CRT attack, but there have likely been improvements since 1997.
614 //
615 // This check is cheap assuming |e| is small; it almost always is.
Adam Langley83799782017-06-13 13:00:25 -0700616 if (rsa->e != NULL) {
Brian Smith86080c32016-03-25 12:23:16 -1000617 BIGNUM *vrfy = BN_CTX_get(ctx);
618 if (vrfy == NULL ||
619 !BN_mod_exp_mont(vrfy, result, rsa->e, rsa->n, ctx, rsa->mont_n) ||
620 !BN_equal_consttime(vrfy, f)) {
621 OPENSSL_PUT_ERROR(RSA, ERR_R_INTERNAL_ERROR);
Adam Langley6bc658d2014-08-18 13:29:45 -0700622 goto err;
623 }
Adam Langley6bc658d2014-08-18 13:29:45 -0700624
Adam Langley83799782017-06-13 13:00:25 -0700625 }
626
627 if (do_blinding &&
628 !BN_BLINDING_invert(result, blinding, rsa->mont_n, ctx)) {
629 goto err;
Adam Langley6bc658d2014-08-18 13:29:45 -0700630 }
631
632 if (!BN_bn2bin_padded(out, len, result)) {
David Benjamin3570d732015-06-29 00:28:17 -0400633 OPENSSL_PUT_ERROR(RSA, ERR_R_INTERNAL_ERROR);
Adam Langley6bc658d2014-08-18 13:29:45 -0700634 goto err;
635 }
636
637 ret = 1;
638
639err:
640 if (ctx != NULL) {
641 BN_CTX_end(ctx);
642 BN_CTX_free(ctx);
643 }
644 if (blinding != NULL) {
645 rsa_blinding_release(rsa, blinding, blinding_index);
646 }
647
648 return ret;
649}
650
Adam Langley95c29f32014-06-20 12:00:00 -0700651static int mod_exp(BIGNUM *r0, const BIGNUM *I, RSA *rsa, BN_CTX *ctx) {
Brian Smithf08c1c62016-03-25 13:24:46 -1000652 assert(ctx != NULL);
653
Brian Smith51b0d5b2016-03-25 13:15:39 -1000654 assert(rsa->n != NULL);
655 assert(rsa->e != NULL);
656 assert(rsa->d != NULL);
657 assert(rsa->p != NULL);
658 assert(rsa->q != NULL);
659 assert(rsa->dmp1 != NULL);
660 assert(rsa->dmq1 != NULL);
661 assert(rsa->iqmp != NULL);
662
Adam Langley95c29f32014-06-20 12:00:00 -0700663 BIGNUM *r1, *m1, *vrfy;
Adam Langley95c29f32014-06-20 12:00:00 -0700664 int ret = 0;
665
666 BN_CTX_start(ctx);
667 r1 = BN_CTX_get(ctx);
668 m1 = BN_CTX_get(ctx);
669 vrfy = BN_CTX_get(ctx);
Brian Smith7cf60852016-03-19 22:39:37 -1000670 if (r1 == NULL ||
671 m1 == NULL ||
672 vrfy == NULL) {
673 goto err;
674 }
Adam Langley95c29f32014-06-20 12:00:00 -0700675
Brian Smith9f05de42016-08-02 18:21:18 -1000676 if (!BN_MONT_CTX_set_locked(&rsa->mont_p, &rsa->lock, rsa->p, ctx) ||
677 !BN_MONT_CTX_set_locked(&rsa->mont_q, &rsa->lock, rsa->q, ctx)) {
678 goto err;
Adam Langley95c29f32014-06-20 12:00:00 -0700679 }
680
Brian Smithd0357302016-03-25 10:11:04 -1000681 if (!BN_MONT_CTX_set_locked(&rsa->mont_n, &rsa->lock, rsa->n, ctx)) {
Brian Smith24493a42016-03-25 09:12:48 -1000682 goto err;
Adam Langley95c29f32014-06-20 12:00:00 -0700683 }
684
David Benjamin808f8322017-08-18 14:06:02 -0400685 // compute I mod q
Brian Smith9f05de42016-08-02 18:21:18 -1000686 if (!BN_mod(r1, I, rsa->q, ctx)) {
Adam Langley95c29f32014-06-20 12:00:00 -0700687 goto err;
688 }
689
David Benjamin808f8322017-08-18 14:06:02 -0400690 // compute r1^dmq1 mod q
Brian Smith9f05de42016-08-02 18:21:18 -1000691 if (!BN_mod_exp_mont_consttime(m1, r1, rsa->dmq1, rsa->q, ctx, rsa->mont_q)) {
Adam Langley95c29f32014-06-20 12:00:00 -0700692 goto err;
693 }
694
David Benjamin808f8322017-08-18 14:06:02 -0400695 // compute I mod p
Brian Smith9f05de42016-08-02 18:21:18 -1000696 if (!BN_mod(r1, I, rsa->p, ctx)) {
Adam Langley95c29f32014-06-20 12:00:00 -0700697 goto err;
698 }
699
David Benjamin808f8322017-08-18 14:06:02 -0400700 // compute r1^dmp1 mod p
Brian Smith9f05de42016-08-02 18:21:18 -1000701 if (!BN_mod_exp_mont_consttime(r0, r1, rsa->dmp1, rsa->p, ctx, rsa->mont_p)) {
Adam Langley95c29f32014-06-20 12:00:00 -0700702 goto err;
703 }
704
705 if (!BN_sub(r0, r0, m1)) {
706 goto err;
707 }
David Benjamin808f8322017-08-18 14:06:02 -0400708 // This will help stop the size of r0 increasing, which does
709 // affect the multiply if it optimised for a power of 2 size
Adam Langley95c29f32014-06-20 12:00:00 -0700710 if (BN_is_negative(r0)) {
711 if (!BN_add(r0, r0, rsa->p)) {
712 goto err;
713 }
714 }
715
716 if (!BN_mul(r1, r0, rsa->iqmp, ctx)) {
717 goto err;
718 }
719
Brian Smith9f05de42016-08-02 18:21:18 -1000720 if (!BN_mod(r0, r1, rsa->p, ctx)) {
Adam Langley95c29f32014-06-20 12:00:00 -0700721 goto err;
722 }
723
David Benjamin808f8322017-08-18 14:06:02 -0400724 // If p < q it is occasionally possible for the correction of
725 // adding 'p' if r0 is negative above to leave the result still
726 // negative. This can break the private key operations: the following
727 // second correction should *always* correct this rare occurrence.
728 // This will *never* happen with OpenSSL generated keys because
729 // they ensure p > q [steve]
Adam Langley95c29f32014-06-20 12:00:00 -0700730 if (BN_is_negative(r0)) {
731 if (!BN_add(r0, r0, rsa->p)) {
732 goto err;
733 }
734 }
735 if (!BN_mul(r1, r0, rsa->q, ctx)) {
736 goto err;
737 }
738 if (!BN_add(r0, r1, m1)) {
739 goto err;
740 }
741
Adam Langley95c29f32014-06-20 12:00:00 -0700742 ret = 1;
743
744err:
745 BN_CTX_end(ctx);
746 return ret;
747}
748
David Benjamin43780cb2017-04-10 18:05:19 -0400749static int ensure_bignum(BIGNUM **out) {
750 if (*out == NULL) {
751 *out = BN_new();
752 }
753 return *out != NULL;
754}
755
David Benjamin808f8322017-08-18 14:06:02 -0400756// kBoringSSLRSASqrtTwo is the BIGNUM representation of ⌊2¹⁵³⁵×√2⌋. This is
757// chosen to give enough precision for 3072-bit RSA, the largest key size FIPS
758// specifies. Key sizes beyond this will round up.
759//
760// To verify this number, check that n² < 2³⁰⁷¹ < (n+1)², where n is value
761// represented here. Note the components are listed in little-endian order. Here
762// is some sample Python code to check:
763//
764// >>> TOBN = lambda a, b: a << 32 | b
765// >>> l = [ <paste the contents of kSqrtTwo> ]
766// >>> n = sum(a * 2**(64*i) for i, a in enumerate(l))
767// >>> n**2 < 2**3071 < (n+1)**2
768// True
David Benjaminfb8b7632017-04-10 18:35:22 -0400769const BN_ULONG kBoringSSLRSASqrtTwo[] = {
770 TOBN(0xdea06241, 0xf7aa81c2), TOBN(0xf6a1be3f, 0xca221307),
771 TOBN(0x332a5e9f, 0x7bda1ebf), TOBN(0x0104dc01, 0xfe32352f),
772 TOBN(0xb8cf341b, 0x6f8236c7), TOBN(0x4264dabc, 0xd528b651),
773 TOBN(0xf4d3a02c, 0xebc93e0c), TOBN(0x81394ab6, 0xd8fd0efd),
774 TOBN(0xeaa4a089, 0x9040ca4a), TOBN(0xf52f120f, 0x836e582e),
775 TOBN(0xcb2a6343, 0x31f3c84d), TOBN(0xc6d5a8a3, 0x8bb7e9dc),
776 TOBN(0x460abc72, 0x2f7c4e33), TOBN(0xcab1bc91, 0x1688458a),
777 TOBN(0x53059c60, 0x11bc337b), TOBN(0xd2202e87, 0x42af1f4e),
778 TOBN(0x78048736, 0x3dfa2768), TOBN(0x0f74a85e, 0x439c7b4a),
779 TOBN(0xa8b1fe6f, 0xdc83db39), TOBN(0x4afc8304, 0x3ab8a2c3),
780 TOBN(0xed17ac85, 0x83339915), TOBN(0x1d6f60ba, 0x893ba84c),
781 TOBN(0x597d89b3, 0x754abe9f), TOBN(0xb504f333, 0xf9de6484),
782};
783const size_t kBoringSSLRSASqrtTwoLen = OPENSSL_ARRAY_SIZE(kBoringSSLRSASqrtTwo);
784
785int rsa_less_than_words(const BN_ULONG *a, const BN_ULONG *b, size_t len) {
Adam Langley518ba072017-04-20 13:51:11 -0700786 OPENSSL_COMPILE_ASSERT(sizeof(BN_ULONG) <= sizeof(crypto_word_t),
787 crypto_word_t_too_small);
David Benjaminfb8b7632017-04-10 18:35:22 -0400788 int ret = 0;
David Benjamin808f8322017-08-18 14:06:02 -0400789 // Process the words in little-endian order.
David Benjaminfb8b7632017-04-10 18:35:22 -0400790 for (size_t i = 0; i < len; i++) {
Adam Langley518ba072017-04-20 13:51:11 -0700791 crypto_word_t eq = constant_time_eq_w(a[i], b[i]);
792 crypto_word_t lt = constant_time_lt_w(a[i], b[i]);
David Benjaminfb8b7632017-04-10 18:35:22 -0400793 ret = constant_time_select_int(eq, ret, constant_time_select_int(lt, 1, 0));
794 }
795 return ret;
796}
797
798int rsa_greater_than_pow2(const BIGNUM *b, int n) {
799 if (BN_is_negative(b) || n == INT_MAX) {
800 return 0;
801 }
802
803 int b_bits = BN_num_bits(b);
804 return b_bits > n + 1 || (b_bits == n + 1 && !BN_is_pow2(b));
805}
806
David Benjamin808f8322017-08-18 14:06:02 -0400807// generate_prime sets |out| to a prime with length |bits| such that |out|-1 is
808// relatively prime to |e|. If |p| is non-NULL, |out| will also not be close to
809// |p|.
David Benjaminfb8b7632017-04-10 18:35:22 -0400810static int generate_prime(BIGNUM *out, int bits, const BIGNUM *e,
811 const BIGNUM *p, BN_CTX *ctx, BN_GENCB *cb) {
812 if (bits < 128 || (bits % BN_BITS2) != 0) {
813 OPENSSL_PUT_ERROR(RSA, ERR_R_INTERNAL_ERROR);
814 return 0;
815 }
816
David Benjamin808f8322017-08-18 14:06:02 -0400817 // Ensure the bound on |tries| does not overflow.
David Benjaminfb8b7632017-04-10 18:35:22 -0400818 if (bits >= INT_MAX/5) {
819 OPENSSL_PUT_ERROR(RSA, RSA_R_MODULUS_TOO_LARGE);
820 return 0;
821 }
822
823 int ret = 0, tries = 0, rand_tries = 0;
824 BN_CTX_start(ctx);
825 BIGNUM *tmp = BN_CTX_get(ctx);
826 if (tmp == NULL) {
827 goto err;
828 }
829
David Benjamin808f8322017-08-18 14:06:02 -0400830 // See FIPS 186-4 appendix B.3.3, steps 4 and 5. Note |bits| here is
831 // nlen/2.
David Benjaminfb8b7632017-04-10 18:35:22 -0400832 for (;;) {
David Benjamin808f8322017-08-18 14:06:02 -0400833 // Generate a random number of length |bits| where the bottom bit is set
834 // (steps 4.2, 4.3, 5.2 and 5.3) and the top bit is set (implied by the
835 // bound checked below in steps 4.4 and 5.5).
David Benjaminfb8b7632017-04-10 18:35:22 -0400836 if (!BN_rand(out, bits, BN_RAND_TOP_ONE, BN_RAND_BOTTOM_ODD) ||
837 !BN_GENCB_call(cb, BN_GENCB_GENERATED, rand_tries++)) {
838 goto err;
839 }
840
841 if (p != NULL) {
David Benjamin808f8322017-08-18 14:06:02 -0400842 // If |p| and |out| are too close, try again (step 5.4).
David Benjaminfb8b7632017-04-10 18:35:22 -0400843 if (!BN_sub(tmp, out, p)) {
844 goto err;
845 }
846 BN_set_negative(tmp, 0);
847 if (!rsa_greater_than_pow2(tmp, bits - 100)) {
848 continue;
849 }
850 }
851
David Benjamin808f8322017-08-18 14:06:02 -0400852 // If out < 2^(bits-1)×√2, try again (steps 4.4 and 5.5).
853 //
854 // We check the most significant words, so we retry if ⌊out/2^k⌋ <= ⌊b/2^k⌋,
855 // where b = 2^(bits-1)×√2 and k = max(0, bits - 1536). For key sizes up to
856 // 3072 (bits = 1536), k = 0, so we are testing that ⌊out⌋ <= ⌊b⌋. out is an
857 // integer and b is not, so this is equivalent to out < b. That is, the
858 // comparison is exact for FIPS key sizes.
859 //
860 // For larger keys, the comparison is approximate, leaning towards
861 // retrying. That is, we reject a negligible fraction of primes that are
862 // within the FIPS bound, but we will never accept a prime outside the
863 // bound, ensuring the resulting RSA key is the right size. Specifically, if
864 // the FIPS bound holds, we have ⌊out/2^k⌋ < out/2^k < b/2^k. This implies
865 // ⌊out/2^k⌋ <= ⌊b/2^k⌋. That is, the FIPS bound implies our bound and so we
866 // are slightly tighter.
David Benjaminfb8b7632017-04-10 18:35:22 -0400867 size_t out_len = (size_t)out->top;
868 assert(out_len == (size_t)bits / BN_BITS2);
869 size_t to_check = kBoringSSLRSASqrtTwoLen;
870 if (to_check > out_len) {
871 to_check = out_len;
872 }
873 if (!rsa_less_than_words(
874 kBoringSSLRSASqrtTwo + kBoringSSLRSASqrtTwoLen - to_check,
875 out->d + out_len - to_check, to_check)) {
876 continue;
877 }
878
David Benjamin808f8322017-08-18 14:06:02 -0400879 // Check gcd(out-1, e) is one (steps 4.5 and 5.6).
David Benjaminfb8b7632017-04-10 18:35:22 -0400880 if (!BN_sub(tmp, out, BN_value_one()) ||
881 !BN_gcd(tmp, tmp, e, ctx)) {
882 goto err;
883 }
884 if (BN_is_one(tmp)) {
David Benjamin808f8322017-08-18 14:06:02 -0400885 // Test |out| for primality (steps 4.5.1 and 5.6.1).
David Benjaminfb8b7632017-04-10 18:35:22 -0400886 int is_probable_prime;
887 if (!BN_primality_test(&is_probable_prime, out, BN_prime_checks, ctx, 1,
888 cb)) {
889 goto err;
890 }
891 if (is_probable_prime) {
892 ret = 1;
893 goto err;
894 }
895 }
896
David Benjamin808f8322017-08-18 14:06:02 -0400897 // If we've tried too many times to find a prime, abort (steps 4.7 and
898 // 5.8).
David Benjaminfb8b7632017-04-10 18:35:22 -0400899 tries++;
900 if (tries >= bits * 5) {
901 OPENSSL_PUT_ERROR(RSA, RSA_R_TOO_MANY_ITERATIONS);
902 goto err;
903 }
904 if (!BN_GENCB_call(cb, 2, tries)) {
905 goto err;
906 }
907 }
908
909err:
910 BN_CTX_end(ctx);
911 return ret;
912}
913
David Benjamin073391f2017-05-03 15:03:35 -0400914int RSA_generate_key_ex(RSA *rsa, int bits, BIGNUM *e_value, BN_GENCB *cb) {
David Benjamin808f8322017-08-18 14:06:02 -0400915 // See FIPS 186-4 appendix B.3. This function implements a generalized version
916 // of the FIPS algorithm. |RSA_generate_key_fips| performs additional checks
917 // for FIPS-compliant key generation.
David Benjaminfb8b7632017-04-10 18:35:22 -0400918
David Benjamin808f8322017-08-18 14:06:02 -0400919 // Always generate RSA keys which are a multiple of 128 bits. Round |bits|
920 // down as needed.
David Benjaminb7ded432017-04-11 13:24:31 -0400921 bits &= ~127;
922
David Benjamin808f8322017-08-18 14:06:02 -0400923 // Reject excessively small keys.
David Benjaminb7ded432017-04-11 13:24:31 -0400924 if (bits < 256) {
925 OPENSSL_PUT_ERROR(RSA, RSA_R_KEY_SIZE_TOO_SMALL);
926 return 0;
927 }
928
David Benjaminfb8b7632017-04-10 18:35:22 -0400929 int ret = 0;
930 BN_CTX *ctx = BN_CTX_new();
Adam Langley95c29f32014-06-20 12:00:00 -0700931 if (ctx == NULL) {
David Benjaminfb8b7632017-04-10 18:35:22 -0400932 goto bn_err;
Adam Langley95c29f32014-06-20 12:00:00 -0700933 }
934 BN_CTX_start(ctx);
David Benjamin61ae41f2017-05-04 13:50:39 -0400935 BIGNUM *totient = BN_CTX_get(ctx);
936 BIGNUM *pm1 = BN_CTX_get(ctx);
937 BIGNUM *qm1 = BN_CTX_get(ctx);
938 BIGNUM *gcd = BN_CTX_get(ctx);
939 if (totient == NULL || pm1 == NULL || qm1 == NULL || gcd == NULL) {
David Benjaminfb8b7632017-04-10 18:35:22 -0400940 goto bn_err;
Adam Langley95c29f32014-06-20 12:00:00 -0700941 }
942
David Benjamin808f8322017-08-18 14:06:02 -0400943 // We need the RSA components non-NULL.
David Benjamin43780cb2017-04-10 18:05:19 -0400944 if (!ensure_bignum(&rsa->n) ||
945 !ensure_bignum(&rsa->d) ||
946 !ensure_bignum(&rsa->e) ||
947 !ensure_bignum(&rsa->p) ||
948 !ensure_bignum(&rsa->q) ||
949 !ensure_bignum(&rsa->dmp1) ||
950 !ensure_bignum(&rsa->dmq1) ||
951 !ensure_bignum(&rsa->iqmp)) {
David Benjaminfb8b7632017-04-10 18:35:22 -0400952 goto bn_err;
David Benjamin6eb000d2015-02-11 01:17:41 -0500953 }
Adam Langley95c29f32014-06-20 12:00:00 -0700954
David Benjamin1c703cb2015-06-11 21:42:14 -0400955 if (!BN_copy(rsa->e, e_value)) {
David Benjaminfb8b7632017-04-10 18:35:22 -0400956 goto bn_err;
David Benjamin1c703cb2015-06-11 21:42:14 -0400957 }
Adam Langley95c29f32014-06-20 12:00:00 -0700958
David Benjaminfb8b7632017-04-10 18:35:22 -0400959 int prime_bits = bits / 2;
960 do {
David Benjamin808f8322017-08-18 14:06:02 -0400961 // Generate p and q, each of size |prime_bits|, using the steps outlined in
962 // appendix FIPS 186-4 appendix B.3.3.
David Benjaminfb8b7632017-04-10 18:35:22 -0400963 if (!generate_prime(rsa->p, prime_bits, rsa->e, NULL, ctx, cb) ||
964 !BN_GENCB_call(cb, 3, 0) ||
965 !generate_prime(rsa->q, prime_bits, rsa->e, rsa->p, ctx, cb) ||
966 !BN_GENCB_call(cb, 3, 1)) {
967 goto bn_err;
David Benjamin6eb000d2015-02-11 01:17:41 -0500968 }
David Benjaminfb8b7632017-04-10 18:35:22 -0400969
970 if (BN_cmp(rsa->p, rsa->q) < 0) {
971 BIGNUM *tmp = rsa->p;
972 rsa->p = rsa->q;
973 rsa->q = tmp;
David Benjamin6eb000d2015-02-11 01:17:41 -0500974 }
David Benjaminfb8b7632017-04-10 18:35:22 -0400975
David Benjamin808f8322017-08-18 14:06:02 -0400976 // Calculate d = e^(-1) (mod lcm(p-1, q-1)), per FIPS 186-4. This differs
977 // from typical RSA implementations which use (p-1)*(q-1).
978 //
979 // Note this means the size of d might reveal information about p-1 and
980 // q-1. However, we do operations with Chinese Remainder Theorem, so we only
981 // use d (mod p-1) and d (mod q-1) as exponents. Using a minimal totient
982 // does not affect those two values.
David Benjamin61ae41f2017-05-04 13:50:39 -0400983 if (!BN_sub(pm1, rsa->p, BN_value_one()) ||
984 !BN_sub(qm1, rsa->q, BN_value_one()) ||
985 !BN_mul(totient, pm1, qm1, ctx) ||
986 !BN_gcd(gcd, pm1, qm1, ctx) ||
987 !BN_div(totient, NULL, totient, gcd, ctx) ||
988 !BN_mod_inverse(rsa->d, rsa->e, totient, ctx)) {
David Benjaminfb8b7632017-04-10 18:35:22 -0400989 goto bn_err;
David Benjamin6eb000d2015-02-11 01:17:41 -0500990 }
David Benjaminfb8b7632017-04-10 18:35:22 -0400991
David Benjamin808f8322017-08-18 14:06:02 -0400992 // Check that |rsa->d| > 2^|prime_bits| and try again if it fails. See
993 // appendix B.3.1's guidance on values for d.
David Benjaminfb8b7632017-04-10 18:35:22 -0400994 } while (!rsa_greater_than_pow2(rsa->d, prime_bits));
995
David Benjamin808f8322017-08-18 14:06:02 -0400996 if (// Calculate n.
David Benjaminfb8b7632017-04-10 18:35:22 -0400997 !BN_mul(rsa->n, rsa->p, rsa->q, ctx) ||
David Benjamin808f8322017-08-18 14:06:02 -0400998 // Calculate d mod (p-1).
David Benjamin61ae41f2017-05-04 13:50:39 -0400999 !BN_mod(rsa->dmp1, rsa->d, pm1, ctx) ||
David Benjamin808f8322017-08-18 14:06:02 -04001000 // Calculate d mod (q-1)
David Benjamin61ae41f2017-05-04 13:50:39 -04001001 !BN_mod(rsa->dmq1, rsa->d, qm1, ctx)) {
David Benjaminfb8b7632017-04-10 18:35:22 -04001002 goto bn_err;
Adam Langley95c29f32014-06-20 12:00:00 -07001003 }
Adam Langley839b8812015-05-26 11:36:46 -07001004
David Benjamin808f8322017-08-18 14:06:02 -04001005 // Sanity-check that |rsa->n| has the specified size. This is implied by
1006 // |generate_prime|'s bounds.
David Benjaminfb8b7632017-04-10 18:35:22 -04001007 if (BN_num_bits(rsa->n) != (unsigned)bits) {
1008 OPENSSL_PUT_ERROR(RSA, ERR_R_INTERNAL_ERROR);
Adam Langley95c29f32014-06-20 12:00:00 -07001009 goto err;
David Benjamin6eb000d2015-02-11 01:17:41 -05001010 }
Adam Langley95c29f32014-06-20 12:00:00 -07001011
David Benjamin808f8322017-08-18 14:06:02 -04001012 // Calculate inverse of q mod p. Note that although RSA key generation is far
1013 // from constant-time, |bn_mod_inverse_secret_prime| uses the same modular
1014 // exponentation logic as in RSA private key operations and, if the RSAZ-1024
1015 // code is enabled, will be optimized for common RSA prime sizes.
David Benjamin0b8dc302016-12-17 14:27:16 -05001016 if (!BN_MONT_CTX_set_locked(&rsa->mont_p, &rsa->lock, rsa->p, ctx) ||
David Benjamin0a211df2016-12-17 15:25:55 -05001017 !bn_mod_inverse_secret_prime(rsa->iqmp, rsa->q, rsa->p, ctx,
1018 rsa->mont_p)) {
David Benjaminfb8b7632017-04-10 18:35:22 -04001019 goto bn_err;
David Benjamin6eb000d2015-02-11 01:17:41 -05001020 }
Adam Langley95c29f32014-06-20 12:00:00 -07001021
David Benjamin808f8322017-08-18 14:06:02 -04001022 // The key generation process is complex and thus error-prone. It could be
1023 // disastrous to generate and then use a bad key so double-check that the key
1024 // makes sense.
David Benjaminfb8b7632017-04-10 18:35:22 -04001025 if (!RSA_check_key(rsa)) {
Brian Smithfebf7712016-03-21 13:47:32 -10001026 OPENSSL_PUT_ERROR(RSA, RSA_R_INTERNAL_ERROR);
David Benjaminfb8b7632017-04-10 18:35:22 -04001027 goto err;
Brian Smithfebf7712016-03-21 13:47:32 -10001028 }
1029
David Benjaminfb8b7632017-04-10 18:35:22 -04001030 ret = 1;
1031
1032bn_err:
1033 if (!ret) {
David Benjamin3570d732015-06-29 00:28:17 -04001034 OPENSSL_PUT_ERROR(RSA, ERR_LIB_BN);
Adam Langley95c29f32014-06-20 12:00:00 -07001035 }
David Benjaminfb8b7632017-04-10 18:35:22 -04001036err:
Adam Langley95c29f32014-06-20 12:00:00 -07001037 if (ctx != NULL) {
1038 BN_CTX_end(ctx);
1039 BN_CTX_free(ctx);
1040 }
David Benjaminfb8b7632017-04-10 18:35:22 -04001041 return ret;
Adam Langley95c29f32014-06-20 12:00:00 -07001042}
1043
Steven Valdez467d3222017-05-16 14:35:22 -04001044int RSA_generate_key_fips(RSA *rsa, int bits, BN_GENCB *cb) {
David Benjamin808f8322017-08-18 14:06:02 -04001045 // FIPS 186-4 allows 2048-bit and 3072-bit RSA keys (1024-bit and 1536-bit
1046 // primes, respectively) with the prime generation method we use.
Steven Valdez467d3222017-05-16 14:35:22 -04001047 if (bits != 2048 && bits != 3072) {
1048 OPENSSL_PUT_ERROR(RSA, RSA_R_BAD_RSA_PARAMETERS);
1049 return 0;
1050 }
1051
1052 BIGNUM *e = BN_new();
1053 int ret = e != NULL &&
1054 BN_set_word(e, RSA_F4) &&
1055 RSA_generate_key_ex(rsa, bits, e, cb) &&
1056 RSA_check_fips(rsa);
1057 BN_free(e);
1058 return ret;
1059}
1060
Adam Langley96dec442017-05-03 11:50:51 -07001061DEFINE_METHOD_FUNCTION(RSA_METHOD, RSA_default_method) {
David Benjamin808f8322017-08-18 14:06:02 -04001062 // All of the methods are NULL to make it easier for the compiler/linker to
1063 // drop unused functions. The wrapper functions will select the appropriate
1064 // |rsa_default_*| implementation.
Adam Langley96dec442017-05-03 11:50:51 -07001065 OPENSSL_memset(out, 0, sizeof(RSA_METHOD));
1066 out->common.is_static = 1;
1067 out->flags = RSA_FLAG_CACHE_PUBLIC | RSA_FLAG_CACHE_PRIVATE;
1068}