xref: /netbsd-src/crypto/external/bsd/openssl/dist/test/crltest.c (revision 97e3c58506797315d86c0608cba9d3f55de0c735)
1c7da899bSchristos /*
2*97e3c585Schristos  * Copyright 2015-2024 The OpenSSL Project Authors. All Rights Reserved.
3c7da899bSchristos  *
4b0d17251Schristos  * Licensed under the Apache License 2.0 (the "License").  You may not use
5c7da899bSchristos  * this file except in compliance with the License.  You can obtain a copy
6c7da899bSchristos  * in the file LICENSE in the source distribution or at
7c7da899bSchristos  * https://www.openssl.org/source/license.html
8c7da899bSchristos  */
9c7da899bSchristos 
1013d40330Schristos #include "internal/nelem.h"
11c7da899bSchristos #include <string.h>
12c7da899bSchristos #include <openssl/bio.h>
13c7da899bSchristos #include <openssl/crypto.h>
14c7da899bSchristos #include <openssl/err.h>
15c7da899bSchristos #include <openssl/pem.h>
16c7da899bSchristos #include <openssl/x509.h>
17c7da899bSchristos 
18c7da899bSchristos #include "testutil.h"
19c7da899bSchristos 
20c7da899bSchristos #define PARAM_TIME 1474934400 /* Sep 27th, 2016 */
21c7da899bSchristos 
22c7da899bSchristos static const char *kCRLTestRoot[] = {
23c7da899bSchristos     "-----BEGIN CERTIFICATE-----\n",
24c7da899bSchristos     "MIIDbzCCAlegAwIBAgIJAODri7v0dDUFMA0GCSqGSIb3DQEBCwUAME4xCzAJBgNV\n",
25c7da899bSchristos     "BAYTAlVTMRMwEQYDVQQIDApDYWxpZm9ybmlhMRYwFAYDVQQHDA1Nb3VudGFpbiBW\n",
26c7da899bSchristos     "aWV3MRIwEAYDVQQKDAlCb3JpbmdTU0wwHhcNMTYwOTI2MTUwNjI2WhcNMjYwOTI0\n",
27c7da899bSchristos     "MTUwNjI2WjBOMQswCQYDVQQGEwJVUzETMBEGA1UECAwKQ2FsaWZvcm5pYTEWMBQG\n",
28c7da899bSchristos     "A1UEBwwNTW91bnRhaW4gVmlldzESMBAGA1UECgwJQm9yaW5nU1NMMIIBIjANBgkq\n",
29c7da899bSchristos     "hkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAo16WiLWZuaymsD8n5SKPmxV1y6jjgr3B\n",
30c7da899bSchristos     "S/dUBpbrzd1aeFzNlI8l2jfAnzUyp+I21RQ+nh/MhqjGElkTtK9xMn1Y+S9GMRh+\n",
31c7da899bSchristos     "5R/Du0iCb1tCZIPY07Tgrb0KMNWe0v2QKVVruuYSgxIWodBfxlKO64Z8AJ5IbnWp\n",
32c7da899bSchristos     "uRqO6rctN9qUoMlTIAB6dL4G0tDJ/PGFWOJYwOMEIX54bly2wgyYJVBKiRRt4f7n\n",
33c7da899bSchristos     "8H922qmvPNA9idmX9G1VAtgV6x97XXi7ULORIQvn9lVQF6nTYDBJhyuPB+mLThbL\n",
34c7da899bSchristos     "P2o9orxGx7aCtnnBZUIxUvHNOI0FaSaZH7Fi0xsZ/GkG2HZe7ImPJwIDAQABo1Aw\n",
35c7da899bSchristos     "TjAdBgNVHQ4EFgQUWPt3N5cZ/CRvubbrkqfBnAqhq94wHwYDVR0jBBgwFoAUWPt3\n",
36c7da899bSchristos     "N5cZ/CRvubbrkqfBnAqhq94wDAYDVR0TBAUwAwEB/zANBgkqhkiG9w0BAQsFAAOC\n",
37c7da899bSchristos     "AQEAORu6M0MOwXy+3VEBwNilfTxyqDfruQsc1jA4PT8Oe8zora1WxE1JB4q2FJOz\n",
38c7da899bSchristos     "EAuM3H/NXvEnBuN+ITvKZAJUfm4NKX97qmjMJwLKWe1gVv+VQTr63aR7mgWJReQN\n",
39c7da899bSchristos     "XdMztlVeZs2dppV6uEg3ia1X0G7LARxGpA9ETbMyCpb39XxlYuTClcbA5ftDN99B\n",
40c7da899bSchristos     "3Xg9KNdd++Ew22O3HWRDvdDpTO/JkzQfzi3sYwUtzMEonENhczJhGf7bQMmvL/w5\n",
41c7da899bSchristos     "24Wxj4Z7KzzWIHsNqE/RIs6RV3fcW61j/mRgW2XyoWnMVeBzvcJr9NXp4VQYmFPw\n",
42c7da899bSchristos     "amd8GKMZQvP0ufGnUn7D7uartA==\n",
43c7da899bSchristos     "-----END CERTIFICATE-----\n",
44c7da899bSchristos     NULL
45c7da899bSchristos };
46c7da899bSchristos 
47c7da899bSchristos static const char *kCRLTestLeaf[] = {
48c7da899bSchristos     "-----BEGIN CERTIFICATE-----\n",
49c7da899bSchristos     "MIIDkDCCAnigAwIBAgICEAAwDQYJKoZIhvcNAQELBQAwTjELMAkGA1UEBhMCVVMx\n",
50c7da899bSchristos     "EzARBgNVBAgMCkNhbGlmb3JuaWExFjAUBgNVBAcMDU1vdW50YWluIFZpZXcxEjAQ\n",
51c7da899bSchristos     "BgNVBAoMCUJvcmluZ1NTTDAeFw0xNjA5MjYxNTA4MzFaFw0xNzA5MjYxNTA4MzFa\n",
52c7da899bSchristos     "MEsxCzAJBgNVBAYTAlVTMRMwEQYDVQQIDApDYWxpZm9ybmlhMRIwEAYDVQQKDAlC\n",
53c7da899bSchristos     "b3JpbmdTU0wxEzARBgNVBAMMCmJvcmluZy5zc2wwggEiMA0GCSqGSIb3DQEBAQUA\n",
54c7da899bSchristos     "A4IBDwAwggEKAoIBAQDc5v1S1M0W+QWM+raWfO0LH8uvqEwuJQgODqMaGnSlWUx9\n",
55c7da899bSchristos     "8iQcnWfjyPja3lWg9K62hSOFDuSyEkysKHDxijz5R93CfLcfnVXjWQDJe7EJTTDP\n",
56c7da899bSchristos     "ozEvxN6RjAeYv7CF000euYr3QT5iyBjg76+bon1p0jHZBJeNPP1KqGYgyxp+hzpx\n",
57c7da899bSchristos     "e0gZmTlGAXd8JQK4v8kpdYwD6PPifFL/jpmQpqOtQmH/6zcLjY4ojmqpEdBqIKIX\n",
58c7da899bSchristos     "+saA29hMq0+NK3K+wgg31RU+cVWxu3tLOIiesETkeDgArjWRS1Vkzbi4v9SJxtNu\n",
59c7da899bSchristos     "OZuAxWiynRJw3JwH/OFHYZIvQqz68ZBoj96cepjPAgMBAAGjezB5MAkGA1UdEwQC\n",
60c7da899bSchristos     "MAAwLAYJYIZIAYb4QgENBB8WHU9wZW5TU0wgR2VuZXJhdGVkIENlcnRpZmljYXRl\n",
61c7da899bSchristos     "MB0GA1UdDgQWBBTGn0OVVh/aoYt0bvEKG+PIERqnDzAfBgNVHSMEGDAWgBRY+3c3\n",
62c7da899bSchristos     "lxn8JG+5tuuSp8GcCqGr3jANBgkqhkiG9w0BAQsFAAOCAQEAd2nM8gCQN2Dc8QJw\n",
63c7da899bSchristos     "XSZXyuI3DBGGCHcay/3iXu0JvTC3EiQo8J6Djv7WLI0N5KH8mkm40u89fJAB2lLZ\n",
64c7da899bSchristos     "ShuHVtcC182bOKnePgwp9CNwQ21p0rDEu/P3X46ZvFgdxx82E9xLa0tBB8PiPDWh\n",
65c7da899bSchristos     "lV16jbaKTgX5AZqjnsyjR5o9/mbZVupZJXx5Syq+XA8qiJfstSYJs4KyKK9UOjql\n",
66c7da899bSchristos     "ICkJVKpi2ahDBqX4MOH4SLfzVk8pqSpviS6yaA1RXqjpkxiN45WWaXDldVHMSkhC\n",
67c7da899bSchristos     "5CNXsXi4b1nAntu89crwSLA3rEwzCWeYj+BX7e1T9rr3oJdwOU/2KQtW1js1yQUG\n",
68c7da899bSchristos     "tjJMFw==\n",
69c7da899bSchristos     "-----END CERTIFICATE-----\n",
70c7da899bSchristos     NULL
71c7da899bSchristos };
72c7da899bSchristos 
73c7da899bSchristos static const char *kBasicCRL[] = {
74c7da899bSchristos     "-----BEGIN X509 CRL-----\n",
75c7da899bSchristos     "MIIBpzCBkAIBATANBgkqhkiG9w0BAQsFADBOMQswCQYDVQQGEwJVUzETMBEGA1UE\n",
76c7da899bSchristos     "CAwKQ2FsaWZvcm5pYTEWMBQGA1UEBwwNTW91bnRhaW4gVmlldzESMBAGA1UECgwJ\n",
77c7da899bSchristos     "Qm9yaW5nU1NMFw0xNjA5MjYxNTEwNTVaFw0xNjEwMjYxNTEwNTVaoA4wDDAKBgNV\n",
78c7da899bSchristos     "HRQEAwIBATANBgkqhkiG9w0BAQsFAAOCAQEAnrBKKgvd9x9zwK9rtUvVeFeJ7+LN\n",
79c7da899bSchristos     "ZEAc+a5oxpPNEsJx6hXoApYEbzXMxuWBQoCs5iEBycSGudct21L+MVf27M38KrWo\n",
80c7da899bSchristos     "eOkq0a2siqViQZO2Fb/SUFR0k9zb8xl86Zf65lgPplALun0bV/HT7MJcl04Tc4os\n",
81c7da899bSchristos     "dsAReBs5nqTGNEd5AlC1iKHvQZkM//MD51DspKnDpsDiUVi54h9C1SpfZmX8H2Vv\n",
82c7da899bSchristos     "diyu0fZ/bPAM3VAGawatf/SyWfBMyKpoPXEG39oAzmjjOj8en82psn7m474IGaho\n",
83c7da899bSchristos     "/vBbhl1ms5qQiLYPjm4YELtnXQoFyC72tBjbdFd/ZE9k4CNKDbxFUXFbkw==\n",
84c7da899bSchristos     "-----END X509 CRL-----\n",
85c7da899bSchristos     NULL
86c7da899bSchristos };
87c7da899bSchristos 
88c7da899bSchristos static const char *kRevokedCRL[] = {
89c7da899bSchristos     "-----BEGIN X509 CRL-----\n",
90c7da899bSchristos     "MIIBvjCBpwIBATANBgkqhkiG9w0BAQsFADBOMQswCQYDVQQGEwJVUzETMBEGA1UE\n",
91c7da899bSchristos     "CAwKQ2FsaWZvcm5pYTEWMBQGA1UEBwwNTW91bnRhaW4gVmlldzESMBAGA1UECgwJ\n",
92c7da899bSchristos     "Qm9yaW5nU1NMFw0xNjA5MjYxNTEyNDRaFw0xNjEwMjYxNTEyNDRaMBUwEwICEAAX\n",
93c7da899bSchristos     "DTE2MDkyNjE1MTIyNlqgDjAMMAoGA1UdFAQDAgECMA0GCSqGSIb3DQEBCwUAA4IB\n",
94c7da899bSchristos     "AQCUGaM4DcWzlQKrcZvI8TMeR8BpsvQeo5BoI/XZu2a8h//PyRyMwYeaOM+3zl0d\n",
95c7da899bSchristos     "sjgCT8b3C1FPgT+P2Lkowv7rJ+FHJRNQkogr+RuqCSPTq65ha4WKlRGWkMFybzVH\n",
96c7da899bSchristos     "NloxC+aU3lgp/NlX9yUtfqYmJek1CDrOOGPrAEAwj1l/BUeYKNGqfBWYJQtPJu+5\n",
97c7da899bSchristos     "OaSvIYGpETCZJscUWODmLEb/O3DM438vLvxonwGqXqS0KX37+CHpUlyhnSovxXxp\n",
98c7da899bSchristos     "Pz4aF+L7OtczxL0GYtD2fR9B7TDMqsNmHXgQrixvvOY7MUdLGbd4RfJL3yA53hyO\n",
99c7da899bSchristos     "xzfKY2TzxLiOmctG0hXFkH5J\n",
100c7da899bSchristos     "-----END X509 CRL-----\n",
101c7da899bSchristos     NULL
102c7da899bSchristos };
103c7da899bSchristos 
104*97e3c585Schristos static const char *kInvalidCRL[] = {
105*97e3c585Schristos     "-----BEGIN X509 CRL-----\n",
106*97e3c585Schristos     "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n",
107*97e3c585Schristos     "-----END X509 CRL-----\n",
108*97e3c585Schristos     NULL
109*97e3c585Schristos };
110*97e3c585Schristos 
111c7da899bSchristos static const char *kBadIssuerCRL[] = {
112c7da899bSchristos     "-----BEGIN X509 CRL-----\n",
113c7da899bSchristos     "MIIBwjCBqwIBATANBgkqhkiG9w0BAQsFADBSMQswCQYDVQQGEwJVUzETMBEGA1UE\n",
114c7da899bSchristos     "CAwKQ2FsaWZvcm5pYTEWMBQGA1UEBwwNTW91bnRhaW4gVmlldzEWMBQGA1UECgwN\n",
115c7da899bSchristos     "Tm90IEJvcmluZ1NTTBcNMTYwOTI2MTUxMjQ0WhcNMTYxMDI2MTUxMjQ0WjAVMBMC\n",
116c7da899bSchristos     "AhAAFw0xNjA5MjYxNTEyMjZaoA4wDDAKBgNVHRQEAwIBAjANBgkqhkiG9w0BAQsF\n",
117c7da899bSchristos     "AAOCAQEAlBmjOA3Fs5UCq3GbyPEzHkfAabL0HqOQaCP12btmvIf/z8kcjMGHmjjP\n",
118c7da899bSchristos     "t85dHbI4Ak/G9wtRT4E/j9i5KML+6yfhRyUTUJKIK/kbqgkj06uuYWuFipURlpDB\n",
119c7da899bSchristos     "cm81RzZaMQvmlN5YKfzZV/clLX6mJiXpNQg6zjhj6wBAMI9ZfwVHmCjRqnwVmCUL\n",
120c7da899bSchristos     "TybvuTmkryGBqREwmSbHFFjg5ixG/ztwzON/Ly78aJ8Bql6ktCl9+/gh6VJcoZ0q\n",
121c7da899bSchristos     "L8V8aT8+Ghfi+zrXM8S9BmLQ9n0fQe0wzKrDZh14EK4sb7zmOzFHSxm3eEXyS98g\n",
122c7da899bSchristos     "Od4cjsc3ymNk88S4jpnLRtIVxZB+SQ==\n",
123c7da899bSchristos     "-----END X509 CRL-----\n",
124c7da899bSchristos     NULL
125c7da899bSchristos };
126c7da899bSchristos 
127c7da899bSchristos /*
128c7da899bSchristos  * This is kBasicCRL but with a critical issuing distribution point
129c7da899bSchristos  * extension.
130c7da899bSchristos  */
131c7da899bSchristos static const char *kKnownCriticalCRL[] = {
132c7da899bSchristos     "-----BEGIN X509 CRL-----\n",
133c7da899bSchristos     "MIIBujCBowIBATANBgkqhkiG9w0BAQsFADBOMQswCQYDVQQGEwJVUzETMBEGA1UE\n",
134c7da899bSchristos     "CAwKQ2FsaWZvcm5pYTEWMBQGA1UEBwwNTW91bnRhaW4gVmlldzESMBAGA1UECgwJ\n",
135c7da899bSchristos     "Qm9yaW5nU1NMFw0xNjA5MjYxNTEwNTVaFw0xNjEwMjYxNTEwNTVaoCEwHzAKBgNV\n",
136c7da899bSchristos     "HRQEAwIBATARBgNVHRwBAf8EBzAFoQMBAf8wDQYJKoZIhvcNAQELBQADggEBAA+3\n",
137c7da899bSchristos     "i+5e5Ub8sccfgOBs6WVJFI9c8gvJjrJ8/dYfFIAuCyeocs7DFXn1n13CRZ+URR/Q\n",
138c7da899bSchristos     "mVWgU28+xeusuSPYFpd9cyYTcVyNUGNTI3lwgcE/yVjPaOmzSZKdPakApRxtpKKQ\n",
139c7da899bSchristos     "NN/56aQz3bnT/ZSHQNciRB8U6jiD9V30t0w+FDTpGaG+7bzzUH3UVF9xf9Ctp60A\n",
140c7da899bSchristos     "3mfLe0scas7owSt4AEFuj2SPvcE7yvdOXbu+IEv21cEJUVExJAbhvIweHXh6yRW+\n",
141c7da899bSchristos     "7VVeiNzdIjkZjyTmAzoXGha4+wbxXyBRbfH+XWcO/H+8nwyG8Gktdu2QB9S9nnIp\n",
142c7da899bSchristos     "o/1TpfOMSGhMyMoyPrk=\n",
143c7da899bSchristos     "-----END X509 CRL-----\n",
144c7da899bSchristos     NULL
145c7da899bSchristos };
146c7da899bSchristos 
147c7da899bSchristos /*
148c7da899bSchristos  * kUnknownCriticalCRL is kBasicCRL but with an unknown critical extension.
149c7da899bSchristos  */
150c7da899bSchristos static const char *kUnknownCriticalCRL[] = {
151c7da899bSchristos     "-----BEGIN X509 CRL-----\n",
152c7da899bSchristos     "MIIBvDCBpQIBATANBgkqhkiG9w0BAQsFADBOMQswCQYDVQQGEwJVUzETMBEGA1UE\n",
153c7da899bSchristos     "CAwKQ2FsaWZvcm5pYTEWMBQGA1UEBwwNTW91bnRhaW4gVmlldzESMBAGA1UECgwJ\n",
154c7da899bSchristos     "Qm9yaW5nU1NMFw0xNjA5MjYxNTEwNTVaFw0xNjEwMjYxNTEwNTVaoCMwITAKBgNV\n",
155c7da899bSchristos     "HRQEAwIBATATBgwqhkiG9xIEAYS3CQABAf8EADANBgkqhkiG9w0BAQsFAAOCAQEA\n",
156c7da899bSchristos     "GvBP0xqL509InMj/3493YVRV+ldTpBv5uTD6jewzf5XdaxEQ/VjTNe5zKnxbpAib\n",
157c7da899bSchristos     "Kf7cwX0PMSkZjx7k7kKdDlEucwVvDoqC+O9aJcqVmM6GDyNb9xENxd0XCXja6MZC\n",
158c7da899bSchristos     "yVgP4AwLauB2vSiEprYJyI1APph3iAEeDm60lTXX/wBM/tupQDDujKh2GPyvBRfJ\n",
159c7da899bSchristos     "+wEDwGg3ICwvu4gO4zeC5qnFR+bpL9t5tOMAQnVZ0NWv+k7mkd2LbHdD44dxrfXC\n",
160c7da899bSchristos     "nhtfERx99SDmC/jtUAJrGhtCO8acr7exCeYcduN7KKCm91OeCJKK6OzWst0Og1DB\n",
161c7da899bSchristos     "kwzzU2rL3G65CrZ7H0SZsQ==\n",
162c7da899bSchristos     "-----END X509 CRL-----\n",
163c7da899bSchristos     NULL
164c7da899bSchristos };
165c7da899bSchristos 
166c7da899bSchristos /*
167c7da899bSchristos  * kUnknownCriticalCRL2 is kBasicCRL but with a critical issuing distribution
168c7da899bSchristos  * point extension followed by an unknown critical extension
169c7da899bSchristos  */
170c7da899bSchristos static const char *kUnknownCriticalCRL2[] = {
171c7da899bSchristos     "-----BEGIN X509 CRL-----\n",
172c7da899bSchristos     "MIIBzzCBuAIBATANBgkqhkiG9w0BAQsFADBOMQswCQYDVQQGEwJVUzETMBEGA1UE\n",
173c7da899bSchristos     "CAwKQ2FsaWZvcm5pYTEWMBQGA1UEBwwNTW91bnRhaW4gVmlldzESMBAGA1UECgwJ\n",
174c7da899bSchristos     "Qm9yaW5nU1NMFw0xNjA5MjYxNTEwNTVaFw0xNjEwMjYxNTEwNTVaoDYwNDAKBgNV\n",
175c7da899bSchristos     "HRQEAwIBATARBgNVHRwBAf8EBzAFoQMBAf8wEwYMKoZIhvcSBAGEtwkAAQH/BAAw\n",
176c7da899bSchristos     "DQYJKoZIhvcNAQELBQADggEBACTcpQC8jXL12JN5YzOcQ64ubQIe0XxRAd30p7qB\n",
177c7da899bSchristos     "BTXGpgqBjrjxRfLms7EBYodEXB2oXMsDq3km0vT1MfYdsDD05S+SQ9CDsq/pUfaC\n",
178c7da899bSchristos     "E2WNI5p8WircRnroYvbN2vkjlRbMd1+yNITohXYXCJwjEOAWOx3XIM10bwPYBv4R\n",
179c7da899bSchristos     "rDobuLHoMgL3yHgMHmAkP7YpkBucNqeBV8cCdeAZLuhXFWi6yfr3r/X18yWbC/r2\n",
180c7da899bSchristos     "2xXdkrSqXLFo7ToyP8YKTgiXpya4x6m53biEYwa2ULlas0igL6DK7wjYZX95Uy7H\n",
181c7da899bSchristos     "GKljn9weIYiMPV/BzGymwfv2EW0preLwtyJNJPaxbdin6Jc=\n",
182c7da899bSchristos     "-----END X509 CRL-----\n",
183c7da899bSchristos     NULL
184c7da899bSchristos };
185c7da899bSchristos 
18613d40330Schristos static const char **unknown_critical_crls[] = {
18713d40330Schristos     kUnknownCriticalCRL, kUnknownCriticalCRL2
18813d40330Schristos };
18913d40330Schristos 
19013d40330Schristos static X509 *test_root = NULL;
19113d40330Schristos static X509 *test_leaf = NULL;
192c7da899bSchristos 
193c7da899bSchristos /*
194c7da899bSchristos  * Glue an array of strings together.  Return a BIO and put the string
195c7da899bSchristos  * into |*out| so we can free it.
196c7da899bSchristos  */
19713d40330Schristos static BIO *glue2bio(const char **pem, char **out)
198c7da899bSchristos {
199c7da899bSchristos     size_t s = 0;
200c7da899bSchristos 
20113d40330Schristos     *out = glue_strings(pem, &s);
202c7da899bSchristos     return BIO_new_mem_buf(*out, s);
203c7da899bSchristos }
204c7da899bSchristos 
205c7da899bSchristos /*
206c7da899bSchristos  * Create a CRL from an array of strings.
207c7da899bSchristos  */
208c7da899bSchristos static X509_CRL *CRL_from_strings(const char **pem)
209c7da899bSchristos {
210b0d17251Schristos     X509_CRL *crl;
211c7da899bSchristos     char *p;
21213d40330Schristos     BIO *b = glue2bio(pem, &p);
213b0d17251Schristos 
214b0d17251Schristos     if (b == NULL) {
215b0d17251Schristos         OPENSSL_free(p);
216b0d17251Schristos         return NULL;
217b0d17251Schristos     }
218b0d17251Schristos 
219b0d17251Schristos     crl = PEM_read_bio_X509_CRL(b, NULL, NULL, NULL);
220c7da899bSchristos 
221c7da899bSchristos     OPENSSL_free(p);
222c7da899bSchristos     BIO_free(b);
223c7da899bSchristos     return crl;
224c7da899bSchristos }
225c7da899bSchristos 
226c7da899bSchristos /*
227c7da899bSchristos  * Create an X509 from an array of strings.
228c7da899bSchristos  */
229c7da899bSchristos static X509 *X509_from_strings(const char **pem)
230c7da899bSchristos {
231b0d17251Schristos     X509 *x;
232c7da899bSchristos     char *p;
23313d40330Schristos     BIO *b = glue2bio(pem, &p);
234b0d17251Schristos 
235b0d17251Schristos     if (b == NULL) {
236b0d17251Schristos         OPENSSL_free(p);
237b0d17251Schristos         return NULL;
238b0d17251Schristos     }
239b0d17251Schristos 
240b0d17251Schristos     x = PEM_read_bio_X509(b, NULL, NULL, NULL);
241c7da899bSchristos 
242c7da899bSchristos     OPENSSL_free(p);
243c7da899bSchristos     BIO_free(b);
244c7da899bSchristos     return x;
245c7da899bSchristos }
246c7da899bSchristos 
247c7da899bSchristos /*
248c7da899bSchristos  * Verify |leaf| certificate (chained up to |root|).  |crls| if
249c7da899bSchristos  * not NULL, is a list of CRLs to include in the verification. It is
250c7da899bSchristos  * also free'd before returning, which is kinda yucky but convenient.
251c7da899bSchristos  * Returns a value from X509_V_ERR_xxx or X509_V_OK.
252c7da899bSchristos  */
253c7da899bSchristos static int verify(X509 *leaf, X509 *root, STACK_OF(X509_CRL) *crls,
254c7da899bSchristos                   unsigned long flags)
255c7da899bSchristos {
256c7da899bSchristos     X509_STORE_CTX *ctx = X509_STORE_CTX_new();
257c7da899bSchristos     X509_STORE *store = X509_STORE_new();
258c7da899bSchristos     X509_VERIFY_PARAM *param = X509_VERIFY_PARAM_new();
259c7da899bSchristos     STACK_OF(X509) *roots = sk_X509_new_null();
260c7da899bSchristos     int status = X509_V_ERR_UNSPECIFIED;
261c7da899bSchristos 
26213d40330Schristos     if (!TEST_ptr(ctx)
26313d40330Schristos         || !TEST_ptr(store)
26413d40330Schristos         || !TEST_ptr(param)
26513d40330Schristos         || !TEST_ptr(roots))
266c7da899bSchristos         goto err;
267c7da899bSchristos 
268c7da899bSchristos     /* Create a stack; upref the cert because we free it below. */
269c7da899bSchristos     X509_up_ref(root);
27013d40330Schristos     if (!TEST_true(sk_X509_push(roots, root))
27113d40330Schristos         || !TEST_true(X509_STORE_CTX_init(ctx, store, leaf, NULL)))
272c7da899bSchristos         goto err;
273c7da899bSchristos     X509_STORE_CTX_set0_trusted_stack(ctx, roots);
274c7da899bSchristos     X509_STORE_CTX_set0_crls(ctx, crls);
275c7da899bSchristos     X509_VERIFY_PARAM_set_time(param, PARAM_TIME);
27613d40330Schristos     if (!TEST_long_eq((long)X509_VERIFY_PARAM_get_time(param), PARAM_TIME))
277c7da899bSchristos         goto err;
278c7da899bSchristos     X509_VERIFY_PARAM_set_depth(param, 16);
279c7da899bSchristos     if (flags)
280c7da899bSchristos         X509_VERIFY_PARAM_set_flags(param, flags);
281c7da899bSchristos     X509_STORE_CTX_set0_param(ctx, param);
28213d40330Schristos     param = NULL;
283c7da899bSchristos 
284c7da899bSchristos     ERR_clear_error();
285c7da899bSchristos     status = X509_verify_cert(ctx) == 1 ? X509_V_OK
286c7da899bSchristos                                         : X509_STORE_CTX_get_error(ctx);
287c7da899bSchristos err:
288c7da899bSchristos     sk_X509_pop_free(roots, X509_free);
289c7da899bSchristos     sk_X509_CRL_pop_free(crls, X509_CRL_free);
29013d40330Schristos     X509_VERIFY_PARAM_free(param);
291c7da899bSchristos     X509_STORE_CTX_free(ctx);
292c7da899bSchristos     X509_STORE_free(store);
293c7da899bSchristos     return status;
294c7da899bSchristos }
295c7da899bSchristos 
296c7da899bSchristos /*
297c7da899bSchristos  * Create a stack of CRL's.  Upref each one because we call pop_free on
298c7da899bSchristos  * the stack and need to keep the CRL's around until the test exits.
299c7da899bSchristos  * Yes this crashes on malloc failure; it forces us to debug.
300c7da899bSchristos  */
301c7da899bSchristos static STACK_OF(X509_CRL) *make_CRL_stack(X509_CRL *x1, X509_CRL *x2)
302c7da899bSchristos {
303c7da899bSchristos     STACK_OF(X509_CRL) *sk = sk_X509_CRL_new_null();
304c7da899bSchristos 
305c7da899bSchristos     sk_X509_CRL_push(sk, x1);
306c7da899bSchristos     X509_CRL_up_ref(x1);
307c7da899bSchristos     if (x2 != NULL) {
308c7da899bSchristos         sk_X509_CRL_push(sk, x2);
309c7da899bSchristos         X509_CRL_up_ref(x2);
310c7da899bSchristos     }
311c7da899bSchristos     return sk;
312c7da899bSchristos }
313c7da899bSchristos 
31413d40330Schristos static int test_basic_crl(void)
315c7da899bSchristos {
316c7da899bSchristos     X509_CRL *basic_crl = CRL_from_strings(kBasicCRL);
317c7da899bSchristos     X509_CRL *revoked_crl = CRL_from_strings(kRevokedCRL);
31813d40330Schristos     int r;
319c7da899bSchristos 
32013d40330Schristos     r = TEST_ptr(basic_crl)
32113d40330Schristos         && TEST_ptr(revoked_crl)
32213d40330Schristos         && TEST_int_eq(verify(test_leaf, test_root,
32313d40330Schristos                               make_CRL_stack(basic_crl, NULL),
32413d40330Schristos                               X509_V_FLAG_CRL_CHECK), X509_V_OK)
32513d40330Schristos         && TEST_int_eq(verify(test_leaf, test_root,
32613d40330Schristos                               make_CRL_stack(basic_crl, revoked_crl),
32713d40330Schristos                               X509_V_FLAG_CRL_CHECK), X509_V_ERR_CERT_REVOKED);
328c7da899bSchristos     X509_CRL_free(basic_crl);
329c7da899bSchristos     X509_CRL_free(revoked_crl);
33013d40330Schristos     return r;
331c7da899bSchristos }
332c7da899bSchristos 
33313d40330Schristos static int test_no_crl(void)
334c7da899bSchristos {
33513d40330Schristos     return TEST_int_eq(verify(test_leaf, test_root, NULL,
33613d40330Schristos                               X509_V_FLAG_CRL_CHECK),
33713d40330Schristos                        X509_V_ERR_UNABLE_TO_GET_CRL);
33813d40330Schristos }
33913d40330Schristos 
34013d40330Schristos static int test_bad_issuer_crl(void)
34113d40330Schristos {
34213d40330Schristos     X509_CRL *bad_issuer_crl = CRL_from_strings(kBadIssuerCRL);
34313d40330Schristos     int r;
34413d40330Schristos 
34513d40330Schristos     r = TEST_ptr(bad_issuer_crl)
34613d40330Schristos         && TEST_int_eq(verify(test_leaf, test_root,
34713d40330Schristos                               make_CRL_stack(bad_issuer_crl, NULL),
34813d40330Schristos                               X509_V_FLAG_CRL_CHECK),
34913d40330Schristos                        X509_V_ERR_UNABLE_TO_GET_CRL);
35013d40330Schristos     X509_CRL_free(bad_issuer_crl);
35113d40330Schristos     return r;
35213d40330Schristos }
35313d40330Schristos 
35413d40330Schristos static int test_known_critical_crl(void)
35513d40330Schristos {
35613d40330Schristos     X509_CRL *known_critical_crl = CRL_from_strings(kKnownCriticalCRL);
35713d40330Schristos     int r;
35813d40330Schristos 
35913d40330Schristos     r = TEST_ptr(known_critical_crl)
36013d40330Schristos         && TEST_int_eq(verify(test_leaf, test_root,
36113d40330Schristos                               make_CRL_stack(known_critical_crl, NULL),
36213d40330Schristos                               X509_V_FLAG_CRL_CHECK), X509_V_OK);
36313d40330Schristos     X509_CRL_free(known_critical_crl);
36413d40330Schristos     return r;
36513d40330Schristos }
36613d40330Schristos 
36713d40330Schristos static int test_unknown_critical_crl(int n)
36813d40330Schristos {
36913d40330Schristos     X509_CRL *unknown_critical_crl = CRL_from_strings(unknown_critical_crls[n]);
37013d40330Schristos     int r;
37113d40330Schristos 
37213d40330Schristos     r = TEST_ptr(unknown_critical_crl)
37313d40330Schristos         && TEST_int_eq(verify(test_leaf, test_root,
37413d40330Schristos                               make_CRL_stack(unknown_critical_crl, NULL),
37513d40330Schristos                               X509_V_FLAG_CRL_CHECK),
37613d40330Schristos                        X509_V_ERR_UNHANDLED_CRITICAL_CRL_EXTENSION);
37713d40330Schristos     X509_CRL_free(unknown_critical_crl);
37813d40330Schristos     return r;
37913d40330Schristos }
38013d40330Schristos 
381*97e3c585Schristos static int test_reuse_crl(int idx)
382b88c74d5Schristos {
383*97e3c585Schristos     X509_CRL *result, *reused_crl = CRL_from_strings(kBasicCRL);
384*97e3c585Schristos     X509_CRL *addref_crl = NULL;
385*97e3c585Schristos     char *p = NULL;
386*97e3c585Schristos     BIO *b = NULL;
387*97e3c585Schristos     int r = 0;
388b88c74d5Schristos 
389*97e3c585Schristos     if (!TEST_ptr(reused_crl))
390*97e3c585Schristos         goto err;
391*97e3c585Schristos 
392*97e3c585Schristos     if (idx & 1) {
393*97e3c585Schristos         if (!TEST_true(X509_CRL_up_ref(reused_crl)))
394*97e3c585Schristos             goto err;
395*97e3c585Schristos 	addref_crl = reused_crl;
396b0d17251Schristos     }
397b0d17251Schristos 
398*97e3c585Schristos     idx >>= 1;
399*97e3c585Schristos     b = glue2bio(idx == 2 ? kRevokedCRL : kInvalidCRL + idx, &p);
400b88c74d5Schristos 
401*97e3c585Schristos     if (!TEST_ptr(b))
402*97e3c585Schristos         goto err;
403*97e3c585Schristos 
404*97e3c585Schristos     result = PEM_read_bio_X509_CRL(b, &reused_crl, NULL, NULL);
405*97e3c585Schristos 
406*97e3c585Schristos     switch (idx) {
407*97e3c585Schristos     case 0: /* valid PEM + invalid DER */
408*97e3c585Schristos         if (!TEST_ptr_null(result)
409*97e3c585Schristos                 || !TEST_ptr_null(reused_crl))
410*97e3c585Schristos             goto err;
411*97e3c585Schristos         break;
412*97e3c585Schristos     case 1: /* invalid PEM */
413*97e3c585Schristos         if (!TEST_ptr_null(result)
414*97e3c585Schristos                 || !TEST_ptr(reused_crl))
415*97e3c585Schristos             goto err;
416*97e3c585Schristos         break;
417*97e3c585Schristos     case 2:
418*97e3c585Schristos         if (!TEST_ptr(result)
419*97e3c585Schristos                 || !TEST_ptr(reused_crl)
420*97e3c585Schristos                 || !TEST_ptr_eq(result, reused_crl))
421*97e3c585Schristos             goto err;
422*97e3c585Schristos         break;
423*97e3c585Schristos     }
424*97e3c585Schristos 
425*97e3c585Schristos     r = 1;
426*97e3c585Schristos 
427*97e3c585Schristos  err:
428b88c74d5Schristos     OPENSSL_free(p);
429b88c74d5Schristos     BIO_free(b);
430b88c74d5Schristos     X509_CRL_free(reused_crl);
431*97e3c585Schristos     X509_CRL_free(addref_crl);
432*97e3c585Schristos     return r;
433b88c74d5Schristos }
434b88c74d5Schristos 
43513d40330Schristos int setup_tests(void)
43613d40330Schristos {
43713d40330Schristos     if (!TEST_ptr(test_root = X509_from_strings(kCRLTestRoot))
43813d40330Schristos         || !TEST_ptr(test_leaf = X509_from_strings(kCRLTestLeaf)))
43913d40330Schristos         return 0;
44013d40330Schristos 
44113d40330Schristos     ADD_TEST(test_no_crl);
44213d40330Schristos     ADD_TEST(test_basic_crl);
44313d40330Schristos     ADD_TEST(test_bad_issuer_crl);
44413d40330Schristos     ADD_TEST(test_known_critical_crl);
44513d40330Schristos     ADD_ALL_TESTS(test_unknown_critical_crl, OSSL_NELEM(unknown_critical_crls));
446*97e3c585Schristos     ADD_ALL_TESTS(test_reuse_crl, 6);
44713d40330Schristos     return 1;
44813d40330Schristos }
44913d40330Schristos 
45013d40330Schristos void cleanup_tests(void)
45113d40330Schristos {
45213d40330Schristos     X509_free(test_root);
45313d40330Schristos     X509_free(test_leaf);
454c7da899bSchristos }
455