wmem: allow wmem_destroy_list to ignore a NULL list.
[metze/wireshark/wip.git] / wsutil / crc32.c
1 /* crc32.c
2  * CRC-32 routine
3  *
4  * Wireshark - Network traffic analyzer
5  * By Gerald Combs <gerald@wireshark.org>
6  * Copyright 1998 Gerald Combs
7  *
8  * SPDX-License-Identifier: GPL-2.0-or-later
9  *
10  * Credits:
11  *
12  * Table from Solomon Peachy
13  * Routine from Chris Waters
14  */
15
16 #include "config.h"
17
18 #include <glib.h>
19 #include <wsutil/crc32.h>
20
21 #define CRC32_ACCUMULATE(c,d,table) (c=(c>>8)^(table)[(c^(d))&0xFF])
22
23 /*****************************************************************/
24 /*                                                               */
25 /* CRC32C LOOKUP TABLE                                           */
26 /* +++================                                           */
27 /* The following CRC lookup table was generated automagically    */
28 /* by the Rocksoft^tm Model CRC Algorithm Table Generation       */
29 /* Program V1.0 using the following model parameters:            */
30 /*                                                               */
31 /*    Width   : 4 bytes.                                         */
32 /*    Poly    : 0x1EDC6F41L                                      */
33 /*    Reverse : TRUE.                                            */
34 /*                                                               */
35 /* For more information on the Rocksoft^tm Model CRC Algorithm,  */
36 /* see the document titled "A Painless Guide to CRC Error        */
37 /* Detection Algorithms" by Ross Williams                        */
38 /* (ross@guest.adelaide.edu.au.). This document is likely to be  */
39 /* in the FTP archive "ftp.adelaide.edu.au/pub/rocksoft".        */
40 /*                                                               */
41 /*****************************************************************/
42 #define CRC32C(c,d) CRC32_ACCUMULATE(c,d,crc32c_table)
43
44 static const guint32 crc32c_table[256] = {
45                 0x00000000U, 0xF26B8303U, 0xE13B70F7U, 0x1350F3F4U, 0xC79A971FU,
46                 0x35F1141CU, 0x26A1E7E8U, 0xD4CA64EBU, 0x8AD958CFU, 0x78B2DBCCU,
47                 0x6BE22838U, 0x9989AB3BU, 0x4D43CFD0U, 0xBF284CD3U, 0xAC78BF27U,
48                 0x5E133C24U, 0x105EC76FU, 0xE235446CU, 0xF165B798U, 0x030E349BU,
49                 0xD7C45070U, 0x25AFD373U, 0x36FF2087U, 0xC494A384U, 0x9A879FA0U,
50                 0x68EC1CA3U, 0x7BBCEF57U, 0x89D76C54U, 0x5D1D08BFU, 0xAF768BBCU,
51                 0xBC267848U, 0x4E4DFB4BU, 0x20BD8EDEU, 0xD2D60DDDU, 0xC186FE29U,
52                 0x33ED7D2AU, 0xE72719C1U, 0x154C9AC2U, 0x061C6936U, 0xF477EA35U,
53                 0xAA64D611U, 0x580F5512U, 0x4B5FA6E6U, 0xB93425E5U, 0x6DFE410EU,
54                 0x9F95C20DU, 0x8CC531F9U, 0x7EAEB2FAU, 0x30E349B1U, 0xC288CAB2U,
55                 0xD1D83946U, 0x23B3BA45U, 0xF779DEAEU, 0x05125DADU, 0x1642AE59U,
56                 0xE4292D5AU, 0xBA3A117EU, 0x4851927DU, 0x5B016189U, 0xA96AE28AU,
57                 0x7DA08661U, 0x8FCB0562U, 0x9C9BF696U, 0x6EF07595U, 0x417B1DBCU,
58                 0xB3109EBFU, 0xA0406D4BU, 0x522BEE48U, 0x86E18AA3U, 0x748A09A0U,
59                 0x67DAFA54U, 0x95B17957U, 0xCBA24573U, 0x39C9C670U, 0x2A993584U,
60                 0xD8F2B687U, 0x0C38D26CU, 0xFE53516FU, 0xED03A29BU, 0x1F682198U,
61                 0x5125DAD3U, 0xA34E59D0U, 0xB01EAA24U, 0x42752927U, 0x96BF4DCCU,
62                 0x64D4CECFU, 0x77843D3BU, 0x85EFBE38U, 0xDBFC821CU, 0x2997011FU,
63                 0x3AC7F2EBU, 0xC8AC71E8U, 0x1C661503U, 0xEE0D9600U, 0xFD5D65F4U,
64                 0x0F36E6F7U, 0x61C69362U, 0x93AD1061U, 0x80FDE395U, 0x72966096U,
65                 0xA65C047DU, 0x5437877EU, 0x4767748AU, 0xB50CF789U, 0xEB1FCBADU,
66                 0x197448AEU, 0x0A24BB5AU, 0xF84F3859U, 0x2C855CB2U, 0xDEEEDFB1U,
67                 0xCDBE2C45U, 0x3FD5AF46U, 0x7198540DU, 0x83F3D70EU, 0x90A324FAU,
68                 0x62C8A7F9U, 0xB602C312U, 0x44694011U, 0x5739B3E5U, 0xA55230E6U,
69                 0xFB410CC2U, 0x092A8FC1U, 0x1A7A7C35U, 0xE811FF36U, 0x3CDB9BDDU,
70                 0xCEB018DEU, 0xDDE0EB2AU, 0x2F8B6829U, 0x82F63B78U, 0x709DB87BU,
71                 0x63CD4B8FU, 0x91A6C88CU, 0x456CAC67U, 0xB7072F64U, 0xA457DC90U,
72                 0x563C5F93U, 0x082F63B7U, 0xFA44E0B4U, 0xE9141340U, 0x1B7F9043U,
73                 0xCFB5F4A8U, 0x3DDE77ABU, 0x2E8E845FU, 0xDCE5075CU, 0x92A8FC17U,
74                 0x60C37F14U, 0x73938CE0U, 0x81F80FE3U, 0x55326B08U, 0xA759E80BU,
75                 0xB4091BFFU, 0x466298FCU, 0x1871A4D8U, 0xEA1A27DBU, 0xF94AD42FU,
76                 0x0B21572CU, 0xDFEB33C7U, 0x2D80B0C4U, 0x3ED04330U, 0xCCBBC033U,
77                 0xA24BB5A6U, 0x502036A5U, 0x4370C551U, 0xB11B4652U, 0x65D122B9U,
78                 0x97BAA1BAU, 0x84EA524EU, 0x7681D14DU, 0x2892ED69U, 0xDAF96E6AU,
79                 0xC9A99D9EU, 0x3BC21E9DU, 0xEF087A76U, 0x1D63F975U, 0x0E330A81U,
80                 0xFC588982U, 0xB21572C9U, 0x407EF1CAU, 0x532E023EU, 0xA145813DU,
81                 0x758FE5D6U, 0x87E466D5U, 0x94B49521U, 0x66DF1622U, 0x38CC2A06U,
82                 0xCAA7A905U, 0xD9F75AF1U, 0x2B9CD9F2U, 0xFF56BD19U, 0x0D3D3E1AU,
83                 0x1E6DCDEEU, 0xEC064EEDU, 0xC38D26C4U, 0x31E6A5C7U, 0x22B65633U,
84                 0xD0DDD530U, 0x0417B1DBU, 0xF67C32D8U, 0xE52CC12CU, 0x1747422FU,
85                 0x49547E0BU, 0xBB3FFD08U, 0xA86F0EFCU, 0x5A048DFFU, 0x8ECEE914U,
86                 0x7CA56A17U, 0x6FF599E3U, 0x9D9E1AE0U, 0xD3D3E1ABU, 0x21B862A8U,
87                 0x32E8915CU, 0xC083125FU, 0x144976B4U, 0xE622F5B7U, 0xF5720643U,
88                 0x07198540U, 0x590AB964U, 0xAB613A67U, 0xB831C993U, 0x4A5A4A90U,
89                 0x9E902E7BU, 0x6CFBAD78U, 0x7FAB5E8CU, 0x8DC0DD8FU, 0xE330A81AU,
90                 0x115B2B19U, 0x020BD8EDU, 0xF0605BEEU, 0x24AA3F05U, 0xD6C1BC06U,
91                 0xC5914FF2U, 0x37FACCF1U, 0x69E9F0D5U, 0x9B8273D6U, 0x88D28022U,
92                 0x7AB90321U, 0xAE7367CAU, 0x5C18E4C9U, 0x4F48173DU, 0xBD23943EU,
93                 0xF36E6F75U, 0x0105EC76U, 0x12551F82U, 0xE03E9C81U, 0x34F4F86AU,
94                 0xC69F7B69U, 0xD5CF889DU, 0x27A40B9EU, 0x79B737BAU, 0x8BDCB4B9U,
95                 0x988C474DU, 0x6AE7C44EU, 0xBE2DA0A5U, 0x4C4623A6U, 0x5F16D052U,
96                 0xAD7D5351U };
97
98 /*
99  * Table for the AUTODIN/HDLC/802.x CRC.
100  *
101  * Polynomial is
102  *
103  *  x^32 + x^26 + x^23 + x^22 + x^16 + x^12 + x^11 + x^10 + x^8 +
104  *      x^7 + x^5 + x^4 + x^2 + x + 1
105  */
106 static const guint32 crc32_ccitt_table[256] = {
107         0x00000000, 0x77073096, 0xee0e612c, 0x990951ba, 0x076dc419,
108         0x706af48f, 0xe963a535, 0x9e6495a3, 0x0edb8832, 0x79dcb8a4,
109         0xe0d5e91e, 0x97d2d988, 0x09b64c2b, 0x7eb17cbd, 0xe7b82d07,
110         0x90bf1d91, 0x1db71064, 0x6ab020f2, 0xf3b97148, 0x84be41de,
111         0x1adad47d, 0x6ddde4eb, 0xf4d4b551, 0x83d385c7, 0x136c9856,
112         0x646ba8c0, 0xfd62f97a, 0x8a65c9ec, 0x14015c4f, 0x63066cd9,
113         0xfa0f3d63, 0x8d080df5, 0x3b6e20c8, 0x4c69105e, 0xd56041e4,
114         0xa2677172, 0x3c03e4d1, 0x4b04d447, 0xd20d85fd, 0xa50ab56b,
115         0x35b5a8fa, 0x42b2986c, 0xdbbbc9d6, 0xacbcf940, 0x32d86ce3,
116         0x45df5c75, 0xdcd60dcf, 0xabd13d59, 0x26d930ac, 0x51de003a,
117         0xc8d75180, 0xbfd06116, 0x21b4f4b5, 0x56b3c423, 0xcfba9599,
118         0xb8bda50f, 0x2802b89e, 0x5f058808, 0xc60cd9b2, 0xb10be924,
119         0x2f6f7c87, 0x58684c11, 0xc1611dab, 0xb6662d3d, 0x76dc4190,
120         0x01db7106, 0x98d220bc, 0xefd5102a, 0x71b18589, 0x06b6b51f,
121         0x9fbfe4a5, 0xe8b8d433, 0x7807c9a2, 0x0f00f934, 0x9609a88e,
122         0xe10e9818, 0x7f6a0dbb, 0x086d3d2d, 0x91646c97, 0xe6635c01,
123         0x6b6b51f4, 0x1c6c6162, 0x856530d8, 0xf262004e, 0x6c0695ed,
124         0x1b01a57b, 0x8208f4c1, 0xf50fc457, 0x65b0d9c6, 0x12b7e950,
125         0x8bbeb8ea, 0xfcb9887c, 0x62dd1ddf, 0x15da2d49, 0x8cd37cf3,
126         0xfbd44c65, 0x4db26158, 0x3ab551ce, 0xa3bc0074, 0xd4bb30e2,
127         0x4adfa541, 0x3dd895d7, 0xa4d1c46d, 0xd3d6f4fb, 0x4369e96a,
128         0x346ed9fc, 0xad678846, 0xda60b8d0, 0x44042d73, 0x33031de5,
129         0xaa0a4c5f, 0xdd0d7cc9, 0x5005713c, 0x270241aa, 0xbe0b1010,
130         0xc90c2086, 0x5768b525, 0x206f85b3, 0xb966d409, 0xce61e49f,
131         0x5edef90e, 0x29d9c998, 0xb0d09822, 0xc7d7a8b4, 0x59b33d17,
132         0x2eb40d81, 0xb7bd5c3b, 0xc0ba6cad, 0xedb88320, 0x9abfb3b6,
133         0x03b6e20c, 0x74b1d29a, 0xead54739, 0x9dd277af, 0x04db2615,
134         0x73dc1683, 0xe3630b12, 0x94643b84, 0x0d6d6a3e, 0x7a6a5aa8,
135         0xe40ecf0b, 0x9309ff9d, 0x0a00ae27, 0x7d079eb1, 0xf00f9344,
136         0x8708a3d2, 0x1e01f268, 0x6906c2fe, 0xf762575d, 0x806567cb,
137         0x196c3671, 0x6e6b06e7, 0xfed41b76, 0x89d32be0, 0x10da7a5a,
138         0x67dd4acc, 0xf9b9df6f, 0x8ebeeff9, 0x17b7be43, 0x60b08ed5,
139         0xd6d6a3e8, 0xa1d1937e, 0x38d8c2c4, 0x4fdff252, 0xd1bb67f1,
140         0xa6bc5767, 0x3fb506dd, 0x48b2364b, 0xd80d2bda, 0xaf0a1b4c,
141         0x36034af6, 0x41047a60, 0xdf60efc3, 0xa867df55, 0x316e8eef,
142         0x4669be79, 0xcb61b38c, 0xbc66831a, 0x256fd2a0, 0x5268e236,
143         0xcc0c7795, 0xbb0b4703, 0x220216b9, 0x5505262f, 0xc5ba3bbe,
144         0xb2bd0b28, 0x2bb45a92, 0x5cb36a04, 0xc2d7ffa7, 0xb5d0cf31,
145         0x2cd99e8b, 0x5bdeae1d, 0x9b64c2b0, 0xec63f226, 0x756aa39c,
146         0x026d930a, 0x9c0906a9, 0xeb0e363f, 0x72076785, 0x05005713,
147         0x95bf4a82, 0xe2b87a14, 0x7bb12bae, 0x0cb61b38, 0x92d28e9b,
148         0xe5d5be0d, 0x7cdcefb7, 0x0bdbdf21, 0x86d3d2d4, 0xf1d4e242,
149         0x68ddb3f8, 0x1fda836e, 0x81be16cd, 0xf6b9265b, 0x6fb077e1,
150         0x18b74777, 0x88085ae6, 0xff0f6a70, 0x66063bca, 0x11010b5c,
151         0x8f659eff, 0xf862ae69, 0x616bffd3, 0x166ccf45, 0xa00ae278,
152         0xd70dd2ee, 0x4e048354, 0x3903b3c2, 0xa7672661, 0xd06016f7,
153         0x4969474d, 0x3e6e77db, 0xaed16a4a, 0xd9d65adc, 0x40df0b66,
154         0x37d83bf0, 0xa9bcae53, 0xdebb9ec5, 0x47b2cf7f, 0x30b5ffe9,
155         0xbdbdf21c, 0xcabac28a, 0x53b39330, 0x24b4a3a6, 0xbad03605,
156         0xcdd70693, 0x54de5729, 0x23d967bf, 0xb3667a2e, 0xc4614ab8,
157         0x5d681b02, 0x2a6f2b94, 0xb40bbe37, 0xc30c8ea1, 0x5a05df1b,
158         0x2d02ef8d
159 };
160
161 /*
162  * Table for the MPEG-2 CRC.
163  *
164  * Polynomial is
165  *
166  *  x^32 + x^26 + x^23 + x^22 + x^16 + x^12 + x^11 + x^10 + x^8 +
167  *      x^7 + x^5 + x^4 + x^2 + x + 1
168  *
169  * (which is the same polynomial as the one above us).
170  *
171  * NOTE: this is also used for ATM AAL5.
172  */
173 static const guint32 crc32_mpeg2_table[256] = {
174                 0x00000000, 0x04c11db7, 0x09823b6e, 0x0d4326d9, 0x130476dc, 0x17c56b6b,
175                 0x1a864db2, 0x1e475005, 0x2608edb8, 0x22c9f00f, 0x2f8ad6d6, 0x2b4bcb61,
176                 0x350c9b64, 0x31cd86d3, 0x3c8ea00a, 0x384fbdbd, 0x4c11db70, 0x48d0c6c7,
177                 0x4593e01e, 0x4152fda9, 0x5f15adac, 0x5bd4b01b, 0x569796c2, 0x52568b75,
178                 0x6a1936c8, 0x6ed82b7f, 0x639b0da6, 0x675a1011, 0x791d4014, 0x7ddc5da3,
179                 0x709f7b7a, 0x745e66cd, 0x9823b6e0, 0x9ce2ab57, 0x91a18d8e, 0x95609039,
180                 0x8b27c03c, 0x8fe6dd8b, 0x82a5fb52, 0x8664e6e5, 0xbe2b5b58, 0xbaea46ef,
181                 0xb7a96036, 0xb3687d81, 0xad2f2d84, 0xa9ee3033, 0xa4ad16ea, 0xa06c0b5d,
182                 0xd4326d90, 0xd0f37027, 0xddb056fe, 0xd9714b49, 0xc7361b4c, 0xc3f706fb,
183                 0xceb42022, 0xca753d95, 0xf23a8028, 0xf6fb9d9f, 0xfbb8bb46, 0xff79a6f1,
184                 0xe13ef6f4, 0xe5ffeb43, 0xe8bccd9a, 0xec7dd02d, 0x34867077, 0x30476dc0,
185                 0x3d044b19, 0x39c556ae, 0x278206ab, 0x23431b1c, 0x2e003dc5, 0x2ac12072,
186                 0x128e9dcf, 0x164f8078, 0x1b0ca6a1, 0x1fcdbb16, 0x018aeb13, 0x054bf6a4,
187                 0x0808d07d, 0x0cc9cdca, 0x7897ab07, 0x7c56b6b0, 0x71159069, 0x75d48dde,
188                 0x6b93dddb, 0x6f52c06c, 0x6211e6b5, 0x66d0fb02, 0x5e9f46bf, 0x5a5e5b08,
189                 0x571d7dd1, 0x53dc6066, 0x4d9b3063, 0x495a2dd4, 0x44190b0d, 0x40d816ba,
190                 0xaca5c697, 0xa864db20, 0xa527fdf9, 0xa1e6e04e, 0xbfa1b04b, 0xbb60adfc,
191                 0xb6238b25, 0xb2e29692, 0x8aad2b2f, 0x8e6c3698, 0x832f1041, 0x87ee0df6,
192                 0x99a95df3, 0x9d684044, 0x902b669d, 0x94ea7b2a, 0xe0b41de7, 0xe4750050,
193                 0xe9362689, 0xedf73b3e, 0xf3b06b3b, 0xf771768c, 0xfa325055, 0xfef34de2,
194                 0xc6bcf05f, 0xc27dede8, 0xcf3ecb31, 0xcbffd686, 0xd5b88683, 0xd1799b34,
195                 0xdc3abded, 0xd8fba05a, 0x690ce0ee, 0x6dcdfd59, 0x608edb80, 0x644fc637,
196                 0x7a089632, 0x7ec98b85, 0x738aad5c, 0x774bb0eb, 0x4f040d56, 0x4bc510e1,
197                 0x46863638, 0x42472b8f, 0x5c007b8a, 0x58c1663d, 0x558240e4, 0x51435d53,
198                 0x251d3b9e, 0x21dc2629, 0x2c9f00f0, 0x285e1d47, 0x36194d42, 0x32d850f5,
199                 0x3f9b762c, 0x3b5a6b9b, 0x0315d626, 0x07d4cb91, 0x0a97ed48, 0x0e56f0ff,
200                 0x1011a0fa, 0x14d0bd4d, 0x19939b94, 0x1d528623, 0xf12f560e, 0xf5ee4bb9,
201                 0xf8ad6d60, 0xfc6c70d7, 0xe22b20d2, 0xe6ea3d65, 0xeba91bbc, 0xef68060b,
202                 0xd727bbb6, 0xd3e6a601, 0xdea580d8, 0xda649d6f, 0xc423cd6a, 0xc0e2d0dd,
203                 0xcda1f604, 0xc960ebb3, 0xbd3e8d7e, 0xb9ff90c9, 0xb4bcb610, 0xb07daba7,
204                 0xae3afba2, 0xaafbe615, 0xa7b8c0cc, 0xa379dd7b, 0x9b3660c6, 0x9ff77d71,
205                 0x92b45ba8, 0x9675461f, 0x8832161a, 0x8cf30bad, 0x81b02d74, 0x857130c3,
206                 0x5d8a9099, 0x594b8d2e, 0x5408abf7, 0x50c9b640, 0x4e8ee645, 0x4a4ffbf2,
207                 0x470cdd2b, 0x43cdc09c, 0x7b827d21, 0x7f436096, 0x7200464f, 0x76c15bf8,
208                 0x68860bfd, 0x6c47164a, 0x61043093, 0x65c52d24, 0x119b4be9, 0x155a565e,
209                 0x18197087, 0x1cd86d30, 0x029f3d35, 0x065e2082, 0x0b1d065b, 0x0fdc1bec,
210                 0x3793a651, 0x3352bbe6, 0x3e119d3f, 0x3ad08088, 0x2497d08d, 0x2056cd3a,
211                 0x2d15ebe3, 0x29d4f654, 0xc5a92679, 0xc1683bce, 0xcc2b1d17, 0xc8ea00a0,
212                 0xd6ad50a5, 0xd26c4d12, 0xdf2f6bcb, 0xdbee767c, 0xe3a1cbc1, 0xe760d676,
213                 0xea23f0af, 0xeee2ed18, 0xf0a5bd1d, 0xf464a0aa, 0xf9278673, 0xfde69bc4,
214                 0x89b8fd09, 0x8d79e0be, 0x803ac667, 0x84fbdbd0, 0x9abc8bd5, 0x9e7d9662,
215                 0x933eb0bb, 0x97ffad0c, 0xafb010b1, 0xab710d06, 0xa6322bdf, 0xa2f33668,
216                 0xbcb4666d, 0xb8757bda, 0xb5365d03, 0xb1f740b4
217 };
218
219 /* This table was compiled using the polynom: 0x0AA725CF*/
220 static const guint32 crc32_0AA725CF_reverse[] = {
221                 0x00000000U, 0xCEAA95CEU, 0x7A1CE13DU, 0xB4B674F3U,
222                 0xF439C27AU, 0x3A9357B4U, 0x8E252347U, 0x408FB689U,
223                 0x0F3A4E55U, 0xC190DB9BU, 0x7526AF68U, 0xBB8C3AA6U,
224                 0xFB038C2FU, 0x35A919E1U, 0x811F6D12U, 0x4FB5F8DCU,
225                 0x1E749CAAU, 0xD0DE0964U, 0x64687D97U, 0xAAC2E859U,
226                 0xEA4D5ED0U, 0x24E7CB1EU, 0x9051BFEDU, 0x5EFB2A23U,
227                 0x114ED2FFU, 0xDFE44731U, 0x6B5233C2U, 0xA5F8A60CU,
228                 0xE5771085U, 0x2BDD854BU, 0x9F6BF1B8U, 0x51C16476U,
229                 0x3CE93954U, 0xF243AC9AU, 0x46F5D869U, 0x885F4DA7U,
230                 0xC8D0FB2EU, 0x067A6EE0U, 0xB2CC1A13U, 0x7C668FDDU,
231                 0x33D37701U, 0xFD79E2CFU, 0x49CF963CU, 0x876503F2U,
232                 0xC7EAB57BU, 0x094020B5U, 0xBDF65446U, 0x735CC188U,
233                 0x229DA5FEU, 0xEC373030U, 0x588144C3U, 0x962BD10DU,
234                 0xD6A46784U, 0x180EF24AU, 0xACB886B9U, 0x62121377U,
235                 0x2DA7EBABU, 0xE30D7E65U, 0x57BB0A96U, 0x99119F58U,
236                 0xD99E29D1U, 0x1734BC1FU, 0xA382C8ECU, 0x6D285D22U,
237                 0x79D272A8U, 0xB778E766U, 0x03CE9395U, 0xCD64065BU,
238                 0x8DEBB0D2U, 0x4341251CU, 0xF7F751EFU, 0x395DC421U,
239                 0x76E83CFDU, 0xB842A933U, 0x0CF4DDC0U, 0xC25E480EU,
240                 0x82D1FE87U, 0x4C7B6B49U, 0xF8CD1FBAU, 0x36678A74U,
241                 0x67A6EE02U, 0xA90C7BCCU, 0x1DBA0F3FU, 0xD3109AF1U,
242                 0x939F2C78U, 0x5D35B9B6U, 0xE983CD45U, 0x2729588BU,
243                 0x689CA057U, 0xA6363599U, 0x1280416AU, 0xDC2AD4A4U,
244                 0x9CA5622DU, 0x520FF7E3U, 0xE6B98310U, 0x281316DEU,
245                 0x453B4BFCU, 0x8B91DE32U, 0x3F27AAC1U, 0xF18D3F0FU,
246                 0xB1028986U, 0x7FA81C48U, 0xCB1E68BBU, 0x05B4FD75U,
247                 0x4A0105A9U, 0x84AB9067U, 0x301DE494U, 0xFEB7715AU,
248                 0xBE38C7D3U, 0x7092521DU, 0xC42426EEU, 0x0A8EB320U,
249                 0x5B4FD756U, 0x95E54298U, 0x2153366BU, 0xEFF9A3A5U,
250                 0xAF76152CU, 0x61DC80E2U, 0xD56AF411U, 0x1BC061DFU,
251                 0x54759903U, 0x9ADF0CCDU, 0x2E69783EU, 0xE0C3EDF0U,
252                 0xA04C5B79U, 0x6EE6CEB7U, 0xDA50BA44U, 0x14FA2F8AU,
253                 0xF3A4E550U, 0x3D0E709EU, 0x89B8046DU, 0x471291A3U,
254                 0x079D272AU, 0xC937B2E4U, 0x7D81C617U, 0xB32B53D9U,
255                 0xFC9EAB05U, 0x32343ECBU, 0x86824A38U, 0x4828DFF6U,
256                 0x08A7697FU, 0xC60DFCB1U, 0x72BB8842U, 0xBC111D8CU,
257                 0xEDD079FAU, 0x237AEC34U, 0x97CC98C7U, 0x59660D09U,
258                 0x19E9BB80U, 0xD7432E4EU, 0x63F55ABDU, 0xAD5FCF73U,
259                 0xE2EA37AFU, 0x2C40A261U, 0x98F6D692U, 0x565C435CU,
260                 0x16D3F5D5U, 0xD879601BU, 0x6CCF14E8U, 0xA2658126U,
261                 0xCF4DDC04U, 0x01E749CAU, 0xB5513D39U, 0x7BFBA8F7U,
262                 0x3B741E7EU, 0xF5DE8BB0U, 0x4168FF43U, 0x8FC26A8DU,
263                 0xC0779251U, 0x0EDD079FU, 0xBA6B736CU, 0x74C1E6A2U,
264                 0x344E502BU, 0xFAE4C5E5U, 0x4E52B116U, 0x80F824D8U,
265                 0xD13940AEU, 0x1F93D560U, 0xAB25A193U, 0x658F345DU,
266                 0x250082D4U, 0xEBAA171AU, 0x5F1C63E9U, 0x91B6F627U,
267                 0xDE030EFBU, 0x10A99B35U, 0xA41FEFC6U, 0x6AB57A08U,
268                 0x2A3ACC81U, 0xE490594FU, 0x50262DBCU, 0x9E8CB872U,
269                 0x8A7697F8U, 0x44DC0236U, 0xF06A76C5U, 0x3EC0E30BU,
270                 0x7E4F5582U, 0xB0E5C04CU, 0x0453B4BFU, 0xCAF92171U,
271                 0x854CD9ADU, 0x4BE64C63U, 0xFF503890U, 0x31FAAD5EU,
272                 0x71751BD7U, 0xBFDF8E19U, 0x0B69FAEAU, 0xC5C36F24U,
273                 0x94020B52U, 0x5AA89E9CU, 0xEE1EEA6FU, 0x20B47FA1U,
274                 0x603BC928U, 0xAE915CE6U, 0x1A272815U, 0xD48DBDDBU,
275                 0x9B384507U, 0x5592D0C9U, 0xE124A43AU, 0x2F8E31F4U,
276                 0x6F01877DU, 0xA1AB12B3U, 0x151D6640U, 0xDBB7F38EU,
277                 0xB69FAEACU, 0x78353B62U, 0xCC834F91U, 0x0229DA5FU,
278                 0x42A66CD6U, 0x8C0CF918U, 0x38BA8DEBU, 0xF6101825U,
279                 0xB9A5E0F9U, 0x770F7537U, 0xC3B901C4U, 0x0D13940AU,
280                 0x4D9C2283U, 0x8336B74DU, 0x3780C3BEU, 0xF92A5670U,
281                 0xA8EB3206U, 0x6641A7C8U, 0xD2F7D33BU, 0x1C5D46F5U,
282                 0x5CD2F07CU, 0x927865B2U, 0x26CE1141U, 0xE864848FU,
283                 0xA7D17C53U, 0x697BE99DU, 0xDDCD9D6EU, 0x136708A0U,
284                 0x53E8BE29U, 0x9D422BE7U, 0x29F45F14U, 0xE75ECADAU
285 };
286
287 /* This table was compiled using the polynom: 0x5D6DCB */
288 static const guint32 crc32_5D6DCB[] =
289 {
290                 0x00000000, 0x005d6dcb, 0x00badb96, 0x00e7b65d,
291                 0x0028dae7, 0x0075b72c, 0x00920171, 0x00cf6cba,
292                 0x0051b5ce, 0x000cd805, 0x00eb6e58, 0x00b60393,
293                 0x00796f29, 0x002402e2, 0x00c3b4bf, 0x009ed974,
294                 0x00a36b9c, 0x00fe0657, 0x0019b00a, 0x0044ddc1,
295                 0x008bb17b, 0x00d6dcb0, 0x00316aed, 0x006c0726,
296                 0x00f2de52, 0x00afb399, 0x004805c4, 0x0015680f,
297                 0x00da04b5, 0x0087697e, 0x0060df23, 0x003db2e8,
298                 0x001bbaf3, 0x0046d738, 0x00a16165, 0x00fc0cae,
299                 0x00336014, 0x006e0ddf, 0x0089bb82, 0x00d4d649,
300                 0x004a0f3d, 0x001762f6, 0x00f0d4ab, 0x00adb960,
301                 0x0062d5da, 0x003fb811, 0x00d80e4c, 0x00856387,
302                 0x00b8d16f, 0x00e5bca4, 0x00020af9, 0x005f6732,
303                 0x00900b88, 0x00cd6643, 0x002ad01e, 0x0077bdd5,
304                 0x00e964a1, 0x00b4096a, 0x0053bf37, 0x000ed2fc,
305                 0x00c1be46, 0x009cd38d, 0x007b65d0, 0x0026081b,
306                 0x003775e6, 0x006a182d, 0x008dae70, 0x00d0c3bb,
307                 0x001faf01, 0x0042c2ca, 0x00a57497, 0x00f8195c,
308                 0x0066c028, 0x003bade3, 0x00dc1bbe, 0x00817675,
309                 0x004e1acf, 0x00137704, 0x00f4c159, 0x00a9ac92,
310                 0x00941e7a, 0x00c973b1, 0x002ec5ec, 0x0073a827,
311                 0x00bcc49d, 0x00e1a956, 0x00061f0b, 0x005b72c0,
312                 0x00c5abb4, 0x0098c67f, 0x007f7022, 0x00221de9,
313                 0x00ed7153, 0x00b01c98, 0x0057aac5, 0x000ac70e,
314                 0x002ccf15, 0x0071a2de, 0x00961483, 0x00cb7948,
315                 0x000415f2, 0x00597839, 0x00bece64, 0x00e3a3af,
316                 0x007d7adb, 0x00201710, 0x00c7a14d, 0x009acc86,
317                 0x0055a03c, 0x0008cdf7, 0x00ef7baa, 0x00b21661,
318                 0x008fa489, 0x00d2c942, 0x00357f1f, 0x006812d4,
319                 0x00a77e6e, 0x00fa13a5, 0x001da5f8, 0x0040c833,
320                 0x00de1147, 0x00837c8c, 0x0064cad1, 0x0039a71a,
321                 0x00f6cba0, 0x00aba66b, 0x004c1036, 0x00117dfd,
322                 0x006eebcc, 0x00338607, 0x00d4305a, 0x00895d91,
323                 0x0046312b, 0x001b5ce0, 0x00fceabd, 0x00a18776,
324                 0x003f5e02, 0x006233c9, 0x00858594, 0x00d8e85f,
325                 0x001784e5, 0x004ae92e, 0x00ad5f73, 0x00f032b8,
326                 0x00cd8050, 0x0090ed9b, 0x00775bc6, 0x002a360d,
327                 0x00e55ab7, 0x00b8377c, 0x005f8121, 0x0002ecea,
328                 0x009c359e, 0x00c15855, 0x0026ee08, 0x007b83c3,
329                 0x00b4ef79, 0x00e982b2, 0x000e34ef, 0x00535924,
330                 0x0075513f, 0x00283cf4, 0x00cf8aa9, 0x0092e762,
331                 0x005d8bd8, 0x0000e613, 0x00e7504e, 0x00ba3d85,
332                 0x0024e4f1, 0x0079893a, 0x009e3f67, 0x00c352ac,
333                 0x000c3e16, 0x005153dd, 0x00b6e580, 0x00eb884b,
334                 0x00d63aa3, 0x008b5768, 0x006ce135, 0x00318cfe,
335                 0x00fee044, 0x00a38d8f, 0x00443bd2, 0x00195619,
336                 0x00878f6d, 0x00dae2a6, 0x003d54fb, 0x00603930,
337                 0x00af558a, 0x00f23841, 0x00158e1c, 0x0048e3d7,
338                 0x00599e2a, 0x0004f3e1, 0x00e345bc, 0x00be2877,
339                 0x007144cd, 0x002c2906, 0x00cb9f5b, 0x0096f290,
340                 0x00082be4, 0x0055462f, 0x00b2f072, 0x00ef9db9,
341                 0x0020f103, 0x007d9cc8, 0x009a2a95, 0x00c7475e,
342                 0x00faf5b6, 0x00a7987d, 0x00402e20, 0x001d43eb,
343                 0x00d22f51, 0x008f429a, 0x0068f4c7, 0x0035990c,
344                 0x00ab4078, 0x00f62db3, 0x00119bee, 0x004cf625,
345                 0x00839a9f, 0x00def754, 0x00394109, 0x00642cc2,
346                 0x004224d9, 0x001f4912, 0x00f8ff4f, 0x00a59284,
347                 0x006afe3e, 0x003793f5, 0x00d025a8, 0x008d4863,
348                 0x00139117, 0x004efcdc, 0x00a94a81, 0x00f4274a,
349                 0x003b4bf0, 0x0066263b, 0x00819066, 0x00dcfdad,
350                 0x00e14f45, 0x00bc228e, 0x005b94d3, 0x0006f918,
351                 0x00c995a2, 0x0094f869, 0x00734e34, 0x002e23ff,
352                 0x00b0fa8b, 0x00ed9740, 0x000a211d, 0x00574cd6,
353                 0x0098206c, 0x00c54da7, 0x0022fbfa, 0x007f9631
354 };
355
356 guint32
357 crc32c_table_lookup (guchar pos)
358 {
359         return crc32c_table[pos];
360 }
361
362 guint32
363 crc32_ccitt_table_lookup (guchar pos)
364 {
365         return crc32_ccitt_table[pos];
366 }
367
368 guint32
369 crc32c_calculate(const void *buf, int len, guint32 crc)
370 {
371         const guint8 *p = (const guint8 *)buf;
372         crc = CRC32C_SWAP(crc);
373         while (len-- > 0) {
374                 CRC32C(crc, *p++);
375         }
376         return CRC32C_SWAP(crc);
377 }
378
379 guint32
380 crc32c_calculate_no_swap(const void *buf, int len, guint32 crc)
381 {
382         const guint8 *p = (const guint8 *)buf;
383         while (len-- > 0) {
384                 CRC32C(crc, *p++);
385         }
386
387         return crc;
388 }
389
390 guint32
391 crc32_ccitt(const guint8 *buf, guint len)
392 {
393         return (crc32_ccitt_seed(buf, len, CRC32_CCITT_SEED));
394 }
395
396 guint32
397 crc32_ccitt_seed(const guint8 *buf, guint len, guint32 seed)
398 {
399         guint i;
400         guint32 crc32 = seed;
401
402         for (i = 0; i < len; i++)
403                 CRC32_ACCUMULATE(crc32, buf[i], crc32_ccitt_table);
404
405         return ( ~crc32 );
406 }
407
408 guint32
409 crc32_mpeg2_seed(const guint8 *buf, guint len, guint32 seed)
410 {
411         guint i;
412         guint32 crc32;
413
414         crc32 = seed;
415
416         for (i = 0; i < len; i++)
417                 crc32 = (crc32 << 8) ^ crc32_mpeg2_table[((crc32 >> 24) ^ buf[i]) & 0xff];
418
419         return ( crc32 );
420 }
421
422 guint32
423 crc32_0x0AA725CF_seed(const guint8 *buf, guint len, guint32 seed)
424 {
425         guint crc32;
426
427         crc32 = (guint)seed;
428         while( len-- != 0 )
429                 CRC32_ACCUMULATE(crc32, *buf++, crc32_0AA725CF_reverse);
430
431         return (guint32)crc32;
432 }
433
434 guint32
435 crc32_0x5D6DCB_seed(const guint8 *buf, guint len, guint32 seed)
436 {
437         guint32 crc = seed;
438         if (len > 0)
439         {
440                 while (len-- > 0)
441                 {
442                         guint8 data = *buf++;
443                         /* XOR data with CRC2, look up result, then XOR that with CRC; */
444                         crc = crc32_5D6DCB[((crc >> 16) ^ data) & 0xff] ^ (crc << 8);
445                 }
446         }
447         return (crc & 0x00ffffff);
448 }
449
450
451 /*
452  * Editor modelines  -  http://www.wireshark.org/tools/modelines.html
453  *
454  * Local variables:
455  * c-basic-offset: 8
456  * tab-width: 8
457  * indent-tabs-mode: t
458  * End:
459  *
460  * vi: set shiftwidth=8 tabstop=8 noexpandtab:
461  * :indentSize=8:tabSize=8:noTabs=false:
462  */