ssl_key_logging.cc
Go to the documentation of this file.
1 // Copyright 2021 gRPC authors.
2 //
3 // Licensed under the Apache License, Version 2.0 (the "License");
4 // you may not use this file except in compliance with the License.
5 // You may obtain a copy of the License at
6 //
7 // http://www.apache.org/licenses/LICENSE-2.0
8 //
9 // Unless required by applicable law or agreed to in writing, software
10 // distributed under the License is distributed on an "AS IS" BASIS,
11 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 // See the License for the specific language governing permissions and
13 // limitations under the License.
14 
16 
18 
19 #include <map>
20 
21 #include <grpc/support/log.h>
22 
26 
28 
29 namespace tsi {
30 
31 namespace {
32 
33 gpr_once g_cache_mutex_init = GPR_ONCE_INIT;
34 grpc_core::Mutex* g_tls_session_key_log_cache_mu = nullptr;
35 // A pointer to a global singleton instance.
36 TlsSessionKeyLoggerCache* g_cache_instance
37  ABSL_GUARDED_BY(g_tls_session_key_log_cache_mu) = nullptr;
38 
39 void do_cache_mutex_init(void) {
40  g_tls_session_key_log_cache_mu = new grpc_core::Mutex();
41 }
42 
43 } // namespace
44 
46  std::string tls_session_key_log_file_path,
48  : tls_session_key_log_file_path_(std::move(tls_session_key_log_file_path)),
49  cache_(std::move(cache)) {
51  GPR_ASSERT(cache_ != nullptr);
52  fd_ = fopen(tls_session_key_log_file_path_.c_str(), "w+");
53  if (fd_ == nullptr) {
54  grpc_error_handle error = GRPC_OS_ERROR(errno, "fopen");
56  "Ignoring TLS Key logging. ERROR Opening TLS Keylog "
57  "file: %s",
59  }
60  cache_->tls_session_key_logger_map_.emplace(tls_session_key_log_file_path_,
61  this);
62 };
63 
65  {
66  grpc_core::MutexLock lock(&lock_);
67  if (fd_ != nullptr) fclose(fd_);
68  }
69  {
70  grpc_core::MutexLock lock(g_tls_session_key_log_cache_mu);
71  auto it = cache_->tls_session_key_logger_map_.find(
72  tls_session_key_log_file_path_);
73  if (it != cache_->tls_session_key_logger_map_.end() && it->second == this) {
74  cache_->tls_session_key_logger_map_.erase(it);
75  }
76  }
77 }
78 
80  SSL_CTX* /* ssl_context */, const std::string& session_keys_info) {
81  grpc_core::MutexLock lock(&lock_);
82  if (fd_ == nullptr || session_keys_info.empty()) return;
83  // Append to key log file under lock
84  bool err =
85  fwrite((session_keys_info + "\r\n").c_str(), sizeof(char),
86  session_keys_info.length() + 1, fd_) < session_keys_info.length();
87 
88  if (err) {
89  grpc_error_handle error = GRPC_OS_ERROR(errno, "fwrite");
90  gpr_log(GPR_ERROR, "Error Appending to TLS session key log file: %s",
92  fclose(fd_);
93  fd_ = nullptr; // disable future attempts to write to this file
94  } else {
95  fflush(fd_);
96  }
97 }
98 
100  ABSL_EXCLUSIVE_LOCKS_REQUIRED(g_tls_session_key_log_cache_mu) {
101  g_cache_instance = this;
102 }
103 
105  grpc_core::MutexLock lock(g_tls_session_key_log_cache_mu);
106  g_cache_instance = nullptr;
107 }
108 
110  std::string tls_session_key_log_file_path) {
111  gpr_once_init(&g_cache_mutex_init, do_cache_mutex_init);
112  GPR_DEBUG_ASSERT(g_tls_session_key_log_cache_mu != nullptr);
113  if (tls_session_key_log_file_path.empty()) {
114  return nullptr;
115  }
116  {
117  grpc_core::MutexLock lock(g_tls_session_key_log_cache_mu);
119  if (g_cache_instance == nullptr) {
120  // This will automatically set g_cache_instance.
121  cache = grpc_core::MakeRefCounted<TlsSessionKeyLoggerCache>();
122  } else {
123  cache = g_cache_instance->Ref();
124  }
125  // Check cache for entry.
126  auto it =
127  cache->tls_session_key_logger_map_.find(tls_session_key_log_file_path);
128  if (it != cache->tls_session_key_logger_map_.end()) {
129  // Avoid a race condition if the destructor of the tls key logger
130  // of interest is currently executing.
131  auto key_logger = it->second->RefIfNonZero();
132  if (key_logger != nullptr) return key_logger;
133  }
134  // Not found in cache, so create new entry.
135  // This will automatically add itself to tls_session_key_logger_map_.
136  return grpc_core::MakeRefCounted<TlsSessionKeyLogger>(
137  std::move(tls_session_key_log_file_path), std::move(cache));
138  }
139 }
140 
141 }; // namespace tsi
regen-readme.it
it
Definition: regen-readme.py:15
log.h
GPR_DEBUG_ASSERT
#define GPR_DEBUG_ASSERT(x)
Definition: include/grpc/impl/codegen/log.h:103
gpr_once
pthread_once_t gpr_once
Definition: impl/codegen/sync_posix.h:50
tsi::TlsSessionKeyLoggerCache
Definition: ssl_key_logging.h:37
tsi::TlsSessionKeyLoggerCache::~TlsSessionKeyLoggerCache
~TlsSessionKeyLoggerCache() override
Definition: ssl_key_logging.cc:104
grpc_core::MutexLock
Definition: src/core/lib/gprpp/sync.h:88
testing::internal::string
::std::string string
Definition: bloaty/third_party/protobuf/third_party/googletest/googletest/include/gtest/internal/gtest-port.h:881
error
grpc_error_handle error
Definition: retry_filter.cc:499
error_ref_leak.err
err
Definition: error_ref_leak.py:35
ABSL_GUARDED_BY
#define ABSL_GUARDED_BY(x)
Definition: abseil-cpp/absl/base/thread_annotations.h:62
GPR_ONCE_INIT
#define GPR_ONCE_INIT
Definition: impl/codegen/sync_posix.h:52
ssl_ctx_st
Definition: third_party/boringssl-with-bazel/src/ssl/internal.h:3404
tsi::TlsSessionKeyLoggerCache::TlsSessionKeyLogger::cache_
grpc_core::RefCountedPtr< TlsSessionKeyLoggerCache > cache_
Definition: ssl_key_logging.h:69
gpr_once_init
GPRAPI void gpr_once_init(gpr_once *once, void(*init_function)(void))
ssl_key_logging.h
GRPC_OS_ERROR
#define GRPC_OS_ERROR(err, call_name)
create an error associated with errno!=0 (an 'operating system' error)
Definition: error.h:352
grpc_core::RefCountedPtr
Definition: ref_counted_ptr.h:35
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
gen_stats_data.c_str
def c_str(s, encoding='ascii')
Definition: gen_stats_data.py:38
gpr_log
GPRAPI void gpr_log(const char *file, int line, gpr_log_severity severity, const char *format,...) GPR_PRINT_FORMAT_CHECK(4
ABSL_EXCLUSIVE_LOCKS_REQUIRED
#define ABSL_EXCLUSIVE_LOCKS_REQUIRED(...)
Definition: abseil-cpp/absl/base/thread_annotations.h:145
tsi::TlsSessionKeyLoggerCache::TlsSessionKeyLogger::TlsSessionKeyLogger
TlsSessionKeyLogger(std::string tls_session_key_log_file_path, grpc_core::RefCountedPtr< TlsSessionKeyLoggerCache > cache)
Definition: ssl_key_logging.cc:45
error.h
slice_internal.h
GPR_ERROR
#define GPR_ERROR
Definition: include/grpc/impl/codegen/log.h:57
TlsSessionKeyLogger
tsi::TlsSessionKeyLoggerCache::TlsSessionKeyLogger TlsSessionKeyLogger
Definition: ssl_key_logging.cc:27
tsi::TlsSessionKeyLoggerCache::Get
static grpc_core::RefCountedPtr< TlsSessionKeyLogger > Get(std::string tls_session_key_log_file_path)
Definition: ssl_key_logging.cc:109
tsi::TlsSessionKeyLoggerCache::TlsSessionKeyLogger::tls_session_key_log_file_path_
std::string tls_session_key_log_file_path_
Definition: ssl_key_logging.h:68
tsi::TlsSessionKeyLoggerCache::TlsSessionKeyLogger::LogSessionKeys
void LogSessionKeys(SSL_CTX *ssl_context, const std::string &session_keys_info)
Definition: ssl_key_logging.cc:79
tsi::TlsSessionKeyLoggerCache::TlsSessionKeyLogger::~TlsSessionKeyLogger
~TlsSessionKeyLogger() override
Definition: ssl_key_logging.cc:64
grpc_core::Mutex
Definition: src/core/lib/gprpp/sync.h:61
tsi
Definition: ssl_key_logging.cc:29
grpc_error_std_string
std::string grpc_error_std_string(grpc_error_handle error)
Definition: error.cc:944
grpc::fclose
fclose(creds_file)
google::protobuf.internal::Mutex
WrappedMutex Mutex
Definition: bloaty/third_party/protobuf/src/google/protobuf/stubs/mutex.h:113
std
Definition: grpcpp/impl/codegen/async_unary_call.h:407
tsi::TlsSessionKeyLoggerCache::TlsSessionKeyLogger
Definition: ssl_key_logging.h:46
tsi::TlsSessionKeyLoggerCache::TlsSessionKeyLoggerCache
TlsSessionKeyLoggerCache()
Definition: ssl_key_logging.cc:99
grpc_error
Definition: error_internal.h:42
sync.h
port_platform.h


grpc
Author(s):
autogenerated on Thu Mar 13 2025 03:01:20