Firmware Attestation

The RCAN protocol requires all robots to publish a signed firmware manifest and CycloneDX SBOM to the Robot Registry Foundation (RRF). Signatures use ML-DSA-65 (NIST FIPS 204) โ€” Ed25519 is deprecated and removed. See the live compatibility matrix for the protocol revision currently in force.

Q-Day Timeline
ML-DSA-65 is the primary signing algorithm effective 2026. Bob (RRN-000000000001) is the first robot running this stack. Ed25519 sunset: 2027. NIST IR 8547 deadline: 2029.

1. Generate ML-DSA-65 Key Pair

Every robot needs an ML-DSA-65 key pair. Generate it once โ€” it lives at ~/.opencastor/pq_signing.key and is auto-loaded at boot.

Terminal
# Generate ML-DSA-65 key pair (FIPS 204)
castor keygen --pq

# Output:
# โœ“ ML-DSA-65 key generated (FIPS 204)
#   private: ~/.opencastor/pq_signing.key  (4032 bytes)
#   public:  ~/.opencastor/pq_signing.pub  (1952 bytes)
#   key_id:  7c21bf58

2. Attest + Sign

Run castor attest generate to build the firmware manifest from installed packages, then castor attest sign to apply the ML-DSA-65 signature.

Terminal
# 1. Generate firmware manifest
castor attest generate --config ~/opencastor/bob.rcan.yaml

# 2. Sign with ML-DSA-65
castor attest sign

# 3. Verify
castor attest verify

# Output:
# โœ“ Firmware manifest signature (ML-DSA-65): VALID
#   RRN:      RRN-000000000001
#   Version:  2026.3.26.1
#   Signed:   2026-03-27T00:49:05Z

3. Manifest Schema

The signed manifest is stored at /tmp/opencastor-firmware-manifest.json (or /run/opencastor/rcan-firmware-manifest.json in production).

Terminal
{
  "rrn":              "RRN-000000000001",
  "firmware_version": "2026.3.26.1",
  "build_hash":       "sha256:f072093b...",
  "signed_at":        "2026-03-27T00:49:05Z",
  "pq_alg":           "ml-dsa-65",
  "signature":        "6fMv7aDw0f3HPqrbit3VC5...",
  "components": [
    { "name": "opencastor", "version": "2026.3.27.0", "hash": "sha256:..." },
    { "name": "rcan",       "version": "1.2.1",       "hash": "sha256:..." }
  ]
}

4. Gateway API Endpoints

All attestation data is accessible via the gateway REST API (authenticated with a JWT):

Terminal
# Gateway endpoints
GET  /api/attest          โ†’ manifest metadata + signature prefix
POST /api/attest/verify   โ†’ live ML-DSA-65 signature verification
GET  /api/sbom            โ†’ SBOM metadata (serial, components, ref)
GET  /api/sbom/download   โ†’ full CycloneDX JSON
GET  /api/conformance     โ†’ self-run conformance report (v2.1/v2.2 checks)

5. Conformance

Run castor conformance to see a self-run RCAN protocol conformance report inline. The report passes when all 7 checks below pass. It is a conformance check you run on your own robot, not legal compliance and not a certification:

  • rcan_v21.firmware_manifest โ€” signed manifest present
  • rcan_v21.sbom_attestation โ€” SBOM published to RRF
  • rcan_v21.authority_handler โ€” EU AI Act Art. 16(j)
  • rcan_v21.audit_chain_retention โ€” โ‰ฅ 3650 days
  • rcan_v21.rcan_version โ€” RCAN protocol version required (see the live compatibility matrix)
  • rcan_v22.pq_signing_key โ€” ML-DSA-65 key present
  • rcan_v22.firmware_pq_sig โ€” manifest has ML-DSA-65 signature

Reference

Edit this page on GitHub Last updated: 10/23/2026