@openvtc/trust-tasks 0.20.7 → 0.21.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +320 -0
- package/dist/_shared/components.d.ts +299 -2
- package/dist/_shared/components.d.ts.map +1 -1
- package/dist/auth/passkey/enroll/invite/0.2/payload.d.ts +456 -0
- package/dist/auth/passkey/enroll/invite/0.2/payload.d.ts.map +1 -0
- package/dist/auth/passkey/enroll/invite/0.2/payload.js +248 -0
- package/dist/auth/passkey/enroll/invite/0.2/payload.js.map +1 -0
- package/dist/auth/passkey/enroll/redeem/finish/0.1/payload.d.ts +728 -0
- package/dist/auth/passkey/enroll/redeem/finish/0.1/payload.d.ts.map +1 -0
- package/dist/auth/passkey/enroll/redeem/finish/0.1/payload.js +430 -0
- package/dist/auth/passkey/enroll/redeem/finish/0.1/payload.js.map +1 -0
- package/dist/auth/passkey/enroll/redeem/start/0.1/payload.d.ts +1043 -0
- package/dist/auth/passkey/enroll/redeem/start/0.1/payload.d.ts.map +1 -0
- package/dist/auth/passkey/enroll/redeem/start/0.1/payload.js +628 -0
- package/dist/auth/passkey/enroll/redeem/start/0.1/payload.js.map +1 -0
- package/dist/auth/passkey/revoke/finish/0.2/payload.d.ts +533 -0
- package/dist/auth/passkey/revoke/finish/0.2/payload.d.ts.map +1 -0
- package/dist/auth/passkey/revoke/finish/0.2/payload.js +315 -0
- package/dist/auth/passkey/revoke/finish/0.2/payload.js.map +1 -0
- package/dist/auth/passkey/revoke/start/0.2/payload.d.ts +511 -0
- package/dist/auth/passkey/revoke/start/0.2/payload.d.ts.map +1 -0
- package/dist/auth/passkey/revoke/start/0.2/payload.js +297 -0
- package/dist/auth/passkey/revoke/start/0.2/payload.js.map +1 -0
- package/dist/auth/step-up/approve-request/0.3/payload.d.ts +613 -0
- package/dist/auth/step-up/approve-request/0.3/payload.d.ts.map +1 -0
- package/dist/auth/step-up/approve-request/0.3/payload.js +345 -0
- package/dist/auth/step-up/approve-request/0.3/payload.js.map +1 -0
- package/dist/auth/step-up/approve-response/0.4/payload.d.ts +887 -0
- package/dist/auth/step-up/approve-response/0.4/payload.d.ts.map +1 -0
- package/dist/auth/step-up/approve-response/0.4/payload.js +504 -0
- package/dist/auth/step-up/approve-response/0.4/payload.js.map +1 -0
- package/dist/auth/step-up/approve-response/0.5/payload.d.ts +887 -0
- package/dist/auth/step-up/approve-response/0.5/payload.d.ts.map +1 -0
- package/dist/auth/step-up/approve-response/0.5/payload.js +504 -0
- package/dist/auth/step-up/approve-response/0.5/payload.js.map +1 -0
- package/dist/backup/abort/0.1/payload.d.ts +262 -0
- package/dist/backup/abort/0.1/payload.d.ts.map +1 -0
- package/dist/backup/abort/0.1/payload.js +146 -0
- package/dist/backup/abort/0.1/payload.js.map +1 -0
- package/dist/backup/complete-export/0.1/payload.d.ts +262 -0
- package/dist/backup/complete-export/0.1/payload.d.ts.map +1 -0
- package/dist/backup/complete-export/0.1/payload.js +146 -0
- package/dist/backup/complete-export/0.1/payload.js.map +1 -0
- package/dist/backup/finalize-import/0.1/payload.d.ts +395 -0
- package/dist/backup/finalize-import/0.1/payload.d.ts.map +1 -0
- package/dist/backup/finalize-import/0.1/payload.js +209 -0
- package/dist/backup/finalize-import/0.1/payload.js.map +1 -0
- package/dist/backup/get-chunk/0.1/payload.d.ts +461 -0
- package/dist/backup/get-chunk/0.1/payload.d.ts.map +1 -0
- package/dist/backup/get-chunk/0.1/payload.js +250 -0
- package/dist/backup/get-chunk/0.1/payload.js.map +1 -0
- package/dist/backup/initiate-export/0.1/payload.d.ts +896 -0
- package/dist/backup/initiate-export/0.1/payload.d.ts.map +1 -0
- package/dist/backup/initiate-export/0.1/payload.js +507 -0
- package/dist/backup/initiate-export/0.1/payload.js.map +1 -0
- package/dist/backup/initiate-import/0.1/payload.d.ts +888 -0
- package/dist/backup/initiate-import/0.1/payload.d.ts.map +1 -0
- package/dist/backup/initiate-import/0.1/payload.js +504 -0
- package/dist/backup/initiate-import/0.1/payload.js.map +1 -0
- package/dist/backup/put-chunk/0.1/payload.d.ts +495 -0
- package/dist/backup/put-chunk/0.1/payload.d.ts.map +1 -0
- package/dist/backup/put-chunk/0.1/payload.js +265 -0
- package/dist/backup/put-chunk/0.1/payload.js.map +1 -0
- package/dist/device/list/0.1/payload.d.ts +4 -4
- package/dist/device/list/0.1/payload.d.ts.map +1 -1
- package/dist/device/list/0.1/payload.js +4 -2
- package/dist/device/list/0.1/payload.js.map +1 -1
- package/dist/device/list/0.2/payload.d.ts +4 -4
- package/dist/device/list/0.2/payload.d.ts.map +1 -1
- package/dist/device/list/0.2/payload.js +4 -2
- package/dist/device/list/0.2/payload.js.map +1 -1
- package/dist/device/register/0.1/payload.d.ts +4 -4
- package/dist/device/register/0.1/payload.d.ts.map +1 -1
- package/dist/device/register/0.1/payload.js +4 -2
- package/dist/device/register/0.1/payload.js.map +1 -1
- package/dist/device/register/0.2/payload.d.ts +4 -4
- package/dist/device/register/0.2/payload.d.ts.map +1 -1
- package/dist/device/register/0.2/payload.js +4 -2
- package/dist/device/register/0.2/payload.js.map +1 -1
- package/dist/git-ns/_shared/0.4/git-ns.d.ts +16 -0
- package/dist/git-ns/_shared/0.4/git-ns.d.ts.map +1 -0
- package/dist/git-ns/_shared/0.4/git-ns.js +6 -0
- package/dist/git-ns/_shared/0.4/git-ns.js.map +1 -0
- package/dist/git-ns/account/link-status/0.1/payload.d.ts +2 -2
- package/dist/git-ns/account/link-status/0.1/payload.js +2 -2
- package/dist/git-ns/account/link-status/0.1/payload.js.map +1 -1
- package/dist/git-ns/account/unlink/0.1/payload.d.ts +411 -0
- package/dist/git-ns/account/unlink/0.1/payload.d.ts.map +1 -0
- package/dist/git-ns/account/unlink/0.1/payload.js +228 -0
- package/dist/git-ns/account/unlink/0.1/payload.js.map +1 -0
- package/dist/git-ns/bridge/event/0.3/payload.d.ts +1682 -0
- package/dist/git-ns/bridge/event/0.3/payload.d.ts.map +1 -0
- package/dist/git-ns/bridge/event/0.3/payload.js +971 -0
- package/dist/git-ns/bridge/event/0.3/payload.js.map +1 -0
- package/dist/git-ns/bridge/job/0.4/payload.d.ts +1068 -0
- package/dist/git-ns/bridge/job/0.4/payload.d.ts.map +1 -0
- package/dist/git-ns/bridge/job/0.4/payload.js +573 -0
- package/dist/git-ns/bridge/job/0.4/payload.js.map +1 -0
- package/dist/git-ns/drift/resolve/0.3/payload.d.ts +1072 -0
- package/dist/git-ns/drift/resolve/0.3/payload.d.ts.map +1 -0
- package/dist/git-ns/drift/resolve/0.3/payload.js +634 -0
- package/dist/git-ns/drift/resolve/0.3/payload.js.map +1 -0
- package/dist/git-ns/namespace/reseat/0.3/payload.d.ts +515 -0
- package/dist/git-ns/namespace/reseat/0.3/payload.d.ts.map +1 -0
- package/dist/git-ns/namespace/reseat/0.3/payload.js +296 -0
- package/dist/git-ns/namespace/reseat/0.3/payload.js.map +1 -0
- package/dist/git-ns/repo/create/0.3/payload.d.ts +1101 -0
- package/dist/git-ns/repo/create/0.3/payload.d.ts.map +1 -0
- package/dist/git-ns/repo/create/0.3/payload.js +646 -0
- package/dist/git-ns/repo/create/0.3/payload.js.map +1 -0
- package/dist/git-ns/right/break-glass/0.1/payload.d.ts +685 -0
- package/dist/git-ns/right/break-glass/0.1/payload.d.ts.map +1 -0
- package/dist/git-ns/right/break-glass/0.1/payload.js +397 -0
- package/dist/git-ns/right/break-glass/0.1/payload.js.map +1 -0
- package/dist/git-ns/right/break-glass-notice/0.1/payload.d.ts +384 -0
- package/dist/git-ns/right/break-glass-notice/0.1/payload.d.ts.map +1 -0
- package/dist/git-ns/right/break-glass-notice/0.1/payload.js +216 -0
- package/dist/git-ns/right/break-glass-notice/0.1/payload.js.map +1 -0
- package/dist/git-ns/right/grant/0.3/payload.d.ts +678 -0
- package/dist/git-ns/right/grant/0.3/payload.d.ts.map +1 -0
- package/dist/git-ns/right/grant/0.3/payload.js +383 -0
- package/dist/git-ns/right/grant/0.3/payload.js.map +1 -0
- package/dist/git-ns/right/ratify/0.1/payload.d.ts +702 -0
- package/dist/git-ns/right/ratify/0.1/payload.d.ts.map +1 -0
- package/dist/git-ns/right/ratify/0.1/payload.js +404 -0
- package/dist/git-ns/right/ratify/0.1/payload.js.map +1 -0
- package/dist/git-ns/right/revoke/0.3/payload.d.ts +664 -0
- package/dist/git-ns/right/revoke/0.3/payload.d.ts.map +1 -0
- package/dist/git-ns/right/revoke/0.3/payload.js +378 -0
- package/dist/git-ns/right/revoke/0.3/payload.js.map +1 -0
- package/dist/git-ns/roles/reproject/0.1/payload.d.ts +325 -0
- package/dist/git-ns/roles/reproject/0.1/payload.d.ts.map +1 -0
- package/dist/git-ns/roles/reproject/0.1/payload.js +176 -0
- package/dist/git-ns/roles/reproject/0.1/payload.js.map +1 -0
- package/dist/git-ns/view/0.1/payload.d.ts +2 -2
- package/dist/git-ns/view/0.1/payload.js +2 -2
- package/dist/git-ns/view/0.1/payload.js.map +1 -1
- package/dist/git-ns/view/0.2/payload.d.ts +2 -2
- package/dist/git-ns/view/0.2/payload.js +2 -2
- package/dist/git-ns/view/0.2/payload.js.map +1 -1
- package/dist/git-ns/view/0.3/payload.d.ts +2 -2
- package/dist/git-ns/view/0.3/payload.js +2 -2
- package/dist/git-ns/view/0.3/payload.js.map +1 -1
- package/dist/git-ns/view/0.4/payload.d.ts +1696 -0
- package/dist/git-ns/view/0.4/payload.d.ts.map +1 -0
- package/dist/git-ns/view/0.4/payload.js +1012 -0
- package/dist/git-ns/view/0.4/payload.js.map +1 -0
- package/dist/index.d.ts +39 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +39 -0
- package/dist/index.js.map +1 -1
- package/dist/messaging/message/status/0.1/payload.d.ts +372 -0
- package/dist/messaging/message/status/0.1/payload.d.ts.map +1 -0
- package/dist/messaging/message/status/0.1/payload.js +214 -0
- package/dist/messaging/message/status/0.1/payload.js.map +1 -0
- package/dist/vta/_shared/0.3/did-key-roles.d.ts +16 -0
- package/dist/vta/_shared/0.3/did-key-roles.d.ts.map +1 -0
- package/dist/vta/_shared/0.3/did-key-roles.js +6 -0
- package/dist/vta/_shared/0.3/did-key-roles.js.map +1 -0
- package/dist/vta/attestation/mnemonic-export/1.0/payload.d.ts +326 -0
- package/dist/vta/attestation/mnemonic-export/1.0/payload.d.ts.map +1 -0
- package/dist/vta/attestation/mnemonic-export/1.0/payload.js +175 -0
- package/dist/vta/attestation/mnemonic-export/1.0/payload.js.map +1 -0
- package/dist/vta/webvh/dids/keys/add/1.0/payload.d.ts +1914 -0
- package/dist/vta/webvh/dids/keys/add/1.0/payload.d.ts.map +1 -0
- package/dist/vta/webvh/dids/keys/add/1.0/payload.js +1128 -0
- package/dist/vta/webvh/dids/keys/add/1.0/payload.js.map +1 -0
- package/dist/vta/webvh/dids/keys/list/1.0/payload.d.ts +1603 -0
- package/dist/vta/webvh/dids/keys/list/1.0/payload.d.ts.map +1 -0
- package/dist/vta/webvh/dids/keys/list/1.0/payload.js +942 -0
- package/dist/vta/webvh/dids/keys/list/1.0/payload.js.map +1 -0
- package/dist/vta/webvh/dids/keys/retire/1.0/payload.d.ts +1914 -0
- package/dist/vta/webvh/dids/keys/retire/1.0/payload.d.ts.map +1 -0
- package/dist/vta/webvh/dids/keys/retire/1.0/payload.js +1123 -0
- package/dist/vta/webvh/dids/keys/retire/1.0/payload.js.map +1 -0
- package/dist/vta/webvh/dids/keys/revoke/1.0/payload.d.ts +2021 -0
- package/dist/vta/webvh/dids/keys/revoke/1.0/payload.d.ts.map +1 -0
- package/dist/vta/webvh/dids/keys/revoke/1.0/payload.js +1168 -0
- package/dist/vta/webvh/dids/keys/revoke/1.0/payload.js.map +1 -0
- package/dist/vta/webvh/dids/rotate-keys/2.0/payload.d.ts +1992 -0
- package/dist/vta/webvh/dids/rotate-keys/2.0/payload.d.ts.map +1 -0
- package/dist/vta/webvh/dids/rotate-keys/2.0/payload.js +1151 -0
- package/dist/vta/webvh/dids/rotate-keys/2.0/payload.js.map +1 -0
- package/dist/vta/webvh/dids/update/2.0/payload.d.ts +1062 -0
- package/dist/vta/webvh/dids/update/2.0/payload.d.ts.map +1 -0
- package/dist/vta/webvh/dids/update/2.0/payload.js +616 -0
- package/dist/vta/webvh/dids/update/2.0/payload.js.map +1 -0
- package/dist/vtc/credentials/reissue/0.1/payload.d.ts +502 -0
- package/dist/vtc/credentials/reissue/0.1/payload.d.ts.map +1 -0
- package/dist/vtc/credentials/reissue/0.1/payload.js +282 -0
- package/dist/vtc/credentials/reissue/0.1/payload.js.map +1 -0
- package/dist/vtc/members/personhood/challenge/0.1/payload.d.ts +2 -2
- package/dist/vtc/members/personhood/challenge/0.1/payload.js +2 -2
- package/dist/vtc/members/personhood/challenge/0.1/payload.js.map +1 -1
- package/dist/vtc/vetting/vetters/profile/0.1/payload.d.ts +2 -2
- package/dist/vtc/vetting/vetters/profile/0.1/payload.js +2 -2
- package/dist/vtc/vetting/vetters/profile/0.1/payload.js.map +1 -1
- package/dist/vtc/vetting/vetters/resend/0.1/payload.d.ts +2 -2
- package/dist/vtc/vetting/vetters/resend/0.1/payload.js +2 -2
- package/dist/vtc/vetting/vetters/resend/0.1/payload.js.map +1 -1
- package/package.json +1 -1
- package/src/_shared/components.ts +313 -2
- package/src/auth/passkey/enroll/invite/0.2/payload.ts +325 -0
- package/src/auth/passkey/enroll/redeem/finish/0.1/payload.ts +499 -0
- package/src/auth/passkey/enroll/redeem/start/0.1/payload.ts +700 -0
- package/src/auth/passkey/revoke/finish/0.2/payload.ts +379 -0
- package/src/auth/passkey/revoke/start/0.2/payload.ts +349 -0
- package/src/auth/step-up/approve-request/0.3/payload.ts +421 -0
- package/src/auth/step-up/approve-response/0.4/payload.ts +593 -0
- package/src/auth/step-up/approve-response/0.5/payload.ts +593 -0
- package/src/backup/abort/0.1/payload.ts +191 -0
- package/src/backup/complete-export/0.1/payload.ts +191 -0
- package/src/backup/finalize-import/0.1/payload.ts +279 -0
- package/src/backup/get-chunk/0.1/payload.ts +308 -0
- package/src/backup/initiate-export/0.1/payload.ts +564 -0
- package/src/backup/initiate-import/0.1/payload.ts +561 -0
- package/src/backup/put-chunk/0.1/payload.ts +331 -0
- package/src/device/list/0.1/payload.ts +4 -2
- package/src/device/list/0.2/payload.ts +4 -2
- package/src/device/register/0.1/payload.ts +4 -2
- package/src/device/register/0.2/payload.ts +4 -2
- package/src/git-ns/_shared/0.4/git-ns.ts +17 -0
- package/src/git-ns/account/link-status/0.1/payload.ts +2 -2
- package/src/git-ns/account/unlink/0.1/payload.ts +274 -0
- package/src/git-ns/bridge/event/0.3/payload.ts +1132 -0
- package/src/git-ns/bridge/job/0.4/payload.ts +691 -0
- package/src/git-ns/drift/resolve/0.3/payload.ts +707 -0
- package/src/git-ns/namespace/reseat/0.3/payload.ts +342 -0
- package/src/git-ns/repo/create/0.3/payload.ts +706 -0
- package/src/git-ns/right/break-glass/0.1/payload.ts +443 -0
- package/src/git-ns/right/break-glass-notice/0.1/payload.ts +258 -0
- package/src/git-ns/right/grant/0.3/payload.ts +434 -0
- package/src/git-ns/right/ratify/0.1/payload.ts +455 -0
- package/src/git-ns/right/revoke/0.3/payload.ts +425 -0
- package/src/git-ns/roles/reproject/0.1/payload.ts +220 -0
- package/src/git-ns/view/0.1/payload.ts +2 -2
- package/src/git-ns/view/0.2/payload.ts +2 -2
- package/src/git-ns/view/0.3/payload.ts +2 -2
- package/src/git-ns/view/0.4/payload.ts +1075 -0
- package/src/index.ts +39 -0
- package/src/messaging/message/status/0.1/payload.ts +270 -0
- package/src/vta/_shared/0.3/did-key-roles.ts +17 -0
- package/src/vta/attestation/mnemonic-export/1.0/payload.ts +232 -0
- package/src/vta/webvh/dids/keys/add/1.0/payload.ts +1217 -0
- package/src/vta/webvh/dids/keys/list/1.0/payload.ts +1004 -0
- package/src/vta/webvh/dids/keys/retire/1.0/payload.ts +1212 -0
- package/src/vta/webvh/dids/keys/revoke/1.0/payload.ts +1276 -0
- package/src/vta/webvh/dids/rotate-keys/2.0/payload.ts +1262 -0
- package/src/vta/webvh/dids/update/2.0/payload.ts +713 -0
- package/src/vtc/credentials/reissue/0.1/payload.ts +357 -0
- package/src/vtc/members/personhood/challenge/0.1/payload.ts +2 -2
- package/src/vtc/vetting/vetters/profile/0.1/payload.ts +2 -2
- package/src/vtc/vetting/vetters/resend/0.1/payload.ts +2 -2
|
@@ -0,0 +1,1914 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Generated by scripts/build-ts-bindings.mjs — DO NOT EDIT BY HAND.
|
|
3
|
+
* Source: specs/vta/webvh/dids/keys/add/1.0/payload.schema.json
|
|
4
|
+
*/
|
|
5
|
+
import type { DidDocumentChange, DidDocumentPreview, DidVerificationRelationship, Ext, KeyOrigin, KeyRole, KeyRoleApprovalState, KeyRoleChangeOutcome, KeyType, RoleKey, RoleKeyCustody, RoleKeyState, RotationKind, RotationRecord, RotationState } from "../../../../../../_shared/components.js";
|
|
6
|
+
/**
|
|
7
|
+
* Add a newly generated key to one role of a did:webvh, without removing any — a post-quantum key beside a classical one, or a second operational key.
|
|
8
|
+
*/
|
|
9
|
+
export interface VTAWebVHDIDsKeysAddPayload {
|
|
10
|
+
/**
|
|
11
|
+
* The DID whose keys change.
|
|
12
|
+
*/
|
|
13
|
+
did: string;
|
|
14
|
+
/**
|
|
15
|
+
* The role the key joins. `update` keys are not added; they move by rotation.
|
|
16
|
+
*/
|
|
17
|
+
role: "attestation" | "operational" | "messaging";
|
|
18
|
+
/**
|
|
19
|
+
* Algorithm of the key to generate. Must suit the role (CONVENTIONS.md §1 item 6).
|
|
20
|
+
*/
|
|
21
|
+
keyType: KeyType;
|
|
22
|
+
/**
|
|
23
|
+
* Operator-facing label for the key. Never published.
|
|
24
|
+
*/
|
|
25
|
+
label?: string;
|
|
26
|
+
/**
|
|
27
|
+
* Optimistic-concurrency precondition: the versionId the caller based this change on (for example `keys/list`'s `versionId`). The VTA MUST refuse the change with `vta/webvh/dids:versionConflict` if the DID's latest entry no longer matches.
|
|
28
|
+
*/
|
|
29
|
+
expectedVersionId?: string;
|
|
30
|
+
/**
|
|
31
|
+
* Compute and return the preview without writing anything but the plan (CONVENTIONS.md §3.1). Absent reads as false.
|
|
32
|
+
*/
|
|
33
|
+
dryRun?: boolean;
|
|
34
|
+
/**
|
|
35
|
+
* Apply exactly the plan a previous dry run of this same request returned. The VTA MUST apply that plan or nothing, and MUST refuse with `vta/webvh/dids:previewStale` if it has expired, the log has moved past its base, or this request differs from the one previewed. An approval (step-up or quorum) is bound to this identifier.
|
|
36
|
+
*/
|
|
37
|
+
previewId?: string;
|
|
38
|
+
/**
|
|
39
|
+
* Why the change is being made, for the audit trail and for other approvers. Never published.
|
|
40
|
+
*/
|
|
41
|
+
reason?: string;
|
|
42
|
+
ext?: Ext;
|
|
43
|
+
}
|
|
44
|
+
/**
|
|
45
|
+
* Success response. Type https://trusttasks.org/spec/vta/webvh/dids/keys/add/1.0#response. A refusal is a `trust-task-error` document, never this.
|
|
46
|
+
*/
|
|
47
|
+
export interface VTAWebVHDIDsKeysAddResponsePayload {
|
|
48
|
+
did: string;
|
|
49
|
+
outcome: KeyRoleChangeOutcome;
|
|
50
|
+
/**
|
|
51
|
+
* Present when `outcome` is `preview` or `pendingApproval`: the plan, and what an approval is bound to.
|
|
52
|
+
*/
|
|
53
|
+
preview?: DidDocumentPreview;
|
|
54
|
+
/**
|
|
55
|
+
* Present when `outcome` is `applied`: the versionId of the appended entry. Pass it as the next change's `expectedVersionId`.
|
|
56
|
+
*/
|
|
57
|
+
newVersionId?: string;
|
|
58
|
+
/**
|
|
59
|
+
* Every key whose state this change sets or would set, after the change.
|
|
60
|
+
*/
|
|
61
|
+
keys: RoleKey[];
|
|
62
|
+
rotation?: RotationRecord;
|
|
63
|
+
/**
|
|
64
|
+
* Present when `outcome` is `pendingApproval`.
|
|
65
|
+
*/
|
|
66
|
+
approvals?: KeyRoleApprovalState;
|
|
67
|
+
/**
|
|
68
|
+
* True when no hosting server holds this DID. The caller must publish `newLogEntry` itself; until it does, resolvers still see the previous version.
|
|
69
|
+
*/
|
|
70
|
+
serverless?: boolean;
|
|
71
|
+
/**
|
|
72
|
+
* The appended entry as JSON text. Present when `serverless` is true.
|
|
73
|
+
*/
|
|
74
|
+
newLogEntry?: string;
|
|
75
|
+
ext?: Ext;
|
|
76
|
+
}
|
|
77
|
+
/** Shared definitions this specification references, re-exported under the names it used to declare them with. */
|
|
78
|
+
export type { DidDocumentChange, DidDocumentPreview, DidVerificationRelationship, Ext, KeyOrigin, KeyRole, KeyRoleApprovalState, KeyRoleChangeOutcome, KeyType, RoleKey, RoleKeyCustody, RoleKeyState, RotationKind, RotationRecord, RotationState };
|
|
79
|
+
/** Trust Task type URI. */
|
|
80
|
+
export declare const TYPE_URI: "https://trusttasks.org/spec/vta/webvh/dids/keys/add/1.0";
|
|
81
|
+
/** Stable alias for this specification's request payload shape. */
|
|
82
|
+
export type Payload = VTAWebVHDIDsKeysAddPayload;
|
|
83
|
+
/** Trust Task response type URI (request type URI + "#response"). */
|
|
84
|
+
export declare const RESPONSE_TYPE_URI: "https://trusttasks.org/spec/vta/webvh/dids/keys/add/1.0#response";
|
|
85
|
+
/** Stable alias for this specification's success-response payload shape. */
|
|
86
|
+
export type Response = VTAWebVHDIDsKeysAddResponsePayload;
|
|
87
|
+
/**
|
|
88
|
+
* This specification's payload schema, as a value.
|
|
89
|
+
*
|
|
90
|
+
* SPEC.md §7.2 item 2 is performed against this. It is shipped as data
|
|
91
|
+
* rather than only as a `.json` file because TypeScript types are erased
|
|
92
|
+
* at runtime: without a schema a consumer has nothing to validate, and
|
|
93
|
+
* every REQUIRED payload member is optional in practice. Cross-file
|
|
94
|
+
* `$ref`s are already inlined, so it needs no resolver.
|
|
95
|
+
*/
|
|
96
|
+
export declare const PAYLOAD_SCHEMA: {
|
|
97
|
+
readonly $schema: "https://json-schema.org/draft/2020-12/schema";
|
|
98
|
+
readonly $id: "https://trusttasks.org/spec/vta/webvh/dids/keys/add/1.0";
|
|
99
|
+
readonly title: "VTA WebVH DIDs Keys Add — payload";
|
|
100
|
+
readonly description: "Add a newly generated key to one role of a did:webvh, without removing any — a post-quantum key beside a classical one, or a second operational key.";
|
|
101
|
+
readonly type: "object";
|
|
102
|
+
readonly additionalProperties: false;
|
|
103
|
+
readonly required: readonly ["did", "role", "keyType"];
|
|
104
|
+
readonly properties: {
|
|
105
|
+
readonly did: {
|
|
106
|
+
readonly type: "string";
|
|
107
|
+
readonly minLength: 1;
|
|
108
|
+
readonly description: "The DID whose keys change.";
|
|
109
|
+
};
|
|
110
|
+
readonly role: {
|
|
111
|
+
readonly type: "string";
|
|
112
|
+
readonly enum: readonly ["attestation", "operational", "messaging"];
|
|
113
|
+
readonly description: "The role the key joins. `update` keys are not added; they move by rotation.";
|
|
114
|
+
};
|
|
115
|
+
readonly keyType: {
|
|
116
|
+
readonly $ref: "#/$defs/KeyType";
|
|
117
|
+
readonly description: "Algorithm of the key to generate. Must suit the role (CONVENTIONS.md §1 item 6).";
|
|
118
|
+
};
|
|
119
|
+
readonly label: {
|
|
120
|
+
readonly type: "string";
|
|
121
|
+
readonly maxLength: 256;
|
|
122
|
+
readonly description: "Operator-facing label for the key. Never published.";
|
|
123
|
+
};
|
|
124
|
+
readonly expectedVersionId: {
|
|
125
|
+
readonly type: "string";
|
|
126
|
+
readonly minLength: 1;
|
|
127
|
+
readonly description: "Optimistic-concurrency precondition: the versionId the caller based this change on (for example `keys/list`'s `versionId`). The VTA MUST refuse the change with `vta/webvh/dids:versionConflict` if the DID's latest entry no longer matches.";
|
|
128
|
+
};
|
|
129
|
+
readonly dryRun: {
|
|
130
|
+
readonly type: "boolean";
|
|
131
|
+
readonly description: "Compute and return the preview without writing anything but the plan (CONVENTIONS.md §3.1). Absent reads as false.";
|
|
132
|
+
};
|
|
133
|
+
readonly previewId: {
|
|
134
|
+
readonly type: "string";
|
|
135
|
+
readonly minLength: 16;
|
|
136
|
+
readonly description: "Apply exactly the plan a previous dry run of this same request returned. The VTA MUST apply that plan or nothing, and MUST refuse with `vta/webvh/dids:previewStale` if it has expired, the log has moved past its base, or this request differs from the one previewed. An approval (step-up or quorum) is bound to this identifier.";
|
|
137
|
+
};
|
|
138
|
+
readonly reason: {
|
|
139
|
+
readonly type: "string";
|
|
140
|
+
readonly maxLength: 1024;
|
|
141
|
+
readonly description: "Why the change is being made, for the audit trail and for other approvers. Never published.";
|
|
142
|
+
};
|
|
143
|
+
readonly ext: {
|
|
144
|
+
readonly $ref: "#/$defs/Ext";
|
|
145
|
+
};
|
|
146
|
+
};
|
|
147
|
+
readonly $defs: {
|
|
148
|
+
readonly Response: {
|
|
149
|
+
readonly $anchor: "response";
|
|
150
|
+
readonly title: "VTA WebVH DIDs Keys Add — response payload";
|
|
151
|
+
readonly description: "Success response. Type https://trusttasks.org/spec/vta/webvh/dids/keys/add/1.0#response. A refusal is a `trust-task-error` document, never this.";
|
|
152
|
+
readonly type: "object";
|
|
153
|
+
readonly additionalProperties: false;
|
|
154
|
+
readonly required: readonly ["did", "outcome", "keys"];
|
|
155
|
+
readonly properties: {
|
|
156
|
+
readonly did: {
|
|
157
|
+
readonly type: "string";
|
|
158
|
+
};
|
|
159
|
+
readonly outcome: {
|
|
160
|
+
readonly $ref: "#/$defs/KeyRoleChangeOutcome";
|
|
161
|
+
};
|
|
162
|
+
readonly preview: {
|
|
163
|
+
readonly $ref: "#/$defs/DidDocumentPreview";
|
|
164
|
+
readonly description: "Present when `outcome` is `preview` or `pendingApproval`: the plan, and what an approval is bound to.";
|
|
165
|
+
};
|
|
166
|
+
readonly newVersionId: {
|
|
167
|
+
readonly type: "string";
|
|
168
|
+
readonly description: "Present when `outcome` is `applied`: the versionId of the appended entry. Pass it as the next change's `expectedVersionId`.";
|
|
169
|
+
};
|
|
170
|
+
readonly keys: {
|
|
171
|
+
readonly type: "array";
|
|
172
|
+
readonly items: {
|
|
173
|
+
readonly $ref: "#/$defs/RoleKey";
|
|
174
|
+
};
|
|
175
|
+
readonly description: "Every key whose state this change sets or would set, after the change.";
|
|
176
|
+
};
|
|
177
|
+
readonly rotation: {
|
|
178
|
+
readonly $ref: "#/$defs/RotationRecord";
|
|
179
|
+
};
|
|
180
|
+
readonly approvals: {
|
|
181
|
+
readonly $ref: "#/$defs/KeyRoleApprovalState";
|
|
182
|
+
readonly description: "Present when `outcome` is `pendingApproval`.";
|
|
183
|
+
};
|
|
184
|
+
readonly serverless: {
|
|
185
|
+
readonly type: "boolean";
|
|
186
|
+
readonly description: "True when no hosting server holds this DID. The caller must publish `newLogEntry` itself; until it does, resolvers still see the previous version.";
|
|
187
|
+
};
|
|
188
|
+
readonly newLogEntry: {
|
|
189
|
+
readonly type: "string";
|
|
190
|
+
readonly description: "The appended entry as JSON text. Present when `serverless` is true.";
|
|
191
|
+
};
|
|
192
|
+
readonly ext: {
|
|
193
|
+
readonly $ref: "#/$defs/Ext";
|
|
194
|
+
};
|
|
195
|
+
};
|
|
196
|
+
};
|
|
197
|
+
readonly Ext: {
|
|
198
|
+
readonly title: "Ext";
|
|
199
|
+
readonly description: "Vendor-namespaced extension object per SPEC.md §4.5.1. Each immediate key MUST be a reverse-DNS namespace; structure under each namespace is opaque to the framework.";
|
|
200
|
+
readonly type: "object";
|
|
201
|
+
readonly minProperties: 1;
|
|
202
|
+
readonly additionalProperties: true;
|
|
203
|
+
readonly propertyNames: {
|
|
204
|
+
readonly pattern: "^[a-z][a-z0-9-]*(\\.[a-z0-9-]+)+$";
|
|
205
|
+
};
|
|
206
|
+
};
|
|
207
|
+
readonly KeyRoleApprovalState: {
|
|
208
|
+
readonly title: "KeyRoleApprovalState";
|
|
209
|
+
readonly type: "object";
|
|
210
|
+
readonly additionalProperties: false;
|
|
211
|
+
readonly required: readonly ["required", "received", "expiresAt"];
|
|
212
|
+
readonly description: "Approval progress of a change the VTA's policy gates on more than one approval (CONVENTIONS.md §3.3).";
|
|
213
|
+
readonly properties: {
|
|
214
|
+
readonly required: {
|
|
215
|
+
readonly type: "integer";
|
|
216
|
+
readonly minimum: 1;
|
|
217
|
+
readonly description: "Distinct approvals the VTA's policy requires.";
|
|
218
|
+
};
|
|
219
|
+
readonly received: {
|
|
220
|
+
readonly type: "integer";
|
|
221
|
+
readonly minimum: 0;
|
|
222
|
+
readonly description: "Distinct approvals recorded so far, including the initiator's own.";
|
|
223
|
+
};
|
|
224
|
+
readonly approvers: {
|
|
225
|
+
readonly type: "array";
|
|
226
|
+
readonly items: {
|
|
227
|
+
readonly type: "string";
|
|
228
|
+
};
|
|
229
|
+
readonly uniqueItems: true;
|
|
230
|
+
readonly description: "VIDs whose approvals were recorded. Custody projection only; omitted from a response to anyone who is not themselves an eligible approver of this change.";
|
|
231
|
+
};
|
|
232
|
+
readonly expiresAt: {
|
|
233
|
+
readonly type: "string";
|
|
234
|
+
readonly format: "date-time";
|
|
235
|
+
readonly description: "When the preview, and every approval bound to it, stops being usable.";
|
|
236
|
+
};
|
|
237
|
+
};
|
|
238
|
+
};
|
|
239
|
+
readonly RotationRecord: {
|
|
240
|
+
readonly title: "RotationRecord";
|
|
241
|
+
readonly type: "object";
|
|
242
|
+
readonly additionalProperties: false;
|
|
243
|
+
readonly required: readonly ["rotationId", "role", "kind", "state"];
|
|
244
|
+
readonly description: "One change to a role's key set, from preview to completion. The rotation history of a DID is the list of these; the log is the authority for what was published, and this record adds what the log cannot say — which change was which, and (custody projection only) who asked, who approved, and why.";
|
|
245
|
+
readonly properties: {
|
|
246
|
+
readonly rotationId: {
|
|
247
|
+
readonly type: "string";
|
|
248
|
+
readonly minLength: 1;
|
|
249
|
+
};
|
|
250
|
+
readonly role: {
|
|
251
|
+
readonly $ref: "#/$defs/KeyRole";
|
|
252
|
+
};
|
|
253
|
+
readonly kind: {
|
|
254
|
+
readonly $ref: "#/$defs/RotationKind";
|
|
255
|
+
};
|
|
256
|
+
readonly state: {
|
|
257
|
+
readonly $ref: "#/$defs/RotationState";
|
|
258
|
+
};
|
|
259
|
+
readonly predecessors: {
|
|
260
|
+
readonly type: "array";
|
|
261
|
+
readonly items: {
|
|
262
|
+
readonly type: "string";
|
|
263
|
+
};
|
|
264
|
+
readonly description: "Verification-method identifiers (or, for `update`, public keys) leaving the role.";
|
|
265
|
+
};
|
|
266
|
+
readonly successors: {
|
|
267
|
+
readonly type: "array";
|
|
268
|
+
readonly items: {
|
|
269
|
+
readonly type: "string";
|
|
270
|
+
};
|
|
271
|
+
readonly description: "Verification-method identifiers (or, for `update`, public keys) entering the role.";
|
|
272
|
+
};
|
|
273
|
+
readonly startedInVersionId: {
|
|
274
|
+
readonly type: "string";
|
|
275
|
+
};
|
|
276
|
+
readonly endedInVersionId: {
|
|
277
|
+
readonly type: "string";
|
|
278
|
+
};
|
|
279
|
+
readonly startedAt: {
|
|
280
|
+
readonly type: "string";
|
|
281
|
+
readonly format: "date-time";
|
|
282
|
+
};
|
|
283
|
+
readonly overlapUntil: {
|
|
284
|
+
readonly type: "string";
|
|
285
|
+
readonly format: "date-time";
|
|
286
|
+
readonly description: "Custody projection only. End of the overlap window.";
|
|
287
|
+
};
|
|
288
|
+
readonly autoRetire: {
|
|
289
|
+
readonly type: "boolean";
|
|
290
|
+
readonly description: "Custody projection only. Whether the VTA retires the predecessor itself at `overlapUntil`.";
|
|
291
|
+
};
|
|
292
|
+
readonly endedAt: {
|
|
293
|
+
readonly type: "string";
|
|
294
|
+
readonly format: "date-time";
|
|
295
|
+
};
|
|
296
|
+
readonly initiatedBy: {
|
|
297
|
+
readonly type: "string";
|
|
298
|
+
readonly description: "Custody projection only. VID of the administrator whose signed request started the change.";
|
|
299
|
+
};
|
|
300
|
+
readonly approvals: {
|
|
301
|
+
readonly $ref: "#/$defs/KeyRoleApprovalState";
|
|
302
|
+
readonly description: "Custody projection only.";
|
|
303
|
+
};
|
|
304
|
+
readonly reason: {
|
|
305
|
+
readonly type: "string";
|
|
306
|
+
readonly maxLength: 1024;
|
|
307
|
+
readonly description: "Custody projection only. The operator's stated reason. Never published.";
|
|
308
|
+
};
|
|
309
|
+
readonly ext: {
|
|
310
|
+
readonly $ref: "#/$defs/Ext";
|
|
311
|
+
};
|
|
312
|
+
readonly activatesAt: {
|
|
313
|
+
readonly type: "string";
|
|
314
|
+
readonly format: "date-time";
|
|
315
|
+
readonly description: "When the successor becomes `active` and the predecessor `retiring`; never before `cacheHorizonAt`.";
|
|
316
|
+
};
|
|
317
|
+
readonly cacheHorizonAt: {
|
|
318
|
+
readonly type: "string";
|
|
319
|
+
readonly format: "date-time";
|
|
320
|
+
readonly description: "Planned rotations: the publishing entry's cache horizon — publication plus the longer of the document's TTL and the verifier cache cap (CONVENTIONS.md §11.1). The switch, and any retirement of the predecessor, happen no earlier. Public: it follows from the log and the published cap.";
|
|
321
|
+
};
|
|
322
|
+
};
|
|
323
|
+
};
|
|
324
|
+
readonly RotationState: {
|
|
325
|
+
readonly title: "RotationState";
|
|
326
|
+
readonly type: "string";
|
|
327
|
+
readonly enum: readonly ["pendingApproval", "staged", "overlapping", "completed", "aborted", "expired"];
|
|
328
|
+
readonly description: "`pendingApproval` — awaiting the approvals the VTA's policy requires; nothing is published. `staged` — successor published, not yet used; predecessor still active. `overlapping` — successor active, predecessor `retiring`. `completed` — every predecessor retired (or, for `compromise` and `addition`, the entry is published and any overlap it began has ended). `aborted` — the successor was retired instead of the predecessor, which stayed or returned to `active`. `expired` — approvals were not gathered before the preview expired; nothing was published.";
|
|
329
|
+
};
|
|
330
|
+
readonly RotationKind: {
|
|
331
|
+
readonly title: "RotationKind";
|
|
332
|
+
readonly type: "string";
|
|
333
|
+
readonly enum: readonly ["planned", "compromise", "addition"];
|
|
334
|
+
readonly description: "`planned` — a successor was staged, activated, and the predecessor retired on the operator's schedule. `compromise` — a key was revoked and, where the role would otherwise be empty, replaced in the same log entry. `addition` — a key was added to a role without anything leaving it (for example a post-quantum key alongside a classical one).";
|
|
335
|
+
};
|
|
336
|
+
readonly KeyRole: {
|
|
337
|
+
readonly title: "KeyRole";
|
|
338
|
+
readonly type: "string";
|
|
339
|
+
readonly enum: readonly ["attestation", "operational", "messaging", "update"];
|
|
340
|
+
readonly description: "The named key role a key occupies in the DID (VTI-KEY-070 onward). `attestation` — the only keys in `assertionMethod`; sign the DID's attestation artefacts (membership and role credentials, endorsements, status lists, every other credential the node issues), through the VTA's signing service and nowhere else. Generated inside the VTA, never derived, never exportable, never in a backup. `operational` — the only keys in `authentication`; sign the node's own traffic (Trust Task requests and responses, DIDComm and TSP message signatures, invitations, notices, audit checkpoints) with proof purpose `authentication`. `messaging` — the only keys in `keyAgreement`; sign nothing. `update` — the keys that authorize appending to the DID's log (a did:webvh `updateKeys` entry) and the pre-rotation commitments that authorize the next ones; never a verification method, never in `keyRoles`. Generated inside the VTA, never derived, never exportable, never in a backup. No role permits `capabilityInvocation` or `capabilityDelegation` (VTI-KEY-075); both are reserved for a future role. The mapping is normative and is set out in CONVENTIONS.md §1. The set is an extensible registry and growing it is a MINOR change: a consumer that receives a role it does not implement MUST refuse the document rather than map the key onto a role it does know.";
|
|
341
|
+
};
|
|
342
|
+
readonly RoleKey: {
|
|
343
|
+
readonly title: "RoleKey";
|
|
344
|
+
readonly type: "object";
|
|
345
|
+
readonly additionalProperties: false;
|
|
346
|
+
readonly required: readonly ["role", "keyType", "publicKeyMultibase", "state"];
|
|
347
|
+
readonly description: "One key in one role. A key is in exactly one role for its whole life; a change of role is a retirement from one and an addition to another, under a new verification-method identifier.";
|
|
348
|
+
readonly properties: {
|
|
349
|
+
readonly verificationMethod: {
|
|
350
|
+
readonly type: "string";
|
|
351
|
+
readonly minLength: 1;
|
|
352
|
+
readonly description: "The full verification-method identifier (`did#fragment`) the document publishes the key under, and lists in `keyRoles`. Absent only for `update` keys, which are published as log parameters and never as verification methods (VTI-KEY-093). A VTA minting a new method SHOULD derive its fragment from the key (VTI-KEY-150).";
|
|
353
|
+
};
|
|
354
|
+
readonly role: {
|
|
355
|
+
readonly $ref: "#/$defs/KeyRole";
|
|
356
|
+
};
|
|
357
|
+
readonly relationships: {
|
|
358
|
+
readonly type: "array";
|
|
359
|
+
readonly items: {
|
|
360
|
+
readonly $ref: "#/$defs/DidVerificationRelationship";
|
|
361
|
+
};
|
|
362
|
+
readonly uniqueItems: true;
|
|
363
|
+
readonly description: "The relationships the key is (or, while `pending`, will be) listed in. Always exactly its role's single relationship (CONVENTIONS.md §1) — carried so a caller can check it against the document rather than trusting it. Empty for `update`, `retired` and `revoked` keys.";
|
|
364
|
+
};
|
|
365
|
+
readonly keyType: {
|
|
366
|
+
readonly $ref: "#/$defs/KeyType";
|
|
367
|
+
};
|
|
368
|
+
readonly publicKeyMultibase: {
|
|
369
|
+
readonly type: "string";
|
|
370
|
+
readonly minLength: 1;
|
|
371
|
+
readonly description: "The public half, multibase-encoded, exactly as published.";
|
|
372
|
+
};
|
|
373
|
+
readonly state: {
|
|
374
|
+
readonly $ref: "#/$defs/RoleKeyState";
|
|
375
|
+
};
|
|
376
|
+
readonly publishedInVersionId: {
|
|
377
|
+
readonly type: "string";
|
|
378
|
+
readonly description: "versionId of the log entry that first published the key. Absent while `pending`.";
|
|
379
|
+
};
|
|
380
|
+
readonly removedInVersionId: {
|
|
381
|
+
readonly type: "string";
|
|
382
|
+
readonly description: "versionId of the log entry that retired or revoked the key.";
|
|
383
|
+
};
|
|
384
|
+
readonly retireAfter: {
|
|
385
|
+
readonly type: "string";
|
|
386
|
+
readonly format: "date-time";
|
|
387
|
+
readonly description: "For a `retiring` key: the end of its overlap window. Custody projection only.";
|
|
388
|
+
};
|
|
389
|
+
readonly compromisedSince: {
|
|
390
|
+
readonly type: "string";
|
|
391
|
+
readonly format: "date-time";
|
|
392
|
+
readonly description: "For a `revoked` key: the compromise time (VTI-KEY-121) — the earliest instant from which the key is treated as compromised. Where the operator cannot establish it, the time the key was first published. Published, because it is what a verifier needs.";
|
|
393
|
+
};
|
|
394
|
+
readonly rotationId: {
|
|
395
|
+
readonly type: "string";
|
|
396
|
+
readonly description: "The rotation this key was introduced or retired by, when it was.";
|
|
397
|
+
};
|
|
398
|
+
readonly label: {
|
|
399
|
+
readonly type: "string";
|
|
400
|
+
readonly maxLength: 256;
|
|
401
|
+
readonly description: "Operator-facing label. Custody projection only.";
|
|
402
|
+
};
|
|
403
|
+
readonly custody: {
|
|
404
|
+
readonly $ref: "#/$defs/RoleKeyCustody";
|
|
405
|
+
};
|
|
406
|
+
readonly ext: {
|
|
407
|
+
readonly $ref: "#/$defs/Ext";
|
|
408
|
+
};
|
|
409
|
+
readonly activatesAt: {
|
|
410
|
+
readonly type: "string";
|
|
411
|
+
readonly format: "date-time";
|
|
412
|
+
readonly description: "For a `staged` key: when the VTA will begin using it — no earlier than the publishing entry's cache horizon (CONVENTIONS.md §11.1).";
|
|
413
|
+
};
|
|
414
|
+
};
|
|
415
|
+
};
|
|
416
|
+
readonly RoleKeyCustody: {
|
|
417
|
+
readonly title: "RoleKeyCustody";
|
|
418
|
+
readonly type: "object";
|
|
419
|
+
readonly additionalProperties: false;
|
|
420
|
+
readonly required: readonly ["keyId", "exportable", "neverExportable", "inBackups"];
|
|
421
|
+
readonly description: "How the VTA holds a key. Present only in the custody projection. Carries no key material, and a conforming VTA MUST NOT place any in `ext`.";
|
|
422
|
+
readonly properties: {
|
|
423
|
+
readonly keyId: {
|
|
424
|
+
readonly type: "string";
|
|
425
|
+
readonly minLength: 1;
|
|
426
|
+
readonly description: "The custodian record identifier (`keys/*`'s `keyId`) behind this key.";
|
|
427
|
+
};
|
|
428
|
+
readonly origin: {
|
|
429
|
+
readonly $ref: "#/$defs/KeyOrigin";
|
|
430
|
+
};
|
|
431
|
+
readonly exportable: {
|
|
432
|
+
readonly type: "boolean";
|
|
433
|
+
readonly description: "Whether the custodian would release the private half through `keys/export-secret`. Always `false` for `attestation` and `update` keys (CONVENTIONS.md §4). Stated explicitly — never absent — because this is the member an operator reads to confirm a role key cannot leave the VTA, and `keys/*`'s absent-means-exportable reading is the wrong default to leave them to infer.";
|
|
434
|
+
};
|
|
435
|
+
readonly neverExportable: {
|
|
436
|
+
readonly type: "boolean";
|
|
437
|
+
readonly description: "True when no authority can make the key exportable — the role forbids it, or the material exists only inside a module that cannot release it. `true` implies `exportable: false`.";
|
|
438
|
+
};
|
|
439
|
+
readonly hardwareBacked: {
|
|
440
|
+
readonly type: "boolean";
|
|
441
|
+
readonly description: "True when the private half is held by a hardware or enclave module that performs the operation without releasing it. Absent means the VTA does not say, not that it is false.";
|
|
442
|
+
};
|
|
443
|
+
readonly inBackups: {
|
|
444
|
+
readonly type: "boolean";
|
|
445
|
+
readonly description: "Whether the key, or material it can be re-derived from, is included in the VTA's backups or any state transfer. Always `false` for `attestation` and `update` keys (VTI-KEY-112): they are generated, not derived, so there is no seed that recovers them, and their loss is recovered by rotation, never by restore.";
|
|
446
|
+
};
|
|
447
|
+
readonly destroyed: {
|
|
448
|
+
readonly type: "boolean";
|
|
449
|
+
readonly description: "True once the private half has been destroyed — a retired `attestation` key (VTI-KEY-125). The record survives so the key's past signatures stay attributable.";
|
|
450
|
+
};
|
|
451
|
+
};
|
|
452
|
+
};
|
|
453
|
+
readonly KeyOrigin: {
|
|
454
|
+
readonly title: "KeyOrigin";
|
|
455
|
+
readonly type: "string";
|
|
456
|
+
readonly enum: readonly ["derived", "imported", "internal"];
|
|
457
|
+
readonly description: "Where the private key came from. `derived` means the maintainer generated it from a seed it holds and can reproduce it from `derivationPath`; `imported` means it arrived from outside and exists only as stored material; `internal` means the maintainer generated it from a CSPRNG and it is reproducible from nothing at all. The distinction is operationally load-bearing: a `derived` key survives a seed restore, an `imported` one is lost unless it was backed up separately, and an `internal` one cannot be recovered by any means once the maintainer's storage is gone. This member is also the only way a consumer can confirm that a `keys/create` request for an `internal` key was honoured rather than silently downgraded to a derived one — see that specification's `internal` member.";
|
|
458
|
+
readonly default: "derived";
|
|
459
|
+
};
|
|
460
|
+
readonly RoleKeyState: {
|
|
461
|
+
readonly title: "RoleKeyState";
|
|
462
|
+
readonly type: "string";
|
|
463
|
+
readonly enum: readonly ["pending", "staged", "active", "retiring", "retired", "revoked"];
|
|
464
|
+
readonly description: "Where a key is in its role's lifecycle. `pending` — planned by a preview or a change awaiting approval; not published; custody projection only. `staged` — published and bound to its role, but not yet used: a planned rotation publishes the successor and waits until the entry's cache horizon — publication plus the longer of the document's TTL and the verifier cache cap (CONVENTIONS.md §11.1) — before the VTA first uses it, so that no verifier holding a cached document sees a signature by a key it has never seen (VTI-KEY-122). Becomes `active` at the rotation's `activatesAt`. `active` — the key the VTA uses for new signatures (or, for `messaging`, advertises for new sessions). `retiring` — still published so that what it signed and sessions keyed to it keep working, but never used again: from the successor's first use the VTA MUST NOT sign with it, while a retiring `messaging` key stays usable for decryption, and senders may still encrypt to it, until it is retired (CONVENTIONS.md §11.3). `retired` — removed by planned rotation; what it signed while published remains valid, judged against the DID version current at issuance (CONVENTIONS.md §7). A retired `attestation` or `messaging` key is destroyed at retirement. `revoked` — removed from every relationship and from `keyRoles` in one entry, without overlap, because it is or may be compromised; what it signed from `compromisedSince` onward establishes nothing. `retired` and `revoked` are terminal.";
|
|
465
|
+
};
|
|
466
|
+
readonly DidVerificationRelationship: {
|
|
467
|
+
readonly title: "DidVerificationRelationship";
|
|
468
|
+
readonly type: "string";
|
|
469
|
+
readonly enum: readonly ["authentication", "assertionMethod", "keyAgreement", "capabilityInvocation", "capabilityDelegation"];
|
|
470
|
+
readonly description: "A DID Core verification relationship.";
|
|
471
|
+
};
|
|
472
|
+
readonly KeyType: {
|
|
473
|
+
readonly title: "KeyType";
|
|
474
|
+
readonly type: "string";
|
|
475
|
+
readonly enum: readonly ["ed25519", "x25519", "p256", "mldsa44", "mldsa65"];
|
|
476
|
+
readonly description: "Cryptographic algorithm the key material belongs to. `ed25519` signs (EdDSA), `x25519` performs key agreement and never signs, `p256` signs (ES256), and `mldsa44` and `mldsa65` sign with the post-quantum ML-DSA scheme of US NIST FIPS 204. The set is expected to grow as algorithms are standardised, and growing it is a MINOR change under SPEC.md §5.2: `keyType` selects no schema branch, so adding a value relaxes a constraint rather than narrowing one, and the generated libraries mark this enumeration non-exhaustive so that a consumer absorbs a new value rather than failing to compile. Two ML-DSA parameter sets are carried because two specifications require different ones — W3C Quantum-Resistant Cryptosuites defines Data Integrity suites only for ML-DSA-44, while Trust Spanning Protocol Rev 3 §8.1 mandates ML-DSA-65 — so the parameter set is chosen by whatever consumes the key and the two are not redundant. A consumer that does not implement a value it receives MUST refuse the document rather than substitute one it does support.";
|
|
477
|
+
};
|
|
478
|
+
readonly DidDocumentPreview: {
|
|
479
|
+
readonly title: "DidDocumentPreview";
|
|
480
|
+
readonly type: "object";
|
|
481
|
+
readonly additionalProperties: false;
|
|
482
|
+
readonly required: readonly ["previewId", "baseVersionId", "expiresAt", "changes", "document", "updateKeyRotates"];
|
|
483
|
+
readonly description: "What a change would publish, computed by the VTA by running the handler it would run to apply it, and nothing else (CONVENTIONS.md §3.1). This is what a consent surface renders and what an approval is bound to.";
|
|
484
|
+
readonly properties: {
|
|
485
|
+
readonly previewId: {
|
|
486
|
+
readonly type: "string";
|
|
487
|
+
readonly minLength: 16;
|
|
488
|
+
readonly description: "Opaque, unguessable identifier for this exact plan. Carried back by the apply request, and the thing every approval is bound to.";
|
|
489
|
+
};
|
|
490
|
+
readonly baseVersionId: {
|
|
491
|
+
readonly type: "string";
|
|
492
|
+
readonly description: "versionId of the log entry the plan was computed against. The plan is void once the log moves past it.";
|
|
493
|
+
};
|
|
494
|
+
readonly expiresAt: {
|
|
495
|
+
readonly type: "string";
|
|
496
|
+
readonly format: "date-time";
|
|
497
|
+
};
|
|
498
|
+
readonly changes: {
|
|
499
|
+
readonly type: "array";
|
|
500
|
+
readonly items: {
|
|
501
|
+
readonly $ref: "#/$defs/DidDocumentChange";
|
|
502
|
+
};
|
|
503
|
+
readonly description: "Every change the entry would make, including the ones the caller did not ask for — in particular `rotateUpdateKey`, which accompanies every entry appended under pre-rotation.";
|
|
504
|
+
};
|
|
505
|
+
readonly document: {
|
|
506
|
+
readonly type: "object";
|
|
507
|
+
readonly description: "The complete DID document the entry would publish. Public data by construction; no key material beyond public halves.";
|
|
508
|
+
};
|
|
509
|
+
readonly warnings: {
|
|
510
|
+
readonly type: "array";
|
|
511
|
+
readonly items: {
|
|
512
|
+
readonly type: "string";
|
|
513
|
+
readonly enum: readonly ["preRotationDisabled", "singleKeyRole", "algorithmNotInAcceptedSet", "roleWillHaveNoClassicalKey", "attestationReissuanceRequired", "serverless"];
|
|
514
|
+
};
|
|
515
|
+
readonly uniqueItems: true;
|
|
516
|
+
readonly description: "Conditions a human should be shown before approving. `preRotationDisabled` — the entry leaves no committed successor, so a later update-key compromise can only end in deactivation. `singleKeyRole` — the role will hold one active key, so its next compromise empties it until replaced. `algorithmNotInAcceptedSet` — a verifier population the VTA knows of does not accept the new key's algorithm. `roleWillHaveNoClassicalKey` — every remaining key is post-quantum, which verifiers without post-quantum support cannot check. `attestationReissuanceRequired` — revoking this `attestation` key obliges the node to re-issue every attestation artefact still in force and re-sign every status list (VTI-KEY-133). `serverless` — the VTA will not publish the entry; the operator must.";
|
|
517
|
+
};
|
|
518
|
+
readonly updateKeyRotates: {
|
|
519
|
+
readonly type: "boolean";
|
|
520
|
+
readonly description: "True when appending this entry also moves the DID's update key to a committed successor. Stated as its own member, not left to be found in `changes`, because it is the consequence a reviewer most often misses.";
|
|
521
|
+
};
|
|
522
|
+
};
|
|
523
|
+
};
|
|
524
|
+
readonly DidDocumentChange: {
|
|
525
|
+
readonly title: "DidDocumentChange";
|
|
526
|
+
readonly type: "object";
|
|
527
|
+
readonly additionalProperties: false;
|
|
528
|
+
readonly required: readonly ["op", "role"];
|
|
529
|
+
readonly properties: {
|
|
530
|
+
readonly op: {
|
|
531
|
+
readonly type: "string";
|
|
532
|
+
readonly enum: readonly ["addKey", "retireKey", "revokeKey", "rotateUpdateKey", "setPreRotation"];
|
|
533
|
+
readonly description: "`addKey` — a verification method is added, listed in its role's relationship and in `keyRoles`. `retireKey` — a verification method leaves its relationship, `keyRoles` and the document. `revokeKey` — a verification method leaves its relationship and `keyRoles`, and the compromise is recorded (CONVENTIONS.md §7). `rotateUpdateKey` — the log's update key moves to a committed successor. `setPreRotation` — the number of successors committed changes.";
|
|
534
|
+
};
|
|
535
|
+
readonly role: {
|
|
536
|
+
readonly $ref: "#/$defs/KeyRole";
|
|
537
|
+
};
|
|
538
|
+
readonly verificationMethod: {
|
|
539
|
+
readonly type: "string";
|
|
540
|
+
};
|
|
541
|
+
readonly keyType: {
|
|
542
|
+
readonly $ref: "#/$defs/KeyType";
|
|
543
|
+
};
|
|
544
|
+
readonly publicKeyMultibase: {
|
|
545
|
+
readonly type: "string";
|
|
546
|
+
};
|
|
547
|
+
readonly relationships: {
|
|
548
|
+
readonly type: "array";
|
|
549
|
+
readonly items: {
|
|
550
|
+
readonly $ref: "#/$defs/DidVerificationRelationship";
|
|
551
|
+
};
|
|
552
|
+
readonly uniqueItems: true;
|
|
553
|
+
};
|
|
554
|
+
readonly preRotationCount: {
|
|
555
|
+
readonly type: "integer";
|
|
556
|
+
readonly minimum: 0;
|
|
557
|
+
};
|
|
558
|
+
};
|
|
559
|
+
};
|
|
560
|
+
readonly KeyRoleChangeOutcome: {
|
|
561
|
+
readonly title: "KeyRoleChangeOutcome";
|
|
562
|
+
readonly type: "string";
|
|
563
|
+
readonly enum: readonly ["preview", "applied", "pendingApproval"];
|
|
564
|
+
readonly description: "`preview` — nothing was written; the response carries the plan. `applied` — the entry was appended (and published, unless `serverless`). `pendingApproval` — the plan is recorded and awaits further approvals; nothing is published until they arrive (CONVENTIONS.md §3.3).";
|
|
565
|
+
};
|
|
566
|
+
};
|
|
567
|
+
};
|
|
568
|
+
/** As {@link PAYLOAD_SCHEMA}, for the success-response variant. */
|
|
569
|
+
export declare const RESPONSE_PAYLOAD_SCHEMA: {
|
|
570
|
+
readonly $schema: "https://json-schema.org/draft/2020-12/schema";
|
|
571
|
+
readonly $ref: "#/$defs/Response";
|
|
572
|
+
readonly $defs: {
|
|
573
|
+
readonly Response: {
|
|
574
|
+
readonly $anchor: "response";
|
|
575
|
+
readonly title: "VTA WebVH DIDs Keys Add — response payload";
|
|
576
|
+
readonly description: "Success response. Type https://trusttasks.org/spec/vta/webvh/dids/keys/add/1.0#response. A refusal is a `trust-task-error` document, never this.";
|
|
577
|
+
readonly type: "object";
|
|
578
|
+
readonly additionalProperties: false;
|
|
579
|
+
readonly required: readonly ["did", "outcome", "keys"];
|
|
580
|
+
readonly properties: {
|
|
581
|
+
readonly did: {
|
|
582
|
+
readonly type: "string";
|
|
583
|
+
};
|
|
584
|
+
readonly outcome: {
|
|
585
|
+
readonly $ref: "#/$defs/KeyRoleChangeOutcome";
|
|
586
|
+
};
|
|
587
|
+
readonly preview: {
|
|
588
|
+
readonly $ref: "#/$defs/DidDocumentPreview";
|
|
589
|
+
readonly description: "Present when `outcome` is `preview` or `pendingApproval`: the plan, and what an approval is bound to.";
|
|
590
|
+
};
|
|
591
|
+
readonly newVersionId: {
|
|
592
|
+
readonly type: "string";
|
|
593
|
+
readonly description: "Present when `outcome` is `applied`: the versionId of the appended entry. Pass it as the next change's `expectedVersionId`.";
|
|
594
|
+
};
|
|
595
|
+
readonly keys: {
|
|
596
|
+
readonly type: "array";
|
|
597
|
+
readonly items: {
|
|
598
|
+
readonly $ref: "#/$defs/RoleKey";
|
|
599
|
+
};
|
|
600
|
+
readonly description: "Every key whose state this change sets or would set, after the change.";
|
|
601
|
+
};
|
|
602
|
+
readonly rotation: {
|
|
603
|
+
readonly $ref: "#/$defs/RotationRecord";
|
|
604
|
+
};
|
|
605
|
+
readonly approvals: {
|
|
606
|
+
readonly $ref: "#/$defs/KeyRoleApprovalState";
|
|
607
|
+
readonly description: "Present when `outcome` is `pendingApproval`.";
|
|
608
|
+
};
|
|
609
|
+
readonly serverless: {
|
|
610
|
+
readonly type: "boolean";
|
|
611
|
+
readonly description: "True when no hosting server holds this DID. The caller must publish `newLogEntry` itself; until it does, resolvers still see the previous version.";
|
|
612
|
+
};
|
|
613
|
+
readonly newLogEntry: {
|
|
614
|
+
readonly type: "string";
|
|
615
|
+
readonly description: "The appended entry as JSON text. Present when `serverless` is true.";
|
|
616
|
+
};
|
|
617
|
+
readonly ext: {
|
|
618
|
+
readonly $ref: "#/$defs/Ext";
|
|
619
|
+
};
|
|
620
|
+
};
|
|
621
|
+
};
|
|
622
|
+
readonly Ext: {
|
|
623
|
+
readonly title: "Ext";
|
|
624
|
+
readonly description: "Vendor-namespaced extension object per SPEC.md §4.5.1. Each immediate key MUST be a reverse-DNS namespace; structure under each namespace is opaque to the framework.";
|
|
625
|
+
readonly type: "object";
|
|
626
|
+
readonly minProperties: 1;
|
|
627
|
+
readonly additionalProperties: true;
|
|
628
|
+
readonly propertyNames: {
|
|
629
|
+
readonly pattern: "^[a-z][a-z0-9-]*(\\.[a-z0-9-]+)+$";
|
|
630
|
+
};
|
|
631
|
+
};
|
|
632
|
+
readonly KeyRoleApprovalState: {
|
|
633
|
+
readonly title: "KeyRoleApprovalState";
|
|
634
|
+
readonly type: "object";
|
|
635
|
+
readonly additionalProperties: false;
|
|
636
|
+
readonly required: readonly ["required", "received", "expiresAt"];
|
|
637
|
+
readonly description: "Approval progress of a change the VTA's policy gates on more than one approval (CONVENTIONS.md §3.3).";
|
|
638
|
+
readonly properties: {
|
|
639
|
+
readonly required: {
|
|
640
|
+
readonly type: "integer";
|
|
641
|
+
readonly minimum: 1;
|
|
642
|
+
readonly description: "Distinct approvals the VTA's policy requires.";
|
|
643
|
+
};
|
|
644
|
+
readonly received: {
|
|
645
|
+
readonly type: "integer";
|
|
646
|
+
readonly minimum: 0;
|
|
647
|
+
readonly description: "Distinct approvals recorded so far, including the initiator's own.";
|
|
648
|
+
};
|
|
649
|
+
readonly approvers: {
|
|
650
|
+
readonly type: "array";
|
|
651
|
+
readonly items: {
|
|
652
|
+
readonly type: "string";
|
|
653
|
+
};
|
|
654
|
+
readonly uniqueItems: true;
|
|
655
|
+
readonly description: "VIDs whose approvals were recorded. Custody projection only; omitted from a response to anyone who is not themselves an eligible approver of this change.";
|
|
656
|
+
};
|
|
657
|
+
readonly expiresAt: {
|
|
658
|
+
readonly type: "string";
|
|
659
|
+
readonly format: "date-time";
|
|
660
|
+
readonly description: "When the preview, and every approval bound to it, stops being usable.";
|
|
661
|
+
};
|
|
662
|
+
};
|
|
663
|
+
};
|
|
664
|
+
readonly RotationRecord: {
|
|
665
|
+
readonly title: "RotationRecord";
|
|
666
|
+
readonly type: "object";
|
|
667
|
+
readonly additionalProperties: false;
|
|
668
|
+
readonly required: readonly ["rotationId", "role", "kind", "state"];
|
|
669
|
+
readonly description: "One change to a role's key set, from preview to completion. The rotation history of a DID is the list of these; the log is the authority for what was published, and this record adds what the log cannot say — which change was which, and (custody projection only) who asked, who approved, and why.";
|
|
670
|
+
readonly properties: {
|
|
671
|
+
readonly rotationId: {
|
|
672
|
+
readonly type: "string";
|
|
673
|
+
readonly minLength: 1;
|
|
674
|
+
};
|
|
675
|
+
readonly role: {
|
|
676
|
+
readonly $ref: "#/$defs/KeyRole";
|
|
677
|
+
};
|
|
678
|
+
readonly kind: {
|
|
679
|
+
readonly $ref: "#/$defs/RotationKind";
|
|
680
|
+
};
|
|
681
|
+
readonly state: {
|
|
682
|
+
readonly $ref: "#/$defs/RotationState";
|
|
683
|
+
};
|
|
684
|
+
readonly predecessors: {
|
|
685
|
+
readonly type: "array";
|
|
686
|
+
readonly items: {
|
|
687
|
+
readonly type: "string";
|
|
688
|
+
};
|
|
689
|
+
readonly description: "Verification-method identifiers (or, for `update`, public keys) leaving the role.";
|
|
690
|
+
};
|
|
691
|
+
readonly successors: {
|
|
692
|
+
readonly type: "array";
|
|
693
|
+
readonly items: {
|
|
694
|
+
readonly type: "string";
|
|
695
|
+
};
|
|
696
|
+
readonly description: "Verification-method identifiers (or, for `update`, public keys) entering the role.";
|
|
697
|
+
};
|
|
698
|
+
readonly startedInVersionId: {
|
|
699
|
+
readonly type: "string";
|
|
700
|
+
};
|
|
701
|
+
readonly endedInVersionId: {
|
|
702
|
+
readonly type: "string";
|
|
703
|
+
};
|
|
704
|
+
readonly startedAt: {
|
|
705
|
+
readonly type: "string";
|
|
706
|
+
readonly format: "date-time";
|
|
707
|
+
};
|
|
708
|
+
readonly overlapUntil: {
|
|
709
|
+
readonly type: "string";
|
|
710
|
+
readonly format: "date-time";
|
|
711
|
+
readonly description: "Custody projection only. End of the overlap window.";
|
|
712
|
+
};
|
|
713
|
+
readonly autoRetire: {
|
|
714
|
+
readonly type: "boolean";
|
|
715
|
+
readonly description: "Custody projection only. Whether the VTA retires the predecessor itself at `overlapUntil`.";
|
|
716
|
+
};
|
|
717
|
+
readonly endedAt: {
|
|
718
|
+
readonly type: "string";
|
|
719
|
+
readonly format: "date-time";
|
|
720
|
+
};
|
|
721
|
+
readonly initiatedBy: {
|
|
722
|
+
readonly type: "string";
|
|
723
|
+
readonly description: "Custody projection only. VID of the administrator whose signed request started the change.";
|
|
724
|
+
};
|
|
725
|
+
readonly approvals: {
|
|
726
|
+
readonly $ref: "#/$defs/KeyRoleApprovalState";
|
|
727
|
+
readonly description: "Custody projection only.";
|
|
728
|
+
};
|
|
729
|
+
readonly reason: {
|
|
730
|
+
readonly type: "string";
|
|
731
|
+
readonly maxLength: 1024;
|
|
732
|
+
readonly description: "Custody projection only. The operator's stated reason. Never published.";
|
|
733
|
+
};
|
|
734
|
+
readonly ext: {
|
|
735
|
+
readonly $ref: "#/$defs/Ext";
|
|
736
|
+
};
|
|
737
|
+
readonly activatesAt: {
|
|
738
|
+
readonly type: "string";
|
|
739
|
+
readonly format: "date-time";
|
|
740
|
+
readonly description: "When the successor becomes `active` and the predecessor `retiring`; never before `cacheHorizonAt`.";
|
|
741
|
+
};
|
|
742
|
+
readonly cacheHorizonAt: {
|
|
743
|
+
readonly type: "string";
|
|
744
|
+
readonly format: "date-time";
|
|
745
|
+
readonly description: "Planned rotations: the publishing entry's cache horizon — publication plus the longer of the document's TTL and the verifier cache cap (CONVENTIONS.md §11.1). The switch, and any retirement of the predecessor, happen no earlier. Public: it follows from the log and the published cap.";
|
|
746
|
+
};
|
|
747
|
+
};
|
|
748
|
+
};
|
|
749
|
+
readonly RotationState: {
|
|
750
|
+
readonly title: "RotationState";
|
|
751
|
+
readonly type: "string";
|
|
752
|
+
readonly enum: readonly ["pendingApproval", "staged", "overlapping", "completed", "aborted", "expired"];
|
|
753
|
+
readonly description: "`pendingApproval` — awaiting the approvals the VTA's policy requires; nothing is published. `staged` — successor published, not yet used; predecessor still active. `overlapping` — successor active, predecessor `retiring`. `completed` — every predecessor retired (or, for `compromise` and `addition`, the entry is published and any overlap it began has ended). `aborted` — the successor was retired instead of the predecessor, which stayed or returned to `active`. `expired` — approvals were not gathered before the preview expired; nothing was published.";
|
|
754
|
+
};
|
|
755
|
+
readonly RotationKind: {
|
|
756
|
+
readonly title: "RotationKind";
|
|
757
|
+
readonly type: "string";
|
|
758
|
+
readonly enum: readonly ["planned", "compromise", "addition"];
|
|
759
|
+
readonly description: "`planned` — a successor was staged, activated, and the predecessor retired on the operator's schedule. `compromise` — a key was revoked and, where the role would otherwise be empty, replaced in the same log entry. `addition` — a key was added to a role without anything leaving it (for example a post-quantum key alongside a classical one).";
|
|
760
|
+
};
|
|
761
|
+
readonly KeyRole: {
|
|
762
|
+
readonly title: "KeyRole";
|
|
763
|
+
readonly type: "string";
|
|
764
|
+
readonly enum: readonly ["attestation", "operational", "messaging", "update"];
|
|
765
|
+
readonly description: "The named key role a key occupies in the DID (VTI-KEY-070 onward). `attestation` — the only keys in `assertionMethod`; sign the DID's attestation artefacts (membership and role credentials, endorsements, status lists, every other credential the node issues), through the VTA's signing service and nowhere else. Generated inside the VTA, never derived, never exportable, never in a backup. `operational` — the only keys in `authentication`; sign the node's own traffic (Trust Task requests and responses, DIDComm and TSP message signatures, invitations, notices, audit checkpoints) with proof purpose `authentication`. `messaging` — the only keys in `keyAgreement`; sign nothing. `update` — the keys that authorize appending to the DID's log (a did:webvh `updateKeys` entry) and the pre-rotation commitments that authorize the next ones; never a verification method, never in `keyRoles`. Generated inside the VTA, never derived, never exportable, never in a backup. No role permits `capabilityInvocation` or `capabilityDelegation` (VTI-KEY-075); both are reserved for a future role. The mapping is normative and is set out in CONVENTIONS.md §1. The set is an extensible registry and growing it is a MINOR change: a consumer that receives a role it does not implement MUST refuse the document rather than map the key onto a role it does know.";
|
|
766
|
+
};
|
|
767
|
+
readonly RoleKey: {
|
|
768
|
+
readonly title: "RoleKey";
|
|
769
|
+
readonly type: "object";
|
|
770
|
+
readonly additionalProperties: false;
|
|
771
|
+
readonly required: readonly ["role", "keyType", "publicKeyMultibase", "state"];
|
|
772
|
+
readonly description: "One key in one role. A key is in exactly one role for its whole life; a change of role is a retirement from one and an addition to another, under a new verification-method identifier.";
|
|
773
|
+
readonly properties: {
|
|
774
|
+
readonly verificationMethod: {
|
|
775
|
+
readonly type: "string";
|
|
776
|
+
readonly minLength: 1;
|
|
777
|
+
readonly description: "The full verification-method identifier (`did#fragment`) the document publishes the key under, and lists in `keyRoles`. Absent only for `update` keys, which are published as log parameters and never as verification methods (VTI-KEY-093). A VTA minting a new method SHOULD derive its fragment from the key (VTI-KEY-150).";
|
|
778
|
+
};
|
|
779
|
+
readonly role: {
|
|
780
|
+
readonly $ref: "#/$defs/KeyRole";
|
|
781
|
+
};
|
|
782
|
+
readonly relationships: {
|
|
783
|
+
readonly type: "array";
|
|
784
|
+
readonly items: {
|
|
785
|
+
readonly $ref: "#/$defs/DidVerificationRelationship";
|
|
786
|
+
};
|
|
787
|
+
readonly uniqueItems: true;
|
|
788
|
+
readonly description: "The relationships the key is (or, while `pending`, will be) listed in. Always exactly its role's single relationship (CONVENTIONS.md §1) — carried so a caller can check it against the document rather than trusting it. Empty for `update`, `retired` and `revoked` keys.";
|
|
789
|
+
};
|
|
790
|
+
readonly keyType: {
|
|
791
|
+
readonly $ref: "#/$defs/KeyType";
|
|
792
|
+
};
|
|
793
|
+
readonly publicKeyMultibase: {
|
|
794
|
+
readonly type: "string";
|
|
795
|
+
readonly minLength: 1;
|
|
796
|
+
readonly description: "The public half, multibase-encoded, exactly as published.";
|
|
797
|
+
};
|
|
798
|
+
readonly state: {
|
|
799
|
+
readonly $ref: "#/$defs/RoleKeyState";
|
|
800
|
+
};
|
|
801
|
+
readonly publishedInVersionId: {
|
|
802
|
+
readonly type: "string";
|
|
803
|
+
readonly description: "versionId of the log entry that first published the key. Absent while `pending`.";
|
|
804
|
+
};
|
|
805
|
+
readonly removedInVersionId: {
|
|
806
|
+
readonly type: "string";
|
|
807
|
+
readonly description: "versionId of the log entry that retired or revoked the key.";
|
|
808
|
+
};
|
|
809
|
+
readonly retireAfter: {
|
|
810
|
+
readonly type: "string";
|
|
811
|
+
readonly format: "date-time";
|
|
812
|
+
readonly description: "For a `retiring` key: the end of its overlap window. Custody projection only.";
|
|
813
|
+
};
|
|
814
|
+
readonly compromisedSince: {
|
|
815
|
+
readonly type: "string";
|
|
816
|
+
readonly format: "date-time";
|
|
817
|
+
readonly description: "For a `revoked` key: the compromise time (VTI-KEY-121) — the earliest instant from which the key is treated as compromised. Where the operator cannot establish it, the time the key was first published. Published, because it is what a verifier needs.";
|
|
818
|
+
};
|
|
819
|
+
readonly rotationId: {
|
|
820
|
+
readonly type: "string";
|
|
821
|
+
readonly description: "The rotation this key was introduced or retired by, when it was.";
|
|
822
|
+
};
|
|
823
|
+
readonly label: {
|
|
824
|
+
readonly type: "string";
|
|
825
|
+
readonly maxLength: 256;
|
|
826
|
+
readonly description: "Operator-facing label. Custody projection only.";
|
|
827
|
+
};
|
|
828
|
+
readonly custody: {
|
|
829
|
+
readonly $ref: "#/$defs/RoleKeyCustody";
|
|
830
|
+
};
|
|
831
|
+
readonly ext: {
|
|
832
|
+
readonly $ref: "#/$defs/Ext";
|
|
833
|
+
};
|
|
834
|
+
readonly activatesAt: {
|
|
835
|
+
readonly type: "string";
|
|
836
|
+
readonly format: "date-time";
|
|
837
|
+
readonly description: "For a `staged` key: when the VTA will begin using it — no earlier than the publishing entry's cache horizon (CONVENTIONS.md §11.1).";
|
|
838
|
+
};
|
|
839
|
+
};
|
|
840
|
+
};
|
|
841
|
+
readonly RoleKeyCustody: {
|
|
842
|
+
readonly title: "RoleKeyCustody";
|
|
843
|
+
readonly type: "object";
|
|
844
|
+
readonly additionalProperties: false;
|
|
845
|
+
readonly required: readonly ["keyId", "exportable", "neverExportable", "inBackups"];
|
|
846
|
+
readonly description: "How the VTA holds a key. Present only in the custody projection. Carries no key material, and a conforming VTA MUST NOT place any in `ext`.";
|
|
847
|
+
readonly properties: {
|
|
848
|
+
readonly keyId: {
|
|
849
|
+
readonly type: "string";
|
|
850
|
+
readonly minLength: 1;
|
|
851
|
+
readonly description: "The custodian record identifier (`keys/*`'s `keyId`) behind this key.";
|
|
852
|
+
};
|
|
853
|
+
readonly origin: {
|
|
854
|
+
readonly $ref: "#/$defs/KeyOrigin";
|
|
855
|
+
};
|
|
856
|
+
readonly exportable: {
|
|
857
|
+
readonly type: "boolean";
|
|
858
|
+
readonly description: "Whether the custodian would release the private half through `keys/export-secret`. Always `false` for `attestation` and `update` keys (CONVENTIONS.md §4). Stated explicitly — never absent — because this is the member an operator reads to confirm a role key cannot leave the VTA, and `keys/*`'s absent-means-exportable reading is the wrong default to leave them to infer.";
|
|
859
|
+
};
|
|
860
|
+
readonly neverExportable: {
|
|
861
|
+
readonly type: "boolean";
|
|
862
|
+
readonly description: "True when no authority can make the key exportable — the role forbids it, or the material exists only inside a module that cannot release it. `true` implies `exportable: false`.";
|
|
863
|
+
};
|
|
864
|
+
readonly hardwareBacked: {
|
|
865
|
+
readonly type: "boolean";
|
|
866
|
+
readonly description: "True when the private half is held by a hardware or enclave module that performs the operation without releasing it. Absent means the VTA does not say, not that it is false.";
|
|
867
|
+
};
|
|
868
|
+
readonly inBackups: {
|
|
869
|
+
readonly type: "boolean";
|
|
870
|
+
readonly description: "Whether the key, or material it can be re-derived from, is included in the VTA's backups or any state transfer. Always `false` for `attestation` and `update` keys (VTI-KEY-112): they are generated, not derived, so there is no seed that recovers them, and their loss is recovered by rotation, never by restore.";
|
|
871
|
+
};
|
|
872
|
+
readonly destroyed: {
|
|
873
|
+
readonly type: "boolean";
|
|
874
|
+
readonly description: "True once the private half has been destroyed — a retired `attestation` key (VTI-KEY-125). The record survives so the key's past signatures stay attributable.";
|
|
875
|
+
};
|
|
876
|
+
};
|
|
877
|
+
};
|
|
878
|
+
readonly KeyOrigin: {
|
|
879
|
+
readonly title: "KeyOrigin";
|
|
880
|
+
readonly type: "string";
|
|
881
|
+
readonly enum: readonly ["derived", "imported", "internal"];
|
|
882
|
+
readonly description: "Where the private key came from. `derived` means the maintainer generated it from a seed it holds and can reproduce it from `derivationPath`; `imported` means it arrived from outside and exists only as stored material; `internal` means the maintainer generated it from a CSPRNG and it is reproducible from nothing at all. The distinction is operationally load-bearing: a `derived` key survives a seed restore, an `imported` one is lost unless it was backed up separately, and an `internal` one cannot be recovered by any means once the maintainer's storage is gone. This member is also the only way a consumer can confirm that a `keys/create` request for an `internal` key was honoured rather than silently downgraded to a derived one — see that specification's `internal` member.";
|
|
883
|
+
readonly default: "derived";
|
|
884
|
+
};
|
|
885
|
+
readonly RoleKeyState: {
|
|
886
|
+
readonly title: "RoleKeyState";
|
|
887
|
+
readonly type: "string";
|
|
888
|
+
readonly enum: readonly ["pending", "staged", "active", "retiring", "retired", "revoked"];
|
|
889
|
+
readonly description: "Where a key is in its role's lifecycle. `pending` — planned by a preview or a change awaiting approval; not published; custody projection only. `staged` — published and bound to its role, but not yet used: a planned rotation publishes the successor and waits until the entry's cache horizon — publication plus the longer of the document's TTL and the verifier cache cap (CONVENTIONS.md §11.1) — before the VTA first uses it, so that no verifier holding a cached document sees a signature by a key it has never seen (VTI-KEY-122). Becomes `active` at the rotation's `activatesAt`. `active` — the key the VTA uses for new signatures (or, for `messaging`, advertises for new sessions). `retiring` — still published so that what it signed and sessions keyed to it keep working, but never used again: from the successor's first use the VTA MUST NOT sign with it, while a retiring `messaging` key stays usable for decryption, and senders may still encrypt to it, until it is retired (CONVENTIONS.md §11.3). `retired` — removed by planned rotation; what it signed while published remains valid, judged against the DID version current at issuance (CONVENTIONS.md §7). A retired `attestation` or `messaging` key is destroyed at retirement. `revoked` — removed from every relationship and from `keyRoles` in one entry, without overlap, because it is or may be compromised; what it signed from `compromisedSince` onward establishes nothing. `retired` and `revoked` are terminal.";
|
|
890
|
+
};
|
|
891
|
+
readonly DidVerificationRelationship: {
|
|
892
|
+
readonly title: "DidVerificationRelationship";
|
|
893
|
+
readonly type: "string";
|
|
894
|
+
readonly enum: readonly ["authentication", "assertionMethod", "keyAgreement", "capabilityInvocation", "capabilityDelegation"];
|
|
895
|
+
readonly description: "A DID Core verification relationship.";
|
|
896
|
+
};
|
|
897
|
+
readonly KeyType: {
|
|
898
|
+
readonly title: "KeyType";
|
|
899
|
+
readonly type: "string";
|
|
900
|
+
readonly enum: readonly ["ed25519", "x25519", "p256", "mldsa44", "mldsa65"];
|
|
901
|
+
readonly description: "Cryptographic algorithm the key material belongs to. `ed25519` signs (EdDSA), `x25519` performs key agreement and never signs, `p256` signs (ES256), and `mldsa44` and `mldsa65` sign with the post-quantum ML-DSA scheme of US NIST FIPS 204. The set is expected to grow as algorithms are standardised, and growing it is a MINOR change under SPEC.md §5.2: `keyType` selects no schema branch, so adding a value relaxes a constraint rather than narrowing one, and the generated libraries mark this enumeration non-exhaustive so that a consumer absorbs a new value rather than failing to compile. Two ML-DSA parameter sets are carried because two specifications require different ones — W3C Quantum-Resistant Cryptosuites defines Data Integrity suites only for ML-DSA-44, while Trust Spanning Protocol Rev 3 §8.1 mandates ML-DSA-65 — so the parameter set is chosen by whatever consumes the key and the two are not redundant. A consumer that does not implement a value it receives MUST refuse the document rather than substitute one it does support.";
|
|
902
|
+
};
|
|
903
|
+
readonly DidDocumentPreview: {
|
|
904
|
+
readonly title: "DidDocumentPreview";
|
|
905
|
+
readonly type: "object";
|
|
906
|
+
readonly additionalProperties: false;
|
|
907
|
+
readonly required: readonly ["previewId", "baseVersionId", "expiresAt", "changes", "document", "updateKeyRotates"];
|
|
908
|
+
readonly description: "What a change would publish, computed by the VTA by running the handler it would run to apply it, and nothing else (CONVENTIONS.md §3.1). This is what a consent surface renders and what an approval is bound to.";
|
|
909
|
+
readonly properties: {
|
|
910
|
+
readonly previewId: {
|
|
911
|
+
readonly type: "string";
|
|
912
|
+
readonly minLength: 16;
|
|
913
|
+
readonly description: "Opaque, unguessable identifier for this exact plan. Carried back by the apply request, and the thing every approval is bound to.";
|
|
914
|
+
};
|
|
915
|
+
readonly baseVersionId: {
|
|
916
|
+
readonly type: "string";
|
|
917
|
+
readonly description: "versionId of the log entry the plan was computed against. The plan is void once the log moves past it.";
|
|
918
|
+
};
|
|
919
|
+
readonly expiresAt: {
|
|
920
|
+
readonly type: "string";
|
|
921
|
+
readonly format: "date-time";
|
|
922
|
+
};
|
|
923
|
+
readonly changes: {
|
|
924
|
+
readonly type: "array";
|
|
925
|
+
readonly items: {
|
|
926
|
+
readonly $ref: "#/$defs/DidDocumentChange";
|
|
927
|
+
};
|
|
928
|
+
readonly description: "Every change the entry would make, including the ones the caller did not ask for — in particular `rotateUpdateKey`, which accompanies every entry appended under pre-rotation.";
|
|
929
|
+
};
|
|
930
|
+
readonly document: {
|
|
931
|
+
readonly type: "object";
|
|
932
|
+
readonly description: "The complete DID document the entry would publish. Public data by construction; no key material beyond public halves.";
|
|
933
|
+
};
|
|
934
|
+
readonly warnings: {
|
|
935
|
+
readonly type: "array";
|
|
936
|
+
readonly items: {
|
|
937
|
+
readonly type: "string";
|
|
938
|
+
readonly enum: readonly ["preRotationDisabled", "singleKeyRole", "algorithmNotInAcceptedSet", "roleWillHaveNoClassicalKey", "attestationReissuanceRequired", "serverless"];
|
|
939
|
+
};
|
|
940
|
+
readonly uniqueItems: true;
|
|
941
|
+
readonly description: "Conditions a human should be shown before approving. `preRotationDisabled` — the entry leaves no committed successor, so a later update-key compromise can only end in deactivation. `singleKeyRole` — the role will hold one active key, so its next compromise empties it until replaced. `algorithmNotInAcceptedSet` — a verifier population the VTA knows of does not accept the new key's algorithm. `roleWillHaveNoClassicalKey` — every remaining key is post-quantum, which verifiers without post-quantum support cannot check. `attestationReissuanceRequired` — revoking this `attestation` key obliges the node to re-issue every attestation artefact still in force and re-sign every status list (VTI-KEY-133). `serverless` — the VTA will not publish the entry; the operator must.";
|
|
942
|
+
};
|
|
943
|
+
readonly updateKeyRotates: {
|
|
944
|
+
readonly type: "boolean";
|
|
945
|
+
readonly description: "True when appending this entry also moves the DID's update key to a committed successor. Stated as its own member, not left to be found in `changes`, because it is the consequence a reviewer most often misses.";
|
|
946
|
+
};
|
|
947
|
+
};
|
|
948
|
+
};
|
|
949
|
+
readonly DidDocumentChange: {
|
|
950
|
+
readonly title: "DidDocumentChange";
|
|
951
|
+
readonly type: "object";
|
|
952
|
+
readonly additionalProperties: false;
|
|
953
|
+
readonly required: readonly ["op", "role"];
|
|
954
|
+
readonly properties: {
|
|
955
|
+
readonly op: {
|
|
956
|
+
readonly type: "string";
|
|
957
|
+
readonly enum: readonly ["addKey", "retireKey", "revokeKey", "rotateUpdateKey", "setPreRotation"];
|
|
958
|
+
readonly description: "`addKey` — a verification method is added, listed in its role's relationship and in `keyRoles`. `retireKey` — a verification method leaves its relationship, `keyRoles` and the document. `revokeKey` — a verification method leaves its relationship and `keyRoles`, and the compromise is recorded (CONVENTIONS.md §7). `rotateUpdateKey` — the log's update key moves to a committed successor. `setPreRotation` — the number of successors committed changes.";
|
|
959
|
+
};
|
|
960
|
+
readonly role: {
|
|
961
|
+
readonly $ref: "#/$defs/KeyRole";
|
|
962
|
+
};
|
|
963
|
+
readonly verificationMethod: {
|
|
964
|
+
readonly type: "string";
|
|
965
|
+
};
|
|
966
|
+
readonly keyType: {
|
|
967
|
+
readonly $ref: "#/$defs/KeyType";
|
|
968
|
+
};
|
|
969
|
+
readonly publicKeyMultibase: {
|
|
970
|
+
readonly type: "string";
|
|
971
|
+
};
|
|
972
|
+
readonly relationships: {
|
|
973
|
+
readonly type: "array";
|
|
974
|
+
readonly items: {
|
|
975
|
+
readonly $ref: "#/$defs/DidVerificationRelationship";
|
|
976
|
+
};
|
|
977
|
+
readonly uniqueItems: true;
|
|
978
|
+
};
|
|
979
|
+
readonly preRotationCount: {
|
|
980
|
+
readonly type: "integer";
|
|
981
|
+
readonly minimum: 0;
|
|
982
|
+
};
|
|
983
|
+
};
|
|
984
|
+
};
|
|
985
|
+
readonly KeyRoleChangeOutcome: {
|
|
986
|
+
readonly title: "KeyRoleChangeOutcome";
|
|
987
|
+
readonly type: "string";
|
|
988
|
+
readonly enum: readonly ["preview", "applied", "pendingApproval"];
|
|
989
|
+
readonly description: "`preview` — nothing was written; the response carries the plan. `applied` — the entry was appended (and published, unless `serverless`). `pendingApproval` — the plan is recorded and awaits further approvals; nothing is published until they arrive (CONVENTIONS.md §3.3).";
|
|
990
|
+
};
|
|
991
|
+
};
|
|
992
|
+
};
|
|
993
|
+
/**
|
|
994
|
+
* SPEC.md §7.2 policy for the request variant, from this specification's
|
|
995
|
+
* front matter. Pass to `consumeInbound` — items 5b, 7 and 8 are
|
|
996
|
+
* per-specification and cannot be derived from the document alone, and
|
|
997
|
+
* item 2 needs the schema this carries.
|
|
998
|
+
*/
|
|
999
|
+
export declare const SPEC: {
|
|
1000
|
+
readonly typeUri: "https://trusttasks.org/spec/vta/webvh/dids/keys/add/1.0";
|
|
1001
|
+
readonly isBearer: false;
|
|
1002
|
+
readonly isProofRequired: true;
|
|
1003
|
+
readonly isRecipientRequired: true;
|
|
1004
|
+
readonly isIssuedAtRequired: true;
|
|
1005
|
+
readonly payloadSchema: {
|
|
1006
|
+
readonly $schema: "https://json-schema.org/draft/2020-12/schema";
|
|
1007
|
+
readonly $id: "https://trusttasks.org/spec/vta/webvh/dids/keys/add/1.0";
|
|
1008
|
+
readonly title: "VTA WebVH DIDs Keys Add — payload";
|
|
1009
|
+
readonly description: "Add a newly generated key to one role of a did:webvh, without removing any — a post-quantum key beside a classical one, or a second operational key.";
|
|
1010
|
+
readonly type: "object";
|
|
1011
|
+
readonly additionalProperties: false;
|
|
1012
|
+
readonly required: readonly ["did", "role", "keyType"];
|
|
1013
|
+
readonly properties: {
|
|
1014
|
+
readonly did: {
|
|
1015
|
+
readonly type: "string";
|
|
1016
|
+
readonly minLength: 1;
|
|
1017
|
+
readonly description: "The DID whose keys change.";
|
|
1018
|
+
};
|
|
1019
|
+
readonly role: {
|
|
1020
|
+
readonly type: "string";
|
|
1021
|
+
readonly enum: readonly ["attestation", "operational", "messaging"];
|
|
1022
|
+
readonly description: "The role the key joins. `update` keys are not added; they move by rotation.";
|
|
1023
|
+
};
|
|
1024
|
+
readonly keyType: {
|
|
1025
|
+
readonly $ref: "#/$defs/KeyType";
|
|
1026
|
+
readonly description: "Algorithm of the key to generate. Must suit the role (CONVENTIONS.md §1 item 6).";
|
|
1027
|
+
};
|
|
1028
|
+
readonly label: {
|
|
1029
|
+
readonly type: "string";
|
|
1030
|
+
readonly maxLength: 256;
|
|
1031
|
+
readonly description: "Operator-facing label for the key. Never published.";
|
|
1032
|
+
};
|
|
1033
|
+
readonly expectedVersionId: {
|
|
1034
|
+
readonly type: "string";
|
|
1035
|
+
readonly minLength: 1;
|
|
1036
|
+
readonly description: "Optimistic-concurrency precondition: the versionId the caller based this change on (for example `keys/list`'s `versionId`). The VTA MUST refuse the change with `vta/webvh/dids:versionConflict` if the DID's latest entry no longer matches.";
|
|
1037
|
+
};
|
|
1038
|
+
readonly dryRun: {
|
|
1039
|
+
readonly type: "boolean";
|
|
1040
|
+
readonly description: "Compute and return the preview without writing anything but the plan (CONVENTIONS.md §3.1). Absent reads as false.";
|
|
1041
|
+
};
|
|
1042
|
+
readonly previewId: {
|
|
1043
|
+
readonly type: "string";
|
|
1044
|
+
readonly minLength: 16;
|
|
1045
|
+
readonly description: "Apply exactly the plan a previous dry run of this same request returned. The VTA MUST apply that plan or nothing, and MUST refuse with `vta/webvh/dids:previewStale` if it has expired, the log has moved past its base, or this request differs from the one previewed. An approval (step-up or quorum) is bound to this identifier.";
|
|
1046
|
+
};
|
|
1047
|
+
readonly reason: {
|
|
1048
|
+
readonly type: "string";
|
|
1049
|
+
readonly maxLength: 1024;
|
|
1050
|
+
readonly description: "Why the change is being made, for the audit trail and for other approvers. Never published.";
|
|
1051
|
+
};
|
|
1052
|
+
readonly ext: {
|
|
1053
|
+
readonly $ref: "#/$defs/Ext";
|
|
1054
|
+
};
|
|
1055
|
+
};
|
|
1056
|
+
readonly $defs: {
|
|
1057
|
+
readonly Response: {
|
|
1058
|
+
readonly $anchor: "response";
|
|
1059
|
+
readonly title: "VTA WebVH DIDs Keys Add — response payload";
|
|
1060
|
+
readonly description: "Success response. Type https://trusttasks.org/spec/vta/webvh/dids/keys/add/1.0#response. A refusal is a `trust-task-error` document, never this.";
|
|
1061
|
+
readonly type: "object";
|
|
1062
|
+
readonly additionalProperties: false;
|
|
1063
|
+
readonly required: readonly ["did", "outcome", "keys"];
|
|
1064
|
+
readonly properties: {
|
|
1065
|
+
readonly did: {
|
|
1066
|
+
readonly type: "string";
|
|
1067
|
+
};
|
|
1068
|
+
readonly outcome: {
|
|
1069
|
+
readonly $ref: "#/$defs/KeyRoleChangeOutcome";
|
|
1070
|
+
};
|
|
1071
|
+
readonly preview: {
|
|
1072
|
+
readonly $ref: "#/$defs/DidDocumentPreview";
|
|
1073
|
+
readonly description: "Present when `outcome` is `preview` or `pendingApproval`: the plan, and what an approval is bound to.";
|
|
1074
|
+
};
|
|
1075
|
+
readonly newVersionId: {
|
|
1076
|
+
readonly type: "string";
|
|
1077
|
+
readonly description: "Present when `outcome` is `applied`: the versionId of the appended entry. Pass it as the next change's `expectedVersionId`.";
|
|
1078
|
+
};
|
|
1079
|
+
readonly keys: {
|
|
1080
|
+
readonly type: "array";
|
|
1081
|
+
readonly items: {
|
|
1082
|
+
readonly $ref: "#/$defs/RoleKey";
|
|
1083
|
+
};
|
|
1084
|
+
readonly description: "Every key whose state this change sets or would set, after the change.";
|
|
1085
|
+
};
|
|
1086
|
+
readonly rotation: {
|
|
1087
|
+
readonly $ref: "#/$defs/RotationRecord";
|
|
1088
|
+
};
|
|
1089
|
+
readonly approvals: {
|
|
1090
|
+
readonly $ref: "#/$defs/KeyRoleApprovalState";
|
|
1091
|
+
readonly description: "Present when `outcome` is `pendingApproval`.";
|
|
1092
|
+
};
|
|
1093
|
+
readonly serverless: {
|
|
1094
|
+
readonly type: "boolean";
|
|
1095
|
+
readonly description: "True when no hosting server holds this DID. The caller must publish `newLogEntry` itself; until it does, resolvers still see the previous version.";
|
|
1096
|
+
};
|
|
1097
|
+
readonly newLogEntry: {
|
|
1098
|
+
readonly type: "string";
|
|
1099
|
+
readonly description: "The appended entry as JSON text. Present when `serverless` is true.";
|
|
1100
|
+
};
|
|
1101
|
+
readonly ext: {
|
|
1102
|
+
readonly $ref: "#/$defs/Ext";
|
|
1103
|
+
};
|
|
1104
|
+
};
|
|
1105
|
+
};
|
|
1106
|
+
readonly Ext: {
|
|
1107
|
+
readonly title: "Ext";
|
|
1108
|
+
readonly description: "Vendor-namespaced extension object per SPEC.md §4.5.1. Each immediate key MUST be a reverse-DNS namespace; structure under each namespace is opaque to the framework.";
|
|
1109
|
+
readonly type: "object";
|
|
1110
|
+
readonly minProperties: 1;
|
|
1111
|
+
readonly additionalProperties: true;
|
|
1112
|
+
readonly propertyNames: {
|
|
1113
|
+
readonly pattern: "^[a-z][a-z0-9-]*(\\.[a-z0-9-]+)+$";
|
|
1114
|
+
};
|
|
1115
|
+
};
|
|
1116
|
+
readonly KeyRoleApprovalState: {
|
|
1117
|
+
readonly title: "KeyRoleApprovalState";
|
|
1118
|
+
readonly type: "object";
|
|
1119
|
+
readonly additionalProperties: false;
|
|
1120
|
+
readonly required: readonly ["required", "received", "expiresAt"];
|
|
1121
|
+
readonly description: "Approval progress of a change the VTA's policy gates on more than one approval (CONVENTIONS.md §3.3).";
|
|
1122
|
+
readonly properties: {
|
|
1123
|
+
readonly required: {
|
|
1124
|
+
readonly type: "integer";
|
|
1125
|
+
readonly minimum: 1;
|
|
1126
|
+
readonly description: "Distinct approvals the VTA's policy requires.";
|
|
1127
|
+
};
|
|
1128
|
+
readonly received: {
|
|
1129
|
+
readonly type: "integer";
|
|
1130
|
+
readonly minimum: 0;
|
|
1131
|
+
readonly description: "Distinct approvals recorded so far, including the initiator's own.";
|
|
1132
|
+
};
|
|
1133
|
+
readonly approvers: {
|
|
1134
|
+
readonly type: "array";
|
|
1135
|
+
readonly items: {
|
|
1136
|
+
readonly type: "string";
|
|
1137
|
+
};
|
|
1138
|
+
readonly uniqueItems: true;
|
|
1139
|
+
readonly description: "VIDs whose approvals were recorded. Custody projection only; omitted from a response to anyone who is not themselves an eligible approver of this change.";
|
|
1140
|
+
};
|
|
1141
|
+
readonly expiresAt: {
|
|
1142
|
+
readonly type: "string";
|
|
1143
|
+
readonly format: "date-time";
|
|
1144
|
+
readonly description: "When the preview, and every approval bound to it, stops being usable.";
|
|
1145
|
+
};
|
|
1146
|
+
};
|
|
1147
|
+
};
|
|
1148
|
+
readonly RotationRecord: {
|
|
1149
|
+
readonly title: "RotationRecord";
|
|
1150
|
+
readonly type: "object";
|
|
1151
|
+
readonly additionalProperties: false;
|
|
1152
|
+
readonly required: readonly ["rotationId", "role", "kind", "state"];
|
|
1153
|
+
readonly description: "One change to a role's key set, from preview to completion. The rotation history of a DID is the list of these; the log is the authority for what was published, and this record adds what the log cannot say — which change was which, and (custody projection only) who asked, who approved, and why.";
|
|
1154
|
+
readonly properties: {
|
|
1155
|
+
readonly rotationId: {
|
|
1156
|
+
readonly type: "string";
|
|
1157
|
+
readonly minLength: 1;
|
|
1158
|
+
};
|
|
1159
|
+
readonly role: {
|
|
1160
|
+
readonly $ref: "#/$defs/KeyRole";
|
|
1161
|
+
};
|
|
1162
|
+
readonly kind: {
|
|
1163
|
+
readonly $ref: "#/$defs/RotationKind";
|
|
1164
|
+
};
|
|
1165
|
+
readonly state: {
|
|
1166
|
+
readonly $ref: "#/$defs/RotationState";
|
|
1167
|
+
};
|
|
1168
|
+
readonly predecessors: {
|
|
1169
|
+
readonly type: "array";
|
|
1170
|
+
readonly items: {
|
|
1171
|
+
readonly type: "string";
|
|
1172
|
+
};
|
|
1173
|
+
readonly description: "Verification-method identifiers (or, for `update`, public keys) leaving the role.";
|
|
1174
|
+
};
|
|
1175
|
+
readonly successors: {
|
|
1176
|
+
readonly type: "array";
|
|
1177
|
+
readonly items: {
|
|
1178
|
+
readonly type: "string";
|
|
1179
|
+
};
|
|
1180
|
+
readonly description: "Verification-method identifiers (or, for `update`, public keys) entering the role.";
|
|
1181
|
+
};
|
|
1182
|
+
readonly startedInVersionId: {
|
|
1183
|
+
readonly type: "string";
|
|
1184
|
+
};
|
|
1185
|
+
readonly endedInVersionId: {
|
|
1186
|
+
readonly type: "string";
|
|
1187
|
+
};
|
|
1188
|
+
readonly startedAt: {
|
|
1189
|
+
readonly type: "string";
|
|
1190
|
+
readonly format: "date-time";
|
|
1191
|
+
};
|
|
1192
|
+
readonly overlapUntil: {
|
|
1193
|
+
readonly type: "string";
|
|
1194
|
+
readonly format: "date-time";
|
|
1195
|
+
readonly description: "Custody projection only. End of the overlap window.";
|
|
1196
|
+
};
|
|
1197
|
+
readonly autoRetire: {
|
|
1198
|
+
readonly type: "boolean";
|
|
1199
|
+
readonly description: "Custody projection only. Whether the VTA retires the predecessor itself at `overlapUntil`.";
|
|
1200
|
+
};
|
|
1201
|
+
readonly endedAt: {
|
|
1202
|
+
readonly type: "string";
|
|
1203
|
+
readonly format: "date-time";
|
|
1204
|
+
};
|
|
1205
|
+
readonly initiatedBy: {
|
|
1206
|
+
readonly type: "string";
|
|
1207
|
+
readonly description: "Custody projection only. VID of the administrator whose signed request started the change.";
|
|
1208
|
+
};
|
|
1209
|
+
readonly approvals: {
|
|
1210
|
+
readonly $ref: "#/$defs/KeyRoleApprovalState";
|
|
1211
|
+
readonly description: "Custody projection only.";
|
|
1212
|
+
};
|
|
1213
|
+
readonly reason: {
|
|
1214
|
+
readonly type: "string";
|
|
1215
|
+
readonly maxLength: 1024;
|
|
1216
|
+
readonly description: "Custody projection only. The operator's stated reason. Never published.";
|
|
1217
|
+
};
|
|
1218
|
+
readonly ext: {
|
|
1219
|
+
readonly $ref: "#/$defs/Ext";
|
|
1220
|
+
};
|
|
1221
|
+
readonly activatesAt: {
|
|
1222
|
+
readonly type: "string";
|
|
1223
|
+
readonly format: "date-time";
|
|
1224
|
+
readonly description: "When the successor becomes `active` and the predecessor `retiring`; never before `cacheHorizonAt`.";
|
|
1225
|
+
};
|
|
1226
|
+
readonly cacheHorizonAt: {
|
|
1227
|
+
readonly type: "string";
|
|
1228
|
+
readonly format: "date-time";
|
|
1229
|
+
readonly description: "Planned rotations: the publishing entry's cache horizon — publication plus the longer of the document's TTL and the verifier cache cap (CONVENTIONS.md §11.1). The switch, and any retirement of the predecessor, happen no earlier. Public: it follows from the log and the published cap.";
|
|
1230
|
+
};
|
|
1231
|
+
};
|
|
1232
|
+
};
|
|
1233
|
+
readonly RotationState: {
|
|
1234
|
+
readonly title: "RotationState";
|
|
1235
|
+
readonly type: "string";
|
|
1236
|
+
readonly enum: readonly ["pendingApproval", "staged", "overlapping", "completed", "aborted", "expired"];
|
|
1237
|
+
readonly description: "`pendingApproval` — awaiting the approvals the VTA's policy requires; nothing is published. `staged` — successor published, not yet used; predecessor still active. `overlapping` — successor active, predecessor `retiring`. `completed` — every predecessor retired (or, for `compromise` and `addition`, the entry is published and any overlap it began has ended). `aborted` — the successor was retired instead of the predecessor, which stayed or returned to `active`. `expired` — approvals were not gathered before the preview expired; nothing was published.";
|
|
1238
|
+
};
|
|
1239
|
+
readonly RotationKind: {
|
|
1240
|
+
readonly title: "RotationKind";
|
|
1241
|
+
readonly type: "string";
|
|
1242
|
+
readonly enum: readonly ["planned", "compromise", "addition"];
|
|
1243
|
+
readonly description: "`planned` — a successor was staged, activated, and the predecessor retired on the operator's schedule. `compromise` — a key was revoked and, where the role would otherwise be empty, replaced in the same log entry. `addition` — a key was added to a role without anything leaving it (for example a post-quantum key alongside a classical one).";
|
|
1244
|
+
};
|
|
1245
|
+
readonly KeyRole: {
|
|
1246
|
+
readonly title: "KeyRole";
|
|
1247
|
+
readonly type: "string";
|
|
1248
|
+
readonly enum: readonly ["attestation", "operational", "messaging", "update"];
|
|
1249
|
+
readonly description: "The named key role a key occupies in the DID (VTI-KEY-070 onward). `attestation` — the only keys in `assertionMethod`; sign the DID's attestation artefacts (membership and role credentials, endorsements, status lists, every other credential the node issues), through the VTA's signing service and nowhere else. Generated inside the VTA, never derived, never exportable, never in a backup. `operational` — the only keys in `authentication`; sign the node's own traffic (Trust Task requests and responses, DIDComm and TSP message signatures, invitations, notices, audit checkpoints) with proof purpose `authentication`. `messaging` — the only keys in `keyAgreement`; sign nothing. `update` — the keys that authorize appending to the DID's log (a did:webvh `updateKeys` entry) and the pre-rotation commitments that authorize the next ones; never a verification method, never in `keyRoles`. Generated inside the VTA, never derived, never exportable, never in a backup. No role permits `capabilityInvocation` or `capabilityDelegation` (VTI-KEY-075); both are reserved for a future role. The mapping is normative and is set out in CONVENTIONS.md §1. The set is an extensible registry and growing it is a MINOR change: a consumer that receives a role it does not implement MUST refuse the document rather than map the key onto a role it does know.";
|
|
1250
|
+
};
|
|
1251
|
+
readonly RoleKey: {
|
|
1252
|
+
readonly title: "RoleKey";
|
|
1253
|
+
readonly type: "object";
|
|
1254
|
+
readonly additionalProperties: false;
|
|
1255
|
+
readonly required: readonly ["role", "keyType", "publicKeyMultibase", "state"];
|
|
1256
|
+
readonly description: "One key in one role. A key is in exactly one role for its whole life; a change of role is a retirement from one and an addition to another, under a new verification-method identifier.";
|
|
1257
|
+
readonly properties: {
|
|
1258
|
+
readonly verificationMethod: {
|
|
1259
|
+
readonly type: "string";
|
|
1260
|
+
readonly minLength: 1;
|
|
1261
|
+
readonly description: "The full verification-method identifier (`did#fragment`) the document publishes the key under, and lists in `keyRoles`. Absent only for `update` keys, which are published as log parameters and never as verification methods (VTI-KEY-093). A VTA minting a new method SHOULD derive its fragment from the key (VTI-KEY-150).";
|
|
1262
|
+
};
|
|
1263
|
+
readonly role: {
|
|
1264
|
+
readonly $ref: "#/$defs/KeyRole";
|
|
1265
|
+
};
|
|
1266
|
+
readonly relationships: {
|
|
1267
|
+
readonly type: "array";
|
|
1268
|
+
readonly items: {
|
|
1269
|
+
readonly $ref: "#/$defs/DidVerificationRelationship";
|
|
1270
|
+
};
|
|
1271
|
+
readonly uniqueItems: true;
|
|
1272
|
+
readonly description: "The relationships the key is (or, while `pending`, will be) listed in. Always exactly its role's single relationship (CONVENTIONS.md §1) — carried so a caller can check it against the document rather than trusting it. Empty for `update`, `retired` and `revoked` keys.";
|
|
1273
|
+
};
|
|
1274
|
+
readonly keyType: {
|
|
1275
|
+
readonly $ref: "#/$defs/KeyType";
|
|
1276
|
+
};
|
|
1277
|
+
readonly publicKeyMultibase: {
|
|
1278
|
+
readonly type: "string";
|
|
1279
|
+
readonly minLength: 1;
|
|
1280
|
+
readonly description: "The public half, multibase-encoded, exactly as published.";
|
|
1281
|
+
};
|
|
1282
|
+
readonly state: {
|
|
1283
|
+
readonly $ref: "#/$defs/RoleKeyState";
|
|
1284
|
+
};
|
|
1285
|
+
readonly publishedInVersionId: {
|
|
1286
|
+
readonly type: "string";
|
|
1287
|
+
readonly description: "versionId of the log entry that first published the key. Absent while `pending`.";
|
|
1288
|
+
};
|
|
1289
|
+
readonly removedInVersionId: {
|
|
1290
|
+
readonly type: "string";
|
|
1291
|
+
readonly description: "versionId of the log entry that retired or revoked the key.";
|
|
1292
|
+
};
|
|
1293
|
+
readonly retireAfter: {
|
|
1294
|
+
readonly type: "string";
|
|
1295
|
+
readonly format: "date-time";
|
|
1296
|
+
readonly description: "For a `retiring` key: the end of its overlap window. Custody projection only.";
|
|
1297
|
+
};
|
|
1298
|
+
readonly compromisedSince: {
|
|
1299
|
+
readonly type: "string";
|
|
1300
|
+
readonly format: "date-time";
|
|
1301
|
+
readonly description: "For a `revoked` key: the compromise time (VTI-KEY-121) — the earliest instant from which the key is treated as compromised. Where the operator cannot establish it, the time the key was first published. Published, because it is what a verifier needs.";
|
|
1302
|
+
};
|
|
1303
|
+
readonly rotationId: {
|
|
1304
|
+
readonly type: "string";
|
|
1305
|
+
readonly description: "The rotation this key was introduced or retired by, when it was.";
|
|
1306
|
+
};
|
|
1307
|
+
readonly label: {
|
|
1308
|
+
readonly type: "string";
|
|
1309
|
+
readonly maxLength: 256;
|
|
1310
|
+
readonly description: "Operator-facing label. Custody projection only.";
|
|
1311
|
+
};
|
|
1312
|
+
readonly custody: {
|
|
1313
|
+
readonly $ref: "#/$defs/RoleKeyCustody";
|
|
1314
|
+
};
|
|
1315
|
+
readonly ext: {
|
|
1316
|
+
readonly $ref: "#/$defs/Ext";
|
|
1317
|
+
};
|
|
1318
|
+
readonly activatesAt: {
|
|
1319
|
+
readonly type: "string";
|
|
1320
|
+
readonly format: "date-time";
|
|
1321
|
+
readonly description: "For a `staged` key: when the VTA will begin using it — no earlier than the publishing entry's cache horizon (CONVENTIONS.md §11.1).";
|
|
1322
|
+
};
|
|
1323
|
+
};
|
|
1324
|
+
};
|
|
1325
|
+
readonly RoleKeyCustody: {
|
|
1326
|
+
readonly title: "RoleKeyCustody";
|
|
1327
|
+
readonly type: "object";
|
|
1328
|
+
readonly additionalProperties: false;
|
|
1329
|
+
readonly required: readonly ["keyId", "exportable", "neverExportable", "inBackups"];
|
|
1330
|
+
readonly description: "How the VTA holds a key. Present only in the custody projection. Carries no key material, and a conforming VTA MUST NOT place any in `ext`.";
|
|
1331
|
+
readonly properties: {
|
|
1332
|
+
readonly keyId: {
|
|
1333
|
+
readonly type: "string";
|
|
1334
|
+
readonly minLength: 1;
|
|
1335
|
+
readonly description: "The custodian record identifier (`keys/*`'s `keyId`) behind this key.";
|
|
1336
|
+
};
|
|
1337
|
+
readonly origin: {
|
|
1338
|
+
readonly $ref: "#/$defs/KeyOrigin";
|
|
1339
|
+
};
|
|
1340
|
+
readonly exportable: {
|
|
1341
|
+
readonly type: "boolean";
|
|
1342
|
+
readonly description: "Whether the custodian would release the private half through `keys/export-secret`. Always `false` for `attestation` and `update` keys (CONVENTIONS.md §4). Stated explicitly — never absent — because this is the member an operator reads to confirm a role key cannot leave the VTA, and `keys/*`'s absent-means-exportable reading is the wrong default to leave them to infer.";
|
|
1343
|
+
};
|
|
1344
|
+
readonly neverExportable: {
|
|
1345
|
+
readonly type: "boolean";
|
|
1346
|
+
readonly description: "True when no authority can make the key exportable — the role forbids it, or the material exists only inside a module that cannot release it. `true` implies `exportable: false`.";
|
|
1347
|
+
};
|
|
1348
|
+
readonly hardwareBacked: {
|
|
1349
|
+
readonly type: "boolean";
|
|
1350
|
+
readonly description: "True when the private half is held by a hardware or enclave module that performs the operation without releasing it. Absent means the VTA does not say, not that it is false.";
|
|
1351
|
+
};
|
|
1352
|
+
readonly inBackups: {
|
|
1353
|
+
readonly type: "boolean";
|
|
1354
|
+
readonly description: "Whether the key, or material it can be re-derived from, is included in the VTA's backups or any state transfer. Always `false` for `attestation` and `update` keys (VTI-KEY-112): they are generated, not derived, so there is no seed that recovers them, and their loss is recovered by rotation, never by restore.";
|
|
1355
|
+
};
|
|
1356
|
+
readonly destroyed: {
|
|
1357
|
+
readonly type: "boolean";
|
|
1358
|
+
readonly description: "True once the private half has been destroyed — a retired `attestation` key (VTI-KEY-125). The record survives so the key's past signatures stay attributable.";
|
|
1359
|
+
};
|
|
1360
|
+
};
|
|
1361
|
+
};
|
|
1362
|
+
readonly KeyOrigin: {
|
|
1363
|
+
readonly title: "KeyOrigin";
|
|
1364
|
+
readonly type: "string";
|
|
1365
|
+
readonly enum: readonly ["derived", "imported", "internal"];
|
|
1366
|
+
readonly description: "Where the private key came from. `derived` means the maintainer generated it from a seed it holds and can reproduce it from `derivationPath`; `imported` means it arrived from outside and exists only as stored material; `internal` means the maintainer generated it from a CSPRNG and it is reproducible from nothing at all. The distinction is operationally load-bearing: a `derived` key survives a seed restore, an `imported` one is lost unless it was backed up separately, and an `internal` one cannot be recovered by any means once the maintainer's storage is gone. This member is also the only way a consumer can confirm that a `keys/create` request for an `internal` key was honoured rather than silently downgraded to a derived one — see that specification's `internal` member.";
|
|
1367
|
+
readonly default: "derived";
|
|
1368
|
+
};
|
|
1369
|
+
readonly RoleKeyState: {
|
|
1370
|
+
readonly title: "RoleKeyState";
|
|
1371
|
+
readonly type: "string";
|
|
1372
|
+
readonly enum: readonly ["pending", "staged", "active", "retiring", "retired", "revoked"];
|
|
1373
|
+
readonly description: "Where a key is in its role's lifecycle. `pending` — planned by a preview or a change awaiting approval; not published; custody projection only. `staged` — published and bound to its role, but not yet used: a planned rotation publishes the successor and waits until the entry's cache horizon — publication plus the longer of the document's TTL and the verifier cache cap (CONVENTIONS.md §11.1) — before the VTA first uses it, so that no verifier holding a cached document sees a signature by a key it has never seen (VTI-KEY-122). Becomes `active` at the rotation's `activatesAt`. `active` — the key the VTA uses for new signatures (or, for `messaging`, advertises for new sessions). `retiring` — still published so that what it signed and sessions keyed to it keep working, but never used again: from the successor's first use the VTA MUST NOT sign with it, while a retiring `messaging` key stays usable for decryption, and senders may still encrypt to it, until it is retired (CONVENTIONS.md §11.3). `retired` — removed by planned rotation; what it signed while published remains valid, judged against the DID version current at issuance (CONVENTIONS.md §7). A retired `attestation` or `messaging` key is destroyed at retirement. `revoked` — removed from every relationship and from `keyRoles` in one entry, without overlap, because it is or may be compromised; what it signed from `compromisedSince` onward establishes nothing. `retired` and `revoked` are terminal.";
|
|
1374
|
+
};
|
|
1375
|
+
readonly DidVerificationRelationship: {
|
|
1376
|
+
readonly title: "DidVerificationRelationship";
|
|
1377
|
+
readonly type: "string";
|
|
1378
|
+
readonly enum: readonly ["authentication", "assertionMethod", "keyAgreement", "capabilityInvocation", "capabilityDelegation"];
|
|
1379
|
+
readonly description: "A DID Core verification relationship.";
|
|
1380
|
+
};
|
|
1381
|
+
readonly KeyType: {
|
|
1382
|
+
readonly title: "KeyType";
|
|
1383
|
+
readonly type: "string";
|
|
1384
|
+
readonly enum: readonly ["ed25519", "x25519", "p256", "mldsa44", "mldsa65"];
|
|
1385
|
+
readonly description: "Cryptographic algorithm the key material belongs to. `ed25519` signs (EdDSA), `x25519` performs key agreement and never signs, `p256` signs (ES256), and `mldsa44` and `mldsa65` sign with the post-quantum ML-DSA scheme of US NIST FIPS 204. The set is expected to grow as algorithms are standardised, and growing it is a MINOR change under SPEC.md §5.2: `keyType` selects no schema branch, so adding a value relaxes a constraint rather than narrowing one, and the generated libraries mark this enumeration non-exhaustive so that a consumer absorbs a new value rather than failing to compile. Two ML-DSA parameter sets are carried because two specifications require different ones — W3C Quantum-Resistant Cryptosuites defines Data Integrity suites only for ML-DSA-44, while Trust Spanning Protocol Rev 3 §8.1 mandates ML-DSA-65 — so the parameter set is chosen by whatever consumes the key and the two are not redundant. A consumer that does not implement a value it receives MUST refuse the document rather than substitute one it does support.";
|
|
1386
|
+
};
|
|
1387
|
+
readonly DidDocumentPreview: {
|
|
1388
|
+
readonly title: "DidDocumentPreview";
|
|
1389
|
+
readonly type: "object";
|
|
1390
|
+
readonly additionalProperties: false;
|
|
1391
|
+
readonly required: readonly ["previewId", "baseVersionId", "expiresAt", "changes", "document", "updateKeyRotates"];
|
|
1392
|
+
readonly description: "What a change would publish, computed by the VTA by running the handler it would run to apply it, and nothing else (CONVENTIONS.md §3.1). This is what a consent surface renders and what an approval is bound to.";
|
|
1393
|
+
readonly properties: {
|
|
1394
|
+
readonly previewId: {
|
|
1395
|
+
readonly type: "string";
|
|
1396
|
+
readonly minLength: 16;
|
|
1397
|
+
readonly description: "Opaque, unguessable identifier for this exact plan. Carried back by the apply request, and the thing every approval is bound to.";
|
|
1398
|
+
};
|
|
1399
|
+
readonly baseVersionId: {
|
|
1400
|
+
readonly type: "string";
|
|
1401
|
+
readonly description: "versionId of the log entry the plan was computed against. The plan is void once the log moves past it.";
|
|
1402
|
+
};
|
|
1403
|
+
readonly expiresAt: {
|
|
1404
|
+
readonly type: "string";
|
|
1405
|
+
readonly format: "date-time";
|
|
1406
|
+
};
|
|
1407
|
+
readonly changes: {
|
|
1408
|
+
readonly type: "array";
|
|
1409
|
+
readonly items: {
|
|
1410
|
+
readonly $ref: "#/$defs/DidDocumentChange";
|
|
1411
|
+
};
|
|
1412
|
+
readonly description: "Every change the entry would make, including the ones the caller did not ask for — in particular `rotateUpdateKey`, which accompanies every entry appended under pre-rotation.";
|
|
1413
|
+
};
|
|
1414
|
+
readonly document: {
|
|
1415
|
+
readonly type: "object";
|
|
1416
|
+
readonly description: "The complete DID document the entry would publish. Public data by construction; no key material beyond public halves.";
|
|
1417
|
+
};
|
|
1418
|
+
readonly warnings: {
|
|
1419
|
+
readonly type: "array";
|
|
1420
|
+
readonly items: {
|
|
1421
|
+
readonly type: "string";
|
|
1422
|
+
readonly enum: readonly ["preRotationDisabled", "singleKeyRole", "algorithmNotInAcceptedSet", "roleWillHaveNoClassicalKey", "attestationReissuanceRequired", "serverless"];
|
|
1423
|
+
};
|
|
1424
|
+
readonly uniqueItems: true;
|
|
1425
|
+
readonly description: "Conditions a human should be shown before approving. `preRotationDisabled` — the entry leaves no committed successor, so a later update-key compromise can only end in deactivation. `singleKeyRole` — the role will hold one active key, so its next compromise empties it until replaced. `algorithmNotInAcceptedSet` — a verifier population the VTA knows of does not accept the new key's algorithm. `roleWillHaveNoClassicalKey` — every remaining key is post-quantum, which verifiers without post-quantum support cannot check. `attestationReissuanceRequired` — revoking this `attestation` key obliges the node to re-issue every attestation artefact still in force and re-sign every status list (VTI-KEY-133). `serverless` — the VTA will not publish the entry; the operator must.";
|
|
1426
|
+
};
|
|
1427
|
+
readonly updateKeyRotates: {
|
|
1428
|
+
readonly type: "boolean";
|
|
1429
|
+
readonly description: "True when appending this entry also moves the DID's update key to a committed successor. Stated as its own member, not left to be found in `changes`, because it is the consequence a reviewer most often misses.";
|
|
1430
|
+
};
|
|
1431
|
+
};
|
|
1432
|
+
};
|
|
1433
|
+
readonly DidDocumentChange: {
|
|
1434
|
+
readonly title: "DidDocumentChange";
|
|
1435
|
+
readonly type: "object";
|
|
1436
|
+
readonly additionalProperties: false;
|
|
1437
|
+
readonly required: readonly ["op", "role"];
|
|
1438
|
+
readonly properties: {
|
|
1439
|
+
readonly op: {
|
|
1440
|
+
readonly type: "string";
|
|
1441
|
+
readonly enum: readonly ["addKey", "retireKey", "revokeKey", "rotateUpdateKey", "setPreRotation"];
|
|
1442
|
+
readonly description: "`addKey` — a verification method is added, listed in its role's relationship and in `keyRoles`. `retireKey` — a verification method leaves its relationship, `keyRoles` and the document. `revokeKey` — a verification method leaves its relationship and `keyRoles`, and the compromise is recorded (CONVENTIONS.md §7). `rotateUpdateKey` — the log's update key moves to a committed successor. `setPreRotation` — the number of successors committed changes.";
|
|
1443
|
+
};
|
|
1444
|
+
readonly role: {
|
|
1445
|
+
readonly $ref: "#/$defs/KeyRole";
|
|
1446
|
+
};
|
|
1447
|
+
readonly verificationMethod: {
|
|
1448
|
+
readonly type: "string";
|
|
1449
|
+
};
|
|
1450
|
+
readonly keyType: {
|
|
1451
|
+
readonly $ref: "#/$defs/KeyType";
|
|
1452
|
+
};
|
|
1453
|
+
readonly publicKeyMultibase: {
|
|
1454
|
+
readonly type: "string";
|
|
1455
|
+
};
|
|
1456
|
+
readonly relationships: {
|
|
1457
|
+
readonly type: "array";
|
|
1458
|
+
readonly items: {
|
|
1459
|
+
readonly $ref: "#/$defs/DidVerificationRelationship";
|
|
1460
|
+
};
|
|
1461
|
+
readonly uniqueItems: true;
|
|
1462
|
+
};
|
|
1463
|
+
readonly preRotationCount: {
|
|
1464
|
+
readonly type: "integer";
|
|
1465
|
+
readonly minimum: 0;
|
|
1466
|
+
};
|
|
1467
|
+
};
|
|
1468
|
+
};
|
|
1469
|
+
readonly KeyRoleChangeOutcome: {
|
|
1470
|
+
readonly title: "KeyRoleChangeOutcome";
|
|
1471
|
+
readonly type: "string";
|
|
1472
|
+
readonly enum: readonly ["preview", "applied", "pendingApproval"];
|
|
1473
|
+
readonly description: "`preview` — nothing was written; the response carries the plan. `applied` — the entry was appended (and published, unless `serverless`). `pendingApproval` — the plan is recorded and awaits further approvals; nothing is published until they arrive (CONVENTIONS.md §3.3).";
|
|
1474
|
+
};
|
|
1475
|
+
};
|
|
1476
|
+
};
|
|
1477
|
+
};
|
|
1478
|
+
/**
|
|
1479
|
+
* SPEC.md §7.2 policy for the success-response variant. `isRecipientRequired`
|
|
1480
|
+
* tracks the *issuer* party's requirement because a response swaps the
|
|
1481
|
+
* parties (§7.3 item 5).
|
|
1482
|
+
*/
|
|
1483
|
+
export declare const RESPONSE_SPEC: {
|
|
1484
|
+
readonly typeUri: "https://trusttasks.org/spec/vta/webvh/dids/keys/add/1.0#response";
|
|
1485
|
+
readonly isBearer: false;
|
|
1486
|
+
readonly isProofRequired: true;
|
|
1487
|
+
readonly isRecipientRequired: true;
|
|
1488
|
+
readonly isIssuedAtRequired: true;
|
|
1489
|
+
readonly payloadSchema: {
|
|
1490
|
+
readonly $schema: "https://json-schema.org/draft/2020-12/schema";
|
|
1491
|
+
readonly $ref: "#/$defs/Response";
|
|
1492
|
+
readonly $defs: {
|
|
1493
|
+
readonly Response: {
|
|
1494
|
+
readonly $anchor: "response";
|
|
1495
|
+
readonly title: "VTA WebVH DIDs Keys Add — response payload";
|
|
1496
|
+
readonly description: "Success response. Type https://trusttasks.org/spec/vta/webvh/dids/keys/add/1.0#response. A refusal is a `trust-task-error` document, never this.";
|
|
1497
|
+
readonly type: "object";
|
|
1498
|
+
readonly additionalProperties: false;
|
|
1499
|
+
readonly required: readonly ["did", "outcome", "keys"];
|
|
1500
|
+
readonly properties: {
|
|
1501
|
+
readonly did: {
|
|
1502
|
+
readonly type: "string";
|
|
1503
|
+
};
|
|
1504
|
+
readonly outcome: {
|
|
1505
|
+
readonly $ref: "#/$defs/KeyRoleChangeOutcome";
|
|
1506
|
+
};
|
|
1507
|
+
readonly preview: {
|
|
1508
|
+
readonly $ref: "#/$defs/DidDocumentPreview";
|
|
1509
|
+
readonly description: "Present when `outcome` is `preview` or `pendingApproval`: the plan, and what an approval is bound to.";
|
|
1510
|
+
};
|
|
1511
|
+
readonly newVersionId: {
|
|
1512
|
+
readonly type: "string";
|
|
1513
|
+
readonly description: "Present when `outcome` is `applied`: the versionId of the appended entry. Pass it as the next change's `expectedVersionId`.";
|
|
1514
|
+
};
|
|
1515
|
+
readonly keys: {
|
|
1516
|
+
readonly type: "array";
|
|
1517
|
+
readonly items: {
|
|
1518
|
+
readonly $ref: "#/$defs/RoleKey";
|
|
1519
|
+
};
|
|
1520
|
+
readonly description: "Every key whose state this change sets or would set, after the change.";
|
|
1521
|
+
};
|
|
1522
|
+
readonly rotation: {
|
|
1523
|
+
readonly $ref: "#/$defs/RotationRecord";
|
|
1524
|
+
};
|
|
1525
|
+
readonly approvals: {
|
|
1526
|
+
readonly $ref: "#/$defs/KeyRoleApprovalState";
|
|
1527
|
+
readonly description: "Present when `outcome` is `pendingApproval`.";
|
|
1528
|
+
};
|
|
1529
|
+
readonly serverless: {
|
|
1530
|
+
readonly type: "boolean";
|
|
1531
|
+
readonly description: "True when no hosting server holds this DID. The caller must publish `newLogEntry` itself; until it does, resolvers still see the previous version.";
|
|
1532
|
+
};
|
|
1533
|
+
readonly newLogEntry: {
|
|
1534
|
+
readonly type: "string";
|
|
1535
|
+
readonly description: "The appended entry as JSON text. Present when `serverless` is true.";
|
|
1536
|
+
};
|
|
1537
|
+
readonly ext: {
|
|
1538
|
+
readonly $ref: "#/$defs/Ext";
|
|
1539
|
+
};
|
|
1540
|
+
};
|
|
1541
|
+
};
|
|
1542
|
+
readonly Ext: {
|
|
1543
|
+
readonly title: "Ext";
|
|
1544
|
+
readonly description: "Vendor-namespaced extension object per SPEC.md §4.5.1. Each immediate key MUST be a reverse-DNS namespace; structure under each namespace is opaque to the framework.";
|
|
1545
|
+
readonly type: "object";
|
|
1546
|
+
readonly minProperties: 1;
|
|
1547
|
+
readonly additionalProperties: true;
|
|
1548
|
+
readonly propertyNames: {
|
|
1549
|
+
readonly pattern: "^[a-z][a-z0-9-]*(\\.[a-z0-9-]+)+$";
|
|
1550
|
+
};
|
|
1551
|
+
};
|
|
1552
|
+
readonly KeyRoleApprovalState: {
|
|
1553
|
+
readonly title: "KeyRoleApprovalState";
|
|
1554
|
+
readonly type: "object";
|
|
1555
|
+
readonly additionalProperties: false;
|
|
1556
|
+
readonly required: readonly ["required", "received", "expiresAt"];
|
|
1557
|
+
readonly description: "Approval progress of a change the VTA's policy gates on more than one approval (CONVENTIONS.md §3.3).";
|
|
1558
|
+
readonly properties: {
|
|
1559
|
+
readonly required: {
|
|
1560
|
+
readonly type: "integer";
|
|
1561
|
+
readonly minimum: 1;
|
|
1562
|
+
readonly description: "Distinct approvals the VTA's policy requires.";
|
|
1563
|
+
};
|
|
1564
|
+
readonly received: {
|
|
1565
|
+
readonly type: "integer";
|
|
1566
|
+
readonly minimum: 0;
|
|
1567
|
+
readonly description: "Distinct approvals recorded so far, including the initiator's own.";
|
|
1568
|
+
};
|
|
1569
|
+
readonly approvers: {
|
|
1570
|
+
readonly type: "array";
|
|
1571
|
+
readonly items: {
|
|
1572
|
+
readonly type: "string";
|
|
1573
|
+
};
|
|
1574
|
+
readonly uniqueItems: true;
|
|
1575
|
+
readonly description: "VIDs whose approvals were recorded. Custody projection only; omitted from a response to anyone who is not themselves an eligible approver of this change.";
|
|
1576
|
+
};
|
|
1577
|
+
readonly expiresAt: {
|
|
1578
|
+
readonly type: "string";
|
|
1579
|
+
readonly format: "date-time";
|
|
1580
|
+
readonly description: "When the preview, and every approval bound to it, stops being usable.";
|
|
1581
|
+
};
|
|
1582
|
+
};
|
|
1583
|
+
};
|
|
1584
|
+
readonly RotationRecord: {
|
|
1585
|
+
readonly title: "RotationRecord";
|
|
1586
|
+
readonly type: "object";
|
|
1587
|
+
readonly additionalProperties: false;
|
|
1588
|
+
readonly required: readonly ["rotationId", "role", "kind", "state"];
|
|
1589
|
+
readonly description: "One change to a role's key set, from preview to completion. The rotation history of a DID is the list of these; the log is the authority for what was published, and this record adds what the log cannot say — which change was which, and (custody projection only) who asked, who approved, and why.";
|
|
1590
|
+
readonly properties: {
|
|
1591
|
+
readonly rotationId: {
|
|
1592
|
+
readonly type: "string";
|
|
1593
|
+
readonly minLength: 1;
|
|
1594
|
+
};
|
|
1595
|
+
readonly role: {
|
|
1596
|
+
readonly $ref: "#/$defs/KeyRole";
|
|
1597
|
+
};
|
|
1598
|
+
readonly kind: {
|
|
1599
|
+
readonly $ref: "#/$defs/RotationKind";
|
|
1600
|
+
};
|
|
1601
|
+
readonly state: {
|
|
1602
|
+
readonly $ref: "#/$defs/RotationState";
|
|
1603
|
+
};
|
|
1604
|
+
readonly predecessors: {
|
|
1605
|
+
readonly type: "array";
|
|
1606
|
+
readonly items: {
|
|
1607
|
+
readonly type: "string";
|
|
1608
|
+
};
|
|
1609
|
+
readonly description: "Verification-method identifiers (or, for `update`, public keys) leaving the role.";
|
|
1610
|
+
};
|
|
1611
|
+
readonly successors: {
|
|
1612
|
+
readonly type: "array";
|
|
1613
|
+
readonly items: {
|
|
1614
|
+
readonly type: "string";
|
|
1615
|
+
};
|
|
1616
|
+
readonly description: "Verification-method identifiers (or, for `update`, public keys) entering the role.";
|
|
1617
|
+
};
|
|
1618
|
+
readonly startedInVersionId: {
|
|
1619
|
+
readonly type: "string";
|
|
1620
|
+
};
|
|
1621
|
+
readonly endedInVersionId: {
|
|
1622
|
+
readonly type: "string";
|
|
1623
|
+
};
|
|
1624
|
+
readonly startedAt: {
|
|
1625
|
+
readonly type: "string";
|
|
1626
|
+
readonly format: "date-time";
|
|
1627
|
+
};
|
|
1628
|
+
readonly overlapUntil: {
|
|
1629
|
+
readonly type: "string";
|
|
1630
|
+
readonly format: "date-time";
|
|
1631
|
+
readonly description: "Custody projection only. End of the overlap window.";
|
|
1632
|
+
};
|
|
1633
|
+
readonly autoRetire: {
|
|
1634
|
+
readonly type: "boolean";
|
|
1635
|
+
readonly description: "Custody projection only. Whether the VTA retires the predecessor itself at `overlapUntil`.";
|
|
1636
|
+
};
|
|
1637
|
+
readonly endedAt: {
|
|
1638
|
+
readonly type: "string";
|
|
1639
|
+
readonly format: "date-time";
|
|
1640
|
+
};
|
|
1641
|
+
readonly initiatedBy: {
|
|
1642
|
+
readonly type: "string";
|
|
1643
|
+
readonly description: "Custody projection only. VID of the administrator whose signed request started the change.";
|
|
1644
|
+
};
|
|
1645
|
+
readonly approvals: {
|
|
1646
|
+
readonly $ref: "#/$defs/KeyRoleApprovalState";
|
|
1647
|
+
readonly description: "Custody projection only.";
|
|
1648
|
+
};
|
|
1649
|
+
readonly reason: {
|
|
1650
|
+
readonly type: "string";
|
|
1651
|
+
readonly maxLength: 1024;
|
|
1652
|
+
readonly description: "Custody projection only. The operator's stated reason. Never published.";
|
|
1653
|
+
};
|
|
1654
|
+
readonly ext: {
|
|
1655
|
+
readonly $ref: "#/$defs/Ext";
|
|
1656
|
+
};
|
|
1657
|
+
readonly activatesAt: {
|
|
1658
|
+
readonly type: "string";
|
|
1659
|
+
readonly format: "date-time";
|
|
1660
|
+
readonly description: "When the successor becomes `active` and the predecessor `retiring`; never before `cacheHorizonAt`.";
|
|
1661
|
+
};
|
|
1662
|
+
readonly cacheHorizonAt: {
|
|
1663
|
+
readonly type: "string";
|
|
1664
|
+
readonly format: "date-time";
|
|
1665
|
+
readonly description: "Planned rotations: the publishing entry's cache horizon — publication plus the longer of the document's TTL and the verifier cache cap (CONVENTIONS.md §11.1). The switch, and any retirement of the predecessor, happen no earlier. Public: it follows from the log and the published cap.";
|
|
1666
|
+
};
|
|
1667
|
+
};
|
|
1668
|
+
};
|
|
1669
|
+
readonly RotationState: {
|
|
1670
|
+
readonly title: "RotationState";
|
|
1671
|
+
readonly type: "string";
|
|
1672
|
+
readonly enum: readonly ["pendingApproval", "staged", "overlapping", "completed", "aborted", "expired"];
|
|
1673
|
+
readonly description: "`pendingApproval` — awaiting the approvals the VTA's policy requires; nothing is published. `staged` — successor published, not yet used; predecessor still active. `overlapping` — successor active, predecessor `retiring`. `completed` — every predecessor retired (or, for `compromise` and `addition`, the entry is published and any overlap it began has ended). `aborted` — the successor was retired instead of the predecessor, which stayed or returned to `active`. `expired` — approvals were not gathered before the preview expired; nothing was published.";
|
|
1674
|
+
};
|
|
1675
|
+
readonly RotationKind: {
|
|
1676
|
+
readonly title: "RotationKind";
|
|
1677
|
+
readonly type: "string";
|
|
1678
|
+
readonly enum: readonly ["planned", "compromise", "addition"];
|
|
1679
|
+
readonly description: "`planned` — a successor was staged, activated, and the predecessor retired on the operator's schedule. `compromise` — a key was revoked and, where the role would otherwise be empty, replaced in the same log entry. `addition` — a key was added to a role without anything leaving it (for example a post-quantum key alongside a classical one).";
|
|
1680
|
+
};
|
|
1681
|
+
readonly KeyRole: {
|
|
1682
|
+
readonly title: "KeyRole";
|
|
1683
|
+
readonly type: "string";
|
|
1684
|
+
readonly enum: readonly ["attestation", "operational", "messaging", "update"];
|
|
1685
|
+
readonly description: "The named key role a key occupies in the DID (VTI-KEY-070 onward). `attestation` — the only keys in `assertionMethod`; sign the DID's attestation artefacts (membership and role credentials, endorsements, status lists, every other credential the node issues), through the VTA's signing service and nowhere else. Generated inside the VTA, never derived, never exportable, never in a backup. `operational` — the only keys in `authentication`; sign the node's own traffic (Trust Task requests and responses, DIDComm and TSP message signatures, invitations, notices, audit checkpoints) with proof purpose `authentication`. `messaging` — the only keys in `keyAgreement`; sign nothing. `update` — the keys that authorize appending to the DID's log (a did:webvh `updateKeys` entry) and the pre-rotation commitments that authorize the next ones; never a verification method, never in `keyRoles`. Generated inside the VTA, never derived, never exportable, never in a backup. No role permits `capabilityInvocation` or `capabilityDelegation` (VTI-KEY-075); both are reserved for a future role. The mapping is normative and is set out in CONVENTIONS.md §1. The set is an extensible registry and growing it is a MINOR change: a consumer that receives a role it does not implement MUST refuse the document rather than map the key onto a role it does know.";
|
|
1686
|
+
};
|
|
1687
|
+
readonly RoleKey: {
|
|
1688
|
+
readonly title: "RoleKey";
|
|
1689
|
+
readonly type: "object";
|
|
1690
|
+
readonly additionalProperties: false;
|
|
1691
|
+
readonly required: readonly ["role", "keyType", "publicKeyMultibase", "state"];
|
|
1692
|
+
readonly description: "One key in one role. A key is in exactly one role for its whole life; a change of role is a retirement from one and an addition to another, under a new verification-method identifier.";
|
|
1693
|
+
readonly properties: {
|
|
1694
|
+
readonly verificationMethod: {
|
|
1695
|
+
readonly type: "string";
|
|
1696
|
+
readonly minLength: 1;
|
|
1697
|
+
readonly description: "The full verification-method identifier (`did#fragment`) the document publishes the key under, and lists in `keyRoles`. Absent only for `update` keys, which are published as log parameters and never as verification methods (VTI-KEY-093). A VTA minting a new method SHOULD derive its fragment from the key (VTI-KEY-150).";
|
|
1698
|
+
};
|
|
1699
|
+
readonly role: {
|
|
1700
|
+
readonly $ref: "#/$defs/KeyRole";
|
|
1701
|
+
};
|
|
1702
|
+
readonly relationships: {
|
|
1703
|
+
readonly type: "array";
|
|
1704
|
+
readonly items: {
|
|
1705
|
+
readonly $ref: "#/$defs/DidVerificationRelationship";
|
|
1706
|
+
};
|
|
1707
|
+
readonly uniqueItems: true;
|
|
1708
|
+
readonly description: "The relationships the key is (or, while `pending`, will be) listed in. Always exactly its role's single relationship (CONVENTIONS.md §1) — carried so a caller can check it against the document rather than trusting it. Empty for `update`, `retired` and `revoked` keys.";
|
|
1709
|
+
};
|
|
1710
|
+
readonly keyType: {
|
|
1711
|
+
readonly $ref: "#/$defs/KeyType";
|
|
1712
|
+
};
|
|
1713
|
+
readonly publicKeyMultibase: {
|
|
1714
|
+
readonly type: "string";
|
|
1715
|
+
readonly minLength: 1;
|
|
1716
|
+
readonly description: "The public half, multibase-encoded, exactly as published.";
|
|
1717
|
+
};
|
|
1718
|
+
readonly state: {
|
|
1719
|
+
readonly $ref: "#/$defs/RoleKeyState";
|
|
1720
|
+
};
|
|
1721
|
+
readonly publishedInVersionId: {
|
|
1722
|
+
readonly type: "string";
|
|
1723
|
+
readonly description: "versionId of the log entry that first published the key. Absent while `pending`.";
|
|
1724
|
+
};
|
|
1725
|
+
readonly removedInVersionId: {
|
|
1726
|
+
readonly type: "string";
|
|
1727
|
+
readonly description: "versionId of the log entry that retired or revoked the key.";
|
|
1728
|
+
};
|
|
1729
|
+
readonly retireAfter: {
|
|
1730
|
+
readonly type: "string";
|
|
1731
|
+
readonly format: "date-time";
|
|
1732
|
+
readonly description: "For a `retiring` key: the end of its overlap window. Custody projection only.";
|
|
1733
|
+
};
|
|
1734
|
+
readonly compromisedSince: {
|
|
1735
|
+
readonly type: "string";
|
|
1736
|
+
readonly format: "date-time";
|
|
1737
|
+
readonly description: "For a `revoked` key: the compromise time (VTI-KEY-121) — the earliest instant from which the key is treated as compromised. Where the operator cannot establish it, the time the key was first published. Published, because it is what a verifier needs.";
|
|
1738
|
+
};
|
|
1739
|
+
readonly rotationId: {
|
|
1740
|
+
readonly type: "string";
|
|
1741
|
+
readonly description: "The rotation this key was introduced or retired by, when it was.";
|
|
1742
|
+
};
|
|
1743
|
+
readonly label: {
|
|
1744
|
+
readonly type: "string";
|
|
1745
|
+
readonly maxLength: 256;
|
|
1746
|
+
readonly description: "Operator-facing label. Custody projection only.";
|
|
1747
|
+
};
|
|
1748
|
+
readonly custody: {
|
|
1749
|
+
readonly $ref: "#/$defs/RoleKeyCustody";
|
|
1750
|
+
};
|
|
1751
|
+
readonly ext: {
|
|
1752
|
+
readonly $ref: "#/$defs/Ext";
|
|
1753
|
+
};
|
|
1754
|
+
readonly activatesAt: {
|
|
1755
|
+
readonly type: "string";
|
|
1756
|
+
readonly format: "date-time";
|
|
1757
|
+
readonly description: "For a `staged` key: when the VTA will begin using it — no earlier than the publishing entry's cache horizon (CONVENTIONS.md §11.1).";
|
|
1758
|
+
};
|
|
1759
|
+
};
|
|
1760
|
+
};
|
|
1761
|
+
readonly RoleKeyCustody: {
|
|
1762
|
+
readonly title: "RoleKeyCustody";
|
|
1763
|
+
readonly type: "object";
|
|
1764
|
+
readonly additionalProperties: false;
|
|
1765
|
+
readonly required: readonly ["keyId", "exportable", "neverExportable", "inBackups"];
|
|
1766
|
+
readonly description: "How the VTA holds a key. Present only in the custody projection. Carries no key material, and a conforming VTA MUST NOT place any in `ext`.";
|
|
1767
|
+
readonly properties: {
|
|
1768
|
+
readonly keyId: {
|
|
1769
|
+
readonly type: "string";
|
|
1770
|
+
readonly minLength: 1;
|
|
1771
|
+
readonly description: "The custodian record identifier (`keys/*`'s `keyId`) behind this key.";
|
|
1772
|
+
};
|
|
1773
|
+
readonly origin: {
|
|
1774
|
+
readonly $ref: "#/$defs/KeyOrigin";
|
|
1775
|
+
};
|
|
1776
|
+
readonly exportable: {
|
|
1777
|
+
readonly type: "boolean";
|
|
1778
|
+
readonly description: "Whether the custodian would release the private half through `keys/export-secret`. Always `false` for `attestation` and `update` keys (CONVENTIONS.md §4). Stated explicitly — never absent — because this is the member an operator reads to confirm a role key cannot leave the VTA, and `keys/*`'s absent-means-exportable reading is the wrong default to leave them to infer.";
|
|
1779
|
+
};
|
|
1780
|
+
readonly neverExportable: {
|
|
1781
|
+
readonly type: "boolean";
|
|
1782
|
+
readonly description: "True when no authority can make the key exportable — the role forbids it, or the material exists only inside a module that cannot release it. `true` implies `exportable: false`.";
|
|
1783
|
+
};
|
|
1784
|
+
readonly hardwareBacked: {
|
|
1785
|
+
readonly type: "boolean";
|
|
1786
|
+
readonly description: "True when the private half is held by a hardware or enclave module that performs the operation without releasing it. Absent means the VTA does not say, not that it is false.";
|
|
1787
|
+
};
|
|
1788
|
+
readonly inBackups: {
|
|
1789
|
+
readonly type: "boolean";
|
|
1790
|
+
readonly description: "Whether the key, or material it can be re-derived from, is included in the VTA's backups or any state transfer. Always `false` for `attestation` and `update` keys (VTI-KEY-112): they are generated, not derived, so there is no seed that recovers them, and their loss is recovered by rotation, never by restore.";
|
|
1791
|
+
};
|
|
1792
|
+
readonly destroyed: {
|
|
1793
|
+
readonly type: "boolean";
|
|
1794
|
+
readonly description: "True once the private half has been destroyed — a retired `attestation` key (VTI-KEY-125). The record survives so the key's past signatures stay attributable.";
|
|
1795
|
+
};
|
|
1796
|
+
};
|
|
1797
|
+
};
|
|
1798
|
+
readonly KeyOrigin: {
|
|
1799
|
+
readonly title: "KeyOrigin";
|
|
1800
|
+
readonly type: "string";
|
|
1801
|
+
readonly enum: readonly ["derived", "imported", "internal"];
|
|
1802
|
+
readonly description: "Where the private key came from. `derived` means the maintainer generated it from a seed it holds and can reproduce it from `derivationPath`; `imported` means it arrived from outside and exists only as stored material; `internal` means the maintainer generated it from a CSPRNG and it is reproducible from nothing at all. The distinction is operationally load-bearing: a `derived` key survives a seed restore, an `imported` one is lost unless it was backed up separately, and an `internal` one cannot be recovered by any means once the maintainer's storage is gone. This member is also the only way a consumer can confirm that a `keys/create` request for an `internal` key was honoured rather than silently downgraded to a derived one — see that specification's `internal` member.";
|
|
1803
|
+
readonly default: "derived";
|
|
1804
|
+
};
|
|
1805
|
+
readonly RoleKeyState: {
|
|
1806
|
+
readonly title: "RoleKeyState";
|
|
1807
|
+
readonly type: "string";
|
|
1808
|
+
readonly enum: readonly ["pending", "staged", "active", "retiring", "retired", "revoked"];
|
|
1809
|
+
readonly description: "Where a key is in its role's lifecycle. `pending` — planned by a preview or a change awaiting approval; not published; custody projection only. `staged` — published and bound to its role, but not yet used: a planned rotation publishes the successor and waits until the entry's cache horizon — publication plus the longer of the document's TTL and the verifier cache cap (CONVENTIONS.md §11.1) — before the VTA first uses it, so that no verifier holding a cached document sees a signature by a key it has never seen (VTI-KEY-122). Becomes `active` at the rotation's `activatesAt`. `active` — the key the VTA uses for new signatures (or, for `messaging`, advertises for new sessions). `retiring` — still published so that what it signed and sessions keyed to it keep working, but never used again: from the successor's first use the VTA MUST NOT sign with it, while a retiring `messaging` key stays usable for decryption, and senders may still encrypt to it, until it is retired (CONVENTIONS.md §11.3). `retired` — removed by planned rotation; what it signed while published remains valid, judged against the DID version current at issuance (CONVENTIONS.md §7). A retired `attestation` or `messaging` key is destroyed at retirement. `revoked` — removed from every relationship and from `keyRoles` in one entry, without overlap, because it is or may be compromised; what it signed from `compromisedSince` onward establishes nothing. `retired` and `revoked` are terminal.";
|
|
1810
|
+
};
|
|
1811
|
+
readonly DidVerificationRelationship: {
|
|
1812
|
+
readonly title: "DidVerificationRelationship";
|
|
1813
|
+
readonly type: "string";
|
|
1814
|
+
readonly enum: readonly ["authentication", "assertionMethod", "keyAgreement", "capabilityInvocation", "capabilityDelegation"];
|
|
1815
|
+
readonly description: "A DID Core verification relationship.";
|
|
1816
|
+
};
|
|
1817
|
+
readonly KeyType: {
|
|
1818
|
+
readonly title: "KeyType";
|
|
1819
|
+
readonly type: "string";
|
|
1820
|
+
readonly enum: readonly ["ed25519", "x25519", "p256", "mldsa44", "mldsa65"];
|
|
1821
|
+
readonly description: "Cryptographic algorithm the key material belongs to. `ed25519` signs (EdDSA), `x25519` performs key agreement and never signs, `p256` signs (ES256), and `mldsa44` and `mldsa65` sign with the post-quantum ML-DSA scheme of US NIST FIPS 204. The set is expected to grow as algorithms are standardised, and growing it is a MINOR change under SPEC.md §5.2: `keyType` selects no schema branch, so adding a value relaxes a constraint rather than narrowing one, and the generated libraries mark this enumeration non-exhaustive so that a consumer absorbs a new value rather than failing to compile. Two ML-DSA parameter sets are carried because two specifications require different ones — W3C Quantum-Resistant Cryptosuites defines Data Integrity suites only for ML-DSA-44, while Trust Spanning Protocol Rev 3 §8.1 mandates ML-DSA-65 — so the parameter set is chosen by whatever consumes the key and the two are not redundant. A consumer that does not implement a value it receives MUST refuse the document rather than substitute one it does support.";
|
|
1822
|
+
};
|
|
1823
|
+
readonly DidDocumentPreview: {
|
|
1824
|
+
readonly title: "DidDocumentPreview";
|
|
1825
|
+
readonly type: "object";
|
|
1826
|
+
readonly additionalProperties: false;
|
|
1827
|
+
readonly required: readonly ["previewId", "baseVersionId", "expiresAt", "changes", "document", "updateKeyRotates"];
|
|
1828
|
+
readonly description: "What a change would publish, computed by the VTA by running the handler it would run to apply it, and nothing else (CONVENTIONS.md §3.1). This is what a consent surface renders and what an approval is bound to.";
|
|
1829
|
+
readonly properties: {
|
|
1830
|
+
readonly previewId: {
|
|
1831
|
+
readonly type: "string";
|
|
1832
|
+
readonly minLength: 16;
|
|
1833
|
+
readonly description: "Opaque, unguessable identifier for this exact plan. Carried back by the apply request, and the thing every approval is bound to.";
|
|
1834
|
+
};
|
|
1835
|
+
readonly baseVersionId: {
|
|
1836
|
+
readonly type: "string";
|
|
1837
|
+
readonly description: "versionId of the log entry the plan was computed against. The plan is void once the log moves past it.";
|
|
1838
|
+
};
|
|
1839
|
+
readonly expiresAt: {
|
|
1840
|
+
readonly type: "string";
|
|
1841
|
+
readonly format: "date-time";
|
|
1842
|
+
};
|
|
1843
|
+
readonly changes: {
|
|
1844
|
+
readonly type: "array";
|
|
1845
|
+
readonly items: {
|
|
1846
|
+
readonly $ref: "#/$defs/DidDocumentChange";
|
|
1847
|
+
};
|
|
1848
|
+
readonly description: "Every change the entry would make, including the ones the caller did not ask for — in particular `rotateUpdateKey`, which accompanies every entry appended under pre-rotation.";
|
|
1849
|
+
};
|
|
1850
|
+
readonly document: {
|
|
1851
|
+
readonly type: "object";
|
|
1852
|
+
readonly description: "The complete DID document the entry would publish. Public data by construction; no key material beyond public halves.";
|
|
1853
|
+
};
|
|
1854
|
+
readonly warnings: {
|
|
1855
|
+
readonly type: "array";
|
|
1856
|
+
readonly items: {
|
|
1857
|
+
readonly type: "string";
|
|
1858
|
+
readonly enum: readonly ["preRotationDisabled", "singleKeyRole", "algorithmNotInAcceptedSet", "roleWillHaveNoClassicalKey", "attestationReissuanceRequired", "serverless"];
|
|
1859
|
+
};
|
|
1860
|
+
readonly uniqueItems: true;
|
|
1861
|
+
readonly description: "Conditions a human should be shown before approving. `preRotationDisabled` — the entry leaves no committed successor, so a later update-key compromise can only end in deactivation. `singleKeyRole` — the role will hold one active key, so its next compromise empties it until replaced. `algorithmNotInAcceptedSet` — a verifier population the VTA knows of does not accept the new key's algorithm. `roleWillHaveNoClassicalKey` — every remaining key is post-quantum, which verifiers without post-quantum support cannot check. `attestationReissuanceRequired` — revoking this `attestation` key obliges the node to re-issue every attestation artefact still in force and re-sign every status list (VTI-KEY-133). `serverless` — the VTA will not publish the entry; the operator must.";
|
|
1862
|
+
};
|
|
1863
|
+
readonly updateKeyRotates: {
|
|
1864
|
+
readonly type: "boolean";
|
|
1865
|
+
readonly description: "True when appending this entry also moves the DID's update key to a committed successor. Stated as its own member, not left to be found in `changes`, because it is the consequence a reviewer most often misses.";
|
|
1866
|
+
};
|
|
1867
|
+
};
|
|
1868
|
+
};
|
|
1869
|
+
readonly DidDocumentChange: {
|
|
1870
|
+
readonly title: "DidDocumentChange";
|
|
1871
|
+
readonly type: "object";
|
|
1872
|
+
readonly additionalProperties: false;
|
|
1873
|
+
readonly required: readonly ["op", "role"];
|
|
1874
|
+
readonly properties: {
|
|
1875
|
+
readonly op: {
|
|
1876
|
+
readonly type: "string";
|
|
1877
|
+
readonly enum: readonly ["addKey", "retireKey", "revokeKey", "rotateUpdateKey", "setPreRotation"];
|
|
1878
|
+
readonly description: "`addKey` — a verification method is added, listed in its role's relationship and in `keyRoles`. `retireKey` — a verification method leaves its relationship, `keyRoles` and the document. `revokeKey` — a verification method leaves its relationship and `keyRoles`, and the compromise is recorded (CONVENTIONS.md §7). `rotateUpdateKey` — the log's update key moves to a committed successor. `setPreRotation` — the number of successors committed changes.";
|
|
1879
|
+
};
|
|
1880
|
+
readonly role: {
|
|
1881
|
+
readonly $ref: "#/$defs/KeyRole";
|
|
1882
|
+
};
|
|
1883
|
+
readonly verificationMethod: {
|
|
1884
|
+
readonly type: "string";
|
|
1885
|
+
};
|
|
1886
|
+
readonly keyType: {
|
|
1887
|
+
readonly $ref: "#/$defs/KeyType";
|
|
1888
|
+
};
|
|
1889
|
+
readonly publicKeyMultibase: {
|
|
1890
|
+
readonly type: "string";
|
|
1891
|
+
};
|
|
1892
|
+
readonly relationships: {
|
|
1893
|
+
readonly type: "array";
|
|
1894
|
+
readonly items: {
|
|
1895
|
+
readonly $ref: "#/$defs/DidVerificationRelationship";
|
|
1896
|
+
};
|
|
1897
|
+
readonly uniqueItems: true;
|
|
1898
|
+
};
|
|
1899
|
+
readonly preRotationCount: {
|
|
1900
|
+
readonly type: "integer";
|
|
1901
|
+
readonly minimum: 0;
|
|
1902
|
+
};
|
|
1903
|
+
};
|
|
1904
|
+
};
|
|
1905
|
+
readonly KeyRoleChangeOutcome: {
|
|
1906
|
+
readonly title: "KeyRoleChangeOutcome";
|
|
1907
|
+
readonly type: "string";
|
|
1908
|
+
readonly enum: readonly ["preview", "applied", "pendingApproval"];
|
|
1909
|
+
readonly description: "`preview` — nothing was written; the response carries the plan. `applied` — the entry was appended (and published, unless `serverless`). `pendingApproval` — the plan is recorded and awaits further approvals; nothing is published until they arrive (CONVENTIONS.md §3.3).";
|
|
1910
|
+
};
|
|
1911
|
+
};
|
|
1912
|
+
};
|
|
1913
|
+
};
|
|
1914
|
+
//# sourceMappingURL=payload.d.ts.map
|