|
| 1 | + |
| 2 | +/* ocsp_nonblock.c |
| 3 | + * |
| 4 | + * Copyright (C) 2006-2022 wolfSSL Inc. |
| 5 | + * |
| 6 | + * This file is part of wolfSSL. (formerly known as CyaSSL) |
| 7 | + * |
| 8 | + * wolfSSL is free software; you can redistribute it and/or modify |
| 9 | + * it under the terms of the GNU General Public License as published by |
| 10 | + * the Free Software Foundation; either version 2 of the License, or |
| 11 | + * (at your option) any later version. |
| 12 | + * |
| 13 | + * wolfSSL is distributed in the hope that it will be useful, |
| 14 | + * but WITHOUT ANY WARRANTY; without even the implied warranty of |
| 15 | + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
| 16 | + * GNU General Public License for more details. |
| 17 | + * |
| 18 | + * You should have received a copy of the GNU General Public License |
| 19 | + * along with this program; if not, write to the Free Software |
| 20 | + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA |
| 21 | + **/ |
| 22 | + |
| 23 | +#include <wolfssl/options.h> |
| 24 | +#include <wolfssl/ssl.h> |
| 25 | +#include <wolfssl/wolfio.h> |
| 26 | +#include <wolfssl/error-ssl.h> |
| 27 | +#include <wolfssl/wolfcrypt/error-crypt.h> |
| 28 | +#include <wolfssl/wolfcrypt/logging.h> |
| 29 | + |
| 30 | + |
| 31 | +/* GTS Root R1 */ |
| 32 | +static const char* kGlobalSignRootCA = |
| 33 | +"-----BEGIN CERTIFICATE-----\n" |
| 34 | +"MIIFYjCCBEqgAwIBAgIQd70NbNs2+RrqIQ/E8FjTDTANBgkqhkiG9w0BAQsFADBX\n" |
| 35 | +"MQswCQYDVQQGEwJCRTEZMBcGA1UEChMQR2xvYmFsU2lnbiBudi1zYTEQMA4GA1UE\n" |
| 36 | +"CxMHUm9vdCBDQTEbMBkGA1UEAxMSR2xvYmFsU2lnbiBSb290IENBMB4XDTIwMDYx\n" |
| 37 | +"OTAwMDA0MloXDTI4MDEyODAwMDA0MlowRzELMAkGA1UEBhMCVVMxIjAgBgNVBAoT\n" |
| 38 | +"GUdvb2dsZSBUcnVzdCBTZXJ2aWNlcyBMTEMxFDASBgNVBAMTC0dUUyBSb290IFIx\n" |
| 39 | +"MIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAthECix7joXebO9y/lD63\n" |
| 40 | +"ladAPKH9gvl9MgaCcfb2jH/76Nu8ai6Xl6OMS/kr9rH5zoQdsfnFl97vufKj6bwS\n" |
| 41 | +"iV6nqlKr+CMny6SxnGPb15l+8Ape62im9MZaRw1NEDPjTrETo8gYbEvs/AmQ351k\n" |
| 42 | +"KSUjB6G00j0uYODP0gmHu81I8E3CwnqIiru6z1kZ1q+PsAewnjHxgsHA3y6mbWwZ\n" |
| 43 | +"DrXYfiYaRQM9sHmklCitD38m5agI/pboPGiUU+6DOogrFZYJsuB6jC511pzrp1Zk\n" |
| 44 | +"j5ZPaK49l8KEj8C8QMALXL32h7M1bKwYUH+E4EzNktMg6TO8UpmvMrUpsyUqtEj5\n" |
| 45 | +"cuHKZPfmghCN6J3Cioj6OGaK/GP5Afl4/Xtcd/p2h/rs37EOeZVXtL0m79YB0esW\n" |
| 46 | +"CruOC7XFxYpVq9Os6pFLKcwZpDIlTirxZUTQAs6qzkm06p98g7BAe+dDq6dso499\n" |
| 47 | +"iYH6TKX/1Y7DzkvgtdizjkXPdsDtQCv9Uw+wp9U7DbGKogPeMa3Md+pvez7W35Ei\n" |
| 48 | +"Eua++tgy/BBjFFFy3l3WFpO9KWgz7zpm7AeKJt8T11dleCfeXkkUAKIAf5qoIbap\n" |
| 49 | +"sZWwpbkNFhHax2xIPEDgfg1azVY80ZcFuctL7TlLnMQ/0lUTbiSw1nH69MG6zO0b\n" |
| 50 | +"9f6BQdgAmD06yK56mDcYBZUCAwEAAaOCATgwggE0MA4GA1UdDwEB/wQEAwIBhjAP\n" |
| 51 | +"BgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBTkrysmcRorSCeFL1JmLO/wiRNxPjAf\n" |
| 52 | +"BgNVHSMEGDAWgBRge2YaRQ2XyolQL30EzTSo//z9SzBgBggrBgEFBQcBAQRUMFIw\n" |
| 53 | +"JQYIKwYBBQUHMAGGGWh0dHA6Ly9vY3NwLnBraS5nb29nL2dzcjEwKQYIKwYBBQUH\n" |
| 54 | +"MAKGHWh0dHA6Ly9wa2kuZ29vZy9nc3IxL2dzcjEuY3J0MDIGA1UdHwQrMCkwJ6Al\n" |
| 55 | +"oCOGIWh0dHA6Ly9jcmwucGtpLmdvb2cvZ3NyMS9nc3IxLmNybDA7BgNVHSAENDAy\n" |
| 56 | +"MAgGBmeBDAECATAIBgZngQwBAgIwDQYLKwYBBAHWeQIFAwIwDQYLKwYBBAHWeQIF\n" |
| 57 | +"AwMwDQYJKoZIhvcNAQELBQADggEBADSkHrEoo9C0dhemMXoh6dFSPsjbdBZBiLg9\n" |
| 58 | +"NR3t5P+T4Vxfq7vqfM/b5A3Ri1fyJm9bvhdGaJQ3b2t6yMAYN/olUazsaL+yyEn9\n" |
| 59 | +"WprKASOshIArAoyZl+tJaox118fessmXn1hIVw41oeQa1v1vg4Fv74zPl6/AhSrw\n" |
| 60 | +"9U5pCZEt4Wi4wStz6dTZ/CLANx8LZh1J7QJVj2fhMtfTJr9w4z30Z209fOU0iOMy\n" |
| 61 | +"+qduBmpvvYuR7hZL6Dupszfnw0Skfths18dG9ZKb59UhvmaSGZRVbNQpsg3BZlvi\n" |
| 62 | +"d0lIKO2d1xozclOzgjXPYovJJIultzkMu34qQb9Sz/yilrbCgj8=\n" |
| 63 | +"-----END CERTIFICATE-----"; |
| 64 | + |
| 65 | +/* GTS CA 1C3 - Intermediate */ |
| 66 | +static const char* kGTSCA101 = |
| 67 | +"-----BEGIN CERTIFICATE-----\n" |
| 68 | +"MIIFljCCA36gAwIBAgINAgO8U1lrNMcY9QFQZjANBgkqhkiG9w0BAQsFADBHMQsw\n" |
| 69 | +"CQYDVQQGEwJVUzEiMCAGA1UEChMZR29vZ2xlIFRydXN0IFNlcnZpY2VzIExMQzEU\n" |
| 70 | +"MBIGA1UEAxMLR1RTIFJvb3QgUjEwHhcNMjAwODEzMDAwMDQyWhcNMjcwOTMwMDAw\n" |
| 71 | +"MDQyWjBGMQswCQYDVQQGEwJVUzEiMCAGA1UEChMZR29vZ2xlIFRydXN0IFNlcnZp\n" |
| 72 | +"Y2VzIExMQzETMBEGA1UEAxMKR1RTIENBIDFDMzCCASIwDQYJKoZIhvcNAQEBBQAD\n" |
| 73 | +"ggEPADCCAQoCggEBAPWI3+dijB43+DdCkH9sh9D7ZYIl/ejLa6T/belaI+KZ9hzp\n" |
| 74 | +"kgOZE3wJCor6QtZeViSqejOEH9Hpabu5dOxXTGZok3c3VVP+ORBNtzS7XyV3NzsX\n" |
| 75 | +"lOo85Z3VvMO0Q+sup0fvsEQRY9i0QYXdQTBIkxu/t/bgRQIh4JZCF8/ZK2VWNAcm\n" |
| 76 | +"BA2o/X3KLu/qSHw3TT8An4Pf73WELnlXXPxXbhqW//yMmqaZviXZf5YsBvcRKgKA\n" |
| 77 | +"gOtjGDxQSYflispfGStZloEAoPtR28p3CwvJlk/vcEnHXG0g/Zm0tOLKLnf9LdwL\n" |
| 78 | +"tmsTDIwZKxeWmLnwi/agJ7u2441Rj72ux5uxiZ0CAwEAAaOCAYAwggF8MA4GA1Ud\n" |
| 79 | +"DwEB/wQEAwIBhjAdBgNVHSUEFjAUBggrBgEFBQcDAQYIKwYBBQUHAwIwEgYDVR0T\n" |
| 80 | +"AQH/BAgwBgEB/wIBADAdBgNVHQ4EFgQUinR/r4XN7pXNPZzQ4kYU83E1HScwHwYD\n" |
| 81 | +"VR0jBBgwFoAU5K8rJnEaK0gnhS9SZizv8IkTcT4waAYIKwYBBQUHAQEEXDBaMCYG\n" |
| 82 | +"CCsGAQUFBzABhhpodHRwOi8vb2NzcC5wa2kuZ29vZy9ndHNyMTAwBggrBgEFBQcw\n" |
| 83 | +"AoYkaHR0cDovL3BraS5nb29nL3JlcG8vY2VydHMvZ3RzcjEuZGVyMDQGA1UdHwQt\n" |
| 84 | +"MCswKaAnoCWGI2h0dHA6Ly9jcmwucGtpLmdvb2cvZ3RzcjEvZ3RzcjEuY3JsMFcG\n" |
| 85 | +"A1UdIARQME4wOAYKKwYBBAHWeQIFAzAqMCgGCCsGAQUFBwIBFhxodHRwczovL3Br\n" |
| 86 | +"aS5nb29nL3JlcG9zaXRvcnkvMAgGBmeBDAECATAIBgZngQwBAgIwDQYJKoZIhvcN\n" |
| 87 | +"AQELBQADggIBAIl9rCBcDDy+mqhXlRu0rvqrpXJxtDaV/d9AEQNMwkYUuxQkq/BQ\n" |
| 88 | +"cSLbrcRuf8/xam/IgxvYzolfh2yHuKkMo5uhYpSTld9brmYZCwKWnvy15xBpPnrL\n" |
| 89 | +"RklfRuFBsdeYTWU0AIAaP0+fbH9JAIFTQaSSIYKCGvGjRFsqUBITTcFTNvNCCK9U\n" |
| 90 | +"+o53UxtkOCcXCb1YyRt8OS1b887U7ZfbFAO/CVMkH8IMBHmYJvJh8VNS/UKMG2Yr\n" |
| 91 | +"PxWhu//2m+OBmgEGcYk1KCTd4b3rGS3hSMs9WYNRtHTGnXzGsYZbr8w0xNPM1IER\n" |
| 92 | +"lQCh9BIiAfq0g3GvjLeMcySsN1PCAJA/Ef5c7TaUEDu9Ka7ixzpiO2xj2YC/WXGs\n" |
| 93 | +"Yye5TBeg2vZzFb8q3o/zpWwygTMD0IZRcZk0upONXbVRWPeyk+gB9lm+cZv9TSjO\n" |
| 94 | +"z23HFtz30dZGm6fKa+l3D/2gthsjgx0QGtkJAITgRNOidSOzNIb2ILCkXhAd4FJG\n" |
| 95 | +"AJ2xDx8hcFH1mt0G/FX0Kw4zd8NLQsLxdxP8c4CU6x+7Nz/OAipmsHMdMqUybDKw\n" |
| 96 | +"juDEI/9bfU1lcKwrmz3O2+BtjjKAvpafkmO8l7tdufThcV4q5O8DIrGKZTqPwJNl\n" |
| 97 | +"1IXNDw9bg1kWRxYtnCQ6yICmJhSFm/Y3m6xv+cXDBlHz4n/FsRC6UfTd\n" |
| 98 | +"-----END CERTIFICATE-----"; |
| 99 | + |
| 100 | +/* Google.com */ |
| 101 | +static const char* kGoogleCom = |
| 102 | +"-----BEGIN CERTIFICATE-----\n" |
| 103 | +"MIIEhjCCA26gAwIBAgIQWwvxxxXoxEkSWJsftFiO7jANBgkqhkiG9w0BAQsFADBG\n" |
| 104 | +"MQswCQYDVQQGEwJVUzEiMCAGA1UEChMZR29vZ2xlIFRydXN0IFNlcnZpY2VzIExM\n" |
| 105 | +"QzETMBEGA1UEAxMKR1RTIENBIDFDMzAeFw0yMjA1MDQxNzQwMDVaFw0yMjA3Mjcx\n" |
| 106 | +"NzQwMDRaMBkxFzAVBgNVBAMTDnd3dy5nb29nbGUuY29tMFkwEwYHKoZIzj0CAQYI\n" |
| 107 | +"KoZIzj0DAQcDQgAEy3kqjk9F7+Ap8XWjvvDnAUfiJXV6bHblqegicb6Krq3zUw8T\n" |
| 108 | +"KUQ8wxMtRoZXHv9DtZgC1ErW6qAPt0BWdzP7waOCAmYwggJiMA4GA1UdDwEB/wQE\n" |
| 109 | +"AwIHgDATBgNVHSUEDDAKBggrBgEFBQcDATAMBgNVHRMBAf8EAjAAMB0GA1UdDgQW\n" |
| 110 | +"BBSoMrJUWSIVHdDkqXgfi2VI5nQ2TjAfBgNVHSMEGDAWgBSKdH+vhc3ulc09nNDi\n" |
| 111 | +"RhTzcTUdJzBqBggrBgEFBQcBAQReMFwwJwYIKwYBBQUHMAGGG2h0dHA6Ly9vY3Nw\n" |
| 112 | +"LnBraS5nb29nL2d0czFjMzAxBggrBgEFBQcwAoYlaHR0cDovL3BraS5nb29nL3Jl\n" |
| 113 | +"cG8vY2VydHMvZ3RzMWMzLmRlcjAZBgNVHREEEjAQgg53d3cuZ29vZ2xlLmNvbTAh\n" |
| 114 | +"BgNVHSAEGjAYMAgGBmeBDAECATAMBgorBgEEAdZ5AgUDMDwGA1UdHwQ1MDMwMaAv\n" |
| 115 | +"oC2GK2h0dHA6Ly9jcmxzLnBraS5nb29nL2d0czFjMy9RT3ZKME4xc1QyQS5jcmww\n" |
| 116 | +"ggEDBgorBgEEAdZ5AgQCBIH0BIHxAO8AdQBByMqx3yJGShDGoToJQodeTjGLGwPr\n" |
| 117 | +"60vHaPCQYpYG9gAAAYCQX05XAAAEAwBGMEQCIA/HX1T2lssgnL8weEBFzPsILM4q\n" |
| 118 | +"/3iJ5FyXJgZZ9ZMQAiBi0HochB+UgZMpslJ72ei48hvzGErcXvUJUwXVx4x6ZwB2\n" |
| 119 | +"ACl5vvCeOTkh8FZzn2Old+W+V32cYAr4+U1dJlwlXceEAAABgJBfTiYAAAQDAEcw\n" |
| 120 | +"RQIhAIcwKuzq6j1VwM1F3P/3L0Un5LKUt4o52+KREIULHJ6yAiAIVxHlI0vTToyP\n" |
| 121 | +"N96UQkuM0FvPus2vGZLfIimVHrqrQzANBgkqhkiG9w0BAQsFAAOCAQEAw/wVl+C1\n" |
| 122 | +"0mjwVu3NCu9sbnX47TuPz2lwT/6aUOMmRQg5Z3I9qWwRs5TdwYS/RXjGbATG8STu\n" |
| 123 | +"Qmq5h4GRil5523D2OKmJ2ZBc033tk/aDJzf3bRQrFnzYNDIo2zW7rrdg0yUE2ytq\n" |
| 124 | +"30pP0so32wVtqAKZOdtgYyQs1WXEgOVouGkecgdKv2pMyWa6TVjMNnMxCwqq4MRG\n" |
| 125 | +"R5thr5l5tg20zvpGM7bE/VuYegTSqQyaF6arUpjpOX7xclfERZ1RUOh1EHHnH4gf\n" |
| 126 | +"l7eOUXh950nbb3bjp2bUF1CjsnveJI1UfqcUrp3Tuoh7ScT1gEiJ82qGsVtyq3AU\n" |
| 127 | +"FvKz0TJH0ipymA==\n" |
| 128 | +"-----END CERTIFICATE-----"; |
| 129 | + |
| 130 | + |
| 131 | +#ifndef HTTP_SCRATCH_BUFFER_SIZE |
| 132 | + #define HTTP_SCRATCH_BUFFER_SIZE 512 |
| 133 | +#endif |
| 134 | +#ifndef MAX_URL_ITEM_SIZE |
| 135 | + #define MAX_URL_ITEM_SIZE 80 |
| 136 | +#endif |
| 137 | +#ifndef DEFAULT_TIMEOUT_SEC |
| 138 | + #define DEFAULT_TIMEOUT_SEC 0 /* no timeout */ |
| 139 | +#endif |
| 140 | + |
| 141 | +static int io_timeout_sec = DEFAULT_TIMEOUT_SEC; |
| 142 | + |
| 143 | +/* Return size of the OCSP response or negative for error */ |
| 144 | +static int OcspLookupNonBlockCb(void* ctx, const char* url, int urlSz, |
| 145 | + byte* ocspReqBuf, int ocspReqSz, byte** ocspRespBuf) |
| 146 | +{ |
| 147 | + SOCKET_T sfd = SOCKET_INVALID; |
| 148 | + word16 port; |
| 149 | + int ret = -1; |
| 150 | + char path[MAX_URL_ITEM_SIZE]; |
| 151 | + char domainName[MAX_URL_ITEM_SIZE]; |
| 152 | + int nonBlockCnt = 0; |
| 153 | + |
| 154 | + if (ocspReqBuf == NULL || ocspReqSz == 0) { |
| 155 | + printf("OCSP request is required for lookup\n"); |
| 156 | + } |
| 157 | + else if (ocspRespBuf == NULL) { |
| 158 | + printf("Cannot save OCSP response\n"); |
| 159 | + } |
| 160 | + else if (wolfIO_DecodeUrl(url, urlSz, domainName, path, &port) < 0) { |
| 161 | + printf("Unable to decode OCSP URL\n"); |
| 162 | + } |
| 163 | + else { |
| 164 | + /* Note: This is free'd in OcspRespFreeCb callback */ |
| 165 | + int httpBufSz = HTTP_SCRATCH_BUFFER_SIZE; |
| 166 | + byte* httpBuf = (byte*)XMALLOC(httpBufSz, NULL, DYNAMIC_TYPE_OCSP); |
| 167 | + |
| 168 | + printf("OCSP Lookup:\n"); |
| 169 | + printf("\tURL: %s\n", url); |
| 170 | + printf("\tDomain: %s\n", domainName); |
| 171 | + printf("\tPath: %s\n", path); |
| 172 | + printf("\tPort: %d\n", port); |
| 173 | + |
| 174 | + if (httpBuf == NULL) { |
| 175 | + printf("Unable to create OCSP response buffer\n"); |
| 176 | + } |
| 177 | + else { |
| 178 | + httpBufSz = wolfIO_HttpBuildRequestOcsp(domainName, path, ocspReqSz, |
| 179 | + httpBuf, httpBufSz); |
| 180 | + |
| 181 | + ret = wolfIO_TcpConnect(&sfd, domainName, port, io_timeout_sec); |
| 182 | + if (ret == 0) { |
| 183 | + #if defined(WOLFSSL_NONBLOCK_OCSP) && defined(HAVE_IO_TIMEOUT) |
| 184 | + wolfIO_SetBlockingMode(sfd, 1); /* non-blocking */ |
| 185 | + #endif |
| 186 | + |
| 187 | + if (wolfIO_Send(sfd, (char*)httpBuf, httpBufSz, 0) != |
| 188 | + httpBufSz) { |
| 189 | + printf("OCSP http request failed\n"); |
| 190 | + } |
| 191 | + else if (wolfIO_Send(sfd, (char*)ocspReqBuf, ocspReqSz, 0) != |
| 192 | + ocspReqSz) { |
| 193 | + printf("OCSP ocsp request failed\n"); |
| 194 | + } |
| 195 | + else { |
| 196 | + do { |
| 197 | + ret = wolfIO_HttpProcessResponseOcsp(sfd, ocspRespBuf, |
| 198 | + httpBuf, HTTP_SCRATCH_BUFFER_SIZE, ctx); |
| 199 | + nonBlockCnt++; |
| 200 | + } while (ret == OCSP_WANT_READ); |
| 201 | + printf("OCSP Response: ret %d, nonblock count %d\n", |
| 202 | + ret, nonBlockCnt); |
| 203 | + } |
| 204 | + } |
| 205 | + else { |
| 206 | + printf("OCSP Responder connection failed\n"); |
| 207 | + } |
| 208 | + if (sfd != SOCKET_INVALID) |
| 209 | + CloseSocket(sfd); |
| 210 | + XFREE(httpBuf, ctx, DYNAMIC_TYPE_OCSP); |
| 211 | + } |
| 212 | + } |
| 213 | + return ret; |
| 214 | +} |
| 215 | + |
| 216 | +static void OcspRespFreeCb(void* ctx, byte *resp) |
| 217 | +{ |
| 218 | + if (resp) |
| 219 | + XFREE(resp, NULL, DYNAMIC_TYPE_OCSP); |
| 220 | + |
| 221 | + (void)ctx; |
| 222 | +} |
| 223 | + |
| 224 | +int main(void) |
| 225 | +{ |
| 226 | + int ret = -1; |
| 227 | + WOLFSSL_CERT_MANAGER* pCm; |
| 228 | + byte der[2000]; |
| 229 | + int derSz; |
| 230 | + |
| 231 | +#if 0 |
| 232 | + wolfSSL_Debugging_ON(); |
| 233 | +#endif |
| 234 | + |
| 235 | + /* Create certificate manager context */ |
| 236 | + pCm = wolfSSL_CertManagerNew(); |
| 237 | + if (pCm) { |
| 238 | + #ifdef HAVE_OCSP |
| 239 | + /* Enable OCSP */ |
| 240 | + ret = wolfSSL_CertManagerEnableOCSP(pCm, 0); |
| 241 | + if (ret == WOLFSSL_SUCCESS) { |
| 242 | + /* Setup callbacks for OCSP */ |
| 243 | + ret = wolfSSL_CertManagerSetOCSP_Cb(pCm, |
| 244 | + OcspLookupNonBlockCb, |
| 245 | + OcspRespFreeCb, |
| 246 | + NULL /* optional context */ |
| 247 | + ); |
| 248 | + } |
| 249 | + #else |
| 250 | + ret = WOLFSSL_SUCCESS; |
| 251 | + #endif |
| 252 | + if (ret == WOLFSSL_SUCCESS) { |
| 253 | + /* Load root CA into Certificate Manager */ |
| 254 | + ret = wolfSSL_CertManagerLoadCABuffer(pCm, |
| 255 | + (const unsigned char *)kGlobalSignRootCA, |
| 256 | + XSTRLEN(kGlobalSignRootCA), WOLFSSL_FILETYPE_PEM); |
| 257 | + printf("Load Trusted: GlobalSign CA (ret %d)\n", ret); |
| 258 | + } |
| 259 | + if (ret == WOLFSSL_SUCCESS) { |
| 260 | + /* Load intermediate CA into Certificate Manager */ |
| 261 | + ret = wolfSSL_CertManagerLoadCABuffer(pCm, |
| 262 | + (const unsigned char *)kGTSCA101, |
| 263 | + XSTRLEN(kGTSCA101), WOLFSSL_FILETYPE_PEM); |
| 264 | + printf("Load Trusted: GTS CA 101 (ret %d)\n", ret); |
| 265 | + } |
| 266 | + if (ret == WOLFSSL_SUCCESS) { |
| 267 | + /* Convert certificate to DER/ASN.1 */ |
| 268 | + ret = wc_CertPemToDer( |
| 269 | + (unsigned char*)kGoogleCom, XSTRLEN(kGoogleCom), |
| 270 | + der, sizeof(der), CERT_TYPE); |
| 271 | + if (ret >= 0) { |
| 272 | + derSz = ret; |
| 273 | + ret = WOLFSSL_SUCCESS; |
| 274 | + } |
| 275 | + printf("Convert Google.com PEM cert to DER (ret %d)\n", ret); |
| 276 | + } |
| 277 | + if (ret == WOLFSSL_SUCCESS) { |
| 278 | + /* Load and verify certificate */ |
| 279 | + ret = wolfSSL_CertManagerVerifyBuffer(pCm, |
| 280 | + der, derSz, WOLFSSL_FILETYPE_ASN1); |
| 281 | + printf("Verify Google.com cert: %d\n", ret); |
| 282 | + } |
| 283 | + #ifdef HAVE_OCSP |
| 284 | + if (ret == WOLFSSL_SUCCESS) { |
| 285 | + /* Check OCSP for certificate */ |
| 286 | + ret = wolfSSL_CertManagerCheckOCSP(pCm, |
| 287 | + der, derSz); |
| 288 | + printf("Check OCSP for Google.com (ret %d)\n", ret); |
| 289 | + } |
| 290 | + #endif |
| 291 | + |
| 292 | + wolfSSL_CertManagerFree(pCm); |
| 293 | + } |
| 294 | + |
| 295 | + printf("Ret = %d: %s\n", |
| 296 | + ret, (ret == WOLFSSL_SUCCESS) ? |
| 297 | + "success" : |
| 298 | + wc_GetErrorString(ret)); |
| 299 | + |
| 300 | + return ret; |
| 301 | +} |
0 commit comments