@trustlayer-foundation/aria-sdk 0.0.0-stage → 1.0.1
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/API.md +207 -0
- package/LICENSE +202 -0
- package/MIGRATION.md +86 -0
- package/README.md +153 -2
- package/dist/index.d.ts +435 -0
- package/dist/index.js +1029 -0
- package/dist/index.js.map +1 -0
- package/package.json +71 -3
- package/schemas/aid-1.0.json +394 -0
|
@@ -0,0 +1,394 @@
|
|
|
1
|
+
{
|
|
2
|
+
"$schema": "https://json-schema.org/draft/2020-12/schema",
|
|
3
|
+
"$id": "https://aria.bar/schema/aid-1.0.json",
|
|
4
|
+
"title": "ARIA Identity Document (AID) 1.0 (draft until the issuance cutover)",
|
|
5
|
+
"description": "JSON Schema for the ARIA Identity Document (AID) \u2014 a W3C Verifiable Credential (VC Data Model 2.0) that serves as the cryptographically signed identity document of an AI agent, anchored to DNS from L1. ARIA 1.0. The credential carries the agent's holder key (Ed25519, generated by the controller; the registry never holds the private half), a principal reference, the derived trust level and the scopes, and is secured by the composite mldsa65-ed25519-2026 proof. The schema is the authority: where prose and schema disagree, the schema wins.",
|
|
6
|
+
"type": "object",
|
|
7
|
+
"required": [
|
|
8
|
+
"@context",
|
|
9
|
+
"type",
|
|
10
|
+
"id",
|
|
11
|
+
"issuer",
|
|
12
|
+
"validFrom",
|
|
13
|
+
"validUntil",
|
|
14
|
+
"credentialSubject",
|
|
15
|
+
"credentialStatus",
|
|
16
|
+
"proof"
|
|
17
|
+
],
|
|
18
|
+
"properties": {
|
|
19
|
+
"@context": {
|
|
20
|
+
"type": "array",
|
|
21
|
+
"items": {
|
|
22
|
+
"type": "string",
|
|
23
|
+
"format": "uri"
|
|
24
|
+
},
|
|
25
|
+
"minItems": 2,
|
|
26
|
+
"prefixItems": [
|
|
27
|
+
{
|
|
28
|
+
"const": "https://www.w3.org/ns/credentials/v2"
|
|
29
|
+
},
|
|
30
|
+
{
|
|
31
|
+
"const": "https://aria.bar/ns/v1"
|
|
32
|
+
}
|
|
33
|
+
],
|
|
34
|
+
"description": "JSON-LD context. Must include the W3C VC v2 context and the ARIA v1 context."
|
|
35
|
+
},
|
|
36
|
+
"type": {
|
|
37
|
+
"type": "array",
|
|
38
|
+
"items": {
|
|
39
|
+
"type": "string"
|
|
40
|
+
},
|
|
41
|
+
"minItems": 2,
|
|
42
|
+
"contains": {
|
|
43
|
+
"const": "VerifiableCredential"
|
|
44
|
+
},
|
|
45
|
+
"prefixItems": [
|
|
46
|
+
{
|
|
47
|
+
"const": "VerifiableCredential"
|
|
48
|
+
},
|
|
49
|
+
{
|
|
50
|
+
"const": "ARIAIdentityDocument"
|
|
51
|
+
}
|
|
52
|
+
],
|
|
53
|
+
"description": "Credential type. Must include VerifiableCredential and ARIAIdentityDocument."
|
|
54
|
+
},
|
|
55
|
+
"id": {
|
|
56
|
+
"type": "string",
|
|
57
|
+
"format": "uri",
|
|
58
|
+
"pattern": "^https://api\\.aria\\.bar/v1/credentials/[0-9a-f]{8}-[0-9a-f]{4}-7[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$",
|
|
59
|
+
"description": "Unique credential-instance identifier per W3C VC 2.0 \u00a74.4 \u2014 a dereferenceable URL containing a UUIDv7 (RFC 9562). NOT the agent DID (the DID lives in credentialSubject.id). Each issuance produces a new id; the URL resolves to that specific signed instance, active or revoked. Equivalent to a TLS certificate serial number."
|
|
60
|
+
},
|
|
61
|
+
"issuer": {
|
|
62
|
+
"type": "string",
|
|
63
|
+
"pattern": "^did:aria:.+$",
|
|
64
|
+
"description": "The DID of the issuing registry. Typically did:aria:registry.aria.bar."
|
|
65
|
+
},
|
|
66
|
+
"validFrom": {
|
|
67
|
+
"type": "string",
|
|
68
|
+
"format": "date-time",
|
|
69
|
+
"description": "ISO 8601 datetime when the credential becomes valid."
|
|
70
|
+
},
|
|
71
|
+
"validUntil": {
|
|
72
|
+
"type": "string",
|
|
73
|
+
"format": "date-time",
|
|
74
|
+
"description": "ISO 8601 datetime when the credential expires. Maximum 1-year validity from issuance."
|
|
75
|
+
},
|
|
76
|
+
"credentialStatus": {
|
|
77
|
+
"type": "object",
|
|
78
|
+
"required": [
|
|
79
|
+
"id",
|
|
80
|
+
"type",
|
|
81
|
+
"statusPurpose",
|
|
82
|
+
"statusListIndex",
|
|
83
|
+
"statusListCredential"
|
|
84
|
+
],
|
|
85
|
+
"properties": {
|
|
86
|
+
"id": {
|
|
87
|
+
"type": "string",
|
|
88
|
+
"format": "uri",
|
|
89
|
+
"description": "URI identifying the status entry. Format: <statusListCredential>#<index>."
|
|
90
|
+
},
|
|
91
|
+
"type": {
|
|
92
|
+
"type": "string",
|
|
93
|
+
"const": "BitstringStatusListEntry",
|
|
94
|
+
"description": "W3C Bitstring Status List v1.0 entry type."
|
|
95
|
+
},
|
|
96
|
+
"statusPurpose": {
|
|
97
|
+
"type": "string",
|
|
98
|
+
"const": "revocation",
|
|
99
|
+
"description": "Purpose of the status check. Always 'revocation' for AID documents."
|
|
100
|
+
},
|
|
101
|
+
"statusListIndex": {
|
|
102
|
+
"type": "string",
|
|
103
|
+
"pattern": "^[0-9]+$",
|
|
104
|
+
"description": "Index position in the status list bitstring."
|
|
105
|
+
},
|
|
106
|
+
"statusListCredential": {
|
|
107
|
+
"type": "string",
|
|
108
|
+
"format": "uri",
|
|
109
|
+
"description": "URI of the StatusList credential containing the bitstring."
|
|
110
|
+
}
|
|
111
|
+
},
|
|
112
|
+
"additionalProperties": false,
|
|
113
|
+
"description": "W3C Bitstring Status List v1.0 revocation entry."
|
|
114
|
+
},
|
|
115
|
+
"credentialSubject": {
|
|
116
|
+
"type": "object",
|
|
117
|
+
"required": [
|
|
118
|
+
"id",
|
|
119
|
+
"agentName",
|
|
120
|
+
"version",
|
|
121
|
+
"trustLevel",
|
|
122
|
+
"scope",
|
|
123
|
+
"delegationDepth",
|
|
124
|
+
"maxDelegationDepth",
|
|
125
|
+
"spec_version",
|
|
126
|
+
"principal",
|
|
127
|
+
"holderKey",
|
|
128
|
+
"enrollmentAttestation"
|
|
129
|
+
],
|
|
130
|
+
"properties": {
|
|
131
|
+
"id": {
|
|
132
|
+
"type": "string",
|
|
133
|
+
"pattern": "^did:aria:[a-zA-Z0-9.-]+:[a-zA-Z0-9-]+(:[a-zA-Z0-9-]+)?$",
|
|
134
|
+
"description": "The DID of the agent. Stable across reissuances. Two acceptable formats: did:aria:{verified-domain}:{agent-name} when the principal organization has DNS-verified its own domain, OR did:aria:{registry-host}:{principal-short-id}:{agent-name} when the agent lives under the registry-namespaced fallback (e.g. did:aria:aria.bar:u-abc12345:ordering-agent). The unique per-issuance identifier lives at the top-level 'id' field per W3C VC 2.0."
|
|
135
|
+
},
|
|
136
|
+
"previousCredentialId": {
|
|
137
|
+
"type": "string",
|
|
138
|
+
"format": "uri",
|
|
139
|
+
"pattern": "^https://api\\.aria\\.bar/v1/credentials/[0-9a-f]{8}-[0-9a-f]{4}-7[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$",
|
|
140
|
+
"description": "Optional. URL of the previous credential instance for this DID \u2014 set when this AID supersedes an earlier one. Enables chain-of-issuance traceability. Omitted on first issuance. The URL resolves to the predecessor's signed AID document (which by then is revoked in the StatusList)."
|
|
141
|
+
},
|
|
142
|
+
"holderKey": {
|
|
143
|
+
"type": "object",
|
|
144
|
+
"required": [
|
|
145
|
+
"id",
|
|
146
|
+
"type",
|
|
147
|
+
"publicKeyMultibase"
|
|
148
|
+
],
|
|
149
|
+
"properties": {
|
|
150
|
+
"id": {
|
|
151
|
+
"type": "string",
|
|
152
|
+
"pattern": "^did:aria:[a-zA-Z0-9.-]+:[a-zA-Z0-9-]+(:[a-zA-Z0-9-]+)?#holder-key-[0-9]+$",
|
|
153
|
+
"description": "DID URL identifying this holder key. Format: <agentDID>#holder-key-<n> where n is monotonically increasing per re-issuance."
|
|
154
|
+
},
|
|
155
|
+
"type": {
|
|
156
|
+
"type": "string",
|
|
157
|
+
"const": "Ed25519VerificationKey2020",
|
|
158
|
+
"description": "W3C verification method type. Always Ed25519VerificationKey2020 for ARIA 1.0."
|
|
159
|
+
},
|
|
160
|
+
"publicKeyMultibase": {
|
|
161
|
+
"type": "string",
|
|
162
|
+
"pattern": "^z[1-9A-HJ-NP-Za-km-z]+$",
|
|
163
|
+
"description": "'z' + base58btc of the raw 32-byte Ed25519 public key. This is ARIA's own encoding, not Multikey (whose form of the same key adds the 0xed01 prefix). The agent generates the key pair and submits only the public key; no registry or authority ever holds the private key."
|
|
164
|
+
}
|
|
165
|
+
},
|
|
166
|
+
"additionalProperties": false,
|
|
167
|
+
"description": "Holder verification key (Ed25519) bound to this AID. Possession is proved by signing with the corresponding private key: under ARIA AP, every request is signed with it. Verifiers MUST extract this key from the SIGNED credentialSubject \u2014 never from external sources such as the registry database \u2014 to preserve the PQC integrity guarantee. Re-issuance uses the key pair the agent submits for it; old holder proofs remain verifiable against superseded AIDs but not against the current one."
|
|
168
|
+
},
|
|
169
|
+
"agentName": {
|
|
170
|
+
"type": "string",
|
|
171
|
+
"minLength": 1,
|
|
172
|
+
"maxLength": 64,
|
|
173
|
+
"pattern": "^[a-zA-Z0-9][a-zA-Z0-9-]*[a-zA-Z0-9]$|^[a-zA-Z0-9]$",
|
|
174
|
+
"description": "Human-readable agent name. 1-64 characters, alphanumeric and hyphens only. Must start and end with an alphanumeric character."
|
|
175
|
+
},
|
|
176
|
+
"version": {
|
|
177
|
+
"type": "string",
|
|
178
|
+
"pattern": "^(0|[1-9]\\d*)\\.(0|[1-9]\\d*)\\.(0|[1-9]\\d*)(?:-((?:0|[1-9]\\d*|\\d*[a-zA-Z-][0-9a-zA-Z-]*)(?:\\.(?:0|[1-9]\\d*|\\d*[a-zA-Z-][0-9a-zA-Z-]*))*))?(?:\\+([0-9a-zA-Z-]+(?:\\.[0-9a-zA-Z-]+)*))?$",
|
|
179
|
+
"description": "Semantic version of the agent software."
|
|
180
|
+
},
|
|
181
|
+
"trustLevel": {
|
|
182
|
+
"type": "string",
|
|
183
|
+
"enum": [
|
|
184
|
+
"L0",
|
|
185
|
+
"L1",
|
|
186
|
+
"L2",
|
|
187
|
+
"L3"
|
|
188
|
+
],
|
|
189
|
+
"description": "Trust level assigned to the agent. L0=Anchored, L1=Identified, L2=Certified, L3=Sovereign."
|
|
190
|
+
},
|
|
191
|
+
"scope": {
|
|
192
|
+
"type": "array",
|
|
193
|
+
"items": {
|
|
194
|
+
"type": "string",
|
|
195
|
+
"pattern": "^[a-z][a-z0-9_]*:[a-z][a-z0-9_]*(:[a-z][a-z0-9_]*)*$",
|
|
196
|
+
"description": "Scope in ARIA namespace format: namespace:resource:action."
|
|
197
|
+
},
|
|
198
|
+
"minItems": 1,
|
|
199
|
+
"uniqueItems": true,
|
|
200
|
+
"description": "The scopes the agent declared at enrollment: what it intends to do. Each receiver decides whether to admit them; a scope here grants nothing by itself."
|
|
201
|
+
},
|
|
202
|
+
"hitlRequired": {
|
|
203
|
+
"type": "array",
|
|
204
|
+
"items": {
|
|
205
|
+
"type": "string"
|
|
206
|
+
},
|
|
207
|
+
"uniqueItems": true,
|
|
208
|
+
"description": "Scopes, among those declared, whose operations need a person's approval. Under ARIA AP a receiver refuses such an operation when no valid approval accompanies it; it does not hold the operation waiting."
|
|
209
|
+
},
|
|
210
|
+
"delegationDepth": {
|
|
211
|
+
"type": "integer",
|
|
212
|
+
"minimum": 0,
|
|
213
|
+
"maximum": 4,
|
|
214
|
+
"description": "Current delegation depth. 0 means directly issued by the principal."
|
|
215
|
+
},
|
|
216
|
+
"maxDelegationDepth": {
|
|
217
|
+
"type": "integer",
|
|
218
|
+
"minimum": 0,
|
|
219
|
+
"maximum": 4,
|
|
220
|
+
"description": "Maximum allowed delegation depth for further sub-delegations."
|
|
221
|
+
},
|
|
222
|
+
"spec_version": {
|
|
223
|
+
"type": "string",
|
|
224
|
+
"const": "1.0",
|
|
225
|
+
"description": "ARIA specification version. Must be '1.0' for credentials issued under ARIA 1.0. The issuance regime is distinguished by the issuer DID, not by this value."
|
|
226
|
+
},
|
|
227
|
+
"principal": {
|
|
228
|
+
"type": "object",
|
|
229
|
+
"required": [
|
|
230
|
+
"did",
|
|
231
|
+
"jurisdiction",
|
|
232
|
+
"verificationStatus"
|
|
233
|
+
],
|
|
234
|
+
"properties": {
|
|
235
|
+
"type": {
|
|
236
|
+
"type": "string",
|
|
237
|
+
"enum": [
|
|
238
|
+
"Person",
|
|
239
|
+
"Organization"
|
|
240
|
+
],
|
|
241
|
+
"description": "Kind of principal, as a schema.org type: Person for a natural person, Organization for any legal entity. A Person principal carries no legalName, because the public AID never carries a natural person's name (COM-09). When absent \u2014 credentials issued before this field existed \u2014 legalName is required, as it always was."
|
|
242
|
+
},
|
|
243
|
+
"did": {
|
|
244
|
+
"type": "string",
|
|
245
|
+
"description": "DID of the principal (legal entity or person) on whose behalf the agent operates."
|
|
246
|
+
},
|
|
247
|
+
"legalName": {
|
|
248
|
+
"type": "string",
|
|
249
|
+
"minLength": 1,
|
|
250
|
+
"maxLength": 256,
|
|
251
|
+
"description": "Legal name of the principal ORGANIZATION. Required when type is Organization or absent; MUST be absent when type is Person, because the public AID never carries a natural person's name (COM-09, L0-03). At L0 the name is registrant-asserted and verificationStatus says so. A natural-person principal whose document carries its name here is non-conformant, and a validator now rejects it once type is set."
|
|
252
|
+
},
|
|
253
|
+
"jurisdiction": {
|
|
254
|
+
"type": "string",
|
|
255
|
+
"pattern": "^[A-Z]{2}$",
|
|
256
|
+
"description": "ISO 3166-1 alpha-2 country code of the principal's legal jurisdiction."
|
|
257
|
+
},
|
|
258
|
+
"verificationStatus": {
|
|
259
|
+
"type": "string",
|
|
260
|
+
"enum": [
|
|
261
|
+
"self-declared",
|
|
262
|
+
"registry-confirmed",
|
|
263
|
+
"legal-verified"
|
|
264
|
+
],
|
|
265
|
+
"description": "Machine-readable provenance of the principal's declared identity \u2014 of legalName, for an Organization. self-declared: registrant-asserted, no external check (L0, L1). registry-confirmed: confirmed against the Authoritative Source of the jurisdiction of incorporation (L2). legal-verified: backed by government-issued legal documents and admin review (L3). Verifiers MUST consult this field before treating legalName as authoritative."
|
|
266
|
+
}
|
|
267
|
+
},
|
|
268
|
+
"if": {
|
|
269
|
+
"required": [
|
|
270
|
+
"type"
|
|
271
|
+
],
|
|
272
|
+
"properties": {
|
|
273
|
+
"type": {
|
|
274
|
+
"const": "Person"
|
|
275
|
+
}
|
|
276
|
+
}
|
|
277
|
+
},
|
|
278
|
+
"then": {
|
|
279
|
+
"not": {
|
|
280
|
+
"required": [
|
|
281
|
+
"legalName"
|
|
282
|
+
]
|
|
283
|
+
}
|
|
284
|
+
},
|
|
285
|
+
"else": {
|
|
286
|
+
"required": [
|
|
287
|
+
"legalName"
|
|
288
|
+
]
|
|
289
|
+
},
|
|
290
|
+
"additionalProperties": false,
|
|
291
|
+
"description": "The legal principal (organization or person) responsible for the agent."
|
|
292
|
+
},
|
|
293
|
+
"dnsAnchor": {
|
|
294
|
+
"type": "string",
|
|
295
|
+
"description": "DNS TXT record content anchoring this AID to the principal's domain. Format: v=ARIA1;id=<did>;h=sha256:<hash>;r=<resolution-url>."
|
|
296
|
+
},
|
|
297
|
+
"alsoKnownAs": {
|
|
298
|
+
"type": "array",
|
|
299
|
+
"items": {
|
|
300
|
+
"type": "string",
|
|
301
|
+
"format": "uri",
|
|
302
|
+
"pattern": "^did:[a-z0-9]+:.+$"
|
|
303
|
+
},
|
|
304
|
+
"uniqueItems": true,
|
|
305
|
+
"maxItems": 5,
|
|
306
|
+
"description": "Optional. External DIDs the agent declared at enrollment as alternative identifiers, per W3C DID Core \u00a75.1.2. In ARIA 1.0 each entry was syntactically validated AND verified for proof-of-control at enrollment time (the principal signed a session-bound challenge from the external DID's key). However, this field is DORMANT for trust decisions in ARIA 1.0: verifiers MUST NOT treat alsoKnownAs entries as authoritative when evaluating trust level, scope authority, or principal identity. The field is preserved in the AID for forward compatibility \u2014 activation of cross-method interop and the DID-method allow-list is on the roadmap of a later revision."
|
|
307
|
+
},
|
|
308
|
+
"enrollmentAttestation": {
|
|
309
|
+
"type": "object",
|
|
310
|
+
"required": [
|
|
311
|
+
"userAgentAgreement",
|
|
312
|
+
"attestedAt",
|
|
313
|
+
"termsVersion",
|
|
314
|
+
"privacyVersion"
|
|
315
|
+
],
|
|
316
|
+
"properties": {
|
|
317
|
+
"userAgentAgreement": {
|
|
318
|
+
"type": "boolean",
|
|
319
|
+
"const": true,
|
|
320
|
+
"description": "Always true in a valid AID. Confirms that issuance occurred through the authenticated enrollment flow defined in ARIA Spec ARIA 1.0 \u00a7Enrollment: (a) the principal initiated the enrollment from an authenticated registry session, (b) an SDK on the agent's infrastructure generated a composite keypair locally and self-signed an enrollment manifest, (c) DNS proof-of-control was verified for trust levels L1+, (d) the principal confirmed the manifest contents and authorized issuance with a fresh second factor. Implicit acceptance of the Terms of Service and Privacy Policy versions referenced below."
|
|
321
|
+
},
|
|
322
|
+
"attestedAt": {
|
|
323
|
+
"type": "string",
|
|
324
|
+
"format": "date-time",
|
|
325
|
+
"description": "ISO 8601 timestamp of the admin's second-factor confirmation that authorized signing this AID. Anchors the contractual moment of issuance. Must equal or precede the top-level validFrom timestamp; registry rejects on inversion."
|
|
326
|
+
},
|
|
327
|
+
"termsVersion": {
|
|
328
|
+
"type": "string",
|
|
329
|
+
"pattern": "^[0-9]+\\.[0-9]+\\.[0-9]+$",
|
|
330
|
+
"description": "Semantic version of the Terms of Service the principal accepted at enrollment. Resolves to the immutable document at https://aria.bar/terms/{termsVersion}. CRITICAL: this is the version the principal LAST ACCEPTED, NOT the registry's current version at issuance time. Preserves legal traceability across non-breaking ToS updates: if the registry advances to a newer minor/patch version without forcing re-acceptance, AIDs continue to embed the version the principal actually saw and accepted."
|
|
331
|
+
},
|
|
332
|
+
"privacyVersion": {
|
|
333
|
+
"type": "string",
|
|
334
|
+
"pattern": "^[0-9]+\\.[0-9]+\\.[0-9]+$",
|
|
335
|
+
"description": "Semantic version of the Privacy Policy the principal accepted at enrollment. Same last-accepted semantics as termsVersion. Resolves to https://aria.bar/privacy/{privacyVersion}."
|
|
336
|
+
}
|
|
337
|
+
},
|
|
338
|
+
"additionalProperties": false,
|
|
339
|
+
"description": "Declarative attestation embedded in the AID confirming that issuance occurred through the authenticated enrollment flow. Constitutes the documentary evidence of the bilateral contract between the principal and TrustLayer Foundation under applicable electronic-signature law (Mexico CCF Art. 1834-bis, EU eIDAS Regulation 910/2014, US E-SIGN Act / UETA, UK Electronic Communications Act 2000, and equivalents). Does NOT duplicate or replace the authoritative audit log; it surfaces the legally-relevant facts (terms version, privacy version, attestation timestamp) in-band so verifiers can resolve them without registry round-trips."
|
|
340
|
+
}
|
|
341
|
+
},
|
|
342
|
+
"additionalProperties": false,
|
|
343
|
+
"description": "The subject of the credential \u2014 the AI agent and its attributes, including the holder verification key required for proof-of-possession and the enrollment attestation establishing the legal frame of issuance."
|
|
344
|
+
},
|
|
345
|
+
"proof": {
|
|
346
|
+
"type": "object",
|
|
347
|
+
"required": [
|
|
348
|
+
"type",
|
|
349
|
+
"cryptosuite",
|
|
350
|
+
"created",
|
|
351
|
+
"proofPurpose",
|
|
352
|
+
"verificationMethod",
|
|
353
|
+
"proofValue"
|
|
354
|
+
],
|
|
355
|
+
"properties": {
|
|
356
|
+
"type": {
|
|
357
|
+
"type": "string",
|
|
358
|
+
"const": "DataIntegrityProof",
|
|
359
|
+
"description": "W3C Data Integrity proof type."
|
|
360
|
+
},
|
|
361
|
+
"cryptosuite": {
|
|
362
|
+
"type": "string",
|
|
363
|
+
"const": "mldsa65-ed25519-2026",
|
|
364
|
+
"description": "Composite cryptographic suite: ML-DSA-65 (post-quantum, FIPS 204) + Ed25519 (classical)."
|
|
365
|
+
},
|
|
366
|
+
"created": {
|
|
367
|
+
"type": "string",
|
|
368
|
+
"format": "date-time",
|
|
369
|
+
"description": "ISO 8601 datetime when the proof was created."
|
|
370
|
+
},
|
|
371
|
+
"proofPurpose": {
|
|
372
|
+
"type": "string",
|
|
373
|
+
"const": "assertionMethod",
|
|
374
|
+
"description": "The purpose of the proof. Always 'assertionMethod' for AID issuance."
|
|
375
|
+
},
|
|
376
|
+
"verificationMethod": {
|
|
377
|
+
"type": "string",
|
|
378
|
+
"pattern": "^did:aria:.+#.+$",
|
|
379
|
+
"description": "DID URL of the verification key used to create the proof."
|
|
380
|
+
},
|
|
381
|
+
"proofValue": {
|
|
382
|
+
"type": "string",
|
|
383
|
+
"description": "Composite signature (ML-DSA-65 + Ed25519) over the canonicalized credential (with proof stripped), as multibase base64url: the prefix \"u\" then unpadded base64url of u32be(pq_len) then the ML-DSA-65 signature then the Ed25519 one. The VC v2 context types this property as sec:multibase, so the prefix is part of the value. Credentials issued before the 1.0 cutover carry the same bytes with no prefix and remain valid; a verifier accepts both and decides between them by the length header, not the first character. Critically, the signature covers credentialSubject.holderKey, which is what stops anyone but the registry substituting a key.",
|
|
384
|
+
"pattern": "^u?[A-Za-z0-9_-]+$"
|
|
385
|
+
}
|
|
386
|
+
},
|
|
387
|
+
"additionalProperties": false,
|
|
388
|
+
"description": "W3C Data Integrity proof containing the composite post-quantum + classical signature."
|
|
389
|
+
}
|
|
390
|
+
},
|
|
391
|
+
"additionalProperties": false,
|
|
392
|
+
"_comment": "Illustrative and normative for shape only. The legalName rule above is enforced at issuance, not by this file. Credentials issued before the cutover declare their own spec_version and validate against the schema they were issued under; see schema/aid-v1.2.json.",
|
|
393
|
+
"_status": "DRAFT until the issuance cutover. No credential declares spec_version 1.0 yet, and the Verification Requirements this shape serves are still v1.3-draft, pending adoption by TrustLayer Foundation with ten decisions open. Fields already planned \u2014 a designated successor principal among them \u2014 have no place here. Because credentialSubject declares additionalProperties false, adding one later means a new schema file and a new spec_version, so this file is published to be reviewed and implemented against, not to be frozen. It freezes on the day the first credential declares 1.0."
|
|
394
|
+
}
|