blob: 211b690331a4413087c1b0906102d8ac36529237 [file] [log] [blame]
Kenny Rootb8494592015-09-25 02:29:14 +00001/* 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
59#include <stdlib.h>
60#include <string.h>
61
Robert Sloana94fe052017-02-21 08:49:28 -080062#include <gtest/gtest.h>
63
Kenny Rootb8494592015-09-25 02:29:14 +000064#include <openssl/bn.h>
65#include <openssl/bytestring.h>
66#include <openssl/crypto.h>
67#include <openssl/err.h>
David Benjamin4969cc92016-04-22 15:02:23 -040068#include <openssl/nid.h>
Kenny Rootb8494592015-09-25 02:29:14 +000069
Robert Sloan8ff03552017-06-14 12:40:58 -070070#include "../fipsmodule/bn/internal.h"
71#include "../fipsmodule/rsa/internal.h"
Robert Sloan69939df2017-01-09 10:53:07 -080072#include "../internal.h"
Robert Sloana94fe052017-02-21 08:49:28 -080073#include "../test/test_util.h"
Robert Sloan69939df2017-01-09 10:53:07 -080074
Kenny Rootb8494592015-09-25 02:29:14 +000075
76// kPlaintext is a sample plaintext.
77static const uint8_t kPlaintext[] = "\x54\x85\x9b\x34\x2c\x49\xea\x2a";
78static const size_t kPlaintextLen = sizeof(kPlaintext) - 1;
79
80// kKey1 is a DER-encoded RSAPrivateKey.
81static const uint8_t kKey1[] =
82 "\x30\x82\x01\x38\x02\x01\x00\x02\x41\x00\xaa\x36\xab\xce\x88\xac\xfd\xff"
83 "\x55\x52\x3c\x7f\xc4\x52\x3f\x90\xef\xa0\x0d\xf3\x77\x4a\x25\x9f\x2e\x62"
84 "\xb4\xc5\xd9\x9c\xb5\xad\xb3\x00\xa0\x28\x5e\x53\x01\x93\x0e\x0c\x70\xfb"
85 "\x68\x76\x93\x9c\xe6\x16\xce\x62\x4a\x11\xe0\x08\x6d\x34\x1e\xbc\xac\xa0"
86 "\xa1\xf5\x02\x01\x11\x02\x40\x0a\x03\x37\x48\x62\x64\x87\x69\x5f\x5f\x30"
87 "\xbc\x38\xb9\x8b\x44\xc2\xcd\x2d\xff\x43\x40\x98\xcd\x20\xd8\xa1\x38\xd0"
88 "\x90\xbf\x64\x79\x7c\x3f\xa7\xa2\xcd\xcb\x3c\xd1\xe0\xbd\xba\x26\x54\xb4"
89 "\xf9\xdf\x8e\x8a\xe5\x9d\x73\x3d\x9f\x33\xb3\x01\x62\x4a\xfd\x1d\x51\x02"
90 "\x21\x00\xd8\x40\xb4\x16\x66\xb4\x2e\x92\xea\x0d\xa3\xb4\x32\x04\xb5\xcf"
91 "\xce\x33\x52\x52\x4d\x04\x16\xa5\xa4\x41\xe7\x00\xaf\x46\x12\x0d\x02\x21"
92 "\x00\xc9\x7f\xb1\xf0\x27\xf4\x53\xf6\x34\x12\x33\xea\xaa\xd1\xd9\x35\x3f"
93 "\x6c\x42\xd0\x88\x66\xb1\xd0\x5a\x0f\x20\x35\x02\x8b\x9d\x89\x02\x20\x59"
94 "\x0b\x95\x72\xa2\xc2\xa9\xc4\x06\x05\x9d\xc2\xab\x2f\x1d\xaf\xeb\x7e\x8b"
95 "\x4f\x10\xa7\x54\x9e\x8e\xed\xf5\xb4\xfc\xe0\x9e\x05\x02\x21\x00\x8e\x3c"
96 "\x05\x21\xfe\x15\xe0\xea\x06\xa3\x6f\xf0\xf1\x0c\x99\x52\xc3\x5b\x7a\x75"
97 "\x14\xfd\x32\x38\xb8\x0a\xad\x52\x98\x62\x8d\x51\x02\x20\x36\x3f\xf7\x18"
98 "\x9d\xa8\xe9\x0b\x1d\x34\x1f\x71\xd0\x9b\x76\xa8\xa9\x43\xe1\x1d\x10\xb2"
99 "\x4d\x24\x9f\x2d\xea\xfe\xf8\x0c\x18\x26";
100
Robert Sloan572a4e22017-04-17 10:52:19 -0700101// kFIPSKey is a DER-encoded RSAPrivateKey that is FIPS-compliant.
102static const uint8_t kFIPSKey[] =
103 "\x30\x82\x02\x5c\x02\x01\x00\x02\x81\x81\x00\xa1\x71\x90\x77\x86\x8a\xc7"
104 "\xb8\xfc\x2a\x45\x82\x6d\xee\xeb\x35\x3a\x18\x3f\xb6\xb0\x1e\xb1\xd3\x09"
105 "\x6b\x05\x4d\xec\x1c\x37\x6f\x09\x31\x32\xda\x21\x8a\x49\x0e\x16\x28\xed"
106 "\x9a\x30\xf3\x14\x53\xfd\x5b\xb0\xf6\x4a\x5d\x52\xe1\xda\xe1\x40\x6e\x65"
107 "\xbf\xca\x45\xd9\x62\x96\x4a\x1e\x11\xc4\x61\x83\x1f\x58\x8d\x5e\xd0\x12"
108 "\xaf\xa5\xec\x9b\x97\x2f\x6c\xb2\x82\x4a\x73\xd0\xd3\x9a\xc9\x69\x6b\x24"
109 "\x3c\x82\x6f\xee\x4d\x0c\x7e\xdf\xd7\xae\xea\x3a\xeb\x04\x27\x8d\x43\x81"
110 "\x59\xa7\x90\x56\xc1\x69\x42\xb3\xaf\x1c\x8d\x4e\xbf\x02\x03\x01\x00\x01"
111 "\x02\x81\x80\x60\x82\xcd\x44\x46\xcf\xeb\xf9\x6f\xf5\xad\x3b\xfd\x90\x18"
112 "\x57\xe7\x74\xdb\x91\xd0\xd3\x68\xa6\xaa\x38\xaa\x21\x1d\x06\xf9\x34\x8d"
113 "\xa0\x35\xb0\x24\xe0\xd0\x2f\x75\x9b\xdd\xfe\x91\x48\x9f\x5c\x5e\x57\x54"
114 "\x00\xc8\x0f\xe6\x1e\x52\x84\xd9\xc9\xa5\x55\xf4\x0a\xbe\x88\x46\x7a\xfb"
115 "\x18\x37\x8e\xe6\x6e\xa2\x5f\x80\x48\x34\x3f\x5c\xbe\x0e\x1e\xe8\x2f\x50"
116 "\xba\x14\x96\x3c\xea\xfb\xd2\x49\x33\xdc\x12\xb8\xa7\x8a\xb5\x27\xf9\x00"
117 "\x4b\xf5\xd2\x2a\xd0\x2c\x1d\x9b\xd5\x6c\x3e\x4b\xb9\x7e\x39\xf7\x3e\x39"
118 "\xc9\x47\x5e\xbe\x91\x02\x41\x00\xcd\x33\xcf\x37\x01\xd7\x59\xcc\xbe\xa0"
119 "\x1c\xb9\xf5\xe7\x44\x9f\x62\x91\xa7\xa7\x7b\x0c\x52\xcd\x7e\xe6\x31\x11"
120 "\x8b\xd8\x2c\x8a\x63\xe1\x07\xc9\xcb\xce\x01\x45\x63\xf5\x5d\x44\xfb\xeb"
121 "\x8d\x74\x16\x20\x7d\x3b\xb4\xa1\x61\xb0\xa8\x29\x51\xc9\xef\xb6\xa1\xd5"
122 "\x02\x41\x00\xc9\x68\xa6\xd3\x88\xd5\x49\x9d\x6b\x44\x96\xfd\xbf\x66\x27"
123 "\xb4\x1f\x90\x76\x86\x2f\xe2\xce\x20\x5d\xee\x9b\xeb\xc4\xb4\x62\x47\x79"
124 "\x99\xb1\x99\xbc\xa2\xa6\xb6\x96\x64\xd5\x77\x9b\x45\xd4\xf0\x99\xb5\x9e"
125 "\x61\x4d\xf5\x12\xdd\x84\x14\xaf\x1e\xdd\x83\x24\x43\x02\x40\x60\x29\x7f"
126 "\x59\xcf\xcb\x13\x92\x17\x63\x01\x13\x44\x61\x74\x8f\x1c\xaa\x15\x5f\x2f"
127 "\x12\xbf\x5a\xfd\xb4\xf2\x19\xbe\xe7\x37\x38\x43\x46\x19\x58\x3f\xe1\xf2"
128 "\x46\x8a\x69\x59\xa4\x12\x4a\x78\xa7\x86\x17\x03\x99\x0f\x34\xf1\x8a\xcf"
129 "\xc3\x4d\x48\xcc\xc5\x51\x61\x02\x41\x00\xc2\x12\xb3\x5d\xf5\xe5\xff\xcf"
130 "\x4e\x43\x83\x72\xf2\xf1\x4e\xa4\xc4\x1d\x81\xf7\xff\x40\x7e\xfa\xb5\x48"
131 "\x6c\xba\x1c\x8a\xec\x80\x8e\xed\xc8\x32\xa9\x8f\xd9\x30\xeb\x6e\x32\x3b"
132 "\xd4\x44\xcf\xd1\x1f\x6b\xe0\x37\x46\xd5\x35\xde\x79\x9d\x2c\xb9\x83\x1d"
133 "\x10\xdd\x02\x40\x0f\x14\x95\x96\xa0\xe2\x6c\xd4\x88\xa7\x0b\x82\x14\x10"
134 "\xad\x26\x0d\xe4\xa1\x5e\x01\x3d\x21\xd2\xfb\x0e\xf9\x58\xa5\xca\x1e\x21"
135 "\xb3\xf5\x9a\x6c\x3d\x5a\x72\xb1\x2d\xfe\xac\x09\x4f\xdd\xe5\x44\xd1\x4e"
136 "\xf8\x59\x85\x3a\x65\xe2\xcd\xbc\x27\x1d\x9b\x48\x9f\xb9";
137
138static const uint8_t kFIPSPublicKey[] =
139 "\x30\x81\x89\x02\x81\x81\x00\xa1\x71\x90\x77\x86\x8a\xc7\xb8\xfc\x2a\x45"
140 "\x82\x6d\xee\xeb\x35\x3a\x18\x3f\xb6\xb0\x1e\xb1\xd3\x09\x6b\x05\x4d\xec"
141 "\x1c\x37\x6f\x09\x31\x32\xda\x21\x8a\x49\x0e\x16\x28\xed\x9a\x30\xf3\x14"
142 "\x53\xfd\x5b\xb0\xf6\x4a\x5d\x52\xe1\xda\xe1\x40\x6e\x65\xbf\xca\x45\xd9"
143 "\x62\x96\x4a\x1e\x11\xc4\x61\x83\x1f\x58\x8d\x5e\xd0\x12\xaf\xa5\xec\x9b"
144 "\x97\x2f\x6c\xb2\x82\x4a\x73\xd0\xd3\x9a\xc9\x69\x6b\x24\x3c\x82\x6f\xee"
145 "\x4d\x0c\x7e\xdf\xd7\xae\xea\x3a\xeb\x04\x27\x8d\x43\x81\x59\xa7\x90\x56"
146 "\xc1\x69\x42\xb3\xaf\x1c\x8d\x4e\xbf\x02\x03\x01\x00\x01";
147
Kenny Rootb8494592015-09-25 02:29:14 +0000148// kOAEPCiphertext1 is a sample encryption of |kPlaintext| with |kKey1| using
149// RSA OAEP.
150static const uint8_t kOAEPCiphertext1[] =
151 "\x1b\x8f\x05\xf9\xca\x1a\x79\x52\x6e\x53\xf3\xcc\x51\x4f\xdb\x89\x2b\xfb"
152 "\x91\x93\x23\x1e\x78\xb9\x92\xe6\x8d\x50\xa4\x80\xcb\x52\x33\x89\x5c\x74"
153 "\x95\x8d\x5d\x02\xab\x8c\x0f\xd0\x40\xeb\x58\x44\xb0\x05\xc3\x9e\xd8\x27"
154 "\x4a\x9d\xbf\xa8\x06\x71\x40\x94\x39\xd2";
155
156// kKey2 is a DER-encoded RSAPrivateKey.
157static const uint8_t kKey2[] =
158 "\x30\x81\xfb\x02\x01\x00\x02\x33\x00\xa3\x07\x9a\x90\xdf\x0d\xfd\x72\xac"
159 "\x09\x0c\xcc\x2a\x78\xb8\x74\x13\x13\x3e\x40\x75\x9c\x98\xfa\xf8\x20\x4f"
160 "\x35\x8a\x0b\x26\x3c\x67\x70\xe7\x83\xa9\x3b\x69\x71\xb7\x37\x79\xd2\x71"
161 "\x7b\xe8\x34\x77\xcf\x02\x01\x03\x02\x32\x6c\xaf\xbc\x60\x94\xb3\xfe\x4c"
162 "\x72\xb0\xb3\x32\xc6\xfb\x25\xa2\xb7\x62\x29\x80\x4e\x68\x65\xfc\xa4\x5a"
163 "\x74\xdf\x0f\x8f\xb8\x41\x3b\x52\xc0\xd0\xe5\x3d\x9b\x59\x0f\xf1\x9b\xe7"
164 "\x9f\x49\xdd\x21\xe5\xeb\x02\x1a\x00\xcf\x20\x35\x02\x8b\x9d\x86\x98\x40"
165 "\xb4\x16\x66\xb4\x2e\x92\xea\x0d\xa3\xb4\x32\x04\xb5\xcf\xce\x91\x02\x1a"
166 "\x00\xc9\x7f\xb1\xf0\x27\xf4\x53\xf6\x34\x12\x33\xea\xaa\xd1\xd9\x35\x3f"
167 "\x6c\x42\xd0\x88\x66\xb1\xd0\x5f\x02\x1a\x00\x8a\x15\x78\xac\x5d\x13\xaf"
168 "\x10\x2b\x22\xb9\x99\xcd\x74\x61\xf1\x5e\x6d\x22\xcc\x03\x23\xdf\xdf\x0b"
169 "\x02\x1a\x00\x86\x55\x21\x4a\xc5\x4d\x8d\x4e\xcd\x61\x77\xf1\xc7\x36\x90"
170 "\xce\x2a\x48\x2c\x8b\x05\x99\xcb\xe0\x3f\x02\x1a\x00\x83\xef\xef\xb8\xa9"
171 "\xa4\x0d\x1d\xb6\xed\x98\xad\x84\xed\x13\x35\xdc\xc1\x08\xf3\x22\xd0\x57"
172 "\xcf\x8d";
173
174// kOAEPCiphertext2 is a sample encryption of |kPlaintext| with |kKey2| using
175// RSA OAEP.
176static const uint8_t kOAEPCiphertext2[] =
177 "\x14\xbd\xdd\x28\xc9\x83\x35\x19\x23\x80\xe8\xe5\x49\xb1\x58\x2a\x8b\x40"
178 "\xb4\x48\x6d\x03\xa6\xa5\x31\x1f\x1f\xd5\xf0\xa1\x80\xe4\x17\x53\x03\x29"
179 "\xa9\x34\x90\x74\xb1\x52\x13\x54\x29\x08\x24\x52\x62\x51";
180
181// kKey3 is a DER-encoded RSAPrivateKey.
182static const uint8_t kKey3[] =
183 "\x30\x82\x02\x5b\x02\x01\x00\x02\x81\x81\x00\xbb\xf8\x2f\x09\x06\x82\xce"
184 "\x9c\x23\x38\xac\x2b\x9d\xa8\x71\xf7\x36\x8d\x07\xee\xd4\x10\x43\xa4\x40"
185 "\xd6\xb6\xf0\x74\x54\xf5\x1f\xb8\xdf\xba\xaf\x03\x5c\x02\xab\x61\xea\x48"
186 "\xce\xeb\x6f\xcd\x48\x76\xed\x52\x0d\x60\xe1\xec\x46\x19\x71\x9d\x8a\x5b"
187 "\x8b\x80\x7f\xaf\xb8\xe0\xa3\xdf\xc7\x37\x72\x3e\xe6\xb4\xb7\xd9\x3a\x25"
188 "\x84\xee\x6a\x64\x9d\x06\x09\x53\x74\x88\x34\xb2\x45\x45\x98\x39\x4e\xe0"
189 "\xaa\xb1\x2d\x7b\x61\xa5\x1f\x52\x7a\x9a\x41\xf6\xc1\x68\x7f\xe2\x53\x72"
190 "\x98\xca\x2a\x8f\x59\x46\xf8\xe5\xfd\x09\x1d\xbd\xcb\x02\x01\x11\x02\x81"
191 "\x81\x00\xa5\xda\xfc\x53\x41\xfa\xf2\x89\xc4\xb9\x88\xdb\x30\xc1\xcd\xf8"
192 "\x3f\x31\x25\x1e\x06\x68\xb4\x27\x84\x81\x38\x01\x57\x96\x41\xb2\x94\x10"
193 "\xb3\xc7\x99\x8d\x6b\xc4\x65\x74\x5e\x5c\x39\x26\x69\xd6\x87\x0d\xa2\xc0"
194 "\x82\xa9\x39\xe3\x7f\xdc\xb8\x2e\xc9\x3e\xda\xc9\x7f\xf3\xad\x59\x50\xac"
195 "\xcf\xbc\x11\x1c\x76\xf1\xa9\x52\x94\x44\xe5\x6a\xaf\x68\xc5\x6c\x09\x2c"
196 "\xd3\x8d\xc3\xbe\xf5\xd2\x0a\x93\x99\x26\xed\x4f\x74\xa1\x3e\xdd\xfb\xe1"
197 "\xa1\xce\xcc\x48\x94\xaf\x94\x28\xc2\xb7\xb8\x88\x3f\xe4\x46\x3a\x4b\xc8"
198 "\x5b\x1c\xb3\xc1\x02\x41\x00\xee\xcf\xae\x81\xb1\xb9\xb3\xc9\x08\x81\x0b"
199 "\x10\xa1\xb5\x60\x01\x99\xeb\x9f\x44\xae\xf4\xfd\xa4\x93\xb8\x1a\x9e\x3d"
200 "\x84\xf6\x32\x12\x4e\xf0\x23\x6e\x5d\x1e\x3b\x7e\x28\xfa\xe7\xaa\x04\x0a"
201 "\x2d\x5b\x25\x21\x76\x45\x9d\x1f\x39\x75\x41\xba\x2a\x58\xfb\x65\x99\x02"
202 "\x41\x00\xc9\x7f\xb1\xf0\x27\xf4\x53\xf6\x34\x12\x33\xea\xaa\xd1\xd9\x35"
203 "\x3f\x6c\x42\xd0\x88\x66\xb1\xd0\x5a\x0f\x20\x35\x02\x8b\x9d\x86\x98\x40"
204 "\xb4\x16\x66\xb4\x2e\x92\xea\x0d\xa3\xb4\x32\x04\xb5\xcf\xce\x33\x52\x52"
205 "\x4d\x04\x16\xa5\xa4\x41\xe7\x00\xaf\x46\x15\x03\x02\x40\x54\x49\x4c\xa6"
206 "\x3e\xba\x03\x37\xe4\xe2\x40\x23\xfc\xd6\x9a\x5a\xeb\x07\xdd\xdc\x01\x83"
207 "\xa4\xd0\xac\x9b\x54\xb0\x51\xf2\xb1\x3e\xd9\x49\x09\x75\xea\xb7\x74\x14"
208 "\xff\x59\xc1\xf7\x69\x2e\x9a\x2e\x20\x2b\x38\xfc\x91\x0a\x47\x41\x74\xad"
209 "\xc9\x3c\x1f\x67\xc9\x81\x02\x40\x47\x1e\x02\x90\xff\x0a\xf0\x75\x03\x51"
210 "\xb7\xf8\x78\x86\x4c\xa9\x61\xad\xbd\x3a\x8a\x7e\x99\x1c\x5c\x05\x56\xa9"
211 "\x4c\x31\x46\xa7\xf9\x80\x3f\x8f\x6f\x8a\xe3\x42\xe9\x31\xfd\x8a\xe4\x7a"
212 "\x22\x0d\x1b\x99\xa4\x95\x84\x98\x07\xfe\x39\xf9\x24\x5a\x98\x36\xda\x3d"
213 "\x02\x41\x00\xb0\x6c\x4f\xda\xbb\x63\x01\x19\x8d\x26\x5b\xdb\xae\x94\x23"
214 "\xb3\x80\xf2\x71\xf7\x34\x53\x88\x50\x93\x07\x7f\xcd\x39\xe2\x11\x9f\xc9"
215 "\x86\x32\x15\x4f\x58\x83\xb1\x67\xa9\x67\xbf\x40\x2b\x4e\x9e\x2e\x0f\x96"
216 "\x56\xe6\x98\xea\x36\x66\xed\xfb\x25\x79\x80\x39\xf7";
217
218// kOAEPCiphertext3 is a sample encryption of |kPlaintext| with |kKey3| using
219// RSA OAEP.
220static const uint8_t kOAEPCiphertext3[] =
221 "\xb8\x24\x6b\x56\xa6\xed\x58\x81\xae\xb5\x85\xd9\xa2\x5b\x2a\xd7\x90\xc4"
222 "\x17\xe0\x80\x68\x1b\xf1\xac\x2b\xc3\xde\xb6\x9d\x8b\xce\xf0\xc4\x36\x6f"
223 "\xec\x40\x0a\xf0\x52\xa7\x2e\x9b\x0e\xff\xb5\xb3\xf2\xf1\x92\xdb\xea\xca"
224 "\x03\xc1\x27\x40\x05\x71\x13\xbf\x1f\x06\x69\xac\x22\xe9\xf3\xa7\x85\x2e"
225 "\x3c\x15\xd9\x13\xca\xb0\xb8\x86\x3a\x95\xc9\x92\x94\xce\x86\x74\x21\x49"
226 "\x54\x61\x03\x46\xf4\xd4\x74\xb2\x6f\x7c\x48\xb4\x2e\xe6\x8e\x1f\x57\x2a"
227 "\x1f\xc4\x02\x6a\xc4\x56\xb4\xf5\x9f\x7b\x62\x1e\xa1\xb9\xd8\x8f\x64\x20"
228 "\x2f\xb1";
229
230static const uint8_t kTwoPrimeKey[] =
231 "\x30\x82\x04\xa1\x02\x01\x00\x02\x82\x01\x01\x00\x93\x3a\x4f\xc9\x6a\x0a"
232 "\x6b\x28\x04\xfa\xb7\x05\x56\xdf\xa0\xaa\x4f\xaa\xab\x94\xa0\xa9\x25\xef"
233 "\xc5\x96\xd2\xd4\x66\x16\x62\x2c\x13\x7b\x91\xd0\x36\x0a\x10\x11\x6d\x7a"
234 "\x91\xb6\xe4\x74\x57\xc1\x3d\x7a\xbe\x24\x05\x3a\x04\x0b\x73\x91\x53\xb1"
235 "\x74\x10\xe1\x87\xdc\x91\x28\x9c\x1e\xe5\xf2\xb9\xfc\xa2\x48\x34\xb6\x78"
236 "\xed\x6d\x95\xfb\xf2\xc0\x4e\x1c\xa4\x15\x00\x3c\x8a\x68\x2b\xd6\xce\xd5"
237 "\xb3\x9f\x66\x02\xa7\x0d\x08\xa3\x23\x9b\xe5\x36\x96\x13\x22\xf9\x69\xa6"
238 "\x87\x88\x9b\x85\x3f\x83\x9c\xab\x1a\x1b\x6d\x8d\x16\xf4\x5e\xbd\xee\x4b"
239 "\x59\x56\xf8\x9d\x58\xcd\xd2\x83\x85\x59\x43\x84\x63\x4f\xe6\x1a\x86\x66"
240 "\x0d\xb5\xa0\x87\x89\xb6\x13\x82\x43\xda\x34\x92\x3b\x68\xc4\x95\x71\x2f"
241 "\x15\xc2\xe0\x43\x67\x3c\x08\x00\x36\x10\xc3\xb4\x46\x4c\x4e\x6e\xf5\x44"
242 "\xa9\x04\x44\x9d\xce\xc7\x05\x79\xee\x11\xcf\xaf\x2c\xd7\x9a\x32\xd3\xa5"
243 "\x30\xd4\x3a\x78\x43\x37\x74\x22\x90\x24\x04\x11\xd7\x95\x08\x52\xa4\x71"
244 "\x41\x68\x94\xb0\xa0\xc3\xec\x4e\xd2\xc4\x30\x71\x98\x64\x9c\xe3\x7c\x76"
245 "\xef\x33\xa3\x2b\xb1\x87\x63\xd2\x5c\x09\xfc\x90\x2d\x92\xf4\x57\x02\x01"
246 "\x03\x02\x82\x01\x00\x62\x26\xdf\xdb\x9c\x06\xf2\x1a\xad\xfc\x7a\x03\x8f"
247 "\x3f\xc0\x71\x8a\x71\xc7\xb8\x6b\x1b\x6e\x9f\xd9\x0f\x37\x38\x44\x0e\xec"
248 "\x1d\x62\x52\x61\x35\x79\x5c\x0a\xb6\x48\xfc\x61\x24\x98\x4d\x8f\xd6\x28"
249 "\xfc\x7e\xc2\xae\x26\xad\x5c\xf7\xb6\x37\xcb\xa2\xb5\xeb\xaf\xe8\x60\xc5"
250 "\xbd\x69\xee\xa1\xd1\x53\x16\xda\xcd\xce\xfb\x48\xf3\xb9\x52\xa1\xd5\x89"
251 "\x68\x6d\x63\x55\x7d\xb1\x9a\xc7\xe4\x89\xe3\xcd\x14\xee\xac\x6f\x5e\x05"
252 "\xc2\x17\xbd\x43\x79\xb9\x62\x17\x50\xf1\x19\xaf\xb0\x67\xae\x2a\x57\xbd"
253 "\xc7\x66\xbc\xf3\xb3\x64\xa1\xe3\x16\x74\x9e\xea\x02\x5c\xab\x94\xd8\x97"
254 "\x02\x42\x0c\x2c\xba\x54\xb9\xaf\xe0\x45\x93\xad\x7f\xb3\x10\x6a\x96\x50"
255 "\x4b\xaf\xcf\xc8\x27\x62\x2d\x83\xe9\x26\xc6\x94\xc1\xef\x5c\x8e\x06\x42"
256 "\x53\xe5\x56\xaf\xc2\x99\x01\xaa\x9a\x71\xbc\xe8\x21\x33\x2a\x2d\xa3\x36"
257 "\xac\x1b\x86\x19\xf8\xcd\x1f\x80\xa4\x26\x98\xb8\x9f\x62\x62\xd5\x1a\x7f"
258 "\xee\xdb\xdf\x81\xd3\x21\xdb\x33\x92\xee\xff\xe2\x2f\x32\x77\x73\x6a\x58"
259 "\xab\x21\xf3\xe3\xe1\xbc\x4f\x12\x72\xa6\xb5\xc2\xfb\x27\x9e\xc8\xca\xab"
260 "\x64\xa0\x87\x07\x9d\xef\xca\x0f\xdb\x02\x81\x81\x00\xe6\xd3\x4d\xc0\xa1"
261 "\x91\x0e\x62\xfd\xb0\xdd\xc6\x30\xb8\x8c\xcb\x14\xc1\x4b\x69\x30\xdd\xcd"
262 "\x86\x67\xcb\x37\x14\xc5\x03\xd2\xb4\x69\xab\x3d\xe5\x16\x81\x0f\xe5\x50"
263 "\xf4\x18\xb1\xec\xbc\x71\xe9\x80\x99\x06\xe4\xa3\xfe\x44\x84\x4a\x2d\x1e"
264 "\x07\x7f\x22\x70\x6d\x4f\xd4\x93\x0b\x8b\x99\xce\x1e\xab\xcd\x4c\xd2\xd3"
265 "\x10\x47\x5c\x09\x9f\x6d\x82\xc0\x08\x75\xe3\x3d\x83\xc2\x19\x50\x29\xec"
266 "\x1f\x84\x29\xcc\xf1\x56\xee\xbd\x54\x5d\xe6\x19\xdf\x0d\x1c\xa4\xbb\x0a"
267 "\xfe\x84\x44\x29\x1d\xf9\x5c\x80\x96\x5b\x24\xb4\xf7\x02\x1b\x02\x81\x81"
268 "\x00\xa3\x48\xf1\x9c\x58\xc2\x5f\x38\xfb\xd8\x12\x39\xf1\x8e\x73\xa1\xcf"
269 "\x78\x12\xe0\xed\x2a\xbb\xef\xac\x23\xb2\xbf\xd6\x0c\xe9\x6e\x1e\xab\xea"
270 "\x3f\x68\x36\xa7\x1f\xe5\xab\xe0\x86\xa5\x76\x32\x98\xdd\x75\xb5\x2b\xbc"
271 "\xcb\x8a\x03\x00\x7c\x2e\xca\xf8\xbc\x19\xe4\xe3\xa3\x31\xbd\x1d\x20\x2b"
272 "\x09\xad\x6f\x4c\xed\x48\xd4\xdf\x87\xf9\xf0\x46\xb9\x86\x4c\x4b\x71\xe7"
273 "\x48\x78\xdc\xed\xc7\x82\x02\x44\xd3\xa6\xb3\x10\x5f\x62\x81\xfc\xb8\xe4"
274 "\x0e\xf4\x1a\xdd\xab\x3f\xbc\x63\x79\x5b\x39\x69\x5e\xea\xa9\x15\xfe\x90"
275 "\xec\xda\x75\x02\x81\x81\x00\x99\xe2\x33\xd5\xc1\x0b\x5e\xec\xa9\x20\x93"
276 "\xd9\x75\xd0\x5d\xdc\xb8\x80\xdc\xf0\xcb\x3e\x89\x04\x45\x32\x24\xb8\x83"
277 "\x57\xe1\xcd\x9b\xc7\x7e\x98\xb9\xab\x5f\xee\x35\xf8\x10\x76\x9d\xd2\xf6"
278 "\x9b\xab\x10\xaf\x43\x17\xfe\xd8\x58\x31\x73\x69\x5a\x54\xc1\xa0\x48\xdf"
279 "\xe3\x0c\xb2\x5d\x11\x34\x14\x72\x88\xdd\xe1\xe2\x0a\xda\x3d\x5b\xbf\x9e"
280 "\x57\x2a\xb0\x4e\x97\x7e\x57\xd6\xbb\x8a\xc6\x9d\x6a\x58\x1b\xdd\xf6\x39"
281 "\xf4\x7e\x38\x3e\x99\x66\x94\xb3\x68\x6d\xd2\x07\x54\x58\x2d\x70\xbe\xa6"
282 "\x3d\xab\x0e\xe7\x6d\xcd\xfa\x01\x67\x02\x81\x80\x6c\xdb\x4b\xbd\x90\x81"
283 "\x94\xd0\xa7\xe5\x61\x7b\xf6\x5e\xf7\xc1\x34\xfa\xb7\x40\x9e\x1c\x7d\x4a"
284 "\x72\xc2\x77\x2a\x8e\xb3\x46\x49\x69\xc7\xf1\x7f\x9a\xcf\x1a\x15\x43\xc7"
285 "\xeb\x04\x6e\x4e\xcc\x65\xe8\xf9\x23\x72\x7d\xdd\x06\xac\xaa\xfd\x74\x87"
286 "\x50\x7d\x66\x98\x97\xc2\x21\x28\xbe\x15\x72\x06\x73\x9f\x88\x9e\x30\x8d"
287 "\xea\x5a\xa6\xa0\x2f\x26\x59\x88\x32\x4b\xef\x85\xa5\xe8\x9e\x85\x01\x56"
288 "\xd8\x8d\x19\xcc\xb5\x94\xec\x56\xa8\x7b\x42\xb4\xa2\xbc\x93\xc7\x7f\xd2"
289 "\xec\xfb\x92\x26\x46\x3f\x47\x1b\x63\xff\x0b\x48\x91\xa3\x02\x81\x80\x2c"
290 "\x4a\xb9\xa4\x46\x7b\xff\x50\x7e\xbf\x60\x47\x3b\x2b\x66\x82\xdc\x0e\x53"
291 "\x65\x71\xe9\xda\x2a\xb8\x32\x93\x42\xb7\xff\xea\x67\x66\xf1\xbc\x87\x28"
292 "\x65\x29\x79\xca\xab\x93\x56\xda\x95\xc1\x26\x44\x3d\x27\xc1\x91\xc6\x9b"
293 "\xd9\xec\x9d\xb7\x49\xe7\x16\xee\x99\x87\x50\x95\x81\xd4\x5c\x5b\x5a\x5d"
294 "\x0a\x43\xa5\xa7\x8f\x5a\x80\x49\xa0\xb7\x10\x85\xc7\xf4\x42\x34\x86\xb6"
295 "\x5f\x3f\x88\x9e\xc7\xf5\x59\x29\x39\x68\x48\xf2\xd7\x08\x5b\x92\x8e\x6b"
296 "\xea\xa5\x63\x5f\xc0\xfb\xe4\xe1\xb2\x7d\xb7\x40\xe9\x55\x06\xbf\x58\x25"
297 "\x6f";
298
299static const uint8_t kTwoPrimeEncryptedMessage[] = {
300 0x63, 0x0a, 0x30, 0x45, 0x43, 0x11, 0x45, 0xb7, 0x99, 0x67, 0x90, 0x35,
301 0x37, 0x27, 0xff, 0xbc, 0xe0, 0xbf, 0xa6, 0xd1, 0x47, 0x50, 0xbb, 0x6c,
302 0x1c, 0xaa, 0x66, 0xf2, 0xff, 0x9d, 0x9a, 0xa6, 0xb4, 0x16, 0x63, 0xb0,
303 0xa1, 0x7c, 0x7c, 0x0c, 0xef, 0xb3, 0x66, 0x52, 0x42, 0xd7, 0x5e, 0xf3,
304 0xa4, 0x15, 0x33, 0x40, 0x43, 0xe8, 0xb1, 0xfc, 0xe0, 0x42, 0x83, 0x46,
305 0x28, 0xce, 0xde, 0x7b, 0x01, 0xeb, 0x28, 0x92, 0x70, 0xdf, 0x8d, 0x54,
306 0x9e, 0xed, 0x23, 0xb4, 0x78, 0xc3, 0xca, 0x85, 0x53, 0x48, 0xd6, 0x8a,
307 0x87, 0xf7, 0x69, 0xcd, 0x82, 0x8c, 0x4f, 0x5c, 0x05, 0x55, 0xa6, 0x78,
308 0x89, 0xab, 0x4c, 0xd8, 0xa9, 0xd6, 0xa5, 0xf4, 0x29, 0x4c, 0x23, 0xc8,
309 0xcf, 0xf0, 0x4c, 0x64, 0x6b, 0x4e, 0x02, 0x17, 0x69, 0xd6, 0x47, 0x83,
310 0x30, 0x43, 0x02, 0x29, 0xda, 0xda, 0x75, 0x3b, 0xd7, 0xa7, 0x2b, 0x31,
311 0xb3, 0xe9, 0x71, 0xa4, 0x41, 0xf7, 0x26, 0x9b, 0xcd, 0x23, 0xfa, 0x45,
312 0x3c, 0x9b, 0x7d, 0x28, 0xf7, 0xf9, 0x67, 0x04, 0xba, 0xfc, 0x46, 0x75,
313 0x11, 0x3c, 0xd5, 0x27, 0x43, 0x53, 0xb1, 0xb6, 0x9e, 0x18, 0xeb, 0x11,
314 0xb4, 0x25, 0x20, 0x30, 0x0b, 0xe0, 0x1c, 0x17, 0x36, 0x22, 0x10, 0x0f,
315 0x99, 0xb5, 0x50, 0x14, 0x73, 0x07, 0xf0, 0x2f, 0x5d, 0x4c, 0xe3, 0xf2,
316 0x86, 0xc2, 0x05, 0xc8, 0x38, 0xed, 0xeb, 0x2a, 0x4a, 0xab, 0x76, 0xe3,
317 0x1a, 0x75, 0x44, 0xf7, 0x6e, 0x94, 0xdc, 0x25, 0x62, 0x7e, 0x31, 0xca,
318 0xc2, 0x73, 0x51, 0xb5, 0x03, 0xfb, 0xf9, 0xf6, 0xb5, 0x8d, 0x4e, 0x6c,
319 0x21, 0x0e, 0xf9, 0x97, 0x26, 0x57, 0xf3, 0x52, 0x72, 0x07, 0xf8, 0xb4,
320 0xcd, 0xb4, 0x39, 0xcf, 0xbf, 0x78, 0xcc, 0xb6, 0x87, 0xf9, 0xb7, 0x8b,
321 0x6a, 0xce, 0x9f, 0xc8,
322};
323
Kenny Rootb8494592015-09-25 02:29:14 +0000324// kEstonianRSAKey is an RSAPublicKey encoded with a negative modulus. See
325// https://crbug.com/532048.
326static const uint8_t kEstonianRSAKey[] = {
327 0x30, 0x82, 0x01, 0x09, 0x02, 0x82, 0x01, 0x00, 0x96, 0xa6, 0x2e, 0x9c,
328 0x4e, 0x6a, 0xc3, 0xcc, 0xcd, 0x8f, 0x70, 0xc3, 0x55, 0xbf, 0x5e, 0x9c,
329 0xd4, 0xf3, 0x17, 0xc3, 0x97, 0x70, 0xae, 0xdf, 0x12, 0x5c, 0x15, 0x80,
330 0x03, 0xef, 0x2b, 0x18, 0x9d, 0x6a, 0xcb, 0x52, 0x22, 0xc1, 0x81, 0xb8,
331 0x7e, 0x61, 0xe8, 0x0f, 0x79, 0x24, 0x0f, 0x82, 0x70, 0x24, 0x4e, 0x29,
332 0x20, 0x05, 0x54, 0xeb, 0xd4, 0xa9, 0x65, 0x59, 0xb6, 0x3c, 0x75, 0x95,
333 0x2f, 0x4c, 0xf6, 0x9d, 0xd1, 0xaf, 0x5f, 0x14, 0x14, 0xe7, 0x25, 0xea,
334 0xa5, 0x47, 0x5d, 0xc6, 0x3e, 0x28, 0x8d, 0xdc, 0x54, 0x87, 0x2a, 0x7c,
335 0x10, 0xe9, 0xc6, 0x76, 0x2d, 0xe7, 0x79, 0xd8, 0x0e, 0xbb, 0xa9, 0xac,
336 0xb5, 0x18, 0x98, 0xd6, 0x47, 0x6e, 0x06, 0x70, 0xbf, 0x9e, 0x82, 0x25,
337 0x95, 0x4e, 0xfd, 0x70, 0xd7, 0x73, 0x45, 0x2e, 0xc1, 0x1f, 0x7a, 0x9a,
338 0x9d, 0x60, 0xc0, 0x1f, 0x67, 0x06, 0x2a, 0x4e, 0x87, 0x3f, 0x19, 0x88,
339 0x69, 0x64, 0x4d, 0x9f, 0x75, 0xf5, 0xd3, 0x1a, 0x41, 0x3d, 0x35, 0x17,
340 0xb6, 0xd1, 0x44, 0x0d, 0x25, 0x8b, 0xe7, 0x94, 0x39, 0xb0, 0x7c, 0xaf,
341 0x3e, 0x6a, 0xfa, 0x8d, 0x90, 0x21, 0x0f, 0x8a, 0x43, 0x94, 0x37, 0x7c,
342 0x2a, 0x15, 0x4c, 0xa0, 0xfa, 0xa9, 0x2f, 0x21, 0xa6, 0x6f, 0x8e, 0x2f,
343 0x89, 0xbc, 0xbb, 0x33, 0xf8, 0x31, 0xfc, 0xdf, 0xcd, 0x68, 0x9a, 0xbc,
344 0x75, 0x06, 0x95, 0xf1, 0x3d, 0xef, 0xca, 0x76, 0x27, 0xd2, 0xba, 0x8e,
345 0x0e, 0x1c, 0x43, 0xd7, 0x70, 0xb9, 0xc6, 0x15, 0xca, 0xd5, 0x4d, 0x87,
346 0xb9, 0xd1, 0xae, 0xde, 0x69, 0x73, 0x00, 0x2a, 0x97, 0x51, 0x4b, 0x30,
347 0x01, 0xc2, 0x85, 0xd0, 0x05, 0xcc, 0x2e, 0xe8, 0xc7, 0x42, 0xe7, 0x94,
348 0x51, 0xe3, 0xf5, 0x19, 0x35, 0xdc, 0x57, 0x96, 0xe7, 0xd9, 0xb4, 0x49,
349 0x02, 0x03, 0x01, 0x00, 0x01,
350};
351
Adam Langley4139edb2016-01-13 15:00:54 -0800352// kExponent1RSAKey is an RSAPublicKey encoded with an exponent of 1. See
353// https://crbug.com/541257
354static const uint8_t kExponent1RSAKey[] = {
355 0x30, 0x82, 0x01, 0x08, 0x02, 0x82, 0x01, 0x01, 0x00, 0xcf, 0x86, 0x9a,
356 0x7d, 0x5c, 0x9f, 0xbd, 0x33, 0xbb, 0xc2, 0xb1, 0x06, 0xa8, 0x3e, 0xc5,
357 0x18, 0xf3, 0x01, 0x04, 0xdd, 0x7a, 0x38, 0x0e, 0x8e, 0x8d, 0x10, 0xaa,
358 0xf8, 0x64, 0x49, 0x82, 0xa6, 0x16, 0x9d, 0xd9, 0xae, 0x5e, 0x7f, 0x9b,
359 0x53, 0xcb, 0xbb, 0x29, 0xda, 0x98, 0x47, 0x26, 0x88, 0x2e, 0x1d, 0x64,
360 0xb3, 0xbc, 0x7e, 0x96, 0x3a, 0xa7, 0xd6, 0x87, 0xf6, 0xf5, 0x3f, 0xa7,
361 0x3b, 0xd3, 0xc5, 0xd5, 0x61, 0x3c, 0x63, 0x05, 0xf9, 0xbc, 0x64, 0x1d,
362 0x71, 0x65, 0xf5, 0xc8, 0xe8, 0x64, 0x41, 0x35, 0x88, 0x81, 0x6b, 0x2a,
363 0x24, 0xbb, 0xdd, 0x9f, 0x75, 0x4f, 0xea, 0x35, 0xe5, 0x32, 0x76, 0x5a,
364 0x8b, 0x7a, 0xb5, 0x92, 0x65, 0x34, 0xb7, 0x88, 0x42, 0x5d, 0x41, 0x0b,
365 0xd1, 0x00, 0x2d, 0x43, 0x47, 0x55, 0x60, 0x3c, 0x0e, 0x60, 0x04, 0x5c,
366 0x88, 0x13, 0xc7, 0x42, 0x55, 0x16, 0x31, 0x32, 0x81, 0xba, 0xde, 0xa9,
367 0x56, 0xeb, 0xdb, 0x66, 0x7f, 0x31, 0xba, 0xe8, 0x87, 0x1a, 0xcc, 0xad,
368 0x90, 0x86, 0x4b, 0xa7, 0x6d, 0xd5, 0xc1, 0xb7, 0xe7, 0x67, 0x56, 0x41,
369 0xf7, 0x03, 0xb3, 0x09, 0x61, 0x63, 0xb5, 0xb0, 0x19, 0x7b, 0xc5, 0x91,
370 0xc8, 0x96, 0x5b, 0x6a, 0x80, 0xa1, 0x53, 0x0f, 0x9a, 0x47, 0xb5, 0x9a,
371 0x44, 0x53, 0xbd, 0x93, 0xe3, 0xe4, 0xce, 0x0c, 0x17, 0x11, 0x51, 0x1d,
372 0xfd, 0x6c, 0x74, 0xe4, 0xec, 0x2a, 0xce, 0x57, 0x27, 0xcc, 0x83, 0x98,
373 0x08, 0x32, 0x2c, 0xd5, 0x75, 0xa9, 0x27, 0xfe, 0xaa, 0x5e, 0x48, 0xc9,
374 0x46, 0x9a, 0x29, 0x3f, 0xe6, 0x01, 0x4d, 0x97, 0x4a, 0x70, 0xd1, 0x5d,
375 0xf8, 0xc0, 0x0b, 0x23, 0xcb, 0xbe, 0xf5, 0x70, 0x0b, 0xc2, 0xf2, 0xc0,
376 0x33, 0x9c, 0xc4, 0x8b, 0x39, 0x7e, 0x3d, 0xc6, 0x23, 0x39, 0x9a, 0x98,
377 0xdd, 0x02, 0x01, 0x01,
378};
379
Robert Sloana94fe052017-02-21 08:49:28 -0800380struct RSAEncryptParam {
381 const uint8_t *der;
382 size_t der_len;
383 const uint8_t *oaep_ciphertext;
384 size_t oaep_ciphertext_len;
385} kRSAEncryptParams[] = {
386 {kKey1, sizeof(kKey1) - 1, kOAEPCiphertext1, sizeof(kOAEPCiphertext1) - 1},
387 {kKey2, sizeof(kKey2) - 1, kOAEPCiphertext2, sizeof(kOAEPCiphertext2) - 1},
388 {kKey3, sizeof(kKey3) - 1, kOAEPCiphertext3, sizeof(kOAEPCiphertext3) - 1},
389};
Kenny Rootb8494592015-09-25 02:29:14 +0000390
Robert Sloana94fe052017-02-21 08:49:28 -0800391class RSAEncryptTest : public testing::TestWithParam<RSAEncryptParam> {};
392
393TEST_P(RSAEncryptTest, TestKey) {
394 const auto &param = GetParam();
395 bssl::UniquePtr<RSA> key(
396 RSA_private_key_from_bytes(param.der, param.der_len));
397 ASSERT_TRUE(key);
398
399 EXPECT_TRUE(RSA_check_key(key.get()));
Kenny Rootb8494592015-09-25 02:29:14 +0000400
401 uint8_t ciphertext[256];
402
Robert Sloana94fe052017-02-21 08:49:28 -0800403 // Test that PKCS#1 v1.5 encryption round-trips.
Kenny Roote99801b2015-11-06 15:31:15 -0800404 size_t ciphertext_len = 0;
Robert Sloana94fe052017-02-21 08:49:28 -0800405 ASSERT_TRUE(RSA_encrypt(key.get(), &ciphertext_len, ciphertext,
406 sizeof(ciphertext), kPlaintext, kPlaintextLen,
407 RSA_PKCS1_PADDING));
408 EXPECT_EQ(RSA_size(key.get()), ciphertext_len);
Kenny Rootb8494592015-09-25 02:29:14 +0000409
410 uint8_t plaintext[256];
Kenny Roote99801b2015-11-06 15:31:15 -0800411 size_t plaintext_len = 0;
Robert Sloana94fe052017-02-21 08:49:28 -0800412 ASSERT_TRUE(RSA_decrypt(key.get(), &plaintext_len, plaintext,
413 sizeof(plaintext), ciphertext, ciphertext_len,
414 RSA_PKCS1_PADDING));
415 EXPECT_EQ(Bytes(kPlaintext, kPlaintextLen), Bytes(plaintext, plaintext_len));
Kenny Rootb8494592015-09-25 02:29:14 +0000416
Robert Sloana94fe052017-02-21 08:49:28 -0800417 // Test that OAEP encryption round-trips.
Kenny Roote99801b2015-11-06 15:31:15 -0800418 ciphertext_len = 0;
Robert Sloana94fe052017-02-21 08:49:28 -0800419 ASSERT_TRUE(RSA_encrypt(key.get(), &ciphertext_len, ciphertext,
420 sizeof(ciphertext), kPlaintext, kPlaintextLen,
421 RSA_PKCS1_OAEP_PADDING));
422 EXPECT_EQ(RSA_size(key.get()), ciphertext_len);
Kenny Rootb8494592015-09-25 02:29:14 +0000423
Kenny Roote99801b2015-11-06 15:31:15 -0800424 plaintext_len = 0;
Robert Sloana94fe052017-02-21 08:49:28 -0800425 ASSERT_TRUE(RSA_decrypt(key.get(), &plaintext_len, plaintext,
426 sizeof(plaintext), ciphertext, ciphertext_len,
427 RSA_PKCS1_OAEP_PADDING));
428 EXPECT_EQ(Bytes(kPlaintext, kPlaintextLen), Bytes(plaintext, plaintext_len));
Kenny Rootb8494592015-09-25 02:29:14 +0000429
430 // |oaep_ciphertext| should decrypt to |kPlaintext|.
Kenny Roote99801b2015-11-06 15:31:15 -0800431 plaintext_len = 0;
Robert Sloana94fe052017-02-21 08:49:28 -0800432 ASSERT_TRUE(RSA_decrypt(key.get(), &plaintext_len, plaintext,
433 sizeof(plaintext), param.oaep_ciphertext,
434 param.oaep_ciphertext_len, RSA_PKCS1_OAEP_PADDING));
435 EXPECT_EQ(Bytes(kPlaintext, kPlaintextLen), Bytes(plaintext, plaintext_len));
Kenny Rootb8494592015-09-25 02:29:14 +0000436
437 // Try decrypting corrupted ciphertexts.
Robert Sloana94fe052017-02-21 08:49:28 -0800438 OPENSSL_memcpy(ciphertext, param.oaep_ciphertext, param.oaep_ciphertext_len);
439 for (size_t i = 0; i < param.oaep_ciphertext_len; i++) {
440 SCOPED_TRACE(i);
Kenny Roote99801b2015-11-06 15:31:15 -0800441 ciphertext[i] ^= 1;
Robert Sloana94fe052017-02-21 08:49:28 -0800442 EXPECT_FALSE(RSA_decrypt(
443 key.get(), &plaintext_len, plaintext, sizeof(plaintext), ciphertext,
444 param.oaep_ciphertext_len, RSA_PKCS1_OAEP_PADDING));
David Benjamin4969cc92016-04-22 15:02:23 -0400445 ERR_clear_error();
Kenny Roote99801b2015-11-06 15:31:15 -0800446 ciphertext[i] ^= 1;
447 }
448
449 // Test truncated ciphertexts.
Robert Sloana94fe052017-02-21 08:49:28 -0800450 for (size_t len = 0; len < param.oaep_ciphertext_len; len++) {
451 SCOPED_TRACE(len);
452 EXPECT_FALSE(RSA_decrypt(key.get(), &plaintext_len, plaintext,
453 sizeof(plaintext), ciphertext, len,
454 RSA_PKCS1_OAEP_PADDING));
David Benjamin4969cc92016-04-22 15:02:23 -0400455 ERR_clear_error();
Kenny Rootb8494592015-09-25 02:29:14 +0000456 }
Kenny Rootb8494592015-09-25 02:29:14 +0000457}
458
Robert Sloana94fe052017-02-21 08:49:28 -0800459INSTANTIATE_TEST_CASE_P(, RSAEncryptTest, testing::ValuesIn(kRSAEncryptParams));
Kenny Rootb8494592015-09-25 02:29:14 +0000460
Robert Sloan572a4e22017-04-17 10:52:19 -0700461TEST(RSATest, TestDecrypt) {
Robert Sloana94fe052017-02-21 08:49:28 -0800462 bssl::UniquePtr<RSA> rsa(
Robert Sloan572a4e22017-04-17 10:52:19 -0700463 RSA_private_key_from_bytes(kTwoPrimeKey, sizeof(kTwoPrimeKey) - 1));
Robert Sloana94fe052017-02-21 08:49:28 -0800464 ASSERT_TRUE(rsa);
465
466 EXPECT_TRUE(RSA_check_key(rsa.get()));
Kenny Rootb8494592015-09-25 02:29:14 +0000467
468 uint8_t out[256];
469 size_t out_len;
Robert Sloan572a4e22017-04-17 10:52:19 -0700470 ASSERT_TRUE(RSA_decrypt(
471 rsa.get(), &out_len, out, sizeof(out), kTwoPrimeEncryptedMessage,
472 sizeof(kTwoPrimeEncryptedMessage), RSA_PKCS1_PADDING));
Robert Sloana94fe052017-02-21 08:49:28 -0800473 EXPECT_EQ(Bytes("hello world"), Bytes(out, out_len));
Kenny Rootb8494592015-09-25 02:29:14 +0000474}
475
Robert Sloan572a4e22017-04-17 10:52:19 -0700476TEST(RSATest, CheckFIPS) {
477 bssl::UniquePtr<RSA> rsa(
478 RSA_private_key_from_bytes(kFIPSKey, sizeof(kFIPSKey) - 1));
Robert Sloana94fe052017-02-21 08:49:28 -0800479 ASSERT_TRUE(rsa);
Robert Sloan572a4e22017-04-17 10:52:19 -0700480 EXPECT_TRUE(RSA_check_fips(rsa.get()));
Kenny Rootb8494592015-09-25 02:29:14 +0000481
Robert Sloan572a4e22017-04-17 10:52:19 -0700482 // Check that RSA_check_fips works on a public key.
483 bssl::UniquePtr<RSA> pub(
484 RSA_public_key_from_bytes(kFIPSPublicKey, sizeof(kFIPSPublicKey) - 1));
485 ASSERT_TRUE(pub);
486 EXPECT_TRUE(RSA_check_fips(pub.get()));
Kenny Rootb8494592015-09-25 02:29:14 +0000487}
488
Robert Sloan8ff03552017-06-14 12:40:58 -0700489TEST(RSATest, GenerateFIPS) {
490 bssl::UniquePtr<RSA> rsa(RSA_new());
491 ASSERT_TRUE(rsa);
492
493 // RSA_generate_key_fips may only be used for 2048-bit and 3072-bit keys.
494 EXPECT_FALSE(RSA_generate_key_fips(rsa.get(), 512, nullptr));
495 EXPECT_FALSE(RSA_generate_key_fips(rsa.get(), 1024, nullptr));
496 EXPECT_FALSE(RSA_generate_key_fips(rsa.get(), 2047, nullptr));
497 EXPECT_FALSE(RSA_generate_key_fips(rsa.get(), 2049, nullptr));
498 EXPECT_FALSE(RSA_generate_key_fips(rsa.get(), 3071, nullptr));
499 EXPECT_FALSE(RSA_generate_key_fips(rsa.get(), 3073, nullptr));
500 EXPECT_FALSE(RSA_generate_key_fips(rsa.get(), 4096, nullptr));
501 ERR_clear_error();
502
503 // Test that we can generate 2048-bit and 3072-bit RSA keys.
Robert Sloan5cbb5c82018-04-24 11:35:46 -0700504 ASSERT_TRUE(RSA_generate_key_fips(rsa.get(), 2048, nullptr));
Robert Sloan8ff03552017-06-14 12:40:58 -0700505 EXPECT_EQ(2048u, BN_num_bits(rsa->n));
506
507 rsa.reset(RSA_new());
508 ASSERT_TRUE(rsa);
Robert Sloan5cbb5c82018-04-24 11:35:46 -0700509 ASSERT_TRUE(RSA_generate_key_fips(rsa.get(), 3072, nullptr));
Robert Sloan8ff03552017-06-14 12:40:58 -0700510 EXPECT_EQ(3072u, BN_num_bits(rsa->n));
511}
512
Robert Sloana94fe052017-02-21 08:49:28 -0800513TEST(RSATest, BadKey) {
David Benjaminf0c4a6c2016-08-11 13:26:41 -0400514 bssl::UniquePtr<RSA> key(RSA_new());
515 bssl::UniquePtr<BIGNUM> e(BN_new());
Robert Sloana94fe052017-02-21 08:49:28 -0800516 ASSERT_TRUE(key);
517 ASSERT_TRUE(e);
518 ASSERT_TRUE(BN_set_word(e.get(), RSA_F4));
Kenny Rootb8494592015-09-25 02:29:14 +0000519
Robert Sloana94fe052017-02-21 08:49:28 -0800520 // Generate a bad key.
521 ASSERT_TRUE(RSA_generate_key_ex(key.get(), 512, e.get(), nullptr));
522 ASSERT_TRUE(BN_add(key->p, key->p, BN_value_one()));
Kenny Rootb8494592015-09-25 02:29:14 +0000523
Robert Sloana94fe052017-02-21 08:49:28 -0800524 // Bad keys are detected.
525 EXPECT_FALSE(RSA_check_key(key.get()));
Robert Sloan572a4e22017-04-17 10:52:19 -0700526 EXPECT_FALSE(RSA_check_fips(key.get()));
Kenny Rootb8494592015-09-25 02:29:14 +0000527
Robert Sloana94fe052017-02-21 08:49:28 -0800528 // Bad keys may not be parsed.
Robert Sloan69939df2017-01-09 10:53:07 -0800529 uint8_t *der;
530 size_t der_len;
Robert Sloana94fe052017-02-21 08:49:28 -0800531 ASSERT_TRUE(RSA_private_key_to_bytes(&der, &der_len, key.get()));
Robert Sloan69939df2017-01-09 10:53:07 -0800532 bssl::UniquePtr<uint8_t> delete_der(der);
Robert Sloan69939df2017-01-09 10:53:07 -0800533 key.reset(RSA_private_key_from_bytes(der, der_len));
Robert Sloana94fe052017-02-21 08:49:28 -0800534 EXPECT_FALSE(key);
Kenny Rootb8494592015-09-25 02:29:14 +0000535}
536
Robert Sloana94fe052017-02-21 08:49:28 -0800537TEST(RSATest, OnlyDGiven) {
David Benjamin4969cc92016-04-22 15:02:23 -0400538 static const char kN[] =
539 "00e77bbf3889d4ef36a9a25d4d69f3f632eb4362214c74517da6d6aeaa9bd09ac42b2662"
540 "1cd88f3a6eb013772fc3bf9f83914b6467231c630202c35b3e5808c659";
541 static const char kE[] = "010001";
542 static const char kD[] =
543 "0365db9eb6d73b53b015c40cd8db4de7dd7035c68b5ac1bf786d7a4ee2cea316eaeca21a"
544 "73ac365e58713195f2ae9849348525ca855386b6d028e437a9495a01";
545
David Benjaminf0c4a6c2016-08-11 13:26:41 -0400546 bssl::UniquePtr<RSA> key(RSA_new());
Robert Sloana94fe052017-02-21 08:49:28 -0800547 ASSERT_TRUE(key);
548 ASSERT_TRUE(BN_hex2bn(&key->n, kN));
549 ASSERT_TRUE(BN_hex2bn(&key->e, kE));
550 ASSERT_TRUE(BN_hex2bn(&key->d, kD));
Kenny Rootb8494592015-09-25 02:29:14 +0000551
Robert Sloana94fe052017-02-21 08:49:28 -0800552 // Keys with only n, e, and d are functional.
553 EXPECT_TRUE(RSA_check_key(key.get()));
Kenny Rootb8494592015-09-25 02:29:14 +0000554
Robert Sloan8ff03552017-06-14 12:40:58 -0700555 const uint8_t kDummyHash[32] = {0};
Robert Sloana94fe052017-02-21 08:49:28 -0800556 uint8_t buf[64];
557 unsigned buf_len = sizeof(buf);
558 ASSERT_LE(RSA_size(key.get()), sizeof(buf));
559 EXPECT_TRUE(RSA_sign(NID_sha256, kDummyHash, sizeof(kDummyHash), buf,
560 &buf_len, key.get()));
561 EXPECT_TRUE(RSA_verify(NID_sha256, kDummyHash, sizeof(kDummyHash), buf,
562 buf_len, key.get()));
David Benjamin4969cc92016-04-22 15:02:23 -0400563
564 // Keys without the public exponent must continue to work when blinding is
565 // disabled to support Java's RSAPrivateKeySpec API. See
566 // https://bugs.chromium.org/p/boringssl/issues/detail?id=12.
David Benjaminf0c4a6c2016-08-11 13:26:41 -0400567 bssl::UniquePtr<RSA> key2(RSA_new());
Robert Sloana94fe052017-02-21 08:49:28 -0800568 ASSERT_TRUE(key2);
569 ASSERT_TRUE(BN_hex2bn(&key2->n, kN));
570 ASSERT_TRUE(BN_hex2bn(&key2->d, kD));
David Benjamin4969cc92016-04-22 15:02:23 -0400571 key2->flags |= RSA_FLAG_NO_BLINDING;
572
Robert Sloana94fe052017-02-21 08:49:28 -0800573 ASSERT_LE(RSA_size(key2.get()), sizeof(buf));
574 EXPECT_TRUE(RSA_sign(NID_sha256, kDummyHash, sizeof(kDummyHash), buf,
575 &buf_len, key2.get()));
David Benjamin4969cc92016-04-22 15:02:23 -0400576
577 // Verify the signature with |key|. |key2| has no public exponent.
Robert Sloana94fe052017-02-21 08:49:28 -0800578 EXPECT_TRUE(RSA_verify(NID_sha256, kDummyHash, sizeof(kDummyHash), buf,
579 buf_len, key.get()));
Kenny Rootb8494592015-09-25 02:29:14 +0000580}
581
Robert Sloana94fe052017-02-21 08:49:28 -0800582TEST(RSATest, ASN1) {
Kenny Rootb8494592015-09-25 02:29:14 +0000583 // Test that private keys may be decoded.
Robert Sloana94fe052017-02-21 08:49:28 -0800584 bssl::UniquePtr<RSA> rsa(
585 RSA_private_key_from_bytes(kKey1, sizeof(kKey1) - 1));
586 ASSERT_TRUE(rsa);
Kenny Rootb8494592015-09-25 02:29:14 +0000587
588 // Test that the serialization round-trips.
589 uint8_t *der;
590 size_t der_len;
Robert Sloana94fe052017-02-21 08:49:28 -0800591 ASSERT_TRUE(RSA_private_key_to_bytes(&der, &der_len, rsa.get()));
David Benjaminf0c4a6c2016-08-11 13:26:41 -0400592 bssl::UniquePtr<uint8_t> delete_der(der);
Robert Sloana94fe052017-02-21 08:49:28 -0800593 EXPECT_EQ(Bytes(kKey1, sizeof(kKey1) - 1), Bytes(der, der_len));
Kenny Rootb8494592015-09-25 02:29:14 +0000594
595 // Test that serializing public keys works.
Robert Sloana94fe052017-02-21 08:49:28 -0800596 ASSERT_TRUE(RSA_public_key_to_bytes(&der, &der_len, rsa.get()));
Kenny Rootb8494592015-09-25 02:29:14 +0000597 delete_der.reset(der);
598
599 // Public keys may be parsed back out.
600 rsa.reset(RSA_public_key_from_bytes(der, der_len));
Robert Sloana94fe052017-02-21 08:49:28 -0800601 ASSERT_TRUE(rsa);
602 EXPECT_FALSE(rsa->p);
603 EXPECT_FALSE(rsa->q);
Kenny Rootb8494592015-09-25 02:29:14 +0000604
605 // Serializing the result round-trips.
606 uint8_t *der2;
607 size_t der2_len;
Robert Sloana94fe052017-02-21 08:49:28 -0800608 ASSERT_TRUE(RSA_public_key_to_bytes(&der2, &der2_len, rsa.get()));
David Benjaminf0c4a6c2016-08-11 13:26:41 -0400609 bssl::UniquePtr<uint8_t> delete_der2(der2);
Robert Sloana94fe052017-02-21 08:49:28 -0800610 EXPECT_EQ(Bytes(der, der_len), Bytes(der2, der2_len));
Kenny Rootb8494592015-09-25 02:29:14 +0000611
612 // Public keys cannot be serialized as private keys.
Robert Sloana94fe052017-02-21 08:49:28 -0800613 int ok = RSA_private_key_to_bytes(&der, &der_len, rsa.get());
614 if (ok) {
Kenny Rootb8494592015-09-25 02:29:14 +0000615 OPENSSL_free(der);
Kenny Rootb8494592015-09-25 02:29:14 +0000616 }
Robert Sloana94fe052017-02-21 08:49:28 -0800617 EXPECT_FALSE(ok);
Kenny Rootb8494592015-09-25 02:29:14 +0000618 ERR_clear_error();
619
620 // Public keys with negative moduli are invalid.
621 rsa.reset(RSA_public_key_from_bytes(kEstonianRSAKey,
622 sizeof(kEstonianRSAKey)));
Robert Sloana94fe052017-02-21 08:49:28 -0800623 EXPECT_FALSE(rsa);
Kenny Rootb8494592015-09-25 02:29:14 +0000624 ERR_clear_error();
Kenny Rootb8494592015-09-25 02:29:14 +0000625}
626
Robert Sloana94fe052017-02-21 08:49:28 -0800627TEST(RSATest, BadExponent) {
628 bssl::UniquePtr<RSA> rsa(
629 RSA_public_key_from_bytes(kExponent1RSAKey, sizeof(kExponent1RSAKey)));
630 EXPECT_FALSE(rsa);
Adam Langley4139edb2016-01-13 15:00:54 -0800631 ERR_clear_error();
Kenny Rootb8494592015-09-25 02:29:14 +0000632}
Robert Sloan572a4e22017-04-17 10:52:19 -0700633
634// Attempting to generate an excessively small key should fail.
635TEST(RSATest, GenerateSmallKey) {
636 bssl::UniquePtr<RSA> rsa(RSA_new());
637 ASSERT_TRUE(rsa);
638 bssl::UniquePtr<BIGNUM> e(BN_new());
639 ASSERT_TRUE(e);
640 ASSERT_TRUE(BN_set_word(e.get(), RSA_F4));
641
642 EXPECT_FALSE(RSA_generate_key_ex(rsa.get(), 255, e.get(), nullptr));
643 uint32_t err = ERR_get_error();
644 EXPECT_EQ(ERR_LIB_RSA, ERR_GET_LIB(err));
645 EXPECT_EQ(RSA_R_KEY_SIZE_TOO_SMALL, ERR_GET_REASON(err));
646}
647
648// Attempting to generate an funny RSA key length should round down.
649TEST(RSATest, RoundKeyLengths) {
650 bssl::UniquePtr<BIGNUM> e(BN_new());
651 ASSERT_TRUE(e);
652 ASSERT_TRUE(BN_set_word(e.get(), RSA_F4));
653
654 bssl::UniquePtr<RSA> rsa(RSA_new());
655 ASSERT_TRUE(rsa);
Robert Sloan5cbb5c82018-04-24 11:35:46 -0700656 ASSERT_TRUE(RSA_generate_key_ex(rsa.get(), 1025, e.get(), nullptr));
Robert Sloan572a4e22017-04-17 10:52:19 -0700657 EXPECT_EQ(1024u, BN_num_bits(rsa->n));
658
659 rsa.reset(RSA_new());
660 ASSERT_TRUE(rsa);
Robert Sloan5cbb5c82018-04-24 11:35:46 -0700661 ASSERT_TRUE(RSA_generate_key_ex(rsa.get(), 1027, e.get(), nullptr));
Robert Sloan572a4e22017-04-17 10:52:19 -0700662 EXPECT_EQ(1024u, BN_num_bits(rsa->n));
663
664 rsa.reset(RSA_new());
665 ASSERT_TRUE(rsa);
Robert Sloan5cbb5c82018-04-24 11:35:46 -0700666 ASSERT_TRUE(RSA_generate_key_ex(rsa.get(), 1151, e.get(), nullptr));
Robert Sloan572a4e22017-04-17 10:52:19 -0700667 EXPECT_EQ(1024u, BN_num_bits(rsa->n));
668
669 rsa.reset(RSA_new());
670 ASSERT_TRUE(rsa);
Robert Sloan5cbb5c82018-04-24 11:35:46 -0700671 ASSERT_TRUE(RSA_generate_key_ex(rsa.get(), 1152, e.get(), nullptr));
Robert Sloan572a4e22017-04-17 10:52:19 -0700672 EXPECT_EQ(1152u, BN_num_bits(rsa->n));
673}
674
Robert Sloan8ff03552017-06-14 12:40:58 -0700675TEST(RSATest, BlindingDisabled) {
676 bssl::UniquePtr<RSA> rsa(
677 RSA_private_key_from_bytes(kTwoPrimeKey, sizeof(kTwoPrimeKey) - 1));
678 ASSERT_TRUE(rsa);
679
680 rsa->flags |= RSA_FLAG_NO_BLINDING;
681
682 uint8_t sig[256];
683 ASSERT_GE(sizeof(sig), RSA_size(rsa.get()));
684
685 static const uint8_t kZeros[32] = {0};
686 unsigned sig_len;
687 ASSERT_TRUE(
688 RSA_sign(NID_sha256, kZeros, sizeof(kZeros), sig, &sig_len, rsa.get()));
689 EXPECT_TRUE(
690 RSA_verify(NID_sha256, kZeros, sizeof(kZeros), sig, sig_len, rsa.get()));
691}
692
Robert Sloane56da3e2017-06-26 08:26:42 -0700693// Test that decrypting with a public key fails gracefully rather than crashing.
694TEST(RSATest, DecryptPublic) {
695 bssl::UniquePtr<RSA> pub(
696 RSA_public_key_from_bytes(kFIPSPublicKey, sizeof(kFIPSPublicKey) - 1));
697 ASSERT_TRUE(pub);
698 ASSERT_EQ(1024u / 8u, RSA_size(pub.get()));
699
700 size_t len;
701 uint8_t in[1024 / 8] = {0}, out[1024 / 8];
702 EXPECT_FALSE(RSA_decrypt(pub.get(), &len, out, sizeof(out), in, sizeof(in),
703 RSA_PKCS1_PADDING));
704 uint32_t err = ERR_get_error();
705 EXPECT_EQ(ERR_LIB_RSA, ERR_GET_LIB(err));
706 EXPECT_EQ(RSA_R_VALUE_MISSING, ERR_GET_REASON(err));
707}
708
Robert Sloanab8b8882018-03-26 11:39:51 -0700709TEST(RSATest, CheckKey) {
710 static const char kN[] =
711 "b5a5651bc2e15ce31d789f0984053a2ea0cf8f964a78068c45acfdf078c57fd62d5a287c"
712 "32f3baa879f5dfea27d7a3077c9d3a2a728368c3d90164690c3d82f660ffebc7f13fed45"
713 "4eb5103df943c10dc32ec60b0d9b6e307bfd7f9b943e0dc3901e42501765365f7286eff2"
714 "f1f728774aa6a371e108a3a7dd00d7bcd4c1a186c2865d4b370ea38cc89c0b23b318dbca"
715 "fbd872b4f9b833dfb2a4ca7fcc23298020044e8130bfe930adfb3e5cab8d324547adf4b2"
716 "ce34d7cea4298f0b613d85f2bf1df03da44aee0784a1a20a15ee0c38a0f8e84962f1f61b"
717 "18bd43781c7385f3c2b8e2aebd3c560b4faad208ad3938bad27ddda9ed9e933dba088021"
718 "2dd9e28d";
719 static const char kE[] = "10001";
720 static const char kD[] =
721 "fb9c6afd9568ce5ddac8e6a32bb881eb6cdd962bbc639dce5805548bf0fec2214f18ffd3"
722 "6a50aa520cfe4477f9507d87355a24e3ff537f9f29ccffe5730b11896ebb9142982ed0df"
723 "9c32ba98dddab863f3e5aa764d16ebff4500d3ee11de12fabd7aeca83c7ffa5d242b3ddc"
724 "ecc64bcb5220996e79249a6d3f78975dfde769710569812dee59c0f56e4650d02a939d9c"
725 "853e2cba9b0c2447a8757951ae9a0336dfa64c3d5476df9b20f200cfb52e3fbd2d4e3f34"
726 "200b1171cbac367096f23366e74592025875efb6a7e3b1dd365abb0d86f34ee65ddbfa93"
727 "90460da0d346833d6aa6277c0216b20073ba2f18471549c309e82d12e10714d0e0dbf146"
728 "6fcd1f1";
729 static const char kP[] =
730 "edbe476fe8989f3966e72a20348ec6d8e924f44e1d9fa2c3485ea8a2ffd39f68574a5cef"
731 "ffbb92d6764789ac0f67149127239c2027fbc55b5268a1dac6588de44e614f3bdce00f0a"
732 "56d138800ad772d159a583c6548e37cadbfcf1b4ebfd50d01508986a516f36ed827b94ef"
733 "1f9b4e233bf5762b3a903d2dfbbbce1fba30e9f1";
734 static const char kQ[] =
735 "c398518790a166dbe50498f04940d14c87ded09313fb0f69f69255c688142802ba3d4f9e"
736 "f9425dadc462170635593c06a332cfc5fc9e6e1c05281950a5ce3bad4fd7cc83a38bd4ad"
737 "6865594275af424f47c64c04af1caab2e261e95b975097c887d587dc8150df34cbeccd7d"
738 "0688c392d9f1c617810043c9b93b884bf6ed465d";
739 static const char kDMP1[] =
740 "b44db5d1fa7e1d6ba44e36d59be6988a132f7294f7c484e543b27e84b82e9fdbbb2feb92"
741 "1cc9fe0fe63e54fc07e66e63b3623f5ae7d7fb124a4a8e4de4556eaf327e7c5ff3207e67"
742 "a1f624ba7efe6cd6b6fd5f160034a7bd92df9fd44d919d436260556f74793b181ff867b8"
743 "7ea9033697978e5a349d05b9250c86c3eb2a8391";
744 static const char kDMQ1[] =
745 "7c06d9240265264927a6cba80a7b4c7c9fe77d10d669abb38083f85a24adcb55376d6b50"
746 "9e34241cecdb5a483889f6132b672bf31aa607a242eed3669d4cf1f08b2186f0ae431bc0"
747 "3de38e3f234ad7dc57e1f9103b4e0d3bd36b4cc324671968322207bd9e4e7ecb06c888e0"
748 "cfc4e766f646665b3f14c0e7684ac4b98ec1948d";
749 static const char kIQMP[] =
750 "2887a5cb0c1bf6710e91c25da141dad92134a927431471c2d4a8b78036026d21182990e1"
751 "2c1d70635f07ee551383899365a69b33d4db23e5ff7371ff4244d2c3290ce2b91ac11adc"
752 "a54bb61ea5e64b9423102933ea100c12dad809fbf9589515e9d28e867f6b95c2d307f792"
753 "cac28c6d7d23f441cb5b62798233db29b5cc0348";
754
755 bssl::UniquePtr<RSA> rsa(RSA_new());
756 ASSERT_TRUE(rsa);
757
758 // Missing n or e does not pass.
759 ASSERT_TRUE(BN_hex2bn(&rsa->n, kN));
760 EXPECT_FALSE(RSA_check_key(rsa.get()));
761 ERR_clear_error();
762
763 BN_free(rsa->n);
764 rsa->n = nullptr;
765 ASSERT_TRUE(BN_hex2bn(&rsa->e, kE));
766 EXPECT_FALSE(RSA_check_key(rsa.get()));
767 ERR_clear_error();
768
769 // Public keys pass.
770 ASSERT_TRUE(BN_hex2bn(&rsa->n, kN));
771 EXPECT_TRUE(RSA_check_key(rsa.get()));
772
773 // Configuring d also passes.
774 ASSERT_TRUE(BN_hex2bn(&rsa->d, kD));
775 EXPECT_TRUE(RSA_check_key(rsa.get()));
776
777 // p and q must be provided together.
778 ASSERT_TRUE(BN_hex2bn(&rsa->p, kP));
779 EXPECT_FALSE(RSA_check_key(rsa.get()));
780 ERR_clear_error();
781
782 BN_free(rsa->p);
783 rsa->p = nullptr;
784 ASSERT_TRUE(BN_hex2bn(&rsa->q, kQ));
785 EXPECT_FALSE(RSA_check_key(rsa.get()));
786 ERR_clear_error();
787
788 // Supplying p and q without CRT parameters passes.
789 ASSERT_TRUE(BN_hex2bn(&rsa->p, kP));
790 EXPECT_TRUE(RSA_check_key(rsa.get()));
791
792 // With p and q together, it is sufficient to check d against e.
793 ASSERT_TRUE(BN_add_word(rsa->d, 1));
794 EXPECT_FALSE(RSA_check_key(rsa.get()));
795 ERR_clear_error();
796
797 // Test another invalid d. p-1 is divisible by 3, so there is no valid value
798 // of d here if e = 111. Set d to what extended GCD would have given if it
799 // forgot to check the inverse existed.
800 static const char kDBogus[] =
801 "140be923edb928cf4340a08ada19f23da680ff20275a81e033825ee8605afc3bf6039b87"
802 "f0ddc7ea3b95f214a6fdda1064d0c66b50ac7bfe8cfe6c85d3cd217ae6f5094cd72a39e5"
803 "a17a9ce43eae1ba5d7d8c3fb743d8cbcb3bcd74edd0b75fcca23a0b00bcea119864c0243"
804 "bf9ab32b25a4d73a1e062482f538055bc2258369353647d4325aec7a28dc1a6798e85fae"
805 "85850558868468d60015927cb10b2a893e23aa16b1f9278d4413f64d0a3122218f9000ae"
806 "cd8743b8e9e50bd9de81eebc4e0230d1f4f7bffc1e6f903606afba9ee694c2b40022f171"
807 "a760e7c63e736e31d7c7ff8b77dc206c2a3aa5afd540073060ebb9050bddce1ff1917630"
808 "47fff51d";
809 ASSERT_TRUE(BN_set_word(rsa->e, 111));
810 ASSERT_TRUE(BN_hex2bn(&rsa->d, kDBogus));
811 EXPECT_FALSE(RSA_check_key(rsa.get()));
812 ERR_clear_error();
813 ASSERT_TRUE(BN_hex2bn(&rsa->e, kE));
814
815 // d computed via the Euler totient rather than the Carmichael totient is also
816 // acceptable.
817 static const char kDEuler[] =
818 "3d231ff6ca0ee41ea50ab62c93bcd6aa5f01bd484e643b7ff6eb94c4dd414c17a0481a1c"
819 "4361f94f3f4d5c42098af09a527cf0d8dc96122ae8dd29189a4011d62f2bb40625d2e85f"
820 "4d706fb90c2e9bc9b00a0c2a28384a4c134f6d25c62d64a08fdf3f5e89a14d3daee46fda"
821 "8b4a2eda87cbb2735fd47290cb37bf65150edef854a28927ce5ac36d36107711cffb8ac3"
822 "2b090e409bb822b117744a9aabf878b8b1998d406337ec24cee3877795061c67322ac626"
823 "6c675a2cefe0f85f06b4d24eb6ad8e3fae7f218f5bd8ff2fb8bf8176d8527b0dfdaf8490"
824 "8f9bfaf3f37dcf8aa0211311bac07b1a478c3ed8a6369e5d5fc42b2afa93f5de8f520981"
825 "c62bbe81";
826 ASSERT_TRUE(BN_hex2bn(&rsa->d, kDEuler));
827 EXPECT_TRUE(RSA_check_key(rsa.get()));
828
Robert Sloan49d063b2018-04-03 11:30:38 -0700829 // If d is completely out of range but otherwise valid, it is rejected.
830 static const char kDTooLarge[] =
831 "f2c885128cf04101c283553617c210d8ffd14cde98dc420c3c9892b55606cbedcda24298"
832 "7655b3f7b9433c2c316293a1cf1a2b034f197aeec1de8d81a67d94cc902b9fce1712d5a4"
833 "9c257ff705725cd77338d23535d3b87c8f4cecc15a6b72641ffd81aea106839d216b5fcd"
834 "7d415751d27255e540dd1638a8389721e9d0807d65d24d7b8c2f60e4b2c0bf250544ce68"
835 "b5ddbc1463d5a4638b2816b0f033dacdc0162f329af9e4d142352521fbd2fe14af824ef3"
836 "1601fe843c79cc3efbcb8eafd79262bdd25e2bdf21440f774e26d88ed7df938c5cf6982d"
837 "e9fa635b8ca36ce5c5fbd579a53cbb0348ceae752d4bc5621c5acc922ca2082494633337"
838 "42e770c1";
839 ASSERT_TRUE(BN_hex2bn(&rsa->d, kDTooLarge));
840 EXPECT_FALSE(RSA_check_key(rsa.get()));
841 ERR_clear_error();
842 ASSERT_TRUE(BN_hex2bn(&rsa->d, kD));
843
Robert Sloanab8b8882018-03-26 11:39:51 -0700844 // CRT value must either all be provided or all missing.
845 ASSERT_TRUE(BN_hex2bn(&rsa->dmp1, kDMP1));
846 EXPECT_FALSE(RSA_check_key(rsa.get()));
847 ERR_clear_error();
848 BN_free(rsa->dmp1);
849 rsa->dmp1 = nullptr;
850
851 ASSERT_TRUE(BN_hex2bn(&rsa->dmq1, kDMQ1));
852 EXPECT_FALSE(RSA_check_key(rsa.get()));
853 ERR_clear_error();
854 BN_free(rsa->dmq1);
855 rsa->dmq1 = nullptr;
856
857 ASSERT_TRUE(BN_hex2bn(&rsa->iqmp, kIQMP));
858 EXPECT_FALSE(RSA_check_key(rsa.get()));
859 ERR_clear_error();
860
861 // The full key is accepted.
862 ASSERT_TRUE(BN_hex2bn(&rsa->dmp1, kDMP1));
863 ASSERT_TRUE(BN_hex2bn(&rsa->dmq1, kDMQ1));
864 EXPECT_TRUE(RSA_check_key(rsa.get()));
865
866 // Incorrect CRT values are rejected.
867 ASSERT_TRUE(BN_add_word(rsa->dmp1, 1));
868 EXPECT_FALSE(RSA_check_key(rsa.get()));
869 ERR_clear_error();
870 ASSERT_TRUE(BN_sub_word(rsa->dmp1, 1));
871
872 ASSERT_TRUE(BN_add_word(rsa->dmq1, 1));
873 EXPECT_FALSE(RSA_check_key(rsa.get()));
874 ERR_clear_error();
875 ASSERT_TRUE(BN_sub_word(rsa->dmq1, 1));
876
877 ASSERT_TRUE(BN_add_word(rsa->iqmp, 1));
878 EXPECT_FALSE(RSA_check_key(rsa.get()));
879 ERR_clear_error();
880 ASSERT_TRUE(BN_sub_word(rsa->iqmp, 1));
881
882 // Non-reduced CRT values are rejected.
883 ASSERT_TRUE(BN_add(rsa->dmp1, rsa->dmp1, rsa->p));
884 EXPECT_FALSE(RSA_check_key(rsa.get()));
885 ERR_clear_error();
886 ASSERT_TRUE(BN_sub(rsa->dmp1, rsa->dmp1, rsa->p));
887
888 ASSERT_TRUE(BN_add(rsa->dmq1, rsa->dmq1, rsa->q));
889 EXPECT_FALSE(RSA_check_key(rsa.get()));
890 ERR_clear_error();
891 ASSERT_TRUE(BN_sub(rsa->dmq1, rsa->dmq1, rsa->q));
892
893 ASSERT_TRUE(BN_add(rsa->iqmp, rsa->iqmp, rsa->p));
894 EXPECT_FALSE(RSA_check_key(rsa.get()));
895 ERR_clear_error();
896 ASSERT_TRUE(BN_sub(rsa->iqmp, rsa->iqmp, rsa->p));
897}
898
Robert Sloan5cbb5c82018-04-24 11:35:46 -0700899TEST(RSATest, KeygenFail) {
900 bssl::UniquePtr<RSA> rsa(RSA_new());
901 ASSERT_TRUE(rsa);
902
903 // Cause RSA key generation after a prime has been generated, to test that
904 // |rsa| is left alone.
905 BN_GENCB cb;
906 BN_GENCB_set(&cb,
907 [](int event, int, BN_GENCB *) -> int { return event != 3; },
908 nullptr);
909
910 bssl::UniquePtr<BIGNUM> e(BN_new());
911 ASSERT_TRUE(e);
912 ASSERT_TRUE(BN_set_word(e.get(), RSA_F4));
913
914 // Key generation should fail.
915 EXPECT_FALSE(RSA_generate_key_ex(rsa.get(), 2048, e.get(), &cb));
916
917 // Failed key generations do not leave garbage in |rsa|.
918 EXPECT_FALSE(rsa->n);
919 EXPECT_FALSE(rsa->e);
920 EXPECT_FALSE(rsa->d);
921 EXPECT_FALSE(rsa->p);
922 EXPECT_FALSE(rsa->q);
923 EXPECT_FALSE(rsa->dmp1);
924 EXPECT_FALSE(rsa->dmq1);
925 EXPECT_FALSE(rsa->iqmp);
926 EXPECT_FALSE(rsa->mont_n);
927 EXPECT_FALSE(rsa->mont_p);
928 EXPECT_FALSE(rsa->mont_q);
929 EXPECT_FALSE(rsa->d_fixed);
930 EXPECT_FALSE(rsa->dmp1_fixed);
931 EXPECT_FALSE(rsa->dmq1_fixed);
932 EXPECT_FALSE(rsa->inv_small_mod_large_mont);
933 EXPECT_FALSE(rsa->private_key_frozen);
934
935 // Failed key generations leave the previous contents alone.
936 EXPECT_TRUE(RSA_generate_key_ex(rsa.get(), 2048, e.get(), nullptr));
937 uint8_t *der;
938 size_t der_len;
939 ASSERT_TRUE(RSA_private_key_to_bytes(&der, &der_len, rsa.get()));
940 bssl::UniquePtr<uint8_t> delete_der(der);
941
942 EXPECT_FALSE(RSA_generate_key_ex(rsa.get(), 2048, e.get(), &cb));
943
944 uint8_t *der2;
945 size_t der2_len;
946 ASSERT_TRUE(RSA_private_key_to_bytes(&der2, &der2_len, rsa.get()));
947 bssl::UniquePtr<uint8_t> delete_der2(der2);
948 EXPECT_EQ(Bytes(der, der_len), Bytes(der2, der2_len));
949
950 // Generating a key over an existing key works, despite any cached state.
951 EXPECT_TRUE(RSA_generate_key_ex(rsa.get(), 2048, e.get(), nullptr));
952 EXPECT_TRUE(RSA_check_key(rsa.get()));
953 uint8_t *der3;
954 size_t der3_len;
955 ASSERT_TRUE(RSA_private_key_to_bytes(&der3, &der3_len, rsa.get()));
956 bssl::UniquePtr<uint8_t> delete_der3(der3);
957 EXPECT_NE(Bytes(der, der_len), Bytes(der3, der3_len));
958}
959
960TEST(RSATest, KeygenFailOnce) {
961 bssl::UniquePtr<RSA> rsa(RSA_new());
962 ASSERT_TRUE(rsa);
963
964 // Cause only the first iteration of RSA key generation to fail.
965 bool failed = false;
966 BN_GENCB cb;
967 BN_GENCB_set(&cb,
968 [](int event, int n, BN_GENCB *cb_ptr) -> int {
969 bool *failed_ptr = static_cast<bool *>(cb_ptr->arg);
970 if (*failed_ptr) {
971 ADD_FAILURE() << "Callback called multiple times.";
972 return 1;
973 }
974 *failed_ptr = true;
975 return 0;
976 },
977 &failed);
978
979 // Although key generation internally retries, the external behavior of
980 // |BN_GENCB| is preserved.
981 bssl::UniquePtr<BIGNUM> e(BN_new());
982 ASSERT_TRUE(e);
983 ASSERT_TRUE(BN_set_word(e.get(), RSA_F4));
984 EXPECT_FALSE(RSA_generate_key_ex(rsa.get(), 2048, e.get(), &cb));
985}
986
987TEST(RSATest, KeygenInternalRetry) {
988 bssl::UniquePtr<RSA> rsa(RSA_new());
989 ASSERT_TRUE(rsa);
990
991 // Simulate one internal attempt at key generation failing.
992 bool failed = false;
993 BN_GENCB cb;
994 BN_GENCB_set(&cb,
995 [](int event, int n, BN_GENCB *cb_ptr) -> int {
996 bool *failed_ptr = static_cast<bool *>(cb_ptr->arg);
997 if (*failed_ptr) {
998 return 1;
999 }
1000 *failed_ptr = true;
1001 // This test does not test any public API behavior. It is just
1002 // a hack to exercise the retry codepath and make sure it
1003 // works.
1004 OPENSSL_PUT_ERROR(RSA, RSA_R_TOO_MANY_ITERATIONS);
1005 return 0;
1006 },
1007 &failed);
1008
1009 // Key generation internally retries on RSA_R_TOO_MANY_ITERATIONS.
1010 bssl::UniquePtr<BIGNUM> e(BN_new());
1011 ASSERT_TRUE(e);
1012 ASSERT_TRUE(BN_set_word(e.get(), RSA_F4));
1013 EXPECT_TRUE(RSA_generate_key_ex(rsa.get(), 2048, e.get(), &cb));
1014}
1015
Robert Sloan572a4e22017-04-17 10:52:19 -07001016#if !defined(BORINGSSL_SHARED_LIBRARY)
1017TEST(RSATest, SqrtTwo) {
1018 bssl::UniquePtr<BIGNUM> sqrt(BN_new()), pow2(BN_new());
1019 bssl::UniquePtr<BN_CTX> ctx(BN_CTX_new());
1020 ASSERT_TRUE(sqrt);
1021 ASSERT_TRUE(pow2);
1022 ASSERT_TRUE(ctx);
1023
1024 size_t bits = kBoringSSLRSASqrtTwoLen * BN_BITS2;
1025 ASSERT_TRUE(BN_one(pow2.get()));
1026 ASSERT_TRUE(BN_lshift(pow2.get(), pow2.get(), 2 * bits - 1));
1027
1028 // Check that sqrt² < pow2.
1029 ASSERT_TRUE(
1030 bn_set_words(sqrt.get(), kBoringSSLRSASqrtTwo, kBoringSSLRSASqrtTwoLen));
1031 ASSERT_TRUE(BN_sqr(sqrt.get(), sqrt.get(), ctx.get()));
1032 EXPECT_LT(BN_cmp(sqrt.get(), pow2.get()), 0);
1033
1034 // Check that pow2 < (sqrt + 1)².
1035 ASSERT_TRUE(
1036 bn_set_words(sqrt.get(), kBoringSSLRSASqrtTwo, kBoringSSLRSASqrtTwoLen));
1037 ASSERT_TRUE(BN_add_word(sqrt.get(), 1));
1038 ASSERT_TRUE(BN_sqr(sqrt.get(), sqrt.get(), ctx.get()));
1039 EXPECT_LT(BN_cmp(pow2.get(), sqrt.get()), 0);
1040
1041 // Check the kBoringSSLRSASqrtTwo is sized for a 3072-bit RSA key.
1042 EXPECT_EQ(3072u / 2u, bits);
1043}
Robert Sloan572a4e22017-04-17 10:52:19 -07001044#endif // !BORINGSSL_SHARED_LIBRARY