1/* 2 * Copyright (c) 2003 VIA Networking, Inc. All rights reserved. 3 * 4 * This program is free software; you can redistribute it and/or modify 5 * it under the terms of the GNU General Public License as published by 6 * the Free Software Foundation; either version 2 of the License, or 7 * (at your option) any later version. 8 * 9 * This program is distributed in the hope that it will be useful, 10 * but WITHOUT ANY WARRANTY; without even the implied warranty of 11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 12 * GNU General Public License for more details. 13 * 14 * You should have received a copy of the GNU General Public License along 15 * with this program; if not, write to the Free Software Foundation, Inc., 16 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. 17 * 18 * 19 * File: tcrc.c 20 * 21 * Purpose: Implement functions to caculate CRC 22 * 23 * Author: Tevin Chen 24 * 25 * Date: May 21, 1996 26 * 27 * Functions: 28 * CRCdwCrc32 - 29 * CRCdwGetCrc32 - 30 * CRCdwGetCrc32Ex - 31 * 32 * Revision History: 33 * 34 */ 35 36#include "tcrc.h" 37 38/*--------------------- Static Definitions -------------------------*/ 39 40/*--------------------- Static Classes ----------------------------*/ 41 42/*--------------------- Static Variables --------------------------*/ 43 44/* 32-bit CRC table */ 45static const DWORD s_adwCrc32Table[256] = { 46 0x00000000L, 0x77073096L, 0xEE0E612CL, 0x990951BAL, 47 0x076DC419L, 0x706AF48FL, 0xE963A535L, 0x9E6495A3L, 48 0x0EDB8832L, 0x79DCB8A4L, 0xE0D5E91EL, 0x97D2D988L, 49 0x09B64C2BL, 0x7EB17CBDL, 0xE7B82D07L, 0x90BF1D91L, 50 0x1DB71064L, 0x6AB020F2L, 0xF3B97148L, 0x84BE41DEL, 51 0x1ADAD47DL, 0x6DDDE4EBL, 0xF4D4B551L, 0x83D385C7L, 52 0x136C9856L, 0x646BA8C0L, 0xFD62F97AL, 0x8A65C9ECL, 53 0x14015C4FL, 0x63066CD9L, 0xFA0F3D63L, 0x8D080DF5L, 54 0x3B6E20C8L, 0x4C69105EL, 0xD56041E4L, 0xA2677172L, 55 0x3C03E4D1L, 0x4B04D447L, 0xD20D85FDL, 0xA50AB56BL, 56 0x35B5A8FAL, 0x42B2986CL, 0xDBBBC9D6L, 0xACBCF940L, 57 0x32D86CE3L, 0x45DF5C75L, 0xDCD60DCFL, 0xABD13D59L, 58 0x26D930ACL, 0x51DE003AL, 0xC8D75180L, 0xBFD06116L, 59 0x21B4F4B5L, 0x56B3C423L, 0xCFBA9599L, 0xB8BDA50FL, 60 0x2802B89EL, 0x5F058808L, 0xC60CD9B2L, 0xB10BE924L, 61 0x2F6F7C87L, 0x58684C11L, 0xC1611DABL, 0xB6662D3DL, 62 0x76DC4190L, 0x01DB7106L, 0x98D220BCL, 0xEFD5102AL, 63 0x71B18589L, 0x06B6B51FL, 0x9FBFE4A5L, 0xE8B8D433L, 64 0x7807C9A2L, 0x0F00F934L, 0x9609A88EL, 0xE10E9818L, 65 0x7F6A0DBBL, 0x086D3D2DL, 0x91646C97L, 0xE6635C01L, 66 0x6B6B51F4L, 0x1C6C6162L, 0x856530D8L, 0xF262004EL, 67 0x6C0695EDL, 0x1B01A57BL, 0x8208F4C1L, 0xF50FC457L, 68 0x65B0D9C6L, 0x12B7E950L, 0x8BBEB8EAL, 0xFCB9887CL, 69 0x62DD1DDFL, 0x15DA2D49L, 0x8CD37CF3L, 0xFBD44C65L, 70 0x4DB26158L, 0x3AB551CEL, 0xA3BC0074L, 0xD4BB30E2L, 71 0x4ADFA541L, 0x3DD895D7L, 0xA4D1C46DL, 0xD3D6F4FBL, 72 0x4369E96AL, 0x346ED9FCL, 0xAD678846L, 0xDA60B8D0L, 73 0x44042D73L, 0x33031DE5L, 0xAA0A4C5FL, 0xDD0D7CC9L, 74 0x5005713CL, 0x270241AAL, 0xBE0B1010L, 0xC90C2086L, 75 0x5768B525L, 0x206F85B3L, 0xB966D409L, 0xCE61E49FL, 76 0x5EDEF90EL, 0x29D9C998L, 0xB0D09822L, 0xC7D7A8B4L, 77 0x59B33D17L, 0x2EB40D81L, 0xB7BD5C3BL, 0xC0BA6CADL, 78 0xEDB88320L, 0x9ABFB3B6L, 0x03B6E20CL, 0x74B1D29AL, 79 0xEAD54739L, 0x9DD277AFL, 0x04DB2615L, 0x73DC1683L, 80 0xE3630B12L, 0x94643B84L, 0x0D6D6A3EL, 0x7A6A5AA8L, 81 0xE40ECF0BL, 0x9309FF9DL, 0x0A00AE27L, 0x7D079EB1L, 82 0xF00F9344L, 0x8708A3D2L, 0x1E01F268L, 0x6906C2FEL, 83 0xF762575DL, 0x806567CBL, 0x196C3671L, 0x6E6B06E7L, 84 0xFED41B76L, 0x89D32BE0L, 0x10DA7A5AL, 0x67DD4ACCL, 85 0xF9B9DF6FL, 0x8EBEEFF9L, 0x17B7BE43L, 0x60B08ED5L, 86 0xD6D6A3E8L, 0xA1D1937EL, 0x38D8C2C4L, 0x4FDFF252L, 87 0xD1BB67F1L, 0xA6BC5767L, 0x3FB506DDL, 0x48B2364BL, 88 0xD80D2BDAL, 0xAF0A1B4CL, 0x36034AF6L, 0x41047A60L, 89 0xDF60EFC3L, 0xA867DF55L, 0x316E8EEFL, 0x4669BE79L, 90 0xCB61B38CL, 0xBC66831AL, 0x256FD2A0L, 0x5268E236L, 91 0xCC0C7795L, 0xBB0B4703L, 0x220216B9L, 0x5505262FL, 92 0xC5BA3BBEL, 0xB2BD0B28L, 0x2BB45A92L, 0x5CB36A04L, 93 0xC2D7FFA7L, 0xB5D0CF31L, 0x2CD99E8BL, 0x5BDEAE1DL, 94 0x9B64C2B0L, 0xEC63F226L, 0x756AA39CL, 0x026D930AL, 95 0x9C0906A9L, 0xEB0E363FL, 0x72076785L, 0x05005713L, 96 0x95BF4A82L, 0xE2B87A14L, 0x7BB12BAEL, 0x0CB61B38L, 97 0x92D28E9BL, 0xE5D5BE0DL, 0x7CDCEFB7L, 0x0BDBDF21L, 98 0x86D3D2D4L, 0xF1D4E242L, 0x68DDB3F8L, 0x1FDA836EL, 99 0x81BE16CDL, 0xF6B9265BL, 0x6FB077E1L, 0x18B74777L, 100 0x88085AE6L, 0xFF0F6A70L, 0x66063BCAL, 0x11010B5CL, 101 0x8F659EFFL, 0xF862AE69L, 0x616BFFD3L, 0x166CCF45L, 102 0xA00AE278L, 0xD70DD2EEL, 0x4E048354L, 0x3903B3C2L, 103 0xA7672661L, 0xD06016F7L, 0x4969474DL, 0x3E6E77DBL, 104 0xAED16A4AL, 0xD9D65ADCL, 0x40DF0B66L, 0x37D83BF0L, 105 0xA9BCAE53L, 0xDEBB9EC5L, 0x47B2CF7FL, 0x30B5FFE9L, 106 0xBDBDF21CL, 0xCABAC28AL, 0x53B39330L, 0x24B4A3A6L, 107 0xBAD03605L, 0xCDD70693L, 0x54DE5729L, 0x23D967BFL, 108 0xB3667A2EL, 0xC4614AB8L, 0x5D681B02L, 0x2A6F2B94L, 109 0xB40BBE37L, 0xC30C8EA1L, 0x5A05DF1BL, 0x2D02EF8DL 110}; 111 112/*--------------------- Static Functions --------------------------*/ 113 114/*--------------------- Export Variables --------------------------*/ 115 116 117 118 119/*+ 120 * 121 * Description: 122 * Generate a CRC-32 from the data stream 123 * 124 * Parameters: 125 * In: 126 * pbyData - the data stream 127 * cbByte - the length of the stream 128 * dwCrcSeed - Seed for CRC32 129 * Out: 130 * none 131 * 132 * Return Value: CRC-32 133 * 134-*/ 135DWORD CRCdwCrc32(PBYTE pbyData, unsigned int cbByte, DWORD dwCrcSeed) 136{ 137 DWORD dwCrc; 138 139 dwCrc = dwCrcSeed; 140 while (cbByte--) { 141 dwCrc = s_adwCrc32Table[(BYTE)((dwCrc ^ (*pbyData)) & 0xFF)] ^ 142 (dwCrc >> 8); 143 pbyData++; 144 } 145 146 return dwCrc; 147} 148 149 150/*+ 151 * 152 * Description: 153 * To test CRC generator, input 8 bytes packet 154 * -- 0xff 0xff 0xff 0xff 0x00 0x00 0x00 0x00 155 * the generated CRC should be 156 * -- 0xff 0xff 0xff 0xff 157 * 158 * Parameters: 159 * In: 160 * pbyData - the data stream 161 * cbByte - the length of the stream 162 * Out: 163 * none 164 * 165 * Return Value: CRC-32 166 * 167-*/ 168DWORD CRCdwGetCrc32(PBYTE pbyData, unsigned int cbByte) 169{ 170 return ~CRCdwCrc32(pbyData, cbByte, 0xFFFFFFFFL); 171} 172 173 174/*+ 175 * 176 * Description: 177 * 178 * NOTE.... Because CRCdwGetCrc32Ex() is an iteration function, 179 * this means we will use the output of CRCdwGetCrc32Ex() 180 * to be a new argument to do next CRCdwGetCrc32Ex() calculation. 181 * Thus, the final result must be inverted to be the 182 * correct answer. 183 * 184 * Parameters: 185 * In: 186 * pbyData - the data stream 187 * cbByte - the length of the stream 188 * Out: 189 * none 190 * 191 * Return Value: CRC-32 192 * 193-*/ 194DWORD CRCdwGetCrc32Ex(PBYTE pbyData, unsigned int cbByte, DWORD dwPreCRC) 195{ 196 return CRCdwCrc32(pbyData, cbByte, dwPreCRC); 197} 198