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