1 /**
2 r_crc32.c
3
4
5 Copyright (C) 2002-2003, Network Resonance, Inc.
6 Copyright (C) 2006, Network Resonance, Inc.
7 All Rights Reserved
8
9 Redistribution and use in source and binary forms, with or without
10 modification, are permitted provided that the following conditions
11 are met:
12
13 1. Redistributions of source code must retain the above copyright
14 notice, this list of conditions and the following disclaimer.
15 2. Redistributions in binary form must reproduce the above copyright
16 notice, this list of conditions and the following disclaimer in the
17 documentation and/or other materials provided with the distribution.
18 3. Neither the name of Network Resonance, Inc. nor the name of any
19 contributors to this software may be used to endorse or promote
20 products derived from this software without specific prior written
21 permission.
22
23 THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ``AS IS''
24 AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
25 IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
26 ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
27 LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
28 CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
29 SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
30 INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
31 CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
32 ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
33 POSSIBILITY OF SUCH DAMAGE.
34
35
36 */
37
38 /**
39 crc32.c
40
41 Copyright (C) 2003, RTFM, Inc.
42 All Rights Reserved.
43
44 ekr@rtfm.com Fri Jan 31 13:57:43 2003
45
46 THE FOLLOWING CODE WAS EXTRACTED FROM FreeBSD
47 The comment below was the original header
48
49 The main function was modified to process a buffer
50 rather than a file
51 */
52
53 /*
54 * This code implements the AUTODIN II polynomial used by Ethernet,
55 * and can be used to calculate multicast address hash indices.
56 * It assumes that the low order bits will be transmitted first,
57 * and consequently the low byte should be sent first when
58 * the crc computation is finished. The crc should be complemented
59 * before transmission.
60 * The variable corresponding to the macro argument "crc" should
61 * be an unsigned long and should be preset to all ones for Ethernet
62 * use. An error-free packet will leave 0xDEBB20E3 in the crc.
63 * Spencer Garrett <srg@quick.com>
64 */
65
66
67 #include <sys/types.h>
68 #include <r_types.h>
69
70 #ifdef WIN32
71 #define u_int32_t UINT4
72 #endif
73
74 #define CRC(crc, ch) (crc = (crc >> 8) ^ crctab[(crc ^ (ch)) & 0xff])
75
76 /* generated using the AUTODIN II polynomial
77 * x^32 + x^26 + x^23 + x^22 + x^16 +
78 * x^12 + x^11 + x^10 + x^8 + x^7 + x^5 + x^4 + x^2 + x^1 + 1
79 */
80 static const u_int32_t crctab[256] = {
81 0x00000000, 0x77073096, 0xee0e612c, 0x990951ba,
82 0x076dc419, 0x706af48f, 0xe963a535, 0x9e6495a3,
83 0x0edb8832, 0x79dcb8a4, 0xe0d5e91e, 0x97d2d988,
84 0x09b64c2b, 0x7eb17cbd, 0xe7b82d07, 0x90bf1d91,
85 0x1db71064, 0x6ab020f2, 0xf3b97148, 0x84be41de,
86 0x1adad47d, 0x6ddde4eb, 0xf4d4b551, 0x83d385c7,
87 0x136c9856, 0x646ba8c0, 0xfd62f97a, 0x8a65c9ec,
88 0x14015c4f, 0x63066cd9, 0xfa0f3d63, 0x8d080df5,
89 0x3b6e20c8, 0x4c69105e, 0xd56041e4, 0xa2677172,
90 0x3c03e4d1, 0x4b04d447, 0xd20d85fd, 0xa50ab56b,
91 0x35b5a8fa, 0x42b2986c, 0xdbbbc9d6, 0xacbcf940,
92 0x32d86ce3, 0x45df5c75, 0xdcd60dcf, 0xabd13d59,
93 0x26d930ac, 0x51de003a, 0xc8d75180, 0xbfd06116,
94 0x21b4f4b5, 0x56b3c423, 0xcfba9599, 0xb8bda50f,
95 0x2802b89e, 0x5f058808, 0xc60cd9b2, 0xb10be924,
96 0x2f6f7c87, 0x58684c11, 0xc1611dab, 0xb6662d3d,
97 0x76dc4190, 0x01db7106, 0x98d220bc, 0xefd5102a,
98 0x71b18589, 0x06b6b51f, 0x9fbfe4a5, 0xe8b8d433,
99 0x7807c9a2, 0x0f00f934, 0x9609a88e, 0xe10e9818,
100 0x7f6a0dbb, 0x086d3d2d, 0x91646c97, 0xe6635c01,
101 0x6b6b51f4, 0x1c6c6162, 0x856530d8, 0xf262004e,
102 0x6c0695ed, 0x1b01a57b, 0x8208f4c1, 0xf50fc457,
103 0x65b0d9c6, 0x12b7e950, 0x8bbeb8ea, 0xfcb9887c,
104 0x62dd1ddf, 0x15da2d49, 0x8cd37cf3, 0xfbd44c65,
105 0x4db26158, 0x3ab551ce, 0xa3bc0074, 0xd4bb30e2,
106 0x4adfa541, 0x3dd895d7, 0xa4d1c46d, 0xd3d6f4fb,
107 0x4369e96a, 0x346ed9fc, 0xad678846, 0xda60b8d0,
108 0x44042d73, 0x33031de5, 0xaa0a4c5f, 0xdd0d7cc9,
109 0x5005713c, 0x270241aa, 0xbe0b1010, 0xc90c2086,
110 0x5768b525, 0x206f85b3, 0xb966d409, 0xce61e49f,
111 0x5edef90e, 0x29d9c998, 0xb0d09822, 0xc7d7a8b4,
112 0x59b33d17, 0x2eb40d81, 0xb7bd5c3b, 0xc0ba6cad,
113 0xedb88320, 0x9abfb3b6, 0x03b6e20c, 0x74b1d29a,
114 0xead54739, 0x9dd277af, 0x04db2615, 0x73dc1683,
115 0xe3630b12, 0x94643b84, 0x0d6d6a3e, 0x7a6a5aa8,
116 0xe40ecf0b, 0x9309ff9d, 0x0a00ae27, 0x7d079eb1,
117 0xf00f9344, 0x8708a3d2, 0x1e01f268, 0x6906c2fe,
118 0xf762575d, 0x806567cb, 0x196c3671, 0x6e6b06e7,
119 0xfed41b76, 0x89d32be0, 0x10da7a5a, 0x67dd4acc,
120 0xf9b9df6f, 0x8ebeeff9, 0x17b7be43, 0x60b08ed5,
121 0xd6d6a3e8, 0xa1d1937e, 0x38d8c2c4, 0x4fdff252,
122 0xd1bb67f1, 0xa6bc5767, 0x3fb506dd, 0x48b2364b,
123 0xd80d2bda, 0xaf0a1b4c, 0x36034af6, 0x41047a60,
124 0xdf60efc3, 0xa867df55, 0x316e8eef, 0x4669be79,
125 0xcb61b38c, 0xbc66831a, 0x256fd2a0, 0x5268e236,
126 0xcc0c7795, 0xbb0b4703, 0x220216b9, 0x5505262f,
127 0xc5ba3bbe, 0xb2bd0b28, 0x2bb45a92, 0x5cb36a04,
128 0xc2d7ffa7, 0xb5d0cf31, 0x2cd99e8b, 0x5bdeae1d,
129 0x9b64c2b0, 0xec63f226, 0x756aa39c, 0x026d930a,
130 0x9c0906a9, 0xeb0e363f, 0x72076785, 0x05005713,
131 0x95bf4a82, 0xe2b87a14, 0x7bb12bae, 0x0cb61b38,
132 0x92d28e9b, 0xe5d5be0d, 0x7cdcefb7, 0x0bdbdf21,
133 0x86d3d2d4, 0xf1d4e242, 0x68ddb3f8, 0x1fda836e,
134 0x81be16cd, 0xf6b9265b, 0x6fb077e1, 0x18b74777,
135 0x88085ae6, 0xff0f6a70, 0x66063bca, 0x11010b5c,
136 0x8f659eff, 0xf862ae69, 0x616bffd3, 0x166ccf45,
137 0xa00ae278, 0xd70dd2ee, 0x4e048354, 0x3903b3c2,
138 0xa7672661, 0xd06016f7, 0x4969474d, 0x3e6e77db,
139 0xaed16a4a, 0xd9d65adc, 0x40df0b66, 0x37d83bf0,
140 0xa9bcae53, 0xdebb9ec5, 0x47b2cf7f, 0x30b5ffe9,
141 0xbdbdf21c, 0xcabac28a, 0x53b39330, 0x24b4a3a6,
142 0xbad03605, 0xcdd70693, 0x54de5729, 0x23d967bf,
143 0xb3667a2e, 0xc4614ab8, 0x5d681b02, 0x2a6f2b94,
144 0xb40bbe37, 0xc30c8ea1, 0x5a05df1b, 0x2d02ef8d,
145 };
146
147 #include <stdio.h>
148 #include <sys/types.h>
149
150
151 int r_crc32 (char *buf,int dlen,u_int32_t *cval);
152
153 int
r_crc32(buf,dlen,cval)154 r_crc32(buf, dlen, cval)
155 char *buf;
156 int dlen;
157 u_int32_t *cval;
158 {
159 u_int32_t crc = ~0;
160 char *p ;
161 int i;
162 u_int32_t crc32_total = 0 ;
163
164 p=buf;
165
166 for(i=0;i<dlen;i++){
167 CRC(crc, *p) ;
168 CRC(crc32_total, *p) ;
169 p++;
170 }
171
172 *cval = ~crc ;
173
174 return 0 ;
175 }
176