| 7691 | } |
| 7692 | |
| 7693 | inline bool SSLClient::initialize_ssl(Socket & socket, Error & error) { |
| 7694 | auto ssl = detail::ssl_new( |
| 7695 | socket.sock, ctx_, ctx_mutex_, |
| 7696 | [&](SSL* ssl2) { |
| 7697 | if (server_certificate_verification_) { |
| 7698 | if (!load_certs()) { |
| 7699 | error = Error::SSLLoadingCerts; |
| 7700 | return false; |
| 7701 | } |
| 7702 | SSL_set_verify(ssl2, SSL_VERIFY_NONE, nullptr); |
| 7703 | } |
| 7704 | |
| 7705 | if (!detail::ssl_connect_or_accept_nonblocking( |
| 7706 | socket.sock, ssl2, SSL_connect, connection_timeout_sec_, |
| 7707 | connection_timeout_usec_)) { |
| 7708 | error = Error::SSLConnection; |
| 7709 | return false; |
| 7710 | } |
| 7711 | |
| 7712 | if (server_certificate_verification_) { |
| 7713 | verify_result_ = SSL_get_verify_result(ssl2); |
| 7714 | |
| 7715 | if (verify_result_ != X509_V_OK) { |
| 7716 | error = Error::SSLServerVerification; |
| 7717 | return false; |
| 7718 | } |
| 7719 | |
| 7720 | auto server_cert = SSL_get_peer_certificate(ssl2); |
| 7721 | |
| 7722 | if (server_cert == nullptr) { |
| 7723 | error = Error::SSLServerVerification; |
| 7724 | return false; |
| 7725 | } |
| 7726 | |
| 7727 | if (!verify_host(server_cert)) { |
| 7728 | X509_free(server_cert); |
| 7729 | error = Error::SSLServerVerification; |
| 7730 | return false; |
| 7731 | } |
| 7732 | X509_free(server_cert); |
| 7733 | } |
| 7734 | |
| 7735 | return true; |
| 7736 | }, |
| 7737 | [&](SSL* ssl2) { |
| 7738 | SSL_set_tlsext_host_name(ssl2, host_.c_str()); |
| 7739 | return true; |
| 7740 | }); |
| 7741 | |
| 7742 | if (ssl) { |
| 7743 | socket.ssl = ssl; |
| 7744 | return true; |
| 7745 | } |
| 7746 | |
| 7747 | shutdown_socket(socket); |
| 7748 | close_socket(socket); |
| 7749 | return false; |
| 7750 | } |
no test coverage detected