This page maps each Singapore CLS / iM8 clause and corresponding ETSI EN 303 645 provision to the source code that satisfies it. Japan JC-STAR cross-references and SS 711:2025 design principle alignment are included for each row.
A published, actionable vulnerability reporting channel with defined SLAs
Status
✅ Implemented
Implementation
SECURITY.md — published disclosure policy with supported versions, private reporting via GitHub advisory, acknowledgement SLA (3 business days), patch SLA (30 days critical/high; 90 days medium/low), and defined in/out-of-scope
Implementation
GitHub private vulnerability reporting enabled — reporters use the Security Advisories form
Software update packages must be signed and verified before installation
Status
✅ Implemented
Implementation
UpdateVerifier::verify checks BLAKE3 payload hash then Ed25519 publisher signature before allowing installation; failed checks are logged as UpdateVerifyDecision::Rejected in UpdateVerificationLog (src/update.rs)
Data must be transmitted with authenticity guarantees
Status
✅ Implemented
Implementation — record authenticity
Every AuditRecord carries an Ed25519 signature over its BLAKE3 payload hash — build_signed_record (src/agent.rs), sign_payload_hash (src/identity.rs:12)
Implementation — channel confidentiality (HTTP)
transport-tls feature: serve_tls() with rustls TLS 1.2/1.3, IP allowlist enforced before handshake, eds serve-tls --tls-cert / --tls-key CLI — closed #176 (src/transport/tls.rs)
Implementation — channel confidentiality (MQTT)
transport-mqtt-tls feature: MqttTlsConfig with CA cert path, rustls ClientConfig via rumqttc::TlsConfiguration::Rustls, eds serve-mqtt --tls-ca-cert CLI — closed #180 (src/transport/mqtt.rs)
ingest_handler enforces NetworkPolicy::check(source_ip) before any crypto verification; returns 403 Forbidden for unlisted sources (src/transport/http.rs)
Implementation — MQTT transport
serve_mqtt exposes a single subscribe-only topic; no administrative interface; broker-level ACLs recommended (src/transport/mqtt.rs)
Note
Network-level controls (VPN, firewall rules) remain the deployer’s responsibility
The device should remain operational and recover gracefully
Status
⚠️ Partial
Implementation
OfflineBuffer<S> accumulates signed records during connectivity loss and replays them in insertion order via flush when the link recovers. Duplicate records from replay are treated as already-accepted and do not cause failures (src/buffer/mod.rs)
Implementation
Pluggable BufferStore trait — volatile InMemoryBufferStore (default) and durable SqliteBufferStore behind the buffer-sqlite feature flag
Gap
Full HA (active–active failover, network-level redundancy) remains the deployer’s responsibility
Note: “Out of scope” clauses cover device-level concerns (passwords, network interfaces, personal data) that are the responsibility of the deployer, not the audit-record library.