1 1.1 jakllsch /* $NetBSD: crc.c,v 1.1.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