{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "$id": "https://www.bounder.io/schemas/creedspace-bounder-checkpoint-v1.schema.json",
  "title": "Creed Space Bounder monotonic checkpoint",
  "oneOf": [
    {
      "$ref": "#/$defs/payload"
    },
    {
      "$ref": "#/$defs/envelope"
    }
  ],
  "$defs": {
    "utcDateTime": {
      "type": "string",
      "maxLength": 64,
      "format": "date-time",
      "pattern": "^(?!0000-)\\d{4}-(?:0[1-9]|1[0-2])-(?:0[1-9]|[12]\\d|3[01])T(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d{1,9})?Z$"
    },
    "payload": {
      "type": "object",
      "additionalProperties": false,
      "required": [
        "version",
        "device_id",
        "checkpoint_sequence",
        "policy_sequence_floor",
        "trusted_time_floor",
        "receipt_sequence_floor",
        "last_receipt_hash",
        "signing_key_id",
        "signing_key_generation",
        "issued_at",
        "expires_at",
        "rollback_detected"
      ],
      "properties": {
        "version": {
          "const": "bounder-fleet-checkpoint/v1"
        },
        "device_id": {
          "type": "string",
          "minLength": 1,
          "maxLength": 255,
          "pattern": "\\S"
        },
        "checkpoint_sequence": {
          "type": "integer",
          "minimum": 1,
          "maximum": 9007199254740991
        },
        "policy_sequence_floor": {
          "type": "integer",
          "minimum": 1,
          "maximum": 9007199254740991
        },
        "trusted_time_floor": {
          "$ref": "#/$defs/utcDateTime"
        },
        "receipt_sequence_floor": {
          "type": "integer",
          "minimum": 0,
          "maximum": 9007199254740991
        },
        "last_receipt_hash": {
          "type": "string",
          "pattern": "^(?:|[0-9a-f]{64})$"
        },
        "signing_key_id": {
          "type": "string",
          "minLength": 1,
          "maxLength": 128,
          "pattern": "\\S"
        },
        "signing_key_generation": {
          "type": "integer",
          "minimum": 1,
          "maximum": 9007199254740991
        },
        "issued_at": {
          "$ref": "#/$defs/utcDateTime"
        },
        "expires_at": {
          "$ref": "#/$defs/utcDateTime"
        },
        "rollback_detected": {
          "type": "boolean"
        }
      },
      "allOf": [
        {
          "if": {
            "properties": {
              "receipt_sequence_floor": {
                "const": 0
              }
            },
            "required": [
              "receipt_sequence_floor"
            ]
          },
          "then": {
            "properties": {
              "last_receipt_hash": {
                "const": ""
              }
            }
          },
          "else": {
            "properties": {
              "last_receipt_hash": {
                "pattern": "^[0-9a-f]{64}$",
                "type": "string"
              }
            }
          }
        }
      ]
    },
    "envelope": {
      "type": "object",
      "additionalProperties": false,
      "required": [
        "payload",
        "signature",
        "public_key_id"
      ],
      "properties": {
        "payload": {
          "type": "string",
          "minLength": 2,
          "maxLength": 32768,
          "pattern": "\\S"
        },
        "signature": {
          "type": "string",
          "minLength": 88,
          "maxLength": 88,
          "pattern": "^(?:[A-Za-z0-9+/]{4}){21}[A-Za-z0-9+/][AQgw]==$",
          "contentEncoding": "base64"
        },
        "public_key_id": {
          "type": "string",
          "minLength": 1,
          "maxLength": 128,
          "pattern": "\\S"
        }
      }
    }
  }
}
