Skip to content

Commit b9392aa

Browse files
committed
Fix comments and add client timeout test
1 parent 3dd70c0 commit b9392aa

File tree

5 files changed

+85
-37
lines changed

5 files changed

+85
-37
lines changed

src/core/tsi/ssl_transport_security.cc

Lines changed: 16 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -189,7 +189,8 @@ struct tsi_ssl_handshaker : public tsi_handshaker,
189189
// Will be set if there is a pending call to tsi_handshaker_next(),
190190
// or nullopt if not.
191191
std::optional<HandshakerNextArgs> handshaker_next_args ABSL_GUARDED_BY(mu);
192-
void MaybeSetError(std::string error) ABSL_EXCLUSIVE_LOCKS_REQUIRED(mu) {
192+
const void MaybeSetError(std::string error)
193+
ABSL_EXCLUSIVE_LOCKS_REQUIRED(mu) {
193194
if (!handshaker_next_args.has_value()) return;
194195
if (handshaker_next_args->error_ptr == nullptr) return;
195196
*handshaker_next_args->error_ptr = std::move(error);
@@ -455,11 +456,6 @@ enum ssl_private_key_result_t TlsPrivateKeySignWrapper(
455456
[&](absl::StatusOr<std::string>* status_or_string)
456457
ABSL_NO_THREAD_SAFETY_ANALYSIS {
457458
if (status_or_string->ok()) {
458-
if ((*status_or_string)->size() > max_out) {
459-
handshaker->MaybeSetError(
460-
"Private Key Signature exceeds maximum allowed size.");
461-
return ssl_private_key_failure;
462-
}
463459
handshaker->signed_bytes = std::move(*status_or_string);
464460
return TlsPrivateKeyOffloadComplete(ssl, out, out_len, max_out);
465461
} else {
@@ -2233,7 +2229,6 @@ static tsi_result ssl_handshaker_write_output_buffer(tsi_handshaker* self,
22332229

22342230
static tsi_result ssl_handshaker_next_impl(tsi_ssl_handshaker* self)
22352231
ABSL_EXCLUSIVE_LOCKS_REQUIRED(&self->mu) {
2236-
std::string* error = self->handshaker_next_args->error_ptr;
22372232
// If there are received bytes, process them first.
22382233
tsi_result status = TSI_OK;
22392234
size_t bytes_written = 0;
@@ -2254,17 +2249,18 @@ static tsi_result ssl_handshaker_next_impl(tsi_ssl_handshaker* self)
22542249
remaining_bytes_to_write_to_openssl_size;
22552250
status = ssl_handshaker_process_bytes_from_peer(
22562251
self, remaining_bytes_to_write_to_openssl, &bytes_written_to_openssl,
2257-
error);
2252+
self->handshaker_next_args->error_ptr);
22582253
// As long as the BIO is full, drive the SSL handshake to consume bytes
22592254
// from the BIO. If the SSL handshake returns any bytes, write them to
22602255
// the peer.
22612256
while (status == TSI_DRAIN_BUFFER) {
2262-
status =
2263-
ssl_handshaker_write_output_buffer(self, &bytes_written, error);
2257+
status = ssl_handshaker_write_output_buffer(
2258+
self, &bytes_written, self->handshaker_next_args->error_ptr);
22642259
if (status != TSI_OK) {
22652260
return status;
22662261
}
2267-
status = ssl_handshaker_do_handshake(self, error);
2262+
status = ssl_handshaker_do_handshake(
2263+
self, self->handshaker_next_args->error_ptr);
22682264
}
22692265
// Move the pointer to the first byte not yet successfully written to
22702266
// the BIO.
@@ -2287,16 +2283,17 @@ static tsi_result ssl_handshaker_next_impl(tsi_ssl_handshaker* self)
22872283
// During the PrivateKeyOffload signature, an empty call to
22882284
// ssl_handshaker_do_handshake needs to be forced after the async offload
22892285
// has completed.
2290-
status = ssl_handshaker_do_handshake(self, error);
2291-
self->signed_bytes = "";
2286+
status = ssl_handshaker_do_handshake(self,
2287+
self->handshaker_next_args->error_ptr);
22922288
#endif
22932289
}
22942290

22952291
if (status != TSI_OK) {
22962292
return status;
22972293
}
22982294
// Get bytes to send to the peer, if available.
2299-
status = ssl_handshaker_write_output_buffer(self, &bytes_written, error);
2295+
status = ssl_handshaker_write_output_buffer(
2296+
self, &bytes_written, self->handshaker_next_args->error_ptr);
23002297
if (status != TSI_OK) {
23012298
return status;
23022299
}
@@ -2312,21 +2309,22 @@ static tsi_result ssl_handshaker_next_impl(tsi_ssl_handshaker* self)
23122309
// bytes from the peer that must be processed.
23132310
unsigned char* unused_bytes = nullptr;
23142311
size_t unused_bytes_size = 0;
2315-
status =
2316-
ssl_bytes_remaining(self, &unused_bytes, &unused_bytes_size, error);
2312+
status = ssl_bytes_remaining(self, &unused_bytes, &unused_bytes_size,
2313+
self->handshaker_next_args->error_ptr);
23172314
if (status != TSI_OK) {
23182315
return status;
23192316
}
23202317
if (unused_bytes_size >
23212318
self->handshaker_next_args->original_received_bytes_size) {
23222319
LOG(ERROR) << "More unused bytes than received bytes.";
23232320
gpr_free(unused_bytes);
2324-
if (error != nullptr) *error = "More unused bytes than received bytes.";
2321+
self->MaybeSetError("More unused bytes than received bytes.");
23252322
return TSI_INTERNAL_ERROR;
23262323
}
23272324
status = ssl_handshaker_result_create(
23282325
self, unused_bytes, unused_bytes_size,
2329-
&self->handshaker_next_args->handshaker_result, error);
2326+
&self->handshaker_next_args->handshaker_result,
2327+
self->handshaker_next_args->error_ptr);
23302328
if (status == TSI_OK) {
23312329
// Indicates that the handshake has completed and that a
23322330
// handshaker_result has been created.

src/cpp/common/tls_certificate_provider.cc

Lines changed: 6 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@
2525
#include "src/core/credentials/transport/tls/grpc_tls_certificate_provider.h"
2626
#include "src/core/util/grpc_check.h"
2727
#include "src/core/util/match.h"
28+
#include "absl/status/statusor.h"
2829

2930
namespace grpc {
3031
namespace experimental {
@@ -41,7 +42,7 @@ grpc_tls_identity_pairs* CreatePairsCore(
4142
return pairs_core;
4243
}
4344

44-
grpc_tls_identity_pairs* CreatePairsCore(
45+
absl::StatusOr<grpc_tls_identity_pairs*> CreatePairsCore(
4546
std::vector<IdentityKeyOrSignerCertPair>
4647
identity_key_or_signer_cert_pairs) {
4748
grpc_tls_identity_pairs* pairs_core = grpc_tls_identity_pairs_create();
@@ -60,7 +61,7 @@ grpc_tls_identity_pairs* CreatePairsCore(
6061
});
6162
if (!status.ok()) {
6263
grpc_tls_identity_pairs_destroy(pairs_core);
63-
return nullptr;
64+
return status;
6465
}
6566
}
6667
return pairs_core;
@@ -147,13 +148,11 @@ absl::Status InMemoryCertificateProvider::UpdateIdentityKeyCertPair(
147148
std::vector<IdentityKeyOrSignerCertPair>
148149
identity_key_or_signer_cert_pairs) {
149150
GRPC_CHECK(!identity_key_or_signer_cert_pairs.empty());
150-
auto* pairs_core =
151+
auto pairs_core_or =
151152
CreatePairsCore(std::move(identity_key_or_signer_cert_pairs));
152-
if (pairs_core == nullptr) {
153-
return absl::InternalError("Unable to update identity certificate");
154-
}
153+
if (!pairs_core_or.ok()) return pairs_core_or.status();
155154
return grpc_tls_certificate_provider_in_memory_set_identity_certificate(
156-
c_provider_, pairs_core)
155+
c_provider_, *pairs_core_or)
157156
? absl::OkStatus()
158157
: absl::InternalError("Unable to update identity certificate");
159158
}

test/core/test_util/tls_utils.cc

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -73,7 +73,8 @@ PemKeyCertPairList MakeCertKeyPairs(absl::string_view private_key,
7373
if (private_key.empty() && certs.empty()) {
7474
return {};
7575
}
76-
return PemKeyCertPairList{PemKeyCertPair(private_key.data(), certs)};
76+
return PemKeyCertPairList{PemKeyCertPair(
77+
std::string(private_key.data(), private_key.length()), certs)};
7778
}
7879

7980
std::string GetFileContents(const std::string& path) {

test/core/tsi/private_key_offload_test.cc

Lines changed: 1 addition & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -183,12 +183,7 @@ class AsyncTestPrivateKeySigner final
183183
return std::make_shared<AsyncSigningHandle>();
184184
}
185185

186-
void Cancel(std::shared_ptr<AsyncSigningHandle> /*handle*/) override {
187-
LOG(ERROR) << "Here";
188-
if (!was_cancelled_.exchange(true)) {
189-
notification_.Notify();
190-
}
191-
}
186+
void Cancel(std::shared_ptr<AsyncSigningHandle> /*handle*/) override {}
192187

193188
bool WasCancelled() { return was_cancelled_.load(); }
194189

@@ -197,7 +192,6 @@ class AsyncTestPrivateKeySigner final
197192
event_engine_;
198193
bssl::UniquePtr<EVP_PKEY> pkey_;
199194
Mode mode_;
200-
absl::Notification notification_;
201195
std::atomic<bool> was_cancelled_{false};
202196
};
203197

@@ -361,7 +355,6 @@ class SslOffloadTsiTestFixture {
361355
tsi_tls_version tls_version_;
362356
bool expect_success_ = false;
363357
bool expect_success_on_client_ = false;
364-
Mutex mu_;
365358
};
366359

367360
struct tsi_test_fixture_vtable SslOffloadTsiTestFixture::kVtable = {
@@ -389,7 +382,6 @@ class PrivateKeyOffloadTest : public ::testing::TestWithParam<tsi_tls_version> {
389382
event_engine_->UnsetGlobalHooks();
390383
WaitForSingleOwner(std::move(event_engine_));
391384
grpc_shutdown_blocking();
392-
event_engine_.reset();
393385
}
394386

395387
std::shared_ptr<grpc_event_engine::experimental::FuzzingEventEngine>

test/cpp/end2end/tls_private_key_signer_end2end_test.cc

Lines changed: 60 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -203,8 +203,8 @@ void DoRpcAndExpectFailure(
203203
const std::string& server_addr,
204204
const experimental::TlsChannelCredentialsOptions& tls_options,
205205
const std::function<void(ClientContext*)>& on_rpc_stalled = nullptr,
206-
absl::string_view expected_error_message = "") {
207-
ChannelArguments channel_args;
206+
absl::string_view expected_error_message = "",
207+
ChannelArguments channel_args = ChannelArguments()) {
208208
channel_args.SetSslTargetNameOverride("foo.test.google.fr");
209209
std::shared_ptr<Channel> channel = grpc::CreateCustomChannel(
210210
server_addr, grpc::experimental::TlsCredentials(tls_options),
@@ -882,6 +882,64 @@ TEST_F(TlsPrivateKeyOffloadTest, OffloadWithCustomKeySignerHandshakeTimeout) {
882882
DoRpcAndExpectFailure(server_addr_, options, nullptr, "Socket closed");
883883
}
884884

885+
// Verifies that the client correctly times out the handshake if the custom
886+
// signer takes too long.
887+
TEST_F(TlsPrivateKeyOffloadTest,
888+
OffloadWithCustomKeySignerClientHandshakeTimeout) {
889+
server_addr_ = absl::StrCat("localhost:", grpc_pick_unused_port_or_die());
890+
std::string server_key =
891+
grpc_core::testing::GetFileContents(std::string(kServerKeyPath));
892+
std::string server_cert =
893+
grpc_core::testing::GetFileContents(std::string(kServerCertPath));
894+
std::string ca_cert =
895+
grpc_core::testing::GetFileContents(std::string(kCaPemPath));
896+
897+
auto server_certificate_provider =
898+
std::make_shared<experimental::InMemoryCertificateProvider>();
899+
std::vector<experimental::IdentityKeyCertPair> server_identity_key_cert_pairs;
900+
server_identity_key_cert_pairs.emplace_back(
901+
experimental::IdentityKeyCertPair{server_key, server_cert});
902+
ASSERT_TRUE(server_certificate_provider
903+
->UpdateIdentityKeyCertPair(server_identity_key_cert_pairs)
904+
.ok());
905+
ASSERT_TRUE(server_certificate_provider->UpdateRoot(ca_cert).ok());
906+
907+
StartServer(server_certificate_provider);
908+
909+
std::string client_key =
910+
grpc_core::testing::GetFileContents(std::string(kClientKeyPath));
911+
std::string client_cert =
912+
grpc_core::testing::GetFileContents(std::string(kClientCertPath));
913+
auto client_certificate_provider =
914+
std::make_shared<experimental::InMemoryCertificateProvider>();
915+
916+
// Signer with a long delay.
917+
auto signer = std::make_shared<AsyncTestPrivateKeySigner>(
918+
client_key, AsyncTestPrivateKeySigner::Mode::kDelayed, absl::Seconds(10));
919+
std::vector<grpc::experimental::IdentityKeyOrSignerCertPair> identity_pairs;
920+
identity_pairs.emplace_back(
921+
grpc::experimental::IdentityKeyOrSignerCertPair{signer, client_cert});
922+
ASSERT_TRUE(
923+
client_certificate_provider->UpdateIdentityKeyCertPair(identity_pairs)
924+
.ok());
925+
ASSERT_TRUE(client_certificate_provider->UpdateRoot(ca_cert).ok());
926+
927+
grpc::experimental::TlsChannelCredentialsOptions options;
928+
options.set_certificate_provider(client_certificate_provider);
929+
options.watch_root_certs();
930+
options.set_root_cert_name("root");
931+
options.watch_identity_key_cert_pairs();
932+
options.set_identity_cert_name("identity");
933+
options.set_check_call_host(false);
934+
935+
// Set a short handshake timeout on the client.
936+
ChannelArguments channel_args;
937+
channel_args.SetInt("grpc.testing.fixed_reconnect_backoff_ms", 500);
938+
939+
DoRpcAndExpectFailure(server_addr_, options, nullptr, "Handshaker shutdown",
940+
channel_args);
941+
}
942+
885943
} // namespace
886944
} // namespace testing
887945
} // namespace grpc

0 commit comments

Comments
 (0)