230 lines
7.6 KiB
JSON
230 lines
7.6 KiB
JSON
{
|
|
"$schema": "https://json-schema.org/draft/2020-12/schema",
|
|
"$id": "https://zddc.varasys.io/transmittal.schema.json",
|
|
"title": "ZDDC Transmittal",
|
|
"description": "Schema for ZDDC transmittal documents with cryptographic envelope",
|
|
"type": "object",
|
|
"properties": {
|
|
"payload": {
|
|
"type": "object",
|
|
"description": "The core transmittal data",
|
|
"properties": {
|
|
"version": {
|
|
"type": "integer",
|
|
"description": "Payload schema version",
|
|
"const": 1
|
|
},
|
|
"type": {
|
|
"type": "string",
|
|
"description": "Document type - Transmittal and Submittal are fixed, or any custom text for file lists",
|
|
"default": "Transmittal"
|
|
},
|
|
"title": {
|
|
"type": "string",
|
|
"description": "Optional descriptive title"
|
|
},
|
|
"client": {
|
|
"type": "string",
|
|
"description": "The Owner Name"
|
|
},
|
|
"project": {
|
|
"type": "string",
|
|
"description": "The Project Name"
|
|
},
|
|
"projectNumber": {
|
|
"type": "string",
|
|
"description": "The Project Number"
|
|
},
|
|
"date": {
|
|
"type": "string",
|
|
"description": "Date in YYYY-MM-DD format (canonicalized from friendly text)",
|
|
"pattern": "^\\d{4}-\\d{2}-\\d{2}$"
|
|
},
|
|
"trackingNumber": {
|
|
"type": "string",
|
|
"description": "Tracking number; must not contain spaces or underscores",
|
|
"pattern": "^[^\\s_]+$"
|
|
},
|
|
"from": {
|
|
"type": "string",
|
|
"description": "Who issued the document (hidden for file lists)"
|
|
},
|
|
"to": {
|
|
"type": "string",
|
|
"description": "Recipient of the document (hidden for file lists)"
|
|
},
|
|
"purpose": {
|
|
"type": "string",
|
|
"description": "Purpose of document (hidden for file lists)"
|
|
},
|
|
"responseDue": {
|
|
"type": "string",
|
|
"description": "Response deadline (shown only for Submittal type)"
|
|
},
|
|
"subject": {
|
|
"type": "string",
|
|
"description": "Subject line"
|
|
},
|
|
"remarks": {
|
|
"type": "string",
|
|
"description": "Free-form Markdown content"
|
|
},
|
|
"files": {
|
|
"type": "array",
|
|
"description": "List of files included in the transmittal",
|
|
"items": {
|
|
"type": "object",
|
|
"properties": {
|
|
"trackingNumber": {
|
|
"type": "string",
|
|
"description": "File tracking number from ZDDC filename convention"
|
|
},
|
|
"revision": {
|
|
"type": "string",
|
|
"description": "File revision from ZDDC filename convention"
|
|
},
|
|
"status": {
|
|
"type": "string",
|
|
"description": "File status from ZDDC filename convention"
|
|
},
|
|
"title": {
|
|
"type": "string",
|
|
"description": "File title from ZDDC filename convention"
|
|
},
|
|
"path": {
|
|
"type": "string",
|
|
"description": "Directory path relative to transmittal root (without filename)",
|
|
"default": ""
|
|
},
|
|
"filename": {
|
|
"type": "string",
|
|
"description": "Filename only (without path)"
|
|
},
|
|
"sha256": {
|
|
"type": "string",
|
|
"description": "SHA-256 hash of file contents (hex)",
|
|
"pattern": "^[a-f0-9]{64}$"
|
|
},
|
|
"fileSize": {
|
|
"type": "integer",
|
|
"description": "File size in bytes",
|
|
"minimum": 0
|
|
}
|
|
},
|
|
"required": ["filename", "sha256"],
|
|
"additionalProperties": false
|
|
}
|
|
}
|
|
},
|
|
"required": ["version", "type", "date", "trackingNumber", "files"],
|
|
"additionalProperties": false
|
|
},
|
|
"envelope": {
|
|
"type": "object",
|
|
"description": "Cryptographic envelope capturing state after publish",
|
|
"properties": {
|
|
"version": {
|
|
"type": "integer",
|
|
"description": "Schema version number",
|
|
"const": 1
|
|
},
|
|
"digestAlgorithm": {
|
|
"type": "string",
|
|
"description": "Digest algorithm used",
|
|
"const": "SHA-256"
|
|
},
|
|
"digest": {
|
|
"type": "string",
|
|
"description": "SHA-256 hash of canonical payload string (hex)",
|
|
"pattern": "^[a-f0-9]{64}$"
|
|
},
|
|
"digestedAt": {
|
|
"type": "string",
|
|
"format": "date-time",
|
|
"description": "ISO 8601 timestamp when digest was computed"
|
|
},
|
|
"signatureAlgorithm": {
|
|
"type": "string",
|
|
"description": "Signature algorithm used",
|
|
"const": "ECDSA-P256-SHA256"
|
|
},
|
|
"signatures": {
|
|
"type": "array",
|
|
"description": "Array of signatures from multiple signers",
|
|
"items": {
|
|
"type": "object",
|
|
"properties": {
|
|
"signature": {
|
|
"type": "string",
|
|
"description": "ECDSA signature over canonical payload (base64)",
|
|
"contentEncoding": "base64"
|
|
},
|
|
"signedAt": {
|
|
"type": "string",
|
|
"format": "date-time",
|
|
"description": "ISO 8601 timestamp when this signature was created"
|
|
},
|
|
"publicKeyJwk": {
|
|
"type": "object",
|
|
"description": "EC P-256 public key in JWK format for signature verification",
|
|
"properties": {
|
|
"kty": {
|
|
"type": "string",
|
|
"const": "EC"
|
|
},
|
|
"crv": {
|
|
"type": "string",
|
|
"const": "P-256"
|
|
},
|
|
"x": {
|
|
"type": "string",
|
|
"description": "X coordinate (base64url)"
|
|
},
|
|
"y": {
|
|
"type": "string",
|
|
"description": "Y coordinate (base64url)"
|
|
}
|
|
},
|
|
"required": ["kty", "crv", "x", "y"],
|
|
"additionalProperties": false
|
|
}
|
|
},
|
|
"required": ["signature", "signedAt", "publicKeyJwk"],
|
|
"additionalProperties": false
|
|
}
|
|
}
|
|
},
|
|
"required": ["version", "digestAlgorithm", "digest", "digestedAt", "signatureAlgorithm"],
|
|
"additionalProperties": false
|
|
},
|
|
"presentation": {
|
|
"type": "object",
|
|
"description": "Optional presentation assets (logos, styling) - not part of signed payload",
|
|
"properties": {
|
|
"leftLogo": {
|
|
"type": "string",
|
|
"description": "Left logo as data URL (e.g., data:image/png;base64,...)",
|
|
"pattern": "^data:image/[a-z]+;base64,"
|
|
},
|
|
"rightLogo": {
|
|
"type": "string",
|
|
"description": "Right logo as data URL (e.g., data:image/png;base64,...)",
|
|
"pattern": "^data:image/[a-z]+;base64,"
|
|
},
|
|
"theme": {
|
|
"type": "string",
|
|
"description": "Visual theme identifier",
|
|
"default": "default"
|
|
},
|
|
"customCss": {
|
|
"type": "string",
|
|
"description": "Optional custom CSS for styling the transmittal",
|
|
"default": ""
|
|
}
|
|
},
|
|
"additionalProperties": false
|
|
}
|
|
},
|
|
"required": ["payload", "envelope"],
|
|
"additionalProperties": false
|
|
}
|