Updated to hostap_2_6
[mech_eap.git] / libeap / src / crypto / tls_openssl_ocsp.c
1 /*
2  * SSL/TLS interface functions for OpenSSL - BoringSSL OCSP
3  * Copyright (c) 2004-2015, Jouni Malinen <j@w1.fi>
4  *
5  * This software may be distributed under the terms of the BSD license.
6  * See README for more details.
7  */
8
9 #include "includes.h"
10
11 #include <openssl/ssl.h>
12 #include <openssl/err.h>
13 #include <openssl/x509v3.h>
14 #ifdef OPENSSL_IS_BORINGSSL
15 #include <openssl/asn1.h>
16 #include <openssl/asn1t.h>
17 #endif /* OPENSSL_IS_BORINGSSL */
18
19 #include "common.h"
20 #include "tls_openssl.h"
21
22
23 #ifdef OPENSSL_IS_BORINGSSL
24
25 static void tls_show_errors(int level, const char *func, const char *txt)
26 {
27         unsigned long err;
28
29         wpa_printf(level, "OpenSSL: %s - %s %s",
30                    func, txt, ERR_error_string(ERR_get_error(), NULL));
31
32         while ((err = ERR_get_error())) {
33                 wpa_printf(MSG_INFO, "OpenSSL: pending error: %s",
34                            ERR_error_string(err, NULL));
35         }
36 }
37
38
39 /*
40  * CertID ::= SEQUENCE {
41  *     hashAlgorithm      AlgorithmIdentifier,
42  *     issuerNameHash     OCTET STRING, -- Hash of Issuer's DN
43  *     issuerKeyHash      OCTET STRING, -- Hash of Issuer's public key
44  *     serialNumber       CertificateSerialNumber }
45  */
46 typedef struct {
47         X509_ALGOR *hashAlgorithm;
48         ASN1_OCTET_STRING *issuerNameHash;
49         ASN1_OCTET_STRING *issuerKeyHash;
50         ASN1_INTEGER *serialNumber;
51 } CertID;
52
53 /*
54  * ResponseBytes ::=       SEQUENCE {
55  *     responseType   OBJECT IDENTIFIER,
56  *     response       OCTET STRING }
57  */
58 typedef struct {
59         ASN1_OBJECT *responseType;
60         ASN1_OCTET_STRING *response;
61 } ResponseBytes;
62
63 /*
64  * OCSPResponse ::= SEQUENCE {
65  *    responseStatus         OCSPResponseStatus,
66  *    responseBytes          [0] EXPLICIT ResponseBytes OPTIONAL }
67  */
68 typedef struct {
69         ASN1_ENUMERATED *responseStatus;
70         ResponseBytes *responseBytes;
71 } OCSPResponse;
72
73 ASN1_SEQUENCE(ResponseBytes) = {
74         ASN1_SIMPLE(ResponseBytes, responseType, ASN1_OBJECT),
75         ASN1_SIMPLE(ResponseBytes, response, ASN1_OCTET_STRING)
76 } ASN1_SEQUENCE_END(ResponseBytes);
77
78 ASN1_SEQUENCE(OCSPResponse) = {
79         ASN1_SIMPLE(OCSPResponse, responseStatus, ASN1_ENUMERATED),
80         ASN1_EXP_OPT(OCSPResponse, responseBytes, ResponseBytes, 0)
81 } ASN1_SEQUENCE_END(OCSPResponse);
82
83 IMPLEMENT_ASN1_FUNCTIONS(OCSPResponse);
84
85 /*
86  * ResponderID ::= CHOICE {
87  *    byName               [1] Name,
88  *    byKey                [2] KeyHash }
89  */
90 typedef struct {
91         int type;
92         union {
93                 X509_NAME *byName;
94                 ASN1_OCTET_STRING *byKey;
95         } value;
96 } ResponderID;
97
98 /*
99  * RevokedInfo ::= SEQUENCE {
100  *     revocationTime              GeneralizedTime,
101  *     revocationReason    [0]     EXPLICIT CRLReason OPTIONAL }
102  */
103 typedef struct {
104         ASN1_GENERALIZEDTIME *revocationTime;
105         ASN1_ENUMERATED *revocationReason;
106 } RevokedInfo;
107
108 /*
109  * CertStatus ::= CHOICE {
110  *     good        [0]     IMPLICIT NULL,
111  *     revoked     [1]     IMPLICIT RevokedInfo,
112  *     unknown     [2]     IMPLICIT UnknownInfo }
113  */
114 typedef struct {
115         int type;
116         union {
117                 ASN1_NULL *good;
118                 RevokedInfo *revoked;
119                 ASN1_NULL *unknown;
120         } value;
121 } CertStatus;
122
123 /*
124  * SingleResponse ::= SEQUENCE {
125  *    certID                       CertID,
126  *    certStatus                   CertStatus,
127  *    thisUpdate                   GeneralizedTime,
128  *    nextUpdate         [0]       EXPLICIT GeneralizedTime OPTIONAL,
129  *    singleExtensions   [1]       EXPLICIT Extensions OPTIONAL }
130  */
131 typedef struct {
132         CertID *certID;
133         CertStatus *certStatus;
134         ASN1_GENERALIZEDTIME *thisUpdate;
135         ASN1_GENERALIZEDTIME *nextUpdate;
136         STACK_OF(X509_EXTENSION) *singleExtensions;
137 } SingleResponse;
138
139 /*
140  * ResponseData ::= SEQUENCE {
141  *   version              [0] EXPLICIT Version DEFAULT v1,
142  *   responderID              ResponderID,
143  *   producedAt               GeneralizedTime,
144  *   responses                SEQUENCE OF SingleResponse,
145  *   responseExtensions   [1] EXPLICIT Extensions OPTIONAL }
146  */
147 typedef struct {
148         ASN1_INTEGER *version;
149         ResponderID *responderID;
150         ASN1_GENERALIZEDTIME *producedAt;
151         STACK_OF(SingleResponse) *responses;
152         STACK_OF(X509_EXTENSION) *responseExtensions;
153 } ResponseData;
154
155 /*
156  * BasicOCSPResponse       ::= SEQUENCE {
157  *   tbsResponseData      ResponseData,
158  *   signatureAlgorithm   AlgorithmIdentifier,
159  *   signature            BIT STRING,
160  *   certs                [0] EXPLICIT SEQUENCE OF Certificate OPTIONAL }
161  */
162 typedef struct {
163         ResponseData *tbsResponseData;
164         X509_ALGOR *signatureAlgorithm;
165         ASN1_BIT_STRING *signature;
166         STACK_OF(X509) *certs;
167 } BasicOCSPResponse;
168
169 ASN1_SEQUENCE(CertID) = {
170         ASN1_SIMPLE(CertID, hashAlgorithm, X509_ALGOR),
171         ASN1_SIMPLE(CertID, issuerNameHash, ASN1_OCTET_STRING),
172         ASN1_SIMPLE(CertID, issuerKeyHash, ASN1_OCTET_STRING),
173         ASN1_SIMPLE(CertID, serialNumber, ASN1_INTEGER)
174 } ASN1_SEQUENCE_END(CertID);
175
176 ASN1_CHOICE(ResponderID) = {
177         ASN1_EXP(ResponderID, value.byName, X509_NAME, 1),
178         ASN1_EXP(ResponderID, value.byKey, ASN1_OCTET_STRING, 2)
179 } ASN1_CHOICE_END(ResponderID);
180
181 ASN1_SEQUENCE(RevokedInfo) = {
182         ASN1_SIMPLE(RevokedInfo, revocationTime, ASN1_GENERALIZEDTIME),
183         ASN1_EXP_OPT(RevokedInfo, revocationReason, ASN1_ENUMERATED, 0)
184 } ASN1_SEQUENCE_END(RevokedInfo);
185
186 ASN1_CHOICE(CertStatus) = {
187         ASN1_IMP(CertStatus, value.good, ASN1_NULL, 0),
188         ASN1_IMP(CertStatus, value.revoked, RevokedInfo, 1),
189         ASN1_IMP(CertStatus, value.unknown, ASN1_NULL, 2)
190 } ASN1_CHOICE_END(CertStatus);
191
192 ASN1_SEQUENCE(SingleResponse) = {
193         ASN1_SIMPLE(SingleResponse, certID, CertID),
194         ASN1_SIMPLE(SingleResponse, certStatus, CertStatus),
195         ASN1_SIMPLE(SingleResponse, thisUpdate, ASN1_GENERALIZEDTIME),
196         ASN1_EXP_OPT(SingleResponse, nextUpdate, ASN1_GENERALIZEDTIME, 0),
197         ASN1_EXP_SEQUENCE_OF_OPT(SingleResponse, singleExtensions,
198                                  X509_EXTENSION, 1)
199 } ASN1_SEQUENCE_END(SingleResponse);
200
201 ASN1_SEQUENCE(ResponseData) = {
202         ASN1_EXP_OPT(ResponseData, version, ASN1_INTEGER, 0),
203         ASN1_SIMPLE(ResponseData, responderID, ResponderID),
204         ASN1_SIMPLE(ResponseData, producedAt, ASN1_GENERALIZEDTIME),
205         ASN1_SEQUENCE_OF(ResponseData, responses, SingleResponse),
206         ASN1_EXP_SEQUENCE_OF_OPT(ResponseData, responseExtensions,
207                                  X509_EXTENSION, 1)
208 } ASN1_SEQUENCE_END(ResponseData);
209
210 ASN1_SEQUENCE(BasicOCSPResponse) = {
211         ASN1_SIMPLE(BasicOCSPResponse, tbsResponseData, ResponseData),
212         ASN1_SIMPLE(BasicOCSPResponse, signatureAlgorithm, X509_ALGOR),
213         ASN1_SIMPLE(BasicOCSPResponse, signature, ASN1_BIT_STRING),
214         ASN1_EXP_SEQUENCE_OF_OPT(BasicOCSPResponse, certs, X509, 0)
215 } ASN1_SEQUENCE_END(BasicOCSPResponse);
216
217 IMPLEMENT_ASN1_FUNCTIONS(BasicOCSPResponse);
218
219 #define sk_SingleResponse_num(sk) \
220 sk_num(CHECKED_CAST(_STACK *, STACK_OF(SingleResponse) *, sk))
221
222 #define sk_SingleResponse_value(sk, i) \
223         ((SingleResponse *)                                             \
224          sk_value(CHECKED_CAST(_STACK *, STACK_OF(SingleResponse) *, sk), (i)))
225
226
227 static char * mem_bio_to_str(BIO *out)
228 {
229         char *txt;
230         size_t rlen;
231         int res;
232
233         rlen = BIO_ctrl_pending(out);
234         txt = os_malloc(rlen + 1);
235         if (!txt) {
236                 BIO_free(out);
237                 return NULL;
238         }
239
240         res = BIO_read(out, txt, rlen);
241         BIO_free(out);
242         if (res < 0) {
243                 os_free(txt);
244                 return NULL;
245         }
246
247         txt[res] = '\0';
248         return txt;
249 }
250
251
252 static char * generalizedtime_str(ASN1_GENERALIZEDTIME *t)
253 {
254         BIO *out;
255
256         out = BIO_new(BIO_s_mem());
257         if (!out)
258                 return NULL;
259
260         if (!ASN1_GENERALIZEDTIME_print(out, t)) {
261                 BIO_free(out);
262                 return NULL;
263         }
264
265         return mem_bio_to_str(out);
266 }
267
268
269 static char * responderid_str(ResponderID *rid)
270 {
271         BIO *out;
272
273         out = BIO_new(BIO_s_mem());
274         if (!out)
275                 return NULL;
276
277         switch (rid->type) {
278         case 0:
279                 X509_NAME_print_ex(out, rid->value.byName, 0, XN_FLAG_ONELINE);
280                 break;
281         case 1:
282                 i2a_ASN1_STRING(out, rid->value.byKey, V_ASN1_OCTET_STRING);
283                 break;
284         default:
285                 BIO_free(out);
286                 return NULL;
287         }
288
289         return mem_bio_to_str(out);
290 }
291
292
293 static char * octet_string_str(ASN1_OCTET_STRING *o)
294 {
295         BIO *out;
296
297         out = BIO_new(BIO_s_mem());
298         if (!out)
299                 return NULL;
300
301         i2a_ASN1_STRING(out, o, V_ASN1_OCTET_STRING);
302         return mem_bio_to_str(out);
303 }
304
305
306 static char * integer_str(ASN1_INTEGER *i)
307 {
308         BIO *out;
309
310         out = BIO_new(BIO_s_mem());
311         if (!out)
312                 return NULL;
313
314         i2a_ASN1_INTEGER(out, i);
315         return mem_bio_to_str(out);
316 }
317
318
319 static char * algor_str(X509_ALGOR *alg)
320 {
321         BIO *out;
322
323         out = BIO_new(BIO_s_mem());
324         if (!out)
325                 return NULL;
326
327         i2a_ASN1_OBJECT(out, alg->algorithm);
328         return mem_bio_to_str(out);
329 }
330
331
332 static char * extensions_str(const char *title, STACK_OF(X509_EXTENSION) *ext)
333 {
334         BIO *out;
335
336         if (!ext)
337                 return NULL;
338
339         out = BIO_new(BIO_s_mem());
340         if (!out)
341                 return NULL;
342
343         if (!X509V3_extensions_print(out, title, ext, 0, 0)) {
344                 BIO_free(out);
345                 return NULL;
346         }
347         return mem_bio_to_str(out);
348 }
349
350
351 static int ocsp_resp_valid(ASN1_GENERALIZEDTIME *thisupd,
352                            ASN1_GENERALIZEDTIME *nextupd)
353 {
354         time_t now, tmp;
355
356         if (!ASN1_GENERALIZEDTIME_check(thisupd)) {
357                 wpa_printf(MSG_DEBUG,
358                            "OpenSSL: Invalid OCSP response thisUpdate");
359                 return 0;
360         }
361
362         time(&now);
363         tmp = now + 5 * 60; /* allow five minute clock difference */
364         if (X509_cmp_time(thisupd, &tmp) > 0) {
365                 wpa_printf(MSG_DEBUG, "OpenSSL: OCSP response not yet valid");
366                 return 0;
367         }
368
369         if (!nextupd)
370                 return 1; /* OK - no limit on response age */
371
372         if (!ASN1_GENERALIZEDTIME_check(nextupd)) {
373                 wpa_printf(MSG_DEBUG,
374                            "OpenSSL: Invalid OCSP response nextUpdate");
375                 return 0;
376         }
377
378         tmp = now - 5 * 60; /* allow five minute clock difference */
379         if (X509_cmp_time(nextupd, &tmp) < 0) {
380                 wpa_printf(MSG_DEBUG, "OpenSSL: OCSP response expired");
381                 return 0;
382         }
383
384         if (ASN1_STRING_cmp(nextupd, thisupd) < 0) {
385                 wpa_printf(MSG_DEBUG,
386                            "OpenSSL: OCSP response nextUpdate before thisUpdate");
387                 return 0;
388         }
389
390         /* Both thisUpdate and nextUpdate are valid */
391         return -1;
392 }
393
394
395 static int issuer_match(X509 *cert, X509 *issuer, CertID *certid)
396 {
397         X509_NAME *iname;
398         ASN1_BIT_STRING *ikey;
399         const EVP_MD *dgst;
400         unsigned int len;
401         unsigned char md[EVP_MAX_MD_SIZE];
402         ASN1_OCTET_STRING *hash;
403         char *txt;
404
405         dgst = EVP_get_digestbyobj(certid->hashAlgorithm->algorithm);
406         if (!dgst) {
407                 wpa_printf(MSG_DEBUG,
408                            "OpenSSL: Could not find matching hash algorithm for OCSP");
409                 return -1;
410         }
411
412         iname = X509_get_issuer_name(cert);
413         if (!X509_NAME_digest(iname, dgst, md, &len))
414                 return -1;
415         hash = ASN1_OCTET_STRING_new();
416         if (!hash)
417                 return -1;
418         if (!ASN1_OCTET_STRING_set(hash, md, len)) {
419                 ASN1_OCTET_STRING_free(hash);
420                 return -1;
421         }
422
423         txt = octet_string_str(hash);
424         if (txt) {
425                 wpa_printf(MSG_DEBUG, "OpenSSL: calculated issuerNameHash: %s",
426                            txt);
427                 os_free(txt);
428         }
429
430         if (ASN1_OCTET_STRING_cmp(certid->issuerNameHash, hash)) {
431                 ASN1_OCTET_STRING_free(hash);
432                 return -1;
433         }
434
435         ikey = X509_get0_pubkey_bitstr(issuer);
436         if (!ikey ||
437             !EVP_Digest(ikey->data, ikey->length, md, &len, dgst, NULL) ||
438             !ASN1_OCTET_STRING_set(hash, md, len)) {
439                 ASN1_OCTET_STRING_free(hash);
440                 return -1;
441         }
442
443         txt = octet_string_str(hash);
444         if (txt) {
445                 wpa_printf(MSG_DEBUG, "OpenSSL: calculated issuerKeyHash: %s",
446                            txt);
447                 os_free(txt);
448         }
449
450         if (ASN1_OCTET_STRING_cmp(certid->issuerKeyHash, hash)) {
451                 ASN1_OCTET_STRING_free(hash);
452                 return -1;
453         }
454
455         ASN1_OCTET_STRING_free(hash);
456         return 0;
457 }
458
459
460 static X509 * ocsp_find_signer(STACK_OF(X509) *certs, ResponderID *rid)
461 {
462         unsigned int i;
463         unsigned char hash[SHA_DIGEST_LENGTH];
464
465         if (rid->type == 0) {
466                 /* byName */
467                 return X509_find_by_subject(certs, rid->value.byName);
468         }
469
470         /* byKey */
471         if (rid->value.byKey->length != SHA_DIGEST_LENGTH)
472                 return NULL;
473         for (i = 0; i < sk_X509_num(certs); i++) {
474                 X509 *x = sk_X509_value(certs, i);
475
476                 X509_pubkey_digest(x, EVP_sha1(), hash, NULL);
477                 if (os_memcmp(rid->value.byKey->data, hash,
478                               SHA_DIGEST_LENGTH) == 0)
479                         return x;
480         }
481
482         return NULL;
483 }
484
485
486 enum ocsp_result check_ocsp_resp(SSL_CTX *ssl_ctx, SSL *ssl, X509 *cert,
487                                  X509 *issuer, X509 *issuer_issuer)
488 {
489         const uint8_t *resp_data;
490         size_t resp_len;
491         OCSPResponse *resp;
492         int status;
493         ResponseBytes *bytes;
494         const u8 *basic_data;
495         size_t basic_len;
496         BasicOCSPResponse *basic;
497         ResponseData *rd;
498         char *txt;
499         int i, num;
500         unsigned int j, num_resp;
501         SingleResponse *matching_resp = NULL, *cmp_sresp;
502         enum ocsp_result result = OCSP_INVALID;
503         X509_STORE *store;
504         STACK_OF(X509) *untrusted = NULL, *certs = NULL, *chain = NULL;
505         X509_STORE_CTX ctx;
506         X509 *signer, *tmp_cert;
507         int signer_trusted = 0;
508         EVP_PKEY *skey;
509         int ret;
510         char buf[256];
511
512         txt = integer_str(X509_get_serialNumber(cert));
513         if (txt) {
514                 wpa_printf(MSG_DEBUG,
515                            "OpenSSL: Searching OCSP response for peer certificate serialNumber: %s", txt);
516                 os_free(txt);
517         }
518
519         SSL_get0_ocsp_response(ssl, &resp_data, &resp_len);
520         if (resp_data == NULL || resp_len == 0) {
521                 wpa_printf(MSG_DEBUG, "OpenSSL: No OCSP response received");
522                 return OCSP_NO_RESPONSE;
523         }
524
525         wpa_hexdump(MSG_DEBUG, "OpenSSL: OCSP response", resp_data, resp_len);
526
527         resp = d2i_OCSPResponse(NULL, &resp_data, resp_len);
528         if (!resp) {
529                 wpa_printf(MSG_INFO, "OpenSSL: Failed to parse OCSPResponse");
530                 return OCSP_INVALID;
531         }
532
533         status = ASN1_ENUMERATED_get(resp->responseStatus);
534         if (status != 0) {
535                 wpa_printf(MSG_INFO, "OpenSSL: OCSP responder error %d",
536                            status);
537                 return OCSP_INVALID;
538         }
539
540         bytes = resp->responseBytes;
541
542         if (!bytes ||
543             OBJ_obj2nid(bytes->responseType) != NID_id_pkix_OCSP_basic) {
544                 wpa_printf(MSG_INFO,
545                            "OpenSSL: Could not find BasicOCSPResponse");
546                 return OCSP_INVALID;
547         }
548
549         basic_data = ASN1_STRING_data(bytes->response);
550         basic_len = ASN1_STRING_length(bytes->response);
551         wpa_hexdump(MSG_DEBUG, "OpenSSL: BasicOCSPResponse",
552                     basic_data, basic_len);
553
554         basic = d2i_BasicOCSPResponse(NULL, &basic_data, basic_len);
555         if (!basic) {
556                 wpa_printf(MSG_INFO,
557                            "OpenSSL: Could not parse BasicOCSPResponse");
558                 OCSPResponse_free(resp);
559                 return OCSP_INVALID;
560         }
561
562         rd = basic->tbsResponseData;
563
564         if (basic->certs) {
565                 untrusted = sk_X509_dup(basic->certs);
566                 if (!untrusted)
567                         goto fail;
568
569                 num = sk_X509_num(basic->certs);
570                 for (i = 0; i < num; i++) {
571                         X509 *extra_cert;
572
573                         extra_cert = sk_X509_value(basic->certs, i);
574                         X509_NAME_oneline(X509_get_subject_name(extra_cert),
575                                           buf, sizeof(buf));
576                         wpa_printf(MSG_DEBUG,
577                                    "OpenSSL: BasicOCSPResponse cert %s", buf);
578
579                         if (!sk_X509_push(untrusted, extra_cert)) {
580                                 wpa_printf(MSG_DEBUG,
581                                            "OpenSSL: Could not add certificate to the untrusted stack");
582                         }
583                 }
584         }
585
586         store = SSL_CTX_get_cert_store(ssl_ctx);
587         if (issuer) {
588                 if (X509_STORE_add_cert(store, issuer) != 1) {
589                         tls_show_errors(MSG_INFO, __func__,
590                                         "OpenSSL: Could not add issuer to certificate store");
591                 }
592                 certs = sk_X509_new_null();
593                 if (certs) {
594                         tmp_cert = X509_dup(issuer);
595                         if (tmp_cert && !sk_X509_push(certs, tmp_cert)) {
596                                 tls_show_errors(
597                                         MSG_INFO, __func__,
598                                         "OpenSSL: Could not add issuer to OCSP responder trust store");
599                                 X509_free(tmp_cert);
600                                 sk_X509_free(certs);
601                                 certs = NULL;
602                         }
603                         if (certs && issuer_issuer) {
604                                 tmp_cert = X509_dup(issuer_issuer);
605                                 if (tmp_cert &&
606                                     !sk_X509_push(certs, tmp_cert)) {
607                                         tls_show_errors(
608                                                 MSG_INFO, __func__,
609                                                 "OpenSSL: Could not add issuer's issuer to OCSP responder trust store");
610                                         X509_free(tmp_cert);
611                                 }
612                         }
613                 }
614         }
615
616         signer = ocsp_find_signer(certs, rd->responderID);
617         if (!signer)
618                 signer = ocsp_find_signer(untrusted, rd->responderID);
619         else
620                 signer_trusted = 1;
621         if (!signer) {
622                 wpa_printf(MSG_DEBUG,
623                            "OpenSSL: Could not find OCSP signer certificate");
624                 goto fail;
625         }
626
627         skey = X509_get_pubkey(signer);
628         if (!skey) {
629                 wpa_printf(MSG_DEBUG,
630                            "OpenSSL: Could not get OCSP signer public key");
631                 goto fail;
632         }
633         if (ASN1_item_verify(ASN1_ITEM_rptr(ResponseData),
634                              basic->signatureAlgorithm, basic->signature,
635                              basic->tbsResponseData, skey) <= 0) {
636                 wpa_printf(MSG_DEBUG,
637                            "OpenSSL: BasicOCSPResponse signature is invalid");
638                 goto fail;
639         }
640
641         X509_NAME_oneline(X509_get_subject_name(signer), buf, sizeof(buf));
642         wpa_printf(MSG_DEBUG,
643                    "OpenSSL: Found OCSP signer certificate %s and verified BasicOCSPResponse signature",
644                    buf);
645
646         if (!X509_STORE_CTX_init(&ctx, store, signer, untrusted))
647                 goto fail;
648         X509_STORE_CTX_set_purpose(&ctx, X509_PURPOSE_OCSP_HELPER);
649         ret = X509_verify_cert(&ctx);
650         chain = X509_STORE_CTX_get1_chain(&ctx);
651         X509_STORE_CTX_cleanup(&ctx);
652         if (ret <= 0) {
653                 wpa_printf(MSG_DEBUG,
654                            "OpenSSL: Could not validate OCSP signer certificate");
655                 goto fail;
656         }
657
658         if (!chain || sk_X509_num(chain) <= 0) {
659                 wpa_printf(MSG_DEBUG, "OpenSSL: No OCSP signer chain found");
660                 goto fail;
661         }
662
663         if (!signer_trusted) {
664                 X509_check_purpose(signer, -1, 0);
665                 if ((signer->ex_flags & EXFLAG_XKUSAGE) &&
666                     (signer->ex_xkusage & XKU_OCSP_SIGN)) {
667                         wpa_printf(MSG_DEBUG,
668                                    "OpenSSL: OCSP signer certificate delegation OK");
669                 } else {
670                         tmp_cert = sk_X509_value(chain, sk_X509_num(chain) - 1);
671                         if (X509_check_trust(tmp_cert, NID_OCSP_sign, 0) !=
672                             X509_TRUST_TRUSTED) {
673                                 wpa_printf(MSG_DEBUG,
674                                            "OpenSSL: OCSP signer certificate not trusted");
675                                 result = OCSP_NO_RESPONSE;
676                                 goto fail;
677                         }
678                 }
679         }
680
681         wpa_printf(MSG_DEBUG, "OpenSSL: OCSP version: %lu",
682                    ASN1_INTEGER_get(rd->version));
683
684         txt = responderid_str(rd->responderID);
685         if (txt) {
686                 wpa_printf(MSG_DEBUG, "OpenSSL: OCSP responderID: %s",
687                            txt);
688                 os_free(txt);
689         }
690
691         txt = generalizedtime_str(rd->producedAt);
692         if (txt) {
693                 wpa_printf(MSG_DEBUG, "OpenSSL: OCSP producedAt: %s",
694                            txt);
695                 os_free(txt);
696         }
697
698         num_resp = sk_SingleResponse_num(rd->responses);
699         if (num_resp == 0) {
700                 wpa_printf(MSG_DEBUG,
701                            "OpenSSL: No OCSP SingleResponse within BasicOCSPResponse");
702                 result = OCSP_NO_RESPONSE;
703                 goto fail;
704         }
705         cmp_sresp = sk_SingleResponse_value(rd->responses, 0);
706         for (j = 0; j < num_resp; j++) {
707                 SingleResponse *sresp;
708                 CertID *cid1, *cid2;
709
710                 sresp = sk_SingleResponse_value(rd->responses, j);
711                 wpa_printf(MSG_DEBUG, "OpenSSL: OCSP SingleResponse %u/%u",
712                            j + 1, num_resp);
713
714                 txt = algor_str(sresp->certID->hashAlgorithm);
715                 if (txt) {
716                         wpa_printf(MSG_DEBUG,
717                                    "OpenSSL: certID hashAlgorithm: %s", txt);
718                         os_free(txt);
719                 }
720
721                 txt = octet_string_str(sresp->certID->issuerNameHash);
722                 if (txt) {
723                         wpa_printf(MSG_DEBUG,
724                                    "OpenSSL: certID issuerNameHash: %s", txt);
725                         os_free(txt);
726                 }
727
728                 txt = octet_string_str(sresp->certID->issuerKeyHash);
729                 if (txt) {
730                         wpa_printf(MSG_DEBUG,
731                                    "OpenSSL: certID issuerKeyHash: %s", txt);
732                         os_free(txt);
733                 }
734
735                 txt = integer_str(sresp->certID->serialNumber);
736                 if (txt) {
737                         wpa_printf(MSG_DEBUG,
738                                    "OpenSSL: certID serialNumber: %s", txt);
739                         os_free(txt);
740                 }
741
742                 switch (sresp->certStatus->type) {
743                 case 0:
744                         wpa_printf(MSG_DEBUG, "OpenSSL: certStatus: good");
745                         break;
746                 case 1:
747                         wpa_printf(MSG_DEBUG, "OpenSSL: certStatus: revoked");
748                         break;
749                 default:
750                         wpa_printf(MSG_DEBUG, "OpenSSL: certStatus: unknown");
751                         break;
752                 }
753
754                 txt = generalizedtime_str(sresp->thisUpdate);
755                 if (txt) {
756                         wpa_printf(MSG_DEBUG, "OpenSSL: thisUpdate: %s", txt);
757                         os_free(txt);
758                 }
759
760                 if (sresp->nextUpdate) {
761                         txt = generalizedtime_str(sresp->nextUpdate);
762                         if (txt) {
763                                 wpa_printf(MSG_DEBUG, "OpenSSL: nextUpdate: %s",
764                                            txt);
765                                 os_free(txt);
766                         }
767                 }
768
769                 txt = extensions_str("singleExtensions",
770                                      sresp->singleExtensions);
771                 if (txt) {
772                         wpa_printf(MSG_DEBUG, "OpenSSL: %s", txt);
773                         os_free(txt);
774                 }
775
776                 cid1 = cmp_sresp->certID;
777                 cid2 = sresp->certID;
778                 if (j > 0 &&
779                     (OBJ_cmp(cid1->hashAlgorithm->algorithm,
780                              cid2->hashAlgorithm->algorithm) != 0 ||
781                      ASN1_OCTET_STRING_cmp(cid1->issuerNameHash,
782                                            cid2->issuerNameHash) != 0 ||
783                      ASN1_OCTET_STRING_cmp(cid1->issuerKeyHash,
784                                            cid2->issuerKeyHash) != 0)) {
785                         wpa_printf(MSG_DEBUG,
786                                    "OpenSSL: Different OCSP response issuer information between SingleResponse values within BasicOCSPResponse");
787                         goto fail;
788                 }
789
790                 if (!matching_resp && issuer &&
791                     ASN1_INTEGER_cmp(sresp->certID->serialNumber,
792                                      X509_get_serialNumber(cert)) == 0 &&
793                     issuer_match(cert, issuer, sresp->certID) == 0) {
794                         wpa_printf(MSG_DEBUG,
795                                    "OpenSSL: This response matches peer certificate");
796                         matching_resp = sresp;
797                 }
798         }
799
800         txt = extensions_str("responseExtensions", rd->responseExtensions);
801         if (txt) {
802                 wpa_printf(MSG_DEBUG, "OpenSSL: %s", txt);
803                 os_free(txt);
804         }
805
806         if (!matching_resp) {
807                 wpa_printf(MSG_DEBUG,
808                            "OpenSSL: Could not find OCSP response that matches the peer certificate");
809                 result = OCSP_NO_RESPONSE;
810                 goto fail;
811         }
812
813         if (!ocsp_resp_valid(matching_resp->thisUpdate,
814                              matching_resp->nextUpdate)) {
815                 wpa_printf(MSG_DEBUG,
816                            "OpenSSL: OCSP response not valid at this time");
817                 goto fail;
818         }
819
820         if (matching_resp->certStatus->type == 1) {
821                 wpa_printf(MSG_DEBUG,
822                            "OpenSSL: OCSP response indicated that the peer certificate has been revoked");
823                 result = OCSP_REVOKED;
824                 goto fail;
825         }
826
827         if (matching_resp->certStatus->type != 0) {
828                 wpa_printf(MSG_DEBUG,
829                            "OpenSSL: OCSP response did not indicate good status");
830                 result = OCSP_NO_RESPONSE;
831                 goto fail;
832         }
833
834         /* OCSP response indicated the certificate is good. */
835         result = OCSP_GOOD;
836 fail:
837         sk_X509_pop_free(chain, X509_free);
838         sk_X509_free(untrusted);
839         sk_X509_pop_free(certs, X509_free);
840         BasicOCSPResponse_free(basic);
841         OCSPResponse_free(resp);
842
843         return result;
844 }
845
846 #endif /* OPENSSL_IS_BORINGSSL */