{
  "schema": "akkubrief.signing-keys.v1",
  "issuer": "Akkubrief",
  "issuer_url": "https://akku-brief.de",
  "updated": "2026-09-05",
  "contact": "https://akku-brief.de/sicherheit",
  "verification": {
    "algorithm": "Ed25519",
    "signed_input": "UTF-8 bytes of the certificate's canonical payload_json, verbatim and unhashed",
    "signature_encoding": "base64",
    "public_key_encoding": "base64 of the raw 32-byte Ed25519 public key",
    "fingerprint": "SHA-256 over the raw 32 public key bytes, lowercase hex (not over the base64 text)",
    "note": "A certificate names the key it was signed with in its public_key_id field. A valid signature alone is not enough: only a key with purpose \"production\" stands for a real certificate. A key with purpose \"demo\" signs the public sample certificate at /z/muster and nothing else. Keys are never removed from this list: certificates already issued must stay verifiable even if Akkubrief no longer exists."
  },
  "keys": [
    {
      "id": "demo-2026-09",
      "algorithm": "Ed25519",
      "public_key_raw_b64": "aDY1AJZtshwqbcdcq5sStGyot8L9gNbkC9eguPcbgfI=",
      "fingerprint_sha256": "74f6692a4200b8b02298bcb9795c0dd0e88728e11e3133160febf54b14838468",
      "purpose": "demo",
      "valid_from": "2026-09-05",
      "valid_until": "2026-09-05",
      "signing_active": false,
      "note": "Sample key for the public example certificate at /z/muster, reissued with eighteen months of simulated charging history. It only proves that the demo runs through the same signature check — it is not a trust anchor for real vehicles. The matching private key was discarded after signing once."
    },
    {
      "id": "demo-2026-08b",
      "algorithm": "Ed25519",
      "public_key_raw_b64": "NMeMPEOU0wi0u2DrlGT5s6+vxNoOZmdYnTV/1y30M4c=",
      "fingerprint_sha256": "0c188eeb94d7dba51e2cd0716820dc23bb90e8bede215e6f1d035f3d02f3eed4",
      "purpose": "demo",
      "valid_from": "2026-08-27",
      "valid_until": "2026-08-27",
      "signing_active": false,
      "note": "Retired sample key. It signed the second example certificate at /z/muster (method version cert-3.1.0, 57 days of history) and stays listed so that copies of that document remain verifiable. Never a trust anchor for real vehicles; the matching private key was discarded after signing once."
    },
    {
      "id": "prod-2026-08",
      "algorithm": "Ed25519",
      "public_key_raw_b64": "KqM/9Bi4hqPHLDbdXK2YMjoxhUoVLg8d5+Sw+aqNaTQ=",
      "fingerprint_sha256": "dd1e628ee3ccf9ebcadbe3cc876abed79e9bd79c4861a62019e2fef0f6e020ae",
      "purpose": "production",
      "valid_from": "2026-08-23",
      "valid_until": null,
      "signing_active": true,
      "note": "Production key. Signs every regularly issued Akkubrief certificate."
    },
    {
      "id": "demo-2026-08",
      "algorithm": "Ed25519",
      "public_key_raw_b64": "hPTCcdXExsyowcPNe+MCeuwS6ygw/5Yg+sJuWOheKTk=",
      "fingerprint_sha256": "0b90e48be85a5ec3d45c64c0b2ab34a464fb4ef07c56b4d6ca73347c1da9035d",
      "purpose": "demo",
      "valid_from": "2026-08-17",
      "valid_until": "2026-08-17",
      "signing_active": false,
      "note": "Retired sample key. It signed the first example certificate at /z/muster (method version cert-1.7.0-demo) and stays listed so that copies of that document remain verifiable. Never a trust anchor for real vehicles; the matching private key was discarded after signing once."
    }
  ]
}
