Search code examples
mathchecksumcrc

How could I determine this checksum pattern?


Let's assume that I have 512-byte packets plus a 16-bit CRC at the end. I would like to determine what the CRC parameters are.

It's a Fujitsu chip, where I'm writing the the flash with a programmer, the programmer calculates the CRC for me, and I read out the CRC with an oscilloscope. I have the ability to check every possible combination.

My test messages are 512 zeros except for one byte that I set to the values 0 to 17 in decimal. The one byte is one of the first four or last two in the packet. Here are the resulting CRCs in hexadecimal, where the rows are the value of the byte, and the columns are which byte is set:

   00       01       02       03              510       511
00 00       00       00       00              00        00
01 0x8108   0x0100   0x3020   0xC6B0          0xF1F0    0x8108
02 0x8318   0x0200   0x6040   0x0C68          0x62E8    0x8318
03 0x0210   0x0300   0x5060   0xCAD8          0x9318    0x0210
04 0x8738   0x0400   0xC080   0x18D0          0xC5D0    0x8738
05 0x0630   0x0500   0xF0A0   0xDE60          0x3420    0x0630
06 0x0420   0x0600   0xA0C0   0x14B8          0xA738    0x0420
07 0x8528   0x0700   0x90E0   0xD208          0x56C8    0x8528
08 0x8F78   0x0800   0x0008   0x31A0          0x0AA8    0x8F78
09 0x0E70   0x0900   0x3028   0xF710          0xFB58    0x0E70
10 0x0C60   0x0A00   0x6048   0x3DC8          0x6840    0x0C60
11 0x8D68   0x0B00   0x5068   0xFB78          0x99B0    0x8D68
12 0x0840   0x0C00   0xC088   0x2970          0xCF78    0x0840
13 0x8948   0x0D00   0xF0A8   0xEFC0          0x3E88    0x8948
14 0x8B58   0x0E00   0xA0C8   0x2518          0xAD90    0x8B58
15 0x0A50   0x0F00   0x90E8   0xE3A8          0x5C60    0x0A50
16 0x9FF8   0x1000   0x0010   0x6340          0x1550    0x9FF8
17 0x1EF0   0x1100   0x3030   0xA5F0          0xE4A0    0x1EF0

As you can see the first and last bytes give the same value. I tried several variations of CRC-16, but without much luck. The closet one was CRC-16 with polynomial 0x1021 and initial value 0.


Solution

  • The fact that every single CRC ends in 0 or 8 strongly suggests that it is not a 16-bit CRC, but rather a 13-bit CRC. Indeed, all of the sequences check against a 13-bit CRC with polynomial 0x1021 not reflected, initial value zero, and final exclusive-or zero.

    We can't be sure about the initial value and final exclusive-or unless you can provide at least one packet with a length other than 512. With only examples of a single length, there are 8,191 other combinations of initial values and final exclusive-ors that would produce the exact same CRCs.