diff --git a/epan/crc32-tvb.c b/epan/crc32-tvb.c index 91cd7c13f2..7df0f38520 100644 --- a/epan/crc32-tvb.c +++ b/epan/crc32-tvb.c @@ -105,3 +105,33 @@ crc32_802_tvb(tvbuff_t *tvb, guint len) return ( c_crc ); } + +guint32 +crc32_mpeg2_tvb_offset_seed(tvbuff_t *tvb, guint offset, + guint len, guint32 seed) +{ + const guint8* buf; + + tvb_ensure_bytes_exist(tvb, offset, len); /* len == -1 not allowed */ + buf = tvb_get_ptr(tvb, offset, len); + + return ( crc32_mpeg2_seed(buf, len, seed) ); +} + +guint32 +crc32_mpeg2_tvb(tvbuff_t *tvb, guint len) +{ + return ( crc32_mpeg2_tvb_offset_seed(tvb, 0, len, CRC32_MPEG2_SEED) ); +} + +guint32 +crc32_mpeg2_tvb_offset(tvbuff_t *tvb, guint offset, guint len) +{ + return ( crc32_mpeg2_tvb_offset_seed(tvb, offset, len, CRC32_MPEG2_SEED) ); +} + +guint32 +crc32_mpeg2_tvb_seed(tvbuff_t *tvb, guint len, guint32 seed) +{ + return ( crc32_mpeg2_tvb_offset_seed(tvb, 0, len, seed) ); +} diff --git a/epan/crc32-tvb.h b/epan/crc32-tvb.h index 400920ee18..204beb16ac 100644 --- a/epan/crc32-tvb.h +++ b/epan/crc32-tvb.h @@ -68,6 +68,35 @@ extern guint32 crc32_ccitt_tvb_offset_seed(tvbuff_t *tvb, guint offset, @return The IEEE 802.x CRC32 checksum. */ extern guint32 crc32_802_tvb(tvbuff_t *tvb, guint len); + +/** Compute MPEG-2 CRC32 checksum of a tv buffer. + @param tvb The tv buffer containing the data. + @param len The number of bytes to include in the computation. + @return The MPEG-2 CRC32 checksum. */ +extern guint32 crc32_mpeg2_tvb(tvbuff_t *tvb, guint len); + +/** Compute MPEG-2 CRC32 checksum of a tv buffer. + @param tvb The tv buffer containing the data. + @param offset The offset into the tv buffer. + @param len The number of bytes to include in the computation. + @return The MPEG-2 CRC32 checksum. */ +extern guint32 crc32_mpeg2_tvb_offset(tvbuff_t *tvb, guint offset, guint len); + +/** Compute MPEG-2 CRC32 checksum of a buffer of data. + @param tvb The tv buffer containing the data. + @param len The number of bytes to include in the computation. + @param seed The seed to use. + @return The CRC32 MPEG-2 checksum (using the given seed). */ +extern guint32 crc32_mpeg2_tvb_seed(tvbuff_t *tvb, guint len, guint32 seed); + +/** Compute MPEG-2 CRC32 checksum of a buffer of data. + @param tvb The tv buffer containing the data. + @param offset The offset into the tv buffer. + @param len The number of bytes to include in the computation. + @param seed The seed to use. + @return The CRC32 MPEG-2 checksum (using the given seed). */ +extern guint32 crc32_mpeg2_tvb_offset_seed(tvbuff_t *tvb, guint offset, + guint len, guint32 seed); #ifdef __cplusplus } #endif /* __cplusplus */ diff --git a/epan/dissectors/Makefile.common b/epan/dissectors/Makefile.common index 4bfdd8af56..45c35593b6 100644 --- a/epan/dissectors/Makefile.common +++ b/epan/dissectors/Makefile.common @@ -1299,6 +1299,7 @@ DISSECTOR_INCLUDES = \ packet-mms.h \ packet-mount.h \ packet-mp4ves.h \ + packet-mpeg-sect.h \ packet-mpls.h \ packet-mq.h \ packet-mrdisc.h \ diff --git a/epan/dissectors/packet-dvb-data-mpe.c b/epan/dissectors/packet-dvb-data-mpe.c index 2910e6b264..e9b031df2e 100644 --- a/epan/dissectors/packet-dvb-data-mpe.c +++ b/epan/dissectors/packet-dvb-data-mpe.c @@ -30,6 +30,7 @@ #include #include +#include static int proto_dvb_data_mpe = -1; static int hf_dvb_data_mpe_reserved = -1; @@ -46,7 +47,7 @@ static gint ett_dvb_data_mpe = -1; static dissector_handle_t ip_handle; static dissector_handle_t llc_handle; -#define DVB_DATA_MPE_TID 0x3E +#define DVB_DATA_MPE_TID 0x3E #define DVB_DATA_MPE_RESERVED_MASK 0xC0 @@ -68,7 +69,7 @@ static void dissect_dvb_data_mpe(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree) { - guint offset = 0; + guint offset = 0, tot_len = 0; guint8 llc_snap_flag = 0; int i; @@ -89,6 +90,9 @@ dissect_dvb_data_mpe(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree) ti = proto_tree_add_item(tree, proto_dvb_data_mpe, tvb, offset, -1, ENC_NA); dvb_data_mpe_tree = proto_item_add_subtree(ti, ett_dvb_data_mpe); + offset += packet_mpeg_sect_header(tvb, offset, dvb_data_mpe_tree, &tot_len, NULL); + + /* Parse the DMC-CC private section header */ mac_bytes_tvb[5] = tvb_new_subset(tvb, offset, 1, 1); @@ -133,6 +137,7 @@ dissect_dvb_data_mpe(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree) call_dissector(ip_handle, data_tvb, pinfo, tree); } + packet_mpeg_sect_crc(tvb, pinfo, dvb_data_mpe_tree, 0, tot_len - 1); return; } diff --git a/epan/dissectors/packet-mpeg-pat.c b/epan/dissectors/packet-mpeg-pat.c index e6dd6daf05..8fd77a976e 100644 --- a/epan/dissectors/packet-mpeg-pat.c +++ b/epan/dissectors/packet-mpeg-pat.c @@ -31,6 +31,7 @@ #include #include +#include static int proto_mpeg_pat = -1; static int hf_mpeg_pat_transport_stream_id = -1; @@ -48,7 +49,7 @@ static int hf_mpeg_pat_program_map_pid = -1; static gint ett_mpeg_pat = -1; static gint ett_mpeg_pat_prog = -1; -#define MPEG_PAT_TID 0x00 +#define MPEG_PAT_TID 0x00 #define MPEG_PAT_RESERVED_MASK 0xC0 #define MPEG_PAT_VERSION_NUMBER_MASK 0x3E @@ -86,7 +87,8 @@ dissect_mpeg_pat(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree) if (!tree) return; - length = tvb_reported_length_remaining(tvb, offset); + offset += packet_mpeg_sect_header(tvb, offset, mpeg_pat_tree, &length, NULL); + length -= 4; proto_tree_add_item(mpeg_pat_tree, hf_mpeg_pat_transport_stream_id, tvb, offset, 2, ENC_BIG_ENDIAN); offset += 2; @@ -124,8 +126,7 @@ dissect_mpeg_pat(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree) } - return; - + packet_mpeg_sect_crc(tvb, pinfo, mpeg_pat_tree, 0, offset); } diff --git a/epan/dissectors/packet-mpeg-sect.c b/epan/dissectors/packet-mpeg-sect.c index 9341116ed9..fd8e7349f3 100644 --- a/epan/dissectors/packet-mpeg-sect.c +++ b/epan/dissectors/packet-mpeg-sect.c @@ -37,11 +37,12 @@ #include #include +#include +#include static int proto_mpeg_sect = -1; static int hf_mpeg_sect_table_id = -1; static int hf_mpeg_sect_syntax_indicator = -1; -static int hf_mpeg_sect_zero = -1; static int hf_mpeg_sect_reserved = -1; static int hf_mpeg_sect_length = -1; static int hf_mpeg_sect_crc = -1; @@ -50,11 +51,9 @@ static gint ett_mpeg_sect = -1; static dissector_table_t mpeg_sect_tid_dissector_table; -#define MPEG_SECT_TABLE_ID_MASK 0xFF0000 -#define MPEG_SECT_SYNTAX_INDICATOR_MASK 0x008000 -#define MPEG_SECT_ZERO_MASK 0x004000 -#define MPEG_SECT_RESERVED_MASK 0x003000 -#define MPEG_SECT_LENGTH_MASK 0x000FFF +#define MPEG_SECT_SYNTAX_INDICATOR_MASK 0x8000 +#define MPEG_SECT_RESERVED_MASK 0x7000 +#define MPEG_SECT_LENGTH_MASK 0x0FFF /* From ISO/IEC 13818-1 */ enum { @@ -135,115 +134,129 @@ static const value_string mpeg_sect_table_id_vals[] = { { 0, NULL } }; +guint +packet_mpeg_sect_header(tvbuff_t *tvb, guint offset, + proto_tree *tree, guint *sect_len, gboolean *ssi) +{ + guint tmp; + guint len = 0; + + if (tree) + proto_tree_add_item(tree, hf_mpeg_sect_table_id, tvb, offset + len, 1, ENC_BIG_ENDIAN); + + len++; + + if (tree) { + proto_tree_add_item(tree, hf_mpeg_sect_syntax_indicator, tvb, offset + len, 2, ENC_BIG_ENDIAN); + proto_tree_add_item(tree, hf_mpeg_sect_reserved, tvb, offset + len, 2, ENC_BIG_ENDIAN); + proto_tree_add_item(tree, hf_mpeg_sect_length, tvb, offset + len, 2, ENC_BIG_ENDIAN); + } + + tmp = tvb_get_ntohs(tvb, offset + len); + + if (sect_len) + *sect_len = MPEG_SECT_LENGTH_MASK & tmp; + + if (ssi) + *ssi = (MPEG_SECT_SYNTAX_INDICATOR_MASK & tmp); + + len += 2; + + return len; +} + + +void +packet_mpeg_sect_crc(tvbuff_t *tvb, packet_info *pinfo, + proto_tree *tree, guint start, guint end) +{ + guint32 crc, calculated_crc; + + crc = tvb_get_ntohl(tvb, end); + calculated_crc = crc32_mpeg2_tvb_offset(tvb, start, end); + + if (calculated_crc == crc) { + proto_tree_add_uint_format( tree, hf_mpeg_sect_crc, tvb, + end, 4, crc, "CRC: 0x%08x [Verified]", crc); + } else { + proto_item *msg_error = NULL; + + msg_error = proto_tree_add_uint_format( tree, hf_mpeg_sect_crc, tvb, + end, 4, crc, + "CRC: 0x%08x [Failed Verification (Calculated: 0x%08x)]", + crc, calculated_crc ); + PROTO_ITEM_SET_GENERATED(msg_error); + expert_add_info_format( pinfo, msg_error, PI_MALFORMED, + PI_ERROR, "Invalid CRC" ); + } +} + + void dissect_mpeg_sect(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree) { - gint offset = 0; - guint8 table_id = 0; - guint16 header = 0; - guint16 section_length = 0; - guint16 syntax_indicator = 0; + guint section_length = 0; + gboolean syntax_indicator; proto_item *ti = NULL; proto_tree *mpeg_sect_tree = NULL; - tvbuff_t *pload_tvb = NULL; - table_id = tvb_get_guint8(tvb, offset); - header = tvb_get_ntohs(tvb, offset + 1); - syntax_indicator = header & MPEG_SECT_SYNTAX_INDICATOR_MASK; - section_length = header & MPEG_SECT_LENGTH_MASK; - set_actual_length(tvb, section_length + 3); - - col_set_str(pinfo->cinfo, COL_PROTOCOL, "MPEG SECT"); - col_add_fstr(pinfo->cinfo, COL_INFO, "Table ID 0x%08x", table_id); - - ti = proto_tree_add_item(tree, proto_mpeg_sect, tvb, offset, -1, ENC_NA); - mpeg_sect_tree = proto_item_add_subtree(ti, ett_mpeg_sect); - - proto_item_append_text(ti, " Table_ID=0x%08x", table_id); - - if (syntax_indicator) { - /* Pass everything but the CRC */ - section_length -= sizeof(guint32); - } + /* Check if a dissector can parse the current table */ + if (dissector_try_uint(mpeg_sect_tid_dissector_table, table_id, tvb, pinfo, tree)) + return; + /* If no dissector is registered, use the common one */ if (tree) { - proto_tree_add_item(mpeg_sect_tree, hf_mpeg_sect_table_id, tvb, offset, 3, ENC_BIG_ENDIAN); - proto_tree_add_item(mpeg_sect_tree, hf_mpeg_sect_syntax_indicator, tvb, offset, 3, ENC_BIG_ENDIAN); - proto_tree_add_item(mpeg_sect_tree, hf_mpeg_sect_zero, tvb, offset, 3, ENC_BIG_ENDIAN); - proto_tree_add_item(mpeg_sect_tree, hf_mpeg_sect_reserved, tvb, offset, 3, ENC_BIG_ENDIAN); - proto_tree_add_item(mpeg_sect_tree, hf_mpeg_sect_length, tvb, offset, 3, ENC_BIG_ENDIAN); + col_set_str(pinfo->cinfo, COL_PROTOCOL, "MPEG SECT"); + col_add_fstr(pinfo->cinfo, COL_INFO, "Table ID 0x%02x", table_id); - offset += 3; + ti = proto_tree_add_item(tree, proto_mpeg_sect, tvb, offset, -1, ENC_NA); + mpeg_sect_tree = proto_item_add_subtree(ti, ett_mpeg_sect); - if (syntax_indicator) - proto_tree_add_item(mpeg_sect_tree, hf_mpeg_sect_crc, tvb, offset + section_length, 4, ENC_BIG_ENDIAN); + proto_item_append_text(ti, " Table_ID=0x%02x", table_id); + + offset += packet_mpeg_sect_header(tvb, offset, mpeg_sect_tree, + §ion_length, &syntax_indicator); + + if (syntax_indicator) + packet_mpeg_sect_crc(tvb, pinfo, mpeg_sect_tree, 0, (section_length-1)); } - - - pload_tvb = tvb_new_subset(tvb, 3, section_length, -1); - dissector_try_uint(mpeg_sect_tid_dissector_table, table_id, pload_tvb, pinfo, tree); - - return; - } -static gboolean -heur_dissect_mpeg_sect(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree) -{ - guint16 section_length = 0; - - section_length = (tvb_get_ntohs(tvb, 1) & MPEG_SECT_LENGTH_MASK) + 3; - if (tvb_length_remaining(tvb, 0) < section_length) - return FALSE; - - dissect_mpeg_sect(tvb, pinfo, tree); - return TRUE; -} - void proto_register_mpeg_sect(void) { - static hf_register_info hf[] = { - { &hf_mpeg_sect_table_id, { "Table ID", "mpeg_sect.tid", - FT_UINT24, BASE_HEX, VALS(mpeg_sect_table_id_vals), MPEG_SECT_TABLE_ID_MASK, NULL, HFILL + FT_UINT8, BASE_HEX, VALS(mpeg_sect_table_id_vals), 0, NULL, HFILL } }, { &hf_mpeg_sect_syntax_indicator, { "Syntax indicator", "mpeg_sect.syntax_indicator", - FT_UINT24, BASE_DEC, NULL, MPEG_SECT_SYNTAX_INDICATOR_MASK, NULL, HFILL - } }, - - { &hf_mpeg_sect_zero, { - "Zero or reserved", "mpeg_sect.zero", - FT_UINT24, BASE_DEC, NULL, MPEG_SECT_ZERO_MASK, NULL, HFILL + FT_UINT16, BASE_DEC, NULL, MPEG_SECT_SYNTAX_INDICATOR_MASK, NULL, HFILL } }, { &hf_mpeg_sect_reserved, { "Reserved", "mpeg_sect.reserved", - FT_UINT24, BASE_HEX, NULL, MPEG_SECT_RESERVED_MASK, NULL, HFILL + FT_UINT16, BASE_HEX, NULL, MPEG_SECT_RESERVED_MASK, NULL, HFILL } }, { &hf_mpeg_sect_length, { "Length", "mpeg_sect.len", - FT_UINT24, BASE_DEC, NULL, MPEG_SECT_LENGTH_MASK, NULL, HFILL + FT_UINT16, BASE_DEC, NULL, MPEG_SECT_LENGTH_MASK, NULL, HFILL } }, { &hf_mpeg_sect_crc, { "CRC 32", "mpeg_sect.crc", FT_UINT32, BASE_HEX, NULL, 0, NULL, HFILL - } }, - - + } } }; static gint *ett[] = { @@ -260,12 +273,3 @@ proto_register_mpeg_sect(void) mpeg_sect_tid_dissector_table = register_dissector_table("mpeg_sect.tid", "MPEG SECT Table ID", FT_UINT8, BASE_HEX); } - - -void -proto_reg_handoff_mpeg_sect(void) -{ - heur_dissector_add("mp2t.pid", heur_dissect_mpeg_sect, proto_mpeg_sect); -} - - diff --git a/epan/dissectors/packet-mpeg-sect.h b/epan/dissectors/packet-mpeg-sect.h new file mode 100644 index 0000000000..d94e56c632 --- /dev/null +++ b/epan/dissectors/packet-mpeg-sect.h @@ -0,0 +1,43 @@ +/* packet-mpeg-sect.h + * Declarations of exported routines from mpeg-sect dissector + * Copyright 2012, Weston Schmidt + * + * $Id$ + * + * Wireshark - Network traffic analyzer + * By Gerald Combs + * Copyright 1998 Gerald Combs + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + */ + +#ifndef __PACKET_MPEG_SECT_H_ +#define __PACKET_MPEG_SECT_H__ + +/* + * Used to process the 'standard' mpeg section header that is described below + * and populate the data into the tree + */ +extern guint +packet_mpeg_sect_header(tvbuff_t *tvb, guint offset, + proto_tree *tree, guint *sect_len, gboolean *ssi); + +/* + * Used to process the mpeg CRC information & report erorrs found with it. + */ +extern void +packet_mpeg_sect_crc(tvbuff_t *tvb, packet_info *pinfo, + proto_tree *tree, guint start, guint end); +#endif diff --git a/epan/libwireshark.def b/epan/libwireshark.def index eb220c24f6..54033b6461 100644 --- a/epan/libwireshark.def +++ b/epan/libwireshark.def @@ -122,6 +122,10 @@ crc32_ccitt_tvb crc32_ccitt_tvb_offset crc32_ccitt_tvb_seed crc32_ccitt_tvb_offset_seed +crc32_mpeg2_tvb +crc32_mpeg2_tvb_offset +crc32_mpeg2_tvb_seed +crc32_mpeg2_tvb_offset_seed create_dissector_handle create_persconffile_dir create_persconffile_profile diff --git a/wsutil/crc32.c b/wsutil/crc32.c index 5882ba9f5c..c7fc160e96 100644 --- a/wsutil/crc32.c +++ b/wsutil/crc32.c @@ -172,6 +172,60 @@ static const guint32 crc32_ccitt_table[256] = { 0x2d02ef8d }; +/* + * Table for the MPEG-2 CRC. + * + * Polynomial is + * + * x^32 + x^26 + x^23 + x^22 + x^16 + x^12 + x^11 + x^10 + x^8 + + * x^7 + x^5 + x^4 + x^2 + x + 1 + */ +static const guint32 crc32_mpeg2_table[256] = { + 0x00000000, 0x04c11db7, 0x09823b6e, 0x0d4326d9, 0x130476dc, 0x17c56b6b, + 0x1a864db2, 0x1e475005, 0x2608edb8, 0x22c9f00f, 0x2f8ad6d6, 0x2b4bcb61, + 0x350c9b64, 0x31cd86d3, 0x3c8ea00a, 0x384fbdbd, 0x4c11db70, 0x48d0c6c7, + 0x4593e01e, 0x4152fda9, 0x5f15adac, 0x5bd4b01b, 0x569796c2, 0x52568b75, + 0x6a1936c8, 0x6ed82b7f, 0x639b0da6, 0x675a1011, 0x791d4014, 0x7ddc5da3, + 0x709f7b7a, 0x745e66cd, 0x9823b6e0, 0x9ce2ab57, 0x91a18d8e, 0x95609039, + 0x8b27c03c, 0x8fe6dd8b, 0x82a5fb52, 0x8664e6e5, 0xbe2b5b58, 0xbaea46ef, + 0xb7a96036, 0xb3687d81, 0xad2f2d84, 0xa9ee3033, 0xa4ad16ea, 0xa06c0b5d, + 0xd4326d90, 0xd0f37027, 0xddb056fe, 0xd9714b49, 0xc7361b4c, 0xc3f706fb, + 0xceb42022, 0xca753d95, 0xf23a8028, 0xf6fb9d9f, 0xfbb8bb46, 0xff79a6f1, + 0xe13ef6f4, 0xe5ffeb43, 0xe8bccd9a, 0xec7dd02d, 0x34867077, 0x30476dc0, + 0x3d044b19, 0x39c556ae, 0x278206ab, 0x23431b1c, 0x2e003dc5, 0x2ac12072, + 0x128e9dcf, 0x164f8078, 0x1b0ca6a1, 0x1fcdbb16, 0x018aeb13, 0x054bf6a4, + 0x0808d07d, 0x0cc9cdca, 0x7897ab07, 0x7c56b6b0, 0x71159069, 0x75d48dde, + 0x6b93dddb, 0x6f52c06c, 0x6211e6b5, 0x66d0fb02, 0x5e9f46bf, 0x5a5e5b08, + 0x571d7dd1, 0x53dc6066, 0x4d9b3063, 0x495a2dd4, 0x44190b0d, 0x40d816ba, + 0xaca5c697, 0xa864db20, 0xa527fdf9, 0xa1e6e04e, 0xbfa1b04b, 0xbb60adfc, + 0xb6238b25, 0xb2e29692, 0x8aad2b2f, 0x8e6c3698, 0x832f1041, 0x87ee0df6, + 0x99a95df3, 0x9d684044, 0x902b669d, 0x94ea7b2a, 0xe0b41de7, 0xe4750050, + 0xe9362689, 0xedf73b3e, 0xf3b06b3b, 0xf771768c, 0xfa325055, 0xfef34de2, + 0xc6bcf05f, 0xc27dede8, 0xcf3ecb31, 0xcbffd686, 0xd5b88683, 0xd1799b34, + 0xdc3abded, 0xd8fba05a, 0x690ce0ee, 0x6dcdfd59, 0x608edb80, 0x644fc637, + 0x7a089632, 0x7ec98b85, 0x738aad5c, 0x774bb0eb, 0x4f040d56, 0x4bc510e1, + 0x46863638, 0x42472b8f, 0x5c007b8a, 0x58c1663d, 0x558240e4, 0x51435d53, + 0x251d3b9e, 0x21dc2629, 0x2c9f00f0, 0x285e1d47, 0x36194d42, 0x32d850f5, + 0x3f9b762c, 0x3b5a6b9b, 0x0315d626, 0x07d4cb91, 0x0a97ed48, 0x0e56f0ff, + 0x1011a0fa, 0x14d0bd4d, 0x19939b94, 0x1d528623, 0xf12f560e, 0xf5ee4bb9, + 0xf8ad6d60, 0xfc6c70d7, 0xe22b20d2, 0xe6ea3d65, 0xeba91bbc, 0xef68060b, + 0xd727bbb6, 0xd3e6a601, 0xdea580d8, 0xda649d6f, 0xc423cd6a, 0xc0e2d0dd, + 0xcda1f604, 0xc960ebb3, 0xbd3e8d7e, 0xb9ff90c9, 0xb4bcb610, 0xb07daba7, + 0xae3afba2, 0xaafbe615, 0xa7b8c0cc, 0xa379dd7b, 0x9b3660c6, 0x9ff77d71, + 0x92b45ba8, 0x9675461f, 0x8832161a, 0x8cf30bad, 0x81b02d74, 0x857130c3, + 0x5d8a9099, 0x594b8d2e, 0x5408abf7, 0x50c9b640, 0x4e8ee645, 0x4a4ffbf2, + 0x470cdd2b, 0x43cdc09c, 0x7b827d21, 0x7f436096, 0x7200464f, 0x76c15bf8, + 0x68860bfd, 0x6c47164a, 0x61043093, 0x65c52d24, 0x119b4be9, 0x155a565e, + 0x18197087, 0x1cd86d30, 0x029f3d35, 0x065e2082, 0x0b1d065b, 0x0fdc1bec, + 0x3793a651, 0x3352bbe6, 0x3e119d3f, 0x3ad08088, 0x2497d08d, 0x2056cd3a, + 0x2d15ebe3, 0x29d4f654, 0xc5a92679, 0xc1683bce, 0xcc2b1d17, 0xc8ea00a0, + 0xd6ad50a5, 0xd26c4d12, 0xdf2f6bcb, 0xdbee767c, 0xe3a1cbc1, 0xe760d676, + 0xea23f0af, 0xeee2ed18, 0xf0a5bd1d, 0xf464a0aa, 0xf9278673, 0xfde69bc4, + 0x89b8fd09, 0x8d79e0be, 0x803ac667, 0x84fbdbd0, 0x9abc8bd5, 0x9e7d9662, + 0x933eb0bb, 0x97ffad0c, 0xafb010b1, 0xab710d06, 0xa6322bdf, 0xa2f33668, + 0xbcb4666d, 0xb8757bda, 0xb5365d03, 0xb1f740b4 +}; + guint32 crc32c_table_lookup (guchar pos) { @@ -223,3 +277,17 @@ crc32_ccitt_seed(const guint8 *buf, guint len, guint32 seed) return ( ~crc32 ); } + +guint32 +crc32_mpeg2_seed(const guint8 *buf, guint len, guint32 seed) +{ + guint i; + guint32 crc32; + + crc32 = seed; + + for (i = 0; i < len; i++) + crc32 = (crc32 << 8) ^ crc32_mpeg2_table[((crc32 >> 24) ^ buf[i]) & 0xff]; + + return ( crc32 ); +} diff --git a/wsutil/crc32.h b/wsutil/crc32.h index 90dd59a7e3..a6464b75e3 100644 --- a/wsutil/crc32.h +++ b/wsutil/crc32.h @@ -30,7 +30,8 @@ extern "C" { #endif /* __cplusplus */ #define CRC32_CCITT_SEED 0xFFFFFFFF -#define CRC32C_PRELOAD 0xffffffff +#define CRC32C_PRELOAD 0xffffffff +#define CRC32_MPEG2_SEED 0xFFFFFFFF /* * Byte swap fix contributed by Dave Wysochanski . @@ -79,6 +80,13 @@ extern guint32 crc32_ccitt(const guint8 *buf, guint len); @return The CRC32 CCITT checksum (using the given seed). */ extern guint32 crc32_ccitt_seed(const guint8 *buf, guint len, guint32 seed); +/** Compute MPEG-2 CRC32 checksum of a buffer of data. + @param buf The buffer containing the data. + @param len The number of bytes to include in the computation. + @param seed The seed to use. + @return The CRC32 MPEG-2 checksum (using the given seed). */ +extern guint32 crc32_mpeg2_seed(const guint8 *buf, guint len, guint32 seed); + int AirPDcapWepDecrypt( const guchar *seed, const size_t seed_len, diff --git a/wsutil/libwsutil.def b/wsutil/libwsutil.def index c76e646d22..c943375d8e 100644 --- a/wsutil/libwsutil.def +++ b/wsutil/libwsutil.def @@ -36,6 +36,7 @@ crc32_ccitt_table_lookup crc32c_calculate crc32c_calculate_no_swap crc32c_table_lookup +crc32_mpeg2_seed ; crcdrm.c crc_drm