1 /* Copyright (c) 2016, Google Inc.
2 *
3 * Permission to use, copy, modify, and/or distribute this software for any
4 * purpose with or without fee is hereby granted, provided that the above
5 * copyright notice and this permission notice appear in all copies.
6 *
7 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
8 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
9 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY
10 * SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
11 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION
12 * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN
13 * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */
14
15 #include <functional>
16 #include <string>
17 #include <type_traits>
18 #include <vector>
19
20 #include <assert.h>
21
22 #include <openssl/bytestring.h>
23 #include <openssl/err.h>
24 #include <openssl/evp.h>
25 #include <openssl/rsa.h>
26 #include <openssl/ssl.h>
27 #include <openssl/stack.h>
28 #include <openssl/x509.h>
29
30 #include "../crypto/internal.h"
31
32 static const uint8_t kCertificateDER[] = {
33 0x30, 0x82, 0x02, 0xff, 0x30, 0x82, 0x01, 0xe7, 0xa0, 0x03, 0x02, 0x01,
34 0x02, 0x02, 0x11, 0x00, 0xb1, 0x84, 0xee, 0x34, 0x99, 0x98, 0x76, 0xfb,
35 0x6f, 0xb2, 0x15, 0xc8, 0x47, 0x79, 0x05, 0x9b, 0x30, 0x0d, 0x06, 0x09,
36 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x0b, 0x05, 0x00, 0x30,
37 0x12, 0x31, 0x10, 0x30, 0x0e, 0x06, 0x03, 0x55, 0x04, 0x0a, 0x13, 0x07,
38 0x41, 0x63, 0x6d, 0x65, 0x20, 0x43, 0x6f, 0x30, 0x1e, 0x17, 0x0d, 0x31,
39 0x35, 0x31, 0x31, 0x30, 0x37, 0x30, 0x30, 0x32, 0x34, 0x35, 0x36, 0x5a,
40 0x17, 0x0d, 0x31, 0x36, 0x31, 0x31, 0x30, 0x36, 0x30, 0x30, 0x32, 0x34,
41 0x35, 0x36, 0x5a, 0x30, 0x12, 0x31, 0x10, 0x30, 0x0e, 0x06, 0x03, 0x55,
42 0x04, 0x0a, 0x13, 0x07, 0x41, 0x63, 0x6d, 0x65, 0x20, 0x43, 0x6f, 0x30,
43 0x82, 0x01, 0x22, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7,
44 0x0d, 0x01, 0x01, 0x01, 0x05, 0x00, 0x03, 0x82, 0x01, 0x0f, 0x00, 0x30,
45 0x82, 0x01, 0x0a, 0x02, 0x82, 0x01, 0x01, 0x00, 0xce, 0x47, 0xcb, 0x11,
46 0xbb, 0xd2, 0x9d, 0x8e, 0x9e, 0xd2, 0x1e, 0x14, 0xaf, 0xc7, 0xea, 0xb6,
47 0xc9, 0x38, 0x2a, 0x6f, 0xb3, 0x7e, 0xfb, 0xbc, 0xfc, 0x59, 0x42, 0xb9,
48 0x56, 0xf0, 0x4c, 0x3f, 0xf7, 0x31, 0x84, 0xbe, 0xac, 0x03, 0x9e, 0x71,
49 0x91, 0x85, 0xd8, 0x32, 0xbd, 0x00, 0xea, 0xac, 0x65, 0xf6, 0x03, 0xc8,
50 0x0f, 0x8b, 0xfd, 0x6e, 0x58, 0x88, 0x04, 0x41, 0x92, 0x74, 0xa6, 0x57,
51 0x2e, 0x8e, 0x88, 0xd5, 0x3d, 0xda, 0x14, 0x3e, 0x63, 0x88, 0x22, 0xe3,
52 0x53, 0xe9, 0xba, 0x39, 0x09, 0xac, 0xfb, 0xd0, 0x4c, 0xf2, 0x3c, 0x20,
53 0xd6, 0x97, 0xe6, 0xed, 0xf1, 0x62, 0x1e, 0xe5, 0xc9, 0x48, 0xa0, 0xca,
54 0x2e, 0x3c, 0x14, 0x5a, 0x82, 0xd4, 0xed, 0xb1, 0xe3, 0x43, 0xc1, 0x2a,
55 0x59, 0xa5, 0xb9, 0xc8, 0x48, 0xa7, 0x39, 0x23, 0x74, 0xa7, 0x37, 0xb0,
56 0x6f, 0xc3, 0x64, 0x99, 0x6c, 0xa2, 0x82, 0xc8, 0xf6, 0xdb, 0x86, 0x40,
57 0xce, 0xd1, 0x85, 0x9f, 0xce, 0x69, 0xf4, 0x15, 0x2a, 0x23, 0xca, 0xea,
58 0xb7, 0x7b, 0xdf, 0xfb, 0x43, 0x5f, 0xff, 0x7a, 0x49, 0x49, 0x0e, 0xe7,
59 0x02, 0x51, 0x45, 0x13, 0xe8, 0x90, 0x64, 0x21, 0x0c, 0x26, 0x2b, 0x5d,
60 0xfc, 0xe4, 0xb5, 0x86, 0x89, 0x43, 0x22, 0x4c, 0xf3, 0x3b, 0xf3, 0x09,
61 0xc4, 0xa4, 0x10, 0x80, 0xf2, 0x46, 0xe2, 0x46, 0x8f, 0x76, 0x50, 0xbf,
62 0xaf, 0x2b, 0x90, 0x1b, 0x78, 0xc7, 0xcf, 0xc1, 0x77, 0xd0, 0xfb, 0xa9,
63 0xfb, 0xc9, 0x66, 0x5a, 0xc5, 0x9b, 0x31, 0x41, 0x67, 0x01, 0xbe, 0x33,
64 0x10, 0xba, 0x05, 0x58, 0xed, 0x76, 0x53, 0xde, 0x5d, 0xc1, 0xe8, 0xbb,
65 0x9f, 0xf1, 0xcd, 0xfb, 0xdf, 0x64, 0x7f, 0xd7, 0x18, 0xab, 0x0f, 0x94,
66 0x28, 0x95, 0x4a, 0xcc, 0x6a, 0xa9, 0x50, 0xc7, 0x05, 0x47, 0x10, 0x41,
67 0x02, 0x03, 0x01, 0x00, 0x01, 0xa3, 0x50, 0x30, 0x4e, 0x30, 0x0e, 0x06,
68 0x03, 0x55, 0x1d, 0x0f, 0x01, 0x01, 0xff, 0x04, 0x04, 0x03, 0x02, 0x05,
69 0xa0, 0x30, 0x13, 0x06, 0x03, 0x55, 0x1d, 0x25, 0x04, 0x0c, 0x30, 0x0a,
70 0x06, 0x08, 0x2b, 0x06, 0x01, 0x05, 0x05, 0x07, 0x03, 0x01, 0x30, 0x0c,
71 0x06, 0x03, 0x55, 0x1d, 0x13, 0x01, 0x01, 0xff, 0x04, 0x02, 0x30, 0x00,
72 0x30, 0x19, 0x06, 0x03, 0x55, 0x1d, 0x11, 0x04, 0x12, 0x30, 0x10, 0x82,
73 0x0e, 0x66, 0x75, 0x7a, 0x7a, 0x2e, 0x62, 0x6f, 0x72, 0x69, 0x6e, 0x67,
74 0x73, 0x73, 0x6c, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7,
75 0x0d, 0x01, 0x01, 0x0b, 0x05, 0x00, 0x03, 0x82, 0x01, 0x01, 0x00, 0x92,
76 0xde, 0xef, 0x96, 0x06, 0x7b, 0xff, 0x71, 0x7d, 0x4e, 0xa0, 0x7d, 0xae,
77 0xb8, 0x22, 0xb4, 0x2c, 0xf7, 0x96, 0x9c, 0x37, 0x1d, 0x8f, 0xe7, 0xd9,
78 0x47, 0xff, 0x3f, 0xe9, 0x35, 0x95, 0x0e, 0xdd, 0xdc, 0x7f, 0xc8, 0x8a,
79 0x1e, 0x36, 0x1d, 0x38, 0x47, 0xfc, 0x76, 0xd2, 0x1f, 0x98, 0xa1, 0x36,
80 0xac, 0xc8, 0x70, 0x38, 0x0a, 0x3d, 0x51, 0x8d, 0x0f, 0x03, 0x1b, 0xef,
81 0x62, 0xa1, 0xcb, 0x2b, 0x4a, 0x8c, 0x12, 0x2b, 0x54, 0x50, 0x9a, 0x6b,
82 0xfe, 0xaf, 0xd9, 0xf6, 0xbf, 0x58, 0x11, 0x58, 0x5e, 0xe5, 0x86, 0x1e,
83 0x3b, 0x6b, 0x30, 0x7e, 0x72, 0x89, 0xe8, 0x6b, 0x7b, 0xb7, 0xaf, 0xef,
84 0x8b, 0xa9, 0x3e, 0xb0, 0xcd, 0x0b, 0xef, 0xb0, 0x0c, 0x96, 0x2b, 0xc5,
85 0x3b, 0xd5, 0xf1, 0xc2, 0xae, 0x3a, 0x60, 0xd9, 0x0f, 0x75, 0x37, 0x55,
86 0x4d, 0x62, 0xd2, 0xed, 0x96, 0xac, 0x30, 0x6b, 0xda, 0xa1, 0x48, 0x17,
87 0x96, 0x23, 0x85, 0x9a, 0x57, 0x77, 0xe9, 0x22, 0xa2, 0x37, 0x03, 0xba,
88 0x49, 0x77, 0x40, 0x3b, 0x76, 0x4b, 0xda, 0xc1, 0x04, 0x57, 0x55, 0x34,
89 0x22, 0x83, 0x45, 0x29, 0xab, 0x2e, 0x11, 0xff, 0x0d, 0xab, 0x55, 0xb1,
90 0xa7, 0x58, 0x59, 0x05, 0x25, 0xf9, 0x1e, 0x3d, 0xb7, 0xac, 0x04, 0x39,
91 0x2c, 0xf9, 0xaf, 0xb8, 0x68, 0xfb, 0x8e, 0x35, 0x71, 0x32, 0xff, 0x70,
92 0xe9, 0x46, 0x6d, 0x5c, 0x06, 0x90, 0x88, 0x23, 0x48, 0x0c, 0x50, 0xeb,
93 0x0a, 0xa9, 0xae, 0xe8, 0xfc, 0xbe, 0xa5, 0x76, 0x94, 0xd7, 0x64, 0x22,
94 0x38, 0x98, 0x17, 0xa4, 0x3a, 0xa7, 0x59, 0x9f, 0x1d, 0x3b, 0x75, 0x90,
95 0x1a, 0x81, 0xef, 0x19, 0xfb, 0x2b, 0xb7, 0xa7, 0x64, 0x61, 0x22, 0xa4,
96 0x6f, 0x7b, 0xfa, 0x58, 0xbb, 0x8c, 0x4e, 0x77, 0x67, 0xd0, 0x5d, 0x58,
97 0x76, 0x8a, 0xbb,
98 };
99
100 static const uint8_t kRSAPrivateKeyDER[] = {
101 0x30, 0x82, 0x04, 0xa5, 0x02, 0x01, 0x00, 0x02, 0x82, 0x01, 0x01, 0x00,
102 0xce, 0x47, 0xcb, 0x11, 0xbb, 0xd2, 0x9d, 0x8e, 0x9e, 0xd2, 0x1e, 0x14,
103 0xaf, 0xc7, 0xea, 0xb6, 0xc9, 0x38, 0x2a, 0x6f, 0xb3, 0x7e, 0xfb, 0xbc,
104 0xfc, 0x59, 0x42, 0xb9, 0x56, 0xf0, 0x4c, 0x3f, 0xf7, 0x31, 0x84, 0xbe,
105 0xac, 0x03, 0x9e, 0x71, 0x91, 0x85, 0xd8, 0x32, 0xbd, 0x00, 0xea, 0xac,
106 0x65, 0xf6, 0x03, 0xc8, 0x0f, 0x8b, 0xfd, 0x6e, 0x58, 0x88, 0x04, 0x41,
107 0x92, 0x74, 0xa6, 0x57, 0x2e, 0x8e, 0x88, 0xd5, 0x3d, 0xda, 0x14, 0x3e,
108 0x63, 0x88, 0x22, 0xe3, 0x53, 0xe9, 0xba, 0x39, 0x09, 0xac, 0xfb, 0xd0,
109 0x4c, 0xf2, 0x3c, 0x20, 0xd6, 0x97, 0xe6, 0xed, 0xf1, 0x62, 0x1e, 0xe5,
110 0xc9, 0x48, 0xa0, 0xca, 0x2e, 0x3c, 0x14, 0x5a, 0x82, 0xd4, 0xed, 0xb1,
111 0xe3, 0x43, 0xc1, 0x2a, 0x59, 0xa5, 0xb9, 0xc8, 0x48, 0xa7, 0x39, 0x23,
112 0x74, 0xa7, 0x37, 0xb0, 0x6f, 0xc3, 0x64, 0x99, 0x6c, 0xa2, 0x82, 0xc8,
113 0xf6, 0xdb, 0x86, 0x40, 0xce, 0xd1, 0x85, 0x9f, 0xce, 0x69, 0xf4, 0x15,
114 0x2a, 0x23, 0xca, 0xea, 0xb7, 0x7b, 0xdf, 0xfb, 0x43, 0x5f, 0xff, 0x7a,
115 0x49, 0x49, 0x0e, 0xe7, 0x02, 0x51, 0x45, 0x13, 0xe8, 0x90, 0x64, 0x21,
116 0x0c, 0x26, 0x2b, 0x5d, 0xfc, 0xe4, 0xb5, 0x86, 0x89, 0x43, 0x22, 0x4c,
117 0xf3, 0x3b, 0xf3, 0x09, 0xc4, 0xa4, 0x10, 0x80, 0xf2, 0x46, 0xe2, 0x46,
118 0x8f, 0x76, 0x50, 0xbf, 0xaf, 0x2b, 0x90, 0x1b, 0x78, 0xc7, 0xcf, 0xc1,
119 0x77, 0xd0, 0xfb, 0xa9, 0xfb, 0xc9, 0x66, 0x5a, 0xc5, 0x9b, 0x31, 0x41,
120 0x67, 0x01, 0xbe, 0x33, 0x10, 0xba, 0x05, 0x58, 0xed, 0x76, 0x53, 0xde,
121 0x5d, 0xc1, 0xe8, 0xbb, 0x9f, 0xf1, 0xcd, 0xfb, 0xdf, 0x64, 0x7f, 0xd7,
122 0x18, 0xab, 0x0f, 0x94, 0x28, 0x95, 0x4a, 0xcc, 0x6a, 0xa9, 0x50, 0xc7,
123 0x05, 0x47, 0x10, 0x41, 0x02, 0x03, 0x01, 0x00, 0x01, 0x02, 0x82, 0x01,
124 0x01, 0x00, 0xa8, 0x47, 0xb9, 0x4a, 0x06, 0x47, 0x93, 0x71, 0x3d, 0xef,
125 0x7b, 0xca, 0xb4, 0x7c, 0x0a, 0xe6, 0x82, 0xd0, 0xe7, 0x0d, 0xa9, 0x08,
126 0xf6, 0xa4, 0xfd, 0xd8, 0x73, 0xae, 0x6f, 0x56, 0x29, 0x5e, 0x25, 0x72,
127 0xa8, 0x30, 0x44, 0x73, 0xcf, 0x56, 0x26, 0xb9, 0x61, 0xde, 0x42, 0x81,
128 0xf4, 0xf0, 0x1f, 0x5d, 0xcb, 0x47, 0xf2, 0x26, 0xe9, 0xe0, 0x93, 0x28,
129 0xa3, 0x10, 0x3b, 0x42, 0x1e, 0x51, 0x11, 0x12, 0x06, 0x5e, 0xaf, 0xce,
130 0xb0, 0xa5, 0x14, 0xdd, 0x82, 0x58, 0xa1, 0xa4, 0x12, 0xdf, 0x65, 0x1d,
131 0x51, 0x70, 0x64, 0xd5, 0x58, 0x68, 0x11, 0xa8, 0x6a, 0x23, 0xc2, 0xbf,
132 0xa1, 0x25, 0x24, 0x47, 0xb3, 0xa4, 0x3c, 0x83, 0x96, 0xb7, 0x1f, 0xf4,
133 0x44, 0xd4, 0xd1, 0xe9, 0xfc, 0x33, 0x68, 0x5e, 0xe2, 0x68, 0x99, 0x9c,
134 0x91, 0xe8, 0x72, 0xc9, 0xd7, 0x8c, 0x80, 0x20, 0x8e, 0x77, 0x83, 0x4d,
135 0xe4, 0xab, 0xf9, 0x74, 0xa1, 0xdf, 0xd3, 0xc0, 0x0d, 0x5b, 0x05, 0x51,
136 0xc2, 0x6f, 0xb2, 0x91, 0x02, 0xec, 0xc0, 0x02, 0x1a, 0x5c, 0x91, 0x05,
137 0xf1, 0xe3, 0xfa, 0x65, 0xc2, 0xad, 0x24, 0xe6, 0xe5, 0x3c, 0xb6, 0x16,
138 0xf1, 0xa1, 0x67, 0x1a, 0x9d, 0x37, 0x56, 0xbf, 0x01, 0xd7, 0x3b, 0x35,
139 0x30, 0x57, 0x73, 0xf4, 0xf0, 0x5e, 0xa7, 0xe8, 0x0a, 0xc1, 0x94, 0x17,
140 0xcf, 0x0a, 0xbd, 0xf5, 0x31, 0xa7, 0x2d, 0xf7, 0xf5, 0xd9, 0x8c, 0xc2,
141 0x01, 0xbd, 0xda, 0x16, 0x8e, 0xb9, 0x30, 0x40, 0xa6, 0x6e, 0xbd, 0xcd,
142 0x4d, 0x84, 0x67, 0x4e, 0x0b, 0xce, 0xd5, 0xef, 0xf8, 0x08, 0x63, 0x02,
143 0xc6, 0xc7, 0xf7, 0x67, 0x92, 0xe2, 0x23, 0x9d, 0x27, 0x22, 0x1d, 0xc6,
144 0x67, 0x5e, 0x66, 0xbf, 0x03, 0xb8, 0xa9, 0x67, 0xd4, 0x39, 0xd8, 0x75,
145 0xfa, 0xe8, 0xed, 0x56, 0xb8, 0x81, 0x02, 0x81, 0x81, 0x00, 0xf7, 0x46,
146 0x68, 0xc6, 0x13, 0xf8, 0xba, 0x0f, 0x83, 0xdb, 0x05, 0xa8, 0x25, 0x00,
147 0x70, 0x9c, 0x9e, 0x8b, 0x12, 0x34, 0x0d, 0x96, 0xcf, 0x0d, 0x98, 0x9b,
148 0x8d, 0x9c, 0x96, 0x78, 0xd1, 0x3c, 0x01, 0x8c, 0xb9, 0x35, 0x5c, 0x20,
149 0x42, 0xb4, 0x38, 0xe3, 0xd6, 0x54, 0xe7, 0x55, 0xd6, 0x26, 0x8a, 0x0c,
150 0xf6, 0x1f, 0xe0, 0x04, 0xc1, 0x22, 0x42, 0x19, 0x61, 0xc4, 0x94, 0x7c,
151 0x07, 0x2e, 0x80, 0x52, 0xfe, 0x8d, 0xe6, 0x92, 0x3a, 0x91, 0xfe, 0x72,
152 0x99, 0xe1, 0x2a, 0x73, 0x76, 0xb1, 0x24, 0x20, 0x67, 0xde, 0x28, 0xcb,
153 0x0e, 0xe6, 0x52, 0xb5, 0xfa, 0xfb, 0x8b, 0x1e, 0x6a, 0x1d, 0x09, 0x26,
154 0xb9, 0xa7, 0x61, 0xba, 0xf8, 0x79, 0xd2, 0x66, 0x57, 0x28, 0xd7, 0x31,
155 0xb5, 0x0b, 0x27, 0x19, 0x1e, 0x6f, 0x46, 0xfc, 0x54, 0x95, 0xeb, 0x78,
156 0x01, 0xb6, 0xd9, 0x79, 0x5a, 0x4d, 0x02, 0x81, 0x81, 0x00, 0xd5, 0x8f,
157 0x16, 0x53, 0x2f, 0x57, 0x93, 0xbf, 0x09, 0x75, 0xbf, 0x63, 0x40, 0x3d,
158 0x27, 0xfd, 0x23, 0x21, 0xde, 0x9b, 0xe9, 0x73, 0x3f, 0x49, 0x02, 0xd2,
159 0x38, 0x96, 0xcf, 0xc3, 0xba, 0x92, 0x07, 0x87, 0x52, 0xa9, 0x35, 0xe3,
160 0x0c, 0xe4, 0x2f, 0x05, 0x7b, 0x37, 0xa5, 0x40, 0x9c, 0x3b, 0x94, 0xf7,
161 0xad, 0xa0, 0xee, 0x3a, 0xa8, 0xfb, 0x1f, 0x11, 0x1f, 0xd8, 0x9a, 0x80,
162 0x42, 0x3d, 0x7f, 0xa4, 0xb8, 0x9a, 0xaa, 0xea, 0x72, 0xc1, 0xe3, 0xed,
163 0x06, 0x60, 0x92, 0x37, 0xf9, 0xba, 0xfb, 0x9e, 0xed, 0x05, 0xa6, 0xd4,
164 0x72, 0x68, 0x4f, 0x63, 0xfe, 0xd6, 0x10, 0x0d, 0x4f, 0x0a, 0x93, 0xc6,
165 0xb9, 0xd7, 0xaf, 0xfd, 0xd9, 0x57, 0x7d, 0xcb, 0x75, 0xe8, 0x93, 0x2b,
166 0xae, 0x4f, 0xea, 0xd7, 0x30, 0x0b, 0x58, 0x44, 0x82, 0x0f, 0x84, 0x5d,
167 0x62, 0x11, 0x78, 0xea, 0x5f, 0xc5, 0x02, 0x81, 0x81, 0x00, 0x82, 0x0c,
168 0xc1, 0xe6, 0x0b, 0x72, 0xf1, 0x48, 0x5f, 0xac, 0xbd, 0x98, 0xe5, 0x7d,
169 0x09, 0xbd, 0x15, 0x95, 0x47, 0x09, 0xa1, 0x6c, 0x03, 0x91, 0xbf, 0x05,
170 0x70, 0xc1, 0x3e, 0x52, 0x64, 0x99, 0x0e, 0xa7, 0x98, 0x70, 0xfb, 0xf6,
171 0xeb, 0x9e, 0x25, 0x9d, 0x8e, 0x88, 0x30, 0xf2, 0xf0, 0x22, 0x6c, 0xd0,
172 0xcc, 0x51, 0x8f, 0x5c, 0x70, 0xc7, 0x37, 0xc4, 0x69, 0xab, 0x1d, 0xfc,
173 0xed, 0x3a, 0x03, 0xbb, 0xa2, 0xad, 0xb6, 0xea, 0x89, 0x6b, 0x67, 0x4b,
174 0x96, 0xaa, 0xd9, 0xcc, 0xc8, 0x4b, 0xfa, 0x18, 0x21, 0x08, 0xb2, 0xa3,
175 0xb9, 0x3e, 0x61, 0x99, 0xdc, 0x5a, 0x97, 0x9c, 0x73, 0x6a, 0xb9, 0xf9,
176 0x68, 0x03, 0x24, 0x5f, 0x55, 0x77, 0x9c, 0xb4, 0xbe, 0x7a, 0x78, 0x53,
177 0x68, 0x48, 0x69, 0x53, 0xc8, 0xb1, 0xf5, 0xbf, 0x98, 0x2d, 0x11, 0x1e,
178 0x98, 0xa8, 0x36, 0x50, 0xa0, 0xb1, 0x02, 0x81, 0x81, 0x00, 0x90, 0x88,
179 0x30, 0x71, 0xc7, 0xfe, 0x9b, 0x6d, 0x95, 0x37, 0x6d, 0x79, 0xfc, 0x85,
180 0xe7, 0x44, 0x78, 0xbc, 0x79, 0x6e, 0x47, 0x86, 0xc9, 0xf3, 0xdd, 0xc6,
181 0xec, 0xa9, 0x94, 0x9f, 0x40, 0xeb, 0x87, 0xd0, 0xdb, 0xee, 0xcd, 0x1b,
182 0x87, 0x23, 0xff, 0x76, 0xd4, 0x37, 0x8a, 0xcd, 0xb9, 0x6e, 0xd1, 0x98,
183 0xf6, 0x97, 0x8d, 0xe3, 0x81, 0x6d, 0xc3, 0x4e, 0xd1, 0xa0, 0xc4, 0x9f,
184 0xbd, 0x34, 0xe5, 0xe8, 0x53, 0x4f, 0xca, 0x10, 0xb5, 0xed, 0xe7, 0x16,
185 0x09, 0x54, 0xde, 0x60, 0xa7, 0xd1, 0x16, 0x6e, 0x2e, 0xb7, 0xbe, 0x7a,
186 0xd5, 0x9b, 0x26, 0xef, 0xe4, 0x0e, 0x77, 0xfa, 0xa9, 0xdd, 0xdc, 0xb9,
187 0x88, 0x19, 0x23, 0x70, 0xc7, 0xe1, 0x60, 0xaf, 0x8c, 0x73, 0x04, 0xf7,
188 0x71, 0x17, 0x81, 0x36, 0x75, 0xbb, 0x97, 0xd7, 0x75, 0xb6, 0x8e, 0xbc,
189 0xac, 0x9c, 0x6a, 0x9b, 0x24, 0x89, 0x02, 0x81, 0x80, 0x5a, 0x2b, 0xc7,
190 0x6b, 0x8c, 0x65, 0xdb, 0x04, 0x73, 0xab, 0x25, 0xe1, 0x5b, 0xbc, 0x3c,
191 0xcf, 0x5a, 0x3c, 0x04, 0xae, 0x97, 0x2e, 0xfd, 0xa4, 0x97, 0x1f, 0x05,
192 0x17, 0x27, 0xac, 0x7c, 0x30, 0x85, 0xb4, 0x82, 0x3f, 0x5b, 0xb7, 0x94,
193 0x3b, 0x7f, 0x6c, 0x0c, 0xc7, 0x16, 0xc6, 0xa0, 0xbd, 0x80, 0xb0, 0x81,
194 0xde, 0xa0, 0x23, 0xa6, 0xf6, 0x75, 0x33, 0x51, 0x35, 0xa2, 0x75, 0x55,
195 0x70, 0x4d, 0x42, 0xbb, 0xcf, 0x54, 0xe4, 0xdb, 0x2d, 0x88, 0xa0, 0x7a,
196 0xf2, 0x17, 0xa7, 0xdd, 0x13, 0x44, 0x9f, 0x5f, 0x6b, 0x2c, 0x42, 0x42,
197 0x8b, 0x13, 0x4d, 0xf9, 0x5b, 0xf8, 0x33, 0x42, 0xd9, 0x9e, 0x50, 0x1c,
198 0x7c, 0xbc, 0xfa, 0x62, 0x85, 0x0b, 0xcf, 0x99, 0xda, 0x9e, 0x04, 0x90,
199 0xb2, 0xc6, 0xb2, 0x0a, 0x2a, 0x7c, 0x6d, 0x6a, 0x40, 0xfc, 0xf5, 0x50,
200 0x98, 0x46, 0x89, 0x82, 0x40,
201 };
202
203 struct GlobalState {
GlobalStateGlobalState204 GlobalState() {
205 const uint8_t *bufp = kRSAPrivateKeyDER;
206 RSA *privkey = d2i_RSAPrivateKey(NULL, &bufp, sizeof(kRSAPrivateKeyDER));
207 assert(privkey != nullptr);
208
209 pkey_.reset(EVP_PKEY_new());
210 EVP_PKEY_assign_RSA(pkey_.get(), privkey);
211
212 bufp = kCertificateDER;
213 cert_.reset(d2i_X509(NULL, &bufp, sizeof(kCertificateDER)));
214 assert(cert_.get() != nullptr);
215
216 certs_.reset(sk_X509_new_null());
217 bssl::PushToStack(certs_.get(), bssl::UpRef(cert_));
218 }
219
220 bssl::UniquePtr<EVP_PKEY> pkey_;
221 bssl::UniquePtr<X509> cert_;
222 bssl::UniquePtr<STACK_OF(X509)> certs_;
223 };
224
225 static GlobalState g_state;
226
GetString(std::string * out,CBS * cbs)227 static bool GetString(std::string *out, CBS *cbs) {
228 CBS str;
229 if (!CBS_get_u8_length_prefixed(cbs, &str)) {
230 return false;
231 }
232
233 out->assign(reinterpret_cast<const char *>(CBS_data(&str)), CBS_len(&str));
234 return true;
235 }
236
237 template <typename T>
GetVector(std::vector<T> * out,CBS * cbs)238 static bool GetVector(std::vector<T> *out, CBS *cbs) {
239 static_assert(std::is_pod<T>::value,
240 "GetVector may only be called on POD types");
241
242 CBS child;
243 if (!CBS_get_u8_length_prefixed(cbs, &child)) {
244 return false;
245 }
246
247 size_t num = CBS_len(&child) / sizeof(T);
248 out->resize(num);
249 out->shrink_to_fit(); // Ensure ASan notices out-of-bounds reads.
250 OPENSSL_memcpy(out->data(), CBS_data(&child), num * sizeof(T));
251 return true;
252 }
253
LLVMFuzzerTestOneInput(const uint8_t * buf,size_t len)254 extern "C" int LLVMFuzzerTestOneInput(const uint8_t *buf, size_t len) {
255 constexpr size_t kMaxExpensiveAPIs = 100;
256 constexpr size_t kMaxAPIs = 10000;
257 unsigned expensive_api_count = 0;
258
259 const std::function<void(SSL_CTX *, CBS *)> kAPIs[] = {
260 [](SSL_CTX *ctx, CBS *cbs) {
261 uint8_t b;
262 if (!CBS_get_u8(cbs, &b)) {
263 return;
264 }
265 SSL_CTX_set_quiet_shutdown(ctx, b);
266 },
267 [](SSL_CTX *ctx, CBS *cbs) { SSL_CTX_get_quiet_shutdown(ctx); },
268 [](SSL_CTX *ctx, CBS *cbs) {
269 uint16_t version;
270 if (!CBS_get_u16(cbs, &version)) {
271 return;
272 }
273 SSL_CTX_set_min_proto_version(ctx, version);
274 },
275 [](SSL_CTX *ctx, CBS *cbs) {
276 uint16_t version;
277 if (!CBS_get_u16(cbs, &version)) {
278 return;
279 }
280 SSL_CTX_set_max_proto_version(ctx, version);
281 },
282 [](SSL_CTX *ctx, CBS *cbs) {
283 uint32_t options;
284 if (!CBS_get_u32(cbs, &options)) {
285 return;
286 }
287 SSL_CTX_set_options(ctx, options);
288 },
289 [](SSL_CTX *ctx, CBS *cbs) {
290 uint32_t options;
291 if (!CBS_get_u32(cbs, &options)) {
292 return;
293 }
294 SSL_CTX_clear_options(ctx, options);
295 },
296 [](SSL_CTX *ctx, CBS *cbs) { SSL_CTX_get_options(ctx); },
297 [](SSL_CTX *ctx, CBS *cbs) {
298 uint32_t mode;
299 if (!CBS_get_u32(cbs, &mode)) {
300 return;
301 }
302 SSL_CTX_set_mode(ctx, mode);
303 },
304 [](SSL_CTX *ctx, CBS *cbs) {
305 uint32_t mode;
306 if (!CBS_get_u32(cbs, &mode)) {
307 return;
308 }
309 SSL_CTX_clear_mode(ctx, mode);
310 },
311 [](SSL_CTX *ctx, CBS *cbs) { SSL_CTX_get_mode(ctx); },
312 [](SSL_CTX *ctx, CBS *cbs) {
313 SSL_CTX_use_certificate(ctx, g_state.cert_.get());
314 },
315 [](SSL_CTX *ctx, CBS *cbs) {
316 SSL_CTX_use_PrivateKey(ctx, g_state.pkey_.get());
317 },
318 [](SSL_CTX *ctx, CBS *cbs) {
319 SSL_CTX_set1_chain(ctx, g_state.certs_.get());
320 },
321 [&](SSL_CTX *ctx, CBS *cbs) {
322 // Avoid an unbounded certificate chain.
323 if (++expensive_api_count >= kMaxExpensiveAPIs) {
324 return;
325 }
326
327 SSL_CTX_add1_chain_cert(ctx, g_state.cert_.get());
328 },
329 [](SSL_CTX *ctx, CBS *cbs) { SSL_CTX_clear_chain_certs(ctx); },
330 [](SSL_CTX *ctx, CBS *cbs) { SSL_CTX_clear_extra_chain_certs(ctx); },
331 [](SSL_CTX *ctx, CBS *cbs) { SSL_CTX_check_private_key(ctx); },
332 [](SSL_CTX *ctx, CBS *cbs) { SSL_CTX_get0_certificate(ctx); },
333 [](SSL_CTX *ctx, CBS *cbs) { SSL_CTX_get0_privatekey(ctx); },
334 [](SSL_CTX *ctx, CBS *cbs) {
335 STACK_OF(X509) * chains;
336 SSL_CTX_get0_chain_certs(ctx, &chains);
337 },
338 [](SSL_CTX *ctx, CBS *cbs) {
339 std::vector<uint8_t> sct_data;
340 if (!GetVector(&sct_data, cbs)) {
341 return;
342 }
343 SSL_CTX_set_signed_cert_timestamp_list(ctx, sct_data.data(),
344 sct_data.size());
345 },
346 [](SSL_CTX *ctx, CBS *cbs) {
347 std::vector<uint8_t> ocsp_data;
348 if (!GetVector(&ocsp_data, cbs)) {
349 return;
350 }
351 SSL_CTX_set_ocsp_response(ctx, ocsp_data.data(), ocsp_data.size());
352 },
353 [](SSL_CTX *ctx, CBS *cbs) {
354 std::vector<uint16_t> algs;
355 if (!GetVector(&algs, cbs)) {
356 return;
357 }
358 SSL_CTX_set_signing_algorithm_prefs(ctx, algs.data(), algs.size());
359 },
360 [](SSL_CTX *ctx, CBS *cbs) {
361 std::string ciphers;
362 if (!GetString(&ciphers, cbs)) {
363 return;
364 }
365 SSL_CTX_set_strict_cipher_list(ctx, ciphers.c_str());
366 },
367 [](SSL_CTX *ctx, CBS *cbs) {
368 std::string ciphers;
369 if (!GetString(&ciphers, cbs)) {
370 return;
371 }
372 SSL_CTX_set_cipher_list(ctx, ciphers.c_str());
373 },
374 [](SSL_CTX *ctx, CBS *cbs) {
375 std::vector<uint16_t> algs;
376 if (!GetVector(&algs, cbs)) {
377 return;
378 }
379 SSL_CTX_set_verify_algorithm_prefs(ctx, algs.data(), algs.size());
380 },
381 [](SSL_CTX *ctx, CBS *cbs) {
382 std::vector<uint8_t> id_ctx;
383 if (!GetVector(&id_ctx, cbs)) {
384 return;
385 }
386 SSL_CTX_set_session_id_context(ctx, id_ctx.data(), id_ctx.size());
387 },
388 [](SSL_CTX *ctx, CBS *cbs) {
389 uint32_t size;
390 if (!CBS_get_u32(cbs, &size)) {
391 return;
392 }
393 SSL_CTX_sess_set_cache_size(ctx, size);
394 },
395 [](SSL_CTX *ctx, CBS *cbs) { SSL_CTX_sess_get_cache_size(ctx); },
396 [](SSL_CTX *ctx, CBS *cbs) { SSL_CTX_sess_number(ctx); },
397 [](SSL_CTX *ctx, CBS *cbs) {
398 uint32_t time;
399 if (!CBS_get_u32(cbs, &time)) {
400 return;
401 }
402 SSL_CTX_flush_sessions(ctx, time);
403 },
404 [](SSL_CTX *ctx, CBS *cbs) {
405 std::vector<uint8_t> keys;
406 if (!GetVector(&keys, cbs)) {
407 return;
408 }
409 SSL_CTX_set_tlsext_ticket_keys(ctx, keys.data(), keys.size());
410 },
411 [](SSL_CTX *ctx, CBS *cbs) {
412 std::vector<int> curves;
413 if (!GetVector(&curves, cbs)) {
414 return;
415 }
416 SSL_CTX_set1_curves(ctx, curves.data(), curves.size());
417 },
418 [](SSL_CTX *ctx, CBS *cbs) {
419 std::string curves;
420 if (!GetString(&curves, cbs)) {
421 return;
422 }
423 SSL_CTX_set1_curves_list(ctx, curves.c_str());
424 },
425 [](SSL_CTX *ctx, CBS *cbs) {
426 SSL_CTX_enable_signed_cert_timestamps(ctx);
427 },
428 [](SSL_CTX *ctx, CBS *cbs) { SSL_CTX_enable_ocsp_stapling(ctx); },
429 [&](SSL_CTX *ctx, CBS *cbs) {
430 // Avoid an unbounded client CA list.
431 if (++expensive_api_count >= kMaxExpensiveAPIs) {
432 return;
433 }
434
435 SSL_CTX_add_client_CA(ctx, g_state.cert_.get());
436 },
437 [](SSL_CTX *ctx, CBS *cbs) {
438 std::vector<uint8_t> protos;
439 if (!GetVector(&protos, cbs)) {
440 return;
441 }
442 SSL_CTX_set_alpn_protos(ctx, protos.data(), protos.size());
443 },
444 [](SSL_CTX *ctx, CBS *cbs) {
445 std::string profiles;
446 if (!GetString(&profiles, cbs)) {
447 return;
448 }
449 SSL_CTX_set_srtp_profiles(ctx, profiles.c_str());
450 },
451 [](SSL_CTX *ctx, CBS *cbs) { SSL_CTX_get_max_cert_list(ctx); },
452 [](SSL_CTX *ctx, CBS *cbs) {
453 uint32_t size;
454 if (!CBS_get_u32(cbs, &size)) {
455 return;
456 }
457 SSL_CTX_set_max_cert_list(ctx, size);
458 },
459 [](SSL_CTX *ctx, CBS *cbs) {
460 uint32_t size;
461 if (!CBS_get_u32(cbs, &size)) {
462 return;
463 }
464 SSL_CTX_set_max_send_fragment(ctx, size);
465 },
466 [](SSL_CTX *ctx, CBS *cbs) {
467 uint8_t b;
468 if (!CBS_get_u8(cbs, &b)) {
469 return;
470 }
471 SSL_CTX_set_retain_only_sha256_of_client_certs(ctx, b);
472 },
473 [](SSL_CTX *ctx, CBS *cbs) {
474 uint8_t b;
475 if (!CBS_get_u8(cbs, &b)) {
476 return;
477 }
478 SSL_CTX_set_grease_enabled(ctx, b);
479 },
480 [](SSL_CTX *ctx, CBS *cbs) {
481 std::vector<int> sigalgs;
482 if (!GetVector(&sigalgs, cbs)) {
483 return;
484 }
485 SSL_CTX_set1_sigalgs(ctx, sigalgs.data(), sigalgs.size());
486 },
487 [](SSL_CTX *ctx, CBS *cbs) {
488 std::string sigalgs;
489 if (!GetString(&sigalgs, cbs)) {
490 return;
491 }
492 SSL_CTX_set1_sigalgs_list(ctx, sigalgs.c_str());
493 },
494 };
495
496 bssl::UniquePtr<SSL_CTX> ctx(SSL_CTX_new(TLS_method()));
497
498 // If the number of functions exceeds this limit then the code needs to do
499 // more than sample a single uint8_t to pick the function.
500 static_assert(OPENSSL_ARRAY_SIZE(kAPIs) < 256, "kAPIs too large");
501
502 CBS cbs;
503 CBS_init(&cbs, buf, len);
504
505 for (unsigned i = 0; i < kMaxAPIs; i++) {
506 uint8_t index;
507 if (!CBS_get_u8(&cbs, &index)) {
508 break;
509 }
510
511 kAPIs[index % OPENSSL_ARRAY_SIZE(kAPIs)](ctx.get(), &cbs);
512 }
513
514 bssl::UniquePtr<SSL> ssl(SSL_new(ctx.get()));
515 ERR_clear_error();
516
517 return 0;
518 }
519