Define did:web verification for signed Entry Trust Manifests - #110
Draft
jonathanhefner wants to merge 2 commits into
Draft
Define did:web verification for signed Entry Trust Manifests#110jonathanhefner wants to merge 2 commits into
jonathanhefner wants to merge 2 commits into
Conversation
Require every `Subject` to identify the artifact it describes, and require signed entry manifests to bind any catalog version they rely on. Verify those signed release coordinates against the containing entry so valid artifact bytes and trust claims cannot be transplanted or relabeled as another release. Record the design rationale in ADR-0025, extend the threat model, and align the normative prose, CDDL, examples, xRegistry mapping, and author guidance. Clarify that catalog-level integrity remains complementary to publisher-signed release binding. Signed-off-by: Jonathan Hefner <jonathan@hefner.pro>
Narrow `TrustManifest.identity` to the issuer of the manifest claims, leaving artifact identity to the signed `subject` and runtime identity to protocol-specific profiles. Define one interoperable `urn:air` and root `did:web` verification profile with explicit namespace authorization, detached JWS construction, DID key selection, ES256 requirements, current-state lifecycle semantics, and fail-closed Level 3 behavior. Keep the common JWS envelope extensible so separately defined profiles can supply different key-selection rules. Remove the misleading generic SPIFFE, HTTPS, and DNS resolution procedure, record the design in ADR-0027, and align the guidance, examples, threat model, and earlier ADR history with the narrower issuer model.
jonathanhefner
force-pushed
the
agent/define-did-web-entry-signatures
branch
from
September 6, 2026 01:39
709780a to
c54c014
Compare
This was referenced Sep 6, 2026
jdamick
reviewed
Sep 10, 2026
| but the profile does not support a separately identified issuer signing on the | ||
| publisher's behalf. | ||
|
|
||
| The profile supports only root `did:web` DIDs. Ports, method-specific paths, |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
This draft is submitted for parallel review. It depends on #108 and #109 and will be rebased onto main as those changes merge. Until then, the commit list includes the release-binding prerequisite from #108, while some Host-related text will disappear after #109.
Summary
The specification currently defines a detached JWS for Trust Manifests, but it does not define an interoperable way to determine who is authorized to sign a manifest or which verification key a consumer must use. Its generic key-resolution guidance treats DID, HTTPS, SPIFFE, and DNS identities as interchangeable lookup mechanisms even though each has a different authorization and lifecycle model. For DID documents in particular, finding a key under
verificationMethoddoes not establish that the key is authorized to make assertions.This PR narrows
TrustManifest.identityto one role: it identifies the issuer to which the manifest's claims are attributed. The signedsubjectidentifies the artifact release and representation, while runtime or workload identity remains the responsibility of the artifact protocol or a future runtime-security profile.For signed Entry Trust Manifests, this PR defines one interoperable publisher-authentication profile. A standard
urn:airidentifier authorizes the rootdid:webDID for the same publisher domain. The issuer signs the canonicalized manifest with ES256, and the protected JWSkidselects a P-256 JWK that the current DID document explicitly authorizes underassertionMethod.ADR-0027 records the decision and its boundaries. The normative specification, threat model, examples, mapping guidance, and author documentation are updated to use the same model.
Rationale
Letting a manifest select an arbitrary identity and then resolving a key from that identity proves only that the signature was made by whoever controls the selected identity. A catalog writer could replace both values and produce an internally consistent self-signed manifest.
The standard
urn:airidentifier already contains the artifact publisher's domain. Requiring the exact corresponding rootdid:webDID gives independent implementations a deterministic authorization rule without requiring AI Catalog to operate a registry of signing identities. DID Web delegates control of that name to the existing DNS and Web PKI trust infrastructure; the DID document then identifies the publisher's currently authorized assertion key.This establishes publisher-domain control, not publisher reputation. A consumer or registry still decides whether that authenticated publisher and its claims satisfy local policy. The profile likewise does not provide historical proof after a key is removed, transparency-log guarantees, or rollback protection.
Choosing one algorithm, key representation, verification relationship, and failure procedure provides a mandatory producer-consumer intersection for v1. Additional identity methods and signing arrangements can be added as separate profiles once their authorization rules and end-to-end use cases are defined.
Under this profile, the publisher and Trust Manifest issuer are the same domain authority. Publishing automation may perform the signing operation with a key authorized by the publisher's DID document, but a separately identified issuer signing on the publisher's behalf requires a future delegation profile.
Verification profile
The profile specifies:
urn:airpublisher component and a rootdid:webissuer;algandkidheaders for this profile, and rejection of headers that nominate an attacker-controlled key source;publicKeyJwkas the interoperable v1 algorithm and key representation;assertionMethod;issuedAtand key rotation;Scope
This design builds on the signed release binding recorded by #108. In particular, the signed
subject.identifiersupplies the publisher namespace that authorizes the Trust Manifest issuer; the verification profile cannot safely derive that authorization from an unsigned entry identifier.It also builds on the Entry-specific Trust Manifest scope recorded by #109. Authentication of the catalog operator and authorization of a top-level catalog signature remain separate concerns.
This PR deliberately does not define:
did:webidentities, publisher delegation, hosted signing services, or corporate-affiliation inference;signature;publisher-identityattestations.The examples in this PR demonstrate the required structure but are not cryptographic known-answer vectors. A focused follow-up should add a fixed artifact, DID document, canonical payload, valid signature, and representative invalid cases so implementations can test that they compose the referenced standards identically.
Related work
This proposal supersedes #107, which defines publisher-domain alignment as a consistency check but deliberately does not establish domain control, signer authorization, key selection, or signature validity. For signed Entry Trust Manifests, this PR retains the unambiguous standard
urn:airpublisher boundary and replaces generic domain alignment with an exact rootdid:webauthorization rule and a complete verification procedure.The proposal intentionally does not retain #107's generic HTTPS and SPIFFE alignment rules because domain comparison alone is not a signature profile for either mechanism. It likewise does not impose publisher-domain alignment on unsigned Trust Manifests, whose claims are not authenticated by a Trust Manifest signature.
AI usage disclosure: This PR was developed with AI assistance under my direct supervision and review.