From: valerij zaporogeci <vlrzprgts@gmail.com>
To: Andrew Fish <afish@apple.com>
Cc: Michael Zimmermann <sigmaepsilon92@gmail.com>,
edk2-devel <edk2-devel@lists.01.org>
Subject: Re: Crc32
Date: Tue, 30 Aug 2016 18:17:30 +0300 [thread overview]
Message-ID: <CANPuzFxM8=4QPP2qoNU7YQwtqs6t3r8NiXkw6VobL8BFPAdH4Q@mail.gmail.com> (raw)
In-Reply-To: <91B24DF7-4F53-4DEF-A600-755A69368B79@apple.com>
well, that bit in the 32th (bit 33) term of the polynomial is
"implied", but it should be used, otherwise it would not give a 32 bit
remainder (crc). if to count 04c11db7 as a polynomial, its non-zero
msbit is bit 26, so with it, it would be crc25.
Why results don't match, I suspect it's becuase that pre- and post-
processing involved. Tianocore algorithm inverses bits at the
beginning and in the end.
Pure definition of CRC doesn't require this. It would be good to know
the exact specification on the algorithm and its nuances.
And of course in the pure case, calculating CRC on the polynomial
itself should give 0 (since polynomial itself is multiple of itself).
It's the easiest way to check. So CRC of 104c11db7 = 0
In the the above calculator (in the Michael's response), neither
CRC(104c11db7) nor CRC(04c11db7) gives 0. (4E24FFBE and B79B7E7A
respectively).
So if it is a right CRC32, then it's not a pure CRC mathematically.
and additionally processed. How? and where it is possible to learn
that?
2016-08-30 17:09 GMT+03:00, Andrew Fish <afish@apple.com>:
>
>> On Aug 30, 2016, at 6:32 AM, valerij zaporogeci <vlrzprgts@gmail.com>
>> wrote:
>>
>> Thank you.
>> But the polynomial value for CCITT crc32 is 104c11db7, not its tail
>> 04c11db7.
>
> The spec does not say it is a CCITT, it states it uses the CCITT algorithm
> with a seed polynomial of 0x04c11db7.
>
>
>> And this whole mess with all those online calculators was the exact
>> reson I asked here. Because they mostly give WRONG result. As your
>> example. It's easy to check it's wrong. Because for example leading
>> zeroes in the message MUST not change the Crc32.
>> Here we have:
>> for 01 -> CD39D477
>> for 00 01 -> D71E16AC
>> and so on.
>> Also, it's obvious that Crc32(1) would be a polynomial without the
>> most significant non-zero bit, thus crc32 from 1 by the polynomial
>> 104c11db7 would be 04c11b7.
>> The only online calculator so far giving right results is here:
>> https://ghsi.de/CRC/index.php?Polynom=100000100110000010001110110110111&Message=0104c11db7
>>
>> I wrote function following the mathematics of the Crc and it gives
>> results exactly like in the above calculator.
>> It's fun to imagine what happens with such an incompatibilty for
>> example in case of GPT header.
>>
>
> As far as I can tell this is used in a lot of real world things: HDLC, ANSI
> X3.66, ITU-T V.42, Ethernet, Serial ATA, MPEG-2, PKZIP, Gzip, Bzip2,
> PNG,[36] many others[1]
>
> I think Ken added this to the spec in the last millennium. Ken's background
> was networking and Windows X86 HAL so I'm assuming he picked the same CRC as
> Ethernet?
>
> It is always possible we could have botched the math some place along the
> way and not noticed as we are self consistent so everything appears to
> work.
>
> Thanks,
>
> Andrew Fish
>
> [1] https://en.wikipedia.org/wiki/Cyclic_redundancy_check
>
>
>> 2016-08-30 14:08 GMT+03:00, Michael Zimmermann
>> <sigmaepsilon92@gmail.com>:
>>> well as u already said, the spec says it uses 'a standard CCITT32 CRC
>>> algorithm with a seed polynomial value of 0x04c11db7'
>>>
>>> this is the implementation which confirms it:
>>> https://github.com/tianocore/edk2/blob/master/MdeModulePkg/Core/RuntimeDxe/Crc32.c
>>>
>>> after testing it it indeed produces CCITT32 results like this online
>>> generator:
>>> http://g6auc.me.uk/CRC32/index.html
>>>
>>> Thanks
>>> Michael
>>>
>>> On Tue, Aug 30, 2016 at 2:54 AM, valerij zaporogeci
>>> <vlrzprgts@gmail.com>
>>> wrote:
>>>
>>>> Hi, all.
>>>> Yet another dumb question from me.
>>>> UEFI specification has Crc32 calculation service and uses Crc32 in
>>>> several places. but it only humbly mentions in the note somewhere in
>>>> the description of System Table about what exact one it wants. Namely
>>>> it states that the polynomial seed is 04c11db7. And that's all.
>>>> My question is - does really the specification means the 33-bit
>>>> polynomial
>>>> 104c11db7? And is the algorithm just a plain remainder calculation
>>>> without any additional pre/post processing of it? So that for example
>>>> Crc32 of the 4-byte sequence b16b00b5 would be
>>>> 8c1f0a7c?
>>>> Thank you.
>>>> _______________________________________________
>>>> edk2-devel mailing list
>>>> edk2-devel@lists.01.org
>>>> https://lists.01.org/mailman/listinfo/edk2-devel
>>>>
>>>
>> _______________________________________________
>> edk2-devel mailing list
>> edk2-devel@lists.01.org
>> https://lists.01.org/mailman/listinfo/edk2-devel
>
>
next prev parent reply other threads:[~2016-08-30 15:17 UTC|newest]
Thread overview: 11+ messages / expand[flat|nested] mbox.gz Atom feed top
2016-08-30 0:54 Crc32 valerij zaporogeci
2016-08-30 11:08 ` Crc32 Michael Zimmermann
2016-08-30 13:32 ` Crc32 valerij zaporogeci
2016-08-30 14:09 ` Crc32 Andrew Fish
2016-08-30 15:17 ` valerij zaporogeci [this message]
2016-08-30 16:15 ` Crc32 Andrew Fish
2016-08-31 1:11 ` Crc32 valerij zaporogeci
2016-08-31 3:54 ` Crc32 Michael Zimmermann
2016-08-31 14:31 ` Crc32 valerij zaporogeci
2016-08-31 23:27 ` Crc32 valerij zaporogeci
2016-09-01 22:36 ` Crc32 valerij zaporogeci
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-list from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to='CANPuzFxM8=4QPP2qoNU7YQwtqs6t3r8NiXkw6VobL8BFPAdH4Q@mail.gmail.com' \
--to=devel@edk2.groups.io \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox