CRC catalog + audit/integrity verification for binary dumps (Reveng standard library)
Project description
chiptools_crc
A small, dependency-free Python library for CRC / checksum computation and read-only integrity auditing of binary dumps.
It provides:
Crc(width, poly, init, refin, refout, xorout)— a fully parametric CRC engine following the Williams/Rocksoft (Reveng) model.Sum(width, init)— additive modular checksums (the RevengSUMfamily).CATALOG— 61 standard, public Reveng models keyed by canonical name (4 SUM + 20 CRC-8 + 30 CRC-16 + 7 CRC-32), each carrying its published check value.verify_integrity(...)— recomputes the checksums stored in a dump and reports which protected regions no longer match: an objective "this dump was edited at some point" signal for workshop diagnostics.
The catalogue contains only standard, published algorithms. There are no firmware-specific "magic" constants and no checksum-forging / parameter-recovery helpers: this library computes and verifies checksums, it does not re-sign modified dumps.
Install
pip install . # standard install (provides the CLI)
# or, just to run the test suite:
pip install -r requirements.txt
The library itself has no runtime dependencies (pure standard library).
Installing with pip also registers the chiptools-crc console command.
Quick start — computing a CRC
from chiptools_crc import CATALOG, Crc
# Use a catalogue model by name:
crc32 = CATALOG["CRC-32/ISO-HDLC"]
print(crc32.compute_hex(b"123456789")) # -> cbf43926
# Or define your own parameter set:
mycrc = Crc(width=16, poly=0x1021, init=0xFFFF,
refin=False, refout=False, xorout=0x0000, name="CCITT-FALSE")
print(hex(mycrc.compute(b"123456789"))) # -> 0x29b1
Browsing the catalogue
from chiptools_crc import CATALOG, FAMILIES
print(FAMILIES["CRC-16"]) # list of CRC-16 model names
for name in FAMILIES["CRC-32"]:
m = CATALOG[name]
print(f"{name:18s} check=0x{m.check:08X}")
Integrity auditing (read-only)
verify_integrity answers one question objectively: do the checksums stored
in this dump still match its contents? If a region was edited in the past
without a consistent recompute, it shows up as ALTERED.
from chiptools_crc import CATALOG, Region, verify_integrity
data = open("dump.bin", "rb").read()
algo = CATALOG["CRC-32/BZIP2"]
# Describe each checksum-protected region of the dump:
# Region(name, data_start, data_len, crc_start, crc_len, endian)
regions = [
Region("block_A", 0x0000, 0x1000, 0x1000, 4, "big"),
Region("block_B", 0x1004, 0x0800, 0x1804, 4, "big"),
]
report = verify_integrity(data, regions, algo)
print(report)
# [OK ] block_A: stored=0x12AB34CD computed=0x12AB34CD
# [ALTERED] block_B: stored=0x00000000 computed=0x9F3C71A2
# --- verdict: 1 ALTERED REGION(S) ---
if not report.consistent:
for r in report.altered:
print("tampered region:", r.name)
verify_integrity never writes anything back; it only reports. The caller
supplies both the algorithm and the region layout, so the function is generic
and not tied to any particular firmware.
Quick start (CLI)
The package installs a chiptools-crc command (equivalently
python -m chiptools_crc).
List the catalogue:
python -m chiptools_crc list
python -m chiptools_crc list --family CRC-32
# CRC-32/ISO-HDLC width=32 check=0xCBF43926
# CRC-32/BZIP2 width=32 check=0xFC891918
# ...
Audit a dump — --region START:LEN[:STORED_HEX], repeatable. START and
LEN accept decimal or 0x.. hex.
# Stored checksum sits immediately after the region (the default convention):
python -m chiptools_crc audit dump.bin --algo CRC-32/BZIP2 --region 0:0x4000
# Several regions at once:
python -m chiptools_crc audit dump.bin --algo CRC-16/MODBUS \
--region 0x0:0x1000 --region 0x1002:0x800 --endian little
# Compare against a stored value given inline (no read from the file):
python -m chiptools_crc audit dump.bin --algo CRC-32/BZIP2 --region 0:0x4000:cbf43926
# Stored checksum at an explicit offset:
python -m chiptools_crc audit dump.bin --algo CRC-32/BZIP2 --region 0:0x4000 --crc-at 0x7FFC
Output and exit code:
[OK ] region@0x0+0x4000: stored=0x4342F70A computed=0x4342F70A
--- verdict: COHERENT ---
The command exits 0 when every region is coherent and 1 when at least
one region is ALTERED, so it drops straight into shell scripts and CI:
if ! chiptools-crc audit dump.bin --algo CRC-32/BZIP2 --region 0:0x4000; then
echo "dump failed integrity audit"
fi
Machine-readable output with --json (handy for a workshop management
system or a CI step):
chiptools-crc audit dump.bin --algo CRC-32/BZIP2 \
--region 0x0:0x40 --region 0x44:0x40 --json
{
"file": "dump.bin",
"algo": "CRC-32/BZIP2",
"regions": [
{
"name": "region@0x0+0x40",
"status": "OK",
"computed_hex": "4342f70a",
"stored_hex": "4342f70a",
"consistent": true
},
{
"name": "region@0x44+0x40",
"status": "ALTERED",
"computed_hex": "0f8af635",
"stored_hex": "00000000",
"consistent": false
}
],
"verdict": "ALTERED",
"altered_count": 1
}
The exit code is the same with --json (0 coherent / 1 altered).
Audit use case in workshop diagnostics
A common diagnostic question, before any work is done on a module, is simply:
"is this dump internally coherent, or was it edited at some point?" That is
a yes/no question with an objective answer — and that answer is exactly what
verify_integrity / the audit command produce.
Typical workflow:
- Read the module's contents to a
.bindump with your normal tool. - Know (from the module's documentation or your own reverse-engineering) which byte ranges are checksum-protected and where each checksum is stored.
- Run an audit. Every region whose stored checksum still matches the recomputed
value is reported
OK; any region that does not is reportedALTERED.
chiptools-crc audit module_dump.bin --algo CRC-32/BZIP2 \
--region 0x0000:0x4000 --region 0x4004:0x4000
An ALTERED verdict is objective evidence that a protected block was changed
without a consistent checksum recompute. That is useful for incoming inspection,
for documenting the state of a module before/after servicing, and for flagging
dumps that are not internally consistent.
Note on scope: this tool only reports. It does not recompute or write a "corrected" checksum back into a dump — there is deliberately no write path and no checksum-(re)signing helper here. It is an inspection instrument.
Running the tests
python -m pytest -q
The suite validates b"123456789" against 14 independently hard-coded Reveng
check values, verifies the full catalogue is self-consistent, and exercises the
integrity-audit path (coherent dump, single-byte tamper detection, endianness,
bounds checking).
Changelog
See CHANGELOG.md. This is the initial 0.1.0 release.
License
MIT — see LICENSE.
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file chiptools_crc-0.1.0.tar.gz.
File metadata
- Download URL: chiptools_crc-0.1.0.tar.gz
- Upload date:
- Size: 16.5 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
3793a436e7c485898ae31ec8a6a28092e660223a30af898d496f9683250f0c92
|
|
| MD5 |
4fccd3722c40c7a19954ea4ff98895a1
|
|
| BLAKE2b-256 |
d2165d470adabb6f572dd752375cf308a783e7c24b1d609ab96cd7a96d46b466
|
Provenance
The following attestation bundles were made for chiptools_crc-0.1.0.tar.gz:
Publisher:
publish.yml on chip-tools/chiptools-crc
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
chiptools_crc-0.1.0.tar.gz -
Subject digest:
3793a436e7c485898ae31ec8a6a28092e660223a30af898d496f9683250f0c92 - Sigstore transparency entry: 1732334037
- Sigstore integration time:
-
Permalink:
chip-tools/chiptools-crc@5847a6aa9c85935d89f4c5f9feb76b404e1b821c -
Branch / Tag:
refs/tags/v0.1.0 - Owner: https://github.com/chip-tools
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@5847a6aa9c85935d89f4c5f9feb76b404e1b821c -
Trigger Event:
push
-
Statement type:
File details
Details for the file chiptools_crc-0.1.0-py3-none-any.whl.
File metadata
- Download URL: chiptools_crc-0.1.0-py3-none-any.whl
- Upload date:
- Size: 13.9 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
a6e3808e26a9f8a9ce1986735120c76e5e8c43ea9e1291041f42eed15b4538b9
|
|
| MD5 |
a28142f6c184d86e58fadc89a7668709
|
|
| BLAKE2b-256 |
42d9d538fe51dd7a02de0f668c5f51dc3bbeee0162653e3a5d0c56b49fb1fa6c
|
Provenance
The following attestation bundles were made for chiptools_crc-0.1.0-py3-none-any.whl:
Publisher:
publish.yml on chip-tools/chiptools-crc
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
chiptools_crc-0.1.0-py3-none-any.whl -
Subject digest:
a6e3808e26a9f8a9ce1986735120c76e5e8c43ea9e1291041f42eed15b4538b9 - Sigstore transparency entry: 1732334068
- Sigstore integration time:
-
Permalink:
chip-tools/chiptools-crc@5847a6aa9c85935d89f4c5f9feb76b404e1b821c -
Branch / Tag:
refs/tags/v0.1.0 - Owner: https://github.com/chip-tools
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@5847a6aa9c85935d89f4c5f9feb76b404e1b821c -
Trigger Event:
push
-
Statement type: