CRA Compliance Kit for IoT Devices
Meet EU Cyber Resilience Act (CRA) requirements in one pip install.
Key Deadlines
| Obligation | Date | Status |
|---|---|---|
| Vulnerability reporting (24h to ENISA) | September 11, 2026 | 53 days |
| Full CRA conformity assessment | December 11, 2027 | 18 months |
| Penalties for non-compliance | Up to EUR 15M or 2.5% of global turnover | Active |
What This Kit Provides
| Module | CRA Requirement | License |
|---|---|---|
DeviceIdentityService (identity.py) |
Device identity, access control — Art. 10(2-3) | MIT |
FirmwareHealthService (firmware.py) |
Vulnerability tracking, CVE matching — Art. 13(1-3) | MIT |
InputClassifier (input_guard.py) |
Secure by default input handling — Art. 10(1) | MIT |
PhysicalActionGuard (action_guard.py) |
Hard-blocked & confirm-required actions — Art. 10(3) | MIT |
CycloneDX SBOM Generator (sbom/generator.py) |
SBOM maintenance for ENISA — Art. 13(8) | MIT |
GuardianSubsystem (commercial) |
Central security health scoring | Gated — contact info@starcaller.uk |
BehaviouralBaselineService (commercial) |
Welford anomaly detection | Gated — contact info@starcaller.uk |
MemoryProvenance (commercial) |
HMAC-SHA256 audit chain | Gated — contact info@starcaller.uk |
CrossOracleSigner (commercial) |
Inter-service request signing | Gated — contact info@starcaller.uk |
Quickstart
pip install cra-compliance-kit
from cra_kit.identity import DeviceIdentityService, TrustTier
from cra_kit.firmware import FirmwareHealthService
from cra_kit.input_guard import InputClassifier
from cra_kit.action_guard import PhysicalActionGuard
# 1. Enrol devices with tiered trust
identity = DeviceIdentityService()
identity.enrol_device("sensor-01", "temperature_sensor", trust_tier=TrustTier.ENVIRONMENTAL)
# 2. Check firmware against CVE database
fw = FirmwareHealthService()
check = fw.check_device("sensor-01", "gateway", "1.5.3")
print(f"Vulnerable to {len(check.vulnerabilities_found)} CVEs")
# 3. Sanitize every input
classifier = InputClassifier()
safe, findings = classifier.is_safe(user_input)
# 4. Restrict dangerous actions
guard = PhysicalActionGuard()
result = guard.check_action("format_storage")
assert result["allowed"] == False # Hard blocked
# 5. Generate SBOM
python -m sbom.generator --product "MyIoTGateway" --version "2.1.0" --output sbom.xml
CRA Article Mapping
| Article | Requirement | How We Satisfy It |
|---|---|---|
| Article 10(1) | Secure by default configuration | InputClassifier blocks injection, sanitises inputs before processing |
| Article 10(2) | Device identity & authentication | DeviceIdentityService — 5-tier trust model with certificate-based enrollment |
| Article 10(3) | Access control mechanisms | PhysicalActionGuard — 10 hard-blocked + 11 confirm-required actions, time-aware |
| Article 13(1-3) | Vulnerability handling & remediation | FirmwareHealthService — CVE matching, semantic version gating, severity scoring |
| Article 13(8) | SBOM accessible to ENISA on request | CycloneDX 1.5 generator with automatic installed-package scanning |
Architecture Overview
Each module is self-contained with zero external dependencies (stdlib only).
Modules store state in SQLite at ~/.cra_kit/ for persistence.
User Input
|
v
InputClassifier ── detects 8 injection families (prompt, code, SQL, command, XSS, SSRF, traversal, format string)
|
v
DeviceIdentityService ── authenticates, checks trust tier (0-4)
|
v
PhysicalActionGuard ── blocks/confirms dangerous actions, time-gated at night
|
v
FirmwareHealthService ── matches version against CVE database
|
v
SBOM Generator (CycloneDX 1.5 XML)
Open-Core Licensing
| Package Type | Modules | License | Price |
|---|---|---|---|
| Open Source | identity.py, firmware.py, input_guard.py, action_guard.py, sbom/generator.py | MIT | Free |
| Professional (coming soon) | Guardian + Baselines + Provenance + Signing | Commercial | 1,500/yr |
| Enterprise (coming soon) | All pro + priority support + SLA | Commercial | 7,500/yr |
Requirements
- Python 3.9+
- SQLite (built into Python standard library)
- Zero external dependencies
Who Built This
StarTeQ Ltd — the team behind Starcaller, a privacy-first AI appliance with a 9.3/10 security trust score and 8-module security stack in production.
Contact: info@starcaller.uk Website: starcaller.uk/cra-compliance
CRA Watch — Live Vulnerability Monitoring
Monitor your registered products in real time at the CRA Watch Dashboard.
- Daily CISA KEV polling at 06:00 UTC
- NVD + EPSS enrichment on-demand
- CycloneDX VEX generation
- ENISA Article 14 notification drafts
- 24hr / 72hr / 14-day deadline tracking
Metadata
Release files for cra-compliance-kit 1.0.5
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| cra_compliance_kit-1.0.5.tar.gz | 13.7 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| cra_compliance_kit-1.0.5-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 30.0 kB
Release files / cra_compliance_kit-1.0.5.tar.gz
| Download URL | cra_compliance_kit-1.0.5.tar.gz |
|---|---|
| Size | 13.7 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
50abf6ad64fa49ba3438e7be17d275cc2017698efa71e642c7a287dcaefedbf7
|
|
BLAKE2b-256 checksum How to use checksums |
70d0d55653e22dd1c685b5e4e7c6fc6899d7cad6e893f729009335959b8cac5a
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/6.2.0 CPython/3.11.9
|
Release files / cra_compliance_kit-1.0.5-py3-none-any.whl
| Download URL | cra_compliance_kit-1.0.5-py3-none-any.whl |
|---|---|
| Size | 16.3 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
3c91cd98807a4b2cf6907e48d4a3e4394125c32961fb723c4f63836b7cc7baa9
|
|
BLAKE2b-256 checksum How to use checksums |
e30d7666b797d7d7c8821417d2715faa6bc297e2be2aab5a3b3c9f7ba5c29f71
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/6.2.0 CPython/3.11.9
|