31 #include "absl/base/attributes.h"
32 #include "absl/container/inlined_vector.h"
33 #include "absl/memory/memory.h"
34 #include "absl/strings/str_cat.h"
35 #include "absl/strings/string_view.h"
36 #include "absl/types/optional.h"
68 #define GRPC_INITIAL_HANDSHAKE_BUFFER_SIZE 256
74 class SecurityHandshaker :
public Handshaker {
79 ~SecurityHandshaker()
override;
83 HandshakerArgs*
args)
override;
84 const char*
name()
const override {
return "security"; }
88 size_t bytes_received_size);
94 void CleanupArgsForFailureLocked();
96 static void OnHandshakeDataReceivedFromPeerFn(
void*
arg,
99 static void OnHandshakeDataReceivedFromPeerFnScheduler(
101 static void OnHandshakeDataSentToPeerFnScheduler(
void*
arg,
103 static void OnHandshakeNextDoneGrpcWrapper(
108 size_t MoveReadBufferIntoHandshakeBuffer();
137 SecurityHandshaker::SecurityHandshaker(
tsi_handshaker* handshaker,
150 this, grpc_schedule_on_exec_ctx);
153 SecurityHandshaker::~SecurityHandshaker() {
169 size_t SecurityHandshaker::MoveReadBufferIntoHandshakeBuffer() {
170 size_t bytes_in_read_buffer =
args_->read_buffer->length;
177 while (
args_->read_buffer->count > 0) {
184 return bytes_in_read_buffer;
189 void SecurityHandshaker::CleanupArgsForFailureLocked() {
191 args_->endpoint =
nullptr;
193 args_->read_buffer =
nullptr;
195 args_->args =
nullptr;
217 CleanupArgsForFailureLocked();
228 RefCountedPtr<channelz::SocketNode::Security>
230 RefCountedPtr<channelz::SocketNode::Security> security =
231 MakeRefCounted<channelz::SocketNode::Security>();
237 security->type = channelz::SocketNode::Security::ModelType::kTls;
238 security->tls = absl::make_optional<channelz::SocketNode::Security::Tls>();
242 if (prop !=
nullptr) {
243 security->tls->remote_certificate =
254 HandshakeFailedLocked(
error);
258 const unsigned char* unused_bytes =
nullptr;
259 size_t unused_bytes_size = 0;
265 "TSI handshaker result does not provide unused bytes"),
276 "TSI handshaker result does not implement "
277 "get_frame_protector_type"),
283 switch (frame_protector_type) {
290 &zero_copy_protector);
294 "Zero-copy frame protector creation failed"),
305 HandshakeFailedLocked(
307 "Frame protector creation failed"),
315 bool has_frame_protector =
316 zero_copy_protector !=
nullptr || protector !=
nullptr;
318 if (has_frame_protector) {
319 if (unused_bytes_size > 0) {
321 reinterpret_cast<const char*
>(unused_bytes), unused_bytes_size);
331 }
else if (unused_bytes_size > 0) {
334 reinterpret_cast<const char*
>(unused_bytes), unused_bytes_size);
344 RefCountedPtr<channelz::SocketNode::Security> channelz_security;
346 if (has_frame_protector) {
349 args_to_add.
push_back(channelz_security->MakeChannelArg());
363 RefCountedPtr<SecurityHandshaker>(
static_cast<SecurityHandshaker*
>(
arg))
395 &SecurityHandshaker::OnHandshakeDataReceivedFromPeerFnScheduler,
396 this, grpc_schedule_on_exec_ctx),
401 auto* security_connector =
404 if (security_connector !=
nullptr) {
405 connector_type = security_connector->type().name();
413 if (handshaker_result !=
nullptr) {
417 if (bytes_to_send_size > 0) {
420 reinterpret_cast<const char*
>(bytes_to_send), bytes_to_send_size);
427 &SecurityHandshaker::OnHandshakeDataSentToPeerFnScheduler,
this,
428 grpc_schedule_on_exec_ctx),
430 }
else if (handshaker_result ==
nullptr) {
436 &SecurityHandshaker::OnHandshakeDataReceivedFromPeerFnScheduler,
437 this, grpc_schedule_on_exec_ctx),
441 error = CheckPeerLocked();
446 void SecurityHandshaker::OnHandshakeNextDoneGrpcWrapper(
449 RefCountedPtr<SecurityHandshaker>
h(
450 static_cast<SecurityHandshaker*
>(user_data));
453 result, bytes_to_send, bytes_to_send_size, handshaker_result);
455 h->HandshakeFailedLocked(
error);
462 const unsigned char*
bytes_received,
size_t bytes_received_size) {
464 const unsigned char* bytes_to_send =
nullptr;
465 size_t bytes_to_send_size = 0;
469 &bytes_to_send_size, &hs_result, &OnHandshakeNextDoneGrpcWrapper,
this);
477 return OnHandshakeNextDoneLocked(
result, bytes_to_send, bytes_to_send_size,
483 void SecurityHandshaker::OnHandshakeDataReceivedFromPeerFnScheduler(
485 SecurityHandshaker*
h =
static_cast<SecurityHandshaker*
>(
arg);
489 &SecurityHandshaker::OnHandshakeDataReceivedFromPeerFn,
490 h, grpc_schedule_on_exec_ctx),
494 void SecurityHandshaker::OnHandshakeDataReceivedFromPeerFn(
496 RefCountedPtr<SecurityHandshaker>
h(
static_cast<SecurityHandshaker*
>(
arg));
500 "Handshake read failed", &
error, 1));
504 size_t bytes_received_size =
h->MoveReadBufferIntoHandshakeBuffer();
506 error =
h->DoHandshakerNextLocked(
h->handshake_buffer_, bytes_received_size);
508 h->HandshakeFailedLocked(
error);
516 void SecurityHandshaker::OnHandshakeDataSentToPeerFnScheduler(
518 SecurityHandshaker*
h =
static_cast<SecurityHandshaker*
>(
arg);
522 &SecurityHandshaker::OnHandshakeDataSentToPeerFn, h,
523 grpc_schedule_on_exec_ctx),
527 void SecurityHandshaker::OnHandshakeDataSentToPeerFn(
void*
arg,
529 RefCountedPtr<SecurityHandshaker>
h(
static_cast<SecurityHandshaker*
>(
arg));
533 "Handshake write failed", &
error, 1));
537 if (
h->handshaker_result_ ==
nullptr) {
539 h->args_->endpoint,
h->args_->read_buffer,
541 &
h->on_handshake_data_received_from_peer_,
542 &SecurityHandshaker::OnHandshakeDataReceivedFromPeerFnScheduler,
543 h.get(), grpc_schedule_on_exec_ctx),
546 error =
h->CheckPeerLocked();
548 h->HandshakeFailedLocked(
error);
566 CleanupArgsForFailureLocked();
573 HandshakerArgs*
args) {
578 size_t bytes_received_size = MoveReadBufferIntoHandshakeBuffer();
582 HandshakeFailedLocked(
error);
592 class FailHandshaker :
public Handshaker {
594 const char*
name()
const override {
return "security_fail"; }
598 HandshakerArgs*
args)
override {
600 "Failed to create security handshaker");
603 args->endpoint =
nullptr;
605 args->args =
nullptr;
608 args->read_buffer =
nullptr;
613 ~FailHandshaker()
override =
default;
620 class ClientSecurityHandshakerFactory :
public HandshakerFactory {
624 HandshakeManager* handshake_mgr)
override {
625 auto* security_connector =
628 if (security_connector) {
633 ~ClientSecurityHandshakerFactory()
override =
default;
636 class ServerSecurityHandshakerFactory :
public HandshakerFactory {
640 HandshakeManager* handshake_mgr)
override {
641 auto* security_connector =
644 if (security_connector) {
649 ~ServerSecurityHandshakerFactory()
override =
default;
663 if (handshaker ==
nullptr) {
664 return MakeRefCounted<FailHandshaker>();
666 return MakeRefCounted<SecurityHandshaker>(handshaker, connector,
args);
671 builder->handshaker_registry()->RegisterHandshakerFactory(
673 absl::make_unique<ClientSecurityHandshakerFactory>());
674 builder->handshaker_registry()->RegisterHandshakerFactory(
676 absl::make_unique<ServerSecurityHandshakerFactory>());