Fix the polynomial for the CCITT CRC.
[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  * This program is free software; you can redistribute it and/or
9  * modify it under the terms of the GNU General Public License
10  * as published by the Free Software Foundation; either version 2
11  * of the License, or (at your option) any later version.
12  *
13  * This program is distributed in the hope that it will be useful,
14  * but WITHOUT ANY WARRANTY; without even the implied warranty of
15  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
16  * GNU General Public License for more details.
17  *
18  * You should have received a copy of the GNU General Public License
19  * along with this program; if not, write to the Free Software
20  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
21  *
22  * Credits:
23  *
24  * Table from Solomon Peachy
25  * Routine from Chris Waters
26  */
27
28 #include "config.h"
29
30 #include <glib.h>
31 #include <wsutil/crc32.h>
32
33 #define CRC32_ACCUMULATE(c,d,table) (c=(c>>8)^(table)[(c^(d))&0xFF])
34
35 /*****************************************************************/
36 /*                                                               */
37 /* CRC32C LOOKUP TABLE                                           */
38 /* +++================                                           */
39 /* The following CRC lookup table was generated automagically    */
40 /* by the Rocksoft^tm Model CRC Algorithm Table Generation       */
41 /* Program V1.0 using the following model parameters:            */
42 /*                                                               */
43 /*    Width   : 4 bytes.                                         */
44 /*    Poly    : 0x1EDC6F41L                                      */
45 /*    Reverse : TRUE.                                            */
46 /*                                                               */
47 /* For more information on the Rocksoft^tm Model CRC Algorithm,  */
48 /* see the document titled "A Painless Guide to CRC Error        */
49 /* Detection Algorithms" by Ross Williams                        */
50 /* (ross@guest.adelaide.edu.au.). This document is likely to be  */
51 /* in the FTP archive "ftp.adelaide.edu.au/pub/rocksoft".        */
52 /*                                                               */
53 /*****************************************************************/
54 #define CRC32C(c,d) CRC32_ACCUMULATE(c,d,crc32c_table)
55
56 static const guint32 crc32c_table[256] = {
57                 0x00000000U, 0xF26B8303U, 0xE13B70F7U, 0x1350F3F4U, 0xC79A971FU,
58                 0x35F1141CU, 0x26A1E7E8U, 0xD4CA64EBU, 0x8AD958CFU, 0x78B2DBCCU,
59                 0x6BE22838U, 0x9989AB3BU, 0x4D43CFD0U, 0xBF284CD3U, 0xAC78BF27U,
60                 0x5E133C24U, 0x105EC76FU, 0xE235446CU, 0xF165B798U, 0x030E349BU,
61                 0xD7C45070U, 0x25AFD373U, 0x36FF2087U, 0xC494A384U, 0x9A879FA0U,
62                 0x68EC1CA3U, 0x7BBCEF57U, 0x89D76C54U, 0x5D1D08BFU, 0xAF768BBCU,
63                 0xBC267848U, 0x4E4DFB4BU, 0x20BD8EDEU, 0xD2D60DDDU, 0xC186FE29U,
64                 0x33ED7D2AU, 0xE72719C1U, 0x154C9AC2U, 0x061C6936U, 0xF477EA35U,
65                 0xAA64D611U, 0x580F5512U, 0x4B5FA6E6U, 0xB93425E5U, 0x6DFE410EU,
66                 0x9F95C20DU, 0x8CC531F9U, 0x7EAEB2FAU, 0x30E349B1U, 0xC288CAB2U,
67                 0xD1D83946U, 0x23B3BA45U, 0xF779DEAEU, 0x05125DADU, 0x1642AE59U,
68                 0xE4292D5AU, 0xBA3A117EU, 0x4851927DU, 0x5B016189U, 0xA96AE28AU,
69                 0x7DA08661U, 0x8FCB0562U, 0x9C9BF696U, 0x6EF07595U, 0x417B1DBCU,
70                 0xB3109EBFU, 0xA0406D4BU, 0x522BEE48U, 0x86E18AA3U, 0x748A09A0U,
71                 0x67DAFA54U, 0x95B17957U, 0xCBA24573U, 0x39C9C670U, 0x2A993584U,
72                 0xD8F2B687U, 0x0C38D26CU, 0xFE53516FU, 0xED03A29BU, 0x1F682198U,
73                 0x5125DAD3U, 0xA34E59D0U, 0xB01EAA24U, 0x42752927U, 0x96BF4DCCU,
74                 0x64D4CECFU, 0x77843D3BU, 0x85EFBE38U, 0xDBFC821CU, 0x2997011FU,
75                 0x3AC7F2EBU, 0xC8AC71E8U, 0x1C661503U, 0xEE0D9600U, 0xFD5D65F4U,
76                 0x0F36E6F7U, 0x61C69362U, 0x93AD1061U, 0x80FDE395U, 0x72966096U,
77                 0xA65C047DU, 0x5437877EU, 0x4767748AU, 0xB50CF789U, 0xEB1FCBADU,
78                 0x197448AEU, 0x0A24BB5AU, 0xF84F3859U, 0x2C855CB2U, 0xDEEEDFB1U,
79                 0xCDBE2C45U, 0x3FD5AF46U, 0x7198540DU, 0x83F3D70EU, 0x90A324FAU,
80                 0x62C8A7F9U, 0xB602C312U, 0x44694011U, 0x5739B3E5U, 0xA55230E6U,
81                 0xFB410CC2U, 0x092A8FC1U, 0x1A7A7C35U, 0xE811FF36U, 0x3CDB9BDDU,
82                 0xCEB018DEU, 0xDDE0EB2AU, 0x2F8B6829U, 0x82F63B78U, 0x709DB87BU,
83                 0x63CD4B8FU, 0x91A6C88CU, 0x456CAC67U, 0xB7072F64U, 0xA457DC90U,
84                 0x563C5F93U, 0x082F63B7U, 0xFA44E0B4U, 0xE9141340U, 0x1B7F9043U,
85                 0xCFB5F4A8U, 0x3DDE77ABU, 0x2E8E845FU, 0xDCE5075CU, 0x92A8FC17U,
86                 0x60C37F14U, 0x73938CE0U, 0x81F80FE3U, 0x55326B08U, 0xA759E80BU,
87                 0xB4091BFFU, 0x466298FCU, 0x1871A4D8U, 0xEA1A27DBU, 0xF94AD42FU,
88                 0x0B21572CU, 0xDFEB33C7U, 0x2D80B0C4U, 0x3ED04330U, 0xCCBBC033U,
89                 0xA24BB5A6U, 0x502036A5U, 0x4370C551U, 0xB11B4652U, 0x65D122B9U,
90                 0x97BAA1BAU, 0x84EA524EU, 0x7681D14DU, 0x2892ED69U, 0xDAF96E6AU,
91                 0xC9A99D9EU, 0x3BC21E9DU, 0xEF087A76U, 0x1D63F975U, 0x0E330A81U,
92                 0xFC588982U, 0xB21572C9U, 0x407EF1CAU, 0x532E023EU, 0xA145813DU,
93                 0x758FE5D6U, 0x87E466D5U, 0x94B49521U, 0x66DF1622U, 0x38CC2A06U,
94                 0xCAA7A905U, 0xD9F75AF1U, 0x2B9CD9F2U, 0xFF56BD19U, 0x0D3D3E1AU,
95                 0x1E6DCDEEU, 0xEC064EEDU, 0xC38D26C4U, 0x31E6A5C7U, 0x22B65633U,
96                 0xD0DDD530U, 0x0417B1DBU, 0xF67C32D8U, 0xE52CC12CU, 0x1747422FU,
97                 0x49547E0BU, 0xBB3FFD08U, 0xA86F0EFCU, 0x5A048DFFU, 0x8ECEE914U,
98                 0x7CA56A17U, 0x6FF599E3U, 0x9D9E1AE0U, 0xD3D3E1ABU, 0x21B862A8U,
99                 0x32E8915CU, 0xC083125FU, 0x144976B4U, 0xE622F5B7U, 0xF5720643U,
100                 0x07198540U, 0x590AB964U, 0xAB613A67U, 0xB831C993U, 0x4A5A4A90U,
101                 0x9E902E7BU, 0x6CFBAD78U, 0x7FAB5E8CU, 0x8DC0DD8FU, 0xE330A81AU,
102                 0x115B2B19U, 0x020BD8EDU, 0xF0605BEEU, 0x24AA3F05U, 0xD6C1BC06U,
103                 0xC5914FF2U, 0x37FACCF1U, 0x69E9F0D5U, 0x9B8273D6U, 0x88D28022U,
104                 0x7AB90321U, 0xAE7367CAU, 0x5C18E4C9U, 0x4F48173DU, 0xBD23943EU,
105                 0xF36E6F75U, 0x0105EC76U, 0x12551F82U, 0xE03E9C81U, 0x34F4F86AU,
106                 0xC69F7B69U, 0xD5CF889DU, 0x27A40B9EU, 0x79B737BAU, 0x8BDCB4B9U,
107                 0x988C474DU, 0x6AE7C44EU, 0xBE2DA0A5U, 0x4C4623A6U, 0x5F16D052U,
108                 0xAD7D5351U };
109
110 /*
111  * Table for the AUTODIN/HDLC/802.x CRC.
112  *
113  * Polynomial is
114  *
115  *  x^32 + x^26 + x^23 + x^22 + x^16 + x^12 + x^11 + x^10 + x^8 +
116  *      x^7 + x^5 + x^4 + x^2 + x + 1
117  */
118 static const guint32 crc32_ccitt_table[256] = {
119         0x00000000, 0x77073096, 0xee0e612c, 0x990951ba, 0x076dc419,
120         0x706af48f, 0xe963a535, 0x9e6495a3, 0x0edb8832, 0x79dcb8a4,
121         0xe0d5e91e, 0x97d2d988, 0x09b64c2b, 0x7eb17cbd, 0xe7b82d07,
122         0x90bf1d91, 0x1db71064, 0x6ab020f2, 0xf3b97148, 0x84be41de,
123         0x1adad47d, 0x6ddde4eb, 0xf4d4b551, 0x83d385c7, 0x136c9856,
124         0x646ba8c0, 0xfd62f97a, 0x8a65c9ec, 0x14015c4f, 0x63066cd9,
125         0xfa0f3d63, 0x8d080df5, 0x3b6e20c8, 0x4c69105e, 0xd56041e4,
126         0xa2677172, 0x3c03e4d1, 0x4b04d447, 0xd20d85fd, 0xa50ab56b,
127         0x35b5a8fa, 0x42b2986c, 0xdbbbc9d6, 0xacbcf940, 0x32d86ce3,
128         0x45df5c75, 0xdcd60dcf, 0xabd13d59, 0x26d930ac, 0x51de003a,
129         0xc8d75180, 0xbfd06116, 0x21b4f4b5, 0x56b3c423, 0xcfba9599,
130         0xb8bda50f, 0x2802b89e, 0x5f058808, 0xc60cd9b2, 0xb10be924,
131         0x2f6f7c87, 0x58684c11, 0xc1611dab, 0xb6662d3d, 0x76dc4190,
132         0x01db7106, 0x98d220bc, 0xefd5102a, 0x71b18589, 0x06b6b51f,
133         0x9fbfe4a5, 0xe8b8d433, 0x7807c9a2, 0x0f00f934, 0x9609a88e,
134         0xe10e9818, 0x7f6a0dbb, 0x086d3d2d, 0x91646c97, 0xe6635c01,
135         0x6b6b51f4, 0x1c6c6162, 0x856530d8, 0xf262004e, 0x6c0695ed,
136         0x1b01a57b, 0x8208f4c1, 0xf50fc457, 0x65b0d9c6, 0x12b7e950,
137         0x8bbeb8ea, 0xfcb9887c, 0x62dd1ddf, 0x15da2d49, 0x8cd37cf3,
138         0xfbd44c65, 0x4db26158, 0x3ab551ce, 0xa3bc0074, 0xd4bb30e2,
139         0x4adfa541, 0x3dd895d7, 0xa4d1c46d, 0xd3d6f4fb, 0x4369e96a,
140         0x346ed9fc, 0xad678846, 0xda60b8d0, 0x44042d73, 0x33031de5,
141         0xaa0a4c5f, 0xdd0d7cc9, 0x5005713c, 0x270241aa, 0xbe0b1010,
142         0xc90c2086, 0x5768b525, 0x206f85b3, 0xb966d409, 0xce61e49f,
143         0x5edef90e, 0x29d9c998, 0xb0d09822, 0xc7d7a8b4, 0x59b33d17,
144         0x2eb40d81, 0xb7bd5c3b, 0xc0ba6cad, 0xedb88320, 0x9abfb3b6,
145         0x03b6e20c, 0x74b1d29a, 0xead54739, 0x9dd277af, 0x04db2615,
146         0x73dc1683, 0xe3630b12, 0x94643b84, 0x0d6d6a3e, 0x7a6a5aa8,
147         0xe40ecf0b, 0x9309ff9d, 0x0a00ae27, 0x7d079eb1, 0xf00f9344,
148         0x8708a3d2, 0x1e01f268, 0x6906c2fe, 0xf762575d, 0x806567cb,
149         0x196c3671, 0x6e6b06e7, 0xfed41b76, 0x89d32be0, 0x10da7a5a,
150         0x67dd4acc, 0xf9b9df6f, 0x8ebeeff9, 0x17b7be43, 0x60b08ed5,
151         0xd6d6a3e8, 0xa1d1937e, 0x38d8c2c4, 0x4fdff252, 0xd1bb67f1,
152         0xa6bc5767, 0x3fb506dd, 0x48b2364b, 0xd80d2bda, 0xaf0a1b4c,
153         0x36034af6, 0x41047a60, 0xdf60efc3, 0xa867df55, 0x316e8eef,
154         0x4669be79, 0xcb61b38c, 0xbc66831a, 0x256fd2a0, 0x5268e236,
155         0xcc0c7795, 0xbb0b4703, 0x220216b9, 0x5505262f, 0xc5ba3bbe,
156         0xb2bd0b28, 0x2bb45a92, 0x5cb36a04, 0xc2d7ffa7, 0xb5d0cf31,
157         0x2cd99e8b, 0x5bdeae1d, 0x9b64c2b0, 0xec63f226, 0x756aa39c,
158         0x026d930a, 0x9c0906a9, 0xeb0e363f, 0x72076785, 0x05005713,
159         0x95bf4a82, 0xe2b87a14, 0x7bb12bae, 0x0cb61b38, 0x92d28e9b,
160         0xe5d5be0d, 0x7cdcefb7, 0x0bdbdf21, 0x86d3d2d4, 0xf1d4e242,
161         0x68ddb3f8, 0x1fda836e, 0x81be16cd, 0xf6b9265b, 0x6fb077e1,
162         0x18b74777, 0x88085ae6, 0xff0f6a70, 0x66063bca, 0x11010b5c,
163         0x8f659eff, 0xf862ae69, 0x616bffd3, 0x166ccf45, 0xa00ae278,
164         0xd70dd2ee, 0x4e048354, 0x3903b3c2, 0xa7672661, 0xd06016f7,
165         0x4969474d, 0x3e6e77db, 0xaed16a4a, 0xd9d65adc, 0x40df0b66,
166         0x37d83bf0, 0xa9bcae53, 0xdebb9ec5, 0x47b2cf7f, 0x30b5ffe9,
167         0xbdbdf21c, 0xcabac28a, 0x53b39330, 0x24b4a3a6, 0xbad03605,
168         0xcdd70693, 0x54de5729, 0x23d967bf, 0xb3667a2e, 0xc4614ab8,
169         0x5d681b02, 0x2a6f2b94, 0xb40bbe37, 0xc30c8ea1, 0x5a05df1b,
170         0x2d02ef8d
171 };
172
173 /*
174  * Table for the MPEG-2 CRC.
175  *
176  * Polynomial is
177  *
178  *  x^32 + x^26 + x^23 + x^22 + x^16 + x^12 + x^11 + x^10 + x^8 +
179  *      x^7 + x^5 + x^4 + x^2 + x + 1
180  *
181  * (which is the same polynomial as the one above us).
182  */
183 static const guint32 crc32_mpeg2_table[256] = {
184                 0x00000000, 0x04c11db7, 0x09823b6e, 0x0d4326d9, 0x130476dc, 0x17c56b6b,
185                 0x1a864db2, 0x1e475005, 0x2608edb8, 0x22c9f00f, 0x2f8ad6d6, 0x2b4bcb61,
186                 0x350c9b64, 0x31cd86d3, 0x3c8ea00a, 0x384fbdbd, 0x4c11db70, 0x48d0c6c7,
187                 0x4593e01e, 0x4152fda9, 0x5f15adac, 0x5bd4b01b, 0x569796c2, 0x52568b75,
188                 0x6a1936c8, 0x6ed82b7f, 0x639b0da6, 0x675a1011, 0x791d4014, 0x7ddc5da3,
189                 0x709f7b7a, 0x745e66cd, 0x9823b6e0, 0x9ce2ab57, 0x91a18d8e, 0x95609039,
190                 0x8b27c03c, 0x8fe6dd8b, 0x82a5fb52, 0x8664e6e5, 0xbe2b5b58, 0xbaea46ef,
191                 0xb7a96036, 0xb3687d81, 0xad2f2d84, 0xa9ee3033, 0xa4ad16ea, 0xa06c0b5d,
192                 0xd4326d90, 0xd0f37027, 0xddb056fe, 0xd9714b49, 0xc7361b4c, 0xc3f706fb,
193                 0xceb42022, 0xca753d95, 0xf23a8028, 0xf6fb9d9f, 0xfbb8bb46, 0xff79a6f1,
194                 0xe13ef6f4, 0xe5ffeb43, 0xe8bccd9a, 0xec7dd02d, 0x34867077, 0x30476dc0,
195                 0x3d044b19, 0x39c556ae, 0x278206ab, 0x23431b1c, 0x2e003dc5, 0x2ac12072,
196                 0x128e9dcf, 0x164f8078, 0x1b0ca6a1, 0x1fcdbb16, 0x018aeb13, 0x054bf6a4,
197                 0x0808d07d, 0x0cc9cdca, 0x7897ab07, 0x7c56b6b0, 0x71159069, 0x75d48dde,
198                 0x6b93dddb, 0x6f52c06c, 0x6211e6b5, 0x66d0fb02, 0x5e9f46bf, 0x5a5e5b08,
199                 0x571d7dd1, 0x53dc6066, 0x4d9b3063, 0x495a2dd4, 0x44190b0d, 0x40d816ba,
200                 0xaca5c697, 0xa864db20, 0xa527fdf9, 0xa1e6e04e, 0xbfa1b04b, 0xbb60adfc,
201                 0xb6238b25, 0xb2e29692, 0x8aad2b2f, 0x8e6c3698, 0x832f1041, 0x87ee0df6,
202                 0x99a95df3, 0x9d684044, 0x902b669d, 0x94ea7b2a, 0xe0b41de7, 0xe4750050,
203                 0xe9362689, 0xedf73b3e, 0xf3b06b3b, 0xf771768c, 0xfa325055, 0xfef34de2,
204                 0xc6bcf05f, 0xc27dede8, 0xcf3ecb31, 0xcbffd686, 0xd5b88683, 0xd1799b34,
205                 0xdc3abded, 0xd8fba05a, 0x690ce0ee, 0x6dcdfd59, 0x608edb80, 0x644fc637,
206                 0x7a089632, 0x7ec98b85, 0x738aad5c, 0x774bb0eb, 0x4f040d56, 0x4bc510e1,
207                 0x46863638, 0x42472b8f, 0x5c007b8a, 0x58c1663d, 0x558240e4, 0x51435d53,
208                 0x251d3b9e, 0x21dc2629, 0x2c9f00f0, 0x285e1d47, 0x36194d42, 0x32d850f5,
209                 0x3f9b762c, 0x3b5a6b9b, 0x0315d626, 0x07d4cb91, 0x0a97ed48, 0x0e56f0ff,
210                 0x1011a0fa, 0x14d0bd4d, 0x19939b94, 0x1d528623, 0xf12f560e, 0xf5ee4bb9,
211                 0xf8ad6d60, 0xfc6c70d7, 0xe22b20d2, 0xe6ea3d65, 0xeba91bbc, 0xef68060b,
212                 0xd727bbb6, 0xd3e6a601, 0xdea580d8, 0xda649d6f, 0xc423cd6a, 0xc0e2d0dd,
213                 0xcda1f604, 0xc960ebb3, 0xbd3e8d7e, 0xb9ff90c9, 0xb4bcb610, 0xb07daba7,
214                 0xae3afba2, 0xaafbe615, 0xa7b8c0cc, 0xa379dd7b, 0x9b3660c6, 0x9ff77d71,
215                 0x92b45ba8, 0x9675461f, 0x8832161a, 0x8cf30bad, 0x81b02d74, 0x857130c3,
216                 0x5d8a9099, 0x594b8d2e, 0x5408abf7, 0x50c9b640, 0x4e8ee645, 0x4a4ffbf2,
217                 0x470cdd2b, 0x43cdc09c, 0x7b827d21, 0x7f436096, 0x7200464f, 0x76c15bf8,
218                 0x68860bfd, 0x6c47164a, 0x61043093, 0x65c52d24, 0x119b4be9, 0x155a565e,
219                 0x18197087, 0x1cd86d30, 0x029f3d35, 0x065e2082, 0x0b1d065b, 0x0fdc1bec,
220                 0x3793a651, 0x3352bbe6, 0x3e119d3f, 0x3ad08088, 0x2497d08d, 0x2056cd3a,
221                 0x2d15ebe3, 0x29d4f654, 0xc5a92679, 0xc1683bce, 0xcc2b1d17, 0xc8ea00a0,
222                 0xd6ad50a5, 0xd26c4d12, 0xdf2f6bcb, 0xdbee767c, 0xe3a1cbc1, 0xe760d676,
223                 0xea23f0af, 0xeee2ed18, 0xf0a5bd1d, 0xf464a0aa, 0xf9278673, 0xfde69bc4,
224                 0x89b8fd09, 0x8d79e0be, 0x803ac667, 0x84fbdbd0, 0x9abc8bd5, 0x9e7d9662,
225                 0x933eb0bb, 0x97ffad0c, 0xafb010b1, 0xab710d06, 0xa6322bdf, 0xa2f33668,
226                 0xbcb4666d, 0xb8757bda, 0xb5365d03, 0xb1f740b4
227 };
228
229 /* This table was compiled using the polynom: 0x0AA725CF*/
230 static const guint32 crc32_0AA725CF_reverse[] = {
231                 0x00000000U, 0xCEAA95CEU, 0x7A1CE13DU, 0xB4B674F3U,
232                 0xF439C27AU, 0x3A9357B4U, 0x8E252347U, 0x408FB689U,
233                 0x0F3A4E55U, 0xC190DB9BU, 0x7526AF68U, 0xBB8C3AA6U,
234                 0xFB038C2FU, 0x35A919E1U, 0x811F6D12U, 0x4FB5F8DCU,
235                 0x1E749CAAU, 0xD0DE0964U, 0x64687D97U, 0xAAC2E859U,
236                 0xEA4D5ED0U, 0x24E7CB1EU, 0x9051BFEDU, 0x5EFB2A23U,
237                 0x114ED2FFU, 0xDFE44731U, 0x6B5233C2U, 0xA5F8A60CU,
238                 0xE5771085U, 0x2BDD854BU, 0x9F6BF1B8U, 0x51C16476U,
239                 0x3CE93954U, 0xF243AC9AU, 0x46F5D869U, 0x885F4DA7U,
240                 0xC8D0FB2EU, 0x067A6EE0U, 0xB2CC1A13U, 0x7C668FDDU,
241                 0x33D37701U, 0xFD79E2CFU, 0x49CF963CU, 0x876503F2U,
242                 0xC7EAB57BU, 0x094020B5U, 0xBDF65446U, 0x735CC188U,
243                 0x229DA5FEU, 0xEC373030U, 0x588144C3U, 0x962BD10DU,
244                 0xD6A46784U, 0x180EF24AU, 0xACB886B9U, 0x62121377U,
245                 0x2DA7EBABU, 0xE30D7E65U, 0x57BB0A96U, 0x99119F58U,
246                 0xD99E29D1U, 0x1734BC1FU, 0xA382C8ECU, 0x6D285D22U,
247                 0x79D272A8U, 0xB778E766U, 0x03CE9395U, 0xCD64065BU,
248                 0x8DEBB0D2U, 0x4341251CU, 0xF7F751EFU, 0x395DC421U,
249                 0x76E83CFDU, 0xB842A933U, 0x0CF4DDC0U, 0xC25E480EU,
250                 0x82D1FE87U, 0x4C7B6B49U, 0xF8CD1FBAU, 0x36678A74U,
251                 0x67A6EE02U, 0xA90C7BCCU, 0x1DBA0F3FU, 0xD3109AF1U,
252                 0x939F2C78U, 0x5D35B9B6U, 0xE983CD45U, 0x2729588BU,
253                 0x689CA057U, 0xA6363599U, 0x1280416AU, 0xDC2AD4A4U,
254                 0x9CA5622DU, 0x520FF7E3U, 0xE6B98310U, 0x281316DEU,
255                 0x453B4BFCU, 0x8B91DE32U, 0x3F27AAC1U, 0xF18D3F0FU,
256                 0xB1028986U, 0x7FA81C48U, 0xCB1E68BBU, 0x05B4FD75U,
257                 0x4A0105A9U, 0x84AB9067U, 0x301DE494U, 0xFEB7715AU,
258                 0xBE38C7D3U, 0x7092521DU, 0xC42426EEU, 0x0A8EB320U,
259                 0x5B4FD756U, 0x95E54298U, 0x2153366BU, 0xEFF9A3A5U,
260                 0xAF76152CU, 0x61DC80E2U, 0xD56AF411U, 0x1BC061DFU,
261                 0x54759903U, 0x9ADF0CCDU, 0x2E69783EU, 0xE0C3EDF0U,
262                 0xA04C5B79U, 0x6EE6CEB7U, 0xDA50BA44U, 0x14FA2F8AU,
263                 0xF3A4E550U, 0x3D0E709EU, 0x89B8046DU, 0x471291A3U,
264                 0x079D272AU, 0xC937B2E4U, 0x7D81C617U, 0xB32B53D9U,
265                 0xFC9EAB05U, 0x32343ECBU, 0x86824A38U, 0x4828DFF6U,
266                 0x08A7697FU, 0xC60DFCB1U, 0x72BB8842U, 0xBC111D8CU,
267                 0xEDD079FAU, 0x237AEC34U, 0x97CC98C7U, 0x59660D09U,
268                 0x19E9BB80U, 0xD7432E4EU, 0x63F55ABDU, 0xAD5FCF73U,
269                 0xE2EA37AFU, 0x2C40A261U, 0x98F6D692U, 0x565C435CU,
270                 0x16D3F5D5U, 0xD879601BU, 0x6CCF14E8U, 0xA2658126U,
271                 0xCF4DDC04U, 0x01E749CAU, 0xB5513D39U, 0x7BFBA8F7U,
272                 0x3B741E7EU, 0xF5DE8BB0U, 0x4168FF43U, 0x8FC26A8DU,
273                 0xC0779251U, 0x0EDD079FU, 0xBA6B736CU, 0x74C1E6A2U,
274                 0x344E502BU, 0xFAE4C5E5U, 0x4E52B116U, 0x80F824D8U,
275                 0xD13940AEU, 0x1F93D560U, 0xAB25A193U, 0x658F345DU,
276                 0x250082D4U, 0xEBAA171AU, 0x5F1C63E9U, 0x91B6F627U,
277                 0xDE030EFBU, 0x10A99B35U, 0xA41FEFC6U, 0x6AB57A08U,
278                 0x2A3ACC81U, 0xE490594FU, 0x50262DBCU, 0x9E8CB872U,
279                 0x8A7697F8U, 0x44DC0236U, 0xF06A76C5U, 0x3EC0E30BU,
280                 0x7E4F5582U, 0xB0E5C04CU, 0x0453B4BFU, 0xCAF92171U,
281                 0x854CD9ADU, 0x4BE64C63U, 0xFF503890U, 0x31FAAD5EU,
282                 0x71751BD7U, 0xBFDF8E19U, 0x0B69FAEAU, 0xC5C36F24U,
283                 0x94020B52U, 0x5AA89E9CU, 0xEE1EEA6FU, 0x20B47FA1U,
284                 0x603BC928U, 0xAE915CE6U, 0x1A272815U, 0xD48DBDDBU,
285                 0x9B384507U, 0x5592D0C9U, 0xE124A43AU, 0x2F8E31F4U,
286                 0x6F01877DU, 0xA1AB12B3U, 0x151D6640U, 0xDBB7F38EU,
287                 0xB69FAEACU, 0x78353B62U, 0xCC834F91U, 0x0229DA5FU,
288                 0x42A66CD6U, 0x8C0CF918U, 0x38BA8DEBU, 0xF6101825U,
289                 0xB9A5E0F9U, 0x770F7537U, 0xC3B901C4U, 0x0D13940AU,
290                 0x4D9C2283U, 0x8336B74DU, 0x3780C3BEU, 0xF92A5670U,
291                 0xA8EB3206U, 0x6641A7C8U, 0xD2F7D33BU, 0x1C5D46F5U,
292                 0x5CD2F07CU, 0x927865B2U, 0x26CE1141U, 0xE864848FU,
293                 0xA7D17C53U, 0x697BE99DU, 0xDDCD9D6EU, 0x136708A0U,
294                 0x53E8BE29U, 0x9D422BE7U, 0x29F45F14U, 0xE75ECADAU
295 };
296
297 guint32
298 crc32c_table_lookup (guchar pos)
299 {
300         return crc32c_table[pos];
301 }
302
303 guint32
304 crc32_ccitt_table_lookup (guchar pos)
305 {
306         return crc32_ccitt_table[pos];
307 }
308
309 guint32
310 crc32c_calculate(const void *buf, int len, guint32 crc)
311 {
312         const guint8 *p = (const guint8 *)buf;
313         crc = CRC32C_SWAP(crc);
314         while (len-- > 0) {
315                 CRC32C(crc, *p++);
316         }
317         return CRC32C_SWAP(crc);
318 }
319
320 guint32
321 crc32c_calculate_no_swap(const void *buf, int len, guint32 crc)
322 {
323         const guint8 *p = (const guint8 *)buf;
324         while (len-- > 0) {
325                 CRC32C(crc, *p++);
326         }
327
328         return crc;
329 }
330
331 guint32
332 crc32_ccitt(const guint8 *buf, guint len)
333 {
334         return (crc32_ccitt_seed(buf, len, CRC32_CCITT_SEED));
335 }
336
337 guint32
338 crc32_ccitt_seed(const guint8 *buf, guint len, guint32 seed)
339 {
340         guint i;
341         guint32 crc32 = seed;
342
343         for (i = 0; i < len; i++)
344                 CRC32_ACCUMULATE(crc32, buf[i], crc32_ccitt_table);
345
346         return ( ~crc32 );
347 }
348
349 guint32
350 crc32_mpeg2_seed(const guint8 *buf, guint len, guint32 seed)
351 {
352         guint i;
353         guint32 crc32;
354
355         crc32 = seed;
356
357         for (i = 0; i < len; i++)
358                 crc32 = (crc32 << 8) ^ crc32_mpeg2_table[((crc32 >> 24) ^ buf[i]) & 0xff];
359
360         return ( crc32 );
361 }
362
363 guint32
364 crc32_0x0AA725CF_seed(const guint8 *buf, guint len, guint32 seed)
365 {
366         guint crc32;
367
368         crc32 = (guint)seed;
369         while( len-- != 0 )
370                 CRC32_ACCUMULATE(crc32, *buf++, crc32_0AA725CF_reverse);
371
372         return (guint32)crc32;
373 }
374
375 /*
376  * Editor modelines  -  http://www.wireshark.org/tools/modelines.html
377  *
378  * Local variables:
379  * c-basic-offset: 8
380  * tab-width: 8
381  * indent-tabs-mode: t
382  * End:
383  *
384  * vi: set shiftwidth=8 tabstop=8 noexpandtab:
385  * :indentSize=8:tabSize=8:noTabs=false:
386  */