aboutsummaryrefslogtreecommitdiffstats
path: root/epan/dissectors/packet-cose.c
diff options
context:
space:
mode:
authorBrian Sipos <brian.sipos@gmail.com>2021-11-30 23:03:00 -0500
committerWireshark GitLab Utility <gerald+gitlab-utility@wireshark.org>2021-12-06 06:22:49 +0000
commit95cfdcbf3bed520ad3aee48cc018a93ff0d77959 (patch)
tree1b2b7fb8c512d7a7e010ad4e0c48a6b11e02098f /epan/dissectors/packet-cose.c
parentbe38ad12ab5e43c86ee815e5c6f503a0246c5da4 (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.c84
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();