@agentunion/fastaun 0.5.17 → 0.5.19
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 +83 -0
- package/_packed_docs/CHANGELOG.md +83 -0
- package/_packed_docs/INDEX.md +163 -16
- package/_packed_docs/KITE_DOCS_GUIDE.md +52 -20
- package/_packed_docs/agent.md/SCHEMA.md +266 -207
- package/_packed_docs/aun/345/210/206/345/270/203/345/274/217/346/265/213/350/257/225/350/277/220/350/241/214/346/214/207/345/215/227.md +64 -31
- package/_packed_docs/aun/346/265/213/350/257/225/350/277/220/350/241/214/346/214/207/345/215/227.md +8 -6
- package/_packed_docs/protocol/01-/350/272/253/344/273/275/344/270/216/345/207/255/350/257/201/345/215/217/350/256/256-auth.md +39 -39
- package/_packed_docs/protocol/07-/351/224/231/350/257/257/347/240/201/344/270/216/347/212/266/346/200/201/346/234/272.md +1 -1
- package/_packed_docs/protocol/10-Group-/345/255/220/345/215/217/350/256/256.md +28 -9
- package/_packed_docs/protocol/11-Storage-/345/255/220/345/215/217/350/256/256.md +20 -2
- package/_packed_docs/protocol/agent.md/SCHEMA.md +4 -0
- package/_packed_docs/sdk/04-/350/277/236/346/216/245/344/270/216/350/256/244/350/257/201.md +5 -2
- package/_packed_docs/sdk/06-API/346/211/213/345/206/214.md +246 -241
- package/_packed_docs/sdk/09-group-rpc-manual.md +46 -14
- package/_packed_docs/sdk/09-message-rpc-manual.md +40 -2
- package/_packed_docs/sdk/09-storage-rpc-manual.md +69 -38
- package/_packed_docs/sdk/AUN_DOCS_GUIDE.md +25 -5
- package/_packed_docs/sdk/INDEX.md +78 -18
- package/dist/agent-md-schema.d.ts +2 -0
- package/dist/agent-md-schema.js +46 -9
- package/dist/agent-md-schema.js.map +1 -1
- package/dist/agent-md.d.ts +46 -1
- package/dist/agent-md.js +492 -30
- package/dist/agent-md.js.map +1 -1
- package/dist/aid-store.d.ts +9 -1
- package/dist/aid-store.js +139 -18
- package/dist/aid-store.js.map +1 -1
- package/dist/aid.d.ts +17 -1
- package/dist/aid.js +67 -7
- package/dist/aid.js.map +1 -1
- package/dist/auth.d.ts +6 -1
- package/dist/auth.js +428 -15
- package/dist/auth.js.map +1 -1
- package/dist/cert-utils.d.ts +1 -1
- package/dist/cert-utils.js +19 -7
- package/dist/cert-utils.js.map +1 -1
- package/dist/client/delivery.d.ts +4 -1
- package/dist/client/delivery.js +264 -68
- package/dist/client/delivery.js.map +1 -1
- package/dist/client/rpc-pipeline.js +29 -14
- package/dist/client/rpc-pipeline.js.map +1 -1
- package/dist/client/v2-e2ee.d.ts +8 -1
- package/dist/client/v2-e2ee.js +893 -529
- package/dist/client/v2-e2ee.js.map +1 -1
- package/dist/client.d.ts +87 -1
- package/dist/client.js +816 -35
- package/dist/client.js.map +1 -1
- package/dist/errors.js +4 -3
- package/dist/errors.js.map +1 -1
- package/dist/events.d.ts +5 -1
- package/dist/events.js +47 -6
- package/dist/events.js.map +1 -1
- package/dist/facades.d.ts +85 -3
- package/dist/facades.js +104 -4
- package/dist/facades.js.map +1 -1
- package/dist/index.d.ts +9 -4
- package/dist/index.js +3 -1
- package/dist/index.js.map +1 -1
- package/dist/keystore/aid-db.d.ts +5 -0
- package/dist/keystore/aid-db.js +48 -0
- package/dist/keystore/aid-db.js.map +1 -1
- package/dist/keystore/index.d.ts +8 -0
- package/dist/keystore/local-identity-store.js +10 -3
- package/dist/keystore/local-identity-store.js.map +1 -1
- package/dist/keystore/local-token-store.d.ts +6 -1
- package/dist/keystore/local-token-store.js +24 -1
- package/dist/keystore/local-token-store.js.map +1 -1
- package/dist/org-protocol.d.ts +98 -0
- package/dist/org-protocol.js +1689 -0
- package/dist/org-protocol.js.map +1 -0
- package/dist/ownership-proof.d.ts +117 -0
- package/dist/ownership-proof.js +436 -0
- package/dist/ownership-proof.js.map +1 -0
- package/dist/ownership-v21.d.ts +178 -0
- package/dist/ownership-v21.js +635 -0
- package/dist/ownership-v21.js.map +1 -0
- package/dist/ownership-workflow.d.ts +82 -0
- package/dist/ownership-workflow.js +872 -0
- package/dist/ownership-workflow.js.map +1 -0
- package/dist/seq-tracker.d.ts +1 -0
- package/dist/seq-tracker.js +10 -1
- package/dist/seq-tracker.js.map +1 -1
- package/dist/tools/cross-sdk-agent.d.ts +89 -1
- package/dist/tools/cross-sdk-agent.js +338 -7
- package/dist/tools/cross-sdk-agent.js.map +1 -1
- package/dist/transport.d.ts +7 -0
- package/dist/transport.js +108 -4
- package/dist/transport.js.map +1 -1
- package/dist/v2/e2ee/decrypt.d.ts +1 -0
- package/dist/v2/e2ee/decrypt.js +9 -1
- package/dist/v2/e2ee/decrypt.js.map +1 -1
- package/dist/version.d.ts +1 -1
- package/dist/version.js +1 -1
- package/package.json +8 -8
|
@@ -0,0 +1,436 @@
|
|
|
1
|
+
import { createCipheriv, createDecipheriv, createHash, pbkdf2Sync, randomBytes, X509Certificate } from 'node:crypto';
|
|
2
|
+
import { canonicalJson } from './v2/crypto/canonical.js';
|
|
3
|
+
import { validateAIDFormat } from './validators.js';
|
|
4
|
+
import { isStrictBase64, verifySignatureWithCert, certFingerprint, certCommonName } from './cert-utils.js';
|
|
5
|
+
import { ValidationError } from './errors.js';
|
|
6
|
+
export const OWNERSHIP_RELATION_DOMAIN = 'AUN-AID-OWNER-RELATION-V1;';
|
|
7
|
+
export const OWNERSHIP_RELEASE_DOMAIN = 'AUN-AID-OWNER-RELEASE-V1;';
|
|
8
|
+
export const OWNERSHIP_MESSAGE_TYPE = 'aun.ownership.v1';
|
|
9
|
+
export const CERT_ESCROW_VERSION = 1;
|
|
10
|
+
export const CERT_ESCROW_ITERATIONS = 200_000;
|
|
11
|
+
export const CERT_ESCROW_AAD = Buffer.from('AUN-CERT-ESCROW-V1', 'utf8');
|
|
12
|
+
const PROOF_ID_RE = /^[0-9a-f]{8}-[0-9a-f]{4}-4[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/;
|
|
13
|
+
const FINGERPRINT_RE = /^sha256:[0-9a-f]{64}$/i;
|
|
14
|
+
function encryptEscrowBytes(plaintext, password) {
|
|
15
|
+
if (!plaintext.length)
|
|
16
|
+
throw new ValidationError('certificate escrow plaintext is empty');
|
|
17
|
+
const secret = String(password ?? '').trim() || randomBytes(24).toString('base64url');
|
|
18
|
+
const salt = randomBytes(16);
|
|
19
|
+
const nonce = randomBytes(12);
|
|
20
|
+
const key = pbkdf2Sync(Buffer.from(secret, 'utf8'), salt, CERT_ESCROW_ITERATIONS, 32, 'sha256');
|
|
21
|
+
const cipher = createCipheriv('aes-256-gcm', key, nonce);
|
|
22
|
+
cipher.setAAD(CERT_ESCROW_AAD);
|
|
23
|
+
const ciphertext = Buffer.concat([cipher.update(plaintext), cipher.final(), cipher.getAuthTag()]);
|
|
24
|
+
return {
|
|
25
|
+
envelope: { version: CERT_ESCROW_VERSION, alg: 'AES-256-GCM', kdf: 'PBKDF2-SHA256', iterations: CERT_ESCROW_ITERATIONS, salt: salt.toString('base64'), nonce: nonce.toString('base64'), ciphertext: ciphertext.toString('base64'), sha256: createHash('sha256').update(plaintext).digest('hex') },
|
|
26
|
+
password: secret,
|
|
27
|
+
};
|
|
28
|
+
}
|
|
29
|
+
function decryptEscrowBytes(envelope, password) {
|
|
30
|
+
if (!envelope || envelope.version !== CERT_ESCROW_VERSION || envelope.alg !== 'AES-256-GCM' || envelope.kdf !== 'PBKDF2-SHA256' || envelope.iterations !== CERT_ESCROW_ITERATIONS)
|
|
31
|
+
throw new ValidationError('unsupported certificate escrow envelope');
|
|
32
|
+
const salt = Buffer.from(String(envelope.salt ?? ''), 'base64');
|
|
33
|
+
const nonce = Buffer.from(String(envelope.nonce ?? ''), 'base64');
|
|
34
|
+
const ciphertext = Buffer.from(String(envelope.ciphertext ?? ''), 'base64');
|
|
35
|
+
if (salt.length !== 16 || nonce.length !== 12 || ciphertext.length <= 16)
|
|
36
|
+
throw new ValidationError('invalid certificate escrow fields');
|
|
37
|
+
const key = pbkdf2Sync(Buffer.from(String(password ?? ''), 'utf8'), salt, CERT_ESCROW_ITERATIONS, 32, 'sha256');
|
|
38
|
+
const tag = ciphertext.subarray(ciphertext.length - 16);
|
|
39
|
+
const cipher = createDecipheriv('aes-256-gcm', key, nonce);
|
|
40
|
+
cipher.setAAD(CERT_ESCROW_AAD);
|
|
41
|
+
cipher.setAuthTag(tag);
|
|
42
|
+
let plaintext;
|
|
43
|
+
try {
|
|
44
|
+
plaintext = Buffer.concat([cipher.update(ciphertext.subarray(0, -16)), cipher.final()]);
|
|
45
|
+
}
|
|
46
|
+
catch (error) {
|
|
47
|
+
throw new ValidationError(`certificate escrow decryption failed: ${String(error)}`);
|
|
48
|
+
}
|
|
49
|
+
if (createHash('sha256').update(plaintext).digest('hex') !== String(envelope.sha256 ?? '').toLowerCase())
|
|
50
|
+
throw new ValidationError('certificate escrow hash mismatch');
|
|
51
|
+
return plaintext;
|
|
52
|
+
}
|
|
53
|
+
export function encryptCertificate(certPem, password) {
|
|
54
|
+
return encryptEscrowBytes(Buffer.from(String(certPem ?? ''), 'utf8'), password);
|
|
55
|
+
}
|
|
56
|
+
export function decryptCertificate(envelope, password) {
|
|
57
|
+
return decryptEscrowBytes(envelope, password).toString('utf8');
|
|
58
|
+
}
|
|
59
|
+
export function encryptIdentity(identity, password) {
|
|
60
|
+
if (!identity || typeof identity !== 'object' || Array.isArray(identity))
|
|
61
|
+
throw new ValidationError('identity escrow package must be an object');
|
|
62
|
+
if (!String(identity.aid ?? '').trim() || !String(identity.private_key_pem ?? '').trim() || !String(identity.cert ?? '').trim())
|
|
63
|
+
throw new ValidationError('identity escrow package is incomplete');
|
|
64
|
+
return encryptEscrowBytes(Buffer.from(JSON.stringify(identity), 'utf8'), password);
|
|
65
|
+
}
|
|
66
|
+
export function decryptIdentity(envelope, password) {
|
|
67
|
+
let value;
|
|
68
|
+
try {
|
|
69
|
+
value = JSON.parse(decryptEscrowBytes(envelope, password).toString('utf8'));
|
|
70
|
+
}
|
|
71
|
+
catch (error) {
|
|
72
|
+
throw new ValidationError(`certificate escrow identity package is invalid JSON: ${String(error)}`);
|
|
73
|
+
}
|
|
74
|
+
if (!value || typeof value !== 'object' || Array.isArray(value))
|
|
75
|
+
throw new ValidationError('certificate escrow identity package must be an object');
|
|
76
|
+
const result = value;
|
|
77
|
+
if (!String(result.aid ?? '').trim() || !String(result.private_key_pem ?? '').trim() || !String(result.cert ?? '').trim())
|
|
78
|
+
throw new ValidationError('certificate escrow identity package is incomplete');
|
|
79
|
+
return result;
|
|
80
|
+
}
|
|
81
|
+
export class OwnershipStatement {
|
|
82
|
+
proofId;
|
|
83
|
+
subjectAid;
|
|
84
|
+
ownerAid;
|
|
85
|
+
canonicalFact;
|
|
86
|
+
canonicalStatement;
|
|
87
|
+
signerAid;
|
|
88
|
+
role;
|
|
89
|
+
extensions;
|
|
90
|
+
version;
|
|
91
|
+
signedAt;
|
|
92
|
+
constructor(proofId, subjectAid, ownerAid, signerAid = '', role = '', extensions, version = 1, signedAt = 0) {
|
|
93
|
+
this.proofId = proofId;
|
|
94
|
+
this.subjectAid = subjectAid;
|
|
95
|
+
this.ownerAid = ownerAid;
|
|
96
|
+
this.signerAid = signerAid;
|
|
97
|
+
this.role = role;
|
|
98
|
+
this.extensions = extensions && Object.keys(extensions).length ? { ...extensions } : undefined;
|
|
99
|
+
this.version = version;
|
|
100
|
+
this.signedAt = signedAt;
|
|
101
|
+
this.canonicalFact = canonicalJson({ subject_aid: subjectAid, owner_aid: ownerAid });
|
|
102
|
+
const statement = { proof_id: proofId, subject_aid: subjectAid, owner_aid: ownerAid };
|
|
103
|
+
if (version === 2) {
|
|
104
|
+
statement.version = 2;
|
|
105
|
+
statement.signer_aid = signerAid;
|
|
106
|
+
statement.role = role;
|
|
107
|
+
if (this.extensions)
|
|
108
|
+
statement.extensions = this.extensions;
|
|
109
|
+
statement.signed_at = signedAt;
|
|
110
|
+
}
|
|
111
|
+
this.canonicalStatement = canonicalJson(statement);
|
|
112
|
+
}
|
|
113
|
+
static create(proofId, subjectAid, ownerAid) {
|
|
114
|
+
const id = String(proofId ?? '').trim();
|
|
115
|
+
if (!PROOF_ID_RE.test(id))
|
|
116
|
+
throw new ValidationError('invalid proof_id');
|
|
117
|
+
let subject;
|
|
118
|
+
let owner;
|
|
119
|
+
try {
|
|
120
|
+
subject = validateAIDFormat(subjectAid, 'subject_aid');
|
|
121
|
+
owner = validateAIDFormat(ownerAid, 'owner_aid');
|
|
122
|
+
}
|
|
123
|
+
catch (error) {
|
|
124
|
+
throw new ValidationError(String(error instanceof Error ? error.message : error));
|
|
125
|
+
}
|
|
126
|
+
return new OwnershipStatement(id, subject, owner);
|
|
127
|
+
}
|
|
128
|
+
static createSigned(proofId, subjectAid, ownerAid, options) {
|
|
129
|
+
const base = OwnershipStatement.create(proofId, subjectAid, ownerAid);
|
|
130
|
+
const signerAid = validateAIDFormat(options.signerAid, 'signer_aid');
|
|
131
|
+
const role = options.role;
|
|
132
|
+
const expected = role === 'subject' ? base.subjectAid : role === 'owner' ? base.ownerAid : '';
|
|
133
|
+
if (!expected)
|
|
134
|
+
throw new ValidationError('ownership signer role must be subject or owner');
|
|
135
|
+
if (signerAid !== expected)
|
|
136
|
+
throw new ValidationError('ownership signer does not match role');
|
|
137
|
+
if (options.extensions !== undefined && (!options.extensions || typeof options.extensions !== 'object' || Array.isArray(options.extensions))) {
|
|
138
|
+
throw new ValidationError('ownership extensions must be an object');
|
|
139
|
+
}
|
|
140
|
+
const signedAt = options.signedAt ?? Math.floor(Date.now() / 1000);
|
|
141
|
+
if (!Number.isSafeInteger(signedAt) || signedAt <= 0)
|
|
142
|
+
throw new ValidationError('signed_at must be a positive integer');
|
|
143
|
+
return new OwnershipStatement(base.proofId, base.subjectAid, base.ownerAid, signerAid, role, options.extensions, 2, signedAt);
|
|
144
|
+
}
|
|
145
|
+
static fromMapping(value) {
|
|
146
|
+
const version = Number(value.version ?? 1) || 1;
|
|
147
|
+
if (version === 2) {
|
|
148
|
+
if (!Number.isSafeInteger(value.signed_at) || Number(value.signed_at) <= 0)
|
|
149
|
+
throw new ValidationError('signed_at must be a positive integer');
|
|
150
|
+
return OwnershipStatement.createSigned(String(value.proof_id ?? ''), String(value.subject_aid ?? ''), String(value.owner_aid ?? ''), { signerAid: String(value.signer_aid ?? ''), role: String(value.role ?? ''), extensions: value.extensions, signedAt: value.signed_at });
|
|
151
|
+
}
|
|
152
|
+
return OwnershipStatement.create(String(value.proof_id ?? ''), String(value.subject_aid ?? ''), String(value.owner_aid ?? ''));
|
|
153
|
+
}
|
|
154
|
+
toMapping() {
|
|
155
|
+
const value = { proof_id: this.proofId, subject_aid: this.subjectAid, owner_aid: this.ownerAid };
|
|
156
|
+
if (this.version === 2) {
|
|
157
|
+
value.version = 2;
|
|
158
|
+
value.signer_aid = this.signerAid;
|
|
159
|
+
value.role = this.role;
|
|
160
|
+
if (this.extensions)
|
|
161
|
+
value.extensions = { ...this.extensions };
|
|
162
|
+
value.signed_at = this.signedAt;
|
|
163
|
+
}
|
|
164
|
+
return value;
|
|
165
|
+
}
|
|
166
|
+
get signingBytes() {
|
|
167
|
+
const prefix = new TextEncoder().encode(OWNERSHIP_RELATION_DOMAIN);
|
|
168
|
+
const result = new Uint8Array(prefix.length + this.canonicalStatement.length);
|
|
169
|
+
result.set(prefix);
|
|
170
|
+
result.set(this.canonicalStatement, prefix.length);
|
|
171
|
+
return result;
|
|
172
|
+
}
|
|
173
|
+
}
|
|
174
|
+
export function isOwnershipPayload(value) {
|
|
175
|
+
return !!value && typeof value === 'object' && !Array.isArray(value)
|
|
176
|
+
&& String(value.type ?? '').trim() === OWNERSHIP_MESSAGE_TYPE;
|
|
177
|
+
}
|
|
178
|
+
export function ownershipMessageBody(message) {
|
|
179
|
+
if (!message || typeof message !== 'object' || Array.isArray(message))
|
|
180
|
+
return null;
|
|
181
|
+
const record = message;
|
|
182
|
+
if (record.payload && typeof record.payload === 'object' && !Array.isArray(record.payload)) {
|
|
183
|
+
return record.payload;
|
|
184
|
+
}
|
|
185
|
+
return isOwnershipPayload(record) ? record : null;
|
|
186
|
+
}
|
|
187
|
+
export function buildOwnershipMessage(action, options) {
|
|
188
|
+
const payload = {
|
|
189
|
+
type: OWNERSHIP_MESSAGE_TYPE,
|
|
190
|
+
action: String(action ?? '').trim(),
|
|
191
|
+
request_id: String(options.requestId ?? '').trim(),
|
|
192
|
+
proof_id: String(options.proofId ?? '').trim(),
|
|
193
|
+
subject_aid: String(options.subjectAid ?? '').trim().toLowerCase(),
|
|
194
|
+
owner_aid: String(options.ownerAid ?? '').trim().toLowerCase(),
|
|
195
|
+
};
|
|
196
|
+
for (const [key, value] of Object.entries(options)) {
|
|
197
|
+
if (!['requestId', 'proofId', 'subjectAid', 'ownerAid'].includes(key) && value !== undefined) {
|
|
198
|
+
payload[key] = value;
|
|
199
|
+
}
|
|
200
|
+
}
|
|
201
|
+
return payload;
|
|
202
|
+
}
|
|
203
|
+
export function validateOwnershipFrontmatter(frontmatter, expectedAid) {
|
|
204
|
+
const ownerPresent = Object.prototype.hasOwnProperty.call(frontmatter, 'owner');
|
|
205
|
+
const proofPresent = Object.prototype.hasOwnProperty.call(frontmatter, 'ownership_proof');
|
|
206
|
+
const releasePresent = Object.prototype.hasOwnProperty.call(frontmatter, 'ownership_release');
|
|
207
|
+
if (releasePresent) {
|
|
208
|
+
if (ownerPresent || proofPresent)
|
|
209
|
+
throw new ValidationError('ownership_release cannot be combined with owner or ownership_proof');
|
|
210
|
+
validateOwnershipRelease(frontmatter.ownership_release, String(frontmatter.aid ?? expectedAid ?? ''));
|
|
211
|
+
return;
|
|
212
|
+
}
|
|
213
|
+
if (proofPresent && !ownerPresent)
|
|
214
|
+
throw new ValidationError('ownership_proof requires owner');
|
|
215
|
+
const typeValue = String(frontmatter.type ?? '').trim().toLowerCase();
|
|
216
|
+
if (typeValue === 'human' && (ownerPresent || proofPresent))
|
|
217
|
+
throw new ValidationError('human AID cannot specify owner');
|
|
218
|
+
if (!ownerPresent)
|
|
219
|
+
return;
|
|
220
|
+
const aid = validateAIDFormat(frontmatter.aid, 'aid');
|
|
221
|
+
const owner = validateAIDFormat(frontmatter.owner, 'owner');
|
|
222
|
+
if (String(frontmatter.aid).trim() !== aid || String(frontmatter.owner).trim() !== owner)
|
|
223
|
+
throw new ValidationError('owner and subject AID must be lowercase');
|
|
224
|
+
if (expectedAid && aid !== expectedAid.trim().toLowerCase())
|
|
225
|
+
throw new ValidationError('ownership subject AID does not match expected AID');
|
|
226
|
+
if (!proofPresent)
|
|
227
|
+
return;
|
|
228
|
+
if (!frontmatter.ownership_proof || typeof frontmatter.ownership_proof !== 'object' || Array.isArray(frontmatter.ownership_proof))
|
|
229
|
+
throw new ValidationError('ownership_proof must be an object');
|
|
230
|
+
const raw = frontmatter.ownership_proof;
|
|
231
|
+
const allowed = new Set(['proof_id', 'subject_aid', 'owner_aid', 'subject_signature', 'owner_signature']);
|
|
232
|
+
if (Object.keys(raw).some((key) => !allowed.has(key)))
|
|
233
|
+
throw new ValidationError('ownership_proof contains unknown fields');
|
|
234
|
+
if (raw.subject_aid !== undefined && raw.subject_aid !== aid || raw.owner_aid !== undefined && raw.owner_aid !== owner)
|
|
235
|
+
throw new ValidationError('ownership_proof does not match agent.md owner');
|
|
236
|
+
if (!('proof_id' in raw) && Object.keys(raw).every((key) => ['subject_aid', 'owner_aid'].includes(key)))
|
|
237
|
+
return;
|
|
238
|
+
const statement = OwnershipStatement.create(String(raw.proof_id ?? ''), String(raw.subject_aid ?? aid), String(raw.owner_aid ?? owner));
|
|
239
|
+
if (statement.subjectAid !== aid || statement.ownerAid !== owner)
|
|
240
|
+
throw new ValidationError('ownership_proof does not match agent.md owner');
|
|
241
|
+
if ('subject_signature' in raw) {
|
|
242
|
+
const subjectSignature = raw.subject_signature;
|
|
243
|
+
if (!subjectSignature || typeof subjectSignature !== 'object' || Array.isArray(subjectSignature) || Object.keys(subjectSignature).some((key) => !['cert_fingerprint', 'signature', 'signer_aid', 'role', 'statement'].includes(key)) || !validSignature(subjectSignature))
|
|
244
|
+
throw new ValidationError('subject_signature is invalid');
|
|
245
|
+
validateNestedSignature(subjectSignature, statement, aid, 'subject', 'subject_signature');
|
|
246
|
+
}
|
|
247
|
+
if (aid === owner) {
|
|
248
|
+
if (raw.owner_signature !== undefined)
|
|
249
|
+
throw new ValidationError('self-owner proof must not contain owner_signature');
|
|
250
|
+
}
|
|
251
|
+
else if ('owner_signature' in raw) {
|
|
252
|
+
if (!raw.owner_signature || typeof raw.owner_signature !== 'object' || Array.isArray(raw.owner_signature) || !validSignature(raw.owner_signature))
|
|
253
|
+
throw new ValidationError('owner_signature is invalid');
|
|
254
|
+
if (Object.keys(raw.owner_signature).some((key) => !['cert_fingerprint', 'signature', 'signer_aid', 'role', 'statement'].includes(key)))
|
|
255
|
+
throw new ValidationError('owner_signature contains unknown fields');
|
|
256
|
+
validateNestedSignature(raw.owner_signature, statement, owner, 'owner', 'owner_signature');
|
|
257
|
+
}
|
|
258
|
+
}
|
|
259
|
+
export function createOwnershipReleaseStatement(proofId, subjectAid, ownerAid, signedAt = Math.floor(Date.now() / 1000)) {
|
|
260
|
+
const relation = OwnershipStatement.create(proofId, subjectAid, ownerAid);
|
|
261
|
+
if (!Number.isSafeInteger(signedAt) || signedAt <= 0)
|
|
262
|
+
throw new ValidationError('signed_at must be a positive integer');
|
|
263
|
+
return { version: 1, action: 'release', proof_id: relation.proofId, subject_aid: relation.subjectAid, owner_aid: relation.ownerAid, signer_aid: relation.ownerAid, role: 'owner', signed_at: signedAt };
|
|
264
|
+
}
|
|
265
|
+
function parseOwnershipReleaseStatement(value) {
|
|
266
|
+
if (!value || typeof value !== 'object' || Array.isArray(value))
|
|
267
|
+
throw new ValidationError('ownership_release statement is invalid');
|
|
268
|
+
const raw = value;
|
|
269
|
+
const allowed = new Set(['version', 'action', 'proof_id', 'subject_aid', 'owner_aid', 'signer_aid', 'role', 'signed_at']);
|
|
270
|
+
if (Object.keys(raw).some((key) => !allowed.has(key)))
|
|
271
|
+
throw new ValidationError('ownership_release statement contains unknown fields');
|
|
272
|
+
const statement = createOwnershipReleaseStatement(String(raw.proof_id ?? ''), String(raw.subject_aid ?? ''), String(raw.owner_aid ?? ''), Number(raw.signed_at));
|
|
273
|
+
if (raw.version !== 1 || raw.action !== 'release' || String(raw.signer_aid ?? '').trim().toLowerCase() !== statement.owner_aid || raw.role !== 'owner')
|
|
274
|
+
throw new ValidationError('ownership_release statement is invalid');
|
|
275
|
+
return statement;
|
|
276
|
+
}
|
|
277
|
+
function ownershipReleaseBytes(statement) {
|
|
278
|
+
const prefix = new TextEncoder().encode(OWNERSHIP_RELEASE_DOMAIN);
|
|
279
|
+
const canonical = canonicalJson(statement);
|
|
280
|
+
const result = new Uint8Array(prefix.length + canonical.length);
|
|
281
|
+
result.set(prefix);
|
|
282
|
+
result.set(canonical, prefix.length);
|
|
283
|
+
return result;
|
|
284
|
+
}
|
|
285
|
+
function validateOwnershipRelease(value, expectedSubject) {
|
|
286
|
+
if (!value || typeof value !== 'object' || Array.isArray(value))
|
|
287
|
+
throw new ValidationError('ownership_release must be an object');
|
|
288
|
+
const release = value;
|
|
289
|
+
if (Object.keys(release).some((key) => !['cert_fingerprint', 'signature', 'signer_aid', 'role', 'statement'].includes(key)))
|
|
290
|
+
throw new ValidationError('ownership_release contains unknown fields');
|
|
291
|
+
const signature = release;
|
|
292
|
+
if (!validSignature(signature) || !signature.statement)
|
|
293
|
+
throw new ValidationError('ownership_release signature is invalid');
|
|
294
|
+
const statement = parseOwnershipReleaseStatement(signature.statement);
|
|
295
|
+
if (expectedSubject && statement.subject_aid !== expectedSubject.trim().toLowerCase())
|
|
296
|
+
throw new ValidationError('ownership_release subject does not match agent.md AID');
|
|
297
|
+
if (signature.signer_aid && signature.signer_aid.trim().toLowerCase() !== statement.owner_aid)
|
|
298
|
+
throw new ValidationError('ownership_release signer does not match owner');
|
|
299
|
+
if (signature.role && signature.role !== 'owner')
|
|
300
|
+
throw new ValidationError('ownership_release role must be owner');
|
|
301
|
+
signature.statement = statement;
|
|
302
|
+
return signature;
|
|
303
|
+
}
|
|
304
|
+
export function signOwnershipRelease(aid, statement) {
|
|
305
|
+
const signed = aid.sign(Buffer.from(ownershipReleaseBytes(statement)));
|
|
306
|
+
if (!signed.ok || !signed.data)
|
|
307
|
+
throw new ValidationError(signed.error?.message ?? 'ownership release signature failed');
|
|
308
|
+
if (!FINGERPRINT_RE.test(aid.certFingerprint))
|
|
309
|
+
throw new ValidationError('certificate fingerprint is unavailable');
|
|
310
|
+
return { cert_fingerprint: aid.certFingerprint, signature: signed.data.signature, signer_aid: statement.owner_aid, role: 'owner', statement };
|
|
311
|
+
}
|
|
312
|
+
export function verifyOwnershipRelease(certPem, value) {
|
|
313
|
+
try {
|
|
314
|
+
const release = validateOwnershipRelease(value, '');
|
|
315
|
+
const statement = release.statement;
|
|
316
|
+
return certFingerprint(certPem).toLowerCase() === release.cert_fingerprint.toLowerCase()
|
|
317
|
+
&& certCommonName(certPem).toLowerCase() === statement.owner_aid
|
|
318
|
+
&& verifySignatureWithCert(certPem, Buffer.from(release.signature, 'base64'), Buffer.from(ownershipReleaseBytes(statement)));
|
|
319
|
+
}
|
|
320
|
+
catch {
|
|
321
|
+
return false;
|
|
322
|
+
}
|
|
323
|
+
}
|
|
324
|
+
export function validateOwnershipProof(proof, expectedSubject, expectedOwner) {
|
|
325
|
+
let subject;
|
|
326
|
+
let owner;
|
|
327
|
+
try {
|
|
328
|
+
subject = validateAIDFormat(expectedSubject, 'subject_aid');
|
|
329
|
+
owner = validateAIDFormat(expectedOwner, 'owner_aid');
|
|
330
|
+
}
|
|
331
|
+
catch (error) {
|
|
332
|
+
throw new ValidationError(String(error instanceof Error ? error.message : error));
|
|
333
|
+
}
|
|
334
|
+
if (proof.statement.subjectAid !== subject || proof.statement.ownerAid !== owner)
|
|
335
|
+
throw new ValidationError('ownership proof statement does not match owner or subject');
|
|
336
|
+
if (!validSignature(proof.subject_signature))
|
|
337
|
+
throw new ValidationError('subject_signature is invalid');
|
|
338
|
+
validateNestedSignature(proof.subject_signature, proof.statement, subject, 'subject', 'subject_signature');
|
|
339
|
+
if (subject === owner) {
|
|
340
|
+
if (proof.owner_signature)
|
|
341
|
+
throw new ValidationError('self-owner proof must not contain owner_signature');
|
|
342
|
+
}
|
|
343
|
+
else if (!proof.owner_signature || !validSignature(proof.owner_signature)) {
|
|
344
|
+
throw new ValidationError('owner_signature is required');
|
|
345
|
+
}
|
|
346
|
+
else {
|
|
347
|
+
validateNestedSignature(proof.owner_signature, proof.statement, owner, 'owner', 'owner_signature');
|
|
348
|
+
}
|
|
349
|
+
}
|
|
350
|
+
function validateNestedSignature(signature, relation, expectedSigner, expectedRole, name) {
|
|
351
|
+
if (signature.statement === undefined)
|
|
352
|
+
return;
|
|
353
|
+
if (!signature.statement || typeof signature.statement !== 'object' || Array.isArray(signature.statement))
|
|
354
|
+
throw new ValidationError(`${name} statement is invalid`);
|
|
355
|
+
const statement = OwnershipStatement.fromMapping(signature.statement);
|
|
356
|
+
if (statement.version !== 2 || statement.proofId !== relation.proofId || statement.subjectAid !== relation.subjectAid || statement.ownerAid !== relation.ownerAid)
|
|
357
|
+
throw new ValidationError(`${name} statement does not match ownership relation`);
|
|
358
|
+
if (statement.signerAid !== expectedSigner || statement.role !== expectedRole)
|
|
359
|
+
throw new ValidationError(`${name} statement signer does not match role`);
|
|
360
|
+
if (signature.signer_aid && signature.signer_aid !== statement.signerAid)
|
|
361
|
+
throw new ValidationError(`${name} signer_aid mismatch`);
|
|
362
|
+
if (signature.role && signature.role !== statement.role)
|
|
363
|
+
throw new ValidationError(`${name} role mismatch`);
|
|
364
|
+
}
|
|
365
|
+
function validSignature(signature) {
|
|
366
|
+
return !!signature && FINGERPRINT_RE.test(String(signature?.cert_fingerprint ?? '').trim()) && isStrictBase64(String(signature?.signature ?? ''));
|
|
367
|
+
}
|
|
368
|
+
export function signOwnershipStatement(aid, statement) {
|
|
369
|
+
const result = aid.sign(Buffer.from(statement.signingBytes));
|
|
370
|
+
if (!result.ok || !result.data)
|
|
371
|
+
throw new ValidationError(result.error?.message ?? 'ownership signature failed');
|
|
372
|
+
if (!FINGERPRINT_RE.test(aid.certFingerprint))
|
|
373
|
+
throw new ValidationError('certificate fingerprint is unavailable');
|
|
374
|
+
return {
|
|
375
|
+
cert_fingerprint: aid.certFingerprint,
|
|
376
|
+
signature: result.data.signature,
|
|
377
|
+
...(statement.version === 2 ? { signer_aid: statement.signerAid, role: statement.role, statement: statement.toMapping() } : {}),
|
|
378
|
+
};
|
|
379
|
+
}
|
|
380
|
+
export function verifyOwnershipSignature(certPem, statement, signature) {
|
|
381
|
+
if (!validSignature(signature))
|
|
382
|
+
return false;
|
|
383
|
+
try {
|
|
384
|
+
const signedStatement = signature.statement ? OwnershipStatement.fromMapping(signature.statement) : statement;
|
|
385
|
+
if (signedStatement.version !== 2 || signedStatement.proofId !== statement.proofId || signedStatement.subjectAid !== statement.subjectAid || signedStatement.ownerAid !== statement.ownerAid)
|
|
386
|
+
return false;
|
|
387
|
+
if (signature.signer_aid && signature.signer_aid !== signedStatement.signerAid || signature.role && signature.role !== signedStatement.role)
|
|
388
|
+
return false;
|
|
389
|
+
if (certFingerprint(certPem).toLowerCase() !== signature.cert_fingerprint.toLowerCase() || certCommonName(certPem).toLowerCase() !== signedStatement.signerAid)
|
|
390
|
+
return false;
|
|
391
|
+
const cert = new X509Certificate(certPem);
|
|
392
|
+
const signedAt = signedStatement.signedAt * 1000;
|
|
393
|
+
if (signedAt < new Date(cert.validFrom).getTime() || signedAt > new Date(cert.validTo).getTime())
|
|
394
|
+
return false;
|
|
395
|
+
return verifySignatureWithCert(certPem, Buffer.from(signature.signature, 'base64'), Buffer.from(signedStatement.signingBytes));
|
|
396
|
+
}
|
|
397
|
+
catch {
|
|
398
|
+
return false;
|
|
399
|
+
}
|
|
400
|
+
}
|
|
401
|
+
export function verifyOwnershipProof(proof, subjectCertPem, ownerCertPem) {
|
|
402
|
+
validateOwnershipProof(proof, proof.statement.subjectAid, proof.statement.ownerAid);
|
|
403
|
+
if (certCommonName(subjectCertPem).toLowerCase() !== proof.statement.subjectAid.toLowerCase() || !verifyOwnershipSignature(subjectCertPem, proof.statement, proof.subject_signature))
|
|
404
|
+
return false;
|
|
405
|
+
return proof.statement.subjectAid === proof.statement.ownerAid
|
|
406
|
+
|| (!!ownerCertPem && !!proof.owner_signature && certCommonName(ownerCertPem).toLowerCase() === proof.statement.ownerAid.toLowerCase() && verifyOwnershipSignature(ownerCertPem, proof.statement, proof.owner_signature));
|
|
407
|
+
}
|
|
408
|
+
export function verifyOwnershipFrontmatterStatus(frontmatter, subjectCertPem, ownerCertPem) {
|
|
409
|
+
try {
|
|
410
|
+
validateOwnershipFrontmatter(frontmatter);
|
|
411
|
+
if (!Object.prototype.hasOwnProperty.call(frontmatter, 'owner')) {
|
|
412
|
+
if (frontmatter.ownership_release !== undefined)
|
|
413
|
+
return ownerCertPem && verifyOwnershipRelease(ownerCertPem, frontmatter.ownership_release) ? 'released' : 'invalid';
|
|
414
|
+
return 'unbound';
|
|
415
|
+
}
|
|
416
|
+
const raw = (frontmatter.ownership_proof ?? {});
|
|
417
|
+
const subjectSignature = raw.subject_signature;
|
|
418
|
+
const ownerSignature = raw.owner_signature;
|
|
419
|
+
if (!subjectSignature && !ownerSignature)
|
|
420
|
+
return 'incomplete';
|
|
421
|
+
const statement = OwnershipStatement.create(String(raw.proof_id ?? ''), String(raw.subject_aid ?? frontmatter.aid), String(raw.owner_aid ?? frontmatter.owner));
|
|
422
|
+
if (subjectSignature && (!subjectCertPem || !verifyOwnershipSignature(subjectCertPem, statement, subjectSignature)))
|
|
423
|
+
return 'invalid';
|
|
424
|
+
if (ownerSignature && (!ownerCertPem || !verifyOwnershipSignature(ownerCertPem, statement, ownerSignature)))
|
|
425
|
+
return 'invalid';
|
|
426
|
+
return subjectSignature && (statement.subjectAid === statement.ownerAid || ownerSignature) ? 'complete' : 'incomplete';
|
|
427
|
+
}
|
|
428
|
+
catch {
|
|
429
|
+
return 'invalid';
|
|
430
|
+
}
|
|
431
|
+
}
|
|
432
|
+
export function verifyOwnershipFrontmatter(frontmatter, subjectCertPem, ownerCertPem) {
|
|
433
|
+
const status = verifyOwnershipFrontmatterStatus(frontmatter, subjectCertPem, ownerCertPem);
|
|
434
|
+
return status === 'unbound' || status === 'complete' || status === 'released';
|
|
435
|
+
}
|
|
436
|
+
//# sourceMappingURL=ownership-proof.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ownership-proof.js","sourceRoot":"","sources":["../src/ownership-proof.ts"],"names":[],"mappings":"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"}
|