CRC RevEng

CRC RevEng

[ Home | Up | Prev | Next | Disclaimer ]

Summary of the CRC Catalogue

Summary of the CRC catalogue
CRC width (bits) Records
Attested Confirmed Academic Third-party Total
322
422
51113
6235
733
8127120
10123
11112
1244
1311
14112
15112
162341331
1711
2111
24538
3011
3111
3283112
4011
643227
8211
Total6011384113

Legend

Evidence classes

I
Primary documents. Evidence from a standards document (official or de facto) defining a protocol that uses the CRC algorithm.
II
Implementations. A widely-available implementation that can calculate CRCs for any desired message.
III
Secondary documents. Evidence from documents other than standards documents.
IV
Codewords. Valid message-CRC pairs from any source. Trivial codewords are simple sums of the algorithm parameters and/or simple multiples of the generator polynomial, and show insufficient calculation complexity to validate an algorithm. These are collected in the Catalogue only for illustration.

Model classes

Attested
The algorithm is evidenced by its definition in a primary document, plus one or more of the following:
Confirmed
The algorithm is evidenced by a widely-available implementation that can calculate CRCs for any desired message.
Academic
It has not been confirmed that CRCs are actually calculated in the field according to this record.
Third-party
All parameters and codewords originate from unofficial sources.

Model parameters

width
The number of bit cells in the linear feedback shift register; the degree of the generator polynomial, less one.
poly
The generator polynomial that sets the feedback tap positions of the shift register. poly is written in the hexadecimal, direct notation found in MSB-first code. The least significant bit corresponds to the inward end of the shift register, and is always set. The highest-order term is omitted.
init
The settings of the bit cells at the start of each calculation, before reading the first message bit. init is written in the hexadecimal, direct notation found in MSB-first code. The least significant bit corresponds to the inward end of the shift register.
refin
If equal to false, specifies that the characters of the message are read bit-by-bit, most significant bit (MSB) first; if equal to true, the characters are read bit-by-bit, least significant bit (LSB) first. Each sampled message bit is then XORed with the bit being simultaneously shifted out of the register at the most significant end, and the result is passed to the feedback taps.
refout
If equal to false, specifies that the contents of the register after reading the last message bit are unreflected before presentation; if equal to true, it specifies that they are reflected, character-by-character, before presentation. For the purpose of this definition, the reflection is performed by swapping the content of each cell with that of the cell an equal distance from the opposite end of the register; the characters of the CRC are then true images of parts of the reflected register, the character containing the original MSB always appearing first.
xorout
The XOR value applied to the contents of the register after the last message bit has been read and after the optional reflection. xorout is written in hexadecimal notation, having the same endianness as the CRC such that its true image appears in the characters of the CRC.
check
The contents of the register after initialising, reading the UTF-8 string "123456789" (as 8-bit characters), optionally reflecting, and applying the final XOR.
residue
The contents of the register after initialising, reading an error-free codeword and optionally reflecting the register (if refout=true), but not applying the final XOR. This is mathematically equivalent to initialising the register with the xorout parameter, reflecting it as described (if refout=true), reading as many zero bits as there are cells in the register, and reflecting the result (if refin=true). The residue of a crossed-endian model is calculated assuming that the characters of the received CRC are specially reflected before submitting the codeword.
name
The name assigned to the model in this Catalogue.

Model notes

Unique effective solution of codeword set
This model is the only one at the specified width that solves all the codewords listed in the model entry. Equivalent forms of the model may exist (differing in Init, XorOut and Residue values) but they produce identical CRCs at all message lengths. (If (x + 1)n appears in the factorisation of G(x), then there shall be 2n − 1 equivalent forms.)

References

Robert Bosch GmbH (September 1991), CAN 2.0 Specification.

Dipl. Inf. Johann N. Löfflmann (30 July 2006), Jacksum. CRC and hash calculator in Java.

Thomas Pircher (5 November 2022), pycrc. Python based parametrised CRC calculator and C code generator.

William H. Press, Brian P. Flannery, Saul A. Teukolsky, William T. Vetterling (1992), Numerical recipes in C: The art of scientific computing. 2nd ed. Cambridge: Cambridge University Press. ISBN 0-521-43108-5

Dr Ross N. Williams (19 August 1993), "A Painless Guide to CRC Error Detection Algorithms" (courtesy of the Internet Archive).

Useful links

Lammert Bies (August 2011), "On-line CRC calculation and free library".

Lammert Bies, "Error detection and correction" Web forum (courtesy of the Internet Archive).

Jonathan Graham Harston (21–23 June 2011), "Source Code for Calculating CRCs".

PicList MassMind, "Cyclic Redundancy Check error detection".

Tom Torfs, IOCCC winning entry, 1998, CRC generator.

Disclaimer

Every effort has been made to ensure accuracy, however there may be occasional errors or omissions. All trademarks and registered trademarks are the intellectual property of their respective owners. The code and documentation included in this document are supplied without warranty, not even the implied warranties of merchantability or fitness for a particular purpose. In no event shall the author or his suppliers be liable for any loss, damage, injury or death, of any nature and howsoever caused, arising from the use of, or failure, inability or unwillingness to use, this software or documentation.

[ Top of page ]


Appendix A

Map of common 16-bit CRC algorithms.

Karnaugh map of the most common 16-bit CRCs, with Check values and algorithm citations. All values are hexadecimal.
"123456789"
(UTF-8)
Polynomial 1021 8005
Reflected? False True False
Initial value Final XOR
0000 0000 31C3
(XMODEM)
2189
(KERMIT)
BB3D
(ARC)
FEE8
(UMTS)
FFFF CE3C
(GSM)
DE76
(–)
44C2
(MAXIM)
0117
(–)
FFFF D64E
(GENIBUS)
906E
(SDLC)
B4C8
(USB)
5118
(–)
0000 29B1
(IBM 3740)
6F91
(MCRF4XX)
4B37
(MODBUS)
AEE7
(CMS)

Appendix B

Cross-reference of generator polynomials to Professor Koopman's CRC Polynomial Zoo.

Generator polynomials appearing in the CRC Catalogue
Width Polynomial Zoo names Models
Direct Reflected Koopman
30x30x60x5(*p) CRC-3K; RFC 3095; FP-3CRC-3/GSM, CRC-3/ROHC
40x30xc0x9(*p) CCITT-4; FP-4; ITU-T G.704CRC-4/G-704, CRC-4/INTERLAKEN
50x050x140x12(*p) CRC-5-EPC; CRC-5-USB; FP-5CRC-5/USB
50x090x12*< 0x14(*p) CRC-5-EPC; CRC-5-USB; FP-5CRC-5/EPC-C1G2
50x150x15*< 0x1a(*op) CRC-5; CRC-5-ITU; CRC-5F/4; FOP-5 ("65")CRC-5/G-704
60x030x300x21(*p) CRC-6; CRC-6-ITU; FP-6CRC-6/G-704
60x070x380x23(*op) CRC-6-CDMA2000-B; FOP-6CRC-6/CDMA2000-B
60x190x26< 0x2c(*op) DARC-6CRC-6/DARC
60x270x390x33(*p) CRC-6-CDMA2000-A; CRC-6F/3 ("147p")CRC-6/CDMA2000-A
60x2f0x3d0x37(*op) CRC-6-GSM; CRC-6F/4 ("157")CRC-6/GSM
70x090x480x44(*p) CRC-7CRC-7/MMC
70x450x51< 0x62(*op) CRC-7PCRC-7/UMTS
70x4f0x790x67(*o) RFC 3095CRC-7/ROHC
80x070xe00x83(*op) FOP-8; ATM-8; CRC-8PCRC-8/I-432-1, CRC-8/ROHC, CRC-8/SMBUS
80x310x8c< 0x98(*op) DOWCRCCRC-8/MAXIM-DOW, CRC-8/NRSC-5
80x1d0xb80x8e(*p) SAE J-1850; FP-8CRC-8/GSM-A, CRC-8/HITAG, CRC-8/I-CODE, CRC-8/MIFARE-MAD, CRC-8/SAE-J1850, CRC-8/TECH-3250
80x490x92< 0xa4(*o) CRC-8-GSM-BCRC-8/GSM-B
80x2f0xf40x97(*op) C2; CRC-8-AUTOSAR; CRC-8F/4.2 ("457")CRC-8/AUTOSAR, CRC-8/OPENSAFETY
80x390x9c= 0x9cDARC-8CRC-8/DARC
80xd50xab< 0xea(*o) CRC-8CRC-8/DVB-S2
80x9b0xd90xcd(*op) WCDMA-8CRC-8/CDMA2000, CRC-8/LTE, CRC-8/WCDMA
80xa70xe50xd3(*op) CRC-8-BluetoothCRC-8/BLUETOOTH
100x3d90x26f< 0x3ec(*op) CRC-10-CMDA2000CRC-10/CDMA2000
100x1750x2ba= 0x2baCRC-10-GSMCRC-10/GSM
100x2330x3310x319(*op) CRC-10CRC-10/ATM
110x3850x50e< 0x5c2(*o) FlexRay-11CRC-11/FLEXRAY
110x3070x7060x583(*op) CRC-11F/4.2 "7015"CRC-11/UMTS
120xd310x8cb< 0xe98CRC-12-GSMCRC-12/GSM
120x80f0xf010xc07(*op) CRC-12CRC-12/DECT, CRC-12/UMTS
120xf130xc8f< 0xf89(*op) CRC-12-CMDA2000CRC-12/CDMA2000
130x1cf50x15e7< 0x1e7a(*o) CRC-13-BBCCRC-13/BBC
140x08050x28040x2402(*op) DARC-14 (*op)CRC-14/DARC
140x202d0x2d01< 0x3016(*op) CRC-14-GSMCRC-14/GSM
150x45990x4cd1< 0x62cc(*o) CANCRC-15/CAN
150x68150x540b< 0x740aCRC-15-MPT1327CRC-15/MPT1327
160x05890x91a00x82c4(*o) CRC-16-DECTCRC-16/DECT-R, CRC-16/DECT-X
160x080b0xd0100x8405CRC-16/NRSC-5
160x10210x8408< 0x8810(*op) CCITT-16CRC-16/GENIBUS, CRC-16/GSM, CRC-16/IBM-3740, CRC-16/IBM-SDLC, CRC-16/ISO-IEC-14443-3-A, CRC-16/KERMIT, CRC-16/MCRF4XX, CRC-16/RIELLO, CRC-16/SPI-FUJITSU, CRC-16/TMS37157, CRC-16/XMODEM
160x1dcf0xf3b80x8ee7ProfiBusCRC-16/PROFIBUS
160x3d650xa6bc0x9eb2(*o) C1; CRC-16-DNP; CRC-16F/6.2 ("236545")CRC-16/DNP, CRC-16/EN-13757
160x80050xa001*< 0xc002(*op) CRC-16; CRC-16-IBMCRC-16/ARC, CRC-16/CMS, CRC-16/DDS-110, CRC-16/MAXIM-DOW, CRC-16/MODBUS, CRC-16/UMTS, CRC-16/USB
160x59350xac9a= 0xac9aC3; CRC-16F/5 ("254465s")CRC-16/M17, CRC-16/OPENSAFETY-A
160x6f630xc6f60xb7b1IEEE WG77.1CRC-16/LJ1200
160x755b0xdaae0xbaadCRC-16K/4CRC-16/OPENSAFETY-B
160x8bb70xedd10xc5db(*p) CRC-16-T10-DIFCRC-16/T10-DIF
160xa0970xe9050xd04b(*o) IBM-16CRC-16/TELEDISK
160xc8670xe6130xe433(*p) CRC-16-CMDA2000CRC-16/CDMA2000
170x1685b0x1b42d= 0x1b42d(*o) CRC-17-CANCRC-17/CAN-FD
210x1028990x132281< 0x18144c(*o) CRC-21-CANCRC-21/CAN-FD
240x00065b0xda60000x80032d(*op) BLE-24 (Bluetooth Low Energy)CRC-24/BLE
240x328b630xc6d14c0x9945b1(*op) CRC-24/4CRC-24/INTERLAKEN
240x5d6dcb0xd3b6ba0xaeb6e5(*o) CRC-24; CRC-24/6.1; FlexRay-24CRC-24/FLEXRAY-A, CRC-24/FLEXRAY-B
240x8000630xc600010xc00031(*op) WCDMA-24CRC-24/LTE-B, CRC-24/OS-9
240x864cfb0xdf32610xc3267d(*op) CRC-24-Radix-64CRC-24/LTE-A, CRC-24/OPENPGP
300x2030b9c70x38e743010x30185ce3(*op) CRC-30CRC-30/CDMA
310x04c11db70x76dc41900x42608edbCRC-31/PHILIPS
320x000000af0xf50000000x80000057(*p) FP-32, CRC-32K/3CRC-32/XFER
320x04c11db70xedb883200x82608edb(*p) IEEE 802.3; CRC-32CRC-32/BZIP2, CRC-32/CKSUM, CRC-32/ISO-HDLC, CRC-32/JAMCRC, CRC-32/MPEG-2
320x1edc6f410x82f63b78< 0x8f6e37a0(*op) iSCSI; CRC-32C; CRC-32/4CRC-32/ISCSI
320x741b8cd70xeb31d82e0xba0dc66b(*o) CRC-32K/6.1CRC-32/MEF
320x8001801b0xd80180010xc000c00dCRC-32/CD-ROM-EDC
320x814141ab0xd58282810xc0a0a0d5(*op) CRC-32QCRC-32/AIXM
320xf4acfb130xc8df352f< 0xfa567d89(*o) CRC-32/6 correctedCRC-32/AUTOSAR
320xa833982b0xd419cc15= 0xd419cc15CRC-32/5.1CRC-32/BASE91-D
400x00048200090x90004120000x8002410004CRC-40/GSM
640x000000000000001b0xd8000000000000000x800000000000000d(*p) FP-64, CRC-64-ISOCRC-64/GO-ISO
640x259c84cba64263490x92c64265d32139a4< 0x92ce4265d32131a4CRC-64/MS
640xad93d23594c935a90x95ac9329ac4bc9b5< 0xd6c9e91aca649ad4(*p) JonesCRC-64/REDIS
640xad93d23594c936590x9a6c9329ac4bc9b5< 0xd6c9e91aca649b2cCRC-64/NVME
640x42f0e1eba9ea36930xc96c5795d7870f420xa17870f5d4f51b49(*o) CRC-64-ECMACRC-64/ECMA-182, CRC-64/WE, CRC-64/XZ
820x0308c01110114014404110x220808a00a2022200c4300x218460088808a00a20208CRC-82/DARC

Legend: < Lexically greater than its reciprocal in the Reflected column. *< Lexically greater than its reciprocal listed in the Zoo and in the Reflected column. = Palindromic polynomial. (*o) Multiple of (x + 1). (*p) Primitive polynomial. (*op) Product of a primitive polynomial and (x + 1).


Greg Cook, [email address]
https://reveng.sourceforge.io/crc-catalogue/legend.htm Last updated 29 August 2024
Links last verified 20 July 2023

Valid HTML 4.01 Strict. Hosting by SourceForge.net

[ Top of page ]