You have been handed a ZIP and a hash. This page explains what is in it, how to check it with any SHA-256 tool, and what a clean result does and does not prove. Nothing here needs an account.
A Cerenaid evidence pack is a ZIP file produced by the assessed organization for a date range. It contains the sealed record of every key ceremony completed or aborted in that period, the key inventory and component custody register as they stood when the pack was built, the members and their roles, and the organization's audit chain for the period together with a full recomputation of that chain from its first event.
Every file in the pack is listed in manifest.json with its SHA-256 hash. The pack hash is the SHA-256 of manifest.json itself. It is printed on cover.pdf, in README.txt, and on the organization's Evidence page. Checking any of this needs a SHA-256 tool, which every operating system already ships (see section 3), and nothing from Cerenaid: no account, no login, no network.
The pack contains no key material and no key components. Cerenaid never stores them; the KCV field accepts at most six hex characters, and every free-text field is screened for anything that looks like a key.
| File | What it is |
|---|---|
cover.pdf | Organization, period, retention policy and legal hold, counts, audit chain head, pack hash, file list. |
README.txt | Contents, the documented retention policy, and the three verification steps. |
manifest.json | Every evidence file with its SHA-256 and size, plus the chain head and verification result at build time, and the organization's documented retention period and legal hold status. The pack hash covers this file. |
ceremonies.csv | Index of the ceremony records in the period: title, template and version, status, facility, participants with roles, attestation count, record hash, and the first and last audit sequence numbers the ceremony touched. |
ceremonies/*.pdf | One sealed record per ceremony. See section 5. |
keys.csv, inventory.json | Key inventory at build time: label, type, algorithm, key block version, usage, KCV, cryptoperiod, rotation due, devices, facility, counterparty, status. The JSON also carries devices, facilities and counterparties. |
custody.csv | Every key component: custodian, tamper-bag serial number, safe, status, the ceremony that issued it, destruction date if any. |
custody-events.csv | Deposits, withdrawals, transfers, inspections and destructions in the period, with who recorded each and the witness where one is required. |
members.csv | Members with role, status, join date and the date they enrolled an authenticator. |
audit/events.jsonl | Audit events in the period, one JSON object per line, each with its hash and the hash of the event before it. |
audit/seals.csv | Daily seals in the period: the sequence number and chain head recorded each day at 00:10 UTC. |
audit/verification.txt | Result of recomputing the whole chain from event 1 at build time, and the exact hashing method. |
Unzip the pack into a folder and open a terminal there. You do not need to install anything: macOS has shasum, Linux has sha256sum, and Windows has certutil and PowerShell's Get-FileHash. If you prefer not to use a terminal, 7-Zip on Windows adds a right-click CRC SHA → SHA-256 menu to any file, and QuickHash GUI is a free, open-source hash tool for Windows, macOS and Linux. Any of these produces the same 64-character value.
Compute the SHA-256 of manifest.json and compare it with the pack hash on the cover page and the one the organization shows you on its Evidence page. They should be identical.
# macOS
shasum -a 256 manifest.json
# Linux
sha256sum manifest.json
# Windows (Command Prompt)
certutil -hashfile manifest.json SHA256
# Windows (PowerShell)
Get-FileHash manifest.json -Algorithm SHA256Compare each file's SHA-256 with the value in manifest.json. Any of the tools above will do, one file at a time. This checks all of them at once on macOS or Linux with jq installed:
jq -r '.files[] | "\(.sha256) \(.path)"' manifest.json | shasum -a 256 -c -
# on Linux use: sha256sum -c -Every line should end in OK. A file that fails was changed after the pack was built.
Cerenaid records the chain head every day and, when the organization has set a security officer address, emails it there. Ask for those emails and compare their heads with audit/seals.csv. A seal that exists outside the system is what makes the chain independent of it.
Every change to the organization's records is an audit event. Each event stores a hash of its own content joined to the hash of the event before it, so changing or removing any past event changes every hash after it. Cerenaid recomputes the full chain when a pack is built and reports the result in audit/verification.txt. You can recompute it yourself from audit/events.jsonl.
The method, exactly as the verification file states it:
hash = hex( SHA-256( canonicalJSON({orgId, seq, at, actorUid, actorRole, action, target, data}) || prevHash ) )canonicalJSON is JSON with object keys sorted recursively and no whitespace.at is the event time in milliseconds since the Unix epoch.prevHash is the hex hash of the previous event. For event 1 it is the genesis value: a string of sixty-four ASCII "0" characters, text rather than null bytes.|| is plain string concatenation: the canonical JSON followed immediately by the 64 hex characters.To spot-check one event: take any line in events.jsonl, build the payload from those eight fields, canonicalize it, append the line's prevHash, hash it, and compare with the line's hash. Then confirm that the next line's prevHash equals this line's hash. The events file covers the pack's period only; the verification file covers the chain from its first event.
Each line is already canonical JSON: keys sorted, timestamp as a number. Drop the id, prevHash and hash fields, keep the other eight, and hash what remains followed by the line's prevHash.
Each PDF in ceremonies/ is the record of one ceremony: what template and version was used, who was present, every step in order, and every signature. The things worth checking:
members.csv shows when each person enrolled an authenticator. Each attestation hashes the step chain head and template hash at that moment, so it is tied to exact content.members.csv shows the new one and the audit chain carries a rename event with both names; the sealed record is not rewritten.Aborted ceremonies are kept and included, with the reason and the steps committed before the abort.
Questions about the format, or something in a pack that does not check out: support@cerenaid.com.