{ "$schema": "https://json-schema.org/draft/2020-12/schema", "$id": "https://git.transaction.science/Transaction-Science/open-standards/raw/branch/main/wai/wai-quantum-service/schemas/receipt-keys.v1.json", "title": "wai.quantum.receipt-keys/1", "description": "Every key the job service has signed receipts with, and when: the set it publishes at /.well-known/wai-quantum-receipt-keys. One key is current; a key retired by rotation keeps its window and names its successor, with the transition statement both keys signed (wai.quantum.key-transition/1), so a receipt signed before a rotation still verifies against the key that was current then. A key the service no longer vouches for carries revoked_from_ms. The set is a trust list as a verifier reads one (wai/extensions/quantum-providers.md section 8.8).", "type": "object", "required": [ "format", "algorithm", "keys" ], "properties": { "format": { "const": "wai.quantum.receipt-keys/1" }, "algorithm": { "const": "ed25519" }, "keys": { "type": "array", "items": { "$ref": "#/$defs/key" } } }, "$defs": { "key": { "type": "object", "description": "One key: its public key in hex and as a did:key, the window it signed in (from not_before_ms, until not_after_ms once retired), whether it is the current one, and, once retired, its successor and the signed transition.", "required": [ "key", "current" ], "properties": { "key": { "type": "string", "description": "The Ed25519 public key, in hex." }, "did": { "type": "string", "description": "The same key as a did:key." }, "not_before_ms": { "type": [ "integer", "null" ], "description": "When the key began signing, in milliseconds since 1970; null for a key whose window opened before the set was kept." }, "not_after_ms": { "type": "integer", "description": "When the key was retired." }, "revoked_from_ms": { "type": "integer", "description": "The time, in milliseconds since 1970, from which the service no longer vouches for what this key signed: a verifier refuses its receipts issued then or later, and those that seal no time." }, "current": { "type": "boolean" }, "successor": { "type": "string", "description": "The key that replaced it, in hex." }, "transition": { "anyOf": [ { "type": "null" }, { "$ref": "#/$defs/transition" } ] }, "note": { "type": "string" } } }, "transition": { "type": "object", "description": "A rotation's statement, signed by the retiring key and its successor over BLAKE3 of the domain wai:quantum-key-transition and the statement's RFC 8785 canonical text.", "required": [ "statement", "retiring_signature", "successor_signature" ], "properties": { "statement": { "type": "object", "required": [ "format", "retiring", "successor", "at_ms" ], "properties": { "format": { "const": "wai.quantum.key-transition/1" }, "retiring": { "type": "string" }, "successor": { "type": "string" }, "at_ms": { "type": "integer" } } }, "retiring_signature": { "type": "string" }, "successor_signature": { "type": "string" } } } } }