1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85
|
// SPDX-License-Identifier: GPL-2.0
/*
* Normal 64-bit CRC calculation.
*
* This is a basic crc64 implementation following ECMA-182 specification,
* which can be found from,
* https://www.ecma-international.org/publications/standards/Ecma-182.htm
*
* Dr. Ross N. Williams has a great document to introduce the idea of CRC
* algorithm, here the CRC64 code is also inspired by the table-driven
* algorithm and detail example from this paper. This paper can be found
* from,
* http://www.ross.net/crc/download/crc_v3.txt
*
* crc64table[256] is the lookup table of a table-driven 64-bit CRC
* calculation, which is generated by gen_crc64table.c in kernel build
* time. The polynomial of crc64 arithmetic is from ECMA-182 specification
* as well, which is defined as,
*
* x^64 x^62 x^57 x^55 x^54 x^53 x^52 x^47 x^46 x^45
* x^40 x^39 x^38 x^37 x^35 x^33 x^32 x^31 x^29 x^27
* x^24 x^23 x^22 x^21 x^19 x^17 x^13 x^12 x^10 x^9
* x^7 x^4 x 1
*
* crc64rocksoft[256] table is from the Rocksoft specification polynomial
* defined as,
*
* x^64 x^63 x^61 x^59 x^58 x^56 x^55 x^52 x^49 x^48 x^47
* x^46 x^44 x^41 x^37 x^36 x^34 x^32 x^31 x^28 x^26 x^23
* x^22 x^19 x^16 x^13 x^12 x^10 x^9 x^6 x^4 x^3 1
*
* Copyright 2018 SUSE Linux.
* Author: Coly Li <[email protected]>
*/
#include <linux/module.h>
#include <linux/types.h>
#include <linux/crc64.h>
#include "crc64table.h"
MODULE_DESCRIPTION("CRC64 calculations");
MODULE_LICENSE("GPL v2");
/**
* crc64_be - Calculate bitwise big-endian ECMA-182 CRC64
* @crc: seed value for computation. 0 or (u64)~0 for a new CRC calculation,
* or the previous crc64 value if computing incrementally.
* @p: pointer to buffer over which CRC64 is run
* @len: length of buffer @p
*/
u64 __pure crc64_be(u64 crc, const void *p, size_t len)
{
size_t i, t;
const unsigned char *_p = p;
for (i = 0; i < len; i ) {
t = ((crc >> 56) ^ (*_p )) & 0xFF;
crc = crc64table[t] ^ (crc << 8);
}
return crc;
}
EXPORT_SYMBOL_GPL(crc64_be);
/**
* crc64_rocksoft_generic - Calculate bitwise Rocksoft CRC64
* @crc: seed value for computation. 0 for a new CRC calculation, or the
* previous crc64 value if computing incrementally.
* @p: pointer to buffer over which CRC64 is run
* @len: length of buffer @p
*/
u64 __pure crc64_rocksoft_generic(u64 crc, const void *p, size_t len)
{
const unsigned char *_p = p;
size_t i;
crc = ~crc;
for (i = 0; i < len; i )
crc = (crc >> 8) ^ crc64rocksofttable[(crc & 0xff) ^ *_p ];
return ~crc;
}
EXPORT_SYMBOL_GPL(crc64_rocksoft_generic);
|