QUIC QLOG: Record implementation version
authorHugo Landau <hlandau@openssl.org>
Mon, 29 Jan 2024 14:20:01 +0000 (14:20 +0000)
committerHugo Landau <hlandau@openssl.org>
Fri, 2 Feb 2024 11:50:30 +0000 (11:50 +0000)
Reviewed-by: Matt Caswell <matt@openssl.org>
Reviewed-by: Neil Horman <nhorman@openssl.org>
(Merged from https://github.com/openssl/openssl/pull/22037)

include/internal/qlog.h
ssl/quic/qlog.c
test/quic_qlog_test.c
test/recipes/70-test_quic_multistream_data/verify-qlog.py

index 80c806d2a468ebced83628d4bff0707ac6a643de..f6960ec1ccd203d7c76931c348a709499f7c31f8 100644 (file)
@@ -35,6 +35,7 @@ typedef struct qlog_trace_info_st {
     OSSL_TIME       (*now_cb)(void *arg);
     void            *now_cb_arg;
     uint64_t        override_process_id;
+    const char      *override_impl_name;
 } QLOG_TRACE_INFO;
 
 QLOG *ossl_qlog_new(const QLOG_TRACE_INFO *info);
index bad124b86d1eb6d99c4ff34f4522c5e6036b19f3..ef0946d90584ca6314cfd00cbee5a1a1557a5d1e 100644 (file)
@@ -67,15 +67,20 @@ QLOG *ossl_qlog_new(const QLOG_TRACE_INFO *info)
 
     if (info->title != NULL
         && (qlog->info.title = OPENSSL_strdup(info->title)) == NULL)
-            goto err;
+        goto err;
 
     if (info->description != NULL
         && (qlog->info.description = OPENSSL_strdup(info->description)) == NULL)
-            goto err;
+        goto err;
 
     if (info->group_id != NULL
         && (qlog->info.group_id = OPENSSL_strdup(info->group_id)) == NULL)
-            goto err;
+        goto err;
+
+    if (info->override_impl_name != NULL
+        && (qlog->info.override_impl_name
+                = OPENSSL_strdup(info->override_impl_name)) == NULL)
+        goto err;
 
     if (!ossl_json_init(&qlog->json, NULL,
                         OSSL_JSON_FLAG_IJSON | OSSL_JSON_FLAG_SEQ))
@@ -91,6 +96,7 @@ err:
         OPENSSL_free((char *)qlog->info.title);
         OPENSSL_free((char *)qlog->info.description);
         OPENSSL_free((char *)qlog->info.group_id);
+        OPENSSL_free((char *)qlog->info.override_impl_name);
         OPENSSL_free(qlog);
     }
     return NULL;
@@ -162,6 +168,7 @@ void ossl_qlog_free(QLOG *qlog)
     OPENSSL_free((char *)qlog->info.title);
     OPENSSL_free((char *)qlog->info.description);
     OPENSSL_free((char *)qlog->info.group_id);
+    OPENSSL_free((char *)qlog->info.override_impl_name);
     OPENSSL_free(qlog);
 }
 
@@ -323,9 +330,23 @@ static void qlog_event_seq_header(QLOG *qlog)
             ossl_json_key(&qlog->json, "vantage_point");
             ossl_json_object_begin(&qlog->json);
             {
+                char buf[128];
+                const char *p = buf;
+
+                if (qlog->info.override_impl_name != NULL) {
+                    p = qlog->info.override_impl_name;
+                } else {
+                    snprintf(buf, sizeof(buf), "OpenSSL/%s (%s)",
+                             OpenSSL_version(OPENSSL_FULL_VERSION_STRING),
+                             OpenSSL_version(OPENSSL_PLATFORM) + 10);
+                }
+
                 ossl_json_key(&qlog->json, "type");
                 ossl_json_str(&qlog->json, qlog->info.is_server
                                   ? "server" : "client");
+
+                ossl_json_key(&qlog->json, "name");
+                ossl_json_str(&qlog->json, p);
             } /* vantage_point */
             ossl_json_object_end(&qlog->json);
         } /* trace */
index bad9bbbc465ab99b3ce4183311c96c88c8e4dc07..fb945317339e04cf768cdfc0dbe468cd18665df6 100644 (file)
@@ -15,7 +15,8 @@ static const char expected[] =
     "\"test title\",\"description\":\"test description\",\"trace\":{"
     "\"common_fields\":{\"time_format\":\"delta\",\"protocol_type\":"
     "[\"QUIC\"],\"group_id\":\"test group ID\",\"system_info\":{"
-    "\"process_id\":123}},\"vantage_point\":{\"type\":\"client\"}}}\n"
+    "\"process_id\":123}},\"vantage_point\":{\"type\":\"client\","
+    "\"name\":\"OpenSSL/x.y.z\"}}}\n"
 
     "\x1e{\"name\":\"transport:packet_sent\",\"data\":{\"field1\":\"foo\","
     "\"field2\":\"bar\",\"field3\":42,\"field4\":\"1152921504606846976\","
@@ -59,6 +60,7 @@ static int test_qlog(void)
     qti.group_id            = "test group ID";
     qti.override_process_id = 123;
     qti.now_cb              = now;
+    qti.override_impl_name  = "OpenSSL/x.y.z";
 
     if (!TEST_ptr(qlog = ossl_qlog_new(&qti)))
         goto err;
index 08702410a3306850d083b99e401d9d9ed80034b2..b5e2519b43df28b7b839e7a12f3f00c109d56249 100755 (executable)
@@ -6,7 +6,9 @@
 # this file except in compliance with the License.  You can obtain a copy
 # in the file LICENSE in the source distribution or at
 # https://www.openssl.org/source/license.html
-import sys, os, os.path, glob, json
+import sys, os, os.path, glob, json, re
+
+re_version = re.compile(r'''^OpenSSL/[0-9]+\.[0-9]\.[0-9](-[^ ]+)? ([^)]+)''')
 
 class Unexpected(Exception):
     def __init__(self, filename, msg):
@@ -46,6 +48,13 @@ def check_header(filename, hdr):
     if hdr_trace["vantage_point"].get('type') not in ('client', 'server'):
         raise Unexpected(filename, "unexpected vantage_point")
 
+    vp_name = hdr_trace["vantage_point"].get('name')
+    if type(vp_name) != str:
+        raise Unexpected(filename, "expected vantage_point name")
+
+    if not re_version.match(vp_name):
+        raise Unexpected(filename, "expected correct vantage_point format")
+
     hdr_common_fields = hdr_trace["common_fields"]
     if hdr_common_fields.get("time_format") != "delta":
         raise Unexpected(filename, "must have expected time_format")