This is an automated email from the ASF dual-hosted git repository.
masaori pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/trafficserver.git
The following commit(s) were added to refs/heads/master by this push:
new 9355249b91 Add metrics for negotiated group with client (#11844)
9355249b91 is described below
commit 9355249b918fd27e7236dd4fd8a042c604788fd5
Author: Masaori Koshiba <[email protected]>
AuthorDate: Thu Dec 12 13:11:22 2024 +0900
Add metrics for negotiated group with client (#11844)
---
src/iocore/net/SSLStats.cc | 79 ++++++++++++++++++++++++++++++++++++++++++++++
src/iocore/net/SSLStats.h | 9 ++++++
src/iocore/net/SSLUtils.cc | 22 +++++++++++++
3 files changed, 110 insertions(+)
diff --git a/src/iocore/net/SSLStats.cc b/src/iocore/net/SSLStats.cc
index 5dd1d6a3b2..4caa5c4cad 100644
--- a/src/iocore/net/SSLStats.cc
+++ b/src/iocore/net/SSLStats.cc
@@ -35,6 +35,12 @@
SSLStatsBlock ssl_rsb;
std::unordered_map<std::string, Metrics::Counter::AtomicType *> cipher_map;
+#ifdef OPENSSL_IS_BORINGSSL
+std::unordered_map<std::string, Metrics::Counter::AtomicType *> tls_group_map;
+#elif defined(SSL_get_negotiated_group)
+std::unordered_map<int, Metrics::Counter::AtomicType *> tls_group_map;
+#endif
+
namespace
{
DbgCtl dbg_ctl_ssl{"ssl"};
@@ -43,6 +49,64 @@ DbgCtl dbg_ctl_ssl{"ssl"};
constexpr std::string_view UNKNOWN_CIPHER{"(NONE)"};
#endif
+#if defined(OPENSSL_IS_BORINGSSL) || defined(SSL_get_negotiated_group)
+
+template <typename T>
+void
+add_group_stat(T key, const std::string &name)
+{
+ // If not already registered ...
+ if (tls_group_map.find(key) == tls_group_map.end()) {
+ Metrics::Counter::AtomicType *metric =
Metrics::Counter::createPtr("proxy.process.ssl.group.user_agent." + name);
+
+ tls_group_map.emplace(key, metric);
+ Dbg(dbg_ctl_ssl, "registering SSL group metric '%s'", name.c_str());
+ }
+}
+#endif // OPENSSL_IS_BORINGSSL or SSL_get_negotiated_group
+
+#if not defined(OPENSSL_IS_BORINGSSL) and defined(SSL_get_negotiated_group) //
OPENSSL 3.x
+
+struct TLSGroup {
+ int nid;
+ std::string name;
+};
+
+// NID and Group table. Some groups are not defined by some library.
+const TLSGroup TLS_GROUPS[] = {
+ {SSL_GROUP_STAT_OTHER_KEY, "OTHER" },
+ {NID_X9_62_prime256v1, "P-256" },
+ {NID_secp384r1, "P-384" },
+ {NID_secp521r1, "P-521" },
+ {NID_X25519, "X25519" },
+#ifdef NID_secp224r1
+ {NID_secp224r1, "P-224" },
+#endif
+#ifdef NID_X448
+ {NID_X448, "X448" },
+#endif
+#ifdef NID_ffdhe2048
+ {NID_ffdhe2048, "ffdhe2048" },
+#endif
+#ifdef NID_ffdhe3072
+ {NID_ffdhe3072, "ffdhe3072" },
+#endif
+#ifdef NID_ffdhe4096
+ {NID_ffdhe4096, "ffdhe4096" },
+#endif
+#ifdef NID_ffdhe6144
+ {NID_ffdhe6144, "ffdhe6144" },
+#endif
+#ifdef NID_ffdhe8192
+ {NID_ffdhe8192, "ffdhe8192" },
+#endif
+#ifdef NID_X25519MLKEM768
+ {NID_X25519MLKEM768, "X25519MLKEM768"},
+#endif
+};
+
+#endif // OPENSSL 3.x
+
} // end anonymous namespace
// ToDo: This gets called once per global sync, for now at least.
@@ -194,4 +258,19 @@ SSLInitializeStatistics()
// Add "OTHER" for ciphers not on the map
add_cipher_stat(SSL_CIPHER_STAT_OTHER.c_str(),
"proxy.process.ssl.cipher.user_agent." + SSL_CIPHER_STAT_OTHER);
+
+ // TLS Group
+#if defined(OPENSSL_IS_BORINGSSL)
+ size_t list_size = SSL_get_all_group_names(nullptr, 0);
+ std::vector<const char *> group_list(list_size);
+ SSL_get_all_group_names(group_list.data(), group_list.size());
+
+ for (const char *name : group_list) {
+ add_group_stat<std::string>(name, name);
+ }
+#elif defined(SSL_get_negotiated_group)
+ for (auto group : TLS_GROUPS) {
+ add_group_stat<int>(group.nid, group.name);
+ }
+#endif // OPENSSL_IS_BORINGSSL or SSL_get_negotiated_group
}
diff --git a/src/iocore/net/SSLStats.h b/src/iocore/net/SSLStats.h
index 6dbf070e42..1630036a30 100644
--- a/src/iocore/net/SSLStats.h
+++ b/src/iocore/net/SSLStats.h
@@ -30,6 +30,8 @@
#include "tsutil/Metrics.h"
+#include <openssl/ssl.h>
+
using ts::Metrics;
// For some odd reason, these have to be initialized with nullptr, because the
order
@@ -100,6 +102,13 @@ struct SSLStatsBlock {
extern SSLStatsBlock ssl_rsb;
extern std::unordered_map<std::string, Metrics::Counter::AtomicType *>
cipher_map;
+#if defined(OPENSSL_IS_BORINGSSL)
+extern std::unordered_map<std::string, Metrics::Counter::AtomicType *>
tls_group_map;
+#elif defined(SSL_get_negotiated_group)
+extern std::unordered_map<int, Metrics::Counter::AtomicType *> tls_group_map;
+constexpr int
SSL_GROUP_STAT_OTHER_KEY = 0;
+#endif
+
// Initialize SSL statistics.
void SSLInitializeStatistics();
diff --git a/src/iocore/net/SSLUtils.cc b/src/iocore/net/SSLUtils.cc
index 7c469b2ff6..8aaec276d3 100644
--- a/src/iocore/net/SSLUtils.cc
+++ b/src/iocore/net/SSLUtils.cc
@@ -1086,6 +1086,28 @@ ssl_callback_info(const SSL *ssl, int where, int ret)
}
Metrics::Counter::increment(it->second);
}
+
+#if defined(OPENSSL_IS_BORINGSSL)
+ uint16_t group_id = SSL_get_group_id(ssl);
+ if (group_id != 0) {
+ const char *group_name = SSL_get_group_name(group_id);
+ if (auto it = tls_group_map.find(group_name); it != tls_group_map.end())
{
+ Metrics::Counter::increment(it->second);
+ } else {
+ Warning("Unknown TLS Group");
+ }
+ }
+#elif defined(SSL_get_negotiated_group)
+ int nid = SSL_get_negotiated_group(const_cast<SSL *>(ssl));
+ if (nid != NID_undef) {
+ if (auto it = tls_group_map.find(nid); it != tls_group_map.end()) {
+ Metrics::Counter::increment(it->second);
+ } else {
+ auto other = tls_group_map.find(SSL_GROUP_STAT_OTHER_KEY);
+ Metrics::Counter::increment(other->second);
+ }
+ }
+#endif // OPENSSL_IS_BORINGSSL or SSL_get_negotiated_group
}
}