From Weston Schmidt:

Update packet-mpeg-sect to support CRCs & simpler header processing for subdissectors.

https://bugs.wireshark.org/bugzilla/show_bug.cgi?id=6941

svn path=/trunk/; revision=41523
This commit is contained in:
Anders Broman 2012-03-13 08:57:04 +00:00
parent bb611755e9
commit 45c342dfdb
11 changed files with 282 additions and 88 deletions

View File

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

View File

@ -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 */

View File

@ -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 \

View File

@ -30,6 +30,7 @@
#include <glib.h>
#include <epan/packet.h>
#include <epan/dissectors/packet-mpeg-sect.h>
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;
}

View File

@ -31,6 +31,7 @@
#include <epan/packet.h>
#include <epan/prefs.h>
#include <epan/dissectors/packet-mpeg-sect.h>
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);
}

View File

@ -37,11 +37,12 @@
#include <epan/packet.h>
#include <epan/prefs.h>
#include <epan/crc32-tvb.h>
#include <epan/expert.h>
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,
&section_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);
}

View File

@ -0,0 +1,43 @@
/* packet-mpeg-sect.h
* Declarations of exported routines from mpeg-sect dissector
* Copyright 2012, Weston Schmidt <weston_schmidt@alumni.purdue.edu>
*
* $Id$
*
* Wireshark - Network traffic analyzer
* By Gerald Combs <gerald@wireshark.org>
* 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

View File

@ -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

View File

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

View File

@ -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 <davidw@netapp.com>.
@ -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,

View File

@ -36,6 +36,7 @@ crc32_ccitt_table_lookup
crc32c_calculate
crc32c_calculate_no_swap
crc32c_table_lookup
crc32_mpeg2_seed
; crcdrm.c
crc_drm