@agentunion/fastaun 0.5.25 → 0.5.27
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 +41 -0
- package/_packed_docs/CHANGELOG.md +41 -0
- package/_packed_docs/INDEX.md +22 -14
- package/_packed_docs/KITE_DOCS_GUIDE.md +11 -6
- 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 +16 -1
- package/_packed_docs/aun/346/265/213/350/257/225/350/277/220/350/241/214/346/214/207/345/215/227.md +37 -9
- package/_packed_docs/cli/AUN-CLI/350/256/276/350/256/241/346/226/207/346/241/243.md +20 -9
- package/_packed_docs/cli/CLI/346/211/213/345/206/214.md +57 -12
- package/_packed_docs/cli//345/207/255/350/257/201/344/270/216/347/273/204/347/273/207/346/234/215/345/212/241CLI/345/274/200/345/217/221/344/270/216/344/275/277/347/224/250/346/214/207/345/215/227.md +869 -0
- package/_packed_docs/sdk/0.5.22-SDK/345/274/200/345/217/221/344/270/216/347/247/273/346/244/215/346/214/207/345/215/227.md +2 -2
- package/_packed_docs/sdk/0.5.27-SDK/345/272/224/347/224/250/351/233/206/346/210/220/346/214/207/345/215/227.md +408 -0
- package/_packed_docs/sdk/0.5.27-SDK/345/274/200/345/217/221/344/270/216/347/247/273/346/244/215/346/214/207/345/215/227.md +410 -0
- package/_packed_docs/sdk/06-API/346/211/213/345/206/214.md +2 -2
- package/_packed_docs/sdk/09-/345/207/255/350/257/201/346/234/215/345/212/241RPC/346/211/213/345/206/214.md +187 -73
- package/_packed_docs/sdk/09-/347/273/204/347/273/207/346/234/215/345/212/241RPC/346/211/213/345/206/214.md +1 -1
- package/_packed_docs/sdk/AUN_DOCS_GUIDE.md +13 -9
- package/_packed_docs/sdk/INDEX.md +21 -13
- package/_packed_docs/sdk/agent.md/344/270/216group.index/347/232/204ETag/350/247/202/345/257/237/344/270/216/345/220/214/346/255/245/346/234/272/345/210/266.md +240 -0
- package/_packed_docs/sdk//345/207/255/350/257/201/344/270/216/347/273/204/347/273/207/346/234/215/345/212/241SDK/345/272/224/347/224/250/351/233/206/346/210/220/346/214/207/345/215/227.md +973 -266
- package/_packed_docs/sdk//345/207/255/350/257/201/344/270/216/347/273/204/347/273/207/346/234/215/345/212/241SDK/345/274/200/345/217/221/344/270/216/347/247/273/346/244/215/346/214/207/345/215/227.md +950 -242
- package/dist/agent-md-schema.js +1 -1
- package/dist/agent-md-schema.js.map +1 -1
- package/dist/agent-md.js +5 -0
- package/dist/agent-md.js.map +1 -1
- package/dist/aid.js +3 -3
- package/dist/aid.js.map +1 -1
- package/dist/auth.js +21 -19
- package/dist/auth.js.map +1 -1
- package/dist/cert-utils.d.ts +1 -1
- package/dist/cert-utils.js +4 -4
- package/dist/cert-utils.js.map +1 -1
- package/dist/client/lifecycle.d.ts +1 -1
- package/dist/client/lifecycle.js.map +1 -1
- package/dist/client/rpc-pipeline.js +8 -1
- package/dist/client/rpc-pipeline.js.map +1 -1
- package/dist/client/v2-e2ee.js +7 -0
- package/dist/client/v2-e2ee.js.map +1 -1
- package/dist/client.d.ts +12 -0
- package/dist/client.js +305 -29
- package/dist/client.js.map +1 -1
- package/dist/facades.d.ts +38 -0
- package/dist/facades.js +49 -5
- package/dist/facades.js.map +1 -1
- package/dist/index.d.ts +4 -0
- package/dist/index.js +3 -0
- package/dist/index.js.map +1 -1
- package/dist/keystore/local-identity-store.js +16 -1
- package/dist/keystore/local-identity-store.js.map +1 -1
- package/dist/keystore/local-token-store.js +16 -1
- package/dist/keystore/local-token-store.js.map +1 -1
- package/dist/org-protocol.d.ts +1 -0
- package/dist/org-protocol.js +39 -36
- package/dist/org-protocol.js.map +1 -1
- package/dist/ownership-v21.js +7 -7
- package/dist/ownership-v21.js.map +1 -1
- package/dist/register-flow.js +2 -2
- package/dist/register-flow.js.map +1 -1
- package/dist/semantic-facade.d.ts +176 -0
- package/dist/semantic-facade.js +611 -0
- package/dist/semantic-facade.js.map +1 -0
- package/dist/semantic-protocol.d.ts +810 -0
- package/dist/semantic-protocol.js +894 -0
- package/dist/semantic-protocol.js.map +1 -0
- package/dist/tools/cross-sdk-agent.d.ts +11 -1
- package/dist/tools/cross-sdk-agent.js +388 -7
- package/dist/tools/cross-sdk-agent.js.map +1 -1
- package/dist/transport.d.ts +1 -0
- package/dist/transport.js +28 -2
- package/dist/transport.js.map +1 -1
- package/dist/v2/e2ee/decrypt.d.ts +5 -0
- package/dist/v2/e2ee/decrypt.js +22 -2
- 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 +2 -1
- package/src/certs/root.crt +13 -0
package/dist/auth.js
CHANGED
|
@@ -112,13 +112,13 @@ function _extractPublicKey(cert) {
|
|
|
112
112
|
}
|
|
113
113
|
const CERT_CLOCK_SKEW_MS = 300_000;
|
|
114
114
|
/** 检查证书时间有效性,允许测试环境和容器之间存在短暂时钟偏差 */
|
|
115
|
-
function _ensureCertTimeValid(cert, label, nowMs) {
|
|
115
|
+
function _ensureCertTimeValid(cert, label, nowMs, clockSkewMs = CERT_CLOCK_SKEW_MS) {
|
|
116
116
|
const notBefore = new Date(cert.validFrom).getTime();
|
|
117
117
|
const notAfter = new Date(cert.validTo).getTime();
|
|
118
|
-
if (nowMs +
|
|
118
|
+
if (nowMs + clockSkewMs < notBefore) {
|
|
119
119
|
throw new AuthError(`${label} is not yet valid`);
|
|
120
120
|
}
|
|
121
|
-
if (nowMs -
|
|
121
|
+
if (nowMs - clockSkewMs > notAfter) {
|
|
122
122
|
throw new AuthError(`${label} has expired`);
|
|
123
123
|
}
|
|
124
124
|
}
|
|
@@ -338,7 +338,7 @@ function _strictCrlRevokedSerials(pem, issuer, now) {
|
|
|
338
338
|
};
|
|
339
339
|
const thisUpdate = crlTime(tbs[offset + 2]);
|
|
340
340
|
const nextUpdate = crlTime(tbs[offset + 3]);
|
|
341
|
-
if (thisUpdate > now +
|
|
341
|
+
if (thisUpdate > now + 300 || now > nextUpdate + 300 || nextUpdate <= thisUpdate)
|
|
342
342
|
throw new AuthError('service event CRL is not current');
|
|
343
343
|
const revoked = new Set();
|
|
344
344
|
if (tbs[offset + 4]?.tag === 0x30)
|
|
@@ -401,7 +401,7 @@ function _verifyOwnershipOcsp(der, certificate, issuer, now) {
|
|
|
401
401
|
if (!responderValid)
|
|
402
402
|
throw new ValidationError('OCSP responder is not the verified issuer', { stringCode: 'invalid' });
|
|
403
403
|
const producedAt = _ownershipOcspTime(tbs[offset++]);
|
|
404
|
-
if (producedAt > now +
|
|
404
|
+
if (producedAt > now + 300 || producedAt < now - 390)
|
|
405
405
|
throw new StateError('OCSP response is not current', { stringCode: 'unavailable', retryable: true });
|
|
406
406
|
const responses = _ownershipDerChildren(tbs[offset++], 0x30);
|
|
407
407
|
let status;
|
|
@@ -429,7 +429,7 @@ function _verifyOwnershipOcsp(der, certificate, issuer, now) {
|
|
|
429
429
|
const nextUpdate = _ownershipOcspTime(_ownershipDerChildren(single[3])[0]);
|
|
430
430
|
nextRefreshAt = nextUpdate * 1000;
|
|
431
431
|
currentUntil = Math.min(currentUntil, (thisUpdate + 30) * 1000);
|
|
432
|
-
if (thisUpdate > now +
|
|
432
|
+
if (thisUpdate > now + 300 || thisUpdate < now - 330 || now > nextUpdate + 300 || nextUpdate <= thisUpdate)
|
|
433
433
|
throw new StateError('OCSP validity window is not current', { stringCode: 'unavailable', retryable: true });
|
|
434
434
|
if (single[1].tag === 0x80 && single[1].content.length === 0)
|
|
435
435
|
status = 'good';
|
|
@@ -941,7 +941,7 @@ export class AuthFlow {
|
|
|
941
941
|
try {
|
|
942
942
|
const cert = _loadX509(certPem);
|
|
943
943
|
if (signedAt !== undefined) {
|
|
944
|
-
_ensureCertTimeValid(cert, 'peer certificate', signedAt * 1000);
|
|
944
|
+
_ensureCertTimeValid(cert, 'peer certificate', signedAt * 1000, 0);
|
|
945
945
|
await this._verifyAuthCertChain(gatewayUrl, cert, expectedAid, signedAt);
|
|
946
946
|
if (_certSubjectCN(cert) !== expectedAid)
|
|
947
947
|
throw new AuthError(`peer cert CN mismatch: expected ${expectedAid}`);
|
|
@@ -960,7 +960,7 @@ export class AuthFlow {
|
|
|
960
960
|
if (!chain.length)
|
|
961
961
|
throw new AuthError('service event certificate chain is unavailable');
|
|
962
962
|
const current = Math.trunc(Date.now() / 1000);
|
|
963
|
-
if ([cert, ...chain].some((item) => current < Math.trunc(Date.parse(item.validFrom) / 1000) || current > Math.trunc(Date.parse(item.validTo) / 1000)))
|
|
963
|
+
if ([cert, ...chain].some((item) => current < Math.trunc(Date.parse(item.validFrom) / 1000) - 300 || current > Math.trunc(Date.parse(item.validTo) / 1000) + 300))
|
|
964
964
|
throw new AuthError('service event certificate is outside its validity window');
|
|
965
965
|
await this._verifyAuthCertChain(gatewayUrl, cert, expectedAid, undefined, true, chain);
|
|
966
966
|
const crl = await this._fetchGatewayCrl(gatewayUrl, chain[0], true);
|
|
@@ -1116,7 +1116,7 @@ export class AuthFlow {
|
|
|
1116
1116
|
const observedText = headers['x-aun-cert-observed-at'] ?? '';
|
|
1117
1117
|
const observed = Date.parse(observedText) / 1000;
|
|
1118
1118
|
const now = Date.now() / 1000;
|
|
1119
|
-
if (headers['x-aun-cert-consistency'] !== 'authoritative' || typeof state !== 'string' || !state || !headers['x-aun-cert-fingerprint'] || !/^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}(?:\.\d{1,9})?Z$/.test(observedText) || !Number.isFinite(observed) || observed > now +
|
|
1119
|
+
if (headers['x-aun-cert-consistency'] !== 'authoritative' || typeof state !== 'string' || !state || !headers['x-aun-cert-fingerprint'] || !/^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}(?:\.\d{1,9})?Z$/.test(observedText) || !Number.isFinite(observed) || observed > now + 300 || observed < now - 330)
|
|
1120
1120
|
throw unavailable('ownership certificate authoritative current metadata is unavailable');
|
|
1121
1121
|
if (state !== 'active_signing' || headers['x-aun-cert-fingerprint'] !== fingerprint)
|
|
1122
1122
|
throw new ValidationError('ownership certificate lifecycle or fingerprint is invalid', { stringCode: 'invalid' });
|
|
@@ -1132,7 +1132,7 @@ export class AuthFlow {
|
|
|
1132
1132
|
if (cert.subject.match(/(?:^|\n)CN=([^\n]+)/)?.[1] !== aid)
|
|
1133
1133
|
throw new ValidationError('ownership certificate AID mismatch', { stringCode: 'invalid' });
|
|
1134
1134
|
_ownershipCertConstraints(cert);
|
|
1135
|
-
validateAgentMdCertificate(response.body, aid, Math.trunc(now), { now: Math.trunc(now), requireCurrentValidity: true });
|
|
1135
|
+
validateAgentMdCertificate(response.body, aid, Math.trunc(Math.min(Math.max(now, Date.parse(cert.validFrom) / 1000), Date.parse(cert.validTo) / 1000)), { now: Math.trunc(now), requireCurrentValidity: true });
|
|
1136
1136
|
if (certFingerprint(response.body) !== fingerprint)
|
|
1137
1137
|
throw new ValidationError('ownership certificate DER fingerprint mismatch', { stringCode: 'invalid' });
|
|
1138
1138
|
const epoch = this._strictPkiEpoch;
|
|
@@ -1156,7 +1156,7 @@ export class AuthFlow {
|
|
|
1156
1156
|
const constraints = _ownershipCertConstraints(issuer);
|
|
1157
1157
|
if (constraints.pathLen !== undefined && index > constraints.pathLen)
|
|
1158
1158
|
throw new ValidationError('ownership certificate path length is invalid', { stringCode: 'invalid' });
|
|
1159
|
-
if (!constraints.basicPresent || !issuer.ca || !constraints.keyUsagePresent || !constraints.keyCertSign || Date.now() < Date.parse(issuer.validFrom) || Date.now() > Date.parse(issuer.validTo) || !current.checkIssued(issuer) || !current.verify(issuer.publicKey))
|
|
1159
|
+
if (!constraints.basicPresent || !issuer.ca || !constraints.keyUsagePresent || !constraints.keyCertSign || Date.now() < Date.parse(issuer.validFrom) - 300_000 || Date.now() > Date.parse(issuer.validTo) + 300_000 || !current.checkIssued(issuer) || !current.verify(issuer.publicKey))
|
|
1160
1160
|
throw new ValidationError('ownership certificate chain is invalid', { stringCode: 'invalid' });
|
|
1161
1161
|
current = issuer;
|
|
1162
1162
|
}
|
|
@@ -1200,9 +1200,9 @@ export class AuthFlow {
|
|
|
1200
1200
|
if (status !== 'good')
|
|
1201
1201
|
throw unavailable('ownership certificate revocation status is unknown');
|
|
1202
1202
|
const finalNow = Date.now();
|
|
1203
|
-
if ([cert, ...chain].some((item) => finalNow < Date.parse(item.validFrom) || finalNow > Date.parse(item.validTo)))
|
|
1203
|
+
if ([cert, ...chain].some((item) => finalNow < Date.parse(item.validFrom) - 300_000 || finalNow > Date.parse(item.validTo) + 300_000))
|
|
1204
1204
|
throw new ValidationError('ownership certificate chain is invalid', { stringCode: 'invalid' });
|
|
1205
|
-
if (finalNow - began > 30_000 || finalNow / 1000 - observed >
|
|
1205
|
+
if (finalNow - began > 30_000 || finalNow / 1000 - observed > 330)
|
|
1206
1206
|
throw unavailable('ownership certificate verification window elapsed');
|
|
1207
1207
|
return { certificate: { cert_pem: response.body, chain_valid: true, state, revoked: false, revocation_checked: true, observed_at: Math.trunc(observed) }, expiresAt: Math.min(began + 3600_000, (Math.trunc(observed) + 30) * 1000, evidence.currentUntil, evidence.nextRefreshAt, Date.parse(cert.validTo), ...chain.map((item) => Date.parse(item.validTo))) };
|
|
1208
1208
|
}
|
|
@@ -1522,6 +1522,7 @@ export class AuthFlow {
|
|
|
1522
1522
|
inline_realtime_payload_v1: true,
|
|
1523
1523
|
agent_md_validation_v1: true,
|
|
1524
1524
|
p2p_peer_pull_v1: true,
|
|
1525
|
+
gateway_migrate_v1: true,
|
|
1525
1526
|
};
|
|
1526
1527
|
const request = {
|
|
1527
1528
|
nonce,
|
|
@@ -1636,7 +1637,8 @@ export class AuthFlow {
|
|
|
1636
1637
|
async _verifyAuthCertChain(gatewayUrl, authCert, chainAid = '', signedAt, _fresh = false, suppliedChain) {
|
|
1637
1638
|
const epoch = this._strictPkiEpoch;
|
|
1638
1639
|
const nowMs = signedAt === undefined ? Date.now() : signedAt * 1000;
|
|
1639
|
-
|
|
1640
|
+
const clockSkewMs = signedAt === undefined ? CERT_CLOCK_SKEW_MS : 0;
|
|
1641
|
+
_ensureCertTimeValid(authCert, 'auth certificate', nowMs, clockSkewMs);
|
|
1640
1642
|
const chain = suppliedChain ?? await this._loadGatewayCaChain(gatewayUrl, chainAid);
|
|
1641
1643
|
if (!chain.length) {
|
|
1642
1644
|
throw new AuthError('unable to verify auth certificate chain: missing CA chain');
|
|
@@ -1648,14 +1650,14 @@ export class AuthFlow {
|
|
|
1648
1650
|
const expiresAt = Math.min(now + this._chainCacheTtl, Date.parse(authCert.validTo), ...chain.map((cert) => Date.parse(cert.validTo)));
|
|
1649
1651
|
const chainExpiresAt = Math.min(now + this._chainCacheTtl, ...chain.map((cert) => Date.parse(cert.validTo)));
|
|
1650
1652
|
for (const caCert of chain)
|
|
1651
|
-
_ensureCertTimeValid(caCert, 'CA certificate', nowMs);
|
|
1653
|
+
_ensureCertTimeValid(caCert, 'CA certificate', nowMs, clockSkewMs);
|
|
1652
1654
|
// 检查缓存
|
|
1653
1655
|
if ((this._chainVerifiedCache.get(certKey) ?? 0) > now)
|
|
1654
1656
|
return;
|
|
1655
1657
|
// 快速路径:CA 链已通过完整验证
|
|
1656
1658
|
if ((this._gatewayCaVerified.get(cacheKey) ?? 0) > now) {
|
|
1657
1659
|
const issuer = chain[0];
|
|
1658
|
-
_ensureCertTimeValid(issuer, 'Issuer CA', nowMs);
|
|
1660
|
+
_ensureCertTimeValid(issuer, 'Issuer CA', nowMs, clockSkewMs);
|
|
1659
1661
|
if (!_isCaCert(issuer)) {
|
|
1660
1662
|
throw new AuthError('Issuer CA is not marked as CA (fast path)');
|
|
1661
1663
|
}
|
|
@@ -1673,7 +1675,7 @@ export class AuthFlow {
|
|
|
1673
1675
|
let current = authCert;
|
|
1674
1676
|
for (let i = 0; i < chain.length; i++) {
|
|
1675
1677
|
const caCert = chain[i];
|
|
1676
|
-
_ensureCertTimeValid(caCert, `CA certificate[${i}]`, nowMs);
|
|
1678
|
+
_ensureCertTimeValid(caCert, `CA certificate[${i}]`, nowMs, clockSkewMs);
|
|
1677
1679
|
if (!_checkIssuedBy(current, caCert)) {
|
|
1678
1680
|
throw new AuthError(`auth certificate issuer mismatch at chain level ${i}`);
|
|
1679
1681
|
}
|
|
@@ -2301,9 +2303,9 @@ export class AuthFlow {
|
|
|
2301
2303
|
const now = Date.now();
|
|
2302
2304
|
const validFrom = new Date(cert.validFrom).getTime();
|
|
2303
2305
|
const validTo = new Date(cert.validTo).getTime();
|
|
2304
|
-
if (now < validFrom)
|
|
2306
|
+
if (now < validFrom - 300_000)
|
|
2305
2307
|
return 'cert not yet valid';
|
|
2306
|
-
if (now > validTo)
|
|
2308
|
+
if (now > validTo + 300_000)
|
|
2307
2309
|
return 'cert expired';
|
|
2308
2310
|
return '';
|
|
2309
2311
|
}
|