forked from osmocom/wireshark
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:
parent
bb611755e9
commit
45c342dfdb
|
@ -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) );
|
||||
}
|
||||
|
|
|
@ -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 */
|
||||
|
|
|
@ -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 \
|
||||
|
|
|
@ -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;
|
||||
|
||||
}
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
||||
|
||||
|
|
|
@ -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,
|
||||
§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);
|
||||
}
|
||||
|
||||
|
||||
|
|
|
@ -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
|
|
@ -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
|
||||
|
|
|
@ -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 );
|
||||
}
|
||||
|
|
|
@ -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,
|
||||
|
|
|
@ -36,6 +36,7 @@ crc32_ccitt_table_lookup
|
|||
crc32c_calculate
|
||||
crc32c_calculate_no_swap
|
||||
crc32c_table_lookup
|
||||
crc32_mpeg2_seed
|
||||
|
||||
; crcdrm.c
|
||||
crc_drm
|
||||
|
|
Loading…
Reference in New Issue