3434SSLStatsBlock ssl_rsb;
3535std::unordered_map<std::string, Metrics::Counter::AtomicType *> cipher_map;
3636
37- #ifdef OPENSSL_IS_BORINGSSL
37+ #if defined( OPENSSL_IS_BORINGSSL) || HAVE_SSL_CTX_GET0_IMPLEMENTED_GROUPS
3838std::unordered_map<std::string, Metrics::Counter::AtomicType *> tls_group_map;
3939std::unordered_map<std::string, Metrics::Counter::AtomicType *> tls_group_handshake_time_map;
40- #elif defined(SSL_get_negotiated_group)
40+ #elif HAVE_SSL_GET_NEGOTIATED_GROUP
4141std::unordered_map<int , Metrics::Counter::AtomicType *> tls_group_map;
4242std::unordered_map<int , Metrics::Counter::AtomicType *> tls_group_handshake_time_map;
4343#endif
@@ -50,7 +50,7 @@ DbgCtl dbg_ctl_ssl{"ssl"};
5050constexpr std::string_view UNKNOWN_CIPHER{" (NONE)" };
5151#endif
5252
53- #if defined(OPENSSL_IS_BORINGSSL) || defined(SSL_get_negotiated_group)
53+ #if defined(OPENSSL_IS_BORINGSSL) || HAVE_SSL_CTX_GET0_IMPLEMENTED_GROUPS || HAVE_SSL_GET_NEGOTIATED_GROUP
5454
5555template <typename T>
5656void
@@ -73,9 +73,10 @@ add_group_stat(T key, const std::string &name)
7373 Dbg (dbg_ctl_ssl, " registering SSL group handshake time metric '%s.handshake_time'" , name.c_str ());
7474 }
7575}
76- #endif // OPENSSL_IS_BORINGSSL or SSL_get_negotiated_group
76+ #endif // OPENSSL_IS_BORINGSSL or HAVE_SSL_CTX_GET0_IMPLEMENTED_GROUPS or HAVE_SSL_GET_NEGOTIATED_GROUP
7777
78- #if not defined(OPENSSL_IS_BORINGSSL) and defined(SSL_get_negotiated_group) // OPENSSL 3.x
78+ #if not defined(OPENSSL_IS_BORINGSSL) and not HAVE_SSL_CTX_GET0_IMPLEMENTED_GROUPS and \
79+ HAVE_SSL_GET_NEGOTIATED_GROUP // OPENSSL 3.x without SSL_CTX_get0_implemented_groups
7980
8081struct TLSGroup {
8182 int nid;
@@ -115,7 +116,7 @@ const TLSGroup TLS_GROUPS[] = {
115116#endif
116117};
117118
118- #endif // OPENSSL 3.x
119+ #endif // OPENSSL 3.x without SSL_CTX_get0_implemented_groups
119120
120121} // end anonymous namespace
121122
@@ -312,14 +313,47 @@ SSLInitializeStatistics()
312313 add_cipher_stat (cipherName, statName);
313314 }
314315
316+ // TLS Group
317+ #if HAVE_SSL_CTX_GET0_IMPLEMENTED_GROUPS
318+ // Use SSL_CTX_get0_implemented_groups to discover all supported groups.
319+ // This handles KEMs which don't have standard NIDs defined.
320+ {
321+ // Get the list of implemented groups as string names (all=1 for all implemented groups)
322+ STACK_OF (OPENSSL_CSTRING) *group_names = nullptr ;
323+ constexpr int ALL_GROUPS = 1 ;
324+ DbgPrint (dbg_ctl_ssl, " About to call SSL_CTX_get0_implemented_groups" );
325+ if (SSL_CTX_get0_implemented_groups (ctx, ALL_GROUPS, &group_names) != 1 ) {
326+ Error (" Failed to get implemented groups via SSL_CTX_get0_implemented_groups" );
327+ }
328+ int const num_groups = sk_OPENSSL_CSTRING_num (group_names);
329+ DbgPrint (dbg_ctl_ssl, " SSL_CTX_get0_implemented_groups returned %d groups" , num_groups);
330+
331+ for (int index = 0 ; index < num_groups; index++) {
332+ const char *name = sk_OPENSSL_CSTRING_value (group_names, index);
333+ if (name == nullptr ) {
334+ Error (" NULL group name returned for index %d in SSL_CTX_get0_implemented_groups" , index);
335+ continue ;
336+ }
337+ add_group_stat<std::string>(name, name);
338+ }
339+
340+ // Add "OTHER" for groups not discovered
341+ add_group_stat<std::string>(" OTHER" , " OTHER" );
342+ }
343+ #elif HAVE_SSL_GET_NEGOTIATED_GROUP
344+ // Use static NID table for group registration
345+ for (auto group : TLS_GROUPS) {
346+ add_group_stat<int >(group.nid , group.name );
347+ }
348+ #endif // HAVE_SSL_CTX_GET0_IMPLEMENTED_GROUPS or HAVE_SSL_GET_NEGOTIATED_GROUP
349+
315350 SSL_free (ssl);
316351 SSLReleaseContext (ctx);
317352#endif
318353
319354 // Add "OTHER" for ciphers not on the map
320355 add_cipher_stat (SSL_CIPHER_STAT_OTHER.c_str (), " proxy.process.ssl.cipher.user_agent." + SSL_CIPHER_STAT_OTHER);
321356
322- // TLS Group
323357#if defined(OPENSSL_IS_BORINGSSL)
324358 size_t list_size = SSL_get_all_group_names (nullptr , 0 );
325359 std::vector<const char *> group_list (list_size);
@@ -328,9 +362,5 @@ SSLInitializeStatistics()
328362 for (const char *name : group_list) {
329363 add_group_stat<std::string>(name, name);
330364 }
331- #elif defined(SSL_get_negotiated_group)
332- for (auto group : TLS_GROUPS) {
333- add_group_stat<int >(group.nid , group.name );
334- }
335- #endif // OPENSSL_IS_BORINGSSL or SSL_get_negotiated_group
365+ #endif // OPENSSL_IS_BORINGSSL
336366}
0 commit comments