18d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi//----------------------------------------------------------------------------- 28d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi// Low level CRC functions for use by crcmod. This version is the C 38d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi// implementation that corresponds to the Python module _crcfunpy. This module 48d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi// will be used by crcmod if it is built for the target platform. Otherwise, 58d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi// the Python module is used. 68d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi// 78d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi// Copyright (c) 2004 Raymond L. Buvel 88d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi// 98d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi// Permission is hereby granted, free of charge, to any person obtaining a copy 108d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi// of this software and associated documentation files (the "Software"), to 118d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi// deal in the Software without restriction, including without limitation the 128d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi// rights to use, copy, modify, merge, publish, distribute, sublicense, and/or 138d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi// sell copies of the Software, and to permit persons to whom the Software is 148d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi// furnished to do so, subject to the following conditions: 158d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi// 168d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi// The above copyright notice and this permission notice shall be included in 178d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi// all copies or substantial portions of the Software. 188d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi// 198d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 208d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 218d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 228d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 238d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 248d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS 258d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi// IN THE SOFTWARE. 268d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi//----------------------------------------------------------------------------- 278d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi 288d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi// Force Py_ssize_t to be used for s# conversions. 298d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi#define PY_SSIZE_T_CLEAN 308d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi#include <Python.h> 318d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi 328d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi// Make compatible with previous Python versions 338d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi#if PY_VERSION_HEX < 0x02050000 348d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoitypedef int Py_ssize_t; 358d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi#define PY_SSIZE_T_MAX INT_MAX 368d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi#define PY_SSIZE_T_MIN INT_MIN 378d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi#endif 388d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi 398d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi// Note: the type declarations are set up to work on 32-bit platforms using the 408d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi// GNU C compiler. They will need to be adjusted for other platforms. In 418d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi// particular, the Microsoft Windows compiler uses _int64 instead of long long. 428d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi 438d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi// Define a few types to make it easier to port to other platforms. 448d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoitypedef unsigned char UINT8; 458d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoitypedef unsigned short UINT16; 468d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoitypedef unsigned int UINT32; 478d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoitypedef unsigned long long UINT64; 488d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi 498d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi// Define some macros for the data format strings. The INPUT strings are for 508d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi// decoding the input parameters to the function which are (data, crc, table). 518d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi 528d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi// Note: these format strings use codes that are new in Python 2.3 so it would 538d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi// be necessary to rewrite the code for versions earlier than 2.3. 548d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi 558d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi#define INPUT8 "s#Bs#" 568d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi#define INPUT16 "s#Hs#" 578d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi#define INPUT32 "s#Is#" 588d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi#define INPUT64 "s#Ks#" 598d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi 608d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi// Define some macros that extract the specified byte from an integral value in 618d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi// what should be a platform independent manner. 628d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi#define BYTE0(x) ((UINT8)(x)) 638d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi#define BYTE1(x) ((UINT8)((x) >> 8)) 648d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi#define BYTE2(x) ((UINT8)((x) >> 16)) 658d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi#define BYTE3(x) ((UINT8)((x) >> 24)) 668d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi#define BYTE7(x) ((UINT8)((x) >> 56)) 678d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi 688d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi//----------------------------------------------------------------------------- 698d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi// Compute a 8-bit crc over the input data. 708d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi// Inputs: 718d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi// data - string containing the data 728d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi// crc - unsigned integer containing the initial crc 738d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi// table - string containing the 8-bit table corresponding to the generator 748d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi// polynomial. 758d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi// Returns: 768d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi// crc - unsigned integer containing the resulting crc 778d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi 788d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoistatic PyObject* 798d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi_crc8(PyObject* self, PyObject* args) 808d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi{ 818d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi UINT8 crc; 828d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi UINT8* data; 838d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi Py_ssize_t dataLen; 848d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi UINT8* table; 858d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi Py_ssize_t tableLen; 868d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi 878d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi if (!PyArg_ParseTuple(args, INPUT8, &data, &dataLen, &crc, 888d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi &table, &tableLen)) 898d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi { 908d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi return NULL; 918d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi } 928d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi 938d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi if (tableLen != 256) 948d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi { 958d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi PyErr_SetString(PyExc_ValueError, "invalid CRC table"); 968d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi return NULL; 978d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi } 988d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi 998d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi while (dataLen--) 1008d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi { 1018d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi crc = table[*data ^ crc]; 1028d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi data++; 1038d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi } 1048d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi 1058d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi return PyInt_FromLong((long)crc); 1068d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi} 1078d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi 1088d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi//----------------------------------------------------------------------------- 1098d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi// Compute a 8-bit crc over the input data. The data stream is bit reversed 1108d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi// during the computation. 1118d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi// Inputs: 1128d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi// data - string containing the data 1138d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi// crc - unsigned integer containing the initial crc 1148d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi// table - string containing the 8-bit table corresponding to the generator 1158d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi// polynomial. 1168d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi// Returns: 1178d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi// crc - unsigned integer containing the resulting crc 1188d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi 1198d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoistatic PyObject* 1208d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi_crc8r(PyObject* self, PyObject* args) 1218d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi{ 1228d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi UINT8 crc; 1238d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi UINT8* data; 1248d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi Py_ssize_t dataLen; 1258d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi UINT8* table; 1268d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi Py_ssize_t tableLen; 1278d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi 1288d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi if (!PyArg_ParseTuple(args, INPUT8, &data, &dataLen, &crc, 1298d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi &table, &tableLen)) 1308d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi { 1318d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi return NULL; 1328d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi } 1338d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi 1348d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi if (tableLen != 256) 1358d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi { 1368d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi PyErr_SetString(PyExc_ValueError, "invalid CRC table"); 1378d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi return NULL; 1388d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi } 1398d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi 1408d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi while (dataLen--) 1418d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi { 1428d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi crc = table[*data ^ crc]; 1438d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi data++; 1448d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi } 1458d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi 1468d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi return PyInt_FromLong((long)crc); 1478d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi} 1488d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi 1498d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi//----------------------------------------------------------------------------- 1508d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi// Compute a 16-bit crc over the input data. 1518d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi// Inputs: 1528d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi// data - string containing the data 1538d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi// crc - unsigned integer containing the initial crc 1548d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi// table - string containing the 16-bit table corresponding to the generator 1558d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi// polynomial. 1568d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi// Returns: 1578d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi// crc - unsigned integer containing the resulting crc 1588d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi 1598d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoistatic PyObject* 1608d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi_crc16(PyObject* self, PyObject* args) 1618d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi{ 1628d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi UINT16 crc; 1638d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi UINT8* data; 1648d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi Py_ssize_t dataLen; 1658d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi UINT16* table; 1668d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi Py_ssize_t tableLen; 1678d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi 1688d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi if (!PyArg_ParseTuple(args, INPUT16, &data, &dataLen, &crc, 1698d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi &table, &tableLen)) 1708d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi { 1718d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi return NULL; 1728d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi } 1738d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi 1748d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi if (tableLen != 256*2) 1758d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi { 1768d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi PyErr_SetString(PyExc_ValueError, "invalid CRC table"); 1778d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi return NULL; 1788d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi } 1798d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi 1808d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi while (dataLen--) 1818d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi { 1828d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi crc = table[*data ^ BYTE1(crc)] ^ (crc << 8); 1838d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi data++; 1848d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi } 1858d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi 1868d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi return PyInt_FromLong((long)crc); 1878d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi} 1888d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi 1898d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi//----------------------------------------------------------------------------- 1908d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi// Compute a 16-bit crc over the input data. The data stream is bit reversed 1918d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi// during the computation. 1928d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi// Inputs: 1938d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi// data - string containing the data 1948d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi// crc - unsigned integer containing the initial crc 1958d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi// table - string containing the 16-bit table corresponding to the generator 1968d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi// polynomial. 1978d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi// Returns: 1988d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi// crc - unsigned integer containing the resulting crc 1998d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi 2008d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoistatic PyObject* 2018d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi_crc16r(PyObject* self, PyObject* args) 2028d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi{ 2038d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi UINT16 crc; 2048d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi UINT8* data; 2058d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi Py_ssize_t dataLen; 2068d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi UINT16* table; 2078d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi Py_ssize_t tableLen; 2088d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi 2098d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi if (!PyArg_ParseTuple(args, INPUT16, &data, &dataLen, &crc, 2108d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi &table, &tableLen)) 2118d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi { 2128d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi return NULL; 2138d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi } 2148d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi 2158d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi if (tableLen != 256*2) 2168d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi { 2178d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi PyErr_SetString(PyExc_ValueError, "invalid CRC table"); 2188d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi return NULL; 2198d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi } 2208d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi 2218d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi while (dataLen--) 2228d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi { 2238d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi crc = table[*data ^ BYTE0(crc)] ^ (crc >> 8); 2248d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi data++; 2258d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi } 2268d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi 2278d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi return PyInt_FromLong((long)crc); 2288d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi} 2298d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi 2308d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi//----------------------------------------------------------------------------- 2318d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi// Compute a 24-bit crc over the input data. 2328d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi// Inputs: 2338d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi// data - string containing the data 2348d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi// crc - unsigned integer containing the initial crc 2358d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi// table - string containing the 24-bit table corresponding to the generator 2368d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi// polynomial. 2378d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi// Returns: 2388d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi// crc - unsigned integer containing the resulting crc 2398d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi 2408d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoistatic PyObject* 2418d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi_crc24(PyObject* self, PyObject* args) 2428d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi{ 2438d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi UINT32 crc; 2448d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi UINT8* data; 2458d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi Py_ssize_t dataLen; 2468d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi UINT32* table; 2478d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi Py_ssize_t tableLen; 2488d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi 2498d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi if (!PyArg_ParseTuple(args, INPUT32, &data, &dataLen, &crc, 2508d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi &table, &tableLen)) 2518d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi { 2528d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi return NULL; 2538d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi } 2548d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi 2558d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi if (tableLen != 256*4) 2568d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi { 2578d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi PyErr_SetString(PyExc_ValueError, "invalid CRC table"); 2588d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi return NULL; 2598d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi } 2608d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi 2618d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi while (dataLen--) 2628d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi { 2638d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi crc = table[*data ^ BYTE2(crc)] ^ (crc << 8); 2648d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi data++; 2658d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi } 2668d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi 2678d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi return PyInt_FromLong((long)(crc & 0xFFFFFFU)); 2688d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi} 2698d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi 2708d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi//----------------------------------------------------------------------------- 2718d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi// Compute a 24-bit crc over the input data. The data stream is bit reversed 2728d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi// during the computation. 2738d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi// Inputs: 2748d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi// data - string containing the data 2758d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi// crc - unsigned integer containing the initial crc 2768d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi// table - string containing the 24-bit table corresponding to the generator 2778d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi// polynomial. 2788d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi// Returns: 2798d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi// crc - unsigned integer containing the resulting crc 2808d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi 2818d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoistatic PyObject* 2828d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi_crc24r(PyObject* self, PyObject* args) 2838d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi{ 2848d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi UINT32 crc; 2858d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi UINT8* data; 2868d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi Py_ssize_t dataLen; 2878d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi UINT32* table; 2888d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi Py_ssize_t tableLen; 2898d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi 2908d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi if (!PyArg_ParseTuple(args, INPUT32, &data, &dataLen, &crc, 2918d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi &table, &tableLen)) 2928d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi { 2938d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi return NULL; 2948d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi } 2958d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi 2968d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi if (tableLen != 256*4) 2978d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi { 2988d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi PyErr_SetString(PyExc_ValueError, "invalid CRC table"); 2998d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi return NULL; 3008d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi } 3018d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi 3028d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi crc = crc & 0xFFFFFFU; 3038d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi while (dataLen--) 3048d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi { 3058d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi crc = table[*data ^ BYTE0(crc)] ^ (crc >> 8); 3068d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi data++; 3078d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi } 3088d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi 3098d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi return PyInt_FromLong((long)crc); 3108d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi} 3118d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi 3128d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi//----------------------------------------------------------------------------- 3138d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi// Compute a 32-bit crc over the input data. 3148d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi// Inputs: 3158d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi// data - string containing the data 3168d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi// crc - unsigned integer containing the initial crc 3178d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi// table - string containing the 32-bit table corresponding to the generator 3188d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi// polynomial. 3198d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi// Returns: 3208d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi// crc - unsigned integer containing the resulting crc 3218d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi 3228d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoistatic PyObject* 3238d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi_crc32(PyObject* self, PyObject* args) 3248d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi{ 3258d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi UINT32 crc; 3268d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi UINT8* data; 3278d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi Py_ssize_t dataLen; 3288d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi UINT32* table; 3298d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi Py_ssize_t tableLen; 3308d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi 3318d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi if (!PyArg_ParseTuple(args, INPUT32, &data, &dataLen, &crc, 3328d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi &table, &tableLen)) 3338d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi { 3348d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi return NULL; 3358d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi } 3368d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi 3378d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi if (tableLen != 256*4) 3388d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi { 3398d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi PyErr_SetString(PyExc_ValueError, "invalid CRC table"); 3408d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi return NULL; 3418d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi } 3428d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi 3438d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi while (dataLen--) 3448d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi { 3458d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi crc = table[*data ^ BYTE3(crc)] ^ (crc << 8); 3468d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi data++; 3478d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi } 3488d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi 3498d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi return PyLong_FromUnsignedLong(crc); 3508d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi} 3518d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi 3528d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi//----------------------------------------------------------------------------- 3538d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi// Compute a 32-bit crc over the input data. The data stream is bit reversed 3548d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi// during the computation. 3558d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi// Inputs: 3568d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi// data - string containing the data 3578d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi// crc - unsigned integer containing the initial crc 3588d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi// table - string containing the 32-bit table corresponding to the generator 3598d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi// polynomial. 3608d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi// Returns: 3618d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi// crc - unsigned integer containing the resulting crc 3628d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi 3638d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoistatic PyObject* 3648d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi_crc32r(PyObject* self, PyObject* args) 3658d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi{ 3668d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi UINT32 crc; 3678d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi UINT8* data; 3688d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi Py_ssize_t dataLen; 3698d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi UINT32* table; 3708d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi Py_ssize_t tableLen; 3718d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi 3728d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi if (!PyArg_ParseTuple(args, INPUT32, &data, &dataLen, &crc, 3738d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi &table, &tableLen)) 3748d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi { 3758d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi return NULL; 3768d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi } 3778d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi 3788d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi if (tableLen != 256*4) 3798d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi { 3808d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi PyErr_SetString(PyExc_ValueError, "invalid CRC table"); 3818d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi return NULL; 3828d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi } 3838d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi 3848d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi while (dataLen--) 3858d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi { 3868d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi crc = table[*data ^ BYTE0(crc)] ^ (crc >> 8); 3878d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi data++; 3888d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi } 3898d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi 3908d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi return PyLong_FromUnsignedLong(crc); 3918d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi} 3928d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi 3938d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi//----------------------------------------------------------------------------- 3948d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi// Compute a 64-bit crc over the input data. 3958d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi// Inputs: 3968d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi// data - string containing the data 3978d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi// crc - unsigned integer containing the initial crc 3988d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi// table - string containing the 64-bit table corresponding to the generator 3998d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi// polynomial. 4008d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi// Returns: 4018d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi// crc - unsigned integer containing the resulting crc 4028d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi 4038d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoistatic PyObject* 4048d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi_crc64(PyObject* self, PyObject* args) 4058d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi{ 4068d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi UINT64 crc; 4078d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi UINT8* data; 4088d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi Py_ssize_t dataLen; 4098d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi UINT64* table; 4108d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi Py_ssize_t tableLen; 4118d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi 4128d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi if (!PyArg_ParseTuple(args, INPUT64, &data, &dataLen, &crc, 4138d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi &table, &tableLen)) 4148d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi { 4158d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi return NULL; 4168d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi } 4178d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi 4188d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi if (tableLen != 256*8) 4198d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi { 4208d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi PyErr_SetString(PyExc_ValueError, "invalid CRC table"); 4218d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi return NULL; 4228d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi } 4238d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi 4248d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi while (dataLen--) 4258d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi { 4268d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi crc = table[*data ^ BYTE7(crc)] ^ (crc << 8); 4278d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi data++; 4288d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi } 4298d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi 4308d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi return PyLong_FromUnsignedLongLong(crc); 4318d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi} 4328d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi 4338d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi//----------------------------------------------------------------------------- 4348d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi// Compute a 64-bit crc over the input data. The data stream is bit reversed 4358d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi// during the computation. 4368d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi// Inputs: 4378d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi// data - string containing the data 4388d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi// crc - unsigned integer containing the initial crc 4398d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi// table - string containing the 64-bit table corresponding to the generator 4408d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi// polynomial. 4418d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi// Returns: 4428d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi// crc - unsigned integer containing the resulting crc 4438d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi 4448d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoistatic PyObject* 4458d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi_crc64r(PyObject* self, PyObject* args) 4468d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi{ 4478d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi UINT64 crc; 4488d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi UINT8* data; 4498d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi Py_ssize_t dataLen; 4508d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi UINT64* table; 4518d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi Py_ssize_t tableLen; 4528d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi 4538d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi if (!PyArg_ParseTuple(args, INPUT64, &data, &dataLen, &crc, 4548d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi &table, &tableLen)) 4558d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi { 4568d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi return NULL; 4578d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi } 4588d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi 4598d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi if (tableLen != 256*8) 4608d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi { 4618d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi PyErr_SetString(PyExc_ValueError, "invalid CRC table"); 4628d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi return NULL; 4638d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi } 4648d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi 4658d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi while (dataLen--) 4668d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi { 4678d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi crc = table[*data ^ BYTE0(crc)] ^ (crc >> 8); 4688d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi data++; 4698d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi } 4708d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi 4718d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi return PyLong_FromUnsignedLongLong(crc); 4728d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi} 4738d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi 4748d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi//----------------------------------------------------------------------------- 4758d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoistatic PyMethodDef methodTable[] = { 4768d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi{"_crc8", _crc8, METH_VARARGS}, 4778d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi{"_crc8r", _crc8r, METH_VARARGS}, 4788d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi{"_crc16", _crc16, METH_VARARGS}, 4798d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi{"_crc16r", _crc16r, METH_VARARGS}, 4808d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi{"_crc24", _crc24, METH_VARARGS}, 4818d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi{"_crc24r", _crc24r, METH_VARARGS}, 4828d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi{"_crc32", _crc32, METH_VARARGS}, 4838d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi{"_crc32r", _crc32r, METH_VARARGS}, 4848d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi{"_crc64", _crc64, METH_VARARGS}, 4858d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi{"_crc64r", _crc64r, METH_VARARGS}, 4868d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi{NULL, NULL} 4878d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi}; 4888d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi 4898d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi//----------------------------------------------------------------------------- 4908d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoivoid init_crcfunext(void) 4918d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi{ 4928d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi PyObject *m; 4938d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi 4948d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi if ((sizeof(UINT8) != 1) || (sizeof(UINT16) != 2) || 4958d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi (sizeof(UINT32) != 4) || (sizeof(UINT64) != 8)) 4968d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi { 4978d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi Py_FatalError("crcfunext: One of the data types is invalid"); 4988d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi } 4998d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi m = Py_InitModule("_crcfunext", methodTable); 5008d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi} 5018d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi 502