30 #include "absl/functional/bind_front.h"
31 #include "absl/memory/memory.h"
32 #include "absl/strings/str_cat.h"
33 #include "absl/strings/string_view.h"
58 char* CopyCoreString(
char* src,
size_t length) {
65 void PendingVerifierRequestInit(
66 const char* target_name,
tsi_peer peer,
71 request->target_name = target_name;
74 bool has_common_name =
false;
75 bool has_peer_cert =
false;
76 bool has_peer_cert_full_chain =
false;
77 std::vector<char*> uri_names;
78 std::vector<char*> dns_names;
79 std::vector<char*> email_names;
80 std::vector<char*> ip_names;
83 if (prop->
name ==
nullptr)
continue;
85 request->peer_info.common_name =
87 has_common_name =
true;
93 request->peer_info.peer_cert_full_chain =
95 has_peer_cert_full_chain =
true;
98 uri_names.emplace_back(uri);
101 dns_names.emplace_back(dns);
104 email_names.emplace_back(email);
107 ip_names.emplace_back(ip);
110 if (!has_common_name) {
111 request->peer_info.common_name =
nullptr;
113 if (!has_peer_cert) {
114 request->peer_info.peer_cert =
nullptr;
116 if (!has_peer_cert_full_chain) {
117 request->peer_info.peer_cert_full_chain =
nullptr;
119 request->peer_info.san_names.uri_names_size = uri_names.size();
120 if (!uri_names.empty()) {
121 request->peer_info.san_names.uri_names =
122 new char*[
request->peer_info.san_names.uri_names_size];
123 for (
size_t i = 0;
i <
request->peer_info.san_names.uri_names_size; ++
i) {
126 request->peer_info.san_names.uri_names[
i] = uri_names[
i];
129 request->peer_info.san_names.uri_names =
nullptr;
131 request->peer_info.san_names.dns_names_size = dns_names.size();
132 if (!dns_names.empty()) {
133 request->peer_info.san_names.dns_names =
134 new char*[
request->peer_info.san_names.dns_names_size];
135 for (
size_t i = 0;
i <
request->peer_info.san_names.dns_names_size; ++
i) {
138 request->peer_info.san_names.dns_names[
i] = dns_names[
i];
141 request->peer_info.san_names.dns_names =
nullptr;
143 request->peer_info.san_names.email_names_size = email_names.size();
144 if (!email_names.empty()) {
145 request->peer_info.san_names.email_names =
146 new char*[
request->peer_info.san_names.email_names_size];
147 for (
size_t i = 0;
i <
request->peer_info.san_names.email_names_size; ++
i) {
150 request->peer_info.san_names.email_names[
i] = email_names[
i];
153 request->peer_info.san_names.email_names =
nullptr;
155 request->peer_info.san_names.ip_names_size = ip_names.size();
156 if (!ip_names.empty()) {
157 request->peer_info.san_names.ip_names =
158 new char*[
request->peer_info.san_names.ip_names_size];
159 for (
size_t i = 0;
i <
request->peer_info.san_names.ip_names_size; ++
i) {
162 request->peer_info.san_names.ip_names[
i] = ip_names[
i];
165 request->peer_info.san_names.ip_names =
nullptr;
169 void PendingVerifierRequestDestroy(
172 if (
request->peer_info.common_name !=
nullptr) {
175 if (
request->peer_info.san_names.uri_names_size > 0) {
176 for (
size_t i = 0;
i <
request->peer_info.san_names.uri_names_size; ++
i) {
179 delete[]
request->peer_info.san_names.uri_names;
181 if (
request->peer_info.san_names.dns_names_size > 0) {
182 for (
size_t i = 0;
i <
request->peer_info.san_names.dns_names_size; ++
i) {
185 delete[]
request->peer_info.san_names.dns_names;
187 if (
request->peer_info.san_names.email_names_size > 0) {
188 for (
size_t i = 0;
i <
request->peer_info.san_names.email_names_size; ++
i) {
191 delete[]
request->peer_info.san_names.email_names;
193 if (
request->peer_info.san_names.ip_names_size > 0) {
194 for (
size_t i = 0;
i <
request->peer_info.san_names.ip_names_size; ++
i) {
197 delete[]
request->peer_info.san_names.ip_names;
199 if (
request->peer_info.peer_cert !=
nullptr) {
202 if (
request->peer_info.peer_cert_full_chain !=
nullptr) {
210 size_t num_key_cert_pairs = cert_pair_list.size();
211 if (num_key_cert_pairs > 0) {
216 for (
size_t i = 0;
i < num_key_cert_pairs;
i++) {
230 RefCountedPtr<grpc_channel_security_connector>
235 const char* target_name,
const char* overridden_target_name,
239 "channel_creds is nullptr in "
240 "TlsChannelSecurityConnectorCreate()");
245 "options is nullptr in "
246 "TlsChannelSecurityConnectorCreate()");
249 if (target_name ==
nullptr) {
251 "target_name is nullptr in "
252 "TlsChannelSecurityConnectorCreate()");
255 return MakeRefCounted<TlsChannelSecurityConnector>(
265 const char* target_name,
const char* overridden_target_name,
269 std::
move(request_metadata_creds)),
271 overridden_target_name_(
272 overridden_target_name == nullptr ?
"" : overridden_target_name),
273 ssl_session_cache_(ssl_session_cache) {
276 if (!tls_session_key_log_file_path.empty()) {
280 if (ssl_session_cache_ !=
nullptr) {
288 auto watcher_ptr = absl::make_unique<TlsChannelCertificateWatcher>(
this);
309 watcher_ptr->OnCertificatesChanged(absl::nullopt, absl::nullopt);
312 watched_root_cert_name,
313 watched_identity_cert_name);
318 if (ssl_session_cache_ !=
nullptr) {
324 if (distributor !=
nullptr) {
327 if (client_handshaker_factory_ !=
nullptr) {
337 if (client_handshaker_factory_ !=
nullptr) {
340 client_handshaker_factory_,
371 Ref(), on_peer_checked, peer, target_name);
374 pending_verifier_requests_.emplace(on_peer_checked, pending_request);
376 pending_request->Start();
383 "TlsChannelSecurityConnector::cancel_check_peer error: %s",
394 auto it = pending_verifier_requests_.find(on_peer_checked);
395 if (
it != pending_verifier_requests_.end()) {
396 pending_verifier_request =
it->second->request();
399 "TlsChannelSecurityConnector::cancel_check_peer: no "
400 "corresponding pending request found");
403 if (pending_verifier_request !=
nullptr) {
404 verifier->Cancel(pending_verifier_request);
413 if (c != 0)
return c;
417 if (c != 0)
return c;
444 const bool identity_ready =
447 if (root_ready && identity_ready) {
461 "TlsChannelCertificateWatcher getting root_cert_error: %s",
466 "TlsChannelCertificateWatcher getting identity_cert_error: %s",
477 : security_connector_(
std::
move(security_connector)),
479 PendingVerifierRequestInit(target_name, peer, &
request_);
485 PendingVerifierRequestDestroy(&
request_);
491 security_connector_->options_->certificate_verifier();
498 OnVerifyDone(
false, sync_status);
505 MutexLock lock(&security_connector_->verifier_request_map_mu_);
511 absl::StrCat(
"Custom verification check failed with error: ",
515 if (run_callback_inline) {
529 if (client_handshaker_factory_ !=
nullptr) {
533 if (pem_root_certs_.has_value()) {
539 if (pem_key_cert_pair_list_.has_value()) {
540 pem_key_cert_pair = ConvertToTsiPemKeyCertPair(*pem_key_cert_pair_list_);
547 skip_server_certificate_verification,
551 &client_handshaker_factory_);
553 if (pem_key_cert_pair !=
nullptr) {
564 if (server_creds ==
nullptr) {
566 "server_creds is nullptr in "
567 "TlsServerSecurityConnectorCreate()");
572 "options is nullptr in "
573 "TlsServerSecurityConnectorCreate()");
576 return MakeRefCounted<TlsServerSecurityConnector>(
std::move(server_creds),
588 if (!tls_session_key_log_file_path.empty()) {
593 auto watcher_ptr = absl::make_unique<TlsServerCertificateWatcher>(
this);
608 watched_root_cert_name,
609 watched_identity_cert_name);
617 if (server_handshaker_factory_ !=
nullptr) {
627 if (server_handshaker_factory_ !=
nullptr) {
630 server_handshaker_factory_, 0,
654 auto* pending_request =
658 pending_verifier_requests_.emplace(on_peer_checked, pending_request);
660 pending_request->Start();
671 "TlsServerSecurityConnector::cancel_check_peer error: %s",
682 auto it = pending_verifier_requests_.find(on_peer_checked);
683 if (
it != pending_verifier_requests_.end()) {
684 pending_verifier_request =
it->second->request();
687 "TlsServerSecurityConnector::cancel_check_peer: no "
688 "corresponding pending request found");
691 if (pending_verifier_request !=
nullptr) {
692 verifier->Cancel(pending_verifier_request);
701 if (c != 0)
return c;
718 bool identity_being_watched =
720 bool identity_has_value =
722 if ((root_being_watched && root_has_value && identity_being_watched &&
723 identity_has_value) ||
724 (root_being_watched && root_has_value && !identity_being_watched) ||
725 (!root_being_watched && identity_being_watched && identity_has_value)) {
739 "TlsServerCertificateWatcher getting root_cert_error: %s",
744 "TlsServerCertificateWatcher getting identity_cert_error: %s",
755 : security_connector_(
std::
move(security_connector)),
757 PendingVerifierRequestInit(
nullptr, peer, &
request_);
763 PendingVerifierRequestDestroy(&
request_);
769 security_connector_->options_->certificate_verifier();
775 OnVerifyDone(
false, sync_status);
782 MutexLock lock(&security_connector_->verifier_request_map_mu_);
788 absl::StrCat(
"Custom verification check failed with error: ",
792 if (run_callback_inline) {
805 if (server_handshaker_factory_ !=
nullptr) {
809 GPR_ASSERT(pem_key_cert_pair_list_.has_value());
810 GPR_ASSERT(!(*pem_key_cert_pair_list_).empty());
812 if (pem_root_certs_.has_value()) {
818 pem_key_cert_pairs = ConvertToTsiPemKeyCertPair(*pem_key_cert_pair_list_);
819 size_t num_key_cert_pairs = (*pem_key_cert_pair_list_).size();
821 pem_key_cert_pairs, num_key_cert_pairs,
827 &server_handshaker_factory_);