Canonicalization-declared payload binding
A signed digest of structured content is checkable only if the verifier knows how the content was turned into bytes, so the construction is declared by name and never guessed.
1What it is
CPB, the working short name of draft-mih-sokolov-scitt-payload-binding-05, defines how a SCITT Signed Statement declares the construction behind a digest it carries: the canonicalization, the hash function, and the output representation.
Each construction has a registered name, such as jcs or as-transmitted, and a payload profile declares exactly one, so a verifier recomputes the digest the same way the producer did instead of guessing.
CPB defines no payload format and no payload meaning; it defines the declarations, the registry of names, and how producers and verifiers compute and compare the digests.
2Design choices
jcs-n was withdrawn, not changed: its token stays bound, it cannot be newly declared, and older records are checked only with proof of pre-cutoff vintage. (Draft §4, §4.2, §14.1)as-transmitted for bytes a container already fixes, named by a cited production such as RFC 9052 §4.4 ToBeSigned.3What it shows / what it does not
Shows
- That the content a verifier holds reproduces the signed digest under the declared construction.
- Which construction was used, by registered name, so independent verifiers recompute the same bytes.
- Whether a digest is raw octets or text, so a leaf or comparison uses the right form.
- That a mismatch under the declared construction is not a serializer disagreement: the value differs, whether by edit or by a parser that rounded a number differently (Draft §12.3).
Does not show
- Anything about content the verifier does not hold. Without it, the signature can be checked but the content binding is not verified (Draft §6.2).
- That the signer was authorized. A valid signature is Signature-Valid; accepting the key for the issuer is the verifier's policy (Draft §3).
- What the payload means. Payload format and semantics belong to the payload profile.
- Agreement on floats when two parsers round the same literal differently; a profile may require exact decimal strings (Draft §12.3).
- Confidentiality of low-entropy fields: a bare digest of a guessable value can be reversed (Draft §12.2).
4Example
The smallest vector for the active jcs algorithm. It keeps the null, empty-array, and empty-object members, which is what separates plain jcs from the withdrawn jcs-n.
{
"id": "jcs-pass-01",
"algorithm": "jcs",
…
"must_fail": false,
"input_json": "{ \"z\": null, \"a\": {}, \"m\": [], \"s\": \"CPB\" }",
"input_data_model": {
"z": null,
"a": {},
"m": [],
"s": "CPB"
},
"exclusion_set": [],
"pre_image": "{\"a\":{},\"m\":[],\"s\":\"CPB\",\"z\":null}",
"pre_image_bytes_hex": "7b2261223a7b7d2c226d223a5b5d2c2273223a22435042222c227a223a6e756c6c7d",
"digest_alg": "SHA-256",
"digest_representation": "lowercase-hex",
"digest": "7b3ef8ebf31ee38952860dd3f30c2e0d101dcdbcd9972e3ed8108ef9cff0d7cb"
}
| Field | Type | Meaning |
|---|---|---|
| id | string | Vector identifier. |
| algorithm | string | The declared registered name: plain RFC 8785 JCS, no normalization pass. |
| must_fail | bool | false: a conforming implementation must reproduce the digest. |
| input_json | string | The content as text, with spacing and member order as written. |
| input_data_model | object | The same content as a JSON value. |
| exclusion_set | array | Top-level members removed before canonicalization; none here. |
| pre_image | string | The JCS output: keys sorted, null and empty members kept. |
| pre_image_bytes_hex | hex | The exact UTF-8 octets that are hashed. |
| digest_alg | string | The hash function the jcs entry pins. |
| digest_representation | string | Output form: 64-character lowercase hex. |
| digest | 64 hex | SHA-256 of the pre-image octets. |
Source: action-state-group/scitt-payload-binding:vectors/jcs/pass/01-retain-null-and-empty-members.json @ e6e3325d7e41c45dad80baf8c3ca3d07b18db827
5Specs
- Internet-Draft draft-mih-sokolov-scitt-payload-binding-05 — the declarations, the Canonicalization Algorithm Registry, and the verifier rules.
- RFC RFC 8785 — JSON Canonicalization Scheme (JCS), the construction
jcsnames. - RFC RFC 9995 — COSE Hash Envelope, used in CPB's Hash Envelope mode.
- RFC RFC 9052 — COSE; every CPB Signed Statement is a tagged COSE_Sign1.
- RFC RFC 9943 — SCITT architecture: Signed Statements, Receipts, Transparency Services.
- Internet-Draft draft-mih-scitt-agent-action-capsule-05 — one payload profile that uses CPB and declares
jcs. - In preparation COSE deterministic encodings (Internet-Draft in preparation) — names the deterministic CBOR encoding behind a Hash Envelope preimage.
- Code action-state-group/scitt-payload-binding — draft source, registry, and conformance vectors.