| 7570 | } |
| 7571 | |
| 7572 | inline bool SSLClient::initialize_ssl(Socket &socket, Error &error) { |
| 7573 | auto ssl = detail::ssl_new( |
| 7574 | socket.sock, ctx_, ctx_mutex_, |
| 7575 | [&](SSL *ssl) { |
| 7576 | if (server_certificate_verification_) { |
| 7577 | if (!load_certs()) { |
| 7578 | error = Error::SSLLoadingCerts; |
| 7579 | return false; |
| 7580 | } |
| 7581 | SSL_set_verify(ssl, SSL_VERIFY_NONE, nullptr); |
| 7582 | } |
| 7583 | |
| 7584 | if (!detail::ssl_connect_or_accept_nonblocking( |
| 7585 | socket.sock, ssl, SSL_connect, connection_timeout_sec_, |
| 7586 | connection_timeout_usec_)) { |
| 7587 | error = Error::SSLConnection; |
| 7588 | return false; |
| 7589 | } |
| 7590 | |
| 7591 | if (server_certificate_verification_) { |
| 7592 | verify_result_ = SSL_get_verify_result(ssl); |
| 7593 | |
| 7594 | if (verify_result_ != X509_V_OK) { |
| 7595 | error = Error::SSLServerVerification; |
| 7596 | return false; |
| 7597 | } |
| 7598 | |
| 7599 | auto server_cert = SSL_get_peer_certificate(ssl); |
| 7600 | |
| 7601 | if (server_cert == nullptr) { |
| 7602 | error = Error::SSLServerVerification; |
| 7603 | return false; |
| 7604 | } |
| 7605 | |
| 7606 | if (!verify_host(server_cert)) { |
| 7607 | X509_free(server_cert); |
| 7608 | error = Error::SSLServerVerification; |
| 7609 | return false; |
| 7610 | } |
| 7611 | X509_free(server_cert); |
| 7612 | } |
| 7613 | |
| 7614 | return true; |
| 7615 | }, |
| 7616 | [&](SSL *ssl) { |
| 7617 | SSL_set_tlsext_host_name(ssl, host_.c_str()); |
| 7618 | return true; |
| 7619 | }); |
| 7620 | |
| 7621 | if (ssl) { |
| 7622 | socket.ssl = ssl; |
| 7623 | return true; |
| 7624 | } |
| 7625 | |
| 7626 | shutdown_socket(socket); |
| 7627 | close_socket(socket); |
| 7628 | return false; |
| 7629 | } |
no test coverage detected