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) {