| 8090 | } |
| 8091 | |
| 8092 | inline bool SSLClient::initialize_ssl(Socket &socket, Error &error) { |
| 8093 | auto ssl = detail::ssl_new( |
| 8094 | socket.sock, ctx_, ctx_mutex_, |
| 8095 | [&](SSL *ssl2) { |
| 8096 | if (server_certificate_verification_) { |
| 8097 | if (!load_certs()) { |
| 8098 | error = Error::SSLLoadingCerts; |
| 8099 | return false; |
| 8100 | } |
| 8101 | SSL_set_verify(ssl2, SSL_VERIFY_NONE, nullptr); |
| 8102 | } |
| 8103 | |
| 8104 | if (!detail::ssl_connect_or_accept_nonblocking( |
| 8105 | socket.sock, ssl2, SSL_connect, connection_timeout_sec_, |
| 8106 | connection_timeout_usec_)) { |
| 8107 | error = Error::SSLConnection; |
| 8108 | return false; |
| 8109 | } |
| 8110 | |
| 8111 | if (server_certificate_verification_) { |
| 8112 | verify_result_ = SSL_get_verify_result(ssl2); |
| 8113 | |
| 8114 | if (verify_result_ != X509_V_OK) { |
| 8115 | error = Error::SSLServerVerification; |
| 8116 | return false; |
| 8117 | } |
| 8118 | |
| 8119 | auto server_cert = SSL_get1_peer_certificate(ssl2); |
| 8120 | |
| 8121 | if (server_cert == nullptr) { |
| 8122 | error = Error::SSLServerVerification; |
| 8123 | return false; |
| 8124 | } |
| 8125 | |
| 8126 | if (!verify_host(server_cert)) { |
| 8127 | X509_free(server_cert); |
| 8128 | error = Error::SSLServerVerification; |
| 8129 | return false; |
| 8130 | } |
| 8131 | X509_free(server_cert); |
| 8132 | } |
| 8133 | |
| 8134 | return true; |
| 8135 | }, |
| 8136 | [&](SSL *ssl2) { |
| 8137 | SSL_set_tlsext_host_name(ssl2, host_.c_str()); |
| 8138 | return true; |
| 8139 | }); |
| 8140 | |
| 8141 | if (ssl) { |
| 8142 | socket.ssl = ssl; |
| 8143 | return true; |
| 8144 | } |
| 8145 | |
| 8146 | shutdown_socket(socket); |
| 8147 | close_socket(socket); |
| 8148 | return false; |
| 8149 | } |
no test coverage detected