Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

SBOM and Vendor Disclosure Checklist

This page satisfies the IMDA IoT Cyber Security Guide lifecycle support evidence requirement for Singapore CLS Level 3 assessment. It covers the SBOM format, generation procedure, and vendor disclosure checklist responses for the five mandatory categories.


Software Bill of Materials (SBOM)

Format

EdgeSentry-RS publishes SBOMs in CycloneDX JSON format (spec version 1.3), generated from Cargo.lock at release time using cargo-cyclonedx.

Published artifacts

Each GitHub Release includes two SBOM files as release assets. Download them from the Releases page:

https://github.com/edgesentry/edgesentry-rs/releases/tag/v<version>
FileScope
edgesentry-rs-<version>.cdx.jsonedgesentry-rs crate and all transitive dependencies
edgesentry-bridge-<version>.cdx.jsonedgesentry-bridge C/C++ FFI crate and its dependencies

For example, for v0.1.2:

  • https://github.com/edgesentry/edgesentry-rs/releases/download/v0.1.2/edgesentry-rs-0.1.2.cdx.json
  • https://github.com/edgesentry/edgesentry-rs/releases/download/v0.1.2/edgesentry-bridge-0.1.2.cdx.json

Generating the SBOM locally

cargo install cargo-cyclonedx --locked
cargo cyclonedx --format json --all
# Output: crates/edgesentry-rs/edgesentry-rs.cdx.json
#         crates/edgesentry-bridge/edgesentry-bridge.cdx.json

Inspecting dependency counts

Run after generating to see the current component count (changes with every dependency update):

cargo cyclonedx --format json --all
python3 -c "
import json
for f in ['crates/edgesentry-rs/edgesentry-rs.cdx.json',
          'crates/edgesentry-bridge/edgesentry-bridge.cdx.json']:
    bom = json.load(open(f))
    print(f\"{f}: {len(bom.get('components', []))} components\")
"

Continuous supply-chain monitoring

  • cargo-audit — run on every CI build and PR; checks all dependencies against the RustSec Advisory Database
  • cargo-deny — enforces licence policy and bans on every CI build
  • Dependabot — weekly automated dependency version update PRs

Vendor Disclosure Checklist

The IMDA IoT Cyber Security Guide requires responses across five categories. The table below documents EdgeSentry-RS’s position for each.

1. Encryption Support

ItemResponse
Algorithms usedEd25519 (signing), BLAKE3 (hashing)
Key lengthEd25519: 256-bit; BLAKE3 output: 256-bit
Random number generationOS CSPRNG via rand::OsRng — no custom RNG
Transport encryptionRecord-level: Ed25519 signature over payload hash. Native TLS transport is provided: eds serve-tls --tls-cert / --tls-key (rustls TLS 1.2/1.3, HTTP) and eds serve-mqtt --tls-ca-cert (MQTT over TLS). See CLS-05 in the Traceability Matrix.
Key storagePublic-key registry in memory (IntegrityPolicyGate); private key files managed by the deployer. HSM-backed storage planned: #54
Implementationcrates/edgesentry-rs/src/identity.rs, crates/edgesentry-rs/src/integrity.rs

2. Identification and Authentication

ItemResponse
Device authentication methodEd25519 asymmetric key pair: device signs each record with its private key; cloud verifies against the registered public key
Credential storagePrivate key held exclusively on the device; public key registered on the cloud side via IntegrityPolicyGate::register_device
Default credentialsNone — each device generates a unique keypair via eds keygen
Brute-force protectionSignature verification is a single constant-time operation; no credential-based login surface exists
Route identity enforcementcert_identity parameter in IngestService::ingest — mismatch between TLS client certificate identity and record.device_id causes immediate rejection
Implementationcrates/edgesentry-rs/src/identity.rs, crates/edgesentry-rs/src/ingest/policy.rs

3. Data Protection

ItemResponse
Data in transitEvery AuditRecord carries an Ed25519 signature over its BLAKE3 payload hash — authenticity guaranteed at the record level regardless of transport
Data at restRaw payloads stored via RawDataStore (S3/MinIO); audit records via AuditLedger (PostgreSQL). Encryption at rest is the deployer’s responsibility (S3 SSE, Postgres column encryption)
Personal dataAuditRecord contains no personal data fields by design — object_ref points to a storage key; the payload body is stored separately
Data minimisationAudit metadata (payload_hash, signature, prev_record_hash) is separated from payload body — cloud stores only the hash chain; raw data stored independently via object_ref
Implementationcrates/edgesentry-rs/src/record.rs, crates/edgesentry-rs/src/ingest/storage.rs

4. Network Protection

ItemResponse
Unnecessary ports/servicesLibrary only — no network service is opened by edgesentry-rs. Transport is the deployer’s responsibility
Deny-by-default network policyNetworkPolicy enforces an IP/CIDR allowlist; check(source_ip) is called before any cryptographic operation — all unlisted sources are rejected
DoS resilienceNetworkPolicy gate rejects unlisted sources before any cryptographic processing, limiting the attack surface. Full rate-limiting is a deployer concern
Implementationcrates/edgesentry-rs/src/ingest/network_policy.rs
CLS referenceCLS-06 / ETSI EN 303 645 §5.6

5. Lifecycle Support

ItemResponse
Vulnerability reportingGitHub private vulnerability reporting enabled. See SECURITY.md — SLA: acknowledge 3 business days; patch 30 days (critical/high), 90 days (medium/low)
SBOM availabilityCycloneDX JSON published with every GitHub Release (see above)
Dependency advisory scanningcargo-audit on every CI build + PR against RustSec Advisory DB
End-of-life policyedgesentry-rs v0.x: current version supported. Security updates are patch releases
Software update integrityUpdateVerifier checks BLAKE3 payload hash and Ed25519 publisher signature before any update is applied — see CLS-03
Supported versionsSee SECURITY.md
CLS referenceCLS-02 / ETSI EN 303 645 §5.2

Traceability

This document satisfies Milestone 1.4 in the Roadmap. For the full clause-by-clause compliance mapping see the Compliance Traceability Matrix.