This document specifies the attestation receipt: the full-fidelity record from which the compact H33-74 primitive is derived. A receipt contains all fields necessary for an independent verifier to reconstruct and validate the attestation without trusting the issuing system.
Receipts are JSON objects. They carry input and output commitments, policy and authority hashes, a chain position linking each receipt to its predecessor, a three-family post-quantum signature bundle, and the derived H33-74 commitment and cached receipt bytes. This specification defines the canonical field set, serialization rules for hash computation, chain-linking semantics, and the verification algorithm.
This specification is at Production status. The receipt schema, hash computation rules, and chain-linking semantics defined herein are frozen per the H33 Protocol Stability policy.
The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT", "SHOULD", "SHOULD NOT", "RECOMMENDED", "MAY", and "OPTIONAL" in this document are to be interpreted as described in RFC 2119.
0x00...00) as its predecessor hash.H33:receipt:v1:hash: (21 bytes).authority_hash, which is the SHA3-256 digest of the concatenated public key bytes.An attestation receipt is a JSON object with the following fields. All fields are REQUIRED unless marked OPTIONAL.
| Field | Type | Required | Description |
|---|---|---|---|
receipt_id | string (UUID v4) | Yes | Unique identifier for this receipt. MUST be a valid UUID v4 in lowercase hyphenated form. |
tenant_id | string (UUID v4) | Yes | The tenant that owns this receipt. |
computation_type | string | Yes | One of the enumerated computation type names (e.g., "BIOMETRIC_AUTH"). MUST correspond to a value defined in H33-74 Section 5. |
input_commitment | string (hex, 64 chars) | Yes | SHA3-256 digest of the computation input, hex-encoded. Lowercase. |
output_commitment | string (hex, 64 chars) | Yes | SHA3-256 digest of the computation output, hex-encoded. Lowercase. |
policy_hash | string (hex, 64 chars) | Yes | SHA3-256 digest of the policy document under which the computation was evaluated. |
authority_hash | string (hex, 64 chars) | Yes | SHA3-256 digest of the concatenated signer set public key bytes (ML-DSA || FALCON || SLH-DSA). |
timestamp | string (ISO 8601) | Yes | Time of attestation. MUST be in UTC with second precision and the Z suffix (e.g., 2026-05-18T09:14:22Z). |
predecessor_hash | string (hex, 64 chars) | Yes | Receipt hash of the preceding receipt in this tenant's chain. "0000...0000" (64 zeros) for the first receipt. |
chain_position | integer (uint64) | Yes | Ordinal position in the tenant's chain. First receipt is 0. MUST be exactly predecessor.chain_position + 1 for all subsequent receipts. |
domain_separator | string | Yes | The domain separator used for this receipt's hash computation. MUST be "H33:receipt:v1:hash:". |
signatures | object | Yes | The three-family PQ signature bundle. See Section 7. |
h33_74_commitment | string (hex, 64 chars) | Yes | The 32-byte commitment that appears in the H33-74 primitive, hex-encoded. |
cached_receipt | string (hex, 84 chars) | Yes | The 42-byte cached receipt portion of the H33-74 primitive, hex-encoded. |
metadata | object | OPTIONAL | Implementation-specific metadata. Verifiers MUST ignore unrecognized fields within this object. MUST NOT affect hash computation. |
The receipt hash is computed over a canonical byte serialization. This section defines the canonical form. Implementations MUST produce identical hash outputs for semantically identical receipts.
receipt_id, tenant_id, computation_type, input_commitment, output_commitment, policy_hash, authority_hash, timestamp, predecessor_hash, chain_position, domain_separator. The signatures, h33_74_commitment, cached_receipt, and metadata fields are excluded from hash computation.chain_position, the value is the 8-byte little-endian encoding of the uint64 integer (no length prefix).H33:receipt:v1:hash: (21 bytes, UTF-8, no null terminator) is prepended to the concatenated field bytes.SHA3-256(domain_separator || serialized_fields).The signatures, h33_74_commitment, and cached_receipt fields are excluded from hash computation because they are derived from the receipt data. Including them would create a circular dependency.
fn compute_receipt_hash(receipt) -> [u8; 32] {
let domain = b"H33:receipt:v1:hash:";
let mut buf = Vec::new();
buf.extend_from_slice(domain);
for field in [receipt_id, tenant_id, computation_type,
input_commitment, output_commitment, policy_hash,
authority_hash, timestamp, predecessor_hash,
domain_separator] {
let bytes = field.as_utf8_nfc();
buf.extend_from_slice(&(bytes.len() as u32).to_le_bytes());
buf.extend_from_slice(bytes);
}
// chain_position: fixed 8-byte LE, no length prefix
buf.extend_from_slice(&receipt.chain_position.to_le_bytes());
sha3_256(&buf)
}Attestation receipts form a hash chain per tenant. Each receipt references the hash of its predecessor, creating an append-only, tamper-evident sequence.
chain_position MUST start at 0 for the first receipt of a tenant.receipt.chain_position == predecessor.chain_position + 1.predecessor_hash MUST equal compute_receipt_hash(predecessor_receipt)."0000000000000000000000000000000000000000000000000000000000000000" (64 hex zeros) as its predecessor_hash.To verify a chain segment from position N to position M:
chain_position in [N, M] for the given tenant_id.i (where i > N), verify that receipt[i].predecessor_hash == compute_receipt_hash(receipt[i-1]).N > 0, verify that receipt[N].predecessor_hash matches the known hash of the receipt at position N-1. If this receipt is unavailable, the chain segment cannot be fully anchored.The signatures field is a JSON object with three keys, each containing the hex-encoded signature bytes:
| Key | Algorithm | Standard | Approx. Size | Description |
|---|---|---|---|---|
ml_dsa | ML-DSA-65 | FIPS 204 | 3,309 bytes | Module-Lattice Digital Signature. MLWE hardness assumption. |
falcon | FALCON-512 | NIST Round 3 | ~690 bytes | NTRU-lattice-based signature. Independent lattice assumption from ML-DSA. |
slh_dsa | SLH-DSA-SHA2-128f-simple | FIPS 205 | 17,088 bytes | Stateless hash-based signature. Security depends only on hash function properties. |
All three signatures MUST be computed over the canonical receipt bytes (the same byte sequence input to SHA3-256 in Section 5, without the domain separator prefix). Each signature MUST be hex-encoded in lowercase.
The signature input is the canonical serialization of fields (Step 5.1, rules 1-4) without the domain separator. The domain separator is used only for the hash computation, not for signing. This is intentional: the hash binds the domain context; the signatures bind the data.
An independent verifier MUST execute the following steps in order. Failure at any step terminates verification with the corresponding error code.
RCPT_ERR_SCHEMA.receipt_id and tenant_id are valid UUID v4 in lowercase hyphenated form. Error: RCPT_ERR_UUID.computation_type is one of the defined values. Error: RCPT_ERR_COMP_TYPE.RCPT_ERR_HEX.timestamp is a valid ISO 8601 UTC string with the Z suffix. Verify it is not in the future by more than 300 seconds. Error: RCPT_ERR_TIMESTAMP.domain_separator is exactly "H33:receipt:v1:hash:". Error: RCPT_ERR_DOMAIN.RCPT_ERR_HASH (used in the next step).h33_74_commitment matches the commitment derivation defined in H33-74 Section 4.2. Error: RCPT_ERR_COMMITMENT.chain_position > 0), fetch the predecessor and verify predecessor_hash == compute_receipt_hash(predecessor). Error: RCPT_ERR_CHAIN.ml_dsa, falcon, slh_dsa): decode the hex signature, obtain the corresponding public key from the authority identified by authority_hash, and verify the signature over the canonical receipt bytes. Error: RCPT_ERR_SIG_MLDSA, RCPT_ERR_SIG_FALCON, or RCPT_ERR_SIG_SLHDSA.$ h33 verify-receipt \
--input receipt.json \
--authority-keys /path/to/authority_keys.json \
--check-chain
Schema: VALID [PASS]
UUID format: VALID [PASS]
Computation type: BIOMETRIC_AUTH [PASS]
Hex fields: VALID [PASS]
Timestamp: 2026-05-18T09:14:22Z [PASS]
Domain separator: H33:receipt:v1:hash: [PASS]
Receipt hash: a3f8c1d2... [COMPUTED]
Commitment match: VALID [PASS]
Chain link: pos 1427 -> pos 1426 [PASS]
ML-DSA-65 sig: VALID [PASS]
FALCON-512 sig: VALID [PASS]
SLH-DSA sig: VALID [PASS]
Result: VERIFIED (12/12 checks passed)
| Error Code | Condition | Severity |
|---|---|---|
RCPT_ERR_SCHEMA | Missing or incorrectly typed required field | Critical |
RCPT_ERR_UUID | Invalid UUID v4 format in receipt_id or tenant_id | Critical |
RCPT_ERR_COMP_TYPE | Unrecognized computation type string | Critical |
RCPT_ERR_HEX | Hex field has wrong length or contains non-hex characters | Critical |
RCPT_ERR_TIMESTAMP | Invalid ISO 8601 format or future timestamp exceeds tolerance | Critical |
RCPT_ERR_DOMAIN | Domain separator does not match expected value | Critical |
RCPT_ERR_COMMITMENT | Recomputed commitment does not match h33_74_commitment | Critical |
RCPT_ERR_CHAIN | Predecessor hash mismatch or chain position gap | Critical |
RCPT_ERR_CHAIN_FETCH | Predecessor receipt could not be retrieved | Warning |
RCPT_ERR_SIG_MLDSA | ML-DSA-65 signature verification failed | Critical |
RCPT_ERR_SIG_FALCON | FALCON-512 signature verification failed | Critical |
RCPT_ERR_SIG_SLHDSA | SLH-DSA signature verification failed | Critical |
RCPT_ERR_AUTHORITY | Authority public keys not found for given authority_hash | Critical |
An implementation claiming conformance to this specification MUST:
Implementations SHOULD:
RCPT_ERR_CHAIN_FETCH) as advisory information without halting verification of other checks.metadata field, if present, as a valid JSON object, but ignore its contents for hash computation.{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"$id": "https://h33.ai/schemas/attestation-receipt-v1.json",
"title": "H33 Attestation Receipt v1.0.0",
"type": "object",
"required": [
"receipt_id", "tenant_id", "computation_type",
"input_commitment", "output_commitment", "policy_hash",
"authority_hash", "timestamp", "predecessor_hash",
"chain_position", "domain_separator", "signatures",
"h33_74_commitment", "cached_receipt"
],
"properties": {
"receipt_id": { "type": "string", "pattern": "^[0-9a-f]{8}-[0-9a-f]{4}-4[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$" },
"tenant_id": { "type": "string", "pattern": "^[0-9a-f]{8}-[0-9a-f]{4}-4[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$" },
"computation_type": { "type": "string", "enum": ["BIOMETRIC_AUTH","ZKP_VERIFY","DOCUMENT_SIGN","KEY_EXCHANGE","FHE_COMPUTE","GOVERNANCE_DECISION","CHAIN_ANCHOR","AI_INFERENCE","TOKEN_MINT","WIRE_PROOF","THRESHOLD_DECRYPT"] },
"input_commitment": { "type": "string", "pattern": "^[0-9a-f]{64}$" },
"output_commitment": { "type": "string", "pattern": "^[0-9a-f]{64}$" },
"policy_hash": { "type": "string", "pattern": "^[0-9a-f]{64}$" },
"authority_hash": { "type": "string", "pattern": "^[0-9a-f]{64}$" },
"timestamp": { "type": "string", "pattern": "^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}Z$" },
"predecessor_hash": { "type": "string", "pattern": "^[0-9a-f]{64}$" },
"chain_position": { "type": "integer", "minimum": 0 },
"domain_separator": { "type": "string", "const": "H33:receipt:v1:hash:" },
"signatures": {
"type": "object",
"required": ["ml_dsa", "falcon", "slh_dsa"],
"properties": {
"ml_dsa": { "type": "string", "pattern": "^[0-9a-f]+$" },
"falcon": { "type": "string", "pattern": "^[0-9a-f]+$" },
"slh_dsa": { "type": "string", "pattern": "^[0-9a-f]+$" }
}
},
"h33_74_commitment": { "type": "string", "pattern": "^[0-9a-f]{64}$" },
"cached_receipt": { "type": "string", "pattern": "^[0-9a-f]{84}$" },
"metadata": { "type": "object" }
},
"additionalProperties": false
}{
"receipt_id": "f47ac10b-58cc-4372-a567-0e02b2c3d479",
"tenant_id": "a1b2c3d4-e5f6-4789-abcd-ef0123456789",
"computation_type": "BIOMETRIC_AUTH",
"input_commitment": "b94d27b9934d3e08a52e52d7da7dabfac484efe37a5380ee9088f7ace2efcde9",
"output_commitment": "7d1a54127b222502f5b79b5fb0803061152a44f92b37e23c6527baf665d4da9a",
"policy_hash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855",
"authority_hash": "2cf24dba5fb0a30e26e83b2ac5b9e29e1b161e5c1fa7425e73043362938b9824",
"timestamp": "2026-05-18T09:14:22Z",
"predecessor_hash": "d7a8fbb307d7809469ca9abcb0082e4f8d5651e46d3cdb762d02d0bf37c9e592",
"chain_position": 1427,
"domain_separator": "H33:receipt:v1:hash:",
"signatures": {
"ml_dsa": "a1b2c3...truncated...f4e5d6",
"falcon": "d6e5f4...truncated...c3b2a1",
"slh_dsa": "1a2b3c...truncated...6f5e4d"
},
"h33_74_commitment": "a3f8c1d2e4b5f67890abcdef1234567890abcdef1234567890abcdef12345678",
"cached_receipt": "01010700e83a0900a1b2c3d4e5f6a1b2c3d4e5f6a1b2c3d4a1b2c3d4e5f64789abcdef01234567f1a3"
}The following receipt has chain_position: 1428 but its predecessor_hash does not match the hash of receipt 1427. A conformant verifier MUST produce RCPT_ERR_CHAIN.
{
"receipt_id": "c9d8e7f6-b5a4-4321-9876-fedcba987654",
"tenant_id": "a1b2c3d4-e5f6-4789-abcd-ef0123456789",
"computation_type": "BIOMETRIC_AUTH",
"input_commitment": "abc123...valid...",
"output_commitment": "def456...valid...",
"policy_hash": "e3b0c4...valid...",
"authority_hash": "2cf24d...valid...",
"timestamp": "2026-05-18T09:14:23Z",
"predecessor_hash": "0000000000000000000000000000000000000000000000000000000000000000",
"chain_position": 1428,
"domain_separator": "H33:receipt:v1:hash:",
"signatures": { "ml_dsa": "...", "falcon": "...", "slh_dsa": "..." },
"h33_74_commitment": "...",
"cached_receipt": "..."
}
// Verification output:
// RCPT_ERR_CHAIN: predecessor_hash is 0x0000...0000 but chain_position
// is 1428. Expected predecessor_hash to equal the receipt hash of
// position 1427. Chain integrity: BROKEN.| Version | Date | Changes |
|---|---|---|
1.0.0 | 2026-05-22 | Initial publication. Receipt schema frozen. Hash computation algorithm specified. Chain linking invariants defined. JSON Schema published. 13 error codes enumerated. |