COSE: Add parameter names to labels

Dissector names allow integer labels to be given standard text names.
This commit is contained in:
Brian Sipos 2021-11-30 23:03:00 -05:00 committed by Wireshark GitLab Utility
parent be38ad12ab
commit 95cfdcbf3b
1 changed files with 53 additions and 31 deletions

View File

@ -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();