diff options
author | Brian Sipos <brian.sipos@gmail.com> | 2021-11-30 23:03:00 -0500 |
---|---|---|
committer | Wireshark GitLab Utility <gerald+gitlab-utility@wireshark.org> | 2021-12-06 06:22:49 +0000 |
commit | 95cfdcbf3bed520ad3aee48cc018a93ff0d77959 (patch) | |
tree | 1b2b7fb8c512d7a7e010ad4e0c48a6b11e02098f /epan/dissectors/packet-cose.c | |
parent | be38ad12ab5e43c86ee815e5c6f503a0246c5da4 (diff) |
COSE: Add parameter names to labels
Dissector names allow integer labels to be given standard text names.
Diffstat (limited to 'epan/dissectors/packet-cose.c')
-rw-r--r-- | epan/dissectors/packet-cose.c | 84 |
1 files changed, 53 insertions, 31 deletions
diff --git a/epan/dissectors/packet-cose.c b/epan/dissectors/packet-cose.c index a8152ccae8..5bfb651192 100644 --- a/epan/dissectors/packet-cose.c +++ b/epan/dissectors/packet-cose.c @@ -36,6 +36,7 @@ static const char *const proto_name_cose = "COSE"; /// Protocol handles static int proto_cose = -1; +static int proto_cose_params = -1; /// Dissect opaque CBOR data static dissector_handle_t handle_cbor = NULL; @@ -356,6 +357,7 @@ static void dissect_header_pair(dissector_table_t dis_table, cose_header_context cose_param_key_t key = { 0 }; + const char *label_str = NULL; switch (chunk_label->type_major) { case CBOR_TYPE_UINT: case CBOR_TYPE_NEGINT: { @@ -364,6 +366,7 @@ static void dissect_header_pair(dissector_table_t dis_table, cose_header_context if (label) { key.label = ctx->label = g_variant_new_int64(*label); + label_str = wmem_strdup_printf(wmem_packet_scope(), "%" G_GINT64_FORMAT, *label); } break; } @@ -373,6 +376,7 @@ static void dissect_header_pair(dissector_table_t dis_table, cose_header_context if (label) { key.label = ctx->label = g_variant_new_string(label); + label_str = label; } break; } @@ -387,6 +391,11 @@ static void dissect_header_pair(dissector_table_t dis_table, cose_header_context key.principal = NULL; dissector = dissector_get_custom_table_handle(dis_table, &key); } + const char *dis_name = dissector_handle_get_dissector_name(dissector); + if (dis_name) { + proto_item_set_text(item_label, "Label: %s (%s)", dis_name, label_str); + } + tree_label = proto_item_add_subtree(item_label, ett_hdr_label); // Peek into the value as tvb @@ -1142,9 +1151,12 @@ static void register_msg_dissector(dissector_handle_t dis_h, guint64 tag_int, co } /** Register a header dissector. + * @param dissector The dissector function. + * @param label The associated map label. + * @param name The header name. */ -static void register_header_dissector(dissector_t dissector, GVariant *label) { - dissector_handle_t dis_h = create_dissector_handle(dissector, proto_cose); +static void register_header_dissector(dissector_t dissector, GVariant *label, const char *name) { + dissector_handle_t dis_h = create_dissector_handle_with_name(dissector, proto_cose_params, name); cose_param_key_t *key = g_new0(cose_param_key_t, 1); key->label = label; @@ -1155,9 +1167,11 @@ static void register_header_dissector(dissector_t dissector, GVariant *label) { /** Register a key parameter dissector. * @param dissector The dissector function. * @param kty The associated key type "kty" or NULL. + * @param label The associated map label. + * @param name The header name. */ -static void register_keyparam_dissector(dissector_t dissector, GVariant *kty, GVariant *label) { - dissector_handle_t dis_h = create_dissector_handle(dissector, proto_cose); +static void register_keyparam_dissector(dissector_t dissector, GVariant *kty, GVariant *label, const char *name) { + dissector_handle_t dis_h = create_dissector_handle_with_name(dissector, proto_cose_params, name); cose_param_key_t *key = g_new0(cose_param_key_t, 1); if (kty) { @@ -1191,6 +1205,14 @@ void proto_register_cose(void) { register_init_routine(&cose_init); register_cleanup_routine(&cose_cleanup); + proto_cose_params = proto_register_protocol_in_name_only( + "COSE Parameter Subdissectors", + "COSE Parameter Subdissectors", + "cose_params", + proto_cose, + FT_PROTOCOL + ); + proto_register_field_array(proto_cose, fields, array_length(fields)); proto_register_subtree_array(ett, array_length(ett)); expert_module_t *expert = expert_register_protocol(proto_cose); @@ -1199,7 +1221,7 @@ void proto_register_cose(void) { handle_cose_msg_hdr = register_dissector("cose.msg.headers", dissect_cose_msg_header_map, proto_cose); table_cose_msg_tag = register_custom_dissector_table("cose.msgtag", "COSE Message Tag", proto_cose, g_int64_hash, g_int64_equal); - handle_cose_msg_tagged = register_dissector("cose", dissect_cose_msg_tagged, proto_cose); + handle_cose_msg_tagged = register_dissector("cose", dissect_cose_msg_tagged, proto_cose_params); handle_cose_sign = register_dissector("cose_sign", dissect_cose_sign, proto_cose); handle_cose_sign1 = register_dissector("cose_sign1", dissect_cose_sign1, proto_cose); handle_cose_encrypt = register_dissector("cose_encrypt", dissect_cose_encrypt, proto_cose); @@ -1232,46 +1254,46 @@ void proto_reg_handoff_cose(void) { register_msg_dissector(handle_cose_mac0, 17, "application/cose; cose-type=\"cose-mac0\""); // RFC 8152 header labels - register_header_dissector(dissect_header_salt, g_variant_new_int64(-20)); - register_header_dissector(dissect_header_static_key, g_variant_new_int64(-2)); - register_header_dissector(dissect_header_ephem_key, g_variant_new_int64(-1)); - register_header_dissector(dissect_header_alg, g_variant_new_int64(1)); - register_header_dissector(dissect_header_crit, g_variant_new_int64(2)); - register_header_dissector(dissect_header_ctype, g_variant_new_int64(3)); - register_header_dissector(dissect_header_kid, g_variant_new_int64(4)); - register_header_dissector(dissect_header_iv, g_variant_new_int64(5)); - register_header_dissector(dissect_header_piv, g_variant_new_int64(6)); + register_header_dissector(dissect_header_salt, g_variant_new_int64(-20), "salt"); + register_header_dissector(dissect_header_static_key, g_variant_new_int64(-2), "static key"); + register_header_dissector(dissect_header_ephem_key, g_variant_new_int64(-1), "ephemeral key"); + register_header_dissector(dissect_header_alg, g_variant_new_int64(1), "alg"); + register_header_dissector(dissect_header_crit, g_variant_new_int64(2), "crit"); + register_header_dissector(dissect_header_ctype, g_variant_new_int64(3), "content type"); + register_header_dissector(dissect_header_kid, g_variant_new_int64(4), "kid"); + register_header_dissector(dissect_header_iv, g_variant_new_int64(5), "IV"); + register_header_dissector(dissect_header_piv, g_variant_new_int64(6), "Partial IV"); // draft-ietf-cose-x509 header labels - register_header_dissector(dissect_header_x5bag, g_variant_new_int64(32)); - register_header_dissector(dissect_header_x5chain, g_variant_new_int64(33)); - register_header_dissector(dissect_header_x5t, g_variant_new_int64(34)); - register_header_dissector(dissect_header_x5u, g_variant_new_int64(35)); + register_header_dissector(dissect_header_x5bag, g_variant_new_int64(32), "x5bag"); + register_header_dissector(dissect_header_x5chain, g_variant_new_int64(33), "x5chain"); + register_header_dissector(dissect_header_x5t, g_variant_new_int64(34), "x5t"); + register_header_dissector(dissect_header_x5u, g_variant_new_int64(35), "x5u"); dissector_add_string("media_type", "application/cose-key", handle_cose_key); dissector_add_string("media_type", "application/cose-key-set", handle_cose_key_set); // RFC 8152 key parameter labels - register_keyparam_dissector(dissect_keyparam_kty, NULL, g_variant_new_int64(1)); - register_keyparam_dissector(dissect_header_kid, NULL, g_variant_new_int64(2)); - register_keyparam_dissector(dissect_header_alg, NULL, g_variant_new_int64(3)); - register_keyparam_dissector(dissect_keyparam_keyops, NULL, g_variant_new_int64(4)); - register_keyparam_dissector(dissect_keyparam_baseiv, NULL, g_variant_new_int64(5)); + register_keyparam_dissector(dissect_keyparam_kty, NULL, g_variant_new_int64(1), "kty"); + register_keyparam_dissector(dissect_header_kid, NULL, g_variant_new_int64(2), "kid"); + register_keyparam_dissector(dissect_header_alg, NULL, g_variant_new_int64(3), "alg"); + register_keyparam_dissector(dissect_keyparam_keyops, NULL, g_variant_new_int64(4), "key_ops"); + register_keyparam_dissector(dissect_keyparam_baseiv, NULL, g_variant_new_int64(5), "Base IV"); // kty-specific parameters { GVariant *kty = g_variant_new_int64(1); - register_keyparam_dissector(dissect_keyparam_crv, kty, g_variant_new_int64(-1)); - register_keyparam_dissector(dissect_keyparam_xcoord, kty, g_variant_new_int64(-2)); - register_keyparam_dissector(dissect_keyparam_dcoord, kty, g_variant_new_int64(-3)); + register_keyparam_dissector(dissect_keyparam_crv, kty, g_variant_new_int64(-1), "crv"); + register_keyparam_dissector(dissect_keyparam_xcoord, kty, g_variant_new_int64(-2), "x"); + register_keyparam_dissector(dissect_keyparam_dcoord, kty, g_variant_new_int64(-3), "d"); } { GVariant *kty = g_variant_new_int64(2); - register_keyparam_dissector(dissect_keyparam_crv, kty, g_variant_new_int64(-1)); - register_keyparam_dissector(dissect_keyparam_xcoord, kty, g_variant_new_int64(-2)); - register_keyparam_dissector(dissect_keyparam_ycoord, kty, g_variant_new_int64(-3)); - register_keyparam_dissector(dissect_keyparam_dcoord, kty, g_variant_new_int64(-4)); + register_keyparam_dissector(dissect_keyparam_crv, kty, g_variant_new_int64(-1), "crv"); + register_keyparam_dissector(dissect_keyparam_xcoord, kty, g_variant_new_int64(-2), "x"); + register_keyparam_dissector(dissect_keyparam_ycoord, kty, g_variant_new_int64(-3), "y"); + register_keyparam_dissector(dissect_keyparam_dcoord, kty, g_variant_new_int64(-4), "d"); } { GVariant *kty = g_variant_new_int64(4); - register_keyparam_dissector(dissect_keyparam_k, kty, g_variant_new_int64(-1)); + register_keyparam_dissector(dissect_keyparam_k, kty, g_variant_new_int64(-1), "k"); } cose_reinit(); |