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