Recording Integrity & Compliance: Timestamps, WORM, Audit
← Back to: Security & Surveillance
Evidentiary recording means every clip can be verified later: trusted time + signed manifests + tamper-evident/immutable storage + append-only audit logs. If anything is deleted, replayed, or re-exported, the verification report must show exactly what failed (signature/hash/time/audit) and why.
Evidence-grade video: trusted time, verifiable integrity, immutable retention, and sealed audit trails.
H2-1. Quick Answer: The Evidence-Grade Recording Toolkit
Evidence-grade recording is offline verifiable: it proves when an event happened, what content was captured, and that it was not altered after capture. Achieve this with a trusted timestamp proof, a signed manifest of segment hashes, an immutability/retention lock that prevents silent edits, and sealed audit logs that preserve chain-of-custody.
- Time: the recording carries a traceable time source and detects clock steps/rollback (continuity is provable).
- Signature: a signed manifest binds segment hashes + indexes + time range (tampering becomes detectable offline).
- Immutability: WORM/retention lock prevents modification/deletion during the retention window (deletes become auditable events).
- Audit: append-only, sealed logs record access/export/config/time changes (rollback or gaps are detectable).
- Timestamp proof: time source identity + last sync age + clock-step events are consistent with the timeline.
- Signature verify: manifest signature validates; recomputed segment hashes match; index/time continuity shows no gaps.
- Immutability policy state: retention lock is active; delete/overwrite attempts are denied and logged.
H2-2. Threat Model: How Recordings Become “Untrustworthy”
Integrity failures are rarely “noise” problems. Evidence breaks when timelines can be forged, segments can be removed or inserted, exports can be edited outside the system, or privileged users can change retention/logging without leaving traces. A practical threat model converts these risks into observable anomalies that verification tools can detect and audit logs can explain.
- Clock spoof / rollback: event time is manipulated to create false alibis or hide correlation with alarms.
- Segment deletion / insertion: seconds are removed or replaced while the clip still “plays fine.”
- Replay: old footage is presented as new (often paired with clock manipulation).
- Export tampering: clips are edited after export (re-encoded, trimmed, or stitched) to change meaning.
- Insider access: retention policy, time settings, or logs are altered by privileged roles without an accountable trail.
- Time discontinuity: clock steps, rollback, or “sync age” inconsistent with the timeline.
- Missing index: segment sequence gaps or time window gaps (suggests deletion/insertion).
- Signature mismatch: manifest or proof verification fails (suggests edit, rewrap, or wrong provenance).
- Audit gaps: missing/rewritten events, non-monotonic sequences, or broken ledger sealing.
-
Clock spoof / rollback
Looks like: timestamps jump backward/forward; exported clips no longer align with alarms/access logs.
Proves it: clock-step events, non-monotonic counters, abnormal sync age, time discontinuity flags.
First counter: traceable time source + clock-jump policy + mandatory audit events for time changes. -
Segment deletion / insertion
Looks like: “missing seconds” around critical moments; continuity feels off but not obvious in playback.
Proves it: missing index, hash-chain break, Merkle proof failure, manifest verify fails.
First counter: per-segment hashes + chained proofs + signed manifests tied to sequence/time range. -
Replay
Looks like: repeated scenes across different days; footage conflicts with independent time/event sources.
Proves it: timestamp proof inconsistency, identity-binding mismatch, monotonic counter anomalies.
First counter: device identity binding in manifests + time continuity evidence + sealed audit trail. -
Export tampering
Looks like: exported clip “works” but metadata is missing or format has been re-wrapped/edited.
Proves it: signature mismatch, segment hash mismatch, missing/altered manifest entries.
First counter: evidence bundle export (segments + manifest + signature + cert chain reference) for offline verification. -
Insider access
Looks like: retention changes, log settings toggled, or deletes that leave no accountable trace.
Proves it: audit gaps, broken ledger roots, policy state changes without sealed events.
First counter: append-only sealed audit ledger + immutability enforcement + “deny+audit” delete semantics.
SEO note for later chapters: each mechanism should explicitly reference one or more detection signals above, so every claim is testable in the field.
H2-3. Timestamp Architecture: Where Trusted Time Comes From (and How It Proves Itself)
“Accurate time” is not enough for evidentiary video. Time must be traceable (a known source), fresh (recently synchronized), and continuous (no silent jumps or rollbacks). A timestamp architecture therefore records not only timestamps, but also time-source identity, sync age, and step/rollback events so verifiers can judge whether the timeline is trustworthy.
- GNSS: strong independence, but must detect jamming/spoofing and log lock/holdover transitions.
- NTP: easiest deployment, but time can drift or be manipulated; requires strict logging of sync freshness and corrections.
- PTP: best precision when available; evidence focuses on domain/availability and correction events, not hardware timestamp circuitry.
- RTC + hold-up: keeps time across brief outages; reliability decreases with long holds and must be recorded as a state.
- Monotonic counter: a rollback detector; if wall-clock time moves backward, monotonic evidence should not.
- Slew (gradual correction): preserves timeline continuity; record “slew active” and the maximum correction window.
- Step (instant jump): breaks continuity; must create a clock-step event with magnitude and reason (sync, manual, detected rollback).
- Clock-jump detection: large offsets, backward steps, or non-monotonic evidence triggers a verifiable “time discontinuity” flag.
- Frame: highest granularity but highest metadata overhead; rarely required for compliance-grade exports.
- Segment: practical baseline; each segment carries index + start/end time, enabling gap detection.
- Manifest: the verification anchor; summarizes time-source state and any clock-step events for the exported window.
- time_source_id: GNSS / NTP / PTP / RTC-holdover (source identity for traceability).
- last_sync_age: time since last successful sync (freshness and trust decay).
- clock_step_events: step/rollback events with timestamp + magnitude + reason (continuity proof).
- monotonic_ctr: non-decreasing counter across boots/exports (anti-rollback evidence).
H2-4. What to Sign: Signing Granularity and Offline-Verifiable Evidence Bundles
Signing “the video file” is usually not enough: files can be re-wrapped, split, trimmed, or re-encoded while still playing normally. Evidence-grade integrity is achieved by signing a manifest that binds segment hashes, sequence, time range, and device identity, enabling verifiers to reproduce checks offline and detect gaps, insertions, or edits with clear failure reasons.
- Segment signing: very fine-grained, but high compute/key-use overhead and slower verification for long exports.
- Manifest signing: one signature covers the whole export window when the manifest includes hashes + order + timing.
- Recommended baseline: segment hashes + signed manifest; optionally sign critical event segments for higher assurance.
- segment hashes (per segment): proves content integrity and detects edits.
- index sequence (S1…Sn): detects deletion/insertion/reordering.
- start/end time + time evidence summary: binds timeline to H2-3 proof fields.
- device id (and cert reference): prevents source swapping and replay claims.
- policy version: proves the retention/signing/audit policy in effect for this evidence window.
- hash_algo / sign_algo: preserves long-term verifiability across algorithm upgrades.
- Step 1: validate certificate chain (or trust anchor reference) and verify the manifest signature.
- Step 2: recompute each segment hash and compare with manifest entries.
- Step 3: check sequence/time continuity (detect missing index/time gaps).
- Output: verify_status = PASS/FAIL and a clear reason (signature fail / hash mismatch / index gap / time discontinuity).
- manifest_id: unique identifier for the exported evidence set.
- segment_count: expected number of segments within the window.
- hash_algo / sign_algo: algorithm IDs for long-term verification.
- verify_status: verification outcome (PASS/FAIL) produced by the verifier.
H2-5. Hash Chaining & Merkle Proof: Making “One-Second Deletions” Impossible to Hide
Playback can look normal even after selective edits. Evidence-grade integrity therefore relies on proofs that make deletions, insertions, and reordering mathematically detectable. A practical design combines per-segment hashes (content fingerprints), hash chaining (prev-hash continuity), and an optional Merkle root + proofs (fast verification of chosen segments) so verifiers can prove both what is present and what is missing.
- Each segment records a hash over payload plus minimal binding metadata (segment index and time range).
- This prevents “copy-paste” reuse because a segment moved to a different position/time causes verification mismatches.
- Each segment includes prev_hash pointing to the previous segment’s hash, forming a continuous chain.
- If a segment is deleted, the next segment’s prev_hash points to a non-existent predecessor, causing a chain break.
- Recomputing a forged chain requires rewriting hashes and resigning the manifest, which is blocked without the signing key.
- A Merkle tree builds a single root_hash over all segment hashes (leaves).
- For partial exports or spot-checks, a Merkle proof lets verifiers confirm selected segments belong to the signed set without hashing every segment in the archive.
- Proof-based checks are decisive for “verify these 3 minutes” workflows in investigations and audits.
- index discontinuity: missing sequence numbers (e.g., S7 jumps to S9).
- time discontinuity: segment end/start timestamps leave a provable gap or overlap.
- chain break: prev_hash mismatch indicates deletion/insertion/reorder attempts.
- root_hash: Merkle root anchoring the segment set.
- prev_hash: chain pointer for continuity checks.
- index_seq: expected segment order for gap detection.
- gap_detected: verifier outcome (true/false) driven by index/time/chain checks.
H2-6. Non-Repudiation: Identity Binding and Signing That Cannot Be Denied
Non-repudiation is not achieved by “using a signature” alone. It requires proving which device produced the evidence, ensuring the private key is not exportable or casually copied, and binding the signature to the exact integrity objects (manifest, root hash, time evidence, and policy version). Done correctly, a verifier can attribute a recording to a device identity and detect any attempt to forge, swap, or downgrade signing policies.
- Bind evidence to device identity using a unique identifier (UID/serial) and an associated device certificate.
- Store the device identifier inside the signed manifest so “source swapping” becomes detectable.
- Use a protected keystore concept (e.g., SE/TPM/secure enclave) where the private key is non-exportable.
- If available, include key_attestation evidence so verifiers can confirm the signature originated from a protected environment.
- Track authentication and misuse attempts via counters such as auth_fail_count to expose suspicious access patterns.
- Include sign_policy_ver in the signed manifest so policy changes cannot be hidden after an incident.
- Any policy changes should also be reflected in the sealed audit trail (linked later in the audit chapter).
- Step 1: compute per-segment hashes and continuity objects (prev_hash or Merkle root).
- Step 2: build a manifest that includes identity, time evidence summary, and policy version.
- Step 3: sign the manifest; verifiers validate signature first, then reproduce hash/chain checks.
- device_cert_id: the certificate identity used for the evidence signature.
- key_attestation (if present): proof that signing occurred in a protected keystore.
- sign_policy_ver: signing policy version bound into the signature.
- auth_fail_count: failed authorization attempts counter for anomaly indication.
H2-7. WORM & Immutability: Proving “Write-Once” Is Actually Enforced
“WORM” only matters if it is provable. Evidence-grade systems must show that recordings were stored under a non-downgradable immutability policy and that any attempt to delete or overwrite becomes an auditable event, not a silent disappearance. A practical design uses a policy gate (retention lock and holds), records the policy state alongside the evidence, and produces an immutability_proof_id that can be referenced by exports and audits.
- Physical WORM: media or system layer prevents overwrites; strongest “cannot rewrite” posture.
- Logical immutability: append-only with retention lock; relies on policy enforcement and state evidence.
- Both modes require a verifiable policy state snapshot to prove the system was locked during the recording window.
- Retention period: minimum time before deletion is allowed (policy-defined).
- Legal hold: a freeze that blocks deletion even after retention, until hold is released.
- Proof requires explicit states for lock and hold, plus a trace of any state transition.
- Tamper-evident: edits are detectable (hash/signature/audit gaps reveal changes).
- Tamper-resistant: edits are difficult or blocked (immutability gate denies overwrites/deletes).
- Evidence workflows typically need both: resistance reduces attack surface; evidence detects any residual failure.
- “Delete” should be a request that the policy engine evaluates, not a direct removal operation.
- Before retention expiry or under hold, deletion is Denied + Audited (explicit record of who/when/what/why).
- When deletion is allowed, it still must be Audited with a traceable event identifier and final state proof.
- Any missing segment without a matching audited deletion event is a high-confidence integrity anomaly.
- retention_lock_state: whether retention lock is enabled and non-downgradable during the window.
- hold_state: whether a hold is active (and its identifier/scope if applicable).
- delete_attempt_log: append-only records of delete/overwrite/retention-shortening attempts and outcomes.
- immutability_proof_id: an immutable policy proof reference tied to the recording/export package.
H2-8. Audit Logs: Who Viewed, Exported, or Changed Policy (Chain-Sealed Ledger)
A log file is not an audit ledger. Evidence-grade audit trails must be append-only, protected against deletion and rollback, and verifiable as a continuous sequence. A robust approach records a taxonomy of security-relevant events, links each event to the previous one via hash chaining, and periodically seals the ledger (for example, a daily seal) so any missing or rewritten event becomes detectable.
- Access: login/logout, authentication failures, role changes.
- Viewing: view/playback/search activity for protected time windows.
- Export: export start/finish, export package identifiers, destination labels.
- Configuration: policy changes, retention/hold changes, permission changes.
- Time & keys: time sync changes (step/slew), key rotation, certificate updates.
- Each event block Ek includes its payload plus hash(prev) to link to Ek-1.
- Removing or rewriting an event creates a chain break and an obvious discontinuity for verifiers.
- Ledger verification checks both event ordering and the hash linkage across the sequence.
- audit_seq must be strictly increasing; gaps indicate missing events.
- Use a monotonic counter concept to detect rollback (reverting to a prior ledger snapshot).
- Periodic ledger seals (e.g., daily seal) anchor the ledger root so forks or rewinds become provable.
- Any clock step/slew or time-source switch must produce an audit event with a unique identifier.
- This creates a closed loop: if timestamps become questionable, the ledger shows when and why.
- audit_seq: event sequence number (no gaps).
- audit_root_hash: ledger root (chain tail seal or Merkle root reference).
- export_event_id: export identifier linking ledger events to the exported package.
- config_change_id: configuration-change identifier linking policy state transitions to evidence windows.
H2-9. Export Package & Chain-of-Custody: Delivering Evidence That Stays Verifiable
Evidence often leaves the original system. The export package must therefore be self-verifying: it should prove integrity without relying on the recorder UI, network access, or platform trust. A robust export bundle includes the recording segments, a signed manifest that binds hashes and timestamps to device identity, and an audit excerpt that anchors the export action itself. A verifier should be able to produce a one-pass verification report (pass/fail + reasons) and keep a custody reference for downstream handling.
- Video segments: the exact time window delivered (original segments or windowed segments).
- Manifest: segment hashes, index/time ranges, chain/Merkle root, device identity, policy/version ids.
- Signature + cert chain: offline signature verification for the manifest (no platform dependency).
- Audit excerpt: a compact ledger slice proving the export event and relevant policy/time/key changes.
- exporter identity: role/account or device identity that initiated the export.
- reason code: a controlled label for why the bundle was produced (internal taxonomy).
- time range: start/end window (must match manifest and the exported segments).
- case id (optional): an external reference label that helps third parties index the evidence.
- Step 1: compute export_hash over the bundle (delivery fingerprint).
- Step 2: verify manifest signature + certificate chain (signature validity).
- Step 3: recompute segment hashes and verify chain/Merkle proof (no missing/injected segments).
- Step 4: cross-check audit excerpt (export event exists, fields match bundle_id/time window).
- Output: emit a verify_report_id and a report summary (PASS/FAIL + reasons).
- export_hash: bundle fingerprint for transfer/copy integrity.
- bundle_id: unique export bundle identifier referenced by audit and report.
- verify_report_id: identifier of the verification report produced by the verifier.
- custody_chain_id: identifier that tracks custody handling (handoffs) for the bundle.
H2-10. Long-Retention Pitfalls: Keys, Certificates, Algorithms, and Migration
Long retention is not only a storage problem—it is a future verification problem. Years later, the system must still validate old cases even after key rotation, certificate expiry, algorithm upgrades, and storage migration. The safe strategy is to version cryptographic material and algorithms, preserve verification context for historical proofs, and treat migrations as audited events followed by a new seal (“re-seal”) that never rewrites the original evidence objects.
- Rotate signing keys using key_version; new evidence uses new versions while old evidence remains verifiable.
- Preserve verification material for historical versions (public keys/cert chains and context references).
- Record every rotation as an auditable event so investigators can reproduce the exact verification context later.
- A certificate expiring later does not automatically invalidate a signature created earlier.
- Long-term verification requires preserving “valid-at-signing-time” context (time evidence + sealed audit references).
- Verification should report whether the signature was valid under the archived context for the evidence timestamp.
- Record algorithm identifiers in the manifest: algo_id for hash/sign choices.
- Support parallel verification for older algorithms or provide a compatible verifier for legacy cases.
- Upgrades should create forward-compatible proofs without discarding old verification paths.
- Migrations must produce a migration_audit_id that explains what moved, when, and how integrity was preserved.
- After migration, create a re_seal_event that anchors the new storage state (new root/seal) while referencing old proofs.
- Verification can then show a continuous lineage: original evidence → migration audit → re-seal → current storage.
- key_version: identifies which signing key produced the proof.
- algo_id: identifies the hashing/signing algorithms used for the case.
- re_seal_event: re-sealing record that anchors post-migration state.
- migration_audit_id: migration record that makes storage transitions provable.
H2-11. Validation & Field Debug Playbook: Minimal-Tool Tamper Drills
Integrity controls are only credible when they are testable. This chapter turns the evidence chain into an executable tamper-drill checklist: each tamper action maps to an expected failure point (signature, hash chain, time continuity, or audit continuity), with clear reason codes and the first remediation step. The goal is fast triage with minimal tools: an exported evidence bundle, an offline verifier, and the audit excerpt included in the bundle.
- Evidence bundle (segments + manifest + signature/cert chain + audit excerpt).
- Offline verifier that outputs PASS/FAIL + verify_fail_reason_code.
- Simple bundle hashing to compute export_hash (transfer fingerprint).
- Audit continuity checker (audit_seq gap + seal/root mismatch detection).
- Check #1 — Manifest verify: signature + cert chain verification for the manifest (fastest tamper discriminator).
- Check #2 — Audit continuity: audit_seq continuity + ledger seal/root consistency (catches cover-up and rollback).
Drill A — Delete a segment (or remove an index entry)
- Action: remove one segment file or drop one segment index entry from the bundle/storage set.
- Expected evidence: hash-chain or Merkle verification fails; gap_detected=true (index/time discontinuity).
- Reason codes: segment_missing, chain_break, root_mismatch.
- Fields: prev_hash/root_hash, index_seq, gap_detected, verify_fail_reason_code.
- First fix: freeze the case (hold), preserve export_hash, locate missing segment list; re-seal only after completeness is restored.
Notes: if a delete/overwrite request occurred, it must appear as an auditable event (no silent disappearance).
Drill B — Modify time (clock step / rollback scenario)
- Action: introduce a clock step or rollback event around the recording window.
- Expected evidence: time continuity check flags time_discontinuity; audit excerpt should include clock_step_event.
- Reason codes: time_discontinuity, clock_rollback_suspected, audit_gap (if time change is not logged).
- Fields: clock_step_event, last_sync_age, monotonic_ctr, audit_gap.
- First fix: investigate time source state; enforce a “record time changes as audit events” policy; stabilize time discipline before re-seal.
Notes: failures with no corresponding time-change audit events should be treated as audit integrity risk, not “just time drift.”
Drill C — Modify manifest.json (change time range / segment_count / algo_id)
- Action: edit manifest fields without updating the signature.
- Expected evidence: manifest signature verification FAIL immediately.
- Reason codes: signature_invalid, cert_unknown, manifest_mismatch.
- Fields: manifest_id, sign_algo/algo_id, verify_status, verify_fail_reason_code.
- First fix: confirm the verifier trust store and cert chain match the evidence; if correct, treat as tampered bundle and preserve custody records.
Drill D — Storage migration / disk swap (copy set to new media)
- Action: migrate the stored set (or restore from backup) and rebuild indexes.
- Expected evidence: if migration is correct, old cases remain verifiable; audit shows migration_audit_id and re_seal_event.
- Reason codes: migration_gap, chain_break, seal_mismatch (if re-seal is missing or inconsistent).
- Fields: migration_audit_id, re_seal_event, audit_root_hash, verify_fail_reason_code.
- First fix: produce a migration audit trail, then re-seal the migrated set; preserve mapping between old root and new root.
Drill E — Re-export / replay (old bundle presented as a new case)
- Action: export the same time window multiple times, or present an older bundle as a new incident deliverable.
- Expected evidence: verification may PASS, but audit excerpt should show multiple export events and custody references.
- Reason codes: custody_mismatch, time_window_mismatch, duplicate_export_detected.
- Fields: export_event_id, bundle_id, custody_chain_id, audit_seq.
- First fix: bind export metadata (reason code / case reference label) into the signed manifest; archive export_hash as the delivery fingerprint.
- signature_invalid / cert_unknown → signature branch (trust chain or tampered manifest).
- segment_missing / chain_break / root_mismatch → hash-chain branch (missing/injected content).
- time_discontinuity / clock_rollback_suspected → time branch (time-source + policy evidence).
- audit_gap / seal_mismatch → audit branch (possible cover-up, rollback, or incomplete ledger).
- algo_unsupported / key_version_missing → long-retention branch (verification context not preserved).
- custody_mismatch / time_window_mismatch → chain-of-custody branch (delivery context conflict).
The following MPNs are common, procurement-friendly examples for implementing trusted time, signing, and evidence retention. Selection depends on threat model, compliance needs, and platform constraints.
- Secure key storage / device identity: Microchip ATECC608B (secure element), NXP SE050 (secure element), Infineon SLB 9670 (TPM 2.0).
- IEEE-1588 / hardware timestamping network interface: Intel i210-AT (GbE controller with PTP support), Microchip LAN7430 (GbE controller with IEEE 1588), Texas Instruments DP83640 (Ethernet PHY with IEEE 1588).
- Jitter-cleaning / timing stability: Silicon Labs Si5341 (jitter attenuator/clock multiplier), Analog Devices AD9545 (network clock / jitter cleaner).
- RTC for hold-over timestamps (concept-level time anchor): Analog Devices/Maxim DS3231M (RTC), NXP PCF2129 (RTC).
- Non-volatile metadata storage (manifests / audit indexes): Winbond W25Q64JV (SPI NOR), Micron MT25Q128A (SPI NOR), Fujitsu MB85RS64V (SPI FRAM).
H2-12. FAQs ×12
Each answer is evidence-based and maps back to earlier chapters (time, signature, immutability, audit, export, retention, drills).
1) What makes a recording “evidentiary” vs just archived video?
“Evidentiary” means the system can prove who/what/when and detect tampering, not merely store footage. The minimum set is trusted time + signed manifests + immutable retention + auditable access/export. Validation should show three outcomes: timestamp proof, signature verification PASS, and an immutability/retention lock state (plus an audit trail).
2) If the clock is wrong, can signatures still prove integrity?
Signatures can still prove the content set (segments + manifest) has not changed, but they cannot automatically make a wrong clock “true.” Treat content integrity and time trust as separate proofs. Check time evidence fields like time_source_id, last_sync_age, clock_step_events, and monotonic_ctr to judge whether timestamps are continuous and explainable.
3) Should you sign every frame or only segments?
Frame-level signing is usually too expensive and fragile for export/replay workflows. A practical approach is per-segment hashing plus a signed manifest that binds segment hashes, index sequence, time range, device id, and policy/version identifiers. Verification then checks manifest signature first, and hash-chain/Merkle proofs next (segment_count, root_hash, prev_hash).
4) How do you detect a 2-second deletion in the middle?
Use hash chaining and/or Merkle proofs so that removing any segment breaks verification even if the clip still “plays.” The verifier should detect index discontinuity and/or time discontinuity and set gap_detected=true. Typical indicators are a missing index_seq value, a prev_hash mismatch, or a root_hash that no longer matches the provided segment set (verify_fail_reason_code: segment_missing/chain_break).
5) WORM vs append-only: what’s the practical difference?
WORM is a write-once retention rule enforced by policy/controls so content cannot be altered or removed during the retention window. Append-only is a weaker pattern unless a retention lock prevents truncation and silent deletion. In practice, ask whether the system can show retention_lock_state/hold_state and produce an immutability_proof_id. Also require that “delete requests” become audited events, not disappearance.
6) How do you prove a delete attempt happened?
Treat deletion as a controlled workflow: the delete path should return Denied + audited when retention/hold applies. The evidence is an append-only audit event that includes who attempted deletion, what object/range, and the policy decision. Check delete_attempt_log, audit_seq continuity, and audit_root_hash (or a daily seal). If the audit has gaps during the attempt, treat it as an integrity incident.
7) What must be logged for chain-of-custody?
At minimum, log who accessed or exported evidence, what time range/object was delivered, when it happened, and why (reason code). Critical event types include login/view/export, config changes, time-source changes, and key rotations. The export bundle should carry export_event_id, bundle_id, custody_chain_id, and produce a verify_report_id so third parties can audit delivery consistency.
8) How do you verify an exported clip offline?
Offline verification requires a self-contained bundle: segments + manifest.json + signature + certificate chain, plus an audit excerpt that anchors the export action. The verifier should: (1) verify manifest signature, (2) recompute hashes and verify chain/Merkle proofs, (3) check audit continuity and that the export event matches the bundle. Output should be PASS/FAIL with verify_fail_reason_code and a verify_report_id (export_hash recommended).
9) Keys rotated—can old evidence still be verified?
Yes, if the system preserves verification context across versions. Evidence should record key_version and algorithm identifiers so old manifests remain verifiable even after rotation. Rotation itself must be auditable, and verifiers must be able to retrieve or include the public verification material for historical versions. If old cases fail after rotation, the likely cause is missing key_version context or an incomplete archival of verification chains.
10) What happens when certificates expire?
Certificate expiry does not automatically invalidate a signature created earlier; the key question is whether the system can preserve “valid-at-signing-time” verification context. For long retention, the bundle/archives should keep the certificate chain (or references), record algo_id and key_version, and keep audit seals that anchor the time and policy context. Verification reports should clearly separate “signature integrity” from “current certificate status.”
11) Storage migrated—how to preserve integrity proofs?
Migration must be treated as an audited operation, followed by a new seal that references prior proofs. The minimum evidence is a migration_audit_id describing what moved and how integrity was checked, plus a re_seal_event anchoring the new storage state (new root/seal) without rewriting original evidence objects. After migration, old cases should still verify using stored key_version and algo_id; failures typically present as chain_break or seal_mismatch with corresponding audit events.
12) Verification fails but video plays fine—what to check first?
Start with the two fastest discriminators: (1) manifest signature verification and (2) audit continuity (audit_seq gaps or seal/root mismatches). Then follow reason codes: signature_invalid/cert_unknown points to trust-chain issues or a tampered manifest; segment_missing/chain_break points to missing or injected content; time_discontinuity points to clock evidence problems; audit_gap points to incomplete or rolled-back audit ledgers. “Plays fine” only means decoding works, not that integrity proofs remain consistent.