crc.c revision 1.1.1.1.4.2 1 1.1.1.1.4.2 rmind /* $NetBSD: crc.c,v 1.1.1.1.4.2 2014/05/18 17:46:03 rmind Exp $ */
2 1.1.1.1.4.2 rmind
3 1.1.1.1.4.2 rmind /*++
4 1.1.1.1.4.2 rmind
5 1.1.1.1.4.2 rmind Copyright (c) 1998 Intel Corporation
6 1.1.1.1.4.2 rmind
7 1.1.1.1.4.2 rmind Module Name:
8 1.1.1.1.4.2 rmind
9 1.1.1.1.4.2 rmind crc.c
10 1.1.1.1.4.2 rmind
11 1.1.1.1.4.2 rmind Abstract:
12 1.1.1.1.4.2 rmind
13 1.1.1.1.4.2 rmind CRC32 functions
14 1.1.1.1.4.2 rmind
15 1.1.1.1.4.2 rmind
16 1.1.1.1.4.2 rmind
17 1.1.1.1.4.2 rmind Revision History
18 1.1.1.1.4.2 rmind
19 1.1.1.1.4.2 rmind --*/
20 1.1.1.1.4.2 rmind
21 1.1.1.1.4.2 rmind #include "lib.h"
22 1.1.1.1.4.2 rmind
23 1.1.1.1.4.2 rmind
24 1.1.1.1.4.2 rmind UINT32 CRCTable[256] = {
25 1.1.1.1.4.2 rmind 0x00000000, 0x77073096, 0xEE0E612C, 0x990951BA, 0x076DC419, 0x706AF48F,
26 1.1.1.1.4.2 rmind 0xE963A535, 0x9E6495A3, 0x0EDB8832, 0x79DCB8A4, 0xE0D5E91E, 0x97D2D988,
27 1.1.1.1.4.2 rmind 0x09B64C2B, 0x7EB17CBD, 0xE7B82D07, 0x90BF1D91, 0x1DB71064, 0x6AB020F2,
28 1.1.1.1.4.2 rmind 0xF3B97148, 0x84BE41DE, 0x1ADAD47D, 0x6DDDE4EB, 0xF4D4B551, 0x83D385C7,
29 1.1.1.1.4.2 rmind 0x136C9856, 0x646BA8C0, 0xFD62F97A, 0x8A65C9EC, 0x14015C4F, 0x63066CD9,
30 1.1.1.1.4.2 rmind 0xFA0F3D63, 0x8D080DF5, 0x3B6E20C8, 0x4C69105E, 0xD56041E4, 0xA2677172,
31 1.1.1.1.4.2 rmind 0x3C03E4D1, 0x4B04D447, 0xD20D85FD, 0xA50AB56B, 0x35B5A8FA, 0x42B2986C,
32 1.1.1.1.4.2 rmind 0xDBBBC9D6, 0xACBCF940, 0x32D86CE3, 0x45DF5C75, 0xDCD60DCF, 0xABD13D59,
33 1.1.1.1.4.2 rmind 0x26D930AC, 0x51DE003A, 0xC8D75180, 0xBFD06116, 0x21B4F4B5, 0x56B3C423,
34 1.1.1.1.4.2 rmind 0xCFBA9599, 0xB8BDA50F, 0x2802B89E, 0x5F058808, 0xC60CD9B2, 0xB10BE924,
35 1.1.1.1.4.2 rmind 0x2F6F7C87, 0x58684C11, 0xC1611DAB, 0xB6662D3D, 0x76DC4190, 0x01DB7106,
36 1.1.1.1.4.2 rmind 0x98D220BC, 0xEFD5102A, 0x71B18589, 0x06B6B51F, 0x9FBFE4A5, 0xE8B8D433,
37 1.1.1.1.4.2 rmind 0x7807C9A2, 0x0F00F934, 0x9609A88E, 0xE10E9818, 0x7F6A0DBB, 0x086D3D2D,
38 1.1.1.1.4.2 rmind 0x91646C97, 0xE6635C01, 0x6B6B51F4, 0x1C6C6162, 0x856530D8, 0xF262004E,
39 1.1.1.1.4.2 rmind 0x6C0695ED, 0x1B01A57B, 0x8208F4C1, 0xF50FC457, 0x65B0D9C6, 0x12B7E950,
40 1.1.1.1.4.2 rmind 0x8BBEB8EA, 0xFCB9887C, 0x62DD1DDF, 0x15DA2D49, 0x8CD37CF3, 0xFBD44C65,
41 1.1.1.1.4.2 rmind 0x4DB26158, 0x3AB551CE, 0xA3BC0074, 0xD4BB30E2, 0x4ADFA541, 0x3DD895D7,
42 1.1.1.1.4.2 rmind 0xA4D1C46D, 0xD3D6F4FB, 0x4369E96A, 0x346ED9FC, 0xAD678846, 0xDA60B8D0,
43 1.1.1.1.4.2 rmind 0x44042D73, 0x33031DE5, 0xAA0A4C5F, 0xDD0D7CC9, 0x5005713C, 0x270241AA,
44 1.1.1.1.4.2 rmind 0xBE0B1010, 0xC90C2086, 0x5768B525, 0x206F85B3, 0xB966D409, 0xCE61E49F,
45 1.1.1.1.4.2 rmind 0x5EDEF90E, 0x29D9C998, 0xB0D09822, 0xC7D7A8B4, 0x59B33D17, 0x2EB40D81,
46 1.1.1.1.4.2 rmind 0xB7BD5C3B, 0xC0BA6CAD, 0xEDB88320, 0x9ABFB3B6, 0x03B6E20C, 0x74B1D29A,
47 1.1.1.1.4.2 rmind 0xEAD54739, 0x9DD277AF, 0x04DB2615, 0x73DC1683, 0xE3630B12, 0x94643B84,
48 1.1.1.1.4.2 rmind 0x0D6D6A3E, 0x7A6A5AA8, 0xE40ECF0B, 0x9309FF9D, 0x0A00AE27, 0x7D079EB1,
49 1.1.1.1.4.2 rmind 0xF00F9344, 0x8708A3D2, 0x1E01F268, 0x6906C2FE, 0xF762575D, 0x806567CB,
50 1.1.1.1.4.2 rmind 0x196C3671, 0x6E6B06E7, 0xFED41B76, 0x89D32BE0, 0x10DA7A5A, 0x67DD4ACC,
51 1.1.1.1.4.2 rmind 0xF9B9DF6F, 0x8EBEEFF9, 0x17B7BE43, 0x60B08ED5, 0xD6D6A3E8, 0xA1D1937E,
52 1.1.1.1.4.2 rmind 0x38D8C2C4, 0x4FDFF252, 0xD1BB67F1, 0xA6BC5767, 0x3FB506DD, 0x48B2364B,
53 1.1.1.1.4.2 rmind 0xD80D2BDA, 0xAF0A1B4C, 0x36034AF6, 0x41047A60, 0xDF60EFC3, 0xA867DF55,
54 1.1.1.1.4.2 rmind 0x316E8EEF, 0x4669BE79, 0xCB61B38C, 0xBC66831A, 0x256FD2A0, 0x5268E236,
55 1.1.1.1.4.2 rmind 0xCC0C7795, 0xBB0B4703, 0x220216B9, 0x5505262F, 0xC5BA3BBE, 0xB2BD0B28,
56 1.1.1.1.4.2 rmind 0x2BB45A92, 0x5CB36A04, 0xC2D7FFA7, 0xB5D0CF31, 0x2CD99E8B, 0x5BDEAE1D,
57 1.1.1.1.4.2 rmind 0x9B64C2B0, 0xEC63F226, 0x756AA39C, 0x026D930A, 0x9C0906A9, 0xEB0E363F,
58 1.1.1.1.4.2 rmind 0x72076785, 0x05005713, 0x95BF4A82, 0xE2B87A14, 0x7BB12BAE, 0x0CB61B38,
59 1.1.1.1.4.2 rmind 0x92D28E9B, 0xE5D5BE0D, 0x7CDCEFB7, 0x0BDBDF21, 0x86D3D2D4, 0xF1D4E242,
60 1.1.1.1.4.2 rmind 0x68DDB3F8, 0x1FDA836E, 0x81BE16CD, 0xF6B9265B, 0x6FB077E1, 0x18B74777,
61 1.1.1.1.4.2 rmind 0x88085AE6, 0xFF0F6A70, 0x66063BCA, 0x11010B5C, 0x8F659EFF, 0xF862AE69,
62 1.1.1.1.4.2 rmind 0x616BFFD3, 0x166CCF45, 0xA00AE278, 0xD70DD2EE, 0x4E048354, 0x3903B3C2,
63 1.1.1.1.4.2 rmind 0xA7672661, 0xD06016F7, 0x4969474D, 0x3E6E77DB, 0xAED16A4A, 0xD9D65ADC,
64 1.1.1.1.4.2 rmind 0x40DF0B66, 0x37D83BF0, 0xA9BCAE53, 0xDEBB9EC5, 0x47B2CF7F, 0x30B5FFE9,
65 1.1.1.1.4.2 rmind 0xBDBDF21C, 0xCABAC28A, 0x53B39330, 0x24B4A3A6, 0xBAD03605, 0xCDD70693,
66 1.1.1.1.4.2 rmind 0x54DE5729, 0x23D967BF, 0xB3667A2E, 0xC4614AB8, 0x5D681B02, 0x2A6F2B94,
67 1.1.1.1.4.2 rmind 0xB40BBE37, 0xC30C8EA1, 0x5A05DF1B, 0x2D02EF8D
68 1.1.1.1.4.2 rmind };
69 1.1.1.1.4.2 rmind
70 1.1.1.1.4.2 rmind
71 1.1.1.1.4.2 rmind
72 1.1.1.1.4.2 rmind VOID
73 1.1.1.1.4.2 rmind SetCrc (
74 1.1.1.1.4.2 rmind IN OUT EFI_TABLE_HEADER *Hdr
75 1.1.1.1.4.2 rmind )
76 1.1.1.1.4.2 rmind /*++
77 1.1.1.1.4.2 rmind
78 1.1.1.1.4.2 rmind Routine Description:
79 1.1.1.1.4.2 rmind
80 1.1.1.1.4.2 rmind Updates the CRC32 value in the table header
81 1.1.1.1.4.2 rmind
82 1.1.1.1.4.2 rmind Arguments:
83 1.1.1.1.4.2 rmind
84 1.1.1.1.4.2 rmind Hdr - The table to update
85 1.1.1.1.4.2 rmind
86 1.1.1.1.4.2 rmind Returns:
87 1.1.1.1.4.2 rmind
88 1.1.1.1.4.2 rmind None
89 1.1.1.1.4.2 rmind
90 1.1.1.1.4.2 rmind --*/
91 1.1.1.1.4.2 rmind {
92 1.1.1.1.4.2 rmind SetCrcAltSize (Hdr->HeaderSize, Hdr);
93 1.1.1.1.4.2 rmind }
94 1.1.1.1.4.2 rmind
95 1.1.1.1.4.2 rmind VOID
96 1.1.1.1.4.2 rmind SetCrcAltSize (
97 1.1.1.1.4.2 rmind IN UINTN Size,
98 1.1.1.1.4.2 rmind IN OUT EFI_TABLE_HEADER *Hdr
99 1.1.1.1.4.2 rmind )
100 1.1.1.1.4.2 rmind /*++
101 1.1.1.1.4.2 rmind
102 1.1.1.1.4.2 rmind Routine Description:
103 1.1.1.1.4.2 rmind
104 1.1.1.1.4.2 rmind Updates the CRC32 value in the table header
105 1.1.1.1.4.2 rmind
106 1.1.1.1.4.2 rmind Arguments:
107 1.1.1.1.4.2 rmind
108 1.1.1.1.4.2 rmind Hdr - The table to update
109 1.1.1.1.4.2 rmind
110 1.1.1.1.4.2 rmind Returns:
111 1.1.1.1.4.2 rmind
112 1.1.1.1.4.2 rmind None
113 1.1.1.1.4.2 rmind
114 1.1.1.1.4.2 rmind --*/
115 1.1.1.1.4.2 rmind {
116 1.1.1.1.4.2 rmind Hdr->CRC32 = 0;
117 1.1.1.1.4.2 rmind Hdr->CRC32 = CalculateCrc((UINT8 *)Hdr, Size);
118 1.1.1.1.4.2 rmind }
119 1.1.1.1.4.2 rmind
120 1.1.1.1.4.2 rmind
121 1.1.1.1.4.2 rmind BOOLEAN
122 1.1.1.1.4.2 rmind CheckCrc (
123 1.1.1.1.4.2 rmind IN UINTN MaxSize,
124 1.1.1.1.4.2 rmind IN OUT EFI_TABLE_HEADER *Hdr
125 1.1.1.1.4.2 rmind )
126 1.1.1.1.4.2 rmind /*++
127 1.1.1.1.4.2 rmind
128 1.1.1.1.4.2 rmind Routine Description:
129 1.1.1.1.4.2 rmind
130 1.1.1.1.4.2 rmind Checks the CRC32 value in the table header
131 1.1.1.1.4.2 rmind
132 1.1.1.1.4.2 rmind Arguments:
133 1.1.1.1.4.2 rmind
134 1.1.1.1.4.2 rmind Hdr - The table to check
135 1.1.1.1.4.2 rmind
136 1.1.1.1.4.2 rmind Returns:
137 1.1.1.1.4.2 rmind
138 1.1.1.1.4.2 rmind TRUE if the CRC is OK in the table
139 1.1.1.1.4.2 rmind
140 1.1.1.1.4.2 rmind --*/
141 1.1.1.1.4.2 rmind {
142 1.1.1.1.4.2 rmind return CheckCrcAltSize (MaxSize, Hdr->HeaderSize, Hdr);
143 1.1.1.1.4.2 rmind }
144 1.1.1.1.4.2 rmind
145 1.1.1.1.4.2 rmind
146 1.1.1.1.4.2 rmind
147 1.1.1.1.4.2 rmind
148 1.1.1.1.4.2 rmind BOOLEAN
149 1.1.1.1.4.2 rmind CheckCrcAltSize (
150 1.1.1.1.4.2 rmind IN UINTN MaxSize,
151 1.1.1.1.4.2 rmind IN UINTN Size,
152 1.1.1.1.4.2 rmind IN OUT EFI_TABLE_HEADER *Hdr
153 1.1.1.1.4.2 rmind )
154 1.1.1.1.4.2 rmind /*++
155 1.1.1.1.4.2 rmind
156 1.1.1.1.4.2 rmind Routine Description:
157 1.1.1.1.4.2 rmind
158 1.1.1.1.4.2 rmind Checks the CRC32 value in the table header
159 1.1.1.1.4.2 rmind
160 1.1.1.1.4.2 rmind Arguments:
161 1.1.1.1.4.2 rmind
162 1.1.1.1.4.2 rmind Hdr - The table to check
163 1.1.1.1.4.2 rmind
164 1.1.1.1.4.2 rmind Returns:
165 1.1.1.1.4.2 rmind
166 1.1.1.1.4.2 rmind TRUE if the CRC is OK in the table
167 1.1.1.1.4.2 rmind
168 1.1.1.1.4.2 rmind --*/
169 1.1.1.1.4.2 rmind {
170 1.1.1.1.4.2 rmind UINT32 Crc;
171 1.1.1.1.4.2 rmind UINT32 OrgCrc;
172 1.1.1.1.4.2 rmind BOOLEAN f;
173 1.1.1.1.4.2 rmind
174 1.1.1.1.4.2 rmind if (Size == 0) {
175 1.1.1.1.4.2 rmind //
176 1.1.1.1.4.2 rmind // If header size is 0 CRC will pass so return FALSE here
177 1.1.1.1.4.2 rmind //
178 1.1.1.1.4.2 rmind return FALSE;
179 1.1.1.1.4.2 rmind }
180 1.1.1.1.4.2 rmind if (MaxSize && Size > MaxSize) {
181 1.1.1.1.4.2 rmind DEBUG((D_ERROR, "CheckCrc32: Size > MaxSize\n"));
182 1.1.1.1.4.2 rmind return FALSE;
183 1.1.1.1.4.2 rmind }
184 1.1.1.1.4.2 rmind
185 1.1.1.1.4.2 rmind // clear old crc from header
186 1.1.1.1.4.2 rmind OrgCrc = Hdr->CRC32;
187 1.1.1.1.4.2 rmind Hdr->CRC32 = 0;
188 1.1.1.1.4.2 rmind Crc = CalculateCrc((UINT8 *)Hdr, Size);
189 1.1.1.1.4.2 rmind
190 1.1.1.1.4.2 rmind // set restults
191 1.1.1.1.4.2 rmind Hdr->CRC32 = OrgCrc;
192 1.1.1.1.4.2 rmind
193 1.1.1.1.4.2 rmind // return status
194 1.1.1.1.4.2 rmind f = OrgCrc == (UINT32) Crc;
195 1.1.1.1.4.2 rmind if (!f) {
196 1.1.1.1.4.2 rmind DEBUG((D_ERROR, "CheckCrc32: Crc check failed\n"));
197 1.1.1.1.4.2 rmind }
198 1.1.1.1.4.2 rmind
199 1.1.1.1.4.2 rmind return f;
200 1.1.1.1.4.2 rmind }
201 1.1.1.1.4.2 rmind
202 1.1.1.1.4.2 rmind
203 1.1.1.1.4.2 rmind UINT32
204 1.1.1.1.4.2 rmind CalculateCrc (
205 1.1.1.1.4.2 rmind UINT8 *pt,
206 1.1.1.1.4.2 rmind UINTN Size
207 1.1.1.1.4.2 rmind )
208 1.1.1.1.4.2 rmind {
209 1.1.1.1.4.2 rmind UINTN Crc;
210 1.1.1.1.4.2 rmind
211 1.1.1.1.4.2 rmind // compute crc
212 1.1.1.1.4.2 rmind Crc = 0xffffffff;
213 1.1.1.1.4.2 rmind while (Size) {
214 1.1.1.1.4.2 rmind Crc = (Crc >> 8) ^ CRCTable[(UINT8) Crc ^ *pt];
215 1.1.1.1.4.2 rmind pt += 1;
216 1.1.1.1.4.2 rmind Size -= 1;
217 1.1.1.1.4.2 rmind }
218 1.1.1.1.4.2 rmind Crc = Crc ^ 0xffffffff;
219 1.1.1.1.4.2 rmind return (UINT32)Crc;
220 1.1.1.1.4.2 rmind }
221