1 /* 2 * SSL/TLS interface functions for OpenSSL - BoringSSL OCSP 3 * Copyright (c) 2004-2015, Jouni Malinen <j (at) 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 */ 847