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