CRC32C (iSCSI / NVMe) guide
Why iSCSI, SCTP, and several NVMe transports use the Castagnoli CRC32C polynomial instead of Ethernet CRC-32, and how to verify an implementation.
CRC32C is a different polynomial from CRC-32
CRC32C — catalogued here as CRC-32/ISCSI and also known as CRC-32/CASTAGNOLI, CRC-32/BASE91-C, and CRC-32/INTERLAKEN — uses the Castagnoli polynomial 0x1EDC6F41 rather than the 0x04C11DB7 polynomial behind CRC-32/ISO-HDLC (Ethernet, ZIP) and CRC-32/BZIP2.
The Castagnoli polynomial was selected for stronger burst and multi-bit error detection at typical storage and network block sizes, which is why it displaced the classic CRC-32 in newer storage protocols rather than reusing it.
Where CRC32C is used
iSCSI uses CRC32C as its optional header and data digest. SCTP uses it for packet verification. Several NVMe transports and some database and filesystem formats (including ext4 metadata and certain RocksDB/LevelDB checksums) also use CRC32C, largely because modern CPUs expose a hardware CRC32C instruction (SSE4.2 crc32 on x86, or the CRC32C ARMv8 extension) that makes it inexpensive to compute.
- iSCSI header/data digest
- SCTP packet verification
- Some NVMe transport checksums
- ext4, various database checksums
Verifying an implementation
Width 32, polynomial 0x1EDC6F41, initial value 0xFFFFFFFF, final XOR 0xFFFFFFFF, both input and output reflected. The check value for 123456789 is 0xE3069283.
If a hardware CRC32C instruction and a software table-driven implementation disagree, the mismatch is almost always in initial value, final XOR, or reflection handling rather than the polynomial itself — verify each parameter against the check value before assuming a hardware bug.
Primary sources
CRC32C's use in iSCSI traces to RFC 3720 and its successor RFC 7143, with RFC 3385 documenting the CRC/checksum considerations behind the choice. SCTP's use of the same polynomial is defined in RFC 4960 (Stream Control Transmission Protocol), which replaced the original checksum with CRC32C. NVMe transport usage is defined in the NVM Express Base Specification published by NVM Express, Inc. The CRC32C parameter set itself is cross-referenced against the Catalogue of CRC Algorithms (reveng.sourceforge.io).
CRC32C (iSCSI / NVMe) guide FAQ
What's the difference between CRC32C and regular CRC-32?
CRC32C (CRC-32/ISCSI) uses the Castagnoli polynomial 0x1EDC6F41 rather than the 0x04C11DB7 polynomial behind CRC-32/ISO-HDLC. The Castagnoli polynomial has stronger burst-error detection at typical storage and network block sizes and is hardware-accelerated on modern CPUs, which is why iSCSI, SCTP, and several NVMe transports use it instead.
Can CRC32C and CRC-32/ISO-HDLC share the same code path?
Only if the polynomial, not just the width and reflection settings, is configurable. Both are 32-bit, both reflect input and output, and both use an all-ones initial value and final XOR — the polynomial is the only field that differs, but it is enough to make every result disagree.
Apply this reference
Change CRC parameters and compare standard algorithm results using the browser-based calculator.