EXT4 CRC32C チェックサム・アルゴリズムが正しく文書化されていません。

EXT4 CRC32C チェックサム・アルゴリズムが正しく文書化されていません。

そこでEXT4チェックサムについて研究しています。

私が見つけたこのページチェックサムを直接計算してみてください。私は簡単に聞こえるので、スーパーブロックから始めました。 「チェックサムフィールドまでの全体スーパーブロック」です。

しかし、うまくいきません。スーパーブロックでは同じ結果が得られません。

このために、私はPythonでスーパーブロックチェックサム電卓を作成しました。あなたは見ることができますGitHubの私のプログラム。たくさん試してみました。

まず、スーパーブロック全体をチェックサム(1020バイト)まで読み、CRC32Cに入れてみました(アルゴリズムは次のとおりです)。pip独立ライブラリ)。 Wikiにこう書いていますが、うまくいきません。

その後、スーパーブロック全体を簡単に反転しました。これはあまり意味がないと思います。そして私はまた失敗しました。

その後、もう少し洗練された方法を試しました。スーパーブロックのすべてのフィールドを個別に反転してみました。ご覧のとおり、別の結果を提供します。

Raw data: 1F DC 5E 4A

2-byte fields reversed: DC 1F 4A 5E

Full data reverse: 4A 5E DC 1F

今回も失敗しました。これで、「チェックサムフィールドまでの全体スーパーブロック」というフレーズのすべての説明が終わります。

すべてのアルゴリズムにゼロパディングされたチェックサムフィールドを追加し、charフィールドとu8フィールドは反転せず、リトルエンディアンフィールドのみを反転してみました(実際には良いアイデアのようです)。

しかし、元のスーパーブロックと同じチェックサムを得る可能性はありません。

私のスクリプトはスーパーブロックに対して次の出力を生成します。

00c0390000cae600198a0b00c6aca40039a835000000000002000000020000000080000000800000002000001ee68c5c17e68c5c2000ffff53ef01000100000055936d5c000000000000000001000000000000000b000000000100003c000000c60200006b040000d6eb1a5613a44a8a91b66dbfe7cbbca9000000000000000000000000000000002f0061726765740000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000800000000000000f00c3000ca7d5363a49944fd9db16c0f95cfab15010140000c0000000000000055936d5c0af3020004000000000000000000000000800000008070000080000000800000000071000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000200020000100000000000000000000000000000000000000040100000d63df0f00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000fe3731ed

生のチェックサム(未計算!):0xfe3731ed

フルスーパーブロック計算:0xffffffffL - これは常に発生し、いくつかのオーバーフローエラーがある可能性があります。

チェックサムなしで計算されたスーパーブロック:0x12cec801L

チェックサムなしで計算すると、スーパーブロックは完全に反転します:0x7fe225e5L

計算されたフィールド反転スーパーブロック:0x8cce5045L

どの文書も見つからず、ext4ソースコードファイルはコメントがあまりにも不便で、非常に複雑で理解できません。

ベストアンサー1

いいね! Reddit(nightbladeofmalice)から回答を得ました。この人は、0xFFFFFFFFで元のスーパーブロック(0x12cec801)のチェックサムを除くと反転された(ビッグエンディアン)元のチェックサムが出るという事実を見つけました。

元のスーパーブロック:

生のチェックサム(未計算のビッグエンディアン!):0xf37cde15

CRC32Cにチェックサムフィールドがない生のスーパーブロック(1020バイト):0xc8321eaL

反転チェックサム(0xFFFFFFFF - 前のフィールド):0xf37cde15L

おすすめ記事