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