EXT4 CRC32C 체크섬 알고리즘이 제대로 문서화되어 있지 않습니다.

EXT4 CRC32C 체크섬 알고리즘이 제대로 문서화되어 있지 않습니다.

그래서 EXT4 체크섬에 대해 연구하고 있습니다.

내가 찾은이 페이지체크섬을 직접 계산해 보세요. 나는 간단하게 들리기 때문에 수퍼블록으로 시작했습니다. "체크섬 필드까지의 전체 수퍼블록"입니다.

하지만 작동하지 않습니다. 슈퍼블록으로는 동일한 결과를 얻을 수 없습니다.

이 작업을 위해 저는 Python으로 슈퍼블록 체크섬 계산기를 작성했습니다. 당신은 볼 수 있습니다GitHub의 내 프로그램. 나는 많은 것을 시도했습니다.

먼저 전체 슈퍼블록을 체크섬(1020바이트)까지 읽어서 CRC32C에 넣어 보았습니다(알고리즘은 다음과 같습니다).pip 독립적인 라이브러리). 위키에 이렇게 써있지만 작동하지 않습니다.

그런 다음 전체 슈퍼블록을 간단히 뒤집었습니다. 나는 이것이 별로 의미가 없다고 생각한다. 그리고 나는 또 실패했다.

그 후에는 좀 더 정교한 방법을 시도했습니다. 슈퍼블록의 모든 필드를 개별적으로 반전해 보았습니다. 보시다시피 또 다른 결과를 제공합니다.

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

관련 정보