x509_test.cc
Go to the documentation of this file.
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 <algorithm>
16 #include <functional>
17 #include <string>
18 #include <vector>
19 
20 #include <gtest/gtest.h>
21 
22 #include <openssl/asn1.h>
23 #include <openssl/bio.h>
24 #include <openssl/bytestring.h>
25 #include <openssl/crypto.h>
26 #include <openssl/curve25519.h>
27 #include <openssl/digest.h>
28 #include <openssl/err.h>
29 #include <openssl/nid.h>
30 #include <openssl/pem.h>
31 #include <openssl/pool.h>
32 #include <openssl/x509.h>
33 #include <openssl/x509v3.h>
34 
35 #include "internal.h"
36 #include "../internal.h"
37 #include "../test/test_util.h"
38 #include "../x509v3/internal.h"
39 
40 
41 std::string GetTestData(const char *path);
42 
43 static const char kCrossSigningRootPEM[] = R"(
44 -----BEGIN CERTIFICATE-----
45 MIICcTCCAdqgAwIBAgIIagJHiPvE0MowDQYJKoZIhvcNAQELBQAwPDEaMBgGA1UE
46 ChMRQm9yaW5nU1NMIFRFU1RJTkcxHjAcBgNVBAMTFUNyb3NzLXNpZ25pbmcgUm9v
47 dCBDQTAgFw0xNTAxMDEwMDAwMDBaGA8yMTAwMDEwMTAwMDAwMFowPDEaMBgGA1UE
48 ChMRQm9yaW5nU1NMIFRFU1RJTkcxHjAcBgNVBAMTFUNyb3NzLXNpZ25pbmcgUm9v
49 dCBDQTCBnzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEAwo3qFvSB9Zmlbpzn9wJp
50 ikI75Rxkatez8VkLqyxbOhPYl2Haz8F5p1gDG96dCI6jcLGgu3AKT9uhEQyyUko5
51 EKYasazSeA9CQrdyhPg0mkTYVETnPM1W/ebid1YtqQbq1CMWlq2aTDoSGAReGFKP
52 RTdXAbuAXzpCfi/d8LqV13UCAwEAAaN6MHgwDgYDVR0PAQH/BAQDAgIEMB0GA1Ud
53 JQQWMBQGCCsGAQUFBwMBBggrBgEFBQcDAjAPBgNVHRMBAf8EBTADAQH/MBkGA1Ud
54 DgQSBBBHKHC7V3Z/3oLvEZx0RZRwMBsGA1UdIwQUMBKAEEcocLtXdn/egu8RnHRF
55 lHAwDQYJKoZIhvcNAQELBQADgYEAnglibsy6mGtpIXivtlcz4zIEnHw/lNW+r/eC
56 CY7evZTmOoOuC/x9SS3MF9vawt1HFUummWM6ZgErqVBOXIB4//ykrcCgf5ZbF5Hr
57 +3EFprKhBqYiXdD8hpBkrBoXwn85LPYWNd2TceCrx0YtLIprE2R5MB2RIq8y4Jk3
58 YFXvkME=
59 -----END CERTIFICATE-----
60 )";
61 
62 static const char kRootCAPEM[] = R"(
63 -----BEGIN CERTIFICATE-----
64 MIICVTCCAb6gAwIBAgIIAj5CwoHlWuYwDQYJKoZIhvcNAQELBQAwLjEaMBgGA1UE
65 ChMRQm9yaW5nU1NMIFRFU1RJTkcxEDAOBgNVBAMTB1Jvb3QgQ0EwIBcNMTUwMTAx
66 MDAwMDAwWhgPMjEwMDAxMDEwMDAwMDBaMC4xGjAYBgNVBAoTEUJvcmluZ1NTTCBU
67 RVNUSU5HMRAwDgYDVQQDEwdSb290IENBMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCB
68 iQKBgQDpDn8RDOZa5oaDcPZRBy4CeBH1siSSOO4mYgLHlPE+oXdqwI/VImi2XeJM
69 2uCFETXCknJJjYG0iJdrt/yyRFvZTQZw+QzGj+mz36NqhGxDWb6dstB2m8PX+plZ
70 w7jl81MDvUnWs8yiQ/6twgu5AbhWKZQDJKcNKCEpqa6UW0r5nwIDAQABo3oweDAO
71 BgNVHQ8BAf8EBAMCAgQwHQYDVR0lBBYwFAYIKwYBBQUHAwEGCCsGAQUFBwMCMA8G
72 A1UdEwEB/wQFMAMBAf8wGQYDVR0OBBIEEEA31wH7QC+4HH5UBCeMWQEwGwYDVR0j
73 BBQwEoAQQDfXAftAL7gcflQEJ4xZATANBgkqhkiG9w0BAQsFAAOBgQDXylEK77Za
74 kKeY6ZerrScWyZhrjIGtHFu09qVpdJEzrk87k2G7iHHR9CAvSofCgEExKtWNS9dN
75 +9WiZp/U48iHLk7qaYXdEuO07No4BYtXn+lkOykE+FUxmA4wvOF1cTd2tdj3MzX2
76 kfGIBAYhzGZWhY3JbhIfTEfY1PNM1pWChQ==
77 -----END CERTIFICATE-----
78 )";
79 
80 static const char kRootCrossSignedPEM[] = R"(
81 -----BEGIN CERTIFICATE-----
82 MIICYzCCAcygAwIBAgIIAj5CwoHlWuYwDQYJKoZIhvcNAQELBQAwPDEaMBgGA1UE
83 ChMRQm9yaW5nU1NMIFRFU1RJTkcxHjAcBgNVBAMTFUNyb3NzLXNpZ25pbmcgUm9v
84 dCBDQTAgFw0xNTAxMDEwMDAwMDBaGA8yMTAwMDEwMTAwMDAwMFowLjEaMBgGA1UE
85 ChMRQm9yaW5nU1NMIFRFU1RJTkcxEDAOBgNVBAMTB1Jvb3QgQ0EwgZ8wDQYJKoZI
86 hvcNAQEBBQADgY0AMIGJAoGBAOkOfxEM5lrmhoNw9lEHLgJ4EfWyJJI47iZiAseU
87 8T6hd2rAj9UiaLZd4kza4IURNcKSckmNgbSIl2u3/LJEW9lNBnD5DMaP6bPfo2qE
88 bENZvp2y0Habw9f6mVnDuOXzUwO9SdazzKJD/q3CC7kBuFYplAMkpw0oISmprpRb
89 SvmfAgMBAAGjejB4MA4GA1UdDwEB/wQEAwICBDAdBgNVHSUEFjAUBggrBgEFBQcD
90 AQYIKwYBBQUHAwIwDwYDVR0TAQH/BAUwAwEB/zAZBgNVHQ4EEgQQQDfXAftAL7gc
91 flQEJ4xZATAbBgNVHSMEFDASgBBHKHC7V3Z/3oLvEZx0RZRwMA0GCSqGSIb3DQEB
92 CwUAA4GBAErTxYJ0en9HVRHAAr5OO5wuk5Iq3VMc79TMyQLCXVL8YH8Uk7KEwv+q
93 9MEKZv2eR/Vfm4HlXlUuIqfgUXbwrAYC/YVVX86Wnbpy/jc73NYVCq8FEZeO+0XU
94 90SWAPDdp+iL7aZdimnMtG1qlM1edmz8AKbrhN/R3IbA2CL0nCWV
95 -----END CERTIFICATE-----
96 )";
97 
98 static const char kIntermediatePEM[] = R"(
99 -----BEGIN CERTIFICATE-----
100 MIICXjCCAcegAwIBAgIJAKJMH+7rscPcMA0GCSqGSIb3DQEBCwUAMC4xGjAYBgNV
101 BAoTEUJvcmluZ1NTTCBURVNUSU5HMRAwDgYDVQQDEwdSb290IENBMCAXDTE1MDEw
102 MTAwMDAwMFoYDzIxMDAwMTAxMDAwMDAwWjA2MRowGAYDVQQKExFCb3JpbmdTU0wg
103 VEVTVElORzEYMBYGA1UEAxMPSW50ZXJtZWRpYXRlIENBMIGfMA0GCSqGSIb3DQEB
104 AQUAA4GNADCBiQKBgQC7YtI0l8ocTYJ0gKyXTtPL4iMJCNY4OcxXl48jkncVG1Hl
105 blicgNUa1r9m9YFtVkxvBinb8dXiUpEGhVg4awRPDcatlsBSEBuJkiZGYbRcAmSu
106 CmZYnf6u3aYQ18SU8WqVERPpE4cwVVs+6kwlzRw0+XDoZAczu8ZezVhCUc6NbQID
107 AQABo3oweDAOBgNVHQ8BAf8EBAMCAgQwHQYDVR0lBBYwFAYIKwYBBQUHAwEGCCsG
108 AQUFBwMCMA8GA1UdEwEB/wQFMAMBAf8wGQYDVR0OBBIEEIwaaKi1dttdV3sfjRSy
109 BqMwGwYDVR0jBBQwEoAQQDfXAftAL7gcflQEJ4xZATANBgkqhkiG9w0BAQsFAAOB
110 gQCvnolNWEHuQS8PFVVyuLR+FKBeUUdrVbSfHSzTqNAqQGp0C9fk5oCzDq6ZgTfY
111 ESXM4cJhb3IAnW0UM0NFsYSKQJ50JZL2L3z5ZLQhHdbs4RmODGoC40BVdnJ4/qgB
112 aGSh09eQRvAVmbVCviDK2ipkWNegdyI19jFfNP5uIkGlYg==
113 -----END CERTIFICATE-----
114 )";
115 
116 static const char kIntermediateSelfSignedPEM[] = R"(
117 -----BEGIN CERTIFICATE-----
118 MIICZjCCAc+gAwIBAgIJAKJMH+7rscPcMA0GCSqGSIb3DQEBCwUAMDYxGjAYBgNV
119 BAoTEUJvcmluZ1NTTCBURVNUSU5HMRgwFgYDVQQDEw9JbnRlcm1lZGlhdGUgQ0Ew
120 IBcNMTUwMTAxMDAwMDAwWhgPMjEwMDAxMDEwMDAwMDBaMDYxGjAYBgNVBAoTEUJv
121 cmluZ1NTTCBURVNUSU5HMRgwFgYDVQQDEw9JbnRlcm1lZGlhdGUgQ0EwgZ8wDQYJ
122 KoZIhvcNAQEBBQADgY0AMIGJAoGBALti0jSXyhxNgnSArJdO08viIwkI1jg5zFeX
123 jyOSdxUbUeVuWJyA1RrWv2b1gW1WTG8GKdvx1eJSkQaFWDhrBE8Nxq2WwFIQG4mS
124 JkZhtFwCZK4KZlid/q7dphDXxJTxapURE+kThzBVWz7qTCXNHDT5cOhkBzO7xl7N
125 WEJRzo1tAgMBAAGjejB4MA4GA1UdDwEB/wQEAwICBDAdBgNVHSUEFjAUBggrBgEF
126 BQcDAQYIKwYBBQUHAwIwDwYDVR0TAQH/BAUwAwEB/zAZBgNVHQ4EEgQQjBpoqLV2
127 211Xex+NFLIGozAbBgNVHSMEFDASgBCMGmiotXbbXVd7H40UsgajMA0GCSqGSIb3
128 DQEBCwUAA4GBALcccSrAQ0/EqQBsx0ZDTUydHXXNP2DrUkpUKmAXIe8McqIVSlkT
129 6H4xz7z8VRKBo9j+drjjtCw2i0CQc8aOLxRb5WJ8eVLnaW2XRlUqAzhF0CrulfVI
130 E4Vs6ZLU+fra1WAuIj6qFiigRja+3YkZArG8tMA9vtlhTX/g7YBZIkqH
131 -----END CERTIFICATE-----
132 )";
133 
134 static const char kLeafPEM[] = R"(
135 -----BEGIN CERTIFICATE-----
136 MIICXjCCAcegAwIBAgIIWjO48ufpunYwDQYJKoZIhvcNAQELBQAwNjEaMBgGA1UE
137 ChMRQm9yaW5nU1NMIFRFU1RJTkcxGDAWBgNVBAMTD0ludGVybWVkaWF0ZSBDQTAg
138 Fw0xNTAxMDEwMDAwMDBaGA8yMTAwMDEwMTAwMDAwMFowMjEaMBgGA1UEChMRQm9y
139 aW5nU1NMIFRFU1RJTkcxFDASBgNVBAMTC2V4YW1wbGUuY29tMIGfMA0GCSqGSIb3
140 DQEBAQUAA4GNADCBiQKBgQDD0U0ZYgqShJ7oOjsyNKyVXEHqeafmk/bAoPqY/h1c
141 oPw2E8KmeqiUSoTPjG5IXSblOxcqpbAXgnjPzo8DI3GNMhAf8SYNYsoH7gc7Uy7j
142 5x8bUrisGnuTHqkqH6d4/e7ETJ7i3CpR8bvK16DggEvQTudLipz8FBHtYhFakfdh
143 TwIDAQABo3cwdTAOBgNVHQ8BAf8EBAMCBaAwHQYDVR0lBBYwFAYIKwYBBQUHAwEG
144 CCsGAQUFBwMCMAwGA1UdEwEB/wQCMAAwGQYDVR0OBBIEEKN5pvbur7mlXjeMEYA0
145 4nUwGwYDVR0jBBQwEoAQjBpoqLV2211Xex+NFLIGozANBgkqhkiG9w0BAQsFAAOB
146 gQBj/p+JChp//LnXWC1k121LM/ii7hFzQzMrt70bny406SGz9jAjaPOX4S3gt38y
147 rhjpPukBlSzgQXFg66y6q5qp1nQTD1Cw6NkKBe9WuBlY3iYfmsf7WT8nhlT1CttU
148 xNCwyMX9mtdXdQicOfNjIGUCD5OLV5PgHFPRKiHHioBAhg==
149 -----END CERTIFICATE-----
150 )";
151 
152 static const char kLeafNoKeyUsagePEM[] = R"(
153 -----BEGIN CERTIFICATE-----
154 MIICNTCCAZ6gAwIBAgIJAIFQGaLQ0G2mMA0GCSqGSIb3DQEBCwUAMDYxGjAYBgNV
155 BAoTEUJvcmluZ1NTTCBURVNUSU5HMRgwFgYDVQQDEw9JbnRlcm1lZGlhdGUgQ0Ew
156 IBcNMTUwMTAxMDAwMDAwWhgPMjEwMDAxMDEwMDAwMDBaMDcxGjAYBgNVBAoTEUJv
157 cmluZ1NTTCBURVNUSU5HMRkwFwYDVQQDExBldmlsLmV4YW1wbGUuY29tMIGfMA0G
158 CSqGSIb3DQEBAQUAA4GNADCBiQKBgQDOKoZe75NPz77EOaMMl4/0s3PyQw++zJvp
159 ejHAxZiTPCJgMbEHLrSzNoHdopg+CLUH5bE4wTXM8w9Inv5P8OAFJt7gJuPUunmk
160 j+NoU3QfzOR6BroePcz1vXX9jyVHRs087M/sLqWRHu9IR+/A+UTcBaWaFiDVUxtJ
161 YOwFMwjNPQIDAQABo0gwRjAMBgNVHRMBAf8EAjAAMBkGA1UdDgQSBBBJfLEUWHq1
162 27rZ1AVx2J5GMBsGA1UdIwQUMBKAEIwaaKi1dttdV3sfjRSyBqMwDQYJKoZIhvcN
163 AQELBQADgYEALVKN2Y3LZJOtu6SxFIYKxbLaXhTGTdIjxipZhmbBRDFjbZjZZOTe
164 6Oo+VDNPYco4rBexK7umYXJyfTqoY0E8dbiImhTcGTEj7OAB3DbBomgU1AYe+t2D
165 uwBqh4Y3Eto+Zn4pMVsxGEfUpjzjZDel7bN1/oU/9KWPpDfywfUmjgk=
166 -----END CERTIFICATE-----
167 )";
168 
169 static const char kForgeryPEM[] = R"(
170 -----BEGIN CERTIFICATE-----
171 MIICZzCCAdCgAwIBAgIIdTlMzQoKkeMwDQYJKoZIhvcNAQELBQAwNzEaMBgGA1UE
172 ChMRQm9yaW5nU1NMIFRFU1RJTkcxGTAXBgNVBAMTEGV2aWwuZXhhbXBsZS5jb20w
173 IBcNMTUwMTAxMDAwMDAwWhgPMjEwMDAxMDEwMDAwMDBaMDoxGjAYBgNVBAoTEUJv
174 cmluZ1NTTCBURVNUSU5HMRwwGgYDVQQDExNmb3JnZXJ5LmV4YW1wbGUuY29tMIGf
175 MA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDADTwruBQZGb7Ay6s9HiYv5d1lwtEy
176 xQdA2Sy8Rn8uA20Q4KgqwVY7wzIZ+z5Butrsmwb70gdG1XU+yRaDeE7XVoW6jSpm
177 0sw35/5vJbTcL4THEFbnX0OPZnvpuZDFUkvVtq5kxpDWsVyM24G8EEq7kPih3Sa3
178 OMhXVXF8kso6UQIDAQABo3cwdTAOBgNVHQ8BAf8EBAMCBaAwHQYDVR0lBBYwFAYI
179 KwYBBQUHAwEGCCsGAQUFBwMCMAwGA1UdEwEB/wQCMAAwGQYDVR0OBBIEEEYJ/WHM
180 8p64erPWIg4/liwwGwYDVR0jBBQwEoAQSXyxFFh6tdu62dQFcdieRjANBgkqhkiG
181 9w0BAQsFAAOBgQA+zH7bHPElWRWJvjxDqRexmYLn+D3Aivs8XgXQJsM94W0EzSUf
182 DSLfRgaQwcb2gg2xpDFoG+W0vc6O651uF23WGt5JaFFJJxqjII05IexfCNhuPmp4
183 4UZAXPttuJXpn74IY1tuouaM06B3vXKZR+/ityKmfJvSwxacmFcK+2ziAg==
184 -----END CERTIFICATE-----
185 )";
186 
187 // kExamplePSSCert is an example RSA-PSS self-signed certificate, signed with
188 // the default hash functions.
189 static const char kExamplePSSCert[] = R"(
190 -----BEGIN CERTIFICATE-----
191 MIICYjCCAcagAwIBAgIJAI3qUyT6SIfzMBIGCSqGSIb3DQEBCjAFogMCAWowRTEL
192 MAkGA1UEBhMCQVUxEzARBgNVBAgMClNvbWUtU3RhdGUxITAfBgNVBAoMGEludGVy
193 bmV0IFdpZGdpdHMgUHR5IEx0ZDAeFw0xNDEwMDkxOTA5NTVaFw0xNTEwMDkxOTA5
194 NTVaMEUxCzAJBgNVBAYTAkFVMRMwEQYDVQQIDApTb21lLVN0YXRlMSEwHwYDVQQK
195 DBhJbnRlcm5ldCBXaWRnaXRzIFB0eSBMdGQwgZ8wDQYJKoZIhvcNAQEBBQADgY0A
196 MIGJAoGBAPi4bIO0vNmoV8CltFl2jFQdeesiUgR+0zfrQf2D+fCmhRU0dXFahKg8
197 0u9aTtPel4rd/7vPCqqGkr64UOTNb4AzMHYTj8p73OxaymPHAyXvqIqDWHYg+hZ3
198 13mSYwFIGth7Z/FSVUlO1m5KXNd6NzYM3t2PROjCpywrta9kS2EHAgMBAAGjUDBO
199 MB0GA1UdDgQWBBTQQfuJQR6nrVrsNF1JEflVgXgfEzAfBgNVHSMEGDAWgBTQQfuJ
200 QR6nrVrsNF1JEflVgXgfEzAMBgNVHRMEBTADAQH/MBIGCSqGSIb3DQEBCjAFogMC
201 AWoDgYEASUy2RZcgNbNQZA0/7F+V1YTLEXwD16bm+iSVnzGwtexmQVEYIZG74K/w
202 xbdZQdTbpNJkp1QPjPfh0zsatw6dmt5QoZ8K8No0DjR9dgf+Wvv5WJvJUIQBoAVN
203 Z0IL+OQFz6+LcTHxD27JJCebrATXZA0wThGTQDm7crL+a+SujBY=
204 -----END CERTIFICATE-----
205 )";
206 
207 // kBadPSSCertPEM is a self-signed RSA-PSS certificate with bad parameters.
208 static const char kBadPSSCertPEM[] = R"(
209 -----BEGIN CERTIFICATE-----
210 MIIDdjCCAjqgAwIBAgIJANcwZLyfEv7DMD4GCSqGSIb3DQEBCjAxoA0wCwYJYIZI
211 AWUDBAIBoRowGAYJKoZIhvcNAQEIMAsGCWCGSAFlAwQCAaIEAgIA3jAnMSUwIwYD
212 VQQDDBxUZXN0IEludmFsaWQgUFNTIGNlcnRpZmljYXRlMB4XDTE1MTEwNDE2MDIz
213 NVoXDTE1MTIwNDE2MDIzNVowJzElMCMGA1UEAwwcVGVzdCBJbnZhbGlkIFBTUyBj
214 ZXJ0aWZpY2F0ZTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAMTaM7WH
215 qVCAGAIA+zL1KWvvASTrhlq+1ePdO7wsrWX2KiYoTYrJYTnxhLnn0wrHqApt79nL
216 IBG7cfShyZqFHOY/IzlYPMVt+gPo293gw96Fds5JBsjhjkyGnOyr9OUntFqvxDbT
217 IIFU7o9IdxD4edaqjRv+fegVE+B79pDk4s0ujsk6dULtCg9Rst0ucGFo19mr+b7k
218 dbfn8pZ72ZNDJPueVdrUAWw9oll61UcYfk75XdrLk6JlL41GrYHc8KlfXf43gGQq
219 QfrpHkg4Ih2cI6Wt2nhFGAzrlcorzLliQIUJRIhM8h4IgDfpBpaPdVQLqS2pFbXa
220 5eQjqiyJwak2vJ8CAwEAAaNQME4wHQYDVR0OBBYEFCt180N4oGUt5LbzBwQ4Ia+2
221 4V97MB8GA1UdIwQYMBaAFCt180N4oGUt5LbzBwQ4Ia+24V97MAwGA1UdEwQFMAMB
222 Af8wMQYJKoZIhvcNAQEKMCSgDTALBglghkgBZQMEAgGhDTALBgkqhkiG9w0BAQii
223 BAICAN4DggEBAAjBtm90lGxgddjc4Xu/nbXXFHVs2zVcHv/mqOZoQkGB9r/BVgLb
224 xhHrFZ2pHGElbUYPfifdS9ztB73e1d4J+P29o0yBqfd4/wGAc/JA8qgn6AAEO/Xn
225 plhFeTRJQtLZVl75CkHXgUGUd3h+ADvKtcBuW9dSUncaUrgNKR8u/h/2sMG38RWY
226 DzBddC/66YTa3r7KkVUfW7yqRQfELiGKdcm+bjlTEMsvS+EhHup9CzbpoCx2Fx9p
227 NPtFY3yEObQhmL1JyoCRWqBE75GzFPbRaiux5UpEkns+i3trkGssZzsOuVqHNTNZ
228 lC9+9hPHIoc9UMmAQNo1vGIW3NWVoeGbaJ8=
229 -----END CERTIFICATE-----
230 )";
231 
232 static const char kRSAKey[] = R"(
233 -----BEGIN RSA PRIVATE KEY-----
234 MIICXgIBAAKBgQDYK8imMuRi/03z0K1Zi0WnvfFHvwlYeyK9Na6XJYaUoIDAtB92
235 kWdGMdAQhLciHnAjkXLI6W15OoV3gA/ElRZ1xUpxTMhjP6PyY5wqT5r6y8FxbiiF
236 KKAnHmUcrgfVW28tQ+0rkLGMryRtrukXOgXBv7gcrmU7G1jC2a7WqmeI8QIDAQAB
237 AoGBAIBy09Fd4DOq/Ijp8HeKuCMKTHqTW1xGHshLQ6jwVV2vWZIn9aIgmDsvkjCe
238 i6ssZvnbjVcwzSoByhjN8ZCf/i15HECWDFFh6gt0P5z0MnChwzZmvatV/FXCT0j+
239 WmGNB/gkehKjGXLLcjTb6dRYVJSCZhVuOLLcbWIV10gggJQBAkEA8S8sGe4ezyyZ
240 m4e9r95g6s43kPqtj5rewTsUxt+2n4eVodD+ZUlCULWVNAFLkYRTBCASlSrm9Xhj
241 QpmWAHJUkQJBAOVzQdFUaewLtdOJoPCtpYoY1zd22eae8TQEmpGOR11L6kbxLQsk
242 aMly/DOnOaa82tqAGTdqDEZgSNmCeKKknmECQAvpnY8GUOVAubGR6c+W90iBuQLj
243 LtFp/9ihd2w/PoDwrHZaoUYVcT4VSfJQog/k7kjE4MYXYWL8eEKg3WTWQNECQQDk
244 104Wi91Umd1PzF0ijd2jXOERJU1wEKe6XLkYYNHWQAe5l4J4MWj9OdxFXAxIuuR/
245 tfDwbqkta4xcux67//khAkEAvvRXLHTaa6VFzTaiiO8SaFsHV3lQyXOtMrBpB5jd
246 moZWgjHvB2W9Ckn7sDqsPB+U2tyX0joDdQEyuiMECDY8oQ==
247 -----END RSA PRIVATE KEY-----
248 )";
249 
250 static const char kP256Key[] = R"(
251 -----BEGIN PRIVATE KEY-----
252 MIGHAgEAMBMGByqGSM49AgEGCCqGSM49AwEHBG0wawIBAQQgBw8IcnrUoEqc3VnJ
253 TYlodwi1b8ldMHcO6NHJzgqLtGqhRANCAATmK2niv2Wfl74vHg2UikzVl2u3qR4N
254 Rvvdqakendy6WgHn1peoChj5w8SjHlbifINI2xYaHPUdfvGULUvPciLB
255 -----END PRIVATE KEY-----
256 )";
257 
258 // kCRLTestRoot is a test root certificate. It has private key:
259 //
260 // -----BEGIN RSA PRIVATE KEY-----
261 // MIIEpAIBAAKCAQEAo16WiLWZuaymsD8n5SKPmxV1y6jjgr3BS/dUBpbrzd1aeFzN
262 // lI8l2jfAnzUyp+I21RQ+nh/MhqjGElkTtK9xMn1Y+S9GMRh+5R/Du0iCb1tCZIPY
263 // 07Tgrb0KMNWe0v2QKVVruuYSgxIWodBfxlKO64Z8AJ5IbnWpuRqO6rctN9qUoMlT
264 // IAB6dL4G0tDJ/PGFWOJYwOMEIX54bly2wgyYJVBKiRRt4f7n8H922qmvPNA9idmX
265 // 9G1VAtgV6x97XXi7ULORIQvn9lVQF6nTYDBJhyuPB+mLThbLP2o9orxGx7aCtnnB
266 // ZUIxUvHNOI0FaSaZH7Fi0xsZ/GkG2HZe7ImPJwIDAQABAoIBAQCJF9MTHfHGkk+/
267 // DwCXlA0Wg0e6hBuHl10iNobYkMWIl/xXjOknhYiqOqb181py76472SVC5ERprC+r
268 // Lf0PXzqKuA117mnkwT2bYLCL9Skf8WEhoFLQNbVlloF6wYjqXcYgKYKh8HgQbZl4
269 // aLg2YQl2NADTNABsUWj/4H2WEelsODVviqfFs725lFg9KHDI8zxAZXLzDt/M9uVL
270 // GxJiX12tr0AwaeAFZ1oPM/y+LznM3N3+Ht3jHHw3jZ/u8Z1RdAmdpu3bZ6tbwGBr
271 // 9edsH5rKkm9aBvMrY7eX5VHqaqyRNFyG152ZOJh4XiiFG7EmgTPCpaHo50Y018Re
272 // grVtk+FBAoGBANY3lY+V8ZOwMxSHes+kTnoimHO5Ob7nxrOC71i27x+4HHsYUeAr
273 // /zOOghiDIn+oNkuiX5CIOWZKx159Bp65CPpCbTb/fh+HYnSgXFgCw7XptycO7LXM
274 // 5GwR5jSfpfzBFdYxjxoUzDMFBwTEYRTm0HkUHkH+s+ajjw5wqqbcGLcfAoGBAMM8
275 // DKW6Tb66xsf708f0jonAjKYTLZ+WOcwsBEWSFHoY8dUjvW5gqx5acHTEsc5ZTeh4
276 // BCFLa+Mn9cuJWVJNs09k7Xb2PNl92HQ4GN2vbdkJhExbkT6oLDHg1hVD0w8KLfz1
277 // lTAW6pS+6CdOHMEJpvqx89EgU/1GgIQ1fXYczE75AoGAKeJoXdDFkUjsU+FBhAPu
278 // TDcjc80Nm2QaF9NMFR5/lsYa236f06MGnQAKM9zADBHJu/Qdl1brUjLg1HrBppsr
279 // RDNkw1IlSOjhuUf5hkPUHGd8Jijm440SRIcjabqla8wdBupdvo2+d2NOQgJbsQiI
280 // ToQ+fkzcxAXK3Nnuo/1436UCgYBjLH7UNOZHS8OsVM0I1r8NVKVdu4JCfeJQR8/H
281 // s2P5ffBir+wLRMnH+nMDreMQiibcPxMCArkERAlE4jlgaJ38Z62E76KLbLTmnJRt
282 // EC9Bv+bXjvAiHvWMRMUbOj/ddPNVez7Uld+FvdBaHwDWQlvzHzBWfBCOKSEhh7Z6
283 // qDhUqQKBgQDPMDx2i5rfmQp3imV9xUcCkIRsyYQVf8Eo7NV07IdUy/otmksgn4Zt
284 // Lbf3v2dvxOpTNTONWjp2c+iUQo8QxJCZr5Sfb21oQ9Ktcrmc/CY7LeBVDibXwxdM
285 // vRG8kBzvslFWh7REzC3u06GSVhyKDfW93kN2cKVwGoahRlhj7oHuZQ==
286 // -----END RSA PRIVATE KEY-----
287 static const char kCRLTestRoot[] = R"(
288 -----BEGIN CERTIFICATE-----
289 MIIDbzCCAlegAwIBAgIJAODri7v0dDUFMA0GCSqGSIb3DQEBCwUAME4xCzAJBgNV
290 BAYTAlVTMRMwEQYDVQQIDApDYWxpZm9ybmlhMRYwFAYDVQQHDA1Nb3VudGFpbiBW
291 aWV3MRIwEAYDVQQKDAlCb3JpbmdTU0wwHhcNMTYwOTI2MTUwNjI2WhcNMjYwOTI0
292 MTUwNjI2WjBOMQswCQYDVQQGEwJVUzETMBEGA1UECAwKQ2FsaWZvcm5pYTEWMBQG
293 A1UEBwwNTW91bnRhaW4gVmlldzESMBAGA1UECgwJQm9yaW5nU1NMMIIBIjANBgkq
294 hkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAo16WiLWZuaymsD8n5SKPmxV1y6jjgr3B
295 S/dUBpbrzd1aeFzNlI8l2jfAnzUyp+I21RQ+nh/MhqjGElkTtK9xMn1Y+S9GMRh+
296 5R/Du0iCb1tCZIPY07Tgrb0KMNWe0v2QKVVruuYSgxIWodBfxlKO64Z8AJ5IbnWp
297 uRqO6rctN9qUoMlTIAB6dL4G0tDJ/PGFWOJYwOMEIX54bly2wgyYJVBKiRRt4f7n
298 8H922qmvPNA9idmX9G1VAtgV6x97XXi7ULORIQvn9lVQF6nTYDBJhyuPB+mLThbL
299 P2o9orxGx7aCtnnBZUIxUvHNOI0FaSaZH7Fi0xsZ/GkG2HZe7ImPJwIDAQABo1Aw
300 TjAdBgNVHQ4EFgQUWPt3N5cZ/CRvubbrkqfBnAqhq94wHwYDVR0jBBgwFoAUWPt3
301 N5cZ/CRvubbrkqfBnAqhq94wDAYDVR0TBAUwAwEB/zANBgkqhkiG9w0BAQsFAAOC
302 AQEAORu6M0MOwXy+3VEBwNilfTxyqDfruQsc1jA4PT8Oe8zora1WxE1JB4q2FJOz
303 EAuM3H/NXvEnBuN+ITvKZAJUfm4NKX97qmjMJwLKWe1gVv+VQTr63aR7mgWJReQN
304 XdMztlVeZs2dppV6uEg3ia1X0G7LARxGpA9ETbMyCpb39XxlYuTClcbA5ftDN99B
305 3Xg9KNdd++Ew22O3HWRDvdDpTO/JkzQfzi3sYwUtzMEonENhczJhGf7bQMmvL/w5
306 24Wxj4Z7KzzWIHsNqE/RIs6RV3fcW61j/mRgW2XyoWnMVeBzvcJr9NXp4VQYmFPw
307 amd8GKMZQvP0ufGnUn7D7uartA==
308 -----END CERTIFICATE-----
309 )";
310 
311 static const char kCRLTestLeaf[] = R"(
312 -----BEGIN CERTIFICATE-----
313 MIIDkDCCAnigAwIBAgICEAAwDQYJKoZIhvcNAQELBQAwTjELMAkGA1UEBhMCVVMx
314 EzARBgNVBAgMCkNhbGlmb3JuaWExFjAUBgNVBAcMDU1vdW50YWluIFZpZXcxEjAQ
315 BgNVBAoMCUJvcmluZ1NTTDAeFw0xNjA5MjYxNTA4MzFaFw0xNzA5MjYxNTA4MzFa
316 MEsxCzAJBgNVBAYTAlVTMRMwEQYDVQQIDApDYWxpZm9ybmlhMRIwEAYDVQQKDAlC
317 b3JpbmdTU0wxEzARBgNVBAMMCmJvcmluZy5zc2wwggEiMA0GCSqGSIb3DQEBAQUA
318 A4IBDwAwggEKAoIBAQDc5v1S1M0W+QWM+raWfO0LH8uvqEwuJQgODqMaGnSlWUx9
319 8iQcnWfjyPja3lWg9K62hSOFDuSyEkysKHDxijz5R93CfLcfnVXjWQDJe7EJTTDP
320 ozEvxN6RjAeYv7CF000euYr3QT5iyBjg76+bon1p0jHZBJeNPP1KqGYgyxp+hzpx
321 e0gZmTlGAXd8JQK4v8kpdYwD6PPifFL/jpmQpqOtQmH/6zcLjY4ojmqpEdBqIKIX
322 +saA29hMq0+NK3K+wgg31RU+cVWxu3tLOIiesETkeDgArjWRS1Vkzbi4v9SJxtNu
323 OZuAxWiynRJw3JwH/OFHYZIvQqz68ZBoj96cepjPAgMBAAGjezB5MAkGA1UdEwQC
324 MAAwLAYJYIZIAYb4QgENBB8WHU9wZW5TU0wgR2VuZXJhdGVkIENlcnRpZmljYXRl
325 MB0GA1UdDgQWBBTGn0OVVh/aoYt0bvEKG+PIERqnDzAfBgNVHSMEGDAWgBRY+3c3
326 lxn8JG+5tuuSp8GcCqGr3jANBgkqhkiG9w0BAQsFAAOCAQEAd2nM8gCQN2Dc8QJw
327 XSZXyuI3DBGGCHcay/3iXu0JvTC3EiQo8J6Djv7WLI0N5KH8mkm40u89fJAB2lLZ
328 ShuHVtcC182bOKnePgwp9CNwQ21p0rDEu/P3X46ZvFgdxx82E9xLa0tBB8PiPDWh
329 lV16jbaKTgX5AZqjnsyjR5o9/mbZVupZJXx5Syq+XA8qiJfstSYJs4KyKK9UOjql
330 ICkJVKpi2ahDBqX4MOH4SLfzVk8pqSpviS6yaA1RXqjpkxiN45WWaXDldVHMSkhC
331 5CNXsXi4b1nAntu89crwSLA3rEwzCWeYj+BX7e1T9rr3oJdwOU/2KQtW1js1yQUG
332 tjJMFw==
333 -----END CERTIFICATE-----
334 )";
335 
336 static const char kBasicCRL[] = R"(
337 -----BEGIN X509 CRL-----
338 MIIBpzCBkAIBATANBgkqhkiG9w0BAQsFADBOMQswCQYDVQQGEwJVUzETMBEGA1UE
339 CAwKQ2FsaWZvcm5pYTEWMBQGA1UEBwwNTW91bnRhaW4gVmlldzESMBAGA1UECgwJ
340 Qm9yaW5nU1NMFw0xNjA5MjYxNTEwNTVaFw0xNjEwMjYxNTEwNTVaoA4wDDAKBgNV
341 HRQEAwIBATANBgkqhkiG9w0BAQsFAAOCAQEAnrBKKgvd9x9zwK9rtUvVeFeJ7+LN
342 ZEAc+a5oxpPNEsJx6hXoApYEbzXMxuWBQoCs5iEBycSGudct21L+MVf27M38KrWo
343 eOkq0a2siqViQZO2Fb/SUFR0k9zb8xl86Zf65lgPplALun0bV/HT7MJcl04Tc4os
344 dsAReBs5nqTGNEd5AlC1iKHvQZkM//MD51DspKnDpsDiUVi54h9C1SpfZmX8H2Vv
345 diyu0fZ/bPAM3VAGawatf/SyWfBMyKpoPXEG39oAzmjjOj8en82psn7m474IGaho
346 /vBbhl1ms5qQiLYPjm4YELtnXQoFyC72tBjbdFd/ZE9k4CNKDbxFUXFbkw==
347 -----END X509 CRL-----
348 )";
349 
350 static const char kRevokedCRL[] = R"(
351 -----BEGIN X509 CRL-----
352 MIIBvjCBpwIBATANBgkqhkiG9w0BAQsFADBOMQswCQYDVQQGEwJVUzETMBEGA1UE
353 CAwKQ2FsaWZvcm5pYTEWMBQGA1UEBwwNTW91bnRhaW4gVmlldzESMBAGA1UECgwJ
354 Qm9yaW5nU1NMFw0xNjA5MjYxNTEyNDRaFw0xNjEwMjYxNTEyNDRaMBUwEwICEAAX
355 DTE2MDkyNjE1MTIyNlqgDjAMMAoGA1UdFAQDAgECMA0GCSqGSIb3DQEBCwUAA4IB
356 AQCUGaM4DcWzlQKrcZvI8TMeR8BpsvQeo5BoI/XZu2a8h//PyRyMwYeaOM+3zl0d
357 sjgCT8b3C1FPgT+P2Lkowv7rJ+FHJRNQkogr+RuqCSPTq65ha4WKlRGWkMFybzVH
358 NloxC+aU3lgp/NlX9yUtfqYmJek1CDrOOGPrAEAwj1l/BUeYKNGqfBWYJQtPJu+5
359 OaSvIYGpETCZJscUWODmLEb/O3DM438vLvxonwGqXqS0KX37+CHpUlyhnSovxXxp
360 Pz4aF+L7OtczxL0GYtD2fR9B7TDMqsNmHXgQrixvvOY7MUdLGbd4RfJL3yA53hyO
361 xzfKY2TzxLiOmctG0hXFkH5J
362 -----END X509 CRL-----
363 )";
364 
365 static const char kBadIssuerCRL[] = R"(
366 -----BEGIN X509 CRL-----
367 MIIBwjCBqwIBATANBgkqhkiG9w0BAQsFADBSMQswCQYDVQQGEwJVUzETMBEGA1UE
368 CAwKQ2FsaWZvcm5pYTEWMBQGA1UEBwwNTW91bnRhaW4gVmlldzEWMBQGA1UECgwN
369 Tm90IEJvcmluZ1NTTBcNMTYwOTI2MTUxMjQ0WhcNMTYxMDI2MTUxMjQ0WjAVMBMC
370 AhAAFw0xNjA5MjYxNTEyMjZaoA4wDDAKBgNVHRQEAwIBAjANBgkqhkiG9w0BAQsF
371 AAOCAQEAlBmjOA3Fs5UCq3GbyPEzHkfAabL0HqOQaCP12btmvIf/z8kcjMGHmjjP
372 t85dHbI4Ak/G9wtRT4E/j9i5KML+6yfhRyUTUJKIK/kbqgkj06uuYWuFipURlpDB
373 cm81RzZaMQvmlN5YKfzZV/clLX6mJiXpNQg6zjhj6wBAMI9ZfwVHmCjRqnwVmCUL
374 TybvuTmkryGBqREwmSbHFFjg5ixG/ztwzON/Ly78aJ8Bql6ktCl9+/gh6VJcoZ0q
375 L8V8aT8+Ghfi+zrXM8S9BmLQ9n0fQe0wzKrDZh14EK4sb7zmOzFHSxm3eEXyS98g
376 Od4cjsc3ymNk88S4jpnLRtIVxZB+SQ==
377 -----END X509 CRL-----
378 )";
379 
380 // kKnownCriticalCRL is kBasicCRL but with a critical issuing distribution point
381 // extension.
382 static const char kKnownCriticalCRL[] = R"(
383 -----BEGIN X509 CRL-----
384 MIIBuDCBoQIBATANBgkqhkiG9w0BAQsFADBOMQswCQYDVQQGEwJVUzETMBEGA1UE
385 CAwKQ2FsaWZvcm5pYTEWMBQGA1UEBwwNTW91bnRhaW4gVmlldzESMBAGA1UECgwJ
386 Qm9yaW5nU1NMFw0xNjA5MjYxNTEwNTVaFw0xNjEwMjYxNTEwNTVaoB8wHTAKBgNV
387 HRQEAwIBATAPBgNVHRwBAf8EBTADgQH/MA0GCSqGSIb3DQEBCwUAA4IBAQAs37Jq
388 3Htcehm6C2PKXOHekwTqTLOPWsYHfF68kYhdzcopDZBeoKE7jLRkRRGFDaR/tfUs
389 kwLSDNSQ8EwPb9PT1X8kmFn9QmJgWD6f6BzaH5ZZ9iBUwOcvrydlb/jnjdIZHQxs
390 fKOAceW5XX3f7DANC3qwYLsQZR/APkfV8nXjPYVUz1kKj04uq/BbQviInjyUYixN
391 xDx+GDWVVXccehcwAu983kAqP+JDaVQPBVksLuBXz2adrEWwvbLCnZeL3zH1IY9h
392 6MFO6echpvGbU/H+dRX9UkhdJ7gdwKVD3RjfJl+DRVox9lz8Pbo5H699Tkv9/DQP
393 9dMWxqhQlv23osLp
394 -----END X509 CRL-----
395 )";
396 
397 // kUnknownCriticalCRL is kBasicCRL but with an unknown critical extension.
398 static const char kUnknownCriticalCRL[] = R"(
399 -----BEGIN X509 CRL-----
400 MIIBvDCBpQIBATANBgkqhkiG9w0BAQsFADBOMQswCQYDVQQGEwJVUzETMBEGA1UE
401 CAwKQ2FsaWZvcm5pYTEWMBQGA1UEBwwNTW91bnRhaW4gVmlldzESMBAGA1UECgwJ
402 Qm9yaW5nU1NMFw0xNjA5MjYxNTEwNTVaFw0xNjEwMjYxNTEwNTVaoCMwITAKBgNV
403 HRQEAwIBATATBgwqhkiG9xIEAYS3CQABAf8EADANBgkqhkiG9w0BAQsFAAOCAQEA
404 GvBP0xqL509InMj/3493YVRV+ldTpBv5uTD6jewzf5XdaxEQ/VjTNe5zKnxbpAib
405 Kf7cwX0PMSkZjx7k7kKdDlEucwVvDoqC+O9aJcqVmM6GDyNb9xENxd0XCXja6MZC
406 yVgP4AwLauB2vSiEprYJyI1APph3iAEeDm60lTXX/wBM/tupQDDujKh2GPyvBRfJ
407 +wEDwGg3ICwvu4gO4zeC5qnFR+bpL9t5tOMAQnVZ0NWv+k7mkd2LbHdD44dxrfXC
408 nhtfERx99SDmC/jtUAJrGhtCO8acr7exCeYcduN7KKCm91OeCJKK6OzWst0Og1DB
409 kwzzU2rL3G65CrZ7H0SZsQ==
410 -----END X509 CRL-----
411 )";
412 
413 // kUnknownCriticalCRL2 is kBasicCRL but with a critical issuing distribution
414 // point extension followed by an unknown critical extension
415 static const char kUnknownCriticalCRL2[] = R"(
416 -----BEGIN X509 CRL-----
417 MIIBzTCBtgIBATANBgkqhkiG9w0BAQsFADBOMQswCQYDVQQGEwJVUzETMBEGA1UE
418 CAwKQ2FsaWZvcm5pYTEWMBQGA1UEBwwNTW91bnRhaW4gVmlldzESMBAGA1UECgwJ
419 Qm9yaW5nU1NMFw0xNjA5MjYxNTEwNTVaFw0xNjEwMjYxNTEwNTVaoDQwMjAKBgNV
420 HRQEAwIBATAPBgNVHRwBAf8EBTADgQH/MBMGDCqGSIb3EgQBhLcJAAEB/wQAMA0G
421 CSqGSIb3DQEBCwUAA4IBAQBgSogsC5kf2wzr+0hmZtmLXYd0itAiYO0Gh9AyaEOO
422 myJFuqICHBSLXXUgwNkTUa2x2I/ivyReVFV756VOlWoaV2wJUs0zeCeVBgC9ZFsq
423 5a+8OGgXwgoYESFV5Y3QRF2a1Ytzfbw/o6xLXzTngvMsLOs12D4B5SkopyEZibF4
424 tXlRZyvEudTg3CCrjNP+p/GV07nZ3wcMmKJwQeilgzFUV7NaVCCo9jvPBGp0RxAN
425 KNif7jmjK4hD5mswo/Eq5kxQIc+mTfuUFdgHuAu1hfLYe0YK+Hr4RFf6Qy4hl7Ne
426 YjqkkSVIcr87u+8AznwdstnQzsyD27Jt7SjVORkYRywi
427 -----END X509 CRL-----
428 )";
429 
430 // kBadExtensionCRL is kBasicCRL but with an incorrectly-encoded issuing
431 // distribution point extension.
432 static const char kBadExtensionCRL[] = R"(
433 -----BEGIN X509 CRL-----
434 MIIBujCBowIBATANBgkqhkiG9w0BAQsFADBOMQswCQYDVQQGEwJVUzETMBEGA1UE
435 CAwKQ2FsaWZvcm5pYTEWMBQGA1UEBwwNTW91bnRhaW4gVmlldzESMBAGA1UECgwJ
436 Qm9yaW5nU1NMFw0xNjA5MjYxNTEwNTVaFw0xNjEwMjYxNTEwNTVaoCEwHzAKBgNV
437 HRQEAwIBATARBgNVHRwBAf8EBzAFoQMBAf8wDQYJKoZIhvcNAQELBQADggEBAA+3
438 i+5e5Ub8sccfgOBs6WVJFI9c8gvJjrJ8/dYfFIAuCyeocs7DFXn1n13CRZ+URR/Q
439 mVWgU28+xeusuSPYFpd9cyYTcVyNUGNTI3lwgcE/yVjPaOmzSZKdPakApRxtpKKQ
440 NN/56aQz3bnT/ZSHQNciRB8U6jiD9V30t0w+FDTpGaG+7bzzUH3UVF9xf9Ctp60A
441 3mfLe0scas7owSt4AEFuj2SPvcE7yvdOXbu+IEv21cEJUVExJAbhvIweHXh6yRW+
442 7VVeiNzdIjkZjyTmAzoXGha4+wbxXyBRbfH+XWcO/H+8nwyG8Gktdu2QB9S9nnIp
443 o/1TpfOMSGhMyMoyPrk=
444 -----END X509 CRL-----
445 )";
446 
447 // kAlgorithmMismatchCRL is kBasicCRL but with mismatched AlgorithmIdentifiers
448 // in the outer structure and signed portion. The signature reflects the signed
449 // portion.
450 static const char kAlgorithmMismatchCRL[] = R"(
451 -----BEGIN X509 CRL-----
452 MIIBpzCBkAIBATANBgkqhkiG9w0BAQsFADBOMQswCQYDVQQGEwJVUzETMBEGA1UE
453 CAwKQ2FsaWZvcm5pYTEWMBQGA1UEBwwNTW91bnRhaW4gVmlldzESMBAGA1UECgwJ
454 Qm9yaW5nU1NMFw0xNjA5MjYxNTEwNTVaFw0xNjEwMjYxNTEwNTVaoA4wDDAKBgNV
455 HRQEAwIBATANBgkqhkiG9w0BAQwFAAOCAQEAnrBKKgvd9x9zwK9rtUvVeFeJ7+LN
456 ZEAc+a5oxpPNEsJx6hXoApYEbzXMxuWBQoCs5iEBycSGudct21L+MVf27M38KrWo
457 eOkq0a2siqViQZO2Fb/SUFR0k9zb8xl86Zf65lgPplALun0bV/HT7MJcl04Tc4os
458 dsAReBs5nqTGNEd5AlC1iKHvQZkM//MD51DspKnDpsDiUVi54h9C1SpfZmX8H2Vv
459 diyu0fZ/bPAM3VAGawatf/SyWfBMyKpoPXEG39oAzmjjOj8en82psn7m474IGaho
460 /vBbhl1ms5qQiLYPjm4YELtnXQoFyC72tBjbdFd/ZE9k4CNKDbxFUXFbkw==
461 -----END X509 CRL-----
462 )";
463 
464 // kAlgorithmMismatchCRL2 is kBasicCRL but with mismatched AlgorithmIdentifiers
465 // in the outer structure and signed portion. The signature reflects the outer
466 // structure.
467 static const char kAlgorithmMismatchCRL2[] = R"(
468 -----BEGIN X509 CRL-----
469 MIIBpzCBkAIBATANBgkqhkiG9w0BAQwFADBOMQswCQYDVQQGEwJVUzETMBEGA1UE
470 CAwKQ2FsaWZvcm5pYTEWMBQGA1UEBwwNTW91bnRhaW4gVmlldzESMBAGA1UECgwJ
471 Qm9yaW5nU1NMFw0xNjA5MjYxNTEwNTVaFw0xNjEwMjYxNTEwNTVaoA4wDDAKBgNV
472 HRQEAwIBATANBgkqhkiG9w0BAQsFAAOCAQEAjCWtU7AK8nQ5TCFfzvbU04MWNuLp
473 iZfqapRSRyMta4pyRomK773rEmJmYOc/ZNeIphVOlupMgGC2wyv5Z/SD1mxccJbv
474 SlUWciwjskjgvyyU9KnJ5xPgf3e3Fl3G0u9yJEFd4mg6fRavs5pEDX56b0f+SkG+
475 Vl1FZU94Uylm2kCqk9fRpTxualPGP6dksj3Aitt4x2Vdni4sUfg9vIEEOx2jnisq
476 iLqpT94IdETCWAciE0dgbogdOOsNzMqSASfHM/XPigYLXpYgfaR8fca6OKDwFsVH
477 SrkFz8Se3F6mCHnbDzYElbmA46iKU2J12LTrso3Ewq/qHq0mebfp2z0y6g==
478 -----END X509 CRL-----
479 )";
480 
481 // kEd25519Cert is a self-signed Ed25519 certificate.
482 static const char kEd25519Cert[] = R"(
483 -----BEGIN CERTIFICATE-----
484 MIIBkTCCAUOgAwIBAgIJAJwooam0UCDmMAUGAytlcDBFMQswCQYDVQQGEwJBVTET
485 MBEGA1UECAwKU29tZS1TdGF0ZTEhMB8GA1UECgwYSW50ZXJuZXQgV2lkZ2l0cyBQ
486 dHkgTHRkMB4XDTE0MDQyMzIzMjE1N1oXDTE0MDUyMzIzMjE1N1owRTELMAkGA1UE
487 BhMCQVUxEzARBgNVBAgMClNvbWUtU3RhdGUxITAfBgNVBAoMGEludGVybmV0IFdp
488 ZGdpdHMgUHR5IEx0ZDAqMAUGAytlcAMhANdamAGCsQq31Uv+08lkBzoO4XLz2qYj
489 Ja8CGmj3B1Eao1AwTjAdBgNVHQ4EFgQUoux7eV+fJK2v3ah6QPU/lj1/+7UwHwYD
490 VR0jBBgwFoAUoux7eV+fJK2v3ah6QPU/lj1/+7UwDAYDVR0TBAUwAwEB/zAFBgMr
491 ZXADQQBuCzqji8VP9xU8mHEMjXGChX7YP5J664UyVKHKH9Z1u4wEbB8dJ3ScaWSL
492 r+VHVKUhsrvcdCelnXRrrSD7xWAL
493 -----END CERTIFICATE-----
494 )";
495 
496 // kEd25519CertNull is an invalid self-signed Ed25519 with an explicit NULL in
497 // the signature algorithm.
498 static const char kEd25519CertNull[] = R"(
499 -----BEGIN CERTIFICATE-----
500 MIIBlTCCAUWgAwIBAgIJAJwooam0UCDmMAcGAytlcAUAMEUxCzAJBgNVBAYTAkFV
501 MRMwEQYDVQQIDApTb21lLVN0YXRlMSEwHwYDVQQKDBhJbnRlcm5ldCBXaWRnaXRz
502 IFB0eSBMdGQwHhcNMTQwNDIzMjMyMTU3WhcNMTQwNTIzMjMyMTU3WjBFMQswCQYD
503 VQQGEwJBVTETMBEGA1UECAwKU29tZS1TdGF0ZTEhMB8GA1UECgwYSW50ZXJuZXQg
504 V2lkZ2l0cyBQdHkgTHRkMCowBQYDK2VwAyEA11qYAYKxCrfVS/7TyWQHOg7hcvPa
505 piMlrwIaaPcHURqjUDBOMB0GA1UdDgQWBBSi7Ht5X58kra/dqHpA9T+WPX/7tTAf
506 BgNVHSMEGDAWgBSi7Ht5X58kra/dqHpA9T+WPX/7tTAMBgNVHRMEBTADAQH/MAcG
507 AytlcAUAA0EA70uefNocdJohkKPNROKVyBuBD3LXMyvmdTklsaxSRY3PcZdOohlr
508 recgVPpVS7B+d9g4EwtZXIh4lodTBDHBBw==
509 -----END CERTIFICATE-----
510 )";
511 
512 // kX25519 is the example X25519 certificate from
513 // https://tools.ietf.org/html/rfc8410#section-10.2
514 static const char kX25519Cert[] = R"(
515 -----BEGIN CERTIFICATE-----
516 MIIBLDCB36ADAgECAghWAUdKKo3DMDAFBgMrZXAwGTEXMBUGA1UEAwwOSUVURiBUZX
517 N0IERlbW8wHhcNMTYwODAxMTIxOTI0WhcNNDAxMjMxMjM1OTU5WjAZMRcwFQYDVQQD
518 DA5JRVRGIFRlc3QgRGVtbzAqMAUGAytlbgMhAIUg8AmJMKdUdIt93LQ+91oNvzoNJj
519 ga9OukqY6qm05qo0UwQzAPBgNVHRMBAf8EBTADAQEAMA4GA1UdDwEBAAQEAwIDCDAg
520 BgNVHQ4BAQAEFgQUmx9e7e0EM4Xk97xiPFl1uQvIuzswBQYDK2VwA0EAryMB/t3J5v
521 /BzKc9dNZIpDmAgs3babFOTQbs+BolzlDUwsPrdGxO3YNGhW7Ibz3OGhhlxXrCe1Cg
522 w1AH9efZBw==
523 -----END CERTIFICATE-----
524 )";
525 
526 // kSANTypesLeaf is a leaf certificate (signed by |kSANTypesRoot|) which
527 // contains SANS for example.com, test@example.com, 127.0.0.1, and
528 // https://example.com/. (The latter is useless for now since crypto/x509
529 // doesn't deal with URI SANs directly.)
530 static const char kSANTypesLeaf[] = R"(
531 -----BEGIN CERTIFICATE-----
532 MIIClzCCAgCgAwIBAgIJAOjwnT/iW+qmMA0GCSqGSIb3DQEBCwUAMCsxFzAVBgNV
533 BAoTDkJvcmluZ1NTTCBUZXN0MRAwDgYDVQQDEwdSb290IENBMB4XDTE1MDEwMTAw
534 MDAwMFoXDTI1MDEwMTAwMDAwMFowLzEXMBUGA1UEChMOQm9yaW5nU1NMIFRlc3Qx
535 FDASBgNVBAMTC2V4YW1wbGUuY29tMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKB
536 gQDbRn2TLhInBki8Bighq37EtqJd/h5SRYh6NkelCA2SQlvCgcC+l3mYQPtPbRT9
537 KxOLwqUuZ9jUCZ7WIji3Sgt0cyvCNPHRk+WW2XR781ifbGE8wLBB1NkrKyQjd1sc
538 O711Xc4gVM+hY4cdHiTE8x0aUIuqthRD7ZendWL0FMhS1wIDAQABo4G+MIG7MA4G
539 A1UdDwEB/wQEAwIFoDAdBgNVHSUEFjAUBggrBgEFBQcDAQYIKwYBBQUHAwIwDAYD
540 VR0TAQH/BAIwADAZBgNVHQ4EEgQQn5EWH0NDPkmm3m22gNefYDAbBgNVHSMEFDAS
541 gBBAN9cB+0AvuBx+VAQnjFkBMEQGA1UdEQQ9MDuCC2V4YW1wbGUuY29tgRB0ZXN0
542 QGV4YW1wbGUuY29thwR/AAABhhRodHRwczovL2V4YW1wbGUuY29tLzANBgkqhkiG
543 9w0BAQsFAAOBgQBtwJvY6+Tk6D6DOtDVaNoJ5y8E25CCuE/Ga4OuIcYJas+yLckf
544 dZwUV3GUG2oBXl2MrpUFxXd4hKBO1CmlBY+hZEeIx0Yp6QWK9P/vnZeydOTP26mk
545 jusJ2PqSmtKNU1Zcaba4d29oFejmOAfeguhR8AHpsc/zHEaS5Q9cJsuJcw==
546 -----END CERTIFICATE-----
547 )";
548 
549 // -----BEGIN RSA PRIVATE KEY-----
550 // MIICWwIBAAKBgQDbRn2TLhInBki8Bighq37EtqJd/h5SRYh6NkelCA2SQlvCgcC+
551 // l3mYQPtPbRT9KxOLwqUuZ9jUCZ7WIji3Sgt0cyvCNPHRk+WW2XR781ifbGE8wLBB
552 // 1NkrKyQjd1scO711Xc4gVM+hY4cdHiTE8x0aUIuqthRD7ZendWL0FMhS1wIDAQAB
553 // AoGACwf7z0i1DxOI2zSwFimLghfyCSp8mgT3fbZ3Wj0SebYu6ZUffjceneM/AVrq
554 // gGYHYLOVHcWJqfkl7X3hPo9SDhzLx0mM545/q21ZWCwjhswH7WiCEqV2/zeDO9WU
555 // NIO1VU0VoLm0AQ7ZvwnyB+fpgF9kkkDtbBJW7XWrfNVtlnECQQD97YENpEJ3X1kj
556 // 3rrkrHWDkKAyoWWY1i8Fm7LnganC9Bv6AVwgn5ZlE/479aWHF8vbOFEA3pFPiNZJ
557 // t9FTCfpJAkEA3RCXjGI0Y6GALFLwEs+nL/XZAfJaIpJEZVLCVosYQOSaMS4SchfC
558 // GGYVquT7ZgKk9uvz89Fg87OtBMWS9lrkHwJADGkGLKeBhBoJ3kHtem2fVK3F1pOi
559 // xoR5SdnhNYVVyaxqjZ5xZTrHe+stOrr3uxGDqhQniVZXXb6/Ul0Egv1y2QJAVg/h
560 // kAujba4wIhFf2VLyOZ+yjil1ocPj0LZ5Zgvcs1bMGJ1hHP3W2HzVrqRaowoggui1
561 // HpTC891dXGA2qKYV7QJAFDmT2A7OVvh3y4AEgzVwHrDmCMwMHKjCIntS7fjxrJnF
562 // YvJUG1zoHwUVrxxbR3DbpTODlktLcl/0b97D0IkH3w==
563 // -----END RSA PRIVATE KEY-----
564 
565 static const char kSANTypesRoot[] = R"(
566 -----BEGIN CERTIFICATE-----
567 MIICTTCCAbagAwIBAgIIAj5CwoHlWuYwDQYJKoZIhvcNAQELBQAwKzEXMBUGA1UE
568 ChMOQm9yaW5nU1NMIFRlc3QxEDAOBgNVBAMTB1Jvb3QgQ0EwHhcNMTUwMTAxMDAw
569 MDAwWhcNMjUwMTAxMDAwMDAwWjArMRcwFQYDVQQKEw5Cb3JpbmdTU0wgVGVzdDEQ
570 MA4GA1UEAxMHUm9vdCBDQTCBnzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEA6Q5/
571 EQzmWuaGg3D2UQcuAngR9bIkkjjuJmICx5TxPqF3asCP1SJotl3iTNrghRE1wpJy
572 SY2BtIiXa7f8skRb2U0GcPkMxo/ps9+jaoRsQ1m+nbLQdpvD1/qZWcO45fNTA71J
573 1rPMokP+rcILuQG4VimUAySnDSghKamulFtK+Z8CAwEAAaN6MHgwDgYDVR0PAQH/
574 BAQDAgIEMB0GA1UdJQQWMBQGCCsGAQUFBwMBBggrBgEFBQcDAjAPBgNVHRMBAf8E
575 BTADAQH/MBkGA1UdDgQSBBBAN9cB+0AvuBx+VAQnjFkBMBsGA1UdIwQUMBKAEEA3
576 1wH7QC+4HH5UBCeMWQEwDQYJKoZIhvcNAQELBQADgYEAc4N6hTE62/3gwg+kyc2f
577 c/Jj1mHrOt+0NRaBnmvbmNpsEjHS96Ef4Wt/ZlPXPkkv1C1VosJnOIMF3Q522wRH
578 bqaxARldS12VAa3gcWisDWD+SqSyDxjyojz0XDiJkTrFuCTCUiZO+1GLB7SO10Ms
579 d5YVX0c90VMnUhF/dlrqS9U=
580 -----END CERTIFICATE-----
581 )";
582 
583 // -----BEGIN RSA PRIVATE KEY-----
584 // MIICXAIBAAKBgQDpDn8RDOZa5oaDcPZRBy4CeBH1siSSOO4mYgLHlPE+oXdqwI/V
585 // Imi2XeJM2uCFETXCknJJjYG0iJdrt/yyRFvZTQZw+QzGj+mz36NqhGxDWb6dstB2
586 // m8PX+plZw7jl81MDvUnWs8yiQ/6twgu5AbhWKZQDJKcNKCEpqa6UW0r5nwIDAQAB
587 // AoGALEF5daZqc+aEsp8X1yky3nsoheyPL0kqSBWii33IFemZgKcSaRnAoqjPWWLS
588 // 8dHj0I/4rej2MW8iuezVSpDak9tK5boHORC3w4p/wifkizQkLt1DANxTVbzcKvrt
589 // aZ7LjVaKkhjRJbLddniowFHkkWVbUccjvzcUd7Y2VuLbAhECQQDq4FE88aHio8zg
590 // bxSd0PwjEFwLYQTR19u812SoR8PmR6ofIL+pDwOV+fVs+OGcAAOgkhIukOrksQ4A
591 // 1cKtnyhXAkEA/gRI+u3tZ7UE1twIkBfZ6IvCdRodkPqHAYIxMRLzL+MhyZt4MEGc
592 // Ngb/F6U9/WOBFnoR/PI7IwE3ejutzKcL+QJBAKh+6eilk7QKPETZi1m3/dmNt+p1
593 // 3EZJ65pqjwxmB3Rg/vs7vCMk4TarTdSyKu+F1xRPFfoP/mK3Xctdjj6NyhsCQAYF
594 // 7/0TOzfkUPMPUJyqFB6xgbDpJ55ScnUUsznoqx+NkTWInDb4t02IqO/UmT2y6FKy
595 // Hk8TJ1fTJY+ebqaVp3ECQApx9gQ+n0zIhx97FMUuiRse73xkcW4+pZ8nF+8DmeQL
596 // /JKuuFGmzkG+rUbXFmo/Zg2ozVplw71NnQJ4znPsf7A=
597 // -----END RSA PRIVATE KEY-----
598 
599 // The following four certificates were generated with this Go program, varying
600 // |includeNetscapeExtension| and defining rootKeyPEM and rootCertPEM to be
601 // strings containing the kSANTypesRoot, above.
602 
603 // package main
604 
605 // import (
606 // "crypto/ecdsa"
607 // "crypto/elliptic"
608 // "crypto/rand"
609 // "crypto/x509"
610 // "crypto/x509/pkix"
611 // "encoding/asn1"
612 // "encoding/pem"
613 // "math/big"
614 // "os"
615 // "time"
616 // )
617 
618 // const includeNetscapeExtension = true
619 
620 // func main() {
621 // block, _ := pem.Decode([]byte(rootKeyPEM))
622 // rootPriv, _ := x509.ParsePKCS1PrivateKey(block.Bytes)
623 // block, _ = pem.Decode([]byte(rootCertPEM))
624 // root, _ := x509.ParseCertificate(block.Bytes)
625 
626 // interTemplate := &x509.Certificate{
627 // SerialNumber: big.NewInt(2),
628 // Subject: pkix.Name{
629 // CommonName: "No Basic Constraints (Netscape)",
630 // },
631 // NotBefore: time.Date(2000, time.January, 1, 0, 0, 0, 0, time.UTC),
632 // NotAfter: time.Date(2099, time.January, 1, 0, 0, 0, 0, time.UTC),
633 // }
634 
635 // if includeNetscapeExtension {
636 // interTemplate.ExtraExtensions = []pkix.Extension{
637 // pkix.Extension{
638 // Id: asn1.ObjectIdentifier([]int{2, 16, 840, 1, 113730, 1, 1}),
639 // Value: []byte{0x03, 0x02, 2, 0x04},
640 // },
641 // }
642 // } else {
643 // interTemplate.KeyUsage = x509.KeyUsageCertSign
644 // }
645 
646 // interKey, _ := ecdsa.GenerateKey(elliptic.P256(), rand.Reader)
647 
648 // interDER, err := x509.CreateCertificate(rand.Reader, interTemplate, root, &interKey.PublicKey, rootPriv)
649 // if err != nil {
650 // panic(err)
651 // }
652 
653 // pem.Encode(os.Stdout, &pem.Block{Type: "CERTIFICATE", Bytes: interDER})
654 
655 // inter, _ := x509.ParseCertificate(interDER)
656 
657 // leafTemplate := &x509.Certificate{
658 // SerialNumber: big.NewInt(3),
659 // Subject: pkix.Name{
660 // CommonName: "Leaf from CA with no Basic Constraints",
661 // },
662 // NotBefore: time.Date(2000, time.January, 1, 0, 0, 0, 0, time.UTC),
663 // NotAfter: time.Date(2099, time.January, 1, 0, 0, 0, 0, time.UTC),
664 // BasicConstraintsValid: true,
665 // }
666 // leafKey, _ := ecdsa.GenerateKey(elliptic.P256(), rand.Reader)
667 
668 // leafDER, err := x509.CreateCertificate(rand.Reader, leafTemplate, inter, &leafKey.PublicKey, interKey)
669 // if err != nil {
670 // panic(err)
671 // }
672 
673 // pem.Encode(os.Stdout, &pem.Block{Type: "CERTIFICATE", Bytes: leafDER})
674 // }
675 
676 // kNoBasicConstraintsCertSignIntermediate doesn't have isCA set, but contains
677 // certSign in the keyUsage.
679 -----BEGIN CERTIFICATE-----
680 MIIBqjCCAROgAwIBAgIBAjANBgkqhkiG9w0BAQsFADArMRcwFQYDVQQKEw5Cb3Jp
681 bmdTU0wgVGVzdDEQMA4GA1UEAxMHUm9vdCBDQTAgFw0wMDAxMDEwMDAwMDBaGA8y
682 MDk5MDEwMTAwMDAwMFowHzEdMBsGA1UEAxMUTm8gQmFzaWMgQ29uc3RyYWludHMw
683 WTATBgcqhkjOPQIBBggqhkjOPQMBBwNCAASEFMblfxIEDO8My7wHtHWTuDzNyID1
684 OsPkMGkn32O/pSyXxXuAqDeFoMVffUMTyfm8JcYugSEbrv2qEXXM4bZRoy8wLTAO
685 BgNVHQ8BAf8EBAMCAgQwGwYDVR0jBBQwEoAQQDfXAftAL7gcflQEJ4xZATANBgkq
686 hkiG9w0BAQsFAAOBgQC1Lh6hIAm3K5kRh5iIydU0YAEm7eV6ZSskERDUq3DLJyl9
687 ZUZCHUzvb464dkwZjeNzaUVS1pdElJslwX3DtGgeJLJGCnk8zUjBjaNrrDm0kzPW
688 xKt/6oif1ci/KCKqKNXJAIFbc4e+IiBpenwpxHk3If4NM+Ek0nKoO8Uj0NkgTQ==
689 -----END CERTIFICATE-----
690 )";
691 
692 static const char kNoBasicConstraintsCertSignLeaf[] = R"(
693 -----BEGIN CERTIFICATE-----
694 MIIBUDCB96ADAgECAgEDMAoGCCqGSM49BAMCMB8xHTAbBgNVBAMTFE5vIEJhc2lj
695 IENvbnN0cmFpbnRzMCAXDTAwMDEwMTAwMDAwMFoYDzIwOTkwMTAxMDAwMDAwWjAx
696 MS8wLQYDVQQDEyZMZWFmIGZyb20gQ0Egd2l0aCBubyBCYXNpYyBDb25zdHJhaW50
697 czBZMBMGByqGSM49AgEGCCqGSM49AwEHA0IABEsYPMwzdJKjB+2gpC90ib2ilHoB
698 w/arQ6ikUX0CNUDDaKaOu/jF39ogzVlg4lDFrjCKShSfCCcrwgONv70IZGijEDAO
699 MAwGA1UdEwEB/wQCMAAwCgYIKoZIzj0EAwIDSAAwRQIgbV7R99yM+okXSIs6Fp3o
700 eCOXiDL60IBxaTOcLS44ywcCIQDbn87Gj5cFgHBYAkzdHqDsyGXkxQTHDq9jmX24
701 Djy3Zw==
702 -----END CERTIFICATE-----
703 )";
704 
705 // kNoBasicConstraintsNetscapeCAIntermediate doesn't have isCA set, but contains
706 // a Netscape certificate-type extension that asserts a type of "SSL CA".
708 -----BEGIN CERTIFICATE-----
709 MIIBuDCCASGgAwIBAgIBAjANBgkqhkiG9w0BAQsFADArMRcwFQYDVQQKEw5Cb3Jp
710 bmdTU0wgVGVzdDEQMA4GA1UEAxMHUm9vdCBDQTAgFw0wMDAxMDEwMDAwMDBaGA8y
711 MDk5MDEwMTAwMDAwMFowKjEoMCYGA1UEAxMfTm8gQmFzaWMgQ29uc3RyYWludHMg
712 KE5ldHNjYXBlKTBZMBMGByqGSM49AgEGCCqGSM49AwEHA0IABCeMbmCaOtMzXBqi
713 PrCdNOH23CkaawUA+pAezitAN4RXS1O2CGK5sJjGPVVeogROU8G7/b+mU+ciZIzH
714 1PP8FJKjMjAwMBsGA1UdIwQUMBKAEEA31wH7QC+4HH5UBCeMWQEwEQYJYIZIAYb4
715 QgEBBAQDAgIEMA0GCSqGSIb3DQEBCwUAA4GBAAgNWjh7cfBTClTAk+Ml//5xb9Ju
716 tkBhG6Rm+kkMD+qiSMO6t7xS7CsA0+jIBjkdEYaLZ3oxtQCBdZsVNxUvRxZ0AUfF
717 G3DtRFTsrI1f7IQhpMuqEMF4shPW+5x54hrq0Fo6xMs6XoinJZcTUaaB8EeXRF6M
718 P9p6HuyLrmn0c/F0
719 -----END CERTIFICATE-----
720 )";
721 
722 static const char kNoBasicConstraintsNetscapeCALeaf[] = R"(
723 -----BEGIN CERTIFICATE-----
724 MIIBXDCCAQKgAwIBAgIBAzAKBggqhkjOPQQDAjAqMSgwJgYDVQQDEx9ObyBCYXNp
725 YyBDb25zdHJhaW50cyAoTmV0c2NhcGUpMCAXDTAwMDEwMTAwMDAwMFoYDzIwOTkw
726 MTAxMDAwMDAwWjAxMS8wLQYDVQQDEyZMZWFmIGZyb20gQ0Egd2l0aCBubyBCYXNp
727 YyBDb25zdHJhaW50czBZMBMGByqGSM49AgEGCCqGSM49AwEHA0IABDlJKolDu3R2
728 tPqSDycr0QJcWhxdBv76V0EEVflcHRxED6vAioTEcnQszt1OfKtBZvjlo0yp6i6Q
729 DaYit0ZInmWjEDAOMAwGA1UdEwEB/wQCMAAwCgYIKoZIzj0EAwIDSAAwRQIhAJsh
730 aZL6BHeEfoUBj1oZ2Ln91qzj3UCVMJ+vrmwAFdYyAiA3wp2JphgchvmoUFuzPXwj
731 XyPwWPbymSTpzKhB4xB7qQ==
732 -----END CERTIFICATE-----
733 )";
734 
735 static const char kSelfSignedMismatchAlgorithms[] = R"(
736 -----BEGIN CERTIFICATE-----
737 MIIFMjCCAxqgAwIBAgIJAL0mG5fOeJ7xMA0GCSqGSIb3DQEBDQUAMC0xCzAJBgNV
738 BAYTAkdCMQ8wDQYDVQQHDAZMb25kb24xDTALBgNVBAoMBFRlc3QwIBcNMTgwOTE3
739 MTIxNzU3WhgPMjExODA4MjQxMjE3NTdaMC0xCzAJBgNVBAYTAkdCMQ8wDQYDVQQH
740 DAZMb25kb24xDTALBgNVBAoMBFRlc3QwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAw
741 ggIKAoICAQDCMhBrRAGGw+n2GdctBr/cEK4FZA6ajiHjihgpCHoSBdyL4R2jGKLS
742 g0WgaMXa1HpkKN7LcIySosEBPlmcRkr1RqbEvQStOSvoFCXYvtx3alM6HTbXMcDR
743 mqoKoABP6LXsPSoMWIgqMtP2X9EOppzHVIK1yFYFfbIlvYUV2Ka+MuMe0Vh5wvD1
744 4GanPb+cWSKgdRSVQovCCMY3yWtZKVEaxRpCsk/mYYIFWz0tcgMjIKwDx1XXgiAV
745 nU6NK43xbaw3XhtnaD/pv9lhTTbNrlcln9LjTD097BaK4R+1AEPHnpfxA9Ui3upn
746 kbsNUdGdOB0ksZi/vd7lh833YgquQUIAhYrbfvq/HFCpVV1gljzlS3sqULYpLE//
747 i3OsuL2mE+CYIJGpIi2GeJJWXciNMTJDOqTn+fRDtVb4RPp4Y70DJirp7XzaBi3q
748 H0edANCzPSRCDbZsOhzIXhXshldiXVRX666DDlbMQgLTEnNKrkwv6DmU8o15XQsb
749 8k1Os2YwXmkEOxUQ7AJZXVTZSf6UK9Znmdq1ZrHjybMfRUkHVxJcnKvrxfryralv
750 gzfvu+D6HuxrCo3Ojqa+nDgIbxKEBtdrcsMhq1jWPFhjwo1fSadAkKOfdCAuXJRD
751 THg3b4Sf+W7Cpc570YHrIpBf7WFl2XsPcEM0mJZ5+yATASCubNozQwIDAQABo1Mw
752 UTAdBgNVHQ4EFgQUES0hupZSqY21JOba10QyZuxm91EwHwYDVR0jBBgwFoAUES0h
753 upZSqY21JOba10QyZuxm91EwDwYDVR0TAQH/BAUwAwEB/zANBgkqhkiG9w0BAQsF
754 AAOCAgEABTN5S30ng/RMpBweDm2N561PdpaCdiRXtAFCRVWR2mkDYC/Xj9Vqe6be
755 PyM7L/5OKYVjzF1yJu67z/dx+ja5o+41g17jdqla7hyPx+9B4uRyDh+1KJTa+duj
756 mw/aA1LCr6O6W4WizDOsChJ6FaB2Y1+GlFnKWb5nUdhVJqXQE1WOX9dZnw8Y4Npd
757 VmAsjWot0BZorJrt3fwfcv3QfA896twkbo7Llv/8qzg4sXZXZ4ZtgAOqnPngiSn+
758 JT/vYCXZ406VvAFpFqMcVz2dO/VGuL8lGIMHRKNyafrsV81EzH1W/XmRWOgvgj6r
759 yQI63ln/AMY72HQ97xLkE1xKunGz6bK5Ug5+O43Uftc4Mb6MUgzo+ZqEQ3Ob+cAV
760 cvjmtwDaPO/O39O5Xq0tLTlkn2/cKf4OQ6S++GDxzyRVHh5JXgP4j9+jfZY57Woy
761 R1bE7N50JjY4cDermBJKdlBIjL7UPhqmLyaG7V0hBitFlgGBUCcJtJOV0xYd5aF3
762 pxNkvMXhBmh95fjxJ0cJjpO7tN1RAwtMMNgsl7OUbuVRQCHOPW5DgP5qY21jDeRn
763 BY82382l+9QzykmJLI5MZnmj4BA9uIDCwMtoTTvP++SsvhUAbuvh7MOOUQL0EY4m
764 KStYq7X9PKseN+PvmfeoffIKc5R/Ha39oi7cGMVHCr8aiEhsf94=
765 -----END CERTIFICATE-----
766 )";
767 
768 // kCommonNameWithSANs is a leaf certificate signed by kSANTypesRoot, with
769 // *.host1.test as the common name and a SAN list of *.host2.test and
770 // foo.host3.test.
771 static const char kCommonNameWithSANs[] = R"(
772 -----BEGIN CERTIFICATE-----
773 MIIB2zCCAUSgAwIBAgIBAzANBgkqhkiG9w0BAQsFADArMRcwFQYDVQQKEw5Cb3Jp
774 bmdTU0wgVGVzdDEQMA4GA1UEAxMHUm9vdCBDQTAgFw0wMDAxMDEwMDAwMDBaGA8y
775 MDk5MDEwMTAwMDAwMFowNzEeMBwGA1UEChMVQ29tbW9uIG5hbWUgd2l0aCBTQU5z
776 MRUwEwYDVQQDDAwqLmhvc3QxLnRlc3QwWTATBgcqhkjOPQIBBggqhkjOPQMBBwNC
777 AASgWzfnFnpQrokSLIC+LhCKJDUAY/2usfIDpOnafYoYCasbYetkmOslgyY4Nn07
778 zjvjNROprA/0bdULXAkdL9bNo0gwRjAbBgNVHSMEFDASgBBAN9cB+0AvuBx+VAQn
779 jFkBMCcGA1UdEQQgMB6CDCouaG9zdDIudGVzdIIOZm9vLmhvc3QzLnRlc3QwDQYJ
780 KoZIhvcNAQELBQADgYEAtv2e3hBhsslXB1HTxgusjoschWOVtvGZUaYlhkKzKTCL
781 4YpDn50BccnucBU/b9phYvaEZtyzOv4ZXhxTGyLnLrIVB9x5ikfCcfl+LNYNjDwM
782 enm/h1zOfJ7wXLyscD4kU29Wc/zxBd70thIgLYn16CC1S9NtXKsXXDXv5VVH/bg=
783 -----END CERTIFICATE-----
784 )";
785 
786 // kCommonNameWithSANs is a leaf certificate signed by kSANTypesRoot, with
787 // *.host1.test as the common name and no SAN list.
788 static const char kCommonNameWithoutSANs[] = R"(
789 -----BEGIN CERTIFICATE-----
790 MIIBtTCCAR6gAwIBAgIBAzANBgkqhkiG9w0BAQsFADArMRcwFQYDVQQKEw5Cb3Jp
791 bmdTU0wgVGVzdDEQMA4GA1UEAxMHUm9vdCBDQTAgFw0wMDAxMDEwMDAwMDBaGA8y
792 MDk5MDEwMTAwMDAwMFowOjEhMB8GA1UEChMYQ29tbW9uIG5hbWUgd2l0aG91dCBT
793 QU5zMRUwEwYDVQQDDAwqLmhvc3QxLnRlc3QwWTATBgcqhkjOPQIBBggqhkjOPQMB
794 BwNCAARt2vjlIrPE+kr11VS1rRP/AYQu4fvf1bNw/K9rwYlVBhmLMPYasEmpCtKE
795 0bDIFydtDYC3wZDpSS+YiaG40sdAox8wHTAbBgNVHSMEFDASgBBAN9cB+0AvuBx+
796 VAQnjFkBMA0GCSqGSIb3DQEBCwUAA4GBAHRbIeaCEytOpJpw9O2dlB656AHe1+t5
797 4JiS5mvtzoVOLn7fFk5EFQtZS7sG1Uc2XjlSw+iyvFoTFEqfKyU/mIdc2vBuPwA2
798 +YXT8aE4S+UZ9oz5j0gDpikGnkSCW0cyHD8L8fntNjaQRSaM482JpmtdmuxClmWO
799 pFFXI2B5usgI
800 -----END CERTIFICATE-----
801 )";
802 
803 // kCommonNameWithEmailSAN is a leaf certificate signed by kSANTypesRoot, with
804 // *.host1.test as the common name and the email address test@host2.test in the
805 // SAN list.
806 static const char kCommonNameWithEmailSAN[] = R"(
807 -----BEGIN CERTIFICATE-----
808 MIIBvDCCASWgAwIBAgIBAjANBgkqhkiG9w0BAQsFADArMRcwFQYDVQQKEw5Cb3Jp
809 bmdTU0wgVGVzdDEQMA4GA1UEAxMHUm9vdCBDQTAgFw0wMDAxMDEwMDAwMDBaGA8y
810 MDk5MDEwMTAwMDAwMFowFzEVMBMGA1UEAwwMKi5ob3N0MS50ZXN0MFkwEwYHKoZI
811 zj0CAQYIKoZIzj0DAQcDQgAEtevOxcTjpPzlNGoUMFfZyr1k03/Hiuh+EsnuScDs
812 8XLKi6fDkvSaDClI99ycabQZRPIrvyT+dglDC6ugQd+CYqNJMEcwDAYDVR0TAQH/
813 BAIwADAbBgNVHSMEFDASgBBAN9cB+0AvuBx+VAQnjFkBMBoGA1UdEQQTMBGBD3Rl
814 c3RAaG9zdDIudGVzdDANBgkqhkiG9w0BAQsFAAOBgQCGbqb78OWJWl4zb+qw0Dz2
815 HJgZZJt6/+nNG/XJKdaYeS4eofsbwsJI4fuuOF6ZvYCJxVNtGqdfZDgycvFA9hjv
816 NGosBF1/spP17cmzTahLjxs71jDvHV/EQJbKGl/Zpta1Em1VrzSrwoOFabPXzZTJ
817 aet/mER21Z/9ZsTUoJQPJw==
818 -----END CERTIFICATE-----
819 )";
820 
821 // kCommonNameWithIPSAN is a leaf certificate signed by kSANTypesRoot, with
822 // *.host1.test as the common name and the IP address 127.0.0.1 in the
823 // SAN list.
824 static const char kCommonNameWithIPSAN[] = R"(
825 -----BEGIN CERTIFICATE-----
826 MIIBsTCCARqgAwIBAgIBAjANBgkqhkiG9w0BAQsFADArMRcwFQYDVQQKEw5Cb3Jp
827 bmdTU0wgVGVzdDEQMA4GA1UEAxMHUm9vdCBDQTAgFw0wMDAxMDEwMDAwMDBaGA8y
828 MDk5MDEwMTAwMDAwMFowFzEVMBMGA1UEAwwMKi5ob3N0MS50ZXN0MFkwEwYHKoZI
829 zj0CAQYIKoZIzj0DAQcDQgAEFKrgkxm8PysXbwnHQeTD3p8YY0+sY4ssnZgmj8wX
830 KTyn893fdBHWlz71GO6t82wMTF5d+ZYwI2XU52pfl4SB2aM+MDwwDAYDVR0TAQH/
831 BAIwADAbBgNVHSMEFDASgBBAN9cB+0AvuBx+VAQnjFkBMA8GA1UdEQQIMAaHBH8A
832 AAEwDQYJKoZIhvcNAQELBQADgYEAQWZ8Oj059ZjS109V/ijMYT28xuAN5n6HHxCO
833 DopTP56Zu9+gme5wTETWEfocspZvgecoUOcedTFoKSQ7JafO09NcVLA+D6ddYpju
834 mgfuiLy9dDhqvX/NHaLBMxOBWWbOLwWE+ibyX+pOzjWRCw1L7eUXOr6PhZAOQsmU
835 D0+O6KI=
836 -----END CERTIFICATE-----
837 )";
838 
839 // kConstrainedIntermediate is an intermediate signed by kSANTypesRoot, with
840 // permitted DNS names of permitted1.test and foo.permitted2.test and an
841 // excluded DNS name of excluded.permitted1.test. Its private key is:
842 //
843 // -----BEGIN PRIVATE KEY-----
844 // MIGHAgEAMBMGByqGSM49AgEGCCqGSM49AwEHBG0wawIBAQQgTXUM4tJWM7OzATty
845 // JhNOfIv/d8heWFBeKOfMR+RfaROhRANCAASbbbWYiN6mn+BCpg4XNpibOH0D/DN4
846 // kZ5C/Ml2YVomC9T83OKk2CzB8fPAabPb4P4Vv+fIabpEfjWS5nzKLY1y
847 // -----END PRIVATE KEY-----
848 static const char kConstrainedIntermediate[] = R"(
849 -----BEGIN CERTIFICATE-----
850 MIICDjCCAXegAwIBAgIBAjANBgkqhkiG9w0BAQsFADArMRcwFQYDVQQKEw5Cb3Jp
851 bmdTU0wgVGVzdDEQMA4GA1UEAxMHUm9vdCBDQTAgFw0wMDAxMDEwMDAwMDBaGA8y
852 MDk5MDEwMTAwMDAwMFowKDEmMCQGA1UEAxMdTmFtZSBDb25zdHJhaW50cyBJbnRl
853 cm1lZGlhdGUwWTATBgcqhkjOPQIBBggqhkjOPQMBBwNCAASbbbWYiN6mn+BCpg4X
854 NpibOH0D/DN4kZ5C/Ml2YVomC9T83OKk2CzB8fPAabPb4P4Vv+fIabpEfjWS5nzK
855 LY1yo4GJMIGGMA8GA1UdEwEB/wQFMAMBAf8wGwYDVR0jBBQwEoAQQDfXAftAL7gc
856 flQEJ4xZATBWBgNVHR4BAf8ETDBKoCowEYIPcGVybWl0dGVkMS50ZXN0MBWCE2Zv
857 by5wZXJtaXR0ZWQyLnRlc3ShHDAaghhleGNsdWRlZC5wZXJtaXR0ZWQxLnRlc3Qw
858 DQYJKoZIhvcNAQELBQADgYEAFq1Ka05hiKREwRpSceQPzIIH4B5a5IVBg5/EvmQI
859 9V0fXyAE1GmahPt70sIBxIgzNTEaY8P/IoOuCdlZWe0msmyEO3S6YSAzOWR5Van6
860 cXmFM1uMd95TlkxUMRdV+jKJTvG6R/BM2zltaV7Xt662k5HtzT5Svw0rZlFaggZz
861 UyM=
862 -----END CERTIFICATE-----
863 )";
864 
865 // kCommonNamePermittedLeaf is a leaf certificate signed by
866 // kConstrainedIntermediate. Its common name is permitted by the name
867 // constraints.
868 static const char kCommonNamePermittedLeaf[] = R"(
869 -----BEGIN CERTIFICATE-----
870 MIIBaDCCAQ2gAwIBAgIBAzAKBggqhkjOPQQDAjAoMSYwJAYDVQQDEx1OYW1lIENv
871 bnN0cmFpbnRzIEludGVybWVkaWF0ZTAgFw0wMDAxMDEwMDAwMDBaGA8yMDk5MDEw
872 MTAwMDAwMFowPjEeMBwGA1UEChMVQ29tbW9uIG5hbWUgcGVybWl0dGVkMRwwGgYD
873 VQQDExNmb28ucGVybWl0dGVkMS50ZXN0MFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcD
874 QgAENX5Ycs8q8MRzPYUz6DqLHhJR3wcmniFRgkiEa7MxE/mRe00y0VGwH7xi7Aoc
875 emXPrtD4JwN5bssbcxWGAKYYzaMQMA4wDAYDVR0TAQH/BAIwADAKBggqhkjOPQQD
876 AgNJADBGAiEAtsnWuRQXtw2xbieC78Y8SVEtTjcZUx8uZyQe1GPLfGICIQDR4fNY
877 yg3PC94ydPNQZVsFxAne32CbonWWsokalTFpUQ==
878 -----END CERTIFICATE-----
879 )";
880 static const char kCommonNamePermitted[] = "foo.permitted1.test";
881 
882 // kCommonNameNotPermittedLeaf is a leaf certificate signed by
883 // kConstrainedIntermediate. Its common name is not permitted by the name
884 // constraints.
885 static const char kCommonNameNotPermittedLeaf[] = R"(
886 -----BEGIN CERTIFICATE-----
887 MIIBazCCARCgAwIBAgIBBDAKBggqhkjOPQQDAjAoMSYwJAYDVQQDEx1OYW1lIENv
888 bnN0cmFpbnRzIEludGVybWVkaWF0ZTAgFw0wMDAxMDEwMDAwMDBaGA8yMDk5MDEw
889 MTAwMDAwMFowQTEiMCAGA1UEChMZQ29tbW9uIG5hbWUgbm90IHBlcm1pdHRlZDEb
890 MBkGA1UEAxMSbm90LXBlcm1pdHRlZC50ZXN0MFkwEwYHKoZIzj0CAQYIKoZIzj0D
891 AQcDQgAEzfghKuWf0JoXb0Drp09C3yXMSQQ1byt+AUaymvsHOWsxQ9v1Q+vkF/IM
892 HRqGTk2TyxrB2iClVEn/Uu+YtYox1KMQMA4wDAYDVR0TAQH/BAIwADAKBggqhkjO
893 PQQDAgNJADBGAiEAxaUslxmoWL1tIvnDz7gDkto/HcmdU0jHVuUQLXcCG8wCIQCN
894 5xZjitlCQU8UB5qSu9wH4B+0JcVO3Ss4Az76HEJWMw==
895 -----END CERTIFICATE-----
896 )";
897 static const char kCommonNameNotPermitted[] = "not-permitted.test";
898 
899 // kCommonNameNotPermittedWithSANsLeaf is a leaf certificate signed by
900 // kConstrainedIntermediate. Its common name is not permitted by the name
901 // constraints but it has a SAN list.
902 static const char kCommonNameNotPermittedWithSANsLeaf[] = R"(
903 -----BEGIN CERTIFICATE-----
904 MIIBqTCCAU+gAwIBAgIBBjAKBggqhkjOPQQDAjAoMSYwJAYDVQQDEx1OYW1lIENv
905 bnN0cmFpbnRzIEludGVybWVkaWF0ZTAgFw0wMDAxMDEwMDAwMDBaGA8yMDk5MDEw
906 MTAwMDAwMFowSzEsMCoGA1UEChMjQ29tbW9uIG5hbWUgbm90IHBlcm1pdHRlZCB3
907 aXRoIFNBTlMxGzAZBgNVBAMTEm5vdC1wZXJtaXR0ZWQudGVzdDBZMBMGByqGSM49
908 AgEGCCqGSM49AwEHA0IABKsn9wOApXFHrqhLdQgbFSeaSoAIbxgO0zVSRZUb5naR
909 93zoL3MFOvZEF8xiEqh7le+l3XuUig0fwqpcsZzRNJajRTBDMAwGA1UdEwEB/wQC
910 MAAwMwYDVR0RBCwwKoITZm9vLnBlcm1pdHRlZDEudGVzdIITZm9vLnBlcm1pdHRl
911 ZDIudGVzdDAKBggqhkjOPQQDAgNIADBFAiACk+1f184KkKAXuntmrz+Ygcq8MiZl
912 4delx44FtcNaegIhAIA5nYfzxNcTXxDo3U+x1vSLH6Y7faLvHiFySp7O//q+
913 -----END CERTIFICATE-----
914 )";
915 static const char kCommonNameNotPermittedWithSANs[] = "not-permitted.test";
916 
917 // kCommonNameNotDNSLeaf is a leaf certificate signed by
918 // kConstrainedIntermediate. Its common name is not a DNS name.
919 static const char kCommonNameNotDNSLeaf[] = R"(
920 -----BEGIN CERTIFICATE-----
921 MIIBYTCCAQagAwIBAgIBCDAKBggqhkjOPQQDAjAoMSYwJAYDVQQDEx1OYW1lIENv
922 bnN0cmFpbnRzIEludGVybWVkaWF0ZTAgFw0wMDAxMDEwMDAwMDBaGA8yMDk5MDEw
923 MTAwMDAwMFowNzEcMBoGA1UEChMTQ29tbW9uIG5hbWUgbm90IEROUzEXMBUGA1UE
924 AxMOTm90IGEgRE5TIG5hbWUwWTATBgcqhkjOPQIBBggqhkjOPQMBBwNCAASnueyc
925 Zxtnw5ke2J2T0/LwAK37auQP/RSFd9mem+BJVbgviawtAlignJmafp7Zw4/GdYEJ
926 Vm8qlriOJtluvXGcoxAwDjAMBgNVHRMBAf8EAjAAMAoGCCqGSM49BAMCA0kAMEYC
927 IQChUAmVNI39VHe0zemRE09VDcSEgOxr1nTvjLcg/Q8pVQIhAJYZnJI0YZAi05QH
928 RHNlAkTK2TnUaVn3fGSylaLiFS1r
929 -----END CERTIFICATE-----
930 )";
931 static const char kCommonNameNotDNS[] = "Not a DNS name";
932 
933 // The following six certificates are issued by |kSANTypesRoot| and have
934 // different extended key usage values. They were created with the following
935 // Go program:
936 //
937 // func main() {
938 // block, _ := pem.Decode([]byte(rootKeyPEM))
939 // rootPriv, _ := x509.ParsePKCS1PrivateKey(block.Bytes)
940 // block, _ = pem.Decode([]byte(rootCertPEM))
941 // root, _ := x509.ParseCertificate(block.Bytes)
942 //
943 // leafTemplate := &x509.Certificate{
944 // SerialNumber: big.NewInt(3),
945 // Subject: pkix.Name{
946 // CommonName: "EKU msSGC",
947 // },
948 // NotBefore: time.Date(2000, time.January, 1, 0, 0, 0, 0, time.UTC),
949 // NotAfter: time.Date(2099, time.January, 1, 0, 0, 0, 0, time.UTC),
950 // BasicConstraintsValid: true,
951 // ExtKeyUsage: []x509.ExtKeyUsage{FILL IN HERE},
952 // }
953 // leafKey, _ := ecdsa.GenerateKey(elliptic.P256(), rand.Reader)
954 // leafDER, err := x509.CreateCertificate(rand.Reader, leafTemplate, root, &leafKey.PublicKey, rootPriv)
955 // if err != nil {
956 // panic(err)
957 // }
958 // pem.Encode(os.Stdout, &pem.Block{Type: "CERTIFICATE", Bytes: leafDER})
959 // }
960 
961 static const char kMicrosoftSGCCert[] = R"(
962 -----BEGIN CERTIFICATE-----
963 MIIBtDCCAR2gAwIBAgIBAzANBgkqhkiG9w0BAQsFADArMRcwFQYDVQQKEw5Cb3Jp
964 bmdTU0wgVGVzdDEQMA4GA1UEAxMHUm9vdCBDQTAgFw0wMDAxMDEwMDAwMDBaGA8y
965 MDk5MDEwMTAwMDAwMFowFDESMBAGA1UEAxMJRUtVIG1zU0dDMFkwEwYHKoZIzj0C
966 AQYIKoZIzj0DAQcDQgAEEn61v3Vs+q6bTyyRnrJvuKBE8PTNVLbXGB52jig4Qse2
967 mGygNEysS0uzZ0luz+rn2hDRUFL6sHLUs1d8UMbI/6NEMEIwFQYDVR0lBA4wDAYK
968 KwYBBAGCNwoDAzAMBgNVHRMBAf8EAjAAMBsGA1UdIwQUMBKAEEA31wH7QC+4HH5U
969 BCeMWQEwDQYJKoZIhvcNAQELBQADgYEAgDQI9RSo3E3ZVnU71TV/LjG9xwHtfk6I
970 rlNnlJJ0lsTHAuMc1mwCbzhtsmasetwYlIa9G8GFWB9Gh/QqHA7G649iGGmXShqe
971 aVDuWgeSEJxBPE2jILoMm4pEYF7jfonTn7XXX6O78yuSlP+NPIU0gUKHkWZ1sWk0
972 cC4l0r/6jik=
973 -----END CERTIFICATE-----
974 )";
975 
976 static const char kNetscapeSGCCert[] = R"(
977 -----BEGIN CERTIFICATE-----
978 MIIBszCCARygAwIBAgIBAzANBgkqhkiG9w0BAQsFADArMRcwFQYDVQQKEw5Cb3Jp
979 bmdTU0wgVGVzdDEQMA4GA1UEAxMHUm9vdCBDQTAgFw0wMDAxMDEwMDAwMDBaGA8y
980 MDk5MDEwMTAwMDAwMFowFDESMBAGA1UEAxMJRUtVIG1zU0dDMFkwEwYHKoZIzj0C
981 AQYIKoZIzj0DAQcDQgAE3NbT+TnBfq1DWJCezjaUL52YhDU7cOkI2S2PoWgJ1v7x
982 kKLwBonUFZjppZs69SyBHeJdti+KoJ3qTW+hCG08EaNDMEEwFAYDVR0lBA0wCwYJ
983 YIZIAYb4QgQBMAwGA1UdEwEB/wQCMAAwGwYDVR0jBBQwEoAQQDfXAftAL7gcflQE
984 J4xZATANBgkqhkiG9w0BAQsFAAOBgQBuiyVcfazekHkCWksxdFmjPmMtWCxFjkzc
985 8VBxFE0CfSHQAfZ8J7tXd1FbAq/eXdZvvo8v0JB4sOM4Ex1ob1fuvDFHdSAHAD7W
986 dhKIjJyzVojoxjCjyue0XMeEPl7RiqbdxoS/R5HFAqAF0T2OeQAqP9gTpOXoau1M
987 RQHX6HQJJg==
988 -----END CERTIFICATE-----
989 )";
990 
991 static const char kServerEKUCert[] = R"(
992 -----BEGIN CERTIFICATE-----
993 MIIBsjCCARugAwIBAgIBAzANBgkqhkiG9w0BAQsFADArMRcwFQYDVQQKEw5Cb3Jp
994 bmdTU0wgVGVzdDEQMA4GA1UEAxMHUm9vdCBDQTAgFw0wMDAxMDEwMDAwMDBaGA8y
995 MDk5MDEwMTAwMDAwMFowFDESMBAGA1UEAxMJRUtVIG1zU0dDMFkwEwYHKoZIzj0C
996 AQYIKoZIzj0DAQcDQgAEDd35i+VWPwIOKLrLWTuP5cqD+yJDB5nujEzPgkXP5LKJ
997 SZRbHTqTdpYZB2jy6y90RY2Bsjx7FfZ7nN5G2g1GOKNCMEAwEwYDVR0lBAwwCgYI
998 KwYBBQUHAwEwDAYDVR0TAQH/BAIwADAbBgNVHSMEFDASgBBAN9cB+0AvuBx+VAQn
999 jFkBMA0GCSqGSIb3DQEBCwUAA4GBAIKmbMBjuivL/rxDu7u7Vr3o3cdmEggBJxwL
1000 iatNW3x1wg0645aNYOktW/iQ7mAAiziTY73GFyfiJDWqnY+CwA94ZWyQidjHdN/I
1001 6BR52sN/dkYEoInYEbmDNMc/if+T0yqeBQLP4BeKLiT8p0qqaimae6LgibS19hDP
1002 2hoEMdz2
1003 -----END CERTIFICATE-----
1004 )";
1005 
1006 static const char kServerEKUPlusMicrosoftSGCCert[] = R"(
1007 -----BEGIN CERTIFICATE-----
1008 MIIBvjCCASegAwIBAgIBAzANBgkqhkiG9w0BAQsFADArMRcwFQYDVQQKEw5Cb3Jp
1009 bmdTU0wgVGVzdDEQMA4GA1UEAxMHUm9vdCBDQTAgFw0wMDAxMDEwMDAwMDBaGA8y
1010 MDk5MDEwMTAwMDAwMFowFDESMBAGA1UEAxMJRUtVIG1zU0dDMFkwEwYHKoZIzj0C
1011 AQYIKoZIzj0DAQcDQgAEDO1MYPxq+U4oXMIK8UnsS4C696wpcu4UOmcMJJ5CUd5Z
1012 ZpJShN6kYKnrb3GK/6xEgbUGntmrzSRG5FYqk6QgD6NOMEwwHwYDVR0lBBgwFgYI
1013 KwYBBQUHAwEGCisGAQQBgjcKAwMwDAYDVR0TAQH/BAIwADAbBgNVHSMEFDASgBBA
1014 N9cB+0AvuBx+VAQnjFkBMA0GCSqGSIb3DQEBCwUAA4GBAHOu2IBa4lHzVGS36HxS
1015 SejUE87Ji1ysM6BgkYbfxfS9MuV+J3UnqH57JjbH/3CFl4ZDWceF6SGBSCn8LqKa
1016 KHpwoNFU3zA99iQzVJgbUyN0PbKwHEanLyKDJZyFk71R39ToxhSNQgaQYjZYCy1H
1017 5V9oXd1bodEqVsOZ/mur24Ku
1018 -----END CERTIFICATE-----
1019 )";
1020 
1021 static const char kAnyEKU[] = R"(
1022 -----BEGIN CERTIFICATE-----
1023 MIIBrjCCARegAwIBAgIBAzANBgkqhkiG9w0BAQsFADArMRcwFQYDVQQKEw5Cb3Jp
1024 bmdTU0wgVGVzdDEQMA4GA1UEAxMHUm9vdCBDQTAgFw0wMDAxMDEwMDAwMDBaGA8y
1025 MDk5MDEwMTAwMDAwMFowFDESMBAGA1UEAxMJRUtVIG1zU0dDMFkwEwYHKoZIzj0C
1026 AQYIKoZIzj0DAQcDQgAE9nsLABDporlTvx1OBUc4Hd5vxfX+8nS/OhbHmKtFLYNu
1027 1CLLrImbwMQYD2G+PgLO6sQHmASq2jmJKp6ZWsRkTqM+MDwwDwYDVR0lBAgwBgYE
1028 VR0lADAMBgNVHRMBAf8EAjAAMBsGA1UdIwQUMBKAEEA31wH7QC+4HH5UBCeMWQEw
1029 DQYJKoZIhvcNAQELBQADgYEAxgjgn1SAzQ+2GeCicZ5ndvVhKIeFelGCQ989XTVq
1030 uUbAYBW6v8GXNuVzoXYxDgNSanF6U+w+INrJ6daKVrIxAxdk9QFgBXqJoupuRAA3
1031 /OqnmYux0EqOTLbTK1P8DhaiaD0KV6dWGUwzqsgBmPkZ0lgNaPjvb1mKV3jhBkjz
1032 L6A=
1033 -----END CERTIFICATE-----
1034 )";
1035 
1036 static const char kNoEKU[] = R"(
1037 -----BEGIN CERTIFICATE-----
1038 MIIBnTCCAQagAwIBAgIBAzANBgkqhkiG9w0BAQsFADArMRcwFQYDVQQKEw5Cb3Jp
1039 bmdTU0wgVGVzdDEQMA4GA1UEAxMHUm9vdCBDQTAgFw0wMDAxMDEwMDAwMDBaGA8y
1040 MDk5MDEwMTAwMDAwMFowFDESMBAGA1UEAxMJRUtVIG1zU0dDMFkwEwYHKoZIzj0C
1041 AQYIKoZIzj0DAQcDQgAEpSFSqbYY86ZcMamE606dqdyjWlwhSHKOLUFsUUIzkMPz
1042 KHRu/x3Yzi8+Hm8eFK/TnCbkpYsYw4hIw00176dYzaMtMCswDAYDVR0TAQH/BAIw
1043 ADAbBgNVHSMEFDASgBBAN9cB+0AvuBx+VAQnjFkBMA0GCSqGSIb3DQEBCwUAA4GB
1044 AHvYzynIkjLThExHRS+385hfv4vgrQSMmCM1SAnEIjSBGsU7RPgiGAstN06XivuF
1045 T1fNugRmTu4OtOIbfdYkcjavJufw9hR9zWTt77CNMTy9XmOZLgdS5boFTtLCztr3
1046 TXHOSQQD8Dl4BK0wOet+TP6LBEjHlRFjAqK4bu9xpxV2
1047 -----END CERTIFICATE-----
1048 )";
1049 
1050 // CertFromPEM parses the given, NUL-terminated pem block and returns an
1051 // |X509*|.
1052 static bssl::UniquePtr<X509> CertFromPEM(const char *pem) {
1053  bssl::UniquePtr<BIO> bio(BIO_new_mem_buf(pem, strlen(pem)));
1054  return bssl::UniquePtr<X509>(
1055  PEM_read_bio_X509(bio.get(), nullptr, nullptr, nullptr));
1056 }
1057 
1058 // CRLFromPEM parses the given, NUL-terminated pem block and returns an
1059 // |X509_CRL*|.
1060 static bssl::UniquePtr<X509_CRL> CRLFromPEM(const char *pem) {
1061  bssl::UniquePtr<BIO> bio(BIO_new_mem_buf(pem, strlen(pem)));
1062  return bssl::UniquePtr<X509_CRL>(
1063  PEM_read_bio_X509_CRL(bio.get(), nullptr, nullptr, nullptr));
1064 }
1065 
1066 // PrivateKeyFromPEM parses the given, NUL-terminated pem block and returns an
1067 // |EVP_PKEY*|.
1068 static bssl::UniquePtr<EVP_PKEY> PrivateKeyFromPEM(const char *pem) {
1069  bssl::UniquePtr<BIO> bio(
1070  BIO_new_mem_buf(const_cast<char *>(pem), strlen(pem)));
1071  return bssl::UniquePtr<EVP_PKEY>(
1072  PEM_read_bio_PrivateKey(bio.get(), nullptr, nullptr, nullptr));
1073 }
1074 
1075 // CertsToStack converts a vector of |X509*| to an OpenSSL STACK_OF(X509),
1076 // bumping the reference counts for each certificate in question.
1078  const std::vector<X509 *> &certs) {
1080  if (!stack) {
1081  return nullptr;
1082  }
1083  for (auto cert : certs) {
1084  if (!bssl::PushToStack(stack.get(), bssl::UpRef(cert))) {
1085  return nullptr;
1086  }
1087  }
1088 
1089  return stack;
1090 }
1091 
1092 // CRLsToStack converts a vector of |X509_CRL*| to an OpenSSL
1093 // STACK_OF(X509_CRL), bumping the reference counts for each CRL in question.
1095  const std::vector<X509_CRL *> &crls) {
1096  bssl::UniquePtr<STACK_OF(X509_CRL)> stack(sk_X509_CRL_new_null());
1097  if (!stack) {
1098  return nullptr;
1099  }
1100  for (auto crl : crls) {
1101  if (!bssl::PushToStack(stack.get(), bssl::UpRef(crl))) {
1102  return nullptr;
1103  }
1104  }
1105 
1106  return stack;
1107 }
1108 
1109 static const time_t kReferenceTime = 1474934400 /* Sep 27th, 2016 */;
1110 
1111 static int Verify(
1112  X509 *leaf, const std::vector<X509 *> &roots,
1113  const std::vector<X509 *> &intermediates,
1114  const std::vector<X509_CRL *> &crls, unsigned long flags = 0,
1115  std::function<void(X509_VERIFY_PARAM *)> configure_callback = nullptr,
1116  int (*verify_callback)(int, X509_STORE_CTX *) = nullptr) {
1117  bssl::UniquePtr<STACK_OF(X509)> roots_stack(CertsToStack(roots));
1118  bssl::UniquePtr<STACK_OF(X509)> intermediates_stack(
1119  CertsToStack(intermediates));
1120  bssl::UniquePtr<STACK_OF(X509_CRL)> crls_stack(CRLsToStack(crls));
1121 
1122  if (!roots_stack ||
1123  !intermediates_stack ||
1124  !crls_stack) {
1125  return X509_V_ERR_UNSPECIFIED;
1126  }
1127 
1128  bssl::UniquePtr<X509_STORE_CTX> ctx(X509_STORE_CTX_new());
1129  bssl::UniquePtr<X509_STORE> store(X509_STORE_new());
1130  if (!ctx ||
1131  !store) {
1132  return X509_V_ERR_UNSPECIFIED;
1133  }
1134 
1135  if (!X509_STORE_CTX_init(ctx.get(), store.get(), leaf,
1136  intermediates_stack.get())) {
1137  return X509_V_ERR_UNSPECIFIED;
1138  }
1139 
1140  X509_STORE_CTX_trusted_stack(ctx.get(), roots_stack.get());
1141  X509_STORE_CTX_set0_crls(ctx.get(), crls_stack.get());
1142 
1145  if (configure_callback) {
1146  configure_callback(param);
1147  }
1148  if (flags) {
1150  }
1151 
1152  ERR_clear_error();
1153  if (X509_verify_cert(ctx.get()) != 1) {
1154  return X509_STORE_CTX_get_error(ctx.get());
1155  }
1156 
1157  return X509_V_OK;
1158 }
1159 
1160 TEST(X509Test, TestVerify) {
1161  // cross_signing_root
1162  // |
1163  // root_cross_signed root
1164  // \ /
1165  // intermediate
1166  // | |
1167  // leaf leaf_no_key_usage
1168  // |
1169  // forgery
1170  bssl::UniquePtr<X509> cross_signing_root(CertFromPEM(kCrossSigningRootPEM));
1171  bssl::UniquePtr<X509> root(CertFromPEM(kRootCAPEM));
1172  bssl::UniquePtr<X509> root_cross_signed(CertFromPEM(kRootCrossSignedPEM));
1173  bssl::UniquePtr<X509> intermediate(CertFromPEM(kIntermediatePEM));
1174  bssl::UniquePtr<X509> intermediate_self_signed(
1176  bssl::UniquePtr<X509> leaf(CertFromPEM(kLeafPEM));
1177  bssl::UniquePtr<X509> leaf_no_key_usage(CertFromPEM(kLeafNoKeyUsagePEM));
1178  bssl::UniquePtr<X509> forgery(CertFromPEM(kForgeryPEM));
1179 
1180  ASSERT_TRUE(cross_signing_root);
1181  ASSERT_TRUE(root);
1182  ASSERT_TRUE(root_cross_signed);
1183  ASSERT_TRUE(intermediate);
1184  ASSERT_TRUE(intermediate_self_signed);
1185  ASSERT_TRUE(leaf);
1186  ASSERT_TRUE(forgery);
1187  ASSERT_TRUE(leaf_no_key_usage);
1188 
1189  // Most of these tests work with or without |X509_V_FLAG_TRUSTED_FIRST|,
1190  // though in different ways.
1191  for (bool trusted_first : {true, false}) {
1192  SCOPED_TRACE(trusted_first);
1193  std::function<void(X509_VERIFY_PARAM *)> configure_callback;
1194  if (!trusted_first) {
1195  // Note we need the callback to clear the flag. Setting |flags| to zero
1196  // only skips setting new flags.
1197  configure_callback = [&](X509_VERIFY_PARAM *param) {
1199  };
1200  }
1201 
1202  // No trust anchors configured.
1204  Verify(leaf.get(), /*roots=*/{}, /*intermediates=*/{},
1205  /*crls=*/{}, /*flags=*/0, configure_callback));
1206  ASSERT_EQ(
1208  Verify(leaf.get(), /*roots=*/{}, {intermediate.get()}, /*crls=*/{},
1209  /*flags=*/0, configure_callback));
1210 
1211  // Each chain works individually.
1212  ASSERT_EQ(X509_V_OK, Verify(leaf.get(), {root.get()}, {intermediate.get()},
1213  /*crls=*/{}, /*flags=*/0, configure_callback));
1214  ASSERT_EQ(X509_V_OK, Verify(leaf.get(), {cross_signing_root.get()},
1215  {intermediate.get(), root_cross_signed.get()},
1216  /*crls=*/{}, /*flags=*/0, configure_callback));
1217 
1218  // When both roots are available, we pick one or the other.
1220  Verify(leaf.get(), {cross_signing_root.get(), root.get()},
1221  {intermediate.get(), root_cross_signed.get()}, /*crls=*/{},
1222  /*flags=*/0, configure_callback));
1223 
1224  // This is the “altchains” test – we remove the cross-signing CA but include
1225  // the cross-sign in the intermediates. With |trusted_first|, we
1226  // preferentially stop path-building at |intermediate|. Without
1227  // |trusted_first|, the "altchains" logic repairs it.
1228  ASSERT_EQ(X509_V_OK, Verify(leaf.get(), {root.get()},
1229  {intermediate.get(), root_cross_signed.get()},
1230  /*crls=*/{}, /*flags=*/0, configure_callback));
1231 
1232  // If |X509_V_FLAG_NO_ALT_CHAINS| is set and |trusted_first| is disabled, we
1233  // get stuck on |root_cross_signed|. If either feature is enabled, we can
1234  // build the path.
1235  //
1236  // This test exists to confirm our current behavior, but these modes are
1237  // just workarounds for not having an actual path-building verifier. If we
1238  // fix it, this test can be removed.
1239  ASSERT_EQ(trusted_first ? X509_V_OK
1241  Verify(leaf.get(), {root.get()},
1242  {intermediate.get(), root_cross_signed.get()}, /*crls=*/{},
1243  /*flags=*/X509_V_FLAG_NO_ALT_CHAINS, configure_callback));
1244 
1245  // |forgery| is signed by |leaf_no_key_usage|, but is rejected because the
1246  // leaf is not a CA.
1248  Verify(forgery.get(), {intermediate_self_signed.get()},
1249  {leaf_no_key_usage.get()}, /*crls=*/{}, /*flags=*/0,
1250  configure_callback));
1251 
1252  // Test that one cannot skip Basic Constraints checking with a contorted set
1253  // of roots and intermediates. This is a regression test for CVE-2015-1793.
1255  Verify(forgery.get(),
1256  {intermediate_self_signed.get(), root_cross_signed.get()},
1257  {leaf_no_key_usage.get(), intermediate.get()}, /*crls=*/{},
1258  /*flags=*/0, configure_callback));
1259  }
1260 }
1261 
1262 static const char kHostname[] = "example.com";
1263 static const char kWrongHostname[] = "example2.com";
1264 static const char kEmail[] = "test@example.com";
1265 static const char kWrongEmail[] = "test2@example.com";
1266 static const uint8_t kIP[4] = {127, 0, 0, 1};
1267 static const uint8_t kWrongIP[4] = {127, 0, 0, 2};
1268 static const char kIPString[] = "127.0.0.1";
1269 static const char kWrongIPString[] = "127.0.0.2";
1270 
1271 TEST(X509Test, ZeroLengthsWithX509PARAM) {
1272  bssl::UniquePtr<X509> leaf(CertFromPEM(kSANTypesLeaf));
1273  bssl::UniquePtr<X509> root(CertFromPEM(kSANTypesRoot));
1274  ASSERT_TRUE(leaf);
1275  ASSERT_TRUE(root);
1276 
1277  std::vector<X509_CRL *> empty_crls;
1278 
1279  struct X509Test {
1280  const char *correct_value;
1281  size_t correct_value_len;
1282  const char *incorrect_value;
1283  size_t incorrect_value_len;
1284  int (*func)(X509_VERIFY_PARAM *, const char *, size_t);
1285  int mismatch_error;
1286  };
1287  const std::vector<X509Test> kTests = {
1288  {kHostname, strlen(kHostname), kWrongHostname, strlen(kWrongHostname),
1290  {kEmail, strlen(kEmail), kWrongEmail, strlen(kWrongEmail),
1292  };
1293 
1294  for (size_t i = 0; i < kTests.size(); i++) {
1295  SCOPED_TRACE(i);
1296  const X509Test &test = kTests[i];
1297 
1298  // The correct value should work.
1300  Verify(leaf.get(), {root.get()}, {}, empty_crls, 0,
1301  [&test](X509_VERIFY_PARAM *param) {
1302  ASSERT_TRUE(test.func(param, test.correct_value,
1303  test.correct_value_len));
1304  }));
1305 
1306  // The wrong value should trigger a verification error.
1307  ASSERT_EQ(test.mismatch_error,
1308  Verify(leaf.get(), {root.get()}, {}, empty_crls, 0,
1309  [&test](X509_VERIFY_PARAM *param) {
1310  ASSERT_TRUE(test.func(param, test.incorrect_value,
1311  test.incorrect_value_len));
1312  }));
1313 
1314  // Passing zero as the length, unlike OpenSSL, should trigger an error and
1315  // should cause verification to fail.
1317  Verify(leaf.get(), {root.get()}, {}, empty_crls, 0,
1318  [&test](X509_VERIFY_PARAM *param) {
1319  ASSERT_FALSE(test.func(param, test.correct_value, 0));
1320  }));
1321 
1322  // Passing an empty value should be an error when setting and should cause
1323  // verification to fail.
1325  Verify(leaf.get(), {root.get()}, {}, empty_crls, 0,
1326  [&test](X509_VERIFY_PARAM *param) {
1327  ASSERT_FALSE(test.func(param, nullptr, 0));
1328  }));
1329 
1330  // Passing a value with embedded NULs should also be an error and should
1331  // also cause verification to fail.
1333  Verify(leaf.get(), {root.get()}, {}, empty_crls, 0,
1334  [&test](X509_VERIFY_PARAM *param) {
1335  ASSERT_FALSE(test.func(param, "a", 2));
1336  }));
1337  }
1338 
1339  // IP addresses work slightly differently:
1340 
1341  // The correct value should still work.
1342  ASSERT_EQ(X509_V_OK, Verify(leaf.get(), {root.get()}, {}, empty_crls, 0,
1343  [](X509_VERIFY_PARAM *param) {
1344  ASSERT_TRUE(X509_VERIFY_PARAM_set1_ip(
1345  param, kIP, sizeof(kIP)));
1346  }));
1347 
1348  // Incorrect values should still fail.
1350  Verify(leaf.get(), {root.get()}, {}, empty_crls, 0,
1351  [](X509_VERIFY_PARAM *param) {
1352  ASSERT_TRUE(X509_VERIFY_PARAM_set1_ip(param, kWrongIP,
1353  sizeof(kWrongIP)));
1354  }));
1355 
1356  // Zero length values should trigger an error when setting and cause
1357  // verification to always fail.
1359  Verify(leaf.get(), {root.get()}, {}, empty_crls, 0,
1360  [](X509_VERIFY_PARAM *param) {
1361  ASSERT_FALSE(X509_VERIFY_PARAM_set1_ip(param, kIP, 0));
1362  }));
1363 
1364  // ... and so should NULL values.
1366  Verify(leaf.get(), {root.get()}, {}, empty_crls, 0,
1367  [](X509_VERIFY_PARAM *param) {
1368  ASSERT_FALSE(X509_VERIFY_PARAM_set1_ip(param, nullptr, 0));
1369  }));
1370 
1371  // Zero bytes in an IP address are, of course, fine. This is tested above
1372  // because |kIP| contains zeros.
1373 }
1374 
1375 TEST(X509Test, ZeroLengthsWithCheckFunctions) {
1376  bssl::UniquePtr<X509> leaf(CertFromPEM(kSANTypesLeaf));
1377 
1378  EXPECT_EQ(
1379  1, X509_check_host(leaf.get(), kHostname, strlen(kHostname), 0, nullptr));
1380  EXPECT_NE(1, X509_check_host(leaf.get(), kWrongHostname,
1381  strlen(kWrongHostname), 0, nullptr));
1382 
1383  EXPECT_EQ(1, X509_check_email(leaf.get(), kEmail, strlen(kEmail), 0));
1384  EXPECT_NE(1,
1385  X509_check_email(leaf.get(), kWrongEmail, strlen(kWrongEmail), 0));
1386 
1387  EXPECT_EQ(1, X509_check_ip(leaf.get(), kIP, sizeof(kIP), 0));
1388  EXPECT_NE(1, X509_check_ip(leaf.get(), kWrongIP, sizeof(kWrongIP), 0));
1389 
1390  EXPECT_EQ(1, X509_check_ip_asc(leaf.get(), kIPString, 0));
1391  EXPECT_NE(1, X509_check_ip_asc(leaf.get(), kWrongIPString, 0));
1392 
1393  // OpenSSL supports passing zero as the length for host and email. We do not
1394  // and it should always fail.
1395  EXPECT_NE(1, X509_check_host(leaf.get(), kHostname, 0, 0, nullptr));
1396  EXPECT_NE(1, X509_check_host(leaf.get(), kWrongHostname, 0, 0, nullptr));
1397 
1398  EXPECT_NE(1, X509_check_email(leaf.get(), kEmail, 0, 0));
1399  EXPECT_NE(1, X509_check_email(leaf.get(), kWrongEmail, 0, 0));
1400 
1401  EXPECT_NE(1, X509_check_ip(leaf.get(), kIP, 0, 0));
1402  EXPECT_NE(1, X509_check_ip(leaf.get(), kWrongIP, 0, 0));
1403 
1404  // Unlike all the other functions, |X509_check_ip_asc| doesn't take a length,
1405  // so it cannot be zero.
1406 }
1407 
1408 TEST(X509Test, TestCRL) {
1409  bssl::UniquePtr<X509> root(CertFromPEM(kCRLTestRoot));
1410  bssl::UniquePtr<X509> leaf(CertFromPEM(kCRLTestLeaf));
1411  bssl::UniquePtr<X509_CRL> basic_crl(CRLFromPEM(kBasicCRL));
1412  bssl::UniquePtr<X509_CRL> revoked_crl(CRLFromPEM(kRevokedCRL));
1413  bssl::UniquePtr<X509_CRL> bad_issuer_crl(CRLFromPEM(kBadIssuerCRL));
1414  bssl::UniquePtr<X509_CRL> known_critical_crl(CRLFromPEM(kKnownCriticalCRL));
1415  bssl::UniquePtr<X509_CRL> unknown_critical_crl(
1417  bssl::UniquePtr<X509_CRL> unknown_critical_crl2(
1419  bssl::UniquePtr<X509_CRL> algorithm_mismatch_crl(
1421  bssl::UniquePtr<X509_CRL> algorithm_mismatch_crl2(
1423 
1424  ASSERT_TRUE(root);
1425  ASSERT_TRUE(leaf);
1426  ASSERT_TRUE(basic_crl);
1427  ASSERT_TRUE(revoked_crl);
1428  ASSERT_TRUE(bad_issuer_crl);
1429  ASSERT_TRUE(known_critical_crl);
1430  ASSERT_TRUE(unknown_critical_crl);
1431  ASSERT_TRUE(unknown_critical_crl2);
1432  ASSERT_TRUE(algorithm_mismatch_crl);
1433  ASSERT_TRUE(algorithm_mismatch_crl2);
1434 
1435  EXPECT_EQ(X509_V_OK, Verify(leaf.get(), {root.get()}, {root.get()},
1436  {basic_crl.get()}, X509_V_FLAG_CRL_CHECK));
1437  EXPECT_EQ(
1439  Verify(leaf.get(), {root.get()}, {root.get()},
1440  {basic_crl.get(), revoked_crl.get()}, X509_V_FLAG_CRL_CHECK));
1441 
1442  std::vector<X509_CRL *> empty_crls;
1444  Verify(leaf.get(), {root.get()}, {root.get()}, empty_crls,
1447  Verify(leaf.get(), {root.get()}, {root.get()},
1448  {bad_issuer_crl.get()}, X509_V_FLAG_CRL_CHECK));
1450  Verify(leaf.get(), {root.get()}, {root.get()},
1451  {known_critical_crl.get()}, X509_V_FLAG_CRL_CHECK));
1453  Verify(leaf.get(), {root.get()}, {root.get()},
1454  {unknown_critical_crl.get()}, X509_V_FLAG_CRL_CHECK));
1456  Verify(leaf.get(), {root.get()}, {root.get()},
1457  {unknown_critical_crl2.get()}, X509_V_FLAG_CRL_CHECK));
1459  Verify(leaf.get(), {root.get()}, {root.get()},
1460  {algorithm_mismatch_crl.get()}, X509_V_FLAG_CRL_CHECK));
1462  Verify(leaf.get(), {root.get()}, {root.get()},
1463  {algorithm_mismatch_crl2.get()}, X509_V_FLAG_CRL_CHECK));
1464 
1465  // Parsing kBadExtensionCRL should fail.
1467 }
1468 
1469 TEST(X509Test, ManyNamesAndConstraints) {
1470  bssl::UniquePtr<X509> many_constraints(CertFromPEM(
1471  GetTestData("crypto/x509/test/many_constraints.pem").c_str()));
1472  ASSERT_TRUE(many_constraints);
1473  bssl::UniquePtr<X509> many_names1(
1474  CertFromPEM(GetTestData("crypto/x509/test/many_names1.pem").c_str()));
1475  ASSERT_TRUE(many_names1);
1476  bssl::UniquePtr<X509> many_names2(
1477  CertFromPEM(GetTestData("crypto/x509/test/many_names2.pem").c_str()));
1478  ASSERT_TRUE(many_names2);
1479  bssl::UniquePtr<X509> many_names3(
1480  CertFromPEM(GetTestData("crypto/x509/test/many_names3.pem").c_str()));
1481  ASSERT_TRUE(many_names3);
1482  bssl::UniquePtr<X509> some_names1(
1483  CertFromPEM(GetTestData("crypto/x509/test/some_names1.pem").c_str()));
1484  ASSERT_TRUE(some_names1);
1485  bssl::UniquePtr<X509> some_names2(
1486  CertFromPEM(GetTestData("crypto/x509/test/some_names2.pem").c_str()));
1487  ASSERT_TRUE(some_names2);
1488  bssl::UniquePtr<X509> some_names3(
1489  CertFromPEM(GetTestData("crypto/x509/test/some_names3.pem").c_str()));
1490  ASSERT_TRUE(some_names3);
1491 
1493  Verify(many_names1.get(), {many_constraints.get()},
1494  {many_constraints.get()}, {}));
1496  Verify(many_names2.get(), {many_constraints.get()},
1497  {many_constraints.get()}, {}));
1499  Verify(many_names3.get(), {many_constraints.get()},
1500  {many_constraints.get()}, {}));
1501 
1502  EXPECT_EQ(X509_V_OK, Verify(some_names1.get(), {many_constraints.get()},
1503  {many_constraints.get()}, {}));
1504  EXPECT_EQ(X509_V_OK, Verify(some_names2.get(), {many_constraints.get()},
1505  {many_constraints.get()}, {}));
1506  EXPECT_EQ(X509_V_OK, Verify(some_names3.get(), {many_constraints.get()},
1507  {many_constraints.get()}, {}));
1508 }
1509 
1510 static bssl::UniquePtr<GENERAL_NAME> MakeGeneralName(int type,
1511  const std::string &value) {
1512  if (type != GEN_EMAIL && type != GEN_DNS && type != GEN_URI) {
1513  // This function only supports the IA5String types.
1514  return nullptr;
1515  }
1516  bssl::UniquePtr<ASN1_IA5STRING> str(ASN1_IA5STRING_new());
1517  bssl::UniquePtr<GENERAL_NAME> name(GENERAL_NAME_new());
1518  if (!str || !name ||
1519  !ASN1_STRING_set(str.get(), value.data(), value.size())) {
1520  return nullptr;
1521  }
1522 
1523  name->type = type;
1524  name->d.ia5 = str.release();
1525  return name;
1526 }
1527 
1528 static bssl::UniquePtr<X509> MakeTestCert(const char *issuer,
1529  const char *subject, EVP_PKEY *key,
1530  bool is_ca) {
1531  bssl::UniquePtr<X509> cert(X509_new());
1532  if (!cert || //
1533  !X509_set_version(cert.get(), X509_VERSION_3) ||
1535  X509_get_issuer_name(cert.get()), "CN", MBSTRING_UTF8,
1536  reinterpret_cast<const uint8_t *>(issuer), -1, -1, 0) ||
1538  X509_get_subject_name(cert.get()), "CN", MBSTRING_UTF8,
1539  reinterpret_cast<const uint8_t *>(subject), -1, -1, 0) ||
1540  !X509_set_pubkey(cert.get(), key) ||
1541  !ASN1_TIME_adj(X509_getm_notBefore(cert.get()), kReferenceTime, -1, 0) ||
1542  !ASN1_TIME_adj(X509_getm_notAfter(cert.get()), kReferenceTime, 1, 0)) {
1543  return nullptr;
1544  }
1545  bssl::UniquePtr<BASIC_CONSTRAINTS> bc(BASIC_CONSTRAINTS_new());
1546  if (!bc) {
1547  return nullptr;
1548  }
1549  bc->ca = is_ca ? 0xff : 0x00;
1550  if (!X509_add1_ext_i2d(cert.get(), NID_basic_constraints, bc.get(),
1551  /*crit=*/1, /*flags=*/0)) {
1552  return nullptr;
1553  }
1554  return cert;
1555 }
1556 
1557 TEST(X509Test, NameConstraints) {
1558  bssl::UniquePtr<EVP_PKEY> key = PrivateKeyFromPEM(kP256Key);
1559  ASSERT_TRUE(key);
1560 
1561  const struct {
1562  int type;
1563  std::string name;
1564  std::string constraint;
1565  int result;
1566  } kTests[] = {
1567  // Empty string matches everything.
1568  {GEN_DNS, "foo.example.com", "", X509_V_OK},
1569  // Name constraints match the entire subtree.
1570  {GEN_DNS, "foo.example.com", "example.com", X509_V_OK},
1571  {GEN_DNS, "foo.example.com", "EXAMPLE.COM", X509_V_OK},
1572  {GEN_DNS, "foo.example.com", "xample.com",
1574  {GEN_DNS, "foo.example.com", "unrelated.much.longer.name.example",
1576  // A leading dot means at least one component must be added.
1577  {GEN_DNS, "foo.example.com", ".example.com", X509_V_OK},
1578  {GEN_DNS, "foo.example.com", "foo.example.com", X509_V_OK},
1579  {GEN_DNS, "foo.example.com", ".foo.example.com",
1581  {GEN_DNS, "foo.example.com", ".xample.com",
1583  {GEN_DNS, "foo.example.com", ".unrelated.much.longer.name.example",
1585  // NUL bytes, if not rejected, should not confuse the matching logic.
1586  {GEN_DNS, std::string({'a', '\0', 'a'}), std::string({'a', '\0', 'b'}),
1588 
1589  // Names must be emails.
1590  {GEN_EMAIL, "not-an-email.example", "not-an-email.example",
1592  // A leading dot matches all local names and all subdomains
1593  {GEN_EMAIL, "foo@bar.example.com", ".example.com", X509_V_OK},
1594  {GEN_EMAIL, "foo@bar.example.com", ".EXAMPLE.COM", X509_V_OK},
1595  {GEN_EMAIL, "foo@bar.example.com", ".bar.example.com",
1597  // Without a leading dot, the host must match exactly.
1598  {GEN_EMAIL, "foo@example.com", "example.com", X509_V_OK},
1599  {GEN_EMAIL, "foo@example.com", "EXAMPLE.COM", X509_V_OK},
1600  {GEN_EMAIL, "foo@bar.example.com", "example.com",
1602  // If the constraint specifies a mailbox, it specifies the whole thing.
1603  // The halves are compared insensitively.
1604  {GEN_EMAIL, "foo@example.com", "foo@example.com", X509_V_OK},
1605  {GEN_EMAIL, "foo@example.com", "foo@EXAMPLE.COM", X509_V_OK},
1606  {GEN_EMAIL, "foo@example.com", "FOO@example.com",
1608  {GEN_EMAIL, "foo@example.com", "bar@example.com",
1610  // OpenSSL ignores a stray leading @.
1611  {GEN_EMAIL, "foo@example.com", "@example.com", X509_V_OK},
1612  {GEN_EMAIL, "foo@example.com", "@EXAMPLE.COM", X509_V_OK},
1613  {GEN_EMAIL, "foo@bar.example.com", "@example.com",
1615 
1616  // Basic syntax check.
1617  {GEN_URI, "not-a-url", "not-a-url", X509_V_ERR_UNSUPPORTED_NAME_SYNTAX},
1618  {GEN_URI, "foo:not-a-url", "not-a-url",
1620  {GEN_URI, "foo:/not-a-url", "not-a-url",
1622  {GEN_URI, "foo:///not-a-url", "not-a-url",
1624  {GEN_URI, "foo://:not-a-url", "not-a-url",
1626  {GEN_URI, "foo://", "not-a-url", X509_V_ERR_UNSUPPORTED_NAME_SYNTAX},
1627  // Hosts are an exact match.
1628  {GEN_URI, "foo://example.com", "example.com", X509_V_OK},
1629  {GEN_URI, "foo://example.com:443", "example.com", X509_V_OK},
1630  {GEN_URI, "foo://example.com/whatever", "example.com", X509_V_OK},
1631  {GEN_URI, "foo://bar.example.com", "example.com",
1633  {GEN_URI, "foo://bar.example.com:443", "example.com",
1635  {GEN_URI, "foo://bar.example.com/whatever", "example.com",
1637  {GEN_URI, "foo://bar.example.com", "xample.com",
1639  {GEN_URI, "foo://bar.example.com:443", "xample.com",
1641  {GEN_URI, "foo://bar.example.com/whatever", "xample.com",
1643  {GEN_URI, "foo://example.com", "some-other-name.example",
1645  {GEN_URI, "foo://example.com:443", "some-other-name.example",
1647  {GEN_URI, "foo://example.com/whatever", "some-other-name.example",
1649  // A leading dot allows components to be added.
1650  {GEN_URI, "foo://example.com", ".example.com",
1652  {GEN_URI, "foo://example.com:443", ".example.com",
1654  {GEN_URI, "foo://example.com/whatever", ".example.com",
1656  {GEN_URI, "foo://bar.example.com", ".example.com", X509_V_OK},
1657  {GEN_URI, "foo://bar.example.com:443", ".example.com", X509_V_OK},
1658  {GEN_URI, "foo://bar.example.com/whatever", ".example.com", X509_V_OK},
1659  {GEN_URI, "foo://example.com", ".some-other-name.example",
1661  {GEN_URI, "foo://example.com:443", ".some-other-name.example",
1663  {GEN_URI, "foo://example.com/whatever", ".some-other-name.example",
1665  {GEN_URI, "foo://example.com", ".xample.com",
1667  {GEN_URI, "foo://example.com:443", ".xample.com",
1669  {GEN_URI, "foo://example.com/whatever", ".xample.com",
1671  };
1672  for (const auto &t : kTests) {
1673  SCOPED_TRACE(t.type);
1674  SCOPED_TRACE(t.name);
1675  SCOPED_TRACE(t.constraint);
1676 
1677  bssl::UniquePtr<GENERAL_NAME> name = MakeGeneralName(t.type, t.name);
1678  ASSERT_TRUE(name);
1679  bssl::UniquePtr<GENERAL_NAMES> names(GENERAL_NAMES_new());
1680  ASSERT_TRUE(names);
1682 
1683  bssl::UniquePtr<NAME_CONSTRAINTS> nc(NAME_CONSTRAINTS_new());
1684  ASSERT_TRUE(nc);
1685  nc->permittedSubtrees = sk_GENERAL_SUBTREE_new_null();
1686  ASSERT_TRUE(nc->permittedSubtrees);
1687  bssl::UniquePtr<GENERAL_SUBTREE> subtree(GENERAL_SUBTREE_new());
1688  ASSERT_TRUE(subtree);
1689  GENERAL_NAME_free(subtree->base);
1690  subtree->base = MakeGeneralName(t.type, t.constraint).release();
1691  ASSERT_TRUE(subtree->base);
1692  ASSERT_TRUE(bssl::PushToStack(nc->permittedSubtrees, std::move(subtree)));
1693 
1694  bssl::UniquePtr<X509> root =
1695  MakeTestCert("Root", "Root", key.get(), /*is_ca=*/true);
1696  ASSERT_TRUE(root);
1698  /*crit=*/1, /*flags=*/0));
1699  ASSERT_TRUE(X509_sign(root.get(), key.get(), EVP_sha256()));
1700 
1701  bssl::UniquePtr<X509> leaf =
1702  MakeTestCert("Root", "Leaf", key.get(), /*is_ca=*/false);
1703  ASSERT_TRUE(leaf);
1705  /*crit=*/0, /*flags=*/0));
1706  ASSERT_TRUE(X509_sign(leaf.get(), key.get(), EVP_sha256()));
1707 
1708  int ret = Verify(leaf.get(), {root.get()}, {}, {}, 0);
1710  }
1711 }
1712 
1713 TEST(X509Test, PrintGeneralName) {
1714  // TODO(https://crbug.com/boringssl/430): Add more tests. Also fix the
1715  // external projects that use this to extract the SAN list and unexport.
1716  bssl::UniquePtr<GENERAL_NAME> gen = MakeGeneralName(GEN_DNS, "example.com");
1717  ASSERT_TRUE(gen);
1719  i2v_GENERAL_NAME(nullptr, gen.get(), nullptr));
1721  ASSERT_EQ(1u, sk_CONF_VALUE_num(values.get()));
1722  const CONF_VALUE *value = sk_CONF_VALUE_value(values.get(), 0);
1723  EXPECT_STREQ(value->name, "DNS");
1724  EXPECT_STREQ(value->value, "example.com");
1725 }
1726 
1727 TEST(X509Test, TestPSS) {
1728  bssl::UniquePtr<X509> cert(CertFromPEM(kExamplePSSCert));
1729  ASSERT_TRUE(cert);
1730 
1731  bssl::UniquePtr<EVP_PKEY> pkey(X509_get_pubkey(cert.get()));
1732  ASSERT_TRUE(pkey);
1733 
1734  ASSERT_TRUE(X509_verify(cert.get(), pkey.get()));
1735 }
1736 
1737 TEST(X509Test, TestPSSBadParameters) {
1738  bssl::UniquePtr<X509> cert(CertFromPEM(kBadPSSCertPEM));
1739  ASSERT_TRUE(cert);
1740 
1741  bssl::UniquePtr<EVP_PKEY> pkey(X509_get_pubkey(cert.get()));
1742  ASSERT_TRUE(pkey);
1743 
1744  ASSERT_FALSE(X509_verify(cert.get(), pkey.get()));
1745  ERR_clear_error();
1746 }
1747 
1748 TEST(X509Test, TestEd25519) {
1749  bssl::UniquePtr<X509> cert(CertFromPEM(kEd25519Cert));
1750  ASSERT_TRUE(cert);
1751 
1752  bssl::UniquePtr<EVP_PKEY> pkey(X509_get_pubkey(cert.get()));
1753  ASSERT_TRUE(pkey);
1754 
1755  ASSERT_TRUE(X509_verify(cert.get(), pkey.get()));
1756 }
1757 
1758 TEST(X509Test, TestEd25519BadParameters) {
1759  bssl::UniquePtr<X509> cert(CertFromPEM(kEd25519CertNull));
1760  ASSERT_TRUE(cert);
1761 
1762  bssl::UniquePtr<EVP_PKEY> pkey(X509_get_pubkey(cert.get()));
1763  ASSERT_TRUE(pkey);
1764 
1765  ASSERT_FALSE(X509_verify(cert.get(), pkey.get()));
1766 
1770  ERR_clear_error();
1771 }
1772 
1773 TEST(X509Test, TestX25519) {
1774  bssl::UniquePtr<X509> cert(CertFromPEM(kX25519Cert));
1775  ASSERT_TRUE(cert);
1776 
1777  bssl::UniquePtr<EVP_PKEY> pkey(X509_get_pubkey(cert.get()));
1778  ASSERT_TRUE(pkey);
1779 
1780  EXPECT_EQ(EVP_PKEY_id(pkey.get()), EVP_PKEY_X25519);
1781 
1782  constexpr uint8_t kExpectedPublicValue[] = {
1783  0x85, 0x20, 0xf0, 0x09, 0x89, 0x30, 0xa7, 0x54, 0x74, 0x8b, 0x7d,
1784  0xdc, 0xb4, 0x3e, 0xf7, 0x5a, 0x0d, 0xbf, 0x3a, 0x0d, 0x26, 0x38,
1785  0x1a, 0xf4, 0xeb, 0xa4, 0xa9, 0x8e, 0xaa, 0x9b, 0x4e, 0x6a,
1786  };
1787  uint8_t public_value[sizeof(kExpectedPublicValue)];
1788  size_t public_value_size = sizeof(public_value);
1789  ASSERT_TRUE(EVP_PKEY_get_raw_public_key(pkey.get(), public_value,
1790  &public_value_size));
1791  EXPECT_EQ(Bytes(kExpectedPublicValue),
1792  Bytes(public_value, public_value_size));
1793 }
1794 
1795 static bssl::UniquePtr<X509> ReencodeCertificate(X509 *cert) {
1796  uint8_t *der = nullptr;
1797  int len = i2d_X509(cert, &der);
1798  bssl::UniquePtr<uint8_t> free_der(der);
1799  if (len <= 0) {
1800  return nullptr;
1801  }
1802 
1803  const uint8_t *inp = der;
1804  return bssl::UniquePtr<X509>(d2i_X509(nullptr, &inp, len));
1805 }
1806 
1807 static bool SignatureRoundTrips(EVP_MD_CTX *md_ctx, EVP_PKEY *pkey) {
1808  // Make a certificate like signed with |md_ctx|'s settings.'
1809  bssl::UniquePtr<X509> cert(CertFromPEM(kLeafPEM));
1810  if (!cert || !X509_sign_ctx(cert.get(), md_ctx)) {
1811  return false;
1812  }
1813 
1814  // Ensure that |pkey| may still be used to verify the resulting signature. All
1815  // settings in |md_ctx| must have been serialized appropriately.
1816  if (!X509_verify(cert.get(), pkey)) {
1817  return false;
1818  }
1819 
1820  // Re-encode the certificate. X509 objects contain a cached TBSCertificate
1821  // encoding and |X509_sign_ctx| should have refreshed that cache.
1822  bssl::UniquePtr<X509> copy = ReencodeCertificate(cert.get());
1823  return copy && X509_verify(copy.get(), pkey);
1824 }
1825 
1826 TEST(X509Test, RSASign) {
1827  bssl::UniquePtr<EVP_PKEY> pkey(PrivateKeyFromPEM(kRSAKey));
1828  ASSERT_TRUE(pkey);
1829  // Test PKCS#1 v1.5.
1830  bssl::ScopedEVP_MD_CTX md_ctx;
1831  ASSERT_TRUE(
1832  EVP_DigestSignInit(md_ctx.get(), NULL, EVP_sha256(), NULL, pkey.get()));
1833  ASSERT_TRUE(SignatureRoundTrips(md_ctx.get(), pkey.get()));
1834 
1835  // Test RSA-PSS with custom parameters.
1836  md_ctx.Reset();
1837  EVP_PKEY_CTX *pkey_ctx;
1838  ASSERT_TRUE(EVP_DigestSignInit(md_ctx.get(), &pkey_ctx, EVP_sha256(), NULL,
1839  pkey.get()));
1842  ASSERT_TRUE(SignatureRoundTrips(md_ctx.get(), pkey.get()));
1843 
1844  // RSA-PSS with salt length matching hash length should work when passing in
1845  // -1 or the value explicitly.
1846  md_ctx.Reset();
1847  ASSERT_TRUE(EVP_DigestSignInit(md_ctx.get(), &pkey_ctx, EVP_sha256(), NULL,
1848  pkey.get()));
1851  ASSERT_TRUE(SignatureRoundTrips(md_ctx.get(), pkey.get()));
1852 
1853  md_ctx.Reset();
1854  ASSERT_TRUE(EVP_DigestSignInit(md_ctx.get(), &pkey_ctx, EVP_sha256(), NULL,
1855  pkey.get()));
1858  ASSERT_TRUE(SignatureRoundTrips(md_ctx.get(), pkey.get()));
1859 }
1860 
1861 // Test the APIs for manually signing a certificate.
1862 TEST(X509Test, RSASignManual) {
1863  const int kSignatureNID = NID_sha384WithRSAEncryption;
1864  const EVP_MD *kSignatureHash = EVP_sha384();
1865 
1866  bssl::UniquePtr<EVP_PKEY> pkey(PrivateKeyFromPEM(kRSAKey));
1867  ASSERT_TRUE(pkey);
1868  bssl::UniquePtr<X509_ALGOR> algor(X509_ALGOR_new());
1869  ASSERT_TRUE(algor);
1870  ASSERT_TRUE(X509_ALGOR_set0(algor.get(), OBJ_nid2obj(kSignatureNID),
1871  V_ASN1_NULL, nullptr));
1872 
1873  // Test certificates made both from other certificates and |X509_new|, in case
1874  // there are bugs in filling in fields from different states. (Parsed
1875  // certificate contain a TBSCertificate cache, and |X509_new| initializes
1876  // fields based on complex ASN.1 template logic.)
1877  for (bool new_cert : {true, false}) {
1878  SCOPED_TRACE(new_cert);
1879 
1880  bssl::UniquePtr<X509> cert;
1881  if (new_cert) {
1882  cert.reset(X509_new());
1883  // Fill in some fields for the certificate arbitrarily.
1887  EXPECT_TRUE(
1888  X509_gmtime_adj(X509_getm_notAfter(cert.get()), 60 * 60 * 24));
1889  X509_NAME *subject = X509_get_subject_name(cert.get());
1891  reinterpret_cast<const uint8_t *>("Test"), -1,
1892  -1, 0);
1893  EXPECT_TRUE(X509_set_issuer_name(cert.get(), subject));
1894  EXPECT_TRUE(X509_set_pubkey(cert.get(), pkey.get()));
1895  } else {
1896  // Extract fields from a parsed certificate.
1897  cert = CertFromPEM(kLeafPEM);
1898  ASSERT_TRUE(cert);
1899 
1900  // We should test with a different algorithm from what is already in the
1901  // certificate.
1902  EXPECT_NE(kSignatureNID, X509_get_signature_nid(cert.get()));
1903  }
1904 
1905  // Fill in the signature algorithm.
1906  ASSERT_TRUE(X509_set1_signature_algo(cert.get(), algor.get()));
1907 
1908  // Extract the TBSCertificiate.
1909  uint8_t *tbs_cert = nullptr;
1910  int tbs_cert_len = i2d_re_X509_tbs(cert.get(), &tbs_cert);
1911  bssl::UniquePtr<uint8_t> free_tbs_cert(tbs_cert);
1912  ASSERT_GT(tbs_cert_len, 0);
1913 
1914  // Generate a signature externally and fill it in.
1915  bssl::ScopedEVP_MD_CTX md_ctx;
1916  ASSERT_TRUE(EVP_DigestSignInit(md_ctx.get(), nullptr, kSignatureHash,
1917  nullptr, pkey.get()));
1918  size_t sig_len;
1919  ASSERT_TRUE(EVP_DigestSign(md_ctx.get(), nullptr, &sig_len, tbs_cert,
1920  tbs_cert_len));
1921  std::vector<uint8_t> sig(sig_len);
1922  ASSERT_TRUE(EVP_DigestSign(md_ctx.get(), sig.data(), &sig_len, tbs_cert,
1923  tbs_cert_len));
1924  sig.resize(sig_len);
1925  ASSERT_TRUE(X509_set1_signature_value(cert.get(), sig.data(), sig.size()));
1926 
1927  // Check the signature.
1928  EXPECT_TRUE(X509_verify(cert.get(), pkey.get()));
1929 
1930  // Re-encode the certificate. X509 objects contain a cached TBSCertificate
1931  // encoding and |i2d_re_X509_tbs| should have refreshed that cache.
1932  bssl::UniquePtr<X509> copy = ReencodeCertificate(cert.get());
1933  ASSERT_TRUE(copy);
1934  EXPECT_TRUE(X509_verify(copy.get(), pkey.get()));
1935  }
1936 }
1937 
1938 TEST(X509Test, Ed25519Sign) {
1939  uint8_t pub_bytes[32], priv_bytes[64];
1940  ED25519_keypair(pub_bytes, priv_bytes);
1941 
1942  bssl::UniquePtr<EVP_PKEY> pub(
1943  EVP_PKEY_new_raw_public_key(EVP_PKEY_ED25519, nullptr, pub_bytes, 32));
1944  ASSERT_TRUE(pub);
1945  bssl::UniquePtr<EVP_PKEY> priv(
1946  EVP_PKEY_new_raw_private_key(EVP_PKEY_ED25519, nullptr, priv_bytes, 32));
1947  ASSERT_TRUE(priv);
1948 
1949  bssl::ScopedEVP_MD_CTX md_ctx;
1950  ASSERT_TRUE(
1951  EVP_DigestSignInit(md_ctx.get(), nullptr, nullptr, nullptr, priv.get()));
1952  ASSERT_TRUE(SignatureRoundTrips(md_ctx.get(), pub.get()));
1953 }
1954 
1955 static bool PEMToDER(bssl::UniquePtr<uint8_t> *out, size_t *out_len,
1956  const char *pem) {
1957  bssl::UniquePtr<BIO> bio(BIO_new_mem_buf(pem, strlen(pem)));
1958  if (!bio) {
1959  return false;
1960  }
1961 
1962  char *name, *header;
1963  uint8_t *data;
1964  long data_len;
1965  if (!PEM_read_bio(bio.get(), &name, &header, &data, &data_len)) {
1966  fprintf(stderr, "failed to read PEM data.\n");
1967  return false;
1968  }
1969  OPENSSL_free(name);
1971 
1972  out->reset(data);
1973  *out_len = data_len;
1974 
1975  return true;
1976 }
1977 
1978 TEST(X509Test, TestFromBuffer) {
1979  size_t data_len;
1980  bssl::UniquePtr<uint8_t> data;
1981  ASSERT_TRUE(PEMToDER(&data, &data_len, kRootCAPEM));
1982 
1983  bssl::UniquePtr<CRYPTO_BUFFER> buf(
1984  CRYPTO_BUFFER_new(data.get(), data_len, nullptr));
1985  ASSERT_TRUE(buf);
1986  bssl::UniquePtr<X509> root(X509_parse_from_buffer(buf.get()));
1987  ASSERT_TRUE(root);
1988 
1989  const uint8_t *enc_pointer = root->cert_info->enc.enc;
1990  const uint8_t *buf_pointer = CRYPTO_BUFFER_data(buf.get());
1991  ASSERT_GE(enc_pointer, buf_pointer);
1992  ASSERT_LT(enc_pointer, buf_pointer + CRYPTO_BUFFER_len(buf.get()));
1993  buf.reset();
1994 
1995  /* This ensures the X509 took a reference to |buf|, otherwise this will be a
1996  * reference to free memory and ASAN should notice. */
1997  ASSERT_EQ(0x30, enc_pointer[0]);
1998 }
1999 
2000 TEST(X509Test, TestFromBufferWithTrailingData) {
2001  size_t data_len;
2002  bssl::UniquePtr<uint8_t> data;
2003  ASSERT_TRUE(PEMToDER(&data, &data_len, kRootCAPEM));
2004 
2005  std::unique_ptr<uint8_t[]> trailing_data(new uint8_t[data_len + 1]);
2006  OPENSSL_memcpy(trailing_data.get(), data.get(), data_len);
2007 
2008  bssl::UniquePtr<CRYPTO_BUFFER> buf_trailing_data(
2009  CRYPTO_BUFFER_new(trailing_data.get(), data_len + 1, nullptr));
2010  ASSERT_TRUE(buf_trailing_data);
2011 
2012  bssl::UniquePtr<X509> root_trailing_data(
2013  X509_parse_from_buffer(buf_trailing_data.get()));
2014  ASSERT_FALSE(root_trailing_data);
2015 }
2016 
2017 TEST(X509Test, TestFromBufferModified) {
2018  size_t data_len;
2019  bssl::UniquePtr<uint8_t> data;
2020  ASSERT_TRUE(PEMToDER(&data, &data_len, kRootCAPEM));
2021 
2022  bssl::UniquePtr<CRYPTO_BUFFER> buf(
2023  CRYPTO_BUFFER_new(data.get(), data_len, nullptr));
2024  ASSERT_TRUE(buf);
2025 
2026  bssl::UniquePtr<X509> root(X509_parse_from_buffer(buf.get()));
2027  ASSERT_TRUE(root);
2028 
2029  bssl::UniquePtr<ASN1_INTEGER> fourty_two(ASN1_INTEGER_new());
2030  ASN1_INTEGER_set(fourty_two.get(), 42);
2031  X509_set_serialNumber(root.get(), fourty_two.get());
2032 
2033  ASSERT_EQ(static_cast<long>(data_len), i2d_X509(root.get(), nullptr));
2034 
2035  // Re-encode the TBSCertificate.
2036  i2d_re_X509_tbs(root.get(), nullptr);
2037 
2038  ASSERT_NE(static_cast<long>(data_len), i2d_X509(root.get(), nullptr));
2039 }
2040 
2041 TEST(X509Test, TestFromBufferReused) {
2042  size_t data_len;
2043  bssl::UniquePtr<uint8_t> data;
2044  ASSERT_TRUE(PEMToDER(&data, &data_len, kRootCAPEM));
2045 
2046  bssl::UniquePtr<CRYPTO_BUFFER> buf(
2047  CRYPTO_BUFFER_new(data.get(), data_len, nullptr));
2048  ASSERT_TRUE(buf);
2049 
2050  bssl::UniquePtr<X509> root(X509_parse_from_buffer(buf.get()));
2051  ASSERT_TRUE(root);
2052 
2053  size_t data2_len;
2054  bssl::UniquePtr<uint8_t> data2;
2055  ASSERT_TRUE(PEMToDER(&data2, &data2_len, kLeafPEM));
2056 
2057  X509 *x509p = root.get();
2058  const uint8_t *inp = data2.get();
2059  X509 *ret = d2i_X509(&x509p, &inp, data2_len);
2060  ASSERT_EQ(root.get(), ret);
2061  ASSERT_EQ(nullptr, root->buf);
2062 
2063  // Free |data2| and ensure that |root| took its own copy. Otherwise the
2064  // following will trigger a use-after-free.
2065  data2.reset();
2066 
2067  uint8_t *i2d = nullptr;
2068  int i2d_len = i2d_X509(root.get(), &i2d);
2069  ASSERT_GE(i2d_len, 0);
2070  bssl::UniquePtr<uint8_t> i2d_storage(i2d);
2071 
2072  ASSERT_TRUE(PEMToDER(&data2, &data2_len, kLeafPEM));
2073 
2074  ASSERT_EQ(static_cast<long>(data2_len), i2d_len);
2075  ASSERT_EQ(0, OPENSSL_memcmp(data2.get(), i2d, i2d_len));
2076  ASSERT_EQ(nullptr, root->buf);
2077 }
2078 
2079 TEST(X509Test, TestFailedParseFromBuffer) {
2080  static const uint8_t kNonsense[] = {1, 2, 3, 4, 5};
2081 
2082  bssl::UniquePtr<CRYPTO_BUFFER> buf(
2083  CRYPTO_BUFFER_new(kNonsense, sizeof(kNonsense), nullptr));
2084  ASSERT_TRUE(buf);
2085 
2086  bssl::UniquePtr<X509> cert(X509_parse_from_buffer(buf.get()));
2087  ASSERT_FALSE(cert);
2088  ERR_clear_error();
2089 
2090  // Test a buffer with trailing data.
2091  size_t data_len;
2092  bssl::UniquePtr<uint8_t> data;
2093  ASSERT_TRUE(PEMToDER(&data, &data_len, kRootCAPEM));
2094 
2095  std::unique_ptr<uint8_t[]> data_with_trailing_byte(new uint8_t[data_len + 1]);
2096  OPENSSL_memcpy(data_with_trailing_byte.get(), data.get(), data_len);
2097  data_with_trailing_byte[data_len] = 0;
2098 
2099  bssl::UniquePtr<CRYPTO_BUFFER> buf_with_trailing_byte(
2100  CRYPTO_BUFFER_new(data_with_trailing_byte.get(), data_len + 1, nullptr));
2101  ASSERT_TRUE(buf_with_trailing_byte);
2102 
2103  bssl::UniquePtr<X509> root(
2104  X509_parse_from_buffer(buf_with_trailing_byte.get()));
2105  ASSERT_FALSE(root);
2106  ERR_clear_error();
2107 }
2108 
2109 TEST(X509Test, TestPrintUTCTIME) {
2110  static const struct {
2111  const char *val, *want;
2112  } asn1_utctime_tests[] = {
2113  {"", "Bad time value"},
2114 
2115  // Correct RFC 5280 form. Test years < 2000 and > 2000.
2116  {"090303125425Z", "Mar 3 12:54:25 2009 GMT"},
2117  {"900303125425Z", "Mar 3 12:54:25 1990 GMT"},
2118  {"000303125425Z", "Mar 3 12:54:25 2000 GMT"},
2119 
2120  // Correct form, bad values.
2121  {"000000000000Z", "Bad time value"},
2122  {"999999999999Z", "Bad time value"},
2123 
2124  // Missing components. Not legal RFC 5280, but permitted.
2125  {"090303125425", "Mar 3 12:54:25 2009"},
2126  {"9003031254", "Mar 3 12:54:00 1990"},
2127  {"9003031254Z", "Mar 3 12:54:00 1990 GMT"},
2128 
2129  // GENERALIZEDTIME confused for UTCTIME.
2130  {"20090303125425Z", "Bad time value"},
2131 
2132  // Legal ASN.1, but not legal RFC 5280.
2133  {"9003031254+0800", "Bad time value"},
2134  {"9003031254-0800", "Bad time value"},
2135 
2136  // Trailing garbage.
2137  {"9003031254Z ", "Bad time value"},
2138  };
2139 
2140  for (auto t : asn1_utctime_tests) {
2141  SCOPED_TRACE(t.val);
2142  bssl::UniquePtr<ASN1_UTCTIME> tm(ASN1_UTCTIME_new());
2143  bssl::UniquePtr<BIO> bio(BIO_new(BIO_s_mem()));
2144 
2145  // Use this instead of ASN1_UTCTIME_set() because some callers get
2146  // type-confused and pass ASN1_GENERALIZEDTIME to ASN1_UTCTIME_print().
2147  // ASN1_UTCTIME_set_string() is stricter, and would reject the inputs in
2148  // question.
2149  ASSERT_TRUE(ASN1_STRING_set(tm.get(), t.val, strlen(t.val)));
2150  const int ok = ASN1_UTCTIME_print(bio.get(), tm.get());
2151 
2152  const uint8_t *contents;
2153  size_t len;
2154  ASSERT_TRUE(BIO_mem_contents(bio.get(), &contents, &len));
2155  EXPECT_EQ(ok, (strcmp(t.want, "Bad time value") != 0) ? 1 : 0);
2156  EXPECT_EQ(t.want,
2157  std::string(reinterpret_cast<const char *>(contents), len));
2158  }
2159 }
2160 
2161 TEST(X509Test, PrettyPrintIntegers) {
2162  static const char *kTests[] = {
2163  // Small numbers are pretty-printed in decimal.
2164  "0",
2165  "-1",
2166  "1",
2167  "42",
2168  "-42",
2169  "256",
2170  "-256",
2171  // Large numbers are pretty-printed in hex to avoid taking quadratic time.
2172  "0x0123456789",
2173  "-0x0123456789",
2174  };
2175  for (const char *in : kTests) {
2176  SCOPED_TRACE(in);
2177  BIGNUM *bn = nullptr;
2178  ASSERT_TRUE(BN_asc2bn(&bn, in));
2179  bssl::UniquePtr<BIGNUM> free_bn(bn);
2180 
2181  {
2182  bssl::UniquePtr<ASN1_INTEGER> asn1(BN_to_ASN1_INTEGER(bn, nullptr));
2183  ASSERT_TRUE(asn1);
2184  bssl::UniquePtr<char> out(i2s_ASN1_INTEGER(nullptr, asn1.get()));
2185  ASSERT_TRUE(out.get());
2186  EXPECT_STREQ(in, out.get());
2187  }
2188 
2189  {
2190  bssl::UniquePtr<ASN1_ENUMERATED> asn1(BN_to_ASN1_ENUMERATED(bn, nullptr));
2191  ASSERT_TRUE(asn1);
2192  bssl::UniquePtr<char> out(i2s_ASN1_ENUMERATED(nullptr, asn1.get()));
2193  ASSERT_TRUE(out.get());
2194  EXPECT_STREQ(in, out.get());
2195  }
2196  }
2197 }
2198 
2199 TEST(X509Test, X509NameSet) {
2200  bssl::UniquePtr<X509_NAME> name(X509_NAME_new());
2202  name.get(), "C", MBSTRING_ASC, reinterpret_cast<const uint8_t *>("US"),
2203  -1, -1, 0));
2206  name.get(), "C", MBSTRING_ASC, reinterpret_cast<const uint8_t *>("CA"),
2207  -1, -1, 0));
2210  name.get(), "C", MBSTRING_ASC, reinterpret_cast<const uint8_t *>("UK"),
2211  -1, -1, 0));
2214  name.get(), "C", MBSTRING_ASC, reinterpret_cast<const uint8_t *>("JP"),
2215  -1, 1, 0));
2217 
2218  // Check that the correct entries get incremented when inserting new entry.
2221 }
2222 
2223 TEST(X509Test, NoBasicConstraintsCertSign) {
2224  bssl::UniquePtr<X509> root(CertFromPEM(kSANTypesRoot));
2225  bssl::UniquePtr<X509> intermediate(
2227  bssl::UniquePtr<X509> leaf(CertFromPEM(kNoBasicConstraintsCertSignLeaf));
2228 
2229  ASSERT_TRUE(root);
2230  ASSERT_TRUE(intermediate);
2231  ASSERT_TRUE(leaf);
2232 
2233  // The intermediate has keyUsage certSign, but is not marked as a CA in the
2234  // basicConstraints.
2236  Verify(leaf.get(), {root.get()}, {intermediate.get()}, {}, 0));
2237 }
2238 
2239 TEST(X509Test, NoBasicConstraintsNetscapeCA) {
2240  bssl::UniquePtr<X509> root(CertFromPEM(kSANTypesRoot));
2241  bssl::UniquePtr<X509> intermediate(
2243  bssl::UniquePtr<X509> leaf(CertFromPEM(kNoBasicConstraintsNetscapeCALeaf));
2244 
2245  ASSERT_TRUE(root);
2246  ASSERT_TRUE(intermediate);
2247  ASSERT_TRUE(leaf);
2248 
2249  // The intermediate has a Netscape certificate type of "SSL CA", but is not
2250  // marked as a CA in the basicConstraints.
2252  Verify(leaf.get(), {root.get()}, {intermediate.get()}, {}, 0));
2253 }
2254 
2255 TEST(X509Test, MismatchAlgorithms) {
2256  bssl::UniquePtr<X509> cert(CertFromPEM(kSelfSignedMismatchAlgorithms));
2257  ASSERT_TRUE(cert);
2258 
2259  bssl::UniquePtr<EVP_PKEY> pkey(X509_get_pubkey(cert.get()));
2260  ASSERT_TRUE(pkey);
2261 
2262  EXPECT_FALSE(X509_verify(cert.get(), pkey.get()));
2266 }
2267 
2268 TEST(X509Test, PEMX509Info) {
2269  std::string cert = kRootCAPEM;
2270  auto cert_obj = CertFromPEM(kRootCAPEM);
2271  ASSERT_TRUE(cert_obj);
2272 
2273  std::string rsa = kRSAKey;
2274  auto rsa_obj = PrivateKeyFromPEM(kRSAKey);
2275  ASSERT_TRUE(rsa_obj);
2276 
2277  std::string crl = kBasicCRL;
2278  auto crl_obj = CRLFromPEM(kBasicCRL);
2279  ASSERT_TRUE(crl_obj);
2280 
2281  std::string unknown =
2282  "-----BEGIN UNKNOWN-----\n"
2283  "AAAA\n"
2284  "-----END UNKNOWN-----\n";
2285 
2287  "-----BEGIN CERTIFICATE-----\n"
2288  "AAAA\n"
2289  "-----END CERTIFICATE-----\n";
2290 
2291  // Each X509_INFO contains at most one certificate, CRL, etc. The format
2292  // creates a new X509_INFO when a repeated type is seen.
2293  std::string pem =
2294  // The first few entries have one of everything in different orders.
2295  cert + rsa + crl +
2296  rsa + crl + cert +
2297  // Unknown types are ignored.
2298  crl + unknown + cert + rsa +
2299  // Seeing a new certificate starts a new entry, so now we have a bunch of
2300  // certificate-only entries.
2301  cert + cert + cert +
2302  // The key folds into the certificate's entry.
2303  cert + rsa +
2304  // Doubled keys also start new entries.
2305  rsa + rsa + rsa + rsa + crl +
2306  // As do CRLs.
2307  crl + crl;
2308 
2309  const struct ExpectedInfo {
2310  const X509 *cert;
2311  const EVP_PKEY *key;
2312  const X509_CRL *crl;
2313  } kExpected[] = {
2314  {cert_obj.get(), rsa_obj.get(), crl_obj.get()},
2315  {cert_obj.get(), rsa_obj.get(), crl_obj.get()},
2316  {cert_obj.get(), rsa_obj.get(), crl_obj.get()},
2317  {cert_obj.get(), nullptr, nullptr},
2318  {cert_obj.get(), nullptr, nullptr},
2319  {cert_obj.get(), nullptr, nullptr},
2320  {cert_obj.get(), rsa_obj.get(), nullptr},
2321  {nullptr, rsa_obj.get(), nullptr},
2322  {nullptr, rsa_obj.get(), nullptr},
2323  {nullptr, rsa_obj.get(), nullptr},
2324  {nullptr, rsa_obj.get(), crl_obj.get()},
2325  {nullptr, nullptr, crl_obj.get()},
2326  {nullptr, nullptr, crl_obj.get()},
2327  };
2328 
2329  auto check_info = [](const ExpectedInfo *expected, const X509_INFO *info) {
2330  if (expected->cert != nullptr) {
2331  EXPECT_EQ(0, X509_cmp(expected->cert, info->x509));
2332  } else {
2333  EXPECT_EQ(nullptr, info->x509);
2334  }
2335  if (expected->crl != nullptr) {
2336  EXPECT_EQ(0, X509_CRL_cmp(expected->crl, info->crl));
2337  } else {
2338  EXPECT_EQ(nullptr, info->crl);
2339  }
2340  if (expected->key != nullptr) {
2341  ASSERT_NE(nullptr, info->x_pkey);
2342  // EVP_PKEY_cmp returns one if the keys are equal.
2343  EXPECT_EQ(1, EVP_PKEY_cmp(expected->key, info->x_pkey->dec_pkey));
2344  } else {
2345  EXPECT_EQ(nullptr, info->x_pkey);
2346  }
2347  };
2348 
2349  bssl::UniquePtr<BIO> bio(BIO_new_mem_buf(pem.data(), pem.size()));
2350  ASSERT_TRUE(bio);
2352  PEM_X509_INFO_read_bio(bio.get(), nullptr, nullptr, nullptr));
2353  ASSERT_TRUE(infos);
2354  ASSERT_EQ(OPENSSL_ARRAY_SIZE(kExpected), sk_X509_INFO_num(infos.get()));
2355  for (size_t i = 0; i < OPENSSL_ARRAY_SIZE(kExpected); i++) {
2356  SCOPED_TRACE(i);
2357  check_info(&kExpected[i], sk_X509_INFO_value(infos.get(), i));
2358  }
2359 
2360  // Passing an existing stack appends to it.
2361  bio.reset(BIO_new_mem_buf(pem.data(), pem.size()));
2362  ASSERT_TRUE(bio);
2363  ASSERT_EQ(infos.get(),
2364  PEM_X509_INFO_read_bio(bio.get(), infos.get(), nullptr, nullptr));
2365  ASSERT_EQ(2 * OPENSSL_ARRAY_SIZE(kExpected), sk_X509_INFO_num(infos.get()));
2366  for (size_t i = 0; i < OPENSSL_ARRAY_SIZE(kExpected); i++) {
2367  SCOPED_TRACE(i);
2368  check_info(&kExpected[i], sk_X509_INFO_value(infos.get(), i));
2369  check_info(
2370  &kExpected[i],
2371  sk_X509_INFO_value(infos.get(), i + OPENSSL_ARRAY_SIZE(kExpected)));
2372  }
2373 
2374  // Gracefully handle errors in both the append and fresh cases.
2375  std::string bad_pem = cert + cert + invalid;
2376 
2377  bio.reset(BIO_new_mem_buf(bad_pem.data(), bad_pem.size()));
2378  ASSERT_TRUE(bio);
2380  PEM_X509_INFO_read_bio(bio.get(), nullptr, nullptr, nullptr));
2381  EXPECT_FALSE(infos2);
2382 
2383  bio.reset(BIO_new_mem_buf(bad_pem.data(), bad_pem.size()));
2384  ASSERT_TRUE(bio);
2385  EXPECT_FALSE(
2386  PEM_X509_INFO_read_bio(bio.get(), infos.get(), nullptr, nullptr));
2387  EXPECT_EQ(2 * OPENSSL_ARRAY_SIZE(kExpected), sk_X509_INFO_num(infos.get()));
2388 }
2389 
2390 TEST(X509Test, ReadBIOEmpty) {
2391  bssl::UniquePtr<BIO> bio(BIO_new_mem_buf(nullptr, 0));
2392  ASSERT_TRUE(bio);
2393 
2394  // CPython expects |ASN1_R_HEADER_TOO_LONG| on EOF, to terminate a series of
2395  // certificates.
2396  bssl::UniquePtr<X509> x509(d2i_X509_bio(bio.get(), nullptr));
2397  EXPECT_FALSE(x509);
2401 }
2402 
2403 TEST(X509Test, ReadBIOOneByte) {
2404  bssl::UniquePtr<BIO> bio(BIO_new_mem_buf("\x30", 1));
2405  ASSERT_TRUE(bio);
2406 
2407  // CPython expects |ASN1_R_HEADER_TOO_LONG| on EOF, to terminate a series of
2408  // certificates. This EOF appeared after some data, however, so we do not wish
2409  // to signal EOF.
2410  bssl::UniquePtr<X509> x509(d2i_X509_bio(bio.get(), nullptr));
2411  EXPECT_FALSE(x509);
2415 }
2416 
2417 TEST(X509Test, PartialBIOReturn) {
2418  // Create a filter BIO that only reads and writes one byte at a time.
2419  bssl::UniquePtr<BIO_METHOD> method(BIO_meth_new(0, nullptr));
2421  ASSERT_TRUE(BIO_meth_set_create(method.get(), [](BIO *b) -> int {
2422  BIO_set_init(b, 1);
2423  return 1;
2424  }));
2425  ASSERT_TRUE(
2426  BIO_meth_set_read(method.get(), [](BIO *b, char *out, int len) -> int {
2427  return BIO_read(BIO_next(b), out, std::min(len, 1));
2428  }));
2430  method.get(), [](BIO *b, const char *in, int len) -> int {
2431  return BIO_write(BIO_next(b), in, std::min(len, 1));
2432  }));
2433 
2434  bssl::UniquePtr<BIO> bio(BIO_new(method.get()));
2435  ASSERT_TRUE(bio);
2436  BIO *mem_bio = BIO_new(BIO_s_mem());
2437  ASSERT_TRUE(mem_bio);
2438  BIO_push(bio.get(), mem_bio); // BIO_push takes ownership.
2439 
2440  bssl::UniquePtr<X509> cert(CertFromPEM(kLeafPEM));
2441  ASSERT_TRUE(cert);
2442  uint8_t *der = nullptr;
2443  int der_len = i2d_X509(cert.get(), &der);
2444  ASSERT_GT(der_len, 0);
2445  bssl::UniquePtr<uint8_t> free_der(der);
2446 
2447  // Write the certificate into the BIO. Though we only write one byte at a
2448  // time, the write should succeed.
2449  ASSERT_EQ(1, i2d_X509_bio(bio.get(), cert.get()));
2450  const uint8_t *der2;
2451  size_t der2_len;
2452  ASSERT_TRUE(BIO_mem_contents(mem_bio, &der2, &der2_len));
2453  EXPECT_EQ(Bytes(der, static_cast<size_t>(der_len)), Bytes(der2, der2_len));
2454 
2455  // Read the certificate back out of the BIO. Though we only read one byte at a
2456  // time, the read should succeed.
2457  bssl::UniquePtr<X509> cert2(d2i_X509_bio(bio.get(), nullptr));
2458  ASSERT_TRUE(cert2);
2459  EXPECT_EQ(0, X509_cmp(cert.get(), cert2.get()));
2460 }
2461 
2462 TEST(X509Test, CommonNameFallback) {
2463  bssl::UniquePtr<X509> root = CertFromPEM(kSANTypesRoot);
2464  ASSERT_TRUE(root);
2465  bssl::UniquePtr<X509> with_sans = CertFromPEM(kCommonNameWithSANs);
2466  ASSERT_TRUE(with_sans);
2467  bssl::UniquePtr<X509> without_sans = CertFromPEM(kCommonNameWithoutSANs);
2468  ASSERT_TRUE(without_sans);
2469  bssl::UniquePtr<X509> with_email = CertFromPEM(kCommonNameWithEmailSAN);
2470  ASSERT_TRUE(with_email);
2471  bssl::UniquePtr<X509> with_ip = CertFromPEM(kCommonNameWithIPSAN);
2472  ASSERT_TRUE(with_ip);
2473 
2474  auto verify_cert = [&](X509 *leaf, unsigned flags, const char *host) {
2475  return Verify(leaf, {root.get()}, {}, {}, 0, [&](X509_VERIFY_PARAM *param) {
2476  ASSERT_TRUE(X509_VERIFY_PARAM_set1_host(param, host, strlen(host)));
2478  });
2479  };
2480 
2481  // By default, the common name is ignored if the SAN list is present but
2482  // otherwise is checked.
2484  verify_cert(with_sans.get(), 0 /* no flags */, "foo.host1.test"));
2486  verify_cert(with_sans.get(), 0 /* no flags */, "foo.host2.test"));
2488  verify_cert(with_sans.get(), 0 /* no flags */, "foo.host3.test"));
2489  EXPECT_EQ(X509_V_OK, verify_cert(without_sans.get(), 0 /* no flags */,
2490  "foo.host1.test"));
2492  verify_cert(with_email.get(), 0 /* no flags */, "foo.host1.test"));
2494  verify_cert(with_ip.get(), 0 /* no flags */, "foo.host1.test"));
2495 
2496  // X509_CHECK_FLAG_ALWAYS_CHECK_SUBJECT is ignored.
2498  verify_cert(with_sans.get(), X509_CHECK_FLAG_ALWAYS_CHECK_SUBJECT,
2499  "foo.host1.test"));
2501  verify_cert(with_sans.get(), X509_CHECK_FLAG_ALWAYS_CHECK_SUBJECT,
2502  "foo.host2.test"));
2504  verify_cert(with_sans.get(), X509_CHECK_FLAG_ALWAYS_CHECK_SUBJECT,
2505  "foo.host3.test"));
2506  EXPECT_EQ(X509_V_OK, verify_cert(without_sans.get(),
2508  "foo.host1.test"));
2510  verify_cert(with_email.get(), X509_CHECK_FLAG_ALWAYS_CHECK_SUBJECT,
2511  "foo.host1.test"));
2513  verify_cert(with_ip.get(), X509_CHECK_FLAG_ALWAYS_CHECK_SUBJECT,
2514  "foo.host1.test"));
2515 
2516  // X509_CHECK_FLAG_NEVER_CHECK_SUBJECT implements the correct behavior: the
2517  // common name is never checked.
2519  verify_cert(with_sans.get(), X509_CHECK_FLAG_NEVER_CHECK_SUBJECT,
2520  "foo.host1.test"));
2522  verify_cert(with_sans.get(), X509_CHECK_FLAG_NEVER_CHECK_SUBJECT,
2523  "foo.host2.test"));
2525  verify_cert(with_sans.get(), X509_CHECK_FLAG_NEVER_CHECK_SUBJECT,
2526  "foo.host3.test"));
2528  verify_cert(without_sans.get(), X509_CHECK_FLAG_NEVER_CHECK_SUBJECT,
2529  "foo.host1.test"));
2531  verify_cert(with_email.get(), X509_CHECK_FLAG_NEVER_CHECK_SUBJECT,
2532  "foo.host1.test"));
2534  verify_cert(with_ip.get(), X509_CHECK_FLAG_NEVER_CHECK_SUBJECT,
2535  "foo.host1.test"));
2536 }
2537 
2538 TEST(X509Test, LooksLikeDNSName) {
2539  static const char *kValid[] = {
2540  "example.com",
2541  "eXample123-.com",
2542  "*.example.com",
2543  "exa_mple.com",
2544  "example.com.",
2545  "project-dev:us-central1:main",
2546  };
2547  static const char *kInvalid[] = {
2548  "-eXample123-.com",
2549  "",
2550  ".",
2551  "*",
2552  "*.",
2553  "example..com",
2554  ".example.com",
2555  "example.com..",
2556  "*foo.example.com",
2557  "foo.*.example.com",
2558  "foo,bar",
2559  };
2560 
2561  for (const char *str : kValid) {
2562  SCOPED_TRACE(str);
2564  reinterpret_cast<const uint8_t *>(str), strlen(str)));
2565  }
2566  for (const char *str : kInvalid) {
2567  SCOPED_TRACE(str);
2569  reinterpret_cast<const uint8_t *>(str), strlen(str)));
2570  }
2571 }
2572 
2573 TEST(X509Test, CommonNameAndNameConstraints) {
2574  bssl::UniquePtr<X509> root = CertFromPEM(kSANTypesRoot);
2575  ASSERT_TRUE(root);
2576  bssl::UniquePtr<X509> intermediate = CertFromPEM(kConstrainedIntermediate);
2577  ASSERT_TRUE(intermediate);
2578  bssl::UniquePtr<X509> permitted = CertFromPEM(kCommonNamePermittedLeaf);
2579  ASSERT_TRUE(permitted);
2580  bssl::UniquePtr<X509> not_permitted =
2582  ASSERT_TRUE(not_permitted);
2583  bssl::UniquePtr<X509> not_permitted_with_sans =
2585  ASSERT_TRUE(not_permitted_with_sans);
2586  bssl::UniquePtr<X509> not_dns = CertFromPEM(kCommonNameNotDNSLeaf);
2587  ASSERT_TRUE(not_dns);
2588 
2589  auto verify_cert = [&](X509 *leaf, unsigned flags, const char *host) {
2590  return Verify(
2591  leaf, {root.get()}, {intermediate.get()}, {}, 0,
2592  [&](X509_VERIFY_PARAM *param) {
2593  ASSERT_TRUE(X509_VERIFY_PARAM_set1_host(param, host, strlen(host)));
2595  });
2596  };
2597 
2598  // Certificates which would otherwise trigger the common name fallback are
2599  // rejected whenever there are name constraints. We do this whether or not
2600  // the common name matches the constraints.
2601  EXPECT_EQ(
2603  verify_cert(permitted.get(), 0 /* no flags */, kCommonNamePermitted));
2605  verify_cert(not_permitted.get(), 0 /* no flags */,
2607 
2608  // This occurs even if the built-in name checks aren't used. The caller may
2609  // separately call |X509_check_host|.
2611  Verify(not_permitted.get(), {root.get()}, {intermediate.get()}, {},
2612  0 /* no flags */, nullptr));
2613 
2614  // If the leaf certificate has SANs, the common name fallback is always
2615  // disabled, so the name constraints do not apply.
2616  EXPECT_EQ(X509_V_OK, Verify(not_permitted_with_sans.get(), {root.get()},
2617  {intermediate.get()}, {}, 0, nullptr));
2619  verify_cert(not_permitted_with_sans.get(), 0 /* no flags */,
2621 
2622  // If the common name does not look like a DNS name, we apply neither name
2623  // constraints nor common name fallback.
2624  EXPECT_EQ(X509_V_OK, Verify(not_dns.get(), {root.get()}, {intermediate.get()},
2625  {}, 0, nullptr));
2627  verify_cert(not_dns.get(), 0 /* no flags */, kCommonNameNotDNS));
2628 }
2629 
2630 TEST(X509Test, ServerGatedCryptoEKUs) {
2631  bssl::UniquePtr<X509> root = CertFromPEM(kSANTypesRoot);
2632  ASSERT_TRUE(root);
2633  bssl::UniquePtr<X509> ms_sgc = CertFromPEM(kMicrosoftSGCCert);
2634  ASSERT_TRUE(ms_sgc);
2635  bssl::UniquePtr<X509> ns_sgc = CertFromPEM(kNetscapeSGCCert);
2636  ASSERT_TRUE(ns_sgc);
2637  bssl::UniquePtr<X509> server_eku = CertFromPEM(kServerEKUCert);
2638  ASSERT_TRUE(server_eku);
2639  bssl::UniquePtr<X509> server_eku_plus_ms_sgc =
2641  ASSERT_TRUE(server_eku_plus_ms_sgc);
2642  bssl::UniquePtr<X509> any_eku = CertFromPEM(kAnyEKU);
2643  ASSERT_TRUE(any_eku);
2644  bssl::UniquePtr<X509> no_eku = CertFromPEM(kNoEKU);
2645  ASSERT_TRUE(no_eku);
2646 
2647  auto verify_cert = [&root](X509 *leaf) {
2648  return Verify(leaf, {root.get()}, /*intermediates=*/{}, /*crls=*/{},
2649  /*flags=*/0, [&](X509_VERIFY_PARAM *param) {
2651  param, X509_PURPOSE_SSL_SERVER));
2652  });
2653  };
2654 
2655  // Neither the Microsoft nor Netscape SGC EKU should be sufficient for
2656  // |X509_PURPOSE_SSL_SERVER|. The "any" EKU probably, technically, should be.
2657  // However, we've never accepted it and it's not acceptable in leaf
2658  // certificates by the Baseline, so perhaps we don't need this complexity.
2659  for (X509 *leaf : {ms_sgc.get(), ns_sgc.get(), any_eku.get()}) {
2660  EXPECT_EQ(X509_V_ERR_INVALID_PURPOSE, verify_cert(leaf));
2661  }
2662 
2663  // The server-auth EKU is sufficient, and it doesn't matter if an SGC EKU is
2664  // also included. Lastly, not specifying an EKU is also valid.
2665  for (X509 *leaf : {server_eku.get(), server_eku_plus_ms_sgc.get(),
2666  no_eku.get()}) {
2667  EXPECT_EQ(X509_V_OK, verify_cert(leaf));
2668  }
2669 }
2670 
2671 // Test that invalid extensions are rejected by, if not the parser, at least the
2672 // verifier.
2673 TEST(X509Test, InvalidExtensions) {
2674  bssl::UniquePtr<X509> root = CertFromPEM(
2675  GetTestData("crypto/x509/test/invalid_extension_root.pem").c_str());
2676  ASSERT_TRUE(root);
2677  bssl::UniquePtr<X509> intermediate = CertFromPEM(
2678  GetTestData("crypto/x509/test/invalid_extension_intermediate.pem")
2679  .c_str());
2680  ASSERT_TRUE(intermediate);
2681  bssl::UniquePtr<X509> leaf = CertFromPEM(
2682  GetTestData("crypto/x509/test/invalid_extension_leaf.pem").c_str());
2683  ASSERT_TRUE(leaf);
2684 
2685  // Sanity-check that the baseline chain is accepted.
2687  Verify(leaf.get(), {root.get()}, {intermediate.get()}, {}));
2688 
2689  static const char *kExtensions[] = {
2690  "authority_key_identifier",
2691  "basic_constraints",
2692  "ext_key_usage",
2693  "key_usage",
2694  "name_constraints",
2695  "subject_alt_name",
2696  "subject_key_identifier",
2697  };
2698  for (const char *ext : kExtensions) {
2699  SCOPED_TRACE(ext);
2700  bssl::UniquePtr<X509> invalid_root = CertFromPEM(
2701  GetTestData((std::string("crypto/x509/test/invalid_extension_root_") +
2702  ext + ".pem")
2703  .c_str())
2704  .c_str());
2705  ASSERT_TRUE(invalid_root);
2706 
2707  bssl::UniquePtr<X509> invalid_intermediate = CertFromPEM(
2708  GetTestData(
2709  (std::string("crypto/x509/test/invalid_extension_intermediate_") +
2710  ext + ".pem")
2711  .c_str())
2712  .c_str());
2713  ASSERT_TRUE(invalid_intermediate);
2714 
2715  bssl::UniquePtr<X509> invalid_leaf = CertFromPEM(
2716  GetTestData((std::string("crypto/x509/test/invalid_extension_leaf_") +
2717  ext + ".pem")
2718  .c_str())
2719  .c_str());
2720  ASSERT_TRUE(invalid_leaf);
2721 
2722  bssl::UniquePtr<X509> trailing_leaf = CertFromPEM(
2723  GetTestData((std::string("crypto/x509/test/trailing_data_leaf_") +
2724  ext + ".pem")
2725  .c_str())
2726  .c_str());
2727  ASSERT_TRUE(trailing_leaf);
2728 
2729  EXPECT_EQ(
2731  Verify(invalid_leaf.get(), {root.get()}, {intermediate.get()}, {}));
2732 
2733  EXPECT_EQ(
2735  Verify(trailing_leaf.get(), {root.get()}, {intermediate.get()}, {}));
2736 
2737  // If the invalid extension is on an intermediate or root,
2738  // |X509_verify_cert| notices by way of being unable to build a path to
2739  // a valid issuer.
2740  EXPECT_EQ(
2742  Verify(leaf.get(), {root.get()}, {invalid_intermediate.get()}, {}));
2743  EXPECT_EQ(
2745  Verify(leaf.get(), {invalid_root.get()}, {intermediate.get()}, {}));
2746  }
2747 }
2748 
2749 // kExplicitDefaultVersionPEM is an X.509v1 certificate with the version number
2750 // encoded explicitly, rather than omitted as required by DER.
2751 static const char kExplicitDefaultVersionPEM[] = R"(
2752 -----BEGIN CERTIFICATE-----
2753 MIIBfTCCASSgAwIBAAIJANlMBNpJfb/rMAkGByqGSM49BAEwRTELMAkGA1UEBhMC
2754 QVUxEzARBgNVBAgMClNvbWUtU3RhdGUxITAfBgNVBAoMGEludGVybmV0IFdpZGdp
2755 dHMgUHR5IEx0ZDAeFw0xNDA0MjMyMzIxNTdaFw0xNDA1MjMyMzIxNTdaMEUxCzAJ
2756 BgNVBAYTAkFVMRMwEQYDVQQIDApTb21lLVN0YXRlMSEwHwYDVQQKDBhJbnRlcm5l
2757 dCBXaWRnaXRzIFB0eSBMdGQwWTATBgcqhkjOPQIBBggqhkjOPQMBBwNCAATmK2ni
2758 v2Wfl74vHg2UikzVl2u3qR4NRvvdqakendy6WgHn1peoChj5w8SjHlbifINI2xYa
2759 HPUdfvGULUvPciLBMAkGByqGSM49BAEDSAAwRQIhAPKgNV5ROjbDgnmb7idQhY5w
2760 BnSVV9IpdAD0vhWHXcQHAiB8HnkUaiGD8Hp0aHlfFJmaaLTxy54VXuYfMlJhXnXJ
2761 FA==
2762 -----END CERTIFICATE-----
2763 )";
2764 
2765 // kNegativeVersionPEM is an X.509 certificate with a negative version number.
2766 static const char kNegativeVersionPEM[] = R"(
2767 -----BEGIN CERTIFICATE-----
2768 MIIBfTCCASSgAwIB/wIJANlMBNpJfb/rMAkGByqGSM49BAEwRTELMAkGA1UEBhMC
2769 QVUxEzARBgNVBAgMClNvbWUtU3RhdGUxITAfBgNVBAoMGEludGVybmV0IFdpZGdp
2770 dHMgUHR5IEx0ZDAeFw0xNDA0MjMyMzIxNTdaFw0xNDA1MjMyMzIxNTdaMEUxCzAJ
2771 BgNVBAYTAkFVMRMwEQYDVQQIDApTb21lLVN0YXRlMSEwHwYDVQQKDBhJbnRlcm5l
2772 dCBXaWRnaXRzIFB0eSBMdGQwWTATBgcqhkjOPQIBBggqhkjOPQMBBwNCAATmK2ni
2773 v2Wfl74vHg2UikzVl2u3qR4NRvvdqakendy6WgHn1peoChj5w8SjHlbifINI2xYa
2774 HPUdfvGULUvPciLBMAkGByqGSM49BAEDSAAwRQIhAPKgNV5ROjbDgnmb7idQhY5w
2775 BnSVV9IpdAD0vhWHXcQHAiB8HnkUaiGD8Hp0aHlfFJmaaLTxy54VXuYfMlJhXnXJ
2776 FA==
2777 -----END CERTIFICATE-----
2778 )";
2779 
2780 // kFutureVersionPEM is an X.509 certificate with a version number value of
2781 // three, which is not defined. (v3 has value two).
2782 static const char kFutureVersionPEM[] = R"(
2783 -----BEGIN CERTIFICATE-----
2784 MIIBfTCCASSgAwIBAwIJANlMBNpJfb/rMAkGByqGSM49BAEwRTELMAkGA1UEBhMC
2785 QVUxEzARBgNVBAgMClNvbWUtU3RhdGUxITAfBgNVBAoMGEludGVybmV0IFdpZGdp
2786 dHMgUHR5IEx0ZDAeFw0xNDA0MjMyMzIxNTdaFw0xNDA1MjMyMzIxNTdaMEUxCzAJ
2787 BgNVBAYTAkFVMRMwEQYDVQQIDApTb21lLVN0YXRlMSEwHwYDVQQKDBhJbnRlcm5l
2788 dCBXaWRnaXRzIFB0eSBMdGQwWTATBgcqhkjOPQIBBggqhkjOPQMBBwNCAATmK2ni
2789 v2Wfl74vHg2UikzVl2u3qR4NRvvdqakendy6WgHn1peoChj5w8SjHlbifINI2xYa
2790 HPUdfvGULUvPciLBMAkGByqGSM49BAEDSAAwRQIhAPKgNV5ROjbDgnmb7idQhY5w
2791 BnSVV9IpdAD0vhWHXcQHAiB8HnkUaiGD8Hp0aHlfFJmaaLTxy54VXuYfMlJhXnXJ
2792 FA==
2793 -----END CERTIFICATE-----
2794 )";
2795 
2796 // kOverflowVersionPEM is an X.509 certificate with a version field which
2797 // overflows |uint64_t|.
2798 static const char kOverflowVersionPEM[] = R"(
2799 -----BEGIN CERTIFICATE-----
2800 MIIBoDCCAUegJgIkAP//////////////////////////////////////////////
2801 AgkA2UwE2kl9v+swCQYHKoZIzj0EATBFMQswCQYDVQQGEwJBVTETMBEGA1UECAwK
2802 U29tZS1TdGF0ZTEhMB8GA1UECgwYSW50ZXJuZXQgV2lkZ2l0cyBQdHkgTHRkMB4X
2803 DTE0MDQyMzIzMjE1N1oXDTE0MDUyMzIzMjE1N1owRTELMAkGA1UEBhMCQVUxEzAR
2804 BgNVBAgMClNvbWUtU3RhdGUxITAfBgNVBAoMGEludGVybmV0IFdpZGdpdHMgUHR5
2805 IEx0ZDBZMBMGByqGSM49AgEGCCqGSM49AwEHA0IABOYraeK/ZZ+Xvi8eDZSKTNWX
2806 a7epHg1G+92pqR6d3LpaAefWl6gKGPnDxKMeVuJ8g0jbFhoc9R1+8ZQtS89yIsEw
2807 CQYHKoZIzj0EAQNIADBFAiEA8qA1XlE6NsOCeZvuJ1CFjnAGdJVX0il0APS+FYdd
2808 xAcCIHweeRRqIYPwenRoeV8UmZpotPHLnhVe5h8yUmFedckU
2809 -----END CERTIFICATE-----
2810 )";
2811 
2812 // kV1WithExtensionsPEM is an X.509v1 certificate with extensions.
2813 static const char kV1WithExtensionsPEM[] = R"(
2814 -----BEGIN CERTIFICATE-----
2815 MIIByjCCAXECCQDZTATaSX2/6zAJBgcqhkjOPQQBMEUxCzAJBgNVBAYTAkFVMRMw
2816 EQYDVQQIDApTb21lLVN0YXRlMSEwHwYDVQQKDBhJbnRlcm5ldCBXaWRnaXRzIFB0
2817 eSBMdGQwHhcNMTQwNDIzMjMyMTU3WhcNMTQwNTIzMjMyMTU3WjBFMQswCQYDVQQG
2818 EwJBVTETMBEGA1UECAwKU29tZS1TdGF0ZTEhMB8GA1UECgwYSW50ZXJuZXQgV2lk
2819 Z2l0cyBQdHkgTHRkMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAE5itp4r9ln5e+
2820 Lx4NlIpM1Zdrt6keDUb73ampHp3culoB59aXqAoY+cPEox5W4nyDSNsWGhz1HX7x
2821 lC1Lz3IiwaNQME4wHQYDVR0OBBYEFKuE0qyrlfCCThZ4B1VXX+QmjYLRMB8GA1Ud
2822 IwQYMBaAFKuE0qyrlfCCThZ4B1VXX+QmjYLRMAwGA1UdEwQFMAMBAf8wCQYHKoZI
2823 zj0EAQNIADBFAiEA8qA1XlE6NsOCeZvuJ1CFjnAGdJVX0il0APS+FYddxAcCIHwe
2824 eRRqIYPwenRoeV8UmZpotPHLnhVe5h8yUmFedckU
2825 -----END CERTIFICATE-----
2826 )";
2827 
2828 // kV2WithExtensionsPEM is an X.509v2 certificate with extensions.
2829 static const char kV2WithExtensionsPEM[] = R"(
2830 -----BEGIN CERTIFICATE-----
2831 MIIBzzCCAXagAwIBAQIJANlMBNpJfb/rMAkGByqGSM49BAEwRTELMAkGA1UEBhMC
2832 QVUxEzARBgNVBAgMClNvbWUtU3RhdGUxITAfBgNVBAoMGEludGVybmV0IFdpZGdp
2833 dHMgUHR5IEx0ZDAeFw0xNDA0MjMyMzIxNTdaFw0xNDA1MjMyMzIxNTdaMEUxCzAJ
2834 BgNVBAYTAkFVMRMwEQYDVQQIDApTb21lLVN0YXRlMSEwHwYDVQQKDBhJbnRlcm5l
2835 dCBXaWRnaXRzIFB0eSBMdGQwWTATBgcqhkjOPQIBBggqhkjOPQMBBwNCAATmK2ni
2836 v2Wfl74vHg2UikzVl2u3qR4NRvvdqakendy6WgHn1peoChj5w8SjHlbifINI2xYa
2837 HPUdfvGULUvPciLBo1AwTjAdBgNVHQ4EFgQUq4TSrKuV8IJOFngHVVdf5CaNgtEw
2838 HwYDVR0jBBgwFoAUq4TSrKuV8IJOFngHVVdf5CaNgtEwDAYDVR0TBAUwAwEB/zAJ
2839 BgcqhkjOPQQBA0gAMEUCIQDyoDVeUTo2w4J5m+4nUIWOcAZ0lVfSKXQA9L4Vh13E
2840 BwIgfB55FGohg/B6dGh5XxSZmmi08cueFV7mHzJSYV51yRQ=
2841 -----END CERTIFICATE-----
2842 )";
2843 
2844 // kV1WithIssuerUniqueIDPEM is an X.509v1 certificate with an issuerUniqueID.
2845 static const char kV1WithIssuerUniqueIDPEM[] = R"(
2846 -----BEGIN CERTIFICATE-----
2847 MIIBgzCCASoCCQDZTATaSX2/6zAJBgcqhkjOPQQBMEUxCzAJBgNVBAYTAkFVMRMw
2848 EQYDVQQIDApTb21lLVN0YXRlMSEwHwYDVQQKDBhJbnRlcm5ldCBXaWRnaXRzIFB0
2849 eSBMdGQwHhcNMTQwNDIzMjMyMTU3WhcNMTQwNTIzMjMyMTU3WjBFMQswCQYDVQQG
2850 EwJBVTETMBEGA1UECAwKU29tZS1TdGF0ZTEhMB8GA1UECgwYSW50ZXJuZXQgV2lk
2851 Z2l0cyBQdHkgTHRkMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAE5itp4r9ln5e+
2852 Lx4NlIpM1Zdrt6keDUb73ampHp3culoB59aXqAoY+cPEox5W4nyDSNsWGhz1HX7x
2853 lC1Lz3IiwYEJAAEjRWeJq83vMAkGByqGSM49BAEDSAAwRQIhAPKgNV5ROjbDgnmb
2854 7idQhY5wBnSVV9IpdAD0vhWHXcQHAiB8HnkUaiGD8Hp0aHlfFJmaaLTxy54VXuYf
2855 MlJhXnXJFA==
2856 -----END CERTIFICATE-----
2857 )";
2858 
2859 // kV1WithSubjectUniqueIDPEM is an X.509v1 certificate with an issuerUniqueID.
2860 static const char kV1WithSubjectUniqueIDPEM[] = R"(
2861 -----BEGIN CERTIFICATE-----
2862 MIIBgzCCASoCCQDZTATaSX2/6zAJBgcqhkjOPQQBMEUxCzAJBgNVBAYTAkFVMRMw
2863 EQYDVQQIDApTb21lLVN0YXRlMSEwHwYDVQQKDBhJbnRlcm5ldCBXaWRnaXRzIFB0
2864 eSBMdGQwHhcNMTQwNDIzMjMyMTU3WhcNMTQwNTIzMjMyMTU3WjBFMQswCQYDVQQG
2865 EwJBVTETMBEGA1UECAwKU29tZS1TdGF0ZTEhMB8GA1UECgwYSW50ZXJuZXQgV2lk
2866 Z2l0cyBQdHkgTHRkMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAE5itp4r9ln5e+
2867 Lx4NlIpM1Zdrt6keDUb73ampHp3culoB59aXqAoY+cPEox5W4nyDSNsWGhz1HX7x
2868 lC1Lz3IiwYIJAAEjRWeJq83vMAkGByqGSM49BAEDSAAwRQIhAPKgNV5ROjbDgnmb
2869 7idQhY5wBnSVV9IpdAD0vhWHXcQHAiB8HnkUaiGD8Hp0aHlfFJmaaLTxy54VXuYf
2870 MlJhXnXJFA==
2871 -----END CERTIFICATE-----
2872 )";
2873 
2874 // Test that the X.509 parser enforces versions are valid and match the fields
2875 // present.
2876 TEST(X509Test, InvalidVersion) {
2877  // kExplicitDefaultVersionPEM is invalid but, for now, we accept it. See
2878  // https://crbug.com/boringssl/364.
2880 
2888 }
2889 
2890 // Unlike upstream OpenSSL, we require a non-null store in
2891 // |X509_STORE_CTX_init|.
2892 TEST(X509Test, NullStore) {
2893  bssl::UniquePtr<X509> leaf(CertFromPEM(kLeafPEM));
2894  ASSERT_TRUE(leaf);
2895  bssl::UniquePtr<X509_STORE_CTX> ctx(X509_STORE_CTX_new());
2896  ASSERT_TRUE(ctx);
2897  EXPECT_FALSE(X509_STORE_CTX_init(ctx.get(), nullptr, leaf.get(), nullptr));
2898 }
2899 
2900 TEST(X509Test, BasicConstraints) {
2901  const uint32_t kFlagMask = EXFLAG_CA | EXFLAG_BCONS | EXFLAG_INVALID;
2902 
2903  static const struct {
2904  const char *file;
2905  uint32_t flags;
2906  int path_len;
2907  } kTests[] = {
2908  {"basic_constraints_none.pem", 0, -1},
2909  {"basic_constraints_ca.pem", EXFLAG_CA | EXFLAG_BCONS, -1},
2910  {"basic_constraints_ca_pathlen_0.pem", EXFLAG_CA | EXFLAG_BCONS, 0},
2911  {"basic_constraints_ca_pathlen_1.pem", EXFLAG_CA | EXFLAG_BCONS, 1},
2912  {"basic_constraints_ca_pathlen_10.pem", EXFLAG_CA | EXFLAG_BCONS, 10},
2913  {"basic_constraints_leaf.pem", EXFLAG_BCONS, -1},
2914  {"invalid_extension_leaf_basic_constraints.pem", EXFLAG_INVALID, -1},
2915  };
2916 
2917  for (const auto &test : kTests) {
2918  SCOPED_TRACE(test.file);
2919 
2920  std::string path = "crypto/x509/test/";
2921  path += test.file;
2922 
2923  bssl::UniquePtr<X509> cert = CertFromPEM(GetTestData(path.c_str()).c_str());
2924  ASSERT_TRUE(cert);
2925  EXPECT_EQ(test.flags, X509_get_extension_flags(cert.get()) & kFlagMask);
2926  EXPECT_EQ(test.path_len, X509_get_pathlen(cert.get()));
2927  }
2928 }
2929 
2930 // The following strings are test certificates signed by kP256Key and kRSAKey,
2931 // with missing, NULL, or invalid algorithm parameters.
2932 static const char kP256NoParam[] = R"(
2933 -----BEGIN CERTIFICATE-----
2934 MIIBIDCBxqADAgECAgIE0jAKBggqhkjOPQQDAjAPMQ0wCwYDVQQDEwRUZXN0MCAX
2935 DTAwMDEwMTAwMDAwMFoYDzIxMDAwMTAxMDAwMDAwWjAPMQ0wCwYDVQQDEwRUZXN0
2936 MFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAE5itp4r9ln5e+Lx4NlIpM1Zdrt6ke
2937 DUb73ampHp3culoB59aXqAoY+cPEox5W4nyDSNsWGhz1HX7xlC1Lz3IiwaMQMA4w
2938 DAYDVR0TBAUwAwEB/zAKBggqhkjOPQQDAgNJADBGAiEAqdIiF+bN9Cl44oUeICpy
2939 aXd7HqhpVUaglYKw9ChmNUACIQCpMdL0fNkFNDbRww9dSl/y7kBdk/tp16HiqeSy
2940 gGzFYg==
2941 -----END CERTIFICATE-----
2942 )";
2943 static const char kP256NullParam[] = R"(
2944 -----BEGIN CERTIFICATE-----
2945 MIIBJDCByKADAgECAgIE0jAMBggqhkjOPQQDAgUAMA8xDTALBgNVBAMTBFRlc3Qw
2946 IBcNMDAwMTAxMDAwMDAwWhgPMjEwMDAxMDEwMDAwMDBaMA8xDTALBgNVBAMTBFRl
2947 c3QwWTATBgcqhkjOPQIBBggqhkjOPQMBBwNCAATmK2niv2Wfl74vHg2UikzVl2u3
2948 qR4NRvvdqakendy6WgHn1peoChj5w8SjHlbifINI2xYaHPUdfvGULUvPciLBoxAw
2949 DjAMBgNVHRMEBTADAQH/MAwGCCqGSM49BAMCBQADSQAwRgIhAKILHmyo+F3Cn/VX
2950 UUeSXOQQKX5aLzsQitwwmNF3ZgH3AiEAsYHcrVj/ftmoQIORARkQ/+PrqntXev8r
2951 t6uPxHrmpUY=
2952 -----END CERTIFICATE-----
2953 )";
2954 static const char kP256InvalidParam[] = R"(
2955 -----BEGIN CERTIFICATE-----
2956 MIIBMTCBz6ADAgECAgIE0jATBggqhkjOPQQDAgQHZ2FyYmFnZTAPMQ0wCwYDVQQD
2957 EwRUZXN0MCAXDTAwMDEwMTAwMDAwMFoYDzIxMDAwMTAxMDAwMDAwWjAPMQ0wCwYD
2958 VQQDEwRUZXN0MFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAE5itp4r9ln5e+Lx4N
2959 lIpM1Zdrt6keDUb73ampHp3culoB59aXqAoY+cPEox5W4nyDSNsWGhz1HX7xlC1L
2960 z3IiwaMQMA4wDAYDVR0TBAUwAwEB/zATBggqhkjOPQQDAgQHZ2FyYmFnZQNIADBF
2961 AiAglpDf/YhN89LeJ2WAs/F0SJIrsuhS4uoInIz6WXUiuQIhAIu5Pwhp5E3Pbo8y
2962 fLULTZnynuQUULQkRcF7S7T2WpIL
2963 -----END CERTIFICATE-----
2964 )";
2965 static const char kRSANoParam[] = R"(
2966 -----BEGIN CERTIFICATE-----
2967 MIIBWzCBx6ADAgECAgIE0jALBgkqhkiG9w0BAQswDzENMAsGA1UEAxMEVGVzdDAg
2968 Fw0wMDAxMDEwMDAwMDBaGA8yMTAwMDEwMTAwMDAwMFowDzENMAsGA1UEAxMEVGVz
2969 dDBZMBMGByqGSM49AgEGCCqGSM49AwEHA0IABOYraeK/ZZ+Xvi8eDZSKTNWXa7ep
2970 Hg1G+92pqR6d3LpaAefWl6gKGPnDxKMeVuJ8g0jbFhoc9R1+8ZQtS89yIsGjEDAO
2971 MAwGA1UdEwQFMAMBAf8wCwYJKoZIhvcNAQELA4GBAC1f8W3W0Ao7CPfIBQYDSbPh
2972 brZpbxdBU5x27JOS7iSa+Lc9pEH5VCX9vIypHVHXLPEfZ38yIt11eiyrmZB6w62N
2973 l9kIeZ6FVPmC30d3sXx70Jjs+ZX9yt7kD1gLyNAQQfeYfa4rORAZT1n2YitD74NY
2974 TWUH2ieFP3l+ecj1SeQR
2975 -----END CERTIFICATE-----
2976 )";
2977 static const char kRSANullParam[] = R"(
2978 -----BEGIN CERTIFICATE-----
2979 MIIBXzCByaADAgECAgIE0jANBgkqhkiG9w0BAQsFADAPMQ0wCwYDVQQDEwRUZXN0
2980 MCAXDTAwMDEwMTAwMDAwMFoYDzIxMDAwMTAxMDAwMDAwWjAPMQ0wCwYDVQQDEwRU
2981 ZXN0MFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAE5itp4r9ln5e+Lx4NlIpM1Zdr
2982 t6keDUb73ampHp3culoB59aXqAoY+cPEox5W4nyDSNsWGhz1HX7xlC1Lz3IiwaMQ
2983 MA4wDAYDVR0TBAUwAwEB/zANBgkqhkiG9w0BAQsFAAOBgQAzVcfIv+Rq1KrMXqIL
2984 fPq/cWZjgqFZA1RGaGElNaqp+rkJfamq5tDGzckWpebrK+jjRN7yIlcWDtPpy3Gy
2985 seZfvtBDR0TwJm0S/pQl8prKB4wgALcwe3bmi56Rq85nzY5ZLNcP16LQxL+jAAua
2986 SwmQUz4bRpckRBj+sIyp1We+pg==
2987 -----END CERTIFICATE-----
2988 )";
2989 static const char kRSAInvalidParam[] = R"(
2990 -----BEGIN CERTIFICATE-----
2991 MIIBbTCB0KADAgECAgIE0jAUBgkqhkiG9w0BAQsEB2dhcmJhZ2UwDzENMAsGA1UE
2992 AxMEVGVzdDAgFw0wMDAxMDEwMDAwMDBaGA8yMTAwMDEwMTAwMDAwMFowDzENMAsG
2993 A1UEAxMEVGVzdDBZMBMGByqGSM49AgEGCCqGSM49AwEHA0IABOYraeK/ZZ+Xvi8e
2994 DZSKTNWXa7epHg1G+92pqR6d3LpaAefWl6gKGPnDxKMeVuJ8g0jbFhoc9R1+8ZQt
2995 S89yIsGjEDAOMAwGA1UdEwQFMAMBAf8wFAYJKoZIhvcNAQELBAdnYXJiYWdlA4GB
2996 AHTJ6cWWjCNrZhqiWWVI3jdK+h5xpRG8jGMXxR4JnjtoYRRusJLOXhmapwCB6fA0
2997 4vc+66O27v36yDmQX+tIc/hDrTpKNJptU8q3n2VagREvoHhkOTYkcCeS8vmnMtn8
2998 5OMNZ/ajVwOssw61GcAlScRqEHkZFBoGp7e+QpgB2tf9
2999 -----END CERTIFICATE-----
3000 )";
3001 
3002 TEST(X509Test, AlgorithmParameters) {
3003  // P-256 parameters should be omitted, but we accept NULL ones.
3004  bssl::UniquePtr<EVP_PKEY> key = PrivateKeyFromPEM(kP256Key);
3005  ASSERT_TRUE(key);
3006 
3007  bssl::UniquePtr<X509> cert = CertFromPEM(kP256NoParam);
3008  ASSERT_TRUE(cert);
3009  EXPECT_TRUE(X509_verify(cert.get(), key.get()));
3010 
3011  cert = CertFromPEM(kP256NullParam);
3012  ASSERT_TRUE(cert);
3013  EXPECT_TRUE(X509_verify(cert.get(), key.get()));
3014 
3016  ASSERT_TRUE(cert);
3017  EXPECT_FALSE(X509_verify(cert.get(), key.get()));
3021 
3022  // RSA parameters should be NULL, but we accept omitted ones.
3024  ASSERT_TRUE(key);
3025 
3026  cert = CertFromPEM(kRSANoParam);
3027  ASSERT_TRUE(cert);
3028  EXPECT_TRUE(X509_verify(cert.get(), key.get()));
3029 
3030  cert = CertFromPEM(kRSANullParam);
3031  ASSERT_TRUE(cert);
3032  EXPECT_TRUE(X509_verify(cert.get(), key.get()));
3033 
3034  cert = CertFromPEM(kRSAInvalidParam);
3035  ASSERT_TRUE(cert);
3036  EXPECT_FALSE(X509_verify(cert.get(), key.get()));
3037  err = ERR_get_error();
3040 }
3041 
3042 TEST(X509Test, GeneralName) {
3043  const std::vector<uint8_t> kNames[] = {
3044  // [0] {
3045  // OBJECT_IDENTIFIER { 1.2.840.113554.4.1.72585.2.1 }
3046  // [0] {
3047  // SEQUENCE {}
3048  // }
3049  // }
3050  {0xa0, 0x13, 0x06, 0x0d, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x12, 0x04,
3051  0x01, 0x84, 0xb7, 0x09, 0x02, 0x01, 0xa0, 0x02, 0x30, 0x00},
3052  // [0] {
3053  // OBJECT_IDENTIFIER { 1.2.840.113554.4.1.72585.2.1 }
3054  // [0] {
3055  // [APPLICATION 0] {}
3056  // }
3057  // }
3058  {0xa0, 0x13, 0x06, 0x0d, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x12, 0x04,
3059  0x01, 0x84, 0xb7, 0x09, 0x02, 0x01, 0xa0, 0x02, 0x60, 0x00},
3060  // [0] {
3061  // OBJECT_IDENTIFIER { 1.2.840.113554.4.1.72585.2.1 }
3062  // [0] {
3063  // UTF8String { "a" }
3064  // }
3065  // }
3066  {0xa0, 0x14, 0x06, 0x0d, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x12, 0x04,
3067  0x01, 0x84, 0xb7, 0x09, 0x02, 0x01, 0xa0, 0x03, 0x0c, 0x01, 0x61},
3068  // [0] {
3069  // OBJECT_IDENTIFIER { 1.2.840.113554.4.1.72585.2.2 }
3070  // [0] {
3071  // UTF8String { "a" }
3072  // }
3073  // }
3074  {0xa0, 0x14, 0x06, 0x0d, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x12, 0x04,
3075  0x01, 0x84, 0xb7, 0x09, 0x02, 0x02, 0xa0, 0x03, 0x0c, 0x01, 0x61},
3076  // [0] {
3077  // OBJECT_IDENTIFIER { 1.2.840.113554.4.1.72585.2.1 }
3078  // [0] {
3079  // UTF8String { "b" }
3080  // }
3081  // }
3082  {0xa0, 0x14, 0x06, 0x0d, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x12, 0x04,
3083  0x01, 0x84, 0xb7, 0x09, 0x02, 0x01, 0xa0, 0x03, 0x0c, 0x01, 0x62},
3084  // [0] {
3085  // OBJECT_IDENTIFIER { 1.2.840.113554.4.1.72585.2.1 }
3086  // [0] {
3087  // BOOLEAN { TRUE }
3088  // }
3089  // }
3090  {0xa0, 0x14, 0x06, 0x0d, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x12, 0x04,
3091  0x01, 0x84, 0xb7, 0x09, 0x02, 0x01, 0xa0, 0x03, 0x01, 0x01, 0xff},
3092  // [0] {
3093  // OBJECT_IDENTIFIER { 1.2.840.113554.4.1.72585.2.1 }
3094  // [0] {
3095  // BOOLEAN { FALSE }
3096  // }
3097  // }
3098  {0xa0, 0x14, 0x06, 0x0d, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x12, 0x04,
3099  0x01, 0x84, 0xb7, 0x09, 0x02, 0x01, 0xa0, 0x03, 0x01, 0x01, 0x00},
3100  // [1 PRIMITIVE] { "a" }
3101  {0x81, 0x01, 0x61},
3102  // [1 PRIMITIVE] { "b" }
3103  {0x81, 0x01, 0x62},
3104  // [2 PRIMITIVE] { "a" }
3105  {0x82, 0x01, 0x61},
3106  // [2 PRIMITIVE] { "b" }
3107  {0x82, 0x01, 0x62},
3108  // [3] {}
3109  {0xa3, 0x00},
3110  // [4] {
3111  // SEQUENCE {
3112  // SET {
3113  // SEQUENCE {
3114  // # commonName
3115  // OBJECT_IDENTIFIER { 2.5.4.3 }
3116  // UTF8String { "a" }
3117  // }
3118  // }
3119  // }
3120  // }
3121  {0xa4, 0x0e, 0x30, 0x0c, 0x31, 0x0a, 0x30, 0x08, 0x06, 0x03, 0x55, 0x04,
3122  0x03, 0x0c, 0x01, 0x61},
3123  // [4] {
3124  // SEQUENCE {
3125  // SET {
3126  // SEQUENCE {
3127  // # commonName
3128  // OBJECT_IDENTIFIER { 2.5.4.3 }
3129  // UTF8String { "b" }
3130  // }
3131  // }
3132  // }
3133  // }
3134  {0xa4, 0x0e, 0x30, 0x0c, 0x31, 0x0a, 0x30, 0x08, 0x06, 0x03, 0x55, 0x04,
3135  0x03, 0x0c, 0x01, 0x62},
3136  // [5] {
3137  // [1] {
3138  // UTF8String { "a" }
3139  // }
3140  // }
3141  {0xa5, 0x05, 0xa1, 0x03, 0x0c, 0x01, 0x61},
3142  // [5] {
3143  // [1] {
3144  // UTF8String { "b" }
3145  // }
3146  // }
3147  {0xa5, 0x05, 0xa1, 0x03, 0x0c, 0x01, 0x62},
3148  // [5] {
3149  // [0] {
3150  // UTF8String {}
3151  // }
3152  // [1] {
3153  // UTF8String { "a" }
3154  // }
3155  // }
3156  {0xa5, 0x09, 0xa0, 0x02, 0x0c, 0x00, 0xa1, 0x03, 0x0c, 0x01, 0x61},
3157  // [5] {
3158  // [0] {
3159  // UTF8String { "a" }
3160  // }
3161  // [1] {
3162  // UTF8String { "a" }
3163  // }
3164  // }
3165  {0xa5, 0x0a, 0xa0, 0x03, 0x0c, 0x01, 0x61, 0xa1, 0x03, 0x0c, 0x01, 0x61},
3166  // [5] {
3167  // [0] {
3168  // UTF8String { "b" }
3169  // }
3170  // [1] {
3171  // UTF8String { "a" }
3172  // }
3173  // }
3174  {0xa5, 0x0a, 0xa0, 0x03, 0x0c, 0x01, 0x62, 0xa1, 0x03, 0x0c, 0x01, 0x61},
3175  // [6 PRIMITIVE] { "a" }
3176  {0x86, 0x01, 0x61},
3177  // [6 PRIMITIVE] { "b" }
3178  {0x86, 0x01, 0x62},
3179  // [7 PRIMITIVE] { `11111111` }
3180  {0x87, 0x04, 0x11, 0x11, 0x11, 0x11},
3181  // [7 PRIMITIVE] { `22222222`}
3182  {0x87, 0x04, 0x22, 0x22, 0x22, 0x22},
3183  // [7 PRIMITIVE] { `11111111111111111111111111111111` }
3184  {0x87, 0x10, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11,
3185  0x11, 0x11, 0x11, 0x11, 0x11, 0x11},
3186  // [7 PRIMITIVE] { `22222222222222222222222222222222` }
3187  {0x87, 0x10, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22,
3188  0x22, 0x22, 0x22, 0x22, 0x22, 0x22},
3189  // [8 PRIMITIVE] { 1.2.840.113554.4.1.72585.2.1 }
3190  {0x88, 0x0d, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x12, 0x04, 0x01, 0x84, 0xb7,
3191  0x09, 0x02, 0x01},
3192  // [8 PRIMITIVE] { 1.2.840.113554.4.1.72585.2.2 }
3193  {0x88, 0x0d, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x12, 0x04, 0x01, 0x84, 0xb7,
3194  0x09, 0x02, 0x02},
3195  };
3196 
3197  // Every name should be equal to itself and not equal to any others.
3198  for (size_t i = 0; i < OPENSSL_ARRAY_SIZE(kNames); i++) {
3199  SCOPED_TRACE(Bytes(kNames[i]));
3200 
3201  const uint8_t *ptr = kNames[i].data();
3202  bssl::UniquePtr<GENERAL_NAME> a(
3203  d2i_GENERAL_NAME(nullptr, &ptr, kNames[i].size()));
3204  ASSERT_TRUE(a);
3205  ASSERT_EQ(ptr, kNames[i].data() + kNames[i].size());
3206 
3207  for (size_t j = 0; j < OPENSSL_ARRAY_SIZE(kNames); j++) {
3208  SCOPED_TRACE(Bytes(kNames[j]));
3209 
3210  ptr = kNames[j].data();
3211  bssl::UniquePtr<GENERAL_NAME> b(
3212  d2i_GENERAL_NAME(nullptr, &ptr, kNames[j].size()));
3213  ASSERT_TRUE(b);
3214  ASSERT_EQ(ptr, kNames[j].data() + kNames[j].size());
3215 
3216  if (i == j) {
3217  EXPECT_EQ(GENERAL_NAME_cmp(a.get(), b.get()), 0);
3218  } else {
3219  EXPECT_NE(GENERAL_NAME_cmp(a.get(), b.get()), 0);
3220  }
3221  }
3222  }
3223 }
3224 
3225 // Test that extracting fields of an |X509_ALGOR| works correctly.
3226 TEST(X509Test, X509AlgorExtract) {
3227  static const char kTestOID[] = "1.2.840.113554.4.1.72585.2";
3228  const struct {
3229  int param_type;
3230  std::vector<uint8_t> param_der;
3231  } kTests[] = {
3232  // No parameter.
3233  {V_ASN1_UNDEF, {}},
3234  // BOOLEAN { TRUE }
3235  {V_ASN1_BOOLEAN, {0x01, 0x01, 0xff}},
3236  // BOOLEAN { FALSE }
3237  {V_ASN1_BOOLEAN, {0x01, 0x01, 0x00}},
3238  // OCTET_STRING { "a" }
3239  {V_ASN1_OCTET_STRING, {0x04, 0x01, 0x61}},
3240  // BIT_STRING { `01` `00` }
3241  {V_ASN1_BIT_STRING, {0x03, 0x02, 0x01, 0x00}},
3242  // INTEGER { -1 }
3243  {V_ASN1_INTEGER, {0x02, 0x01, 0xff}},
3244  // OBJECT_IDENTIFIER { 1.2.840.113554.4.1.72585.2 }
3245  {V_ASN1_OBJECT,
3246  {0x06, 0x0c, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x12, 0x04, 0x01, 0x84, 0xb7,
3247  0x09, 0x02}},
3248  // NULL {}
3249  {V_ASN1_NULL, {0x05, 0x00}},
3250  // SEQUENCE {}
3251  {V_ASN1_SEQUENCE, {0x30, 0x00}},
3252  // SET {}
3253  {V_ASN1_SET, {0x31, 0x00}},
3254  // [0] { UTF8String { "a" } }
3255  {V_ASN1_OTHER, {0xa0, 0x03, 0x0c, 0x01, 0x61}},
3256  };
3257  for (const auto &t : kTests) {
3258  SCOPED_TRACE(Bytes(t.param_der));
3259 
3260  // Assemble an AlgorithmIdentifier with the parameter.
3261  bssl::ScopedCBB cbb;
3262  CBB seq, oid;
3263  ASSERT_TRUE(CBB_init(cbb.get(), 64));
3264  ASSERT_TRUE(CBB_add_asn1(cbb.get(), &seq, CBS_ASN1_SEQUENCE));
3266  ASSERT_TRUE(CBB_add_asn1_oid_from_text(&oid, kTestOID, strlen(kTestOID)));
3267  ASSERT_TRUE(CBB_add_bytes(&seq, t.param_der.data(), t.param_der.size()));
3268  ASSERT_TRUE(CBB_flush(cbb.get()));
3269 
3270  const uint8_t *ptr = CBB_data(cbb.get());
3271  bssl::UniquePtr<X509_ALGOR> alg(
3272  d2i_X509_ALGOR(nullptr, &ptr, CBB_len(cbb.get())));
3273  ASSERT_TRUE(alg);
3274 
3275  const ASN1_OBJECT *obj;
3276  int param_type;
3277  const void *param_value;
3278  X509_ALGOR_get0(&obj, &param_type, &param_value, alg.get());
3279 
3280  EXPECT_EQ(param_type, t.param_type);
3281  char oid_buf[sizeof(kTestOID)];
3282  ASSERT_EQ(int(sizeof(oid_buf) - 1),
3283  OBJ_obj2txt(oid_buf, sizeof(oid_buf), obj,
3284  /*always_return_oid=*/1));
3285  EXPECT_STREQ(oid_buf, kTestOID);
3286 
3287  // |param_type| and |param_value| must be consistent with |ASN1_TYPE|.
3288  if (param_type == V_ASN1_UNDEF) {
3289  EXPECT_EQ(nullptr, param_value);
3290  } else {
3291  bssl::UniquePtr<ASN1_TYPE> param(ASN1_TYPE_new());
3292  ASSERT_TRUE(param);
3293  ASSERT_TRUE(ASN1_TYPE_set1(param.get(), param_type, param_value));
3294 
3295  uint8_t *param_der = nullptr;
3296  int param_len = i2d_ASN1_TYPE(param.get(), &param_der);
3297  ASSERT_GE(param_len, 0);
3298  bssl::UniquePtr<uint8_t> free_param_der(param_der);
3299 
3300  EXPECT_EQ(Bytes(param_der, param_len), Bytes(t.param_der));
3301  }
3302  }
3303 }
3304 
3305 // Test the various |X509_ATTRIBUTE| creation functions.
3306 TEST(X509Test, Attribute) {
3307  // The friendlyName attribute has a BMPString value. See RFC 2985,
3308  // section 5.5.1.
3309  static const uint8_t kTest1[] = {0x26, 0x03}; // U+2603 SNOWMAN
3310  static const uint8_t kTest1UTF8[] = {0xe2, 0x98, 0x83};
3311  static const uint8_t kTest2[] = {0, 't', 0, 'e', 0, 's', 0, 't'};
3312 
3313  auto check_attribute = [&](X509_ATTRIBUTE *attr, bool has_test2) {
3315 
3316  EXPECT_EQ(has_test2 ? 2 : 1, X509_ATTRIBUTE_count(attr));
3317 
3318  // The first attribute should contain |kTest1|.
3320  ASSERT_TRUE(value);
3322  EXPECT_EQ(Bytes(kTest1),
3323  Bytes(ASN1_STRING_get0_data(value->value.bmpstring),
3324  ASN1_STRING_length(value->value.bmpstring)));
3325 
3326  // |X509_ATTRIBUTE_get0_data| requires the type match.
3327  EXPECT_FALSE(
3329  const ASN1_BMPSTRING *bmpstring = static_cast<const ASN1_BMPSTRING *>(
3331  ASSERT_TRUE(bmpstring);
3332  EXPECT_EQ(Bytes(kTest1), Bytes(ASN1_STRING_get0_data(bmpstring),
3333  ASN1_STRING_length(bmpstring)));
3334 
3335  if (has_test2) {
3337  ASSERT_TRUE(value);
3339  EXPECT_EQ(Bytes(kTest2),
3340  Bytes(ASN1_STRING_get0_data(value->value.bmpstring),
3341  ASN1_STRING_length(value->value.bmpstring)));
3342  } else {
3344  }
3345 
3347  };
3348 
3349  bssl::UniquePtr<ASN1_STRING> str(ASN1_STRING_type_new(V_ASN1_BMPSTRING));
3350  ASSERT_TRUE(str);
3351  ASSERT_TRUE(ASN1_STRING_set(str.get(), kTest1, sizeof(kTest1)));
3352 
3353  // Test |X509_ATTRIBUTE_create|.
3354  bssl::UniquePtr<X509_ATTRIBUTE> attr(
3356  ASSERT_TRUE(attr);
3357  str.release(); // |X509_ATTRIBUTE_create| takes ownership on success.
3358  check_attribute(attr.get(), /*has_test2=*/false);
3359 
3360  // Test the |MBSTRING_*| form of |X509_ATTRIBUTE_set1_data|.
3361  attr.reset(X509_ATTRIBUTE_new());
3362  ASSERT_TRUE(attr);
3363  ASSERT_TRUE(
3366  sizeof(kTest1UTF8)));
3367  check_attribute(attr.get(), /*has_test2=*/false);
3368 
3369  // Test the |ASN1_STRING| form of |X509_ATTRIBUTE_set1_data|.
3371  sizeof(kTest2)));
3372  check_attribute(attr.get(), /*has_test2=*/true);
3373 
3374  // Test the |ASN1_TYPE| form of |X509_ATTRIBUTE_set1_data|.
3375  attr.reset(X509_ATTRIBUTE_new());
3376  ASSERT_TRUE(attr);
3377  ASSERT_TRUE(
3380  ASSERT_TRUE(str);
3381  ASSERT_TRUE(ASN1_STRING_set(str.get(), kTest1, sizeof(kTest1)));
3382  ASSERT_TRUE(
3383  X509_ATTRIBUTE_set1_data(attr.get(), V_ASN1_BMPSTRING, str.get(), -1));
3384  check_attribute(attr.get(), /*has_test2=*/false);
3385 }
3386 
3387 // Test that, by default, |X509_V_FLAG_TRUSTED_FIRST| is set, which means we'll
3388 // skip over server-sent expired intermediates when there is a local trust
3389 // anchor that works better.
3390 TEST(X509Test, TrustedFirst) {
3391  // Generate the following certificates:
3392  //
3393  // Root 2 (in store, expired)
3394  // |
3395  // Root 1 (in store) Root 1 (cross-sign)
3396  // \ /
3397  // Intermediate
3398  // |
3399  // Leaf
3400  bssl::UniquePtr<EVP_PKEY> key = PrivateKeyFromPEM(kP256Key);
3401  ASSERT_TRUE(key);
3402 
3403  bssl::UniquePtr<X509> root2 =
3404  MakeTestCert("Root 2", "Root 2", key.get(), /*is_ca=*/true);
3405  ASSERT_TRUE(root2);
3407  /*offset_day=*/0,
3408  /*offset_sec=*/-1));
3409  ASSERT_TRUE(X509_sign(root2.get(), key.get(), EVP_sha256()));
3410 
3411  bssl::UniquePtr<X509> root1 =
3412  MakeTestCert("Root 1", "Root 1", key.get(), /*is_ca=*/true);
3413  ASSERT_TRUE(root1);
3414  ASSERT_TRUE(X509_sign(root1.get(), key.get(), EVP_sha256()));
3415 
3416  bssl::UniquePtr<X509> root1_cross =
3417  MakeTestCert("Root 2", "Root 1", key.get(), /*is_ca=*/true);
3418  ASSERT_TRUE(root1_cross);
3419  ASSERT_TRUE(X509_sign(root1_cross.get(), key.get(), EVP_sha256()));
3420 
3421  bssl::UniquePtr<X509> intermediate =
3422  MakeTestCert("Root 1", "Intermediate", key.get(), /*is_ca=*/true);
3423  ASSERT_TRUE(intermediate);
3424  ASSERT_TRUE(X509_sign(intermediate.get(), key.get(), EVP_sha256()));
3425 
3426  bssl::UniquePtr<X509> leaf =
3427  MakeTestCert("Intermediate", "Leaf", key.get(), /*is_ca=*/false);
3428  ASSERT_TRUE(leaf);
3429  ASSERT_TRUE(X509_sign(leaf.get(), key.get(), EVP_sha256()));
3430 
3431  // As a control, confirm that |leaf| -> |intermediate| -> |root1| is valid,
3432  // but the path through |root1_cross| is expired.
3434  Verify(leaf.get(), {root1.get()}, {intermediate.get()}, {}));
3436  Verify(leaf.get(), {root2.get()},
3437  {intermediate.get(), root1_cross.get()}, {}));
3438 
3439  // By default, we should find the |leaf| -> |intermediate| -> |root2| chain,
3440  // skipping |root1_cross|.
3441  EXPECT_EQ(X509_V_OK, Verify(leaf.get(), {root1.get(), root2.get()},
3442  {intermediate.get(), root1_cross.get()}, {}));
3443 
3444  // When |X509_V_FLAG_TRUSTED_FIRST| is disabled, we get stuck on the expired
3445  // intermediate. Note we need the callback to clear the flag. Setting |flags|
3446  // to zero only skips setting new flags.
3447  //
3448  // This test exists to confirm our current behavior, but these modes are just
3449  // workarounds for not having an actual path-building verifier. If we fix it,
3450  // this test can be removed.
3452  Verify(leaf.get(), {root1.get(), root2.get()},
3453  {intermediate.get(), root1_cross.get()}, {}, /*flags=*/0,
3454  [&](X509_VERIFY_PARAM *param) {
3455  X509_VERIFY_PARAM_clear_flags(param,
3456  X509_V_FLAG_TRUSTED_FIRST);
3457  }));
3458 
3459  // Even when |X509_V_FLAG_TRUSTED_FIRST| is disabled, if |root2| is not
3460  // trusted, the alt chains logic recovers the path.
3461  EXPECT_EQ(
3462  X509_V_OK,
3463  Verify(leaf.get(), {root1.get()}, {intermediate.get(), root1_cross.get()},
3464  {}, /*flags=*/0, [&](X509_VERIFY_PARAM *param) {
3465  X509_VERIFY_PARAM_clear_flags(param, X509_V_FLAG_TRUSTED_FIRST);
3466  }));
3467 }
3468 
3469 // kConstructedBitString is an X.509 certificate where the signature is encoded
3470 // as a BER constructed BIT STRING. Note that, while OpenSSL's parser accepts
3471 // this input, it interprets the value incorrectly.
3472 static const char kConstructedBitString[] = R"(
3473 -----BEGIN CERTIFICATE-----
3474 MIIBJTCBxqADAgECAgIE0jAKBggqhkjOPQQDAjAPMQ0wCwYDVQQDEwRUZXN0MCAX
3475 DTAwMDEwMTAwMDAwMFoYDzIxMDAwMTAxMDAwMDAwWjAPMQ0wCwYDVQQDEwRUZXN0
3476 MFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAE5itp4r9ln5e+Lx4NlIpM1Zdrt6ke
3477 DUb73ampHp3culoB59aXqAoY+cPEox5W4nyDSNsWGhz1HX7xlC1Lz3IiwaMQMA4w
3478 DAYDVR0TBAUwAwEB/zAKBggqhkjOPQQDAiNOAyQAMEYCIQCp0iIX5s30KXjihR4g
3479 KnJpd3seqGlVRqCVgrD0KGYDJgA1QAIhAKkx0vR82QU0NtHDD11KX/LuQF2T+2nX
3480 oeKp5LKAbMVi
3481 -----END CERTIFICATE-----
3482 )";
3483 
3484 // kConstructedOctetString is an X.509 certificate where an extension is encoded
3485 // as a BER constructed OCTET STRING.
3486 static const char kConstructedOctetString[] = R"(
3487 -----BEGIN CERTIFICATE-----
3488 MIIBJDCByqADAgECAgIE0jAKBggqhkjOPQQDAjAPMQ0wCwYDVQQDEwRUZXN0MCAX
3489 DTAwMDEwMTAwMDAwMFoYDzIxMDAwMTAxMDAwMDAwWjAPMQ0wCwYDVQQDEwRUZXN0
3490 MFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAE5itp4r9ln5e+Lx4NlIpM1Zdrt6ke
3491 DUb73ampHp3culoB59aXqAoY+cPEox5W4nyDSNsWGhz1HX7xlC1Lz3IiwaMUMBIw
3492 EAYDVR0TJAkEAzADAQQCAf8wCgYIKoZIzj0EAwIDSQAwRgIhAKnSIhfmzfQpeOKF
3493 HiAqcml3ex6oaVVGoJWCsPQoZjVAAiEAqTHS9HzZBTQ20cMPXUpf8u5AXZP7adeh
3494 4qnksoBsxWI=
3495 -----END CERTIFICATE-----
3496 )";
3497 
3498 // kIndefiniteLength is an X.509 certificate where the outermost SEQUENCE uses
3499 // BER indefinite-length encoding.
3500 static const char kIndefiniteLength[] = R"(
3501 -----BEGIN CERTIFICATE-----
3502 MIAwgcagAwIBAgICBNIwCgYIKoZIzj0EAwIwDzENMAsGA1UEAxMEVGVzdDAgFw0w
3503 MDAxMDEwMDAwMDBaGA8yMTAwMDEwMTAwMDAwMFowDzENMAsGA1UEAxMEVGVzdDBZ
3504 MBMGByqGSM49AgEGCCqGSM49AwEHA0IABOYraeK/ZZ+Xvi8eDZSKTNWXa7epHg1G
3505 +92pqR6d3LpaAefWl6gKGPnDxKMeVuJ8g0jbFhoc9R1+8ZQtS89yIsGjEDAOMAwG
3506 A1UdEwQFMAMBAf8wCgYIKoZIzj0EAwIDSQAwRgIhAKnSIhfmzfQpeOKFHiAqcml3
3507 ex6oaVVGoJWCsPQoZjVAAiEAqTHS9HzZBTQ20cMPXUpf8u5AXZP7adeh4qnksoBs
3508 xWIAAA==
3509 -----END CERTIFICATE-----
3510 )";
3511 
3512 // kNonZeroPadding is an X.09 certificate where the BIT STRING signature field
3513 // has non-zero padding values.
3514 static const char kNonZeroPadding[] = R"(
3515 -----BEGIN CERTIFICATE-----
3516 MIIB0DCCAXagAwIBAgIJANlMBNpJfb/rMAkGByqGSM49BAEwRTELMAkGA1UEBhMC
3517 QVUxEzARBgNVBAgMClNvbWUtU3RhdGUxITAfBgNVBAoMGEludGVybmV0IFdpZGdp
3518 dHMgUHR5IEx0ZDAeFw0xNDA0MjMyMzIxNTdaFw0xNDA1MjMyMzIxNTdaMEUxCzAJ
3519 BgNVBAYTAkFVMRMwEQYDVQQIDApTb21lLVN0YXRlMSEwHwYDVQQKDBhJbnRlcm5l
3520 dCBXaWRnaXRzIFB0eSBMdGQwWTATBgcqhkjOPQIBBggqhkjOPQMBBwNCAATmK2ni
3521 v2Wfl74vHg2UikzVl2u3qR4NRvvdqakendy6WgHn1peoChj5w8SjHlbifINI2xYa
3522 HPUdfvGULUvPciLBo1AwTjAdBgNVHQ4EFgQUq4TSrKuV8IJOFngHVVdf5CaNgtEw
3523 HwYDVR0jBBgwFoAUq4TSrKuV8IJOFngHVVdf5CaNgtEwDAYDVR0TBAUwAwEB/zAJ
3524 BgcqhkjOPQQBA0kBMEUCIQDyoDVeUTo2w4J5m+4nUIWOcAZ0lVfSKXQA9L4Vh13E
3525 BwIgfB55FGohg/B6dGh5XxSZmmi08cueFV7mHzJSYV51yRQB
3526 -----END CERTIFICATE-----
3527 )";
3528 
3529 TEST(X509Test, BER) {
3530  // Constructed strings are forbidden in DER.
3533  // Indefinite lengths are forbidden in DER.
3535  // Padding bits in BIT STRINGs must be zero in BER.
3537 }
xds_interop_client.str
str
Definition: xds_interop_client.py:487
EXPECT_FALSE
#define EXPECT_FALSE(condition)
Definition: bloaty/third_party/googletest/googletest/include/gtest/gtest.h:1970
ptr
char * ptr
Definition: abseil-cpp/absl/base/internal/low_level_alloc_test.cc:45
X509_verify_cert
#define X509_verify_cert
Definition: boringssl_prefix_symbols.h:2733
kSelfSignedMismatchAlgorithms
static const char kSelfSignedMismatchAlgorithms[]
Definition: x509_test.cc:735
_gevent_test_main.result
result
Definition: _gevent_test_main.py:96
X509_ATTRIBUTE_set1_data
#define X509_ATTRIBUTE_set1_data
Definition: boringssl_prefix_symbols.h:2271
obj
OPENSSL_EXPORT const ASN1_OBJECT * obj
Definition: x509.h:1671
X509_STORE_new
#define X509_STORE_new
Definition: boringssl_prefix_symbols.h:2545
X509_V_ERR_INVALID_EXTENSION
#define X509_V_ERR_INVALID_EXTENSION
Definition: x509.h:1963
EVP_PKEY_id
#define EVP_PKEY_id
Definition: boringssl_prefix_symbols.h:1638
ASSERT_NE
#define ASSERT_NE(val1, val2)
Definition: bloaty/third_party/googletest/googletest/include/gtest/gtest.h:2060
ASN1_UTCTIME_print
#define ASN1_UTCTIME_print
Definition: boringssl_prefix_symbols.h:725
CBB_flush
#define CBB_flush
Definition: boringssl_prefix_symbols.h:1045
CBB_data
#define CBB_data
Definition: boringssl_prefix_symbols.h:1040
X509_getm_notAfter
#define X509_getm_notAfter
Definition: boringssl_prefix_symbols.h:2674
X509_VERIFY_PARAM_set_purpose
#define X509_VERIFY_PARAM_set_purpose
Definition: boringssl_prefix_symbols.h:2601
EVP_DigestSignInit
#define EVP_DigestSignInit
Definition: boringssl_prefix_symbols.h:1514
CBB_init
#define CBB_init
Definition: boringssl_prefix_symbols.h:1047
X509_get_subject_name
#define X509_get_subject_name
Definition: boringssl_prefix_symbols.h:2672
gen_build_yaml.out
dictionary out
Definition: src/benchmark/gen_build_yaml.py:24
EVP_sha512
const OPENSSL_EXPORT EVP_MD * EVP_sha512(void)
BIO_meth_set_read
#define BIO_meth_set_read
Definition: boringssl_prefix_symbols.h:811
Bytes
Definition: boringssl-with-bazel/src/crypto/test/test_util.h:38
BN_to_ASN1_ENUMERATED
#define BN_to_ASN1_ENUMERATED
Definition: boringssl_prefix_symbols.h:997
ERR_LIB_X509
@ ERR_LIB_X509
Definition: err.h:302
OPENSSL_memcmp
static int OPENSSL_memcmp(const void *s1, const void *s2, size_t n)
Definition: third_party/boringssl-with-bazel/src/crypto/internal.h:811
kUnknownCriticalCRL2
static const char kUnknownCriticalCRL2[]
Definition: x509_test.cc:415
i2d_X509_bio
#define i2d_X509_bio
Definition: boringssl_prefix_symbols.h:3298
ctx
Definition: benchmark-async.c:30
kBadIssuerCRL
static const char kBadIssuerCRL[]
Definition: x509_test.cc:365
X509_VERIFY_PARAM_set1_host
#define X509_VERIFY_PARAM_set1_host
Definition: boringssl_prefix_symbols.h:2593
EXFLAG_BCONS
#define EXFLAG_BCONS
Definition: x509v3.h:387
X509_V_ERR_INVALID_CA
#define X509_V_ERR_INVALID_CA
Definition: x509.h:1943
kNetscapeSGCCert
static const char kNetscapeSGCCert[]
Definition: x509_test.cc:976
i2d_ASN1_TYPE
OPENSSL_EXPORT int i2d_ASN1_TYPE(const ASN1_TYPE *in, uint8_t **outp)
X509_ATTRIBUTE_create
OPENSSL_EXPORT X509_ATTRIBUTE * X509_ATTRIBUTE_create(int nid, int attrtype, void *value)
file
const grpc_generator::File * file
Definition: python_private_generator.h:38
bio_st
Definition: bio.h:822
ASN1_UTCTIME_new
OPENSSL_EXPORT ASN1_UTCTIME * ASN1_UTCTIME_new(void)
env_md_st
Definition: third_party/boringssl-with-bazel/src/crypto/fipsmodule/digest/internal.h:67
X509_getm_notBefore
#define X509_getm_notBefore
Definition: boringssl_prefix_symbols.h:2675
X509_sign
#define X509_sign
Definition: boringssl_prefix_symbols.h:2719
X509_VERIFY_PARAM_clear_flags
#define X509_VERIFY_PARAM_clear_flags
Definition: boringssl_prefix_symbols.h:2580
X509_NAME_entry_count
#define X509_NAME_entry_count
Definition: boringssl_prefix_symbols.h:2380
grpc_core::RefCountedPtr::get
T * get() const
Definition: ref_counted_ptr.h:146
X509_verify
#define X509_verify
Definition: boringssl_prefix_symbols.h:2732
X509_V_FLAG_CRL_CHECK
#define X509_V_FLAG_CRL_CHECK
Definition: x509.h:2007
kExtensions
static const struct tls_extension kExtensions[]
Definition: extensions.cc:3087
kCommonNameWithIPSAN
static const char kCommonNameWithIPSAN[]
Definition: x509_test.cc:824
X509_get_pathlen
#define X509_get_pathlen
Definition: boringssl_prefix_symbols.h:2668
EVP_sha384
const OPENSSL_EXPORT EVP_MD * EVP_sha384(void)
kNoEKU
static const char kNoEKU[]
Definition: x509_test.cc:1036
regen-readme.inp
inp
Definition: regen-readme.py:11
CertFromPEM
static bssl::UniquePtr< X509 > CertFromPEM(const char *pem)
Definition: x509_test.cc:1052
kRootCrossSignedPEM
static const char kRootCrossSignedPEM[]
Definition: x509_test.cc:80
kV1WithIssuerUniqueIDPEM
static const char kV1WithIssuerUniqueIDPEM[]
Definition: x509_test.cc:2845
test
Definition: spinlock_test.cc:36
BN_asc2bn
#define BN_asc2bn
Definition: boringssl_prefix_symbols.h:899
kMicrosoftSGCCert
static const char kMicrosoftSGCCert[]
Definition: x509_test.cc:961
internal.h
ext
void * ext
Definition: x509v3.h:87
bio.h
ED25519_keypair
#define ED25519_keypair
Definition: boringssl_prefix_symbols.h:1395
X509_ALGOR_set0
OPENSSL_EXPORT int X509_ALGOR_set0(X509_ALGOR *alg, ASN1_OBJECT *obj, int param_type, void *param_value)
kHostname
static const char kHostname[]
Definition: x509_test.cc:1262
copy
static int copy(grpc_slice_buffer *input, grpc_slice_buffer *output)
Definition: message_compress.cc:145
V_ASN1_SEQUENCE
#define V_ASN1_SEQUENCE
Definition: asn1.h:136
OPENSSL_ARRAY_SIZE
#define OPENSSL_ARRAY_SIZE(array)
Definition: third_party/boringssl-with-bazel/src/crypto/internal.h:179
X509_ATTRIBUTE_set1_object
#define X509_ATTRIBUTE_set1_object
Definition: boringssl_prefix_symbols.h:2272
kCommonNameNotPermittedLeaf
static const char kCommonNameNotPermittedLeaf[]
Definition: x509_test.cc:885
X509_ALGOR_new
#define X509_ALGOR_new
Definition: boringssl_prefix_symbols.h:2256
buf
voidpf void * buf
Definition: bloaty/third_party/zlib/contrib/minizip/ioapi.h:136
names
sub_type names
Definition: cxa_demangle.cpp:4905
ASN1_STRING_type_new
#define ASN1_STRING_type_new
Definition: boringssl_prefix_symbols.h:695
X509_V_ERR_CRL_SIGNATURE_FAILURE
#define X509_V_ERR_CRL_SIGNATURE_FAILURE
Definition: x509.h:1927
TestVerify
static bool TestVerify(const uint8_t *sig, size_t sig_len, int expect)
Definition: dsa_test.cc:291
CRYPTO_BUFFER_len
#define CRYPTO_BUFFER_len
Definition: boringssl_prefix_symbols.h:1118
testing::internal::string
::std::string string
Definition: bloaty/third_party/protobuf/third_party/googletest/googletest/include/gtest/internal/gtest-port.h:881
error_ref_leak.err
err
Definition: error_ref_leak.py:35
V_ASN1_SET
#define V_ASN1_SET
Definition: asn1.h:137
EVP_PKEY_new_raw_public_key
#define EVP_PKEY_new_raw_public_key
Definition: boringssl_prefix_symbols.h:1645
x509v3.h
X509_V_ERR_UNSUPPORTED_NAME_SYNTAX
#define X509_V_ERR_UNSUPPORTED_NAME_SYNTAX
Definition: x509.h:1977
NID_friendlyName
#define NID_friendlyName
Definition: nid.h:792
X509_parse_from_buffer
OPENSSL_EXPORT X509 * X509_parse_from_buffer(CRYPTO_BUFFER *buf)
GENERAL_NAMES_new
#define GENERAL_NAMES_new
Definition: boringssl_prefix_symbols.h:1766
ASSERT_GE
#define ASSERT_GE(val1, val2)
Definition: bloaty/third_party/googletest/googletest/include/gtest/gtest.h:2072
EXFLAG_CA
#define EXFLAG_CA
Definition: x509v3.h:392
u
OPENSSL_EXPORT pem_password_cb void * u
Definition: pem.h:351
kForgeryPEM
static const char kForgeryPEM[]
Definition: x509_test.cc:169
V_ASN1_OCTET_STRING
#define V_ASN1_OCTET_STRING
Definition: asn1.h:128
kTests
static const HKDFTestVector kTests[]
Definition: hkdf_test.cc:41
kEmail
static const char kEmail[]
Definition: x509_test.cc:1264
ERR_LIB_ASN1
@ ERR_LIB_ASN1
Definition: err.h:303
kCommonNameNotDNS
static const char kCommonNameNotDNS[]
Definition: x509_test.cc:931
X509_CHECK_FLAG_NEVER_CHECK_SUBJECT
#define X509_CHECK_FLAG_NEVER_CHECK_SUBJECT
Definition: x509v3.h:899
kIndefiniteLength
static const char kIndefiniteLength[]
Definition: x509_test.cc:3500
kP256InvalidParam
static const char kP256InvalidParam[]
Definition: x509_test.cc:2954
X509_ALGOR_get0
OPENSSL_EXPORT void X509_ALGOR_get0(const ASN1_OBJECT **out_obj, int *out_param_type, const void **out_param_value, const X509_ALGOR *alg)
kNoBasicConstraintsCertSignLeaf
static const char kNoBasicConstraintsCertSignLeaf[]
Definition: x509_test.cc:692
pem.h
ctx
static struct test_ctx ctx
Definition: test-ipc-send-recv.c:65
setup.name
name
Definition: setup.py:542
i2d_X509
#define i2d_X509
Definition: boringssl_prefix_symbols.h:3274
kIntermediatePEM
static const char kIntermediatePEM[]
Definition: x509_test.cc:98
BIO_push
#define BIO_push
Definition: boringssl_prefix_symbols.h:829
check_documentation.path
path
Definition: check_documentation.py:57
a
int a
Definition: abseil-cpp/absl/container/internal/hash_policy_traits_test.cc:88
kIP
static const uint8_t kIP[4]
Definition: x509_test.cc:1266
X509_set1_signature_algo
OPENSSL_EXPORT int X509_set1_signature_algo(X509 *x509, const X509_ALGOR *algo)
PEM_read_bio
#define PEM_read_bio
Definition: boringssl_prefix_symbols.h:1940
X509_V_OK
#define X509_V_OK
Definition: x509.h:1918
X509_check_ip
#define X509_check_ip
Definition: boringssl_prefix_symbols.h:2617
kV1WithExtensionsPEM
static const char kV1WithExtensionsPEM[]
Definition: x509_test.cc:2813
EVP_sha256
const OPENSSL_EXPORT EVP_MD * EVP_sha256(void)
uint8_t
unsigned char uint8_t
Definition: stdint-msvc2008.h:78
X509_V_ERR_CERT_REVOKED
#define X509_V_ERR_CERT_REVOKED
Definition: x509.h:1942
kEd25519CertNull
static const char kEd25519CertNull[]
Definition: x509_test.cc:498
ASN1_INTEGER_new
OPENSSL_EXPORT ASN1_INTEGER * ASN1_INTEGER_new(void)
MakeTestCert
static bssl::UniquePtr< X509 > MakeTestCert(const char *issuer, const char *subject, EVP_PKEY *key, bool is_ca)
Definition: x509_test.cc:1528
ERR_get_error
#define ERR_get_error
Definition: boringssl_prefix_symbols.h:1419
PEM_read_bio_PrivateKey
EVP_PKEY * PEM_read_bio_PrivateKey(BIO *bp, EVP_PKEY **x, pem_password_cb *cb, void *u)
Definition: pem_pkey.c:71
X509_set1_signature_value
OPENSSL_EXPORT int X509_set1_signature_value(X509 *x509, const uint8_t *sig, size_t sig_len)
x509v3_looks_like_dns_name
#define x509v3_looks_like_dns_name
Definition: boringssl_prefix_symbols.h:3461
kWrongIPString
static const char kWrongIPString[]
Definition: x509_test.cc:1269
EVP_PKEY_ED25519
#define EVP_PKEY_ED25519
Definition: evp.h:179
X509_set_pubkey
#define X509_set_pubkey
Definition: boringssl_prefix_symbols.h:2715
X509_V_ERR_CERT_HAS_EXPIRED
#define X509_V_ERR_CERT_HAS_EXPIRED
Definition: x509.h:1929
asn1_object_st
Definition: third_party/boringssl-with-bazel/src/crypto/asn1/internal.h:102
env_md_ctx_st
Definition: digest.h:306
python_utils.port_server.stderr
stderr
Definition: port_server.py:51
X509_ATTRIBUTE_get0_data
#define X509_ATTRIBUTE_get0_data
Definition: boringssl_prefix_symbols.h:2266
X509_check_host
#define X509_check_host
Definition: boringssl_prefix_symbols.h:2616
kExamplePSSCert
static const char kExamplePSSCert[]
Definition: x509_test.cc:189
EXPECT_EQ
#define EXPECT_EQ(a, b)
Definition: iomgr/time_averaged_stats_test.cc:27
kBasicCRL
static const char kBasicCRL[]
Definition: x509_test.cc:336
X509_NAME_ENTRY_set
#define X509_NAME_ENTRY_set
Definition: boringssl_prefix_symbols.h:2368
d2i_X509_bio
#define d2i_X509_bio
Definition: boringssl_prefix_symbols.h:3054
d2i_X509_ALGOR
#define d2i_X509_ALGOR
Definition: boringssl_prefix_symbols.h:3032
OBJ_nid2obj
#define OBJ_nid2obj
Definition: boringssl_prefix_symbols.h:1855
uint32_t
unsigned int uint32_t
Definition: stdint-msvc2008.h:80
kBadPSSCertPEM
static const char kBadPSSCertPEM[]
Definition: x509_test.cc:208
i2v_GENERAL_NAME
#define i2v_GENERAL_NAME
Definition: boringssl_prefix_symbols.h:3311
bytestring.h
X509_get_pubkey
#define X509_get_pubkey
Definition: boringssl_prefix_symbols.h:2669
X509_V_ERR_UNSPECIFIED
#define X509_V_ERR_UNSPECIFIED
Definition: x509.h:1919
kCrossSigningRootPEM
static const char kCrossSigningRootPEM[]
Definition: x509_test.cc:43
V_ASN1_BMPSTRING
#define V_ASN1_BMPSTRING
Definition: asn1.h:151
X509_V_ERR_UNABLE_TO_GET_ISSUER_CERT_LOCALLY
#define X509_V_ERR_UNABLE_TO_GET_ISSUER_CERT_LOCALLY
Definition: x509.h:1939
ASN1_STRING_set
#define ASN1_STRING_set
Definition: boringssl_prefix_symbols.h:688
BIO_new_mem_buf
#define BIO_new_mem_buf
Definition: boringssl_prefix_symbols.h:820
ASN1_R_HEADER_TOO_LONG
#define ASN1_R_HEADER_TOO_LONG
Definition: asn1.h:1966
X509_VERIFY_PARAM_set_flags
#define X509_VERIFY_PARAM_set_flags
Definition: boringssl_prefix_symbols.h:2599
kEd25519Cert
static const char kEd25519Cert[]
Definition: x509_test.cc:482
EVP_PKEY_X25519
#define EVP_PKEY_X25519
Definition: evp.h:180
in
const char * in
Definition: third_party/abseil-cpp/absl/strings/internal/str_format/parser_test.cc:391
GEN_EMAIL
#define GEN_EMAIL
Definition: x509v3.h:175
X509_V_FLAG_NO_ALT_CHAINS
#define X509_V_FLAG_NO_ALT_CHAINS
Definition: x509.h:2047
X509_VERIFY_PARAM_st
Definition: third_party/boringssl-with-bazel/src/crypto/x509/internal.h:217
OBJ_obj2nid
#define OBJ_obj2nid
Definition: boringssl_prefix_symbols.h:1857
GEN_DNS
#define GEN_DNS
Definition: x509v3.h:176
evp_pkey_ctx_st
Definition: third_party/boringssl-with-bazel/src/crypto/evp/internal.h:182
kKnownCriticalCRL
static const char kKnownCriticalCRL[]
Definition: x509_test.cc:382
PEM_read_bio_X509
#define PEM_read_bio_X509
Definition: boringssl_prefix_symbols.h:1955
SCOPED_TRACE
#define SCOPED_TRACE(message)
Definition: bloaty/third_party/googletest/googletest/include/gtest/gtest.h:2264
ERR_GET_REASON
#define ERR_GET_REASON(packed_error)
Definition: err.h:171
ASN1_INTEGER_set
#define ASN1_INTEGER_set
Definition: boringssl_prefix_symbols.h:648
evp_pkey_st
Definition: evp.h:1046
CRLsToStack
static bssl::UniquePtr< STACK_OF(X509_CRL)> CRLsToStack(const std::vector< X509_CRL * > &crls)
Definition: x509_test.cc:1094
xds_interop_client.int
int
Definition: xds_interop_client.py:113
kNonZeroPadding
static const char kNonZeroPadding[]
Definition: x509_test.cc:3514
invalid
@ invalid
Definition: base64_test.cc:39
kConstructedOctetString
static const char kConstructedOctetString[]
Definition: x509_test.cc:3486
oid
uint8_t oid[9]
Definition: digest_extra.c:124
absl::move
constexpr absl::remove_reference_t< T > && move(T &&t) noexcept
Definition: abseil-cpp/absl/utility/utility.h:221
X509_V_ERR_INVALID_PURPOSE
#define X509_V_ERR_INVALID_PURPOSE
Definition: x509.h:1945
ASSERT_LT
#define ASSERT_LT(val1, val2)
Definition: bloaty/third_party/googletest/googletest/include/gtest/gtest.h:2068
ASN1_R_NOT_ENOUGH_DATA
#define ASN1_R_NOT_ENOUGH_DATA
Definition: asn1.h:2005
kServerEKUCert
static const char kServerEKUCert[]
Definition: x509_test.cc:991
NID_name_constraints
#define NID_name_constraints
Definition: nid.h:2963
X509_get_issuer_name
#define X509_get_issuer_name
Definition: boringssl_prefix_symbols.h:2664
STACK_OF
#define STACK_OF(type)
Definition: stack.h:125
gen_stats_data.c_str
def c_str(s, encoding='ascii')
Definition: gen_stats_data.py:38
root
RefCountedPtr< grpc_tls_certificate_provider > root
Definition: xds_server_config_fetcher.cc:223
d2i_GENERAL_NAME
#define d2i_GENERAL_NAME
Definition: boringssl_prefix_symbols.h:2990
X509_NAME_get_entry
#define X509_NAME_get_entry
Definition: boringssl_prefix_symbols.h:2383
EXPECT_NE
#define EXPECT_NE(val1, val2)
Definition: bloaty/third_party/googletest/googletest/include/gtest/gtest.h:2028
kNoBasicConstraintsCertSignIntermediate
static const char kNoBasicConstraintsCertSignIntermediate[]
Definition: x509_test.cc:678
BIO_s_mem
#define BIO_s_mem
Definition: boringssl_prefix_symbols.h:839
ReencodeCertificate
static bssl::UniquePtr< X509 > ReencodeCertificate(X509 *cert)
Definition: x509_test.cc:1795
X509_PURPOSE_SSL_SERVER
#define X509_PURPOSE_SSL_SERVER
Definition: x509v3.h:449
Verify
static int Verify(X509 *leaf, const std::vector< X509 * > &roots, const std::vector< X509 * > &intermediates, const std::vector< X509_CRL * > &crls, unsigned long flags=0, std::function< void(X509_VERIFY_PARAM *)> configure_callback=nullptr, int(*verify_callback)(int, X509_STORE_CTX *)=nullptr)
Definition: x509_test.cc:1111
kRevokedCRL
static const char kRevokedCRL[]
Definition: x509_test.cc:350
PEM_X509_INFO_read_bio
#define PEM_X509_INFO_read_bio
Definition: boringssl_prefix_symbols.h:1913
X509_V_ERR_PERMITTED_VIOLATION
#define X509_V_ERR_PERMITTED_VIOLATION
Definition: x509.h:1971
kConstructedBitString
static const char kConstructedBitString[]
Definition: x509_test.cc:3472
kWrongEmail
static const char kWrongEmail[]
Definition: x509_test.cc:1265
BIO_meth_set_create
#define BIO_meth_set_create
Definition: boringssl_prefix_symbols.h:806
X509_ATTRIBUTE_get0_type
#define X509_ATTRIBUTE_get0_type
Definition: boringssl_prefix_symbols.h:2268
X509_sign_ctx
#define X509_sign_ctx
Definition: boringssl_prefix_symbols.h:2720
GetTestData
std::string GetTestData(const char *path)
Definition: crypto_test_data.cc:4454
X509_VERIFY_PARAM_set_time
#define X509_VERIFY_PARAM_set_time
Definition: boringssl_prefix_symbols.h:2602
kSANTypesLeaf
static const char kSANTypesLeaf[]
Definition: x509_test.cc:530
X509_crl_st
Definition: third_party/boringssl-with-bazel/src/crypto/x509/internal.h:195
OPENSSL_memcpy
static void * OPENSSL_memcpy(void *dst, const void *src, size_t n)
Definition: third_party/boringssl-with-bazel/src/crypto/internal.h:819
ERR_GET_LIB
#define ERR_GET_LIB(packed_error)
Definition: err.h:166
header
struct absl::base_internal::@2940::AllocList::Header header
X509_set_issuer_name
#define X509_set_issuer_name
Definition: boringssl_prefix_symbols.h:2712
X509_V_ERR_UNHANDLED_CRITICAL_CRL_EXTENSION
#define X509_V_ERR_UNHANDLED_CRITICAL_CRL_EXTENSION
Definition: x509.h:1957
CBB_add_asn1
#define CBB_add_asn1
Definition: boringssl_prefix_symbols.h:1019
ASN1_TYPE_set1
#define ASN1_TYPE_set1
Definition: boringssl_prefix_symbols.h:715
kCRLTestLeaf
static const char kCRLTestLeaf[]
Definition: x509_test.cc:311
ASN1_STRING_length
#define ASN1_STRING_length
Definition: boringssl_prefix_symbols.h:683
err.h
pool.h
crypto.h
X509_V_FLAG_TRUSTED_FIRST
#define X509_V_FLAG_TRUSTED_FIRST
Definition: x509.h:2033
kCommonNameNotPermittedWithSANsLeaf
static const char kCommonNameNotPermittedWithSANsLeaf[]
Definition: x509_test.cc:902
MBSTRING_UTF8
#define MBSTRING_UTF8
Definition: asn1.h:722
X509_V_ERR_IP_ADDRESS_MISMATCH
#define X509_V_ERR_IP_ADDRESS_MISMATCH
Definition: x509.h:1991
kP256NoParam
static const char kP256NoParam[]
Definition: x509_test.cc:2932
BIO_meth_set_write
#define BIO_meth_set_write
Definition: boringssl_prefix_symbols.h:812
V_ASN1_BIT_STRING
#define V_ASN1_BIT_STRING
Definition: asn1.h:127
kRSAKey
static const char kRSAKey[]
Definition: x509_test.cc:232
stack
NodeStack stack
Definition: cord_rep_btree.cc:356
CRYPTO_BUFFER_new
#define CRYPTO_BUFFER_new
Definition: boringssl_prefix_symbols.h:1119
data
char data[kBufferLength]
Definition: abseil-cpp/absl/strings/internal/str_format/float_conversion.cc:1006
kNoBasicConstraintsNetscapeCALeaf
static const char kNoBasicConstraintsNetscapeCALeaf[]
Definition: x509_test.cc:722
X509_ATTRIBUTE_count
#define X509_ATTRIBUTE_count
Definition: boringssl_prefix_symbols.h:2259
gen
OPENSSL_EXPORT GENERAL_NAME * gen
Definition: x509v3.h:495
BIO_new
#define BIO_new
Definition: boringssl_prefix_symbols.h:814
kCommonNameNotPermitted
static const char kCommonNameNotPermitted[]
Definition: x509_test.cc:897
EXFLAG_INVALID
#define EXFLAG_INVALID
Definition: x509v3.h:396
kX25519Cert
static const char kX25519Cert[]
Definition: x509_test.cc:514
EVP_PKEY_cmp
#define EVP_PKEY_cmp
Definition: boringssl_prefix_symbols.h:1615
b
uint64_t b
Definition: abseil-cpp/absl/container/internal/layout_test.cc:53
V_ASN1_OTHER
#define V_ASN1_OTHER
Definition: asn1.h:118
kCRLTestRoot
static const char kCRLTestRoot[]
Definition: x509_test.cc:287
X509_get_signature_nid
OPENSSL_EXPORT int X509_get_signature_nid(const X509 *x509)
kSANTypesRoot
static const char kSANTypesRoot[]
Definition: x509_test.cc:565
i2s_ASN1_INTEGER
#define i2s_ASN1_INTEGER
Definition: boringssl_prefix_symbols.h:3307
kP256Key
static const char kP256Key[]
Definition: x509_test.cc:250
x509_attributes_st
Definition: third_party/boringssl-with-bazel/src/crypto/x509/internal.h:104
kV2WithExtensionsPEM
static const char kV2WithExtensionsPEM[]
Definition: x509_test.cc:2829
CBB_add_asn1_oid_from_text
#define CBB_add_asn1_oid_from_text
Definition: boringssl_prefix_symbols.h:1023
X509_ATTRIBUTE_new
#define X509_ATTRIBUTE_new
Definition: boringssl_prefix_symbols.h:2270
CertsToStack
static bssl::UniquePtr< STACK_OF(X509)> CertsToStack(const std::vector< X509 * > &certs)
Definition: x509_test.cc:1077
EVP_DigestSign
#define EVP_DigestSign
Definition: boringssl_prefix_symbols.h:1512
kAlgorithmMismatchCRL2
static const char kAlgorithmMismatchCRL2[]
Definition: x509_test.cc:467
grpc_core::UniquePtr
std::unique_ptr< T, DefaultDeleteChar > UniquePtr
Definition: src/core/lib/gprpp/memory.h:43
X509_V_ERR_INVALID_CALL
#define X509_V_ERR_INVALID_CALL
Definition: x509.h:1994
kOverflowVersionPEM
static const char kOverflowVersionPEM[]
Definition: x509_test.cc:2798
kCommonNameNotPermittedWithSANs
static const char kCommonNameNotPermittedWithSANs[]
Definition: x509_test.cc:915
V_ASN1_BOOLEAN
#define V_ASN1_BOOLEAN
Definition: asn1.h:125
kNoBasicConstraintsNetscapeCAIntermediate
static const char kNoBasicConstraintsNetscapeCAIntermediate[]
Definition: x509_test.cc:707
X509_VERIFY_PARAM_set_hostflags
#define X509_VERIFY_PARAM_set_hostflags
Definition: boringssl_prefix_symbols.h:2600
X509_R_SIGNATURE_ALGORITHM_MISMATCH
#define X509_R_SIGNATURE_ALGORITHM_MISMATCH
Definition: x509.h:2414
kCommonNamePermittedLeaf
static const char kCommonNamePermittedLeaf[]
Definition: x509_test.cc:868
X509_new
#define X509_new
Definition: boringssl_prefix_symbols.h:2687
CRLFromPEM
static bssl::UniquePtr< X509_CRL > CRLFromPEM(const char *pem)
Definition: x509_test.cc:1060
ASN1_TIME_adj
#define ASN1_TIME_adj
Definition: boringssl_prefix_symbols.h:700
X509_verify_cert_error_string
#define X509_verify_cert_error_string
Definition: boringssl_prefix_symbols.h:2734
kRSANullParam
static const char kRSANullParam[]
Definition: x509_test.cc:2977
tm
static uv_timer_t tm
Definition: test-tcp-open.c:41
X509_STORE_CTX_new
#define X509_STORE_CTX_new
Definition: boringssl_prefix_symbols.h:2507
value
const char * value
Definition: hpack_parser_table.cc:165
X509_check_ip_asc
#define X509_check_ip_asc
Definition: boringssl_prefix_symbols.h:2618
EXPECT_STREQ
#define EXPECT_STREQ(s1, s2)
Definition: bloaty/third_party/googletest/googletest/include/gtest/gtest.h:2095
kExplicitDefaultVersionPEM
static const char kExplicitDefaultVersionPEM[]
Definition: x509_test.cc:2751
GENERAL_NAME_free
#define GENERAL_NAME_free
Definition: boringssl_prefix_symbols.h:1769
d2i_X509
#define d2i_X509
Definition: boringssl_prefix_symbols.h:3031
kLeafNoKeyUsagePEM
static const char kLeafNoKeyUsagePEM[]
Definition: x509_test.cc:152
X509_info_st
Definition: x509.h:287
EVP_PKEY_get_raw_public_key
#define EVP_PKEY_get_raw_public_key
Definition: boringssl_prefix_symbols.h:1637
BIO_meth_new
#define BIO_meth_new
Definition: boringssl_prefix_symbols.h:805
X509_STORE_CTX_trusted_stack
#define X509_STORE_CTX_trusted_stack
Definition: boringssl_prefix_symbols.h:2522
X509_get_extension_flags
#define X509_get_extension_flags
Definition: boringssl_prefix_symbols.h:2663
GENERAL_NAME_new
#define GENERAL_NAME_new
Definition: boringssl_prefix_symbols.h:1773
PEM_read_bio_X509_CRL
#define PEM_read_bio_X509_CRL
Definition: boringssl_prefix_symbols.h:1957
CBB_add_bytes
#define CBB_add_bytes
Definition: boringssl_prefix_symbols.h:1025
X509_STORE_CTX_init
#define X509_STORE_CTX_init
Definition: boringssl_prefix_symbols.h:2506
contents
string_view contents
Definition: elf.cc:597
attr
OPENSSL_EXPORT X509_ATTRIBUTE * attr
Definition: x509.h:1666
kUnknownCriticalCRL
static const char kUnknownCriticalCRL[]
Definition: x509_test.cc:398
kBadExtensionCRL
static const char kBadExtensionCRL[]
Definition: x509_test.cc:432
PrivateKeyFromPEM
static bssl::UniquePtr< EVP_PKEY > PrivateKeyFromPEM(const char *pem)
Definition: x509_test.cc:1068
nid.h
kCommonNameNotDNSLeaf
static const char kCommonNameNotDNSLeaf[]
Definition: x509_test.cc:919
TEST
TEST(X509Test, TestVerify)
Definition: x509_test.cc:1160
digest.h
func
const EVP_CIPHER *(* func)(void)
Definition: cipher_extra.c:73
key
const char * key
Definition: hpack_parser_table.cc:164
kWrongIP
static const uint8_t kWrongIP[4]
Definition: x509_test.cc:1267
x509_st
Definition: third_party/boringssl-with-bazel/src/crypto/x509/internal.h:139
SignatureRoundTrips
static bool SignatureRoundTrips(EVP_MD_CTX *md_ctx, EVP_PKEY *pkey)
Definition: x509_test.cc:1807
absl::flags_internal
Definition: abseil-cpp/absl/flags/commandlineflag.h:40
X509_V_ERR_HOSTNAME_MISMATCH
#define X509_V_ERR_HOSTNAME_MISMATCH
Definition: x509.h:1989
EVP_PKEY_new_raw_private_key
#define EVP_PKEY_new_raw_private_key
Definition: boringssl_prefix_symbols.h:1644
bignum_st
Definition: bn.h:957
CBS_ASN1_OBJECT
#define CBS_ASN1_OBJECT
Definition: bytestring.h:211
ret
UniquePtr< SSL_SESSION > ret
Definition: ssl_x509.cc:1029
GENERAL_NAME_cmp
OPENSSL_EXPORT int GENERAL_NAME_cmp(const GENERAL_NAME *a, const GENERAL_NAME *b)
kAlgorithmMismatchCRL
static const char kAlgorithmMismatchCRL[]
Definition: x509_test.cc:450
kIntermediateSelfSignedPEM
static const char kIntermediateSelfSignedPEM[]
Definition: x509_test.cc:116
sk_X509_new_null
#define sk_X509_new_null
Definition: boringssl_prefix_symbols.h:586
X509_VERIFY_PARAM_set1_email
#define X509_VERIFY_PARAM_set1_email
Definition: boringssl_prefix_symbols.h:2592
ASN1_STRING_get0_data
#define ASN1_STRING_get0_data
Definition: boringssl_prefix_symbols.h:681
WycheproofRawResult::kValid
@ kValid
EVP_PKEY_CTX_set_rsa_mgf1_md
#define EVP_PKEY_CTX_set_rsa_mgf1_md
Definition: boringssl_prefix_symbols.h:1601
PushToStack
std::enable_if<!internal::StackTraits< Stack >::kIsConst, bool >::type PushToStack(Stack *sk, UniquePtr< typename internal::StackTraits< Stack >::Type > elem)
Definition: stack.h:515
X509_NAME_add_entry_by_txt
#define X509_NAME_add_entry_by_txt
Definition: boringssl_prefix_symbols.h:2375
values
std::array< int64_t, Size > values
Definition: abseil-cpp/absl/container/btree_benchmark.cc:608
kCommonNameWithoutSANs
static const char kCommonNameWithoutSANs[]
Definition: x509_test.cc:788
NID_sha384WithRSAEncryption
#define NID_sha384WithRSAEncryption
Definition: nid.h:2978
curve25519.h
ASSERT_TRUE
#define ASSERT_TRUE(condition)
Definition: bloaty/third_party/googletest/googletest/include/gtest/gtest.h:1973
ASSERT_FALSE
#define ASSERT_FALSE(condition)
Definition: bloaty/third_party/googletest/googletest/include/gtest/gtest.h:1976
MBSTRING_ASC
#define MBSTRING_ASC
Definition: asn1.h:723
ok
bool ok
Definition: async_end2end_test.cc:197
V_ASN1_NULL
#define V_ASN1_NULL
Definition: asn1.h:129
V_ASN1_UNDEF
#define V_ASN1_UNDEF
Definition: asn1.h:115
ERR_clear_error
#define ERR_clear_error
Definition: boringssl_prefix_symbols.h:1413
PEMToDER
static bool PEMToDER(bssl::UniquePtr< uint8_t > *out, size_t *out_len, const char *pem)
Definition: x509_test.cc:1955
GEN_URI
#define GEN_URI
Definition: x509v3.h:180
X509_STORE_CTX_set0_crls
#define X509_STORE_CTX_set0_crls
Definition: boringssl_prefix_symbols.h:2509
NID_subject_alt_name
#define NID_subject_alt_name
Definition: nid.h:474
X509_gmtime_adj
#define X509_gmtime_adj
Definition: boringssl_prefix_symbols.h:2676
kP256NullParam
static const char kP256NullParam[]
Definition: x509_test.cc:2943
kCommonNameWithEmailSAN
static const char kCommonNameWithEmailSAN[]
Definition: x509_test.cc:806
RSA_PKCS1_PSS_PADDING
#define RSA_PKCS1_PSS_PADDING
Definition: rsa.h:221
ASN1_TYPE_new
OPENSSL_EXPORT ASN1_TYPE * ASN1_TYPE_new(void)
X509_CRL_cmp
#define X509_CRL_cmp
Definition: boringssl_prefix_symbols.h:2289
kReferenceTime
static const time_t kReferenceTime
Definition: x509_test.cc:1109
X509_R_INVALID_PARAMETER
#define X509_R_INVALID_PARAMETER
Definition: x509.h:2413
kLeafPEM
static const char kLeafPEM[]
Definition: x509_test.cc:134
kConstrainedIntermediate
static const char kConstrainedIntermediate[]
Definition: x509_test.cc:848
EVP_PKEY_CTX_set_rsa_padding
#define EVP_PKEY_CTX_set_rsa_padding
Definition: boringssl_prefix_symbols.h:1603
X509_add1_ext_i2d
#define X509_add1_ext_i2d
Definition: boringssl_prefix_symbols.h:2605
OBJ_obj2txt
#define OBJ_obj2txt
Definition: boringssl_prefix_symbols.h:1858
EXPECT_TRUE
#define EXPECT_TRUE(condition)
Definition: bloaty/third_party/googletest/googletest/include/gtest/gtest.h:1967
kRSANoParam
static const char kRSANoParam[]
Definition: x509_test.cc:2965
WycheproofRawResult::kInvalid
@ kInvalid
X509_get_serialNumber
#define X509_get_serialNumber
Definition: boringssl_prefix_symbols.h:2670
BASIC_CONSTRAINTS_new
#define BASIC_CONSTRAINTS_new
Definition: boringssl_prefix_symbols.h:773
X509_STORE_CTX_get_error
#define X509_STORE_CTX_get_error
Definition: boringssl_prefix_symbols.h:2501
kServerEKUPlusMicrosoftSGCCert
static const char kServerEKUPlusMicrosoftSGCCert[]
Definition: x509_test.cc:1006
NAME_CONSTRAINTS_new
#define NAME_CONSTRAINTS_new
Definition: boringssl_prefix_symbols.h:1821
kFutureVersionPEM
static const char kFutureVersionPEM[]
Definition: x509_test.cc:2782
GENERAL_SUBTREE_new
#define GENERAL_SUBTREE_new
Definition: boringssl_prefix_symbols.h:1779
CBB_len
#define CBB_len
Definition: boringssl_prefix_symbols.h:1049
kCommonNameWithSANs
static const char kCommonNameWithSANs[]
Definition: x509_test.cc:771
flags
uint32_t flags
Definition: retry_filter.cc:632
ASN1_IA5STRING_new
OPENSSL_EXPORT ASN1_IA5STRING * ASN1_IA5STRING_new(void)
kAnyEKU
static const char kAnyEKU[]
Definition: x509_test.cc:1021
X509_check_email
#define X509_check_email
Definition: boringssl_prefix_symbols.h:2615
asyncio_get_stats.type
type
Definition: asyncio_get_stats.py:37
X509_STORE_CTX_get0_param
#define X509_STORE_CTX_get0_param
Definition: boringssl_prefix_symbols.h:2492
len
int len
Definition: abseil-cpp/absl/base/internal/low_level_alloc_test.cc:46
kRootCAPEM
static const char kRootCAPEM[]
Definition: x509_test.cc:62
EVP_PKEY_CTX_set_rsa_pss_saltlen
#define EVP_PKEY_CTX_set_rsa_pss_saltlen
Definition: boringssl_prefix_symbols.h:1607
asn1_type_st
Definition: asn1.h:1481
kV1WithSubjectUniqueIDPEM
static const char kV1WithSubjectUniqueIDPEM[]
Definition: x509_test.cc:2860
ASSERT_GT
#define ASSERT_GT(val1, val2)
Definition: bloaty/third_party/googletest/googletest/include/gtest/gtest.h:2076
function
std::function< bool(GrpcTool *, int, const char **, const CliCredentials &, GrpcToolOutputCallback)> function
Definition: grpc_tool.cc:250
X509_set_version
#define X509_set_version
Definition: boringssl_prefix_symbols.h:2718
size
voidpf void uLong size
Definition: bloaty/third_party/zlib/contrib/minizip/ioapi.h:136
X509_VERSION_3
#define X509_VERSION_3
Definition: x509.h:323
CBS_ASN1_SEQUENCE
#define CBS_ASN1_SEQUENCE
Definition: bytestring.h:214
kWrongHostname
static const char kWrongHostname[]
Definition: x509_test.cc:1263
kRSAInvalidParam
static const char kRSAInvalidParam[]
Definition: x509_test.cc:2989
kCommonNamePermitted
static const char kCommonNamePermitted[]
Definition: x509_test.cc:880
kIPString
static const char kIPString[]
Definition: x509_test.cc:1268
method
NSString * method
Definition: ProtoMethod.h:28
X509_V_ERR_EMAIL_MISMATCH
#define X509_V_ERR_EMAIL_MISMATCH
Definition: x509.h:1990
BN_to_ASN1_INTEGER
#define BN_to_ASN1_INTEGER
Definition: boringssl_prefix_symbols.h:998
OPENSSL_free
#define OPENSSL_free
Definition: boringssl_prefix_symbols.h:1869
X509_CHECK_FLAG_ALWAYS_CHECK_SUBJECT
#define X509_CHECK_FLAG_ALWAYS_CHECK_SUBJECT
Definition: x509v3.h:889
X509_NAME_new
#define X509_NAME_new
Definition: boringssl_prefix_symbols.h:2391
V_ASN1_OBJECT
#define V_ASN1_OBJECT
Definition: asn1.h:130
X509_cmp
#define X509_cmp
Definition: boringssl_prefix_symbols.h:2623
i2s_ASN1_ENUMERATED
#define i2s_ASN1_ENUMERATED
Definition: boringssl_prefix_symbols.h:3305
X509_ATTRIBUTE_get0_object
#define X509_ATTRIBUTE_get0_object
Definition: boringssl_prefix_symbols.h:2267
X509_name_st
Definition: third_party/boringssl-with-bazel/src/crypto/x509/internal.h:95
X509_V_ERR_NAME_CONSTRAINTS_WITHOUT_SANS
#define X509_V_ERR_NAME_CONSTRAINTS_WITHOUT_SANS
Definition: x509.h:1998
x509_store_ctx_st
Definition: third_party/boringssl-with-bazel/src/crypto/x509/internal.h:312
X509_V_ERR_UNABLE_TO_GET_CRL
#define X509_V_ERR_UNABLE_TO_GET_CRL
Definition: x509.h:1922
i2d_re_X509_tbs
OPENSSL_EXPORT int i2d_re_X509_tbs(X509 *x509, unsigned char **outp)
NID_basic_constraints
#define NID_basic_constraints
Definition: nid.h:484
asn1_string_st
Definition: asn1.h:543
i
uint64_t i
Definition: abseil-cpp/absl/container/btree_benchmark.cc:230
asn1.h
CRYPTO_BUFFER_data
#define CRYPTO_BUFFER_data
Definition: boringssl_prefix_symbols.h:1115
ASSERT_EQ
#define ASSERT_EQ(val1, val2)
Definition: bloaty/third_party/googletest/googletest/include/gtest/gtest.h:2056
X509_set_serialNumber
#define X509_set_serialNumber
Definition: boringssl_prefix_symbols.h:2716
conf_value_st
Definition: conf.h:82
x509.h
BIO_mem_contents
#define BIO_mem_contents
Definition: boringssl_prefix_symbols.h:803
kNegativeVersionPEM
static const char kNegativeVersionPEM[]
Definition: x509_test.cc:2766
cbb_st
Definition: bytestring.h:375
MakeGeneralName
static bssl::UniquePtr< GENERAL_NAME > MakeGeneralName(int type, const std::string &value)
Definition: x509_test.cc:1510
V_ASN1_INTEGER
#define V_ASN1_INTEGER
Definition: asn1.h:126


grpc
Author(s):
autogenerated on Fri May 16 2025 03:00:55