20 #include "absl/strings/str_cat.h"
21 #include "absl/strings/string_view.h"
22 #include "gmock/gmock.h"
23 #include "gtest/gtest.h"
34 #include "src/proto/grpc/testing/echo.grpc.pb.h"
42 #if OPENSSL_VERSION_NUMBER >= 0x10101000 && !defined(LIBRESSL_VERSION_NUMBER)
43 #define TLS_KEY_LOGGING_AVAILABLE
46 #define CA_CERT_PATH "src/core/tsi/test_creds/ca.pem"
47 #define SERVER_KEY_PATH "src/core/tsi/test_creds/server0.key"
48 #define SERVER_CERT_PATH "src/core/tsi/test_creds/server0.pem"
49 #define CLIENT_KEY_PATH "src/core/tsi/test_creds/client.key"
50 #define CLIENT_CERT_PATH "src/core/tsi/test_creds/client.pem"
52 #define NUM_REQUESTS_PER_CHANNEL 5
54 using ::grpc::experimental::FileWatcherCertificateProvider;
55 using ::grpc::experimental::TlsChannelCredentialsOptions;
56 using ::grpc::experimental::TlsServerCredentialsOptions;
62 class EchoServer final :
public EchoTestService::Service {
66 if (
request->param().expected_error().code() == 0) {
71 request->param().expected_error().code()),
79 TestScenario(
int num_listening_ports,
bool share_tls_key_log_file,
80 bool enable_tls_key_logging)
85 return absl::StrCat(
"TestScenario__num_listening_ports_",
88 "__enable_tls_key_logging_",
105 const ::testing::TestParamInfo<TestScenario>& info) {
106 return info.param.AsString();
109 int CountOccurrencesInFileContents(
std::string file_contents,
112 std::string::size_type
pos = 0;
113 while ((
pos = file_contents.find(search_string,
pos)) != std::string::npos) {
115 pos += search_string.length();
123 char*
name =
nullptr;
130 return name_to_return;
133 void SetUp()
override {
136 args.SetSslTargetNameOverride(
"foo.test.google.com.au");
138 if (GetParam().num_listening_ports() > 0) {
139 ports_.resize(GetParam().num_listening_ports(), 0);
145 if (GetParam().share_tls_key_log_file()) {
146 shared_key_log_file_server = CreateTmpFile();
147 shared_key_log_file_channel = CreateTmpFile();
150 auto server_certificate_provider =
151 std::make_shared<FileWatcherCertificateProvider>(
154 auto channel_certificate_provider =
155 std::make_shared<FileWatcherCertificateProvider>(
158 for (
int i = 0;
i < GetParam().num_listening_ports();
i++) {
160 TlsServerCredentialsOptions server_creds_options(
161 server_certificate_provider);
162 server_creds_options.set_cert_request_type(
164 server_creds_options.watch_identity_key_cert_pairs();
165 server_creds_options.watch_root_certs();
168 if (GetParam().share_tls_key_log_file()) {
170 shared_key_log_file_server);
175 if (GetParam().enable_tls_key_logging()) {
176 server_creds_options.set_tls_session_key_log_file_path(
190 std::thread(&TlsKeyLoggingEnd2EndTest::RunServerLoop,
this);
192 for (
int i = 0;
i < GetParam().num_listening_ports();
i++) {
198 TlsChannelCredentialsOptions channel_creds_options;
199 channel_creds_options.set_certificate_provider(
200 channel_certificate_provider);
201 channel_creds_options.watch_identity_key_cert_pairs();
202 channel_creds_options.watch_root_certs();
205 if (GetParam().share_tls_key_log_file()) {
211 if (GetParam().enable_tls_key_logging()) {
212 channel_creds_options.set_tls_session_key_log_file_path(
222 void TearDown()
override {
227 for (
int i = 0;
i < GetParam().num_listening_ports();
i++) {
230 if (GetParam().share_tls_key_log_file()) {
236 void RunServerLoop() {
server_->Wait(); }
245 std::vector<std::unique_ptr<EchoTestService::Stub>>
stubs_;
251 TEST_P(TlsKeyLoggingEnd2EndTest, KeyLogging) {
254 for (
int j = 0;
j < GetParam().num_listening_ports(); ++
j) {
257 request.mutable_param()->mutable_expected_error()->set_code(0);
265 for (
int i = 0;
i < GetParam().num_listening_ports();
i++) {
271 if (!GetParam().enable_tls_key_logging()) {
276 #ifdef TLS_KEY_LOGGING_AVAILABLE
279 if (GetParam().share_tls_key_log_file() &&
280 GetParam().enable_tls_key_logging()) {
281 EXPECT_EQ(CountOccurrencesInFileContents(
282 server_key_log,
"CLIENT_HANDSHAKE_TRAFFIC_SECRET"),
283 GetParam().num_listening_ports());
284 EXPECT_EQ(CountOccurrencesInFileContents(
285 server_key_log,
"SERVER_HANDSHAKE_TRAFFIC_SECRET"),
286 GetParam().num_listening_ports());
287 EXPECT_EQ(CountOccurrencesInFileContents(server_key_log,
288 "CLIENT_TRAFFIC_SECRET_0"),
289 GetParam().num_listening_ports());
290 EXPECT_EQ(CountOccurrencesInFileContents(server_key_log,
291 "SERVER_TRAFFIC_SECRET_0"),
292 GetParam().num_listening_ports());
294 CountOccurrencesInFileContents(server_key_log,
"EXPORTER_SECRET"),
295 GetParam().num_listening_ports());
296 }
else if (GetParam().enable_tls_key_logging()) {
297 EXPECT_EQ(CountOccurrencesInFileContents(
298 server_key_log,
"CLIENT_HANDSHAKE_TRAFFIC_SECRET"),
300 EXPECT_EQ(CountOccurrencesInFileContents(
301 server_key_log,
"SERVER_HANDSHAKE_TRAFFIC_SECRET"),
303 EXPECT_EQ(CountOccurrencesInFileContents(server_key_log,
304 "CLIENT_TRAFFIC_SECRET_0"),
306 EXPECT_EQ(CountOccurrencesInFileContents(server_key_log,
307 "SERVER_TRAFFIC_SECRET_0"),
310 CountOccurrencesInFileContents(server_key_log,
"EXPORTER_SECRET"), 1);
314 if (GetParam().enable_tls_key_logging()) {
320 if (GetParam().share_tls_key_log_file()) {
328 TestScenario(5,
true,
true),
329 TestScenario(5,
true,
false),
330 TestScenario(5,
false,
false)}),
337 int main(
int argc,
char** argv) {