diff options
author | Martin Kaiser <wireshark@kaiser.cx> | 2016-07-03 16:39:20 +0200 |
---|---|---|
committer | Martin Kaiser <wireshark@kaiser.cx> | 2016-07-03 14:42:34 +0000 |
commit | ce52309e8bd7f651606f25fe0aa926fddf4dce0e (patch) | |
tree | 759346a514f3e80b73a6b01f63714f8f3b7cb83d | |
parent | 2da35bce9a3e4a18a9fa251eadb76a3a3695e726 (diff) |
iso14443: expert info if the crc is wrong
Change-Id: I1b59a7d7bf0f9f304f816558f38ce5d52deb504e
Reviewed-on: https://code.wireshark.org/review/16263
Reviewed-by: Martin Kaiser <wireshark@kaiser.cx>
-rw-r--r-- | epan/dissectors/packet-iso14443.c | 30 |
1 files changed, 18 insertions, 12 deletions
diff --git a/epan/dissectors/packet-iso14443.c b/epan/dissectors/packet-iso14443.c index a09ed50b01..4be4af380a 100644 --- a/epan/dissectors/packet-iso14443.c +++ b/epan/dissectors/packet-iso14443.c @@ -263,6 +263,7 @@ static int hf_iso14443_inf = -1; static int hf_iso14443_crc = -1; static expert_field ei_iso14443_unknown_cmd = EI_INIT; +static expert_field ei_iso14443_wrong_crc = EI_INIT; /* dissect and verify the CRC @@ -270,7 +271,7 @@ static expert_field ei_iso14443_unknown_cmd = EI_INIT; bytes 0 to crc_offset-1 contain the message, the CRC starts at crc_offset and is CRC_LEN bytes long */ static int dissect_iso14443_crc(tvbuff_t *tvb, gint crc_offset, - proto_tree *tree, iso14443_type_t type) + packet_info *pinfo, proto_tree *tree, iso14443_type_t type) { proto_item *crc_pi; guint16 crc_recv, crc_calc; @@ -285,9 +286,11 @@ static int dissect_iso14443_crc(tvbuff_t *tvb, gint crc_offset, crc_pi = proto_tree_add_item(tree, hf_iso14443_crc, tvb, crc_offset, CRC_LEN, ENC_LITTLE_ENDIAN); - /* XXX - expert info if the CRC is wrong */ proto_item_append_text(crc_pi, crc_recv==crc_calc ? " (correct)" : " (wrong)"); + /* add an expert info to allow filtering on packets with wrong crc */ + if (crc_recv != crc_calc) + expert_add_info(pinfo, crc_pi,&ei_iso14443_wrong_crc); return CRC_LEN; } @@ -455,7 +458,7 @@ static int dissect_iso14443_atqb(tvbuff_t *tvb, gint offset, offset++; if (!crc_dropped) - offset += dissect_iso14443_crc(tvb, offset, tree, ISO14443_B); + offset += dissect_iso14443_crc(tvb, offset, pinfo, tree, ISO14443_B); return offset; } @@ -494,7 +497,7 @@ dissect_iso14443_cmd_type_wupb(tvbuff_t *tvb, packet_info *pinfo, offset++; if (!crc_dropped) - offset += dissect_iso14443_crc(tvb, offset, tree, ISO14443_B); + offset += dissect_iso14443_crc(tvb, offset, pinfo, tree, ISO14443_B); } else if (pinfo->p2p_dir == P2P_DIR_RECV) { offset = dissect_iso14443_atqb(tvb, offset, pinfo, tree, crc_dropped); @@ -519,7 +522,7 @@ dissect_iso14443_cmd_type_hlta(tvbuff_t *tvb, packet_info *pinfo, offset += 2; if (!crc_dropped) - offset += dissect_iso14443_crc(tvb, offset, tree, ISO14443_A); + offset += dissect_iso14443_crc(tvb, offset, pinfo, tree, ISO14443_A); return offset; } @@ -570,7 +573,7 @@ dissect_iso14443_cmd_type_uid(tvbuff_t *tvb, packet_info *pinfo, proto_item_append_text(ti, ": Select"); offset = dissect_iso14443_uid_part(tvb, offset, pinfo, tree); if (!crc_dropped) - offset += dissect_iso14443_crc(tvb, offset, tree, ISO14443_A); + offset += dissect_iso14443_crc(tvb, offset, pinfo, tree, ISO14443_A); } } else if (pinfo->p2p_dir == P2P_DIR_RECV) { @@ -583,7 +586,7 @@ dissect_iso14443_cmd_type_uid(tvbuff_t *tvb, packet_info *pinfo, tvb, offset, 1, ENC_BIG_ENDIAN); offset++; if (!crc_dropped) - offset += dissect_iso14443_crc(tvb, offset, tree, ISO14443_A); + offset += dissect_iso14443_crc(tvb, offset, pinfo, tree, ISO14443_A); } else if (tvb_reported_length_remaining(tvb, offset) == 5) { col_set_str(pinfo->cinfo, COL_INFO, "UID"); @@ -683,7 +686,7 @@ static int dissect_iso14443_ats(tvbuff_t *tvb, gint offset, offset += hist_len; } if (!crc_dropped) - offset += dissect_iso14443_crc(tvb, offset, tree, ISO14443_A); + offset += dissect_iso14443_crc(tvb, offset, pinfo, tree, ISO14443_A); return offset; } @@ -719,7 +722,7 @@ dissect_iso14443_cmd_type_ats(tvbuff_t *tvb, packet_info *pinfo, tvb, offset*8+4, 4, cid, "%d", cid); offset++; if (!crc_dropped) - offset += dissect_iso14443_crc(tvb, offset, tree, ISO14443_A); + offset += dissect_iso14443_crc(tvb, offset, pinfo, tree, ISO14443_A); } else if (pinfo->p2p_dir == P2P_DIR_RECV) { offset = dissect_iso14443_ats(tvb, offset, pinfo, tree, crc_dropped); @@ -795,7 +798,7 @@ static int dissect_iso14443_attrib(tvbuff_t *tvb, gint offset, offset += hl_inf_len; } if (!crc_dropped) - offset += dissect_iso14443_crc(tvb, offset, tree, ISO14443_B); + offset += dissect_iso14443_crc(tvb, offset, pinfo, tree, ISO14443_B); return offset; } @@ -840,7 +843,7 @@ dissect_iso14443_cmd_type_attrib(tvbuff_t *tvb, packet_info *pinfo, } if (!crc_dropped) - offset += dissect_iso14443_crc(tvb, offset, tree, ISO14443_B); + offset += dissect_iso14443_crc(tvb, offset, pinfo, tree, ISO14443_B); } return offset; @@ -975,7 +978,7 @@ dissect_iso14443_cmd_type_block(tvbuff_t *tvb, packet_info *pinfo, if (circuit) { t = (iso14443_type_t)GPOINTER_TO_UINT( (gpointer)circuit_get_proto_data(circuit, proto_iso14443)); - offset += dissect_iso14443_crc(tvb, offset, tree, t); + offset += dissect_iso14443_crc(tvb, offset, pinfo, tree, t); } } @@ -1586,6 +1589,9 @@ proto_register_iso14443(void) { &ei_iso14443_unknown_cmd, { "iso14443.cmd.unknown", PI_PROTOCOL, PI_WARN, "Unknown ISO1443 command", EXPFILL } + }, + { &ei_iso14443_wrong_crc, + { "iso14443.crc.wrong", PI_PROTOCOL, PI_WARN, "Wrong CRC", EXPFILL } } }; |