IoT Firmware Sealer — full provenance chain verification for firmware updates on edge devices
Project description
tibet-edge — IoT Firmware Sealer
Not just hash verification. Full provenance chain for firmware updates.
Who built it, from what source, on what build server, why this version.
tibet-edge seals firmware images with a complete TIBET provenance chain covering every step from developer to device. A missing step means a rejected update. No exceptions.
The Problem: Hashes Are Not Enough
Everyone verifies firmware hashes. But a hash only proves "the binary hasn't changed." It doesn't prove:
- Who compiled it (intern or senior engineer?)
- What source code it came from (which git commit?)
- Where it was built (CI server or compromised laptop?)
- Why this version exists (security patch or backdoor?)
A supply chain attacker who compromises the build server produces a binary with a perfectly valid hash — of the wrong firmware.
The Firmware Envelope
┌─────────────────────────────────────────────────────────────────────┐
│ FIRMWARE ENVELOPE │
│ │
│ ┌────────────────────────────────────────────────────────────────┐ │
│ │ FIRMWARE BINARY │ │
│ │ SHA-256: a1b2c3... Size: 2.4MB Version: 3.1.7 │ │
│ └────────────────────────────────────────────────────────────────┘ │
│ │
│ ┌─ BUILD CHAIN (every step = TIBET token) ─────────────────────┐ │
│ │ │ │
│ │ [1] commit dev@company git:abc123 → src_hash │ │
│ │ │ │ │
│ │ [2] compile ci-server-04 GCC 13.2 → obj_hash │ │
│ │ │ │ │
│ │ [3] test ci-server-04 pytest 8.1 → test_hash │ │
│ │ │ │ │
│ │ [4] sign hsm-prod-01 ECDSA P-256 → sig_hash │ │
│ │ │ │ │
│ │ [5] package ci-server-04 fwtools 2.0 → pkg_hash │ │
│ │ │ │ │
│ │ [6] release release-mgr approved → rel_hash │ │
│ │ │ │
│ └───────────────────────────────────────────────────────────────┘ │
│ │
│ Missing step? → REJECT UPDATE │
│ Broken chain? → REJECT UPDATE │
│ Unknown actor? → REJECT UPDATE │
│ │
│ TIBET Token: jis:fw:envelope:a1b2c3d4 │
│ Sealed by: jis:ci:build-pipeline-prod │
│ Sealed at: 2026-02-27T14:00:00Z │
└─────────────────────────────────────────────────────────────────────┘
Install
pip install tibet-edge
Quick Start
from tibet_edge import FirmwareSealer, BuildStep
sealer = FirmwareSealer(actor="ci-pipeline-prod")
# Record each build step
sealer.add_build_step(BuildStep(
name="compile",
actor="ci-server-04",
input_hash="abc123...",
output_hash="def456...",
tool="GCC 13.2",
environment="Ubuntu 24.04",
))
# Seal the firmware
envelope = sealer.seal(
firmware_path="firmware-v3.1.7.bin",
version="3.1.7",
metadata={"reason": "Security patch CVE-2026-1234"},
)
# Verify: every step present, hashes match, chain unbroken
result = sealer.verify(envelope)
print(result.valid) # True
print(result.steps_verified) # 6
print(result.missing_steps) # []
CLI
tibet-edge info # Concept overview
tibet-edge demo # Full demo: seal, verify, tamper detection
tibet-edge profiles # Sector profiles (automotive, medical, etc.)
tibet-edge seal fw.bin # Seal a firmware file (demo mode if no file)
tibet-edge verify env.json # Verify a firmware envelope
Use Cases
| Sector | Threat | tibet-edge Response |
|---|---|---|
| Automotive OTA (Tesla, VW) | Tampered ECU firmware via OTA | Full build chain from git to ECU, dual-sign required |
| Medical Devices (insulin pumps) | Unauthorized firmware modification | FDA-compliant provenance, clinical trial reference |
| Consumer IoT (cameras, routers) | Mirai-style botnet injection | Minimum viable provenance, rejects unsigned builds |
| Industrial SCADA | Stuxnet-style PLC manipulation | OT-specific fields, air-gap compatible verification |
Sector Profiles
tibet-edge profiles
| Profile | Required Steps | Min Trust | Dual Sign | Max Age |
|---|---|---|---|---|
automotive |
commit, compile, test, sign, package, release | 0.95 | Yes | 90 days |
medical |
commit, compile, test, clinical_review, sign, fda_submit, release | 0.99 | Yes | 365 days |
industrial |
commit, compile, test, sign, release | 0.90 | No | 180 days |
consumer_iot |
compile, sign, release | 0.70 | No | 30 days |
EU Cyber Resilience Act (CRA) Compliance
tibet-edge's firmware envelope provides the technical evidence required by the EU CRA:
- Article 10(6): Identify and document vulnerabilities — ERACHTER layer records CVE references and patch intent
- Article 10(9): Security updates with provenance — the envelope IS the provenance
- Article 10(10): SBOM compatibility — build chain maps to SBOM components
TIBET Provenance Layers
| Layer | Firmware Content |
|---|---|
| ERIN | Firmware version, hash, size |
| ERAAN | Build chain steps, git commit, parent envelope |
| EROMHEEN | Build server, compiler, OS, hardware |
| ERACHTER | "Security patch CVE-xxxx", release intent |
Target Implementations
- Python — Reference implementation (this package)
- C — Embedded library for constrained devices (planned)
- Rust — Safety-critical embedded systems (planned)
Part of the TIBET Ecosystem
| Package | Purpose |
|---|---|
tibet-core |
Protocol core |
tibet-y2k38 |
Y2K38 Time Bridge |
tibet-pol |
Process Integrity Checker |
tibet-pqc |
Post-Quantum Crypto Router |
tibet-overlay |
Identity Overlay |
tibet-twin |
Digital Twin Guard |
| tibet-edge | IoT Firmware Sealer |
License
MIT — Humotica / J. van de Meent 2025
Authors
- J. van de Meent — jasper@humotica.com
- R. AI (Root AI) — root_idd@humotica.nl
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 tibet_edge-0.1.0.tar.gz.
File metadata
- Download URL: tibet_edge-0.1.0.tar.gz
- Upload date:
- Size: 15.2 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.13.5
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
0d031f05bbabe199f4d53728529e9a0333b5e09c82123e1b4968ebc78e03b744
|
|
| MD5 |
f51ff52a423e60dc290fc06d7ec4b4f4
|
|
| BLAKE2b-256 |
58233323f4cc51552e4b6a2e2c811680c9d1074ec5217993ab7e3d02797ab9bd
|
File details
Details for the file tibet_edge-0.1.0-py3-none-any.whl.
File metadata
- Download URL: tibet_edge-0.1.0-py3-none-any.whl
- Upload date:
- Size: 17.8 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.13.5
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
a8498933be87add4ce0ef44bc8cb7cc83fc61a6b283ff4944ac440729e92ff40
|
|
| MD5 |
6353971ab174a0790f6da073f685fdd3
|
|
| BLAKE2b-256 |
5eb566887e03b2cab1f0340b5a31f5e68b24059d7a5ffa1ee270dafefc52cb92
|