diff options
| author | tb <> | 2026-06-23 08:24:49 +0000 |
|---|---|---|
| committer | tb <> | 2026-06-23 08:24:49 +0000 |
| commit | 9651bfd8dce17526bd1584b10704a2477ca54c44 (patch) | |
| tree | 74ef25b332c651a6b2a42810469584d774fe3f9c | |
| parent | f22bfb370eed5ae169fc2a92418836ea99435c1e (diff) | |
| download | openbsd-9651bfd8dce17526bd1584b10704a2477ca54c44.tar.gz openbsd-9651bfd8dce17526bd1584b10704a2477ca54c44.tar.bz2 openbsd-9651bfd8dce17526bd1584b10704a2477ca54c44.zip | |
libcrypto/x509 regress: x509_crl regress from Boring via OpenSSL #1775
Currently expected to fail due to mishandling of unknown critical
extensions in x_crl.c, to be fixed shortly.
| -rw-r--r-- | src/regress/lib/libcrypto/x509/Makefile | 6 | ||||
| -rw-r--r-- | src/regress/lib/libcrypto/x509/x509_crl.c | 364 |
2 files changed, 368 insertions, 2 deletions
diff --git a/src/regress/lib/libcrypto/x509/Makefile b/src/regress/lib/libcrypto/x509/Makefile index 94e9e476a0..8765e91387 100644 --- a/src/regress/lib/libcrypto/x509/Makefile +++ b/src/regress/lib/libcrypto/x509/Makefile | |||
| @@ -1,11 +1,13 @@ | |||
| 1 | # $OpenBSD: Makefile,v 1.25 2025/05/05 06:33:34 tb Exp $ | 1 | # $OpenBSD: Makefile,v 1.26 2026/06/23 08:24:49 tb Exp $ |
| 2 | 2 | ||
| 3 | PROGS = constraints verify x509attribute x509req_ext callback | 3 | PROGS = constraints verify x509attribute x509req_ext callback |
| 4 | PROGS += expirecallback callbackfailures x509_asn1 x509_extensions_test | 4 | PROGS += expirecallback callbackfailures x509_asn1 x509_extensions_test |
| 5 | PROGS += x509_name_test | 5 | PROGS += x509_crl x509_name_test |
| 6 | LDADD = -lcrypto | 6 | LDADD = -lcrypto |
| 7 | DPADD = ${LIBCRYPTO} | 7 | DPADD = ${LIBCRYPTO} |
| 8 | 8 | ||
| 9 | REGRESS_EXPECTED_FAILURES = run-regress-x509_crl | ||
| 10 | |||
| 9 | LDADD_constraints = ${CRYPTO_INT} | 11 | LDADD_constraints = ${CRYPTO_INT} |
| 10 | LDADD_verify = ${CRYPTO_INT} | 12 | LDADD_verify = ${CRYPTO_INT} |
| 11 | 13 | ||
diff --git a/src/regress/lib/libcrypto/x509/x509_crl.c b/src/regress/lib/libcrypto/x509/x509_crl.c new file mode 100644 index 0000000000..b63376e5b5 --- /dev/null +++ b/src/regress/lib/libcrypto/x509/x509_crl.c | |||
| @@ -0,0 +1,364 @@ | |||
| 1 | /* $OpenBSD: x509_crl.c,v 1.1 2026/06/23 08:24:49 tb Exp $ */ | ||
| 2 | |||
| 3 | /* | ||
| 4 | * Copyright (c) 2015, Google Inc. | ||
| 5 | * | ||
| 6 | * Permission to use, copy, modify, and/or distribute this software for any | ||
| 7 | * purpose with or without fee is hereby granted, provided that the above | ||
| 8 | * copyright notice and this permission notice appear in all copies. | ||
| 9 | * | ||
| 10 | * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES | ||
| 11 | * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF | ||
| 12 | * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY | ||
| 13 | * SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES | ||
| 14 | * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION | ||
| 15 | * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN | ||
| 16 | * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. | ||
| 17 | */ | ||
| 18 | |||
| 19 | #include <openssl/bio.h> | ||
| 20 | #include <openssl/crypto.h> | ||
| 21 | #include <openssl/err.h> | ||
| 22 | #include <openssl/pem.h> | ||
| 23 | #include <openssl/x509.h> | ||
| 24 | |||
| 25 | #include <err.h> | ||
| 26 | #include <stdio.h> | ||
| 27 | #include <string.h> | ||
| 28 | |||
| 29 | static const char *kCRLTestRoot = | ||
| 30 | "-----BEGIN CERTIFICATE-----\n" | ||
| 31 | "MIIDbzCCAlegAwIBAgIJAODri7v0dDUFMA0GCSqGSIb3DQEBCwUAME4xCzAJBgNV\n" | ||
| 32 | "BAYTAlVTMRMwEQYDVQQIDApDYWxpZm9ybmlhMRYwFAYDVQQHDA1Nb3VudGFpbiBW\n" | ||
| 33 | "aWV3MRIwEAYDVQQKDAlCb3JpbmdTU0wwHhcNMTYwOTI2MTUwNjI2WhcNMjYwOTI0\n" | ||
| 34 | "MTUwNjI2WjBOMQswCQYDVQQGEwJVUzETMBEGA1UECAwKQ2FsaWZvcm5pYTEWMBQG\n" | ||
| 35 | "A1UEBwwNTW91bnRhaW4gVmlldzESMBAGA1UECgwJQm9yaW5nU1NMMIIBIjANBgkq\n" | ||
| 36 | "hkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAo16WiLWZuaymsD8n5SKPmxV1y6jjgr3B\n" | ||
| 37 | "S/dUBpbrzd1aeFzNlI8l2jfAnzUyp+I21RQ+nh/MhqjGElkTtK9xMn1Y+S9GMRh+\n" | ||
| 38 | "5R/Du0iCb1tCZIPY07Tgrb0KMNWe0v2QKVVruuYSgxIWodBfxlKO64Z8AJ5IbnWp\n" | ||
| 39 | "uRqO6rctN9qUoMlTIAB6dL4G0tDJ/PGFWOJYwOMEIX54bly2wgyYJVBKiRRt4f7n\n" | ||
| 40 | "8H922qmvPNA9idmX9G1VAtgV6x97XXi7ULORIQvn9lVQF6nTYDBJhyuPB+mLThbL\n" | ||
| 41 | "P2o9orxGx7aCtnnBZUIxUvHNOI0FaSaZH7Fi0xsZ/GkG2HZe7ImPJwIDAQABo1Aw\n" | ||
| 42 | "TjAdBgNVHQ4EFgQUWPt3N5cZ/CRvubbrkqfBnAqhq94wHwYDVR0jBBgwFoAUWPt3\n" | ||
| 43 | "N5cZ/CRvubbrkqfBnAqhq94wDAYDVR0TBAUwAwEB/zANBgkqhkiG9w0BAQsFAAOC\n" | ||
| 44 | "AQEAORu6M0MOwXy+3VEBwNilfTxyqDfruQsc1jA4PT8Oe8zora1WxE1JB4q2FJOz\n" | ||
| 45 | "EAuM3H/NXvEnBuN+ITvKZAJUfm4NKX97qmjMJwLKWe1gVv+VQTr63aR7mgWJReQN\n" | ||
| 46 | "XdMztlVeZs2dppV6uEg3ia1X0G7LARxGpA9ETbMyCpb39XxlYuTClcbA5ftDN99B\n" | ||
| 47 | "3Xg9KNdd++Ew22O3HWRDvdDpTO/JkzQfzi3sYwUtzMEonENhczJhGf7bQMmvL/w5\n" | ||
| 48 | "24Wxj4Z7KzzWIHsNqE/RIs6RV3fcW61j/mRgW2XyoWnMVeBzvcJr9NXp4VQYmFPw\n" | ||
| 49 | "amd8GKMZQvP0ufGnUn7D7uartA==\n" | ||
| 50 | "-----END CERTIFICATE-----\n"; | ||
| 51 | |||
| 52 | static const char *kCRLTestLeaf = | ||
| 53 | "-----BEGIN CERTIFICATE-----\n" | ||
| 54 | "MIIDkDCCAnigAwIBAgICEAAwDQYJKoZIhvcNAQELBQAwTjELMAkGA1UEBhMCVVMx\n" | ||
| 55 | "EzARBgNVBAgMCkNhbGlmb3JuaWExFjAUBgNVBAcMDU1vdW50YWluIFZpZXcxEjAQ\n" | ||
| 56 | "BgNVBAoMCUJvcmluZ1NTTDAeFw0xNjA5MjYxNTA4MzFaFw0xNzA5MjYxNTA4MzFa\n" | ||
| 57 | "MEsxCzAJBgNVBAYTAlVTMRMwEQYDVQQIDApDYWxpZm9ybmlhMRIwEAYDVQQKDAlC\n" | ||
| 58 | "b3JpbmdTU0wxEzARBgNVBAMMCmJvcmluZy5zc2wwggEiMA0GCSqGSIb3DQEBAQUA\n" | ||
| 59 | "A4IBDwAwggEKAoIBAQDc5v1S1M0W+QWM+raWfO0LH8uvqEwuJQgODqMaGnSlWUx9\n" | ||
| 60 | "8iQcnWfjyPja3lWg9K62hSOFDuSyEkysKHDxijz5R93CfLcfnVXjWQDJe7EJTTDP\n" | ||
| 61 | "ozEvxN6RjAeYv7CF000euYr3QT5iyBjg76+bon1p0jHZBJeNPP1KqGYgyxp+hzpx\n" | ||
| 62 | "e0gZmTlGAXd8JQK4v8kpdYwD6PPifFL/jpmQpqOtQmH/6zcLjY4ojmqpEdBqIKIX\n" | ||
| 63 | "+saA29hMq0+NK3K+wgg31RU+cVWxu3tLOIiesETkeDgArjWRS1Vkzbi4v9SJxtNu\n" | ||
| 64 | "OZuAxWiynRJw3JwH/OFHYZIvQqz68ZBoj96cepjPAgMBAAGjezB5MAkGA1UdEwQC\n" | ||
| 65 | "MAAwLAYJYIZIAYb4QgENBB8WHU9wZW5TU0wgR2VuZXJhdGVkIENlcnRpZmljYXRl\n" | ||
| 66 | "MB0GA1UdDgQWBBTGn0OVVh/aoYt0bvEKG+PIERqnDzAfBgNVHSMEGDAWgBRY+3c3\n" | ||
| 67 | "lxn8JG+5tuuSp8GcCqGr3jANBgkqhkiG9w0BAQsFAAOCAQEAd2nM8gCQN2Dc8QJw\n" | ||
| 68 | "XSZXyuI3DBGGCHcay/3iXu0JvTC3EiQo8J6Djv7WLI0N5KH8mkm40u89fJAB2lLZ\n" | ||
| 69 | "ShuHVtcC182bOKnePgwp9CNwQ21p0rDEu/P3X46ZvFgdxx82E9xLa0tBB8PiPDWh\n" | ||
| 70 | "lV16jbaKTgX5AZqjnsyjR5o9/mbZVupZJXx5Syq+XA8qiJfstSYJs4KyKK9UOjql\n" | ||
| 71 | "ICkJVKpi2ahDBqX4MOH4SLfzVk8pqSpviS6yaA1RXqjpkxiN45WWaXDldVHMSkhC\n" | ||
| 72 | "5CNXsXi4b1nAntu89crwSLA3rEwzCWeYj+BX7e1T9rr3oJdwOU/2KQtW1js1yQUG\n" | ||
| 73 | "tjJMFw==\n" | ||
| 74 | "-----END CERTIFICATE-----\n"; | ||
| 75 | |||
| 76 | static const char *kBasicCRL = | ||
| 77 | "-----BEGIN X509 CRL-----\n" | ||
| 78 | "MIIBpzCBkAIBATANBgkqhkiG9w0BAQsFADBOMQswCQYDVQQGEwJVUzETMBEGA1UE\n" | ||
| 79 | "CAwKQ2FsaWZvcm5pYTEWMBQGA1UEBwwNTW91bnRhaW4gVmlldzESMBAGA1UECgwJ\n" | ||
| 80 | "Qm9yaW5nU1NMFw0xNjA5MjYxNTEwNTVaFw0xNjEwMjYxNTEwNTVaoA4wDDAKBgNV\n" | ||
| 81 | "HRQEAwIBATANBgkqhkiG9w0BAQsFAAOCAQEAnrBKKgvd9x9zwK9rtUvVeFeJ7+LN\n" | ||
| 82 | "ZEAc+a5oxpPNEsJx6hXoApYEbzXMxuWBQoCs5iEBycSGudct21L+MVf27M38KrWo\n" | ||
| 83 | "eOkq0a2siqViQZO2Fb/SUFR0k9zb8xl86Zf65lgPplALun0bV/HT7MJcl04Tc4os\n" | ||
| 84 | "dsAReBs5nqTGNEd5AlC1iKHvQZkM//MD51DspKnDpsDiUVi54h9C1SpfZmX8H2Vv\n" | ||
| 85 | "diyu0fZ/bPAM3VAGawatf/SyWfBMyKpoPXEG39oAzmjjOj8en82psn7m474IGaho\n" | ||
| 86 | "/vBbhl1ms5qQiLYPjm4YELtnXQoFyC72tBjbdFd/ZE9k4CNKDbxFUXFbkw==\n" | ||
| 87 | "-----END X509 CRL-----\n"; | ||
| 88 | |||
| 89 | static const char *kRevokedCRL = | ||
| 90 | "-----BEGIN X509 CRL-----\n" | ||
| 91 | "MIIBvjCBpwIBATANBgkqhkiG9w0BAQsFADBOMQswCQYDVQQGEwJVUzETMBEGA1UE\n" | ||
| 92 | "CAwKQ2FsaWZvcm5pYTEWMBQGA1UEBwwNTW91bnRhaW4gVmlldzESMBAGA1UECgwJ\n" | ||
| 93 | "Qm9yaW5nU1NMFw0xNjA5MjYxNTEyNDRaFw0xNjEwMjYxNTEyNDRaMBUwEwICEAAX\n" | ||
| 94 | "DTE2MDkyNjE1MTIyNlqgDjAMMAoGA1UdFAQDAgECMA0GCSqGSIb3DQEBCwUAA4IB\n" | ||
| 95 | "AQCUGaM4DcWzlQKrcZvI8TMeR8BpsvQeo5BoI/XZu2a8h//PyRyMwYeaOM+3zl0d\n" | ||
| 96 | "sjgCT8b3C1FPgT+P2Lkowv7rJ+FHJRNQkogr+RuqCSPTq65ha4WKlRGWkMFybzVH\n" | ||
| 97 | "NloxC+aU3lgp/NlX9yUtfqYmJek1CDrOOGPrAEAwj1l/BUeYKNGqfBWYJQtPJu+5\n" | ||
| 98 | "OaSvIYGpETCZJscUWODmLEb/O3DM438vLvxonwGqXqS0KX37+CHpUlyhnSovxXxp\n" | ||
| 99 | "Pz4aF+L7OtczxL0GYtD2fR9B7TDMqsNmHXgQrixvvOY7MUdLGbd4RfJL3yA53hyO\n" | ||
| 100 | "xzfKY2TzxLiOmctG0hXFkH5J\n" | ||
| 101 | "-----END X509 CRL-----\n"; | ||
| 102 | |||
| 103 | static const char *kBadIssuerCRL = | ||
| 104 | "-----BEGIN X509 CRL-----\n" | ||
| 105 | "MIIBwjCBqwIBATANBgkqhkiG9w0BAQsFADBSMQswCQYDVQQGEwJVUzETMBEGA1UE\n" | ||
| 106 | "CAwKQ2FsaWZvcm5pYTEWMBQGA1UEBwwNTW91bnRhaW4gVmlldzEWMBQGA1UECgwN\n" | ||
| 107 | "Tm90IEJvcmluZ1NTTBcNMTYwOTI2MTUxMjQ0WhcNMTYxMDI2MTUxMjQ0WjAVMBMC\n" | ||
| 108 | "AhAAFw0xNjA5MjYxNTEyMjZaoA4wDDAKBgNVHRQEAwIBAjANBgkqhkiG9w0BAQsF\n" | ||
| 109 | "AAOCAQEAlBmjOA3Fs5UCq3GbyPEzHkfAabL0HqOQaCP12btmvIf/z8kcjMGHmjjP\n" | ||
| 110 | "t85dHbI4Ak/G9wtRT4E/j9i5KML+6yfhRyUTUJKIK/kbqgkj06uuYWuFipURlpDB\n" | ||
| 111 | "cm81RzZaMQvmlN5YKfzZV/clLX6mJiXpNQg6zjhj6wBAMI9ZfwVHmCjRqnwVmCUL\n" | ||
| 112 | "TybvuTmkryGBqREwmSbHFFjg5ixG/ztwzON/Ly78aJ8Bql6ktCl9+/gh6VJcoZ0q\n" | ||
| 113 | "L8V8aT8+Ghfi+zrXM8S9BmLQ9n0fQe0wzKrDZh14EK4sb7zmOzFHSxm3eEXyS98g\n" | ||
| 114 | "Od4cjsc3ymNk88S4jpnLRtIVxZB+SQ==\n" | ||
| 115 | "-----END X509 CRL-----\n"; | ||
| 116 | |||
| 117 | /* | ||
| 118 | * This is kBasicCRL but with a critical issuing distribution point | ||
| 119 | * extension. | ||
| 120 | */ | ||
| 121 | static const char *kKnownCriticalCRL = | ||
| 122 | "-----BEGIN X509 CRL-----\n" | ||
| 123 | "MIIBujCBowIBATANBgkqhkiG9w0BAQsFADBOMQswCQYDVQQGEwJVUzETMBEGA1UE\n" | ||
| 124 | "CAwKQ2FsaWZvcm5pYTEWMBQGA1UEBwwNTW91bnRhaW4gVmlldzESMBAGA1UECgwJ\n" | ||
| 125 | "Qm9yaW5nU1NMFw0xNjA5MjYxNTEwNTVaFw0xNjEwMjYxNTEwNTVaoCEwHzAKBgNV\n" | ||
| 126 | "HRQEAwIBATARBgNVHRwBAf8EBzAFoQMBAf8wDQYJKoZIhvcNAQELBQADggEBAA+3\n" | ||
| 127 | "i+5e5Ub8sccfgOBs6WVJFI9c8gvJjrJ8/dYfFIAuCyeocs7DFXn1n13CRZ+URR/Q\n" | ||
| 128 | "mVWgU28+xeusuSPYFpd9cyYTcVyNUGNTI3lwgcE/yVjPaOmzSZKdPakApRxtpKKQ\n" | ||
| 129 | "NN/56aQz3bnT/ZSHQNciRB8U6jiD9V30t0w+FDTpGaG+7bzzUH3UVF9xf9Ctp60A\n" | ||
| 130 | "3mfLe0scas7owSt4AEFuj2SPvcE7yvdOXbu+IEv21cEJUVExJAbhvIweHXh6yRW+\n" | ||
| 131 | "7VVeiNzdIjkZjyTmAzoXGha4+wbxXyBRbfH+XWcO/H+8nwyG8Gktdu2QB9S9nnIp\n" | ||
| 132 | "o/1TpfOMSGhMyMoyPrk=\n" | ||
| 133 | "-----END X509 CRL-----\n"; | ||
| 134 | |||
| 135 | /* | ||
| 136 | * kUnknownCriticalCRL is kBasicCRL but with an unknown critical extension. | ||
| 137 | */ | ||
| 138 | static const char *kUnknownCriticalCRL = | ||
| 139 | "-----BEGIN X509 CRL-----\n" | ||
| 140 | "MIIBvDCBpQIBATANBgkqhkiG9w0BAQsFADBOMQswCQYDVQQGEwJVUzETMBEGA1UE\n" | ||
| 141 | "CAwKQ2FsaWZvcm5pYTEWMBQGA1UEBwwNTW91bnRhaW4gVmlldzESMBAGA1UECgwJ\n" | ||
| 142 | "Qm9yaW5nU1NMFw0xNjA5MjYxNTEwNTVaFw0xNjEwMjYxNTEwNTVaoCMwITAKBgNV\n" | ||
| 143 | "HRQEAwIBATATBgwqhkiG9xIEAYS3CQABAf8EADANBgkqhkiG9w0BAQsFAAOCAQEA\n" | ||
| 144 | "GvBP0xqL509InMj/3493YVRV+ldTpBv5uTD6jewzf5XdaxEQ/VjTNe5zKnxbpAib\n" | ||
| 145 | "Kf7cwX0PMSkZjx7k7kKdDlEucwVvDoqC+O9aJcqVmM6GDyNb9xENxd0XCXja6MZC\n" | ||
| 146 | "yVgP4AwLauB2vSiEprYJyI1APph3iAEeDm60lTXX/wBM/tupQDDujKh2GPyvBRfJ\n" | ||
| 147 | "+wEDwGg3ICwvu4gO4zeC5qnFR+bpL9t5tOMAQnVZ0NWv+k7mkd2LbHdD44dxrfXC\n" | ||
| 148 | "nhtfERx99SDmC/jtUAJrGhtCO8acr7exCeYcduN7KKCm91OeCJKK6OzWst0Og1DB\n" | ||
| 149 | "kwzzU2rL3G65CrZ7H0SZsQ==\n" | ||
| 150 | "-----END X509 CRL-----\n"; | ||
| 151 | |||
| 152 | /* | ||
| 153 | * kUnknownCriticalCRL2 is kBasicCRL but with a critical issuing distribution | ||
| 154 | * point extension followed by an unknown critical extension | ||
| 155 | */ | ||
| 156 | static const char *kUnknownCriticalCRL2 = | ||
| 157 | "-----BEGIN X509 CRL-----\n" | ||
| 158 | "MIIBzzCBuAIBATANBgkqhkiG9w0BAQsFADBOMQswCQYDVQQGEwJVUzETMBEGA1UE\n" | ||
| 159 | "CAwKQ2FsaWZvcm5pYTEWMBQGA1UEBwwNTW91bnRhaW4gVmlldzESMBAGA1UECgwJ\n" | ||
| 160 | "Qm9yaW5nU1NMFw0xNjA5MjYxNTEwNTVaFw0xNjEwMjYxNTEwNTVaoDYwNDAKBgNV\n" | ||
| 161 | "HRQEAwIBATARBgNVHRwBAf8EBzAFoQMBAf8wEwYMKoZIhvcSBAGEtwkAAQH/BAAw\n" | ||
| 162 | "DQYJKoZIhvcNAQELBQADggEBACTcpQC8jXL12JN5YzOcQ64ubQIe0XxRAd30p7qB\n" | ||
| 163 | "BTXGpgqBjrjxRfLms7EBYodEXB2oXMsDq3km0vT1MfYdsDD05S+SQ9CDsq/pUfaC\n" | ||
| 164 | "E2WNI5p8WircRnroYvbN2vkjlRbMd1+yNITohXYXCJwjEOAWOx3XIM10bwPYBv4R\n" | ||
| 165 | "rDobuLHoMgL3yHgMHmAkP7YpkBucNqeBV8cCdeAZLuhXFWi6yfr3r/X18yWbC/r2\n" | ||
| 166 | "2xXdkrSqXLFo7ToyP8YKTgiXpya4x6m53biEYwa2ULlas0igL6DK7wjYZX95Uy7H\n" | ||
| 167 | "GKljn9weIYiMPV/BzGymwfv2EW0preLwtyJNJPaxbdin6Jc=\n" | ||
| 168 | "-----END X509 CRL-----\n"; | ||
| 169 | |||
| 170 | static X509_CRL * | ||
| 171 | X509_CRL_from_PEM(const char *pem) | ||
| 172 | { | ||
| 173 | BIO *bio; | ||
| 174 | X509_CRL *crl; | ||
| 175 | |||
| 176 | if ((bio = BIO_new_mem_buf(pem, -1)) == NULL) | ||
| 177 | err(1, NULL); | ||
| 178 | if ((crl = PEM_read_bio_X509_CRL(bio, NULL, NULL, NULL)) == NULL) | ||
| 179 | errx(1, "PEM_read_bio_X509_CRL failed"); | ||
| 180 | BIO_free(bio); | ||
| 181 | |||
| 182 | return crl; | ||
| 183 | } | ||
| 184 | |||
| 185 | static X509 * | ||
| 186 | X509_from_PEM(const char *pem) | ||
| 187 | { | ||
| 188 | BIO *bio; | ||
| 189 | X509 *x509; | ||
| 190 | |||
| 191 | if ((bio = BIO_new_mem_buf(pem, -1)) == NULL) | ||
| 192 | err(1, NULL); | ||
| 193 | if ((x509 = PEM_read_bio_X509(bio, NULL, NULL, NULL)) == NULL) | ||
| 194 | errx(1, "PEM_read_bio_X509 failed"); | ||
| 195 | BIO_free(bio); | ||
| 196 | |||
| 197 | return x509; | ||
| 198 | } | ||
| 199 | |||
| 200 | /* | ||
| 201 | * Verify |leaf| certificate (chained up to |root|). |crls| if | ||
| 202 | * not NULL, is a list of CRLs to include in the verification. It is | ||
| 203 | * also free'd before returning, which is kinda yucky but convenient. | ||
| 204 | * Returns a value from X509_V_ERR_xxx or X509_V_OK. | ||
| 205 | */ | ||
| 206 | static int | ||
| 207 | verify(X509 *leaf, X509 *root, STACK_OF(X509_CRL) *crls, unsigned long flags) | ||
| 208 | { | ||
| 209 | X509_STORE_CTX *ctx; | ||
| 210 | X509_STORE *store; | ||
| 211 | X509_VERIFY_PARAM *param; | ||
| 212 | STACK_OF(X509) *roots; | ||
| 213 | int status = X509_V_ERR_UNSPECIFIED; | ||
| 214 | |||
| 215 | if ((ctx = X509_STORE_CTX_new()) == NULL) | ||
| 216 | errx(1, "X509_STORE_CTX_new"); | ||
| 217 | if ((store = X509_STORE_new()) == NULL) | ||
| 218 | errx(1, "X509_STORE_new"); | ||
| 219 | if ((param = X509_VERIFY_PARAM_new()) == NULL) | ||
| 220 | errx(1, "X509_VERIFY_PARAM_new"); | ||
| 221 | if ((roots = sk_X509_new_null()) == NULL) | ||
| 222 | errx(1, "sk_X509_new_null"); | ||
| 223 | |||
| 224 | /* Create a stack; upref the cert because we free it below. */ | ||
| 225 | X509_up_ref(root); | ||
| 226 | if (!sk_X509_push(roots, root)) | ||
| 227 | errx(1, "sk_X509_push"); | ||
| 228 | |||
| 229 | if (!X509_STORE_CTX_init(ctx, store, leaf, NULL)) | ||
| 230 | errx(1, "X509_STORE_CTX_init"); | ||
| 231 | |||
| 232 | X509_STORE_CTX_set0_trusted_stack(ctx, roots); | ||
| 233 | X509_STORE_CTX_set0_crls(ctx, crls); | ||
| 234 | X509_VERIFY_PARAM_set_time(param, 1474934400 /* Sep 27th, 2016 */); | ||
| 235 | X509_VERIFY_PARAM_set_depth(param, 16); | ||
| 236 | X509_VERIFY_PARAM_set_flags(param, flags); | ||
| 237 | X509_STORE_CTX_set0_param(ctx, param); | ||
| 238 | |||
| 239 | ERR_clear_error(); | ||
| 240 | status = X509_V_OK; | ||
| 241 | if (X509_verify_cert(ctx) != 1) | ||
| 242 | status = X509_STORE_CTX_get_error(ctx); | ||
| 243 | |||
| 244 | sk_X509_pop_free(roots, X509_free); | ||
| 245 | sk_X509_CRL_pop_free(crls, X509_CRL_free); | ||
| 246 | X509_STORE_CTX_free(ctx); | ||
| 247 | X509_STORE_free(store); | ||
| 248 | |||
| 249 | return status; | ||
| 250 | } | ||
| 251 | |||
| 252 | /* | ||
| 253 | * Create a stack of CRLs. Upref each one because we call pop_free on | ||
| 254 | * the stack and need to keep the CRLs around until the test exits. | ||
| 255 | * Yes this crashes on malloc failure; it forces us to debug. | ||
| 256 | */ | ||
| 257 | static STACK_OF(X509_CRL) * | ||
| 258 | make_CRL_stack(X509_CRL *x1, X509_CRL *x2) | ||
| 259 | { | ||
| 260 | STACK_OF(X509_CRL) *sk; | ||
| 261 | |||
| 262 | if ((sk = sk_X509_CRL_new_null()) == NULL) | ||
| 263 | errx(1, "sk_X509_CRL_new_null"); | ||
| 264 | |||
| 265 | if (sk_X509_CRL_push(sk, x1) <= 0) | ||
| 266 | errx(1, "sk_X509_CRL_push"); | ||
| 267 | X509_CRL_up_ref(x1); | ||
| 268 | if (x2 != NULL) { | ||
| 269 | if (sk_X509_CRL_push(sk, x2) <= 0) | ||
| 270 | errx(1, "sk_X509_CRL_push"); | ||
| 271 | X509_CRL_up_ref(x2); | ||
| 272 | } | ||
| 273 | |||
| 274 | return sk; | ||
| 275 | } | ||
| 276 | |||
| 277 | int | ||
| 278 | main(void) | ||
| 279 | { | ||
| 280 | X509 *root, *leaf; | ||
| 281 | X509_CRL *basic_crl, *revoked_crl, *bad_issuer_crl, *known_critical_crl; | ||
| 282 | X509_CRL *unknown_critical_crl, *unknown_critical_crl2; | ||
| 283 | int status = 1; | ||
| 284 | |||
| 285 | if ((root = X509_from_PEM(kCRLTestRoot)) == NULL) | ||
| 286 | errx(1, "X509_from_PEM(kCRLTestRoot)"); | ||
| 287 | if ((leaf = X509_from_PEM(kCRLTestLeaf)) == NULL) | ||
| 288 | errx(1, "X509_from_PEM(kCRLTestLeaf)"); | ||
| 289 | if ((basic_crl = X509_CRL_from_PEM(kBasicCRL)) == NULL) | ||
| 290 | errx(1, "X509_CRL_from_PEM(kBasicCRL)"); | ||
| 291 | if ((revoked_crl = X509_CRL_from_PEM(kRevokedCRL)) == NULL) | ||
| 292 | errx(1, "X509_CRL_from_PEM(kRevokedCRL)"); | ||
| 293 | if ((bad_issuer_crl = X509_CRL_from_PEM(kBadIssuerCRL)) == NULL) | ||
| 294 | errx(1, "X509_CRL_from_PEM(kBadIssuerCRL)"); | ||
| 295 | if ((known_critical_crl = X509_CRL_from_PEM(kKnownCriticalCRL)) == NULL) | ||
| 296 | errx(1, "X509_CRL_from_PEM(kKnownCriticalCRL)"); | ||
| 297 | if ((unknown_critical_crl = X509_CRL_from_PEM(kUnknownCriticalCRL)) == NULL) | ||
| 298 | errx(1, "X509_CRL_from_PEM(kUnknownCriticalCRL)"); | ||
| 299 | if ((unknown_critical_crl2 = X509_CRL_from_PEM(kUnknownCriticalCRL2)) == NULL) | ||
| 300 | errx(1, "X509_CRL_from_PEM(kUnknownCriticalCRL2)"); | ||
| 301 | |||
| 302 | if (verify(leaf, root, make_CRL_stack(basic_crl, NULL), | ||
| 303 | X509_V_FLAG_CRL_CHECK) != X509_V_OK) { | ||
| 304 | fprintf(stderr, "Cert with CRL didn't verify.\n"); | ||
| 305 | goto err; | ||
| 306 | } | ||
| 307 | |||
| 308 | #if 0 | ||
| 309 | if (verify(leaf, root, make_CRL_stack(basic_crl, revoked_crl), | ||
| 310 | X509_V_FLAG_CRL_CHECK) != X509_V_ERR_CERT_REVOKED) { | ||
| 311 | fprintf(stderr, "Revoked CRL wasn't checked.\n"); | ||
| 312 | goto err; | ||
| 313 | } | ||
| 314 | #endif | ||
| 315 | |||
| 316 | if (verify(leaf, root, NULL, | ||
| 317 | X509_V_FLAG_CRL_CHECK) != X509_V_ERR_UNABLE_TO_GET_CRL) { | ||
| 318 | fprintf(stderr, "CRLs were not required.\n"); | ||
| 319 | goto err; | ||
| 320 | } | ||
| 321 | |||
| 322 | if (verify(leaf, root, make_CRL_stack(bad_issuer_crl, NULL), | ||
| 323 | X509_V_FLAG_CRL_CHECK) != X509_V_ERR_UNABLE_TO_GET_CRL) { | ||
| 324 | fprintf(stderr, "Bad CRL issuer was unnoticed.\n"); | ||
| 325 | goto err; | ||
| 326 | } | ||
| 327 | |||
| 328 | if (verify(leaf, root, make_CRL_stack(known_critical_crl, NULL), | ||
| 329 | X509_V_FLAG_CRL_CHECK) != X509_V_OK) { | ||
| 330 | fprintf(stderr, | ||
| 331 | "CRL with known critical extension was rejected.\n"); | ||
| 332 | goto err; | ||
| 333 | } | ||
| 334 | |||
| 335 | if (verify(leaf, root, make_CRL_stack(unknown_critical_crl, NULL), | ||
| 336 | X509_V_FLAG_CRL_CHECK) != | ||
| 337 | X509_V_ERR_UNHANDLED_CRITICAL_CRL_EXTENSION) { | ||
| 338 | fprintf(stderr, | ||
| 339 | "CRL with unknown critical extension was accepted.\n"); | ||
| 340 | goto err; | ||
| 341 | } | ||
| 342 | |||
| 343 | if (verify(leaf, root, make_CRL_stack(unknown_critical_crl2, NULL), | ||
| 344 | X509_V_FLAG_CRL_CHECK) != | ||
| 345 | X509_V_ERR_UNHANDLED_CRITICAL_CRL_EXTENSION) { | ||
| 346 | fprintf(stderr, | ||
| 347 | "CRL with unknown critical extension (2) was accepted.\n"); | ||
| 348 | goto err; | ||
| 349 | } | ||
| 350 | |||
| 351 | status = 0; | ||
| 352 | |||
| 353 | err: | ||
| 354 | X509_free(root); | ||
| 355 | X509_free(leaf); | ||
| 356 | X509_CRL_free(basic_crl); | ||
| 357 | X509_CRL_free(revoked_crl); | ||
| 358 | X509_CRL_free(bad_issuer_crl); | ||
| 359 | X509_CRL_free(known_critical_crl); | ||
| 360 | X509_CRL_free(unknown_critical_crl); | ||
| 361 | X509_CRL_free(unknown_critical_crl2); | ||
| 362 | |||
| 363 | return status; | ||
| 364 | } | ||
