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