tls_certificate_verifier.cc
Go to the documentation of this file.
1 //
2 // Copyright 2021 gRPC authors.
3 //
4 // Licensed under the Apache License, Version 2.0 (the "License");
5 // you may not use this file except in compliance with the License.
6 // You may obtain a copy of the License at
7 //
8 // http://www.apache.org/licenses/LICENSE-2.0
9 //
10 // Unless required by applicable law or agreed to in writing, software
11 // distributed under the License is distributed on an "AS IS" BASIS,
12 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 // See the License for the specific language governing permissions and
14 // limitations under the License.
15 //
16 
17 #include <stddef.h>
18 
19 #include <functional>
20 #include <map>
21 #include <string>
22 #include <utility>
23 #include <vector>
24 
25 #include <grpc/grpc_security.h>
26 #include <grpc/status.h>
27 #include <grpc/support/alloc.h>
28 #include <grpc/support/log.h>
33 #include <grpcpp/support/config.h>
34 #include <grpcpp/support/status.h>
36 
37 namespace grpc {
38 namespace experimental {
39 
41 
44  : c_request_(request) {
45  GPR_ASSERT(c_request_ != nullptr);
46 }
47 
49  return c_request_->target_name != nullptr ? c_request_->target_name : "";
50 }
51 
53  return c_request_->peer_info.peer_cert != nullptr
55  : "";
56 }
57 
59  const {
60  return c_request_->peer_info.peer_cert_full_chain != nullptr
62  : "";
63 }
64 
66  return c_request_->peer_info.common_name != nullptr
68  : "";
69 }
70 
71 std::vector<grpc::string_ref> TlsCustomVerificationCheckRequest::uri_names()
72  const {
73  std::vector<grpc::string_ref> uri_names;
74  for (size_t i = 0; i < c_request_->peer_info.san_names.uri_names_size; ++i) {
76  }
77  return uri_names;
78 }
79 
80 std::vector<grpc::string_ref> TlsCustomVerificationCheckRequest::dns_names()
81  const {
82  std::vector<grpc::string_ref> dns_names;
83  for (size_t i = 0; i < c_request_->peer_info.san_names.dns_names_size; ++i) {
85  }
86  return dns_names;
87 }
88 
89 std::vector<grpc::string_ref> TlsCustomVerificationCheckRequest::email_names()
90  const {
91  std::vector<grpc::string_ref> email_names;
92  for (size_t i = 0; i < c_request_->peer_info.san_names.email_names_size;
93  ++i) {
95  }
96  return email_names;
97 }
98 
99 std::vector<grpc::string_ref> TlsCustomVerificationCheckRequest::ip_names()
100  const {
101  std::vector<grpc::string_ref> ip_names;
102  for (size_t i = 0; i < c_request_->peer_info.san_names.ip_names_size; ++i) {
104  }
105  return ip_names;
106 }
107 
109  : verifier_(v) {
111 }
112 
115 }
116 
119  grpc::Status* sync_status) {
120  GPR_ASSERT(request != nullptr);
121  GPR_ASSERT(request->c_request() != nullptr);
122  {
123  internal::MutexLock lock(&mu_);
124  request_map_.emplace(request->c_request(), std::move(callback));
125  }
126  grpc_status_code status_code = GRPC_STATUS_OK;
127  char* error_details = nullptr;
129  verifier_, request->c_request(), &AsyncCheckDone, this, &status_code,
130  &error_details);
131  if (is_done) {
132  if (status_code != GRPC_STATUS_OK) {
133  *sync_status = grpc::Status(static_cast<grpc::StatusCode>(status_code),
134  error_details);
135  }
136  internal::MutexLock lock(&mu_);
137  request_map_.erase(request->c_request());
138  }
139  gpr_free(error_details);
140  return is_done;
141 }
142 
144  GPR_ASSERT(request != nullptr);
145  GPR_ASSERT(request->c_request() != nullptr);
147 }
148 
151  grpc_status_code status, const char* error_details) {
152  auto* self = static_cast<CertificateVerifier*>(callback_arg);
154  {
155  internal::MutexLock lock(&self->mu_);
156  auto it = self->request_map_.find(request);
157  if (it != self->request_map_.end()) {
158  callback = std::move(it->second);
159  self->request_map_.erase(it);
160  }
161  }
162  if (callback != nullptr) {
163  grpc::Status return_status;
164  if (status != GRPC_STATUS_OK) {
165  return_status =
166  grpc::Status(static_cast<grpc::StatusCode>(status), error_details);
167  }
168  callback(return_status);
169  }
170 }
171 
174  base_->user_data = this;
178 }
179 
181 
185  grpc_status_code* sync_status, char** sync_error_details) {
186  auto* self = static_cast<ExternalCertificateVerifier*>(user_data);
187  TlsCustomVerificationCheckRequest* cpp_request = nullptr;
188  {
189  internal::MutexLock lock(&self->mu_);
190  auto pair = self->request_map_.emplace(
191  request, AsyncRequestState(callback, callback_arg, request));
192  GPR_ASSERT(pair.second);
193  cpp_request = &pair.first->second.cpp_request;
194  }
195  grpc::Status sync_current_verifier_status;
196  bool is_done = self->Verify(
197  cpp_request,
198  [self, request](grpc::Status status) {
200  void* callback_arg = nullptr;
201  {
202  internal::MutexLock lock(&self->mu_);
203  auto it = self->request_map_.find(request);
204  if (it != self->request_map_.end()) {
205  callback = it->second.callback;
206  callback_arg = it->second.callback_arg;
207  self->request_map_.erase(it);
208  }
209  }
210  if (callback != nullptr) {
211  callback(request, callback_arg,
212  static_cast<grpc_status_code>(status.error_code()),
213  status.error_message().c_str());
214  }
215  },
216  &sync_current_verifier_status);
217  if (is_done) {
218  if (!sync_current_verifier_status.ok()) {
219  *sync_status = static_cast<grpc_status_code>(
220  sync_current_verifier_status.error_code());
221  *sync_error_details =
222  gpr_strdup(sync_current_verifier_status.error_message().c_str());
223  }
224  internal::MutexLock lock(&self->mu_);
225  self->request_map_.erase(request);
226  }
227  return is_done;
228 }
229 
232  auto* self = static_cast<ExternalCertificateVerifier*>(user_data);
233  TlsCustomVerificationCheckRequest* cpp_request = nullptr;
234  {
235  internal::MutexLock lock(&self->mu_);
236  auto it = self->request_map_.find(request);
237  if (it != self->request_map_.end()) {
238  cpp_request = &it->second.cpp_request;
239  }
240  }
241  if (cpp_request != nullptr) {
242  self->Cancel(cpp_request);
243  }
244 }
245 
247  void* user_data) {
248  auto* self = static_cast<ExternalCertificateVerifier*>(user_data);
249  delete self;
250 }
251 
254 
257 
258 } // namespace experimental
259 } // namespace grpc
grpc_tls_custom_verification_check_request::peer_info::peer_cert
const char * peer_cert
Definition: grpc_security.h:927
grpc::string_ref
Definition: grpcpp/impl/codegen/string_ref.h:43
grpc_tls_custom_verification_check_request::peer_info::peer_cert_full_chain
const char * peer_cert_full_chain
Definition: grpc_security.h:933
grpc::status
auto status
Definition: cpp/client/credentials_test.cc:200
grpc::experimental::TlsCustomVerificationCheckRequest
Definition: tls_certificate_verifier.h:55
regen-readme.it
it
Definition: regen-readme.py:15
log.h
grpc::experimental::TlsCustomVerificationCheckRequest::target_name
grpc::string_ref target_name() const
Definition: tls_certificate_verifier.cc:48
grpc::experimental::CertificateVerifier::AsyncCheckDone
static void AsyncCheckDone(grpc_tls_custom_verification_check_request *request, void *callback_arg, grpc_status_code status, const char *error_details)
Definition: tls_certificate_verifier.cc:149
grpc::gpr_free
gpr_free(creds_file_name)
grpc_tls_certificate_verifier_external::cancel
void(* cancel)(void *user_data, grpc_tls_custom_verification_check_request *request)
Definition: grpc_security.h:1018
grpc
Definition: grpcpp/alarm.h:33
grpc::Status::ok
bool ok() const
Is the status OK?
Definition: include/grpcpp/impl/codegen/status.h:126
grpc::internal::GrpcLibraryInitializer::summon
int summon()
Definition: grpcpp/impl/grpc_library.h:54
grpc_tls_custom_verification_check_request::peer_info::san_names::email_names
char ** email_names
Definition: grpc_security.h:921
grpc::experimental::TlsCustomVerificationCheckRequest::dns_names
std::vector< grpc::string_ref > dns_names() const
Definition: tls_certificate_verifier.cc:80
benchmark.request
request
Definition: benchmark.py:77
grpc::experimental::ExternalCertificateVerifier
Definition: tls_certificate_verifier.h:135
grpc_status_code
grpc_status_code
Definition: include/grpc/impl/codegen/status.h:28
grpc_tls_custom_verification_check_request::peer_info::common_name
const char * common_name
Definition: grpc_security.h:914
grpc::experimental::ExternalCertificateVerifier::ExternalCertificateVerifier
ExternalCertificateVerifier()
Definition: tls_certificate_verifier.cc:172
grpc_security.h
grpc_tls_on_custom_verification_check_done_cb
void(* grpc_tls_on_custom_verification_check_done_cb)(grpc_tls_custom_verification_check_request *request, void *callback_arg, grpc_status_code status, const char *error_details)
Definition: grpc_security.h:946
grpc::experimental::CertificateVerifier::verifier_
grpc_tls_certificate_verifier * verifier_
Definition: tls_certificate_verifier.h:122
grpc_tls_custom_verification_check_request::peer_info::san_names::dns_names
char ** dns_names
Definition: grpc_security.h:919
grpc::experimental::TlsCustomVerificationCheckRequest::peer_cert_full_chain
grpc::string_ref peer_cert_full_chain() const
Definition: tls_certificate_verifier.cc:58
grpc::experimental::ExternalCertificateVerifier::VerifyInCoreExternalVerifier
static int VerifyInCoreExternalVerifier(void *user_data, grpc_tls_custom_verification_check_request *request, grpc_tls_on_custom_verification_check_done_cb callback, void *callback_arg, grpc_status_code *sync_status, char **sync_error_details)
Definition: tls_certificate_verifier.cc:182
grpc_tls_certificate_verifier_cancel
void grpc_tls_certificate_verifier_cancel(grpc_tls_certificate_verifier *verifier, grpc_tls_custom_verification_check_request *request)
Definition: grpc_tls_certificate_verifier.cc:211
grpc::internal::MutexLock
Definition: include/grpcpp/impl/codegen/sync.h:86
grpc_tls_custom_verification_check_request::peer_info::san_names
struct grpc_tls_custom_verification_check_request::peer_info::san_names san_names
status.h
grpc::experimental::ExternalCertificateVerifier::AsyncRequestState
Definition: tls_certificate_verifier.h:187
string_util.h
grpc_tls_custom_verification_check_request::peer_info::san_names::uri_names
char ** uri_names
Definition: grpc_security.h:917
grpc::internal::GrpcLibraryInitializer
Instantiating this class ensures the proper initialization of gRPC.
Definition: grpcpp/impl/grpc_library.h:39
GRPC_STATUS_OK
@ GRPC_STATUS_OK
Definition: include/grpc/impl/codegen/status.h:30
sync.h
grpc_tls_custom_verification_check_request::peer_info::san_names::ip_names_size
size_t ip_names_size
Definition: grpc_security.h:924
absl::move
constexpr absl::remove_reference_t< T > && move(T &&t) noexcept
Definition: abseil-cpp/absl/utility/utility.h:221
GPR_ASSERT
#define GPR_ASSERT(x)
Definition: include/grpc/impl/codegen/log.h:94
grpc_tls_custom_verification_check_request::target_name
const char * target_name
Definition: grpc_security.h:910
grpc::experimental::ExternalCertificateVerifier::base_
grpc_tls_certificate_verifier_external * base_
Definition: tls_certificate_verifier.h:211
grpc::Status::error_message
std::string error_message() const
Return the instance's error message.
Definition: include/grpcpp/impl/codegen/status.h:120
grpc.StatusCode
Definition: src/python/grpcio/grpc/__init__.py:232
setup.v
v
Definition: third_party/bloaty/third_party/capstone/bindings/python/setup.py:42
grpc::experimental::TlsCustomVerificationCheckRequest::common_name
grpc::string_ref common_name() const
Definition: tls_certificate_verifier.cc:65
grpc_tls_certificate_verifier_external::destruct
void(* destruct)(void *user_data)
Definition: grpc_security.h:1037
grpc_tls_certificate_verifier_external::user_data
void * user_data
Definition: grpc_security.h:964
grpc::experimental::TlsCustomVerificationCheckRequest::email_names
std::vector< grpc::string_ref > email_names() const
Definition: tls_certificate_verifier.cc:89
grpc_tls_certificate_verifier_external::verify
int(* verify)(void *user_data, grpc_tls_custom_verification_check_request *request, grpc_tls_on_custom_verification_check_done_cb callback, void *callback_arg, grpc_status_code *sync_status, char **sync_error_details)
Definition: grpc_security.h:998
grpc::experimental::TlsCustomVerificationCheckRequest::c_request_
grpc_tls_custom_verification_check_request * c_request_
Definition: tls_certificate_verifier.h:73
grpc_tls_custom_verification_check_request::peer_info::san_names::uri_names_size
size_t uri_names_size
Definition: grpc_security.h:918
tls_certificate_verifier.h
callback
static void callback(void *arg, int status, int timeouts, struct hostent *host)
Definition: acountry.c:224
grpc::experimental::ExternalCertificateVerifier::DestructInCoreExternalVerifier
static void DestructInCoreExternalVerifier(void *user_data)
Definition: tls_certificate_verifier.cc:246
grpc::experimental::HostNameCertificateVerifier::HostNameCertificateVerifier
HostNameCertificateVerifier()
Definition: tls_certificate_verifier.cc:255
grpc::experimental::CertificateVerifier
Definition: tls_certificate_verifier.h:83
config.h
grpc_tls_certificate_verifier_no_op_create
grpc_tls_certificate_verifier * grpc_tls_certificate_verifier_no_op_create()
Definition: grpc_tls_certificate_verifier.cc:224
grpc_tls_custom_verification_check_request::peer_info::san_names::ip_names
char ** ip_names
Definition: grpc_security.h:923
grpc::experimental::CertificateVerifier::CertificateVerifier
CertificateVerifier(grpc_tls_certificate_verifier *v)
Definition: tls_certificate_verifier.cc:108
grpc_tls_certificate_verifier_host_name_create
grpc_tls_certificate_verifier * grpc_tls_certificate_verifier_host_name_create()
Definition: grpc_tls_certificate_verifier.cc:230
grpc::experimental::CertificateVerifier::Verify
bool Verify(TlsCustomVerificationCheckRequest *request, std::function< void(grpc::Status)> callback, grpc::Status *sync_status)
Definition: tls_certificate_verifier.cc:117
grpc::experimental::ExternalCertificateVerifier::CancelInCoreExternalVerifier
static void CancelInCoreExternalVerifier(void *user_data, grpc_tls_custom_verification_check_request *request)
Definition: tls_certificate_verifier.cc:230
grpc::experimental::CertificateVerifier::~CertificateVerifier
~CertificateVerifier()
Definition: tls_certificate_verifier.cc:113
grpc_library.h
grpc_tls_certificate_verifier_verify
int grpc_tls_certificate_verifier_verify(grpc_tls_certificate_verifier *verifier, grpc_tls_custom_verification_check_request *request, grpc_tls_on_custom_verification_check_done_cb callback, void *callback_arg, grpc_status_code *sync_status, char **sync_error_details)
Definition: grpc_tls_certificate_verifier.cc:187
grpc::experimental::CertificateVerifier::mu_
grpc::internal::Mutex mu_
Definition: tls_certificate_verifier.h:123
alloc.h
grpc::experimental::NoOpCertificateVerifier::NoOpCertificateVerifier
NoOpCertificateVerifier()
Definition: tls_certificate_verifier.cc:252
grpc_tls_custom_verification_check_request::peer_info::san_names::dns_names_size
size_t dns_names_size
Definition: grpc_security.h:920
grpc::protobuf::util::Status
GRPC_CUSTOM_UTIL_STATUS Status
Definition: include/grpcpp/impl/codegen/config_protobuf.h:93
grpc::experimental::TlsCustomVerificationCheckRequest::ip_names
std::vector< grpc::string_ref > ip_names() const
Definition: tls_certificate_verifier.cc:99
grpc::experimental::TlsCustomVerificationCheckRequest::uri_names
std::vector< grpc::string_ref > uri_names() const
Definition: tls_certificate_verifier.cc:71
grpc::Status
Definition: include/grpcpp/impl/codegen/status.h:35
grpc_tls_certificate_verifier_release
void grpc_tls_certificate_verifier_release(grpc_tls_certificate_verifier *verifier)
Definition: grpc_tls_certificate_verifier.cc:235
grpc_tls_certificate_verifier
Definition: grpc_tls_certificate_verifier.h:38
grpc_tls_custom_verification_check_request
Definition: grpc_security.h:907
gpr_strdup
GPRAPI char * gpr_strdup(const char *src)
Definition: string.cc:39
grpc::Status::error_code
StatusCode error_code() const
Return the instance's error code.
Definition: include/grpcpp/impl/codegen/status.h:118
grpc::experimental::g_gli_initializer
static internal::GrpcLibraryInitializer g_gli_initializer
Definition: tls_certificate_verifier.cc:40
function
std::function< bool(GrpcTool *, int, const char **, const CliCredentials &, GrpcToolOutputCallback)> function
Definition: grpc_tool.cc:250
self
PHP_PROTO_OBJECT_FREE_END PHP_PROTO_OBJECT_DTOR_END intern self
Definition: bloaty/third_party/protobuf/php/ext/google/protobuf/map.c:543
grpc_tls_custom_verification_check_request::peer_info
struct grpc_tls_custom_verification_check_request::peer_info peer_info
grpc_tls_certificate_verifier_external
struct grpc_tls_certificate_verifier_external grpc_tls_certificate_verifier_external
grpc::experimental::CertificateVerifier::Cancel
void Cancel(TlsCustomVerificationCheckRequest *request)
Definition: tls_certificate_verifier.cc:143
pair
std::pair< std::string, std::string > pair
Definition: abseil-cpp/absl/container/internal/raw_hash_set_benchmark.cc:78
grpc::experimental::TlsCustomVerificationCheckRequest::peer_cert
grpc::string_ref peer_cert() const
Definition: tls_certificate_verifier.cc:52
grpc_tls_custom_verification_check_request::peer_info::san_names::email_names_size
size_t email_names_size
Definition: grpc_security.h:922
grpc::experimental::ExternalCertificateVerifier::~ExternalCertificateVerifier
virtual ~ExternalCertificateVerifier()
Definition: tls_certificate_verifier.cc:180
string_ref.h
i
uint64_t i
Definition: abseil-cpp/absl/container/btree_benchmark.cc:230
grpc::experimental::TlsCustomVerificationCheckRequest::TlsCustomVerificationCheckRequest
TlsCustomVerificationCheckRequest(grpc_tls_custom_verification_check_request *request)
Definition: tls_certificate_verifier.cc:42
status.h


grpc
Author(s):
autogenerated on Fri May 16 2025 03:00:39