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.
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.
# 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.
# 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).
{
"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):
# 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 presentrcan_v21.sbom_attestationโ SBOM published to RRFrcan_v21.authority_handlerโ EU AI Act Art. 16(j)rcan_v21.audit_chain_retentionโ โฅ 3650 daysrcan_v21.rcan_versionโ RCAN protocol version required (see the live compatibility matrix)rcan_v22.pq_signing_keyโ ML-DSA-65 key presentrcan_v22.firmware_pq_sigโ manifest has ML-DSA-65 signature