The CDK Evidence Model Specification
Abstract
This document defines the Evidence Model: the structure of a single attestation, independent of how attestations relate to one another (see the Trust Graph Specification). It specifies the envelope format, predicate types, and signing model every CDK attestation conforms to — built on existing in-toto and DSSE conventions rather than a proprietary format.
1. Terminology
- Statement
- The unsigned claim: a subject, a predicate type, and predicate data.
- Predicate
- The type-specific payload describing what happened.
- Envelope
- The signed wrapper around a Statement, per the DSSE format.
- Signer
- The identity whose signature is attached to an envelope.
2. The Envelope
Every attestation is wrapped in a DSSE — a Dead Simple Signing Envelope — the same envelope format used by in-toto and Sigstore. CDK does not define its own signing wrapper; it reuses one that verifiers already know how to check.
{
"payload": "<base64-encoded Statement>",
"payloadType": "application/vnd.in-toto+json",
"signatures": [
{ "keyid": "", "sig": "<base64-encoded signature>" }
]
}
3. Predicate Types
The predicateType field determines how predicate is interpreted. CDK defines one predicate type per event category:
- approval/v1
- Pull request or change approval.
- deployment/v1
- Deployment authorization and execution.
- policy-evaluation/v1
- Result of an automated policy check.
4. Signing
Signatures are produced using Sigstore's keyless signing flow — short-lived certificates issued against an OIDC identity, with no long-term private key for CDK or the signer to manage. Verification requires no CDK-specific tooling; any Sigstore-compatible verifier can check a signature independently, the same way it would check any other in-toto attestation.
5. Complete Example
The unsigned Statement:
{
"_type": "https://in-toto.io/Statement/v1",
"predicateType": "https://cdk.dev/predicates/deployment/v1",
"subject": [
{ "name": "release-2026.07", "digest": { "sha256": "8f92ab…" } }
],
"predicate": {
"actor": "[email protected]",
"policy": "release-policy-v3",
"timestamp": "2026-07-28T09:41:00Z",
"status": "verified"
}
}
The same Statement, base64-encoded and signed inside its envelope:
{
"payload": "eyJfdHlwZSI6Imh0dHBzOi8vaW4tdG90by5pby9TdGF0ZW1lbnQvdjEiLCAuLi59",
"payloadType": "application/vnd.in-toto+json",
"signatures": [
{ "keyid": "", "sig": "MEUCIQDx8f92ab…" }
]
}