@iicp/client 0.7.91 → 0.7.93

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.
Files changed (57) hide show
  1. package/README.md +12 -2
  2. package/dist/backends/base.d.ts +10 -0
  3. package/dist/backends/base.d.ts.map +1 -1
  4. package/dist/backends/base.js +61 -28
  5. package/dist/backends/base.js.map +1 -1
  6. package/dist/client.d.ts.map +1 -1
  7. package/dist/client.js +35 -22
  8. package/dist/client.js.map +1 -1
  9. package/dist/dispatch_ticket.d.ts +2 -0
  10. package/dist/dispatch_ticket.d.ts.map +1 -1
  11. package/dist/dispatch_ticket.js +16 -0
  12. package/dist/dispatch_ticket.js.map +1 -1
  13. package/dist/dispatch_ticket_trust.d.ts +89 -0
  14. package/dist/dispatch_ticket_trust.d.ts.map +1 -0
  15. package/dist/dispatch_ticket_trust.js +302 -0
  16. package/dist/dispatch_ticket_trust.js.map +1 -0
  17. package/dist/endpoint_security.d.ts +22 -0
  18. package/dist/endpoint_security.d.ts.map +1 -0
  19. package/dist/endpoint_security.js +141 -0
  20. package/dist/endpoint_security.js.map +1 -0
  21. package/dist/index.d.ts +15 -0
  22. package/dist/index.d.ts.map +1 -1
  23. package/dist/index.js +38 -2
  24. package/dist/index.js.map +1 -1
  25. package/dist/policy_data_handling.d.ts +8 -0
  26. package/dist/policy_data_handling.d.ts.map +1 -0
  27. package/dist/policy_data_handling.js +49 -0
  28. package/dist/policy_data_handling.js.map +1 -0
  29. package/dist/policy_detail_disclosure.d.ts +16 -0
  30. package/dist/policy_detail_disclosure.d.ts.map +1 -0
  31. package/dist/policy_detail_disclosure.js +80 -0
  32. package/dist/policy_detail_disclosure.js.map +1 -0
  33. package/dist/policy_operational_evidence.d.ts +8 -0
  34. package/dist/policy_operational_evidence.d.ts.map +1 -0
  35. package/dist/policy_operational_evidence.js +30 -0
  36. package/dist/policy_operational_evidence.js.map +1 -0
  37. package/dist/selection.d.ts +1 -1
  38. package/dist/selection.d.ts.map +1 -1
  39. package/dist/selection.js +2 -2
  40. package/dist/selection.js.map +1 -1
  41. package/dist/service_lifecycle.d.ts +90 -0
  42. package/dist/service_lifecycle.d.ts.map +1 -0
  43. package/dist/service_lifecycle.js +185 -0
  44. package/dist/service_lifecycle.js.map +1 -0
  45. package/dist/service_lifecycle_accounting.d.ts +10 -0
  46. package/dist/service_lifecycle_accounting.d.ts.map +1 -0
  47. package/dist/service_lifecycle_accounting.js +67 -0
  48. package/dist/service_lifecycle_accounting.js.map +1 -0
  49. package/dist/service_lifecycle_distributed.d.ts +2 -0
  50. package/dist/service_lifecycle_distributed.d.ts.map +1 -0
  51. package/dist/service_lifecycle_distributed.js +30 -0
  52. package/dist/service_lifecycle_distributed.js.map +1 -0
  53. package/dist/service_lifecycle_identity.d.ts +2 -0
  54. package/dist/service_lifecycle_identity.d.ts.map +1 -0
  55. package/dist/service_lifecycle_identity.js +30 -0
  56. package/dist/service_lifecycle_identity.js.map +1 -0
  57. package/package.json +1 -1
@@ -0,0 +1,89 @@
1
+ export declare const DISPATCH_TICKET_V2_PROFILE = "dispatch_ticket_v2";
2
+ type Json = null | boolean | number | string | Json[] | {
3
+ [key: string]: Json;
4
+ };
5
+ export interface DispatchTrustKey {
6
+ key_id: string;
7
+ public_key_b64url: string;
8
+ state: "active" | "retiring" | "revoked";
9
+ valid_from: number;
10
+ valid_until: number;
11
+ allowed_profiles?: string[];
12
+ issuers?: string[];
13
+ audiences?: string[];
14
+ }
15
+ export interface DispatchTrustBundle {
16
+ bundle_version: number;
17
+ keys: DispatchTrustKey[];
18
+ issuer?: string;
19
+ valid_from?: number;
20
+ valid_until?: number;
21
+ }
22
+ export interface DispatchTicketBindings {
23
+ issuer: string;
24
+ provider_id: string;
25
+ intent: string;
26
+ constraints_digest: string;
27
+ audience?: string;
28
+ }
29
+ export interface DispatchTrustDecision {
30
+ accepted: boolean;
31
+ code: string;
32
+ anchored: boolean;
33
+ key_id?: string;
34
+ }
35
+ export interface StoredDispatchTrustBundle {
36
+ bundle: DispatchTrustBundle;
37
+ canonical_bytes: Buffer;
38
+ digest: string;
39
+ high_water: number;
40
+ }
41
+ export type TrustBundleInstallStatus = "installed" | "unchanged" | "stale" | "conflict" | "recovered" | "recovery_required";
42
+ export interface TrustBundleInstallResult {
43
+ status: TrustBundleInstallStatus;
44
+ state?: StoredDispatchTrustBundle;
45
+ }
46
+ export interface AdminRecoveryAuthorization {
47
+ reason: string;
48
+ minimum_high_water?: number;
49
+ }
50
+ export interface TrustBundleStore {
51
+ load(): StoredDispatchTrustBundle | undefined;
52
+ install(bundle: DispatchTrustBundle, expectedCurrentVersion?: number): TrustBundleInstallResult;
53
+ recover(bundle: DispatchTrustBundle, authorization?: AdminRecoveryAuthorization): TrustBundleInstallResult;
54
+ }
55
+ export declare class TrustBundleStoreError extends Error {
56
+ }
57
+ export declare class TrustBundleStoreCorrupt extends TrustBundleStoreError {
58
+ }
59
+ export declare class TrustBundleStoreLocked extends TrustBundleStoreError {
60
+ }
61
+ export declare class LocalDispatchReplayCache {
62
+ private readonly seen;
63
+ contains(jti: string, now: number): boolean;
64
+ remember(jti: string, expiresAt: number): void;
65
+ }
66
+ export declare function canonicalTicketClaims(value: Json): string;
67
+ export declare function canonicalDispatchTrustBundle(bundle: DispatchTrustBundle): Buffer;
68
+ export declare class FileDispatchTrustBundleStore implements TrustBundleStore {
69
+ readonly path: string;
70
+ readonly lockPath: string;
71
+ private readonly lockTimeoutMs;
72
+ constructor(path: string, options?: {
73
+ lockTimeoutMs?: number;
74
+ });
75
+ private prepareDirectory;
76
+ private acquireLock;
77
+ private releaseLock;
78
+ load(): StoredDispatchTrustBundle | undefined;
79
+ private commit;
80
+ install(bundle: DispatchTrustBundle, expectedCurrentVersion?: number): TrustBundleInstallResult;
81
+ recover(bundle: DispatchTrustBundle, authorization?: AdminRecoveryAuthorization): TrustBundleInstallResult;
82
+ }
83
+ export declare function verifyDispatchTicketV2(claims: Record<string, Json>, signatureB64url: string, bundle: DispatchTrustBundle, bindings: DispatchTicketBindings, options: {
84
+ now: number;
85
+ minimumBundleVersion?: number;
86
+ replayCache?: LocalDispatchReplayCache;
87
+ }): DispatchTrustDecision;
88
+ export {};
89
+ //# sourceMappingURL=dispatch_ticket_trust.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dispatch_ticket_trust.d.ts","sourceRoot":"","sources":["../src/dispatch_ticket_trust.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,302 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.FileDispatchTrustBundleStore = exports.LocalDispatchReplayCache = exports.TrustBundleStoreLocked = exports.TrustBundleStoreCorrupt = exports.TrustBundleStoreError = exports.DISPATCH_TICKET_V2_PROFILE = void 0;
4
+ exports.canonicalTicketClaims = canonicalTicketClaims;
5
+ exports.canonicalDispatchTrustBundle = canonicalDispatchTrustBundle;
6
+ exports.verifyDispatchTicketV2 = verifyDispatchTicketV2;
7
+ const node_crypto_1 = require("node:crypto");
8
+ const node_fs_1 = require("node:fs");
9
+ const node_path_1 = require("node:path");
10
+ exports.DISPATCH_TICKET_V2_PROFILE = "dispatch_ticket_v2";
11
+ const DOMAIN = Buffer.from("IICP-DISPATCH-TICKET-V2\0", "utf8");
12
+ const ED25519_SPKI_PREFIX = Buffer.from("302a300506032b6570032100", "hex");
13
+ class TrustBundleStoreError extends Error {
14
+ }
15
+ exports.TrustBundleStoreError = TrustBundleStoreError;
16
+ class TrustBundleStoreCorrupt extends TrustBundleStoreError {
17
+ }
18
+ exports.TrustBundleStoreCorrupt = TrustBundleStoreCorrupt;
19
+ class TrustBundleStoreLocked extends TrustBundleStoreError {
20
+ }
21
+ exports.TrustBundleStoreLocked = TrustBundleStoreLocked;
22
+ class LocalDispatchReplayCache {
23
+ seen = new Map();
24
+ contains(jti, now) {
25
+ for (const [key, expiry] of this.seen)
26
+ if (expiry <= now)
27
+ this.seen.delete(key);
28
+ return this.seen.has(jti);
29
+ }
30
+ remember(jti, expiresAt) {
31
+ this.seen.set(jti, expiresAt);
32
+ }
33
+ }
34
+ exports.LocalDispatchReplayCache = LocalDispatchReplayCache;
35
+ function canonicalTicketClaims(value) {
36
+ if (Array.isArray(value))
37
+ return `[${value.map(canonicalTicketClaims).join(",")}]`;
38
+ if (value !== null && typeof value === "object") {
39
+ return `{${Object.keys(value).sort().map((key) => `${JSON.stringify(key)}:${canonicalTicketClaims(value[key])}`).join(",")}}`;
40
+ }
41
+ return JSON.stringify(value);
42
+ }
43
+ function canonicalDispatchTrustBundle(bundle) {
44
+ const normalized = {
45
+ bundle_version: bundle.bundle_version,
46
+ keys: [...bundle.keys]
47
+ .sort((a, b) => a.key_id.localeCompare(b.key_id))
48
+ .map((key) => ({
49
+ key_id: key.key_id,
50
+ public_key_b64url: key.public_key_b64url,
51
+ state: key.state,
52
+ valid_from: key.valid_from,
53
+ valid_until: key.valid_until,
54
+ allowed_profiles: [...(key.allowed_profiles ?? [exports.DISPATCH_TICKET_V2_PROFILE])].sort(),
55
+ issuers: [...(key.issuers ?? [])].sort(),
56
+ audiences: [...(key.audiences ?? [])].sort(),
57
+ })),
58
+ };
59
+ if (bundle.issuer !== undefined)
60
+ normalized.issuer = bundle.issuer;
61
+ if (bundle.valid_from !== undefined)
62
+ normalized.valid_from = bundle.valid_from;
63
+ if (bundle.valid_until !== undefined)
64
+ normalized.valid_until = bundle.valid_until;
65
+ return Buffer.from(canonicalTicketClaims(normalized), "utf8");
66
+ }
67
+ function bundleDigest(bytes) {
68
+ return `sha256:${(0, node_crypto_1.createHash)("sha256").update(bytes).digest("hex")}`;
69
+ }
70
+ function sleepMilliseconds(milliseconds) {
71
+ Atomics.wait(new Int32Array(new SharedArrayBuffer(4)), 0, 0, milliseconds);
72
+ }
73
+ class FileDispatchTrustBundleStore {
74
+ path;
75
+ lockPath;
76
+ lockTimeoutMs;
77
+ constructor(path, options = {}) {
78
+ this.path = path;
79
+ this.lockPath = `${path}.lock`;
80
+ this.lockTimeoutMs = Math.max(0, options.lockTimeoutMs ?? 2_000);
81
+ }
82
+ prepareDirectory() {
83
+ const directory = (0, node_path_1.dirname)(this.path);
84
+ (0, node_fs_1.mkdirSync)(directory, { recursive: true, mode: 0o700 });
85
+ if (((0, node_fs_1.statSync)(directory).mode & 0o077) !== 0)
86
+ throw new TrustBundleStoreError("trust store directory must be owner-only");
87
+ }
88
+ acquireLock() {
89
+ this.prepareDirectory();
90
+ const deadline = Date.now() + this.lockTimeoutMs;
91
+ while (true) {
92
+ try {
93
+ const fd = (0, node_fs_1.openSync)(this.lockPath, "wx", 0o600);
94
+ (0, node_fs_1.writeFileSync)(fd, `${process.pid}\n`);
95
+ (0, node_fs_1.fsyncSync)(fd);
96
+ return fd;
97
+ }
98
+ catch (error) {
99
+ if (error.code !== "EEXIST")
100
+ throw error;
101
+ if (Date.now() >= deadline)
102
+ throw new TrustBundleStoreLocked("trust store lock is held");
103
+ sleepMilliseconds(10);
104
+ }
105
+ }
106
+ }
107
+ releaseLock(fd) {
108
+ (0, node_fs_1.closeSync)(fd);
109
+ try {
110
+ (0, node_fs_1.unlinkSync)(this.lockPath);
111
+ }
112
+ catch (error) {
113
+ if (error.code !== "ENOENT")
114
+ throw error;
115
+ }
116
+ }
117
+ load() {
118
+ if (!(0, node_fs_1.existsSync)(this.path))
119
+ return undefined;
120
+ const metadata = (0, node_fs_1.lstatSync)(this.path);
121
+ if (metadata.isSymbolicLink() || !metadata.isFile())
122
+ throw new TrustBundleStoreCorrupt("trust store must be a regular file, not a link");
123
+ if ((metadata.mode & 0o077) !== 0)
124
+ throw new TrustBundleStoreCorrupt("trust store file must be owner-only");
125
+ try {
126
+ const raw = (0, node_fs_1.readFileSync)(this.path);
127
+ if (raw.length > 4 * 1024 * 1024)
128
+ throw new Error("state exceeds size limit");
129
+ const state = JSON.parse(raw.toString("utf8"));
130
+ if (typeof state.bundle_b64 !== "string" || !/^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$/.test(state.bundle_b64)) {
131
+ throw new Error("invalid bundle base64");
132
+ }
133
+ const canonicalBytes = Buffer.from(state.bundle_b64, "base64");
134
+ const digest = bundleDigest(canonicalBytes);
135
+ if (digest !== state.bundle_digest)
136
+ throw new Error("bundle digest mismatch");
137
+ const bundle = JSON.parse(canonicalBytes.toString("utf8"));
138
+ const highWater = Number(state.high_water);
139
+ if (!Number.isSafeInteger(bundle.bundle_version) || bundle.bundle_version < 0 || state.bundle_version !== bundle.bundle_version || !Number.isSafeInteger(highWater) || highWater < bundle.bundle_version) {
140
+ throw new Error("bundle version/high-water mismatch");
141
+ }
142
+ if (!canonicalDispatchTrustBundle(bundle).equals(canonicalBytes))
143
+ throw new Error("bundle is not canonical");
144
+ return { bundle, canonical_bytes: canonicalBytes, digest, high_water: highWater };
145
+ }
146
+ catch (error) {
147
+ if (error instanceof TrustBundleStoreCorrupt)
148
+ throw error;
149
+ throw new TrustBundleStoreCorrupt(`invalid trust store: ${error.message}`);
150
+ }
151
+ }
152
+ commit(bundle, highWater) {
153
+ if (!Number.isSafeInteger(bundle.bundle_version) || bundle.bundle_version < 0 || !Number.isSafeInteger(highWater) || highWater < bundle.bundle_version) {
154
+ throw new TrustBundleStoreError("bundle version and high-water mark must be non-negative safe integers");
155
+ }
156
+ const canonicalBytes = canonicalDispatchTrustBundle(bundle);
157
+ const digest = bundleDigest(canonicalBytes);
158
+ const state = {
159
+ bundle_b64: canonicalBytes.toString("base64"),
160
+ bundle_digest: digest,
161
+ bundle_version: bundle.bundle_version,
162
+ high_water: highWater,
163
+ };
164
+ const payload = Buffer.from(canonicalTicketClaims(state), "utf8");
165
+ const temporary = (0, node_path_1.join)((0, node_path_1.dirname)(this.path), `${(0, node_path_1.basename)(this.path)}.tmp-${process.pid}-${(0, node_crypto_1.randomUUID)()}`);
166
+ const fd = (0, node_fs_1.openSync)(temporary, "wx", 0o600);
167
+ try {
168
+ (0, node_fs_1.writeFileSync)(fd, payload);
169
+ (0, node_fs_1.fsyncSync)(fd);
170
+ }
171
+ finally {
172
+ (0, node_fs_1.closeSync)(fd);
173
+ }
174
+ try {
175
+ (0, node_fs_1.renameSync)(temporary, this.path);
176
+ (0, node_fs_1.chmodSync)(this.path, 0o600);
177
+ try {
178
+ const directoryFd = (0, node_fs_1.openSync)((0, node_path_1.dirname)(this.path), "r");
179
+ try {
180
+ (0, node_fs_1.fsyncSync)(directoryFd);
181
+ }
182
+ finally {
183
+ (0, node_fs_1.closeSync)(directoryFd);
184
+ }
185
+ }
186
+ catch {
187
+ // Some platforms do not allow fsync on a directory; atomic rename still applies.
188
+ }
189
+ }
190
+ finally {
191
+ if ((0, node_fs_1.existsSync)(temporary))
192
+ (0, node_fs_1.unlinkSync)(temporary);
193
+ }
194
+ return { bundle, canonical_bytes: canonicalBytes, digest, high_water: highWater };
195
+ }
196
+ install(bundle, expectedCurrentVersion) {
197
+ if (!Number.isSafeInteger(bundle.bundle_version) || bundle.bundle_version < 0) {
198
+ throw new TrustBundleStoreError("bundle version must be a non-negative safe integer");
199
+ }
200
+ const fd = this.acquireLock();
201
+ try {
202
+ const current = this.load();
203
+ const currentVersion = current?.bundle.bundle_version;
204
+ if (expectedCurrentVersion !== undefined && expectedCurrentVersion !== currentVersion)
205
+ return { status: "conflict", state: current };
206
+ const candidateDigest = bundleDigest(canonicalDispatchTrustBundle(bundle));
207
+ const highWater = current?.high_water ?? 0;
208
+ if (bundle.bundle_version < highWater)
209
+ return { status: "stale", state: current };
210
+ if (current && bundle.bundle_version === currentVersion) {
211
+ return { status: candidateDigest === current.digest ? "unchanged" : "conflict", state: current };
212
+ }
213
+ return { status: "installed", state: this.commit(bundle, Math.max(highWater, bundle.bundle_version)) };
214
+ }
215
+ finally {
216
+ this.releaseLock(fd);
217
+ }
218
+ }
219
+ recover(bundle, authorization) {
220
+ if (!Number.isSafeInteger(bundle.bundle_version) || bundle.bundle_version < 0) {
221
+ throw new TrustBundleStoreError("bundle version must be a non-negative safe integer");
222
+ }
223
+ if (!authorization?.reason.trim())
224
+ return { status: "recovery_required" };
225
+ const fd = this.acquireLock();
226
+ try {
227
+ let current;
228
+ try {
229
+ current = this.load();
230
+ }
231
+ catch (error) {
232
+ if (!(error instanceof TrustBundleStoreCorrupt))
233
+ throw error;
234
+ }
235
+ const highWater = Math.max(bundle.bundle_version, authorization.minimum_high_water ?? 0, current?.high_water ?? 0);
236
+ return { status: "recovered", state: this.commit(bundle, highWater) };
237
+ }
238
+ finally {
239
+ this.releaseLock(fd);
240
+ }
241
+ }
242
+ }
243
+ exports.FileDispatchTrustBundleStore = FileDispatchTrustBundleStore;
244
+ function decision(code, keyId, accepted = false) {
245
+ return { accepted, code, anchored: accepted, ...(keyId ? { key_id: keyId } : {}) };
246
+ }
247
+ function verifyDispatchTicketV2(claims, signatureB64url, bundle, bindings, options) {
248
+ const minimum = options.minimumBundleVersion ?? 0;
249
+ if (!Number.isSafeInteger(bundle.bundle_version) || bundle.bundle_version < minimum)
250
+ return decision("reject_bundle_rollback");
251
+ if (bundle.valid_from !== undefined && options.now < bundle.valid_from)
252
+ return decision("reject_bundle_not_yet_valid");
253
+ if (bundle.valid_until !== undefined && options.now > bundle.valid_until)
254
+ return decision("reject_bundle_expired");
255
+ if (claims.profile !== exports.DISPATCH_TICKET_V2_PROFILE)
256
+ return decision("reject_required_profile_downgrade");
257
+ const keyId = typeof claims.key_id === "string" ? claims.key_id : undefined;
258
+ const key = keyId ? bundle.keys.find((candidate) => candidate.key_id === keyId) : undefined;
259
+ if (!key)
260
+ return decision("reject_unknown_key", keyId);
261
+ if (key.state === "revoked")
262
+ return decision("reject_key_revoked", keyId);
263
+ if (options.now < key.valid_from || options.now > key.valid_until)
264
+ return decision("reject_key_expired", keyId);
265
+ if (!(key.allowed_profiles ?? [exports.DISPATCH_TICKET_V2_PROFILE]).includes(exports.DISPATCH_TICKET_V2_PROFILE))
266
+ return decision("reject_profile_not_allowed", keyId);
267
+ if (key.issuers?.length && !key.issuers.includes(String(claims.issuer)))
268
+ return decision("reject_issuer", keyId);
269
+ if (key.audiences?.length && !key.audiences.includes(String(claims.audience)))
270
+ return decision("reject_audience", keyId);
271
+ const expected = {
272
+ issuer: bindings.issuer,
273
+ provider_id: bindings.provider_id,
274
+ intent: bindings.intent,
275
+ constraints_digest: bindings.constraints_digest,
276
+ };
277
+ if (Object.entries(expected).some(([name, value]) => claims[name] !== value))
278
+ return decision("reject_claim_mismatch", keyId);
279
+ if (bindings.audience !== undefined && claims.audience !== bindings.audience)
280
+ return decision("reject_claim_mismatch", keyId);
281
+ const expiresAt = claims.expires_at;
282
+ const jti = claims.jti;
283
+ if (!Number.isSafeInteger(expiresAt) || Number(expiresAt) <= options.now || typeof jti !== "string" || !jti)
284
+ return decision("reject_claim_mismatch", keyId);
285
+ try {
286
+ const raw = Buffer.from(key.public_key_b64url, "base64url");
287
+ if (raw.length !== 32)
288
+ return decision("reject_signature", keyId);
289
+ const publicKey = (0, node_crypto_1.createPublicKey)({ key: Buffer.concat([ED25519_SPKI_PREFIX, raw]), format: "der", type: "spki" });
290
+ const message = Buffer.concat([DOMAIN, Buffer.from(canonicalTicketClaims(claims), "utf8")]);
291
+ if (!(0, node_crypto_1.verify)(null, message, publicKey, Buffer.from(signatureB64url, "base64url")))
292
+ return decision("reject_signature", keyId);
293
+ }
294
+ catch {
295
+ return decision("reject_signature", keyId);
296
+ }
297
+ if (options.replayCache?.contains(jti, options.now))
298
+ return decision("reject_local_replay", keyId);
299
+ options.replayCache?.remember(jti, Number(expiresAt));
300
+ return decision("accept_anchored", keyId, true);
301
+ }
302
+ //# sourceMappingURL=dispatch_ticket_trust.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dispatch_ticket_trust.js","sourceRoot":"","sources":["../src/dispatch_ticket_trust.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,22 @@
1
+ /** DNS-aware provider endpoint validation and connection pinning (#667). */
2
+ import * as http from "node:http";
3
+ export declare function privateEndpointsAllowed(): boolean;
4
+ export declare function hostnameAllowed(host: string, allowPrivate?: boolean): boolean;
5
+ export declare function addressAllowed(address: string, allowPrivate?: boolean): boolean;
6
+ export interface ResolvedEndpoint {
7
+ url: URL;
8
+ host: string;
9
+ port: number;
10
+ addresses: ReadonlyArray<{
11
+ address: string;
12
+ family: 4 | 6;
13
+ }>;
14
+ }
15
+ export declare function resolveEndpoint(url: string, allowPrivate?: boolean): Promise<ResolvedEndpoint>;
16
+ export interface PinnedResponse {
17
+ status: number;
18
+ headers: http.IncomingHttpHeaders;
19
+ text: string;
20
+ }
21
+ export declare function postJsonPinned(url: string, body: unknown, headers: Record<string, string>, timeoutMs: number, tlsVerify?: boolean, redirectCount?: number): Promise<PinnedResponse>;
22
+ //# sourceMappingURL=endpoint_security.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"endpoint_security.d.ts","sourceRoot":"","sources":["../src/endpoint_security.ts"],"names":[],"mappings":"AAAA,4EAA4E;AAG5E,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AAmBlC,wBAAgB,uBAAuB,IAAI,OAAO,CAIjD;AAED,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,EAAE,YAAY,UAAQ,GAAG,OAAO,CAO3E;AAED,wBAAgB,cAAc,CAAC,OAAO,EAAE,MAAM,EAAE,YAAY,UAAQ,GAAG,OAAO,CAS7E;AAED,MAAM,WAAW,gBAAgB;IAC/B,GAAG,EAAE,GAAG,CAAC;IACT,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,aAAa,CAAC;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAA;KAAE,CAAC,CAAC;CAC9D;AAED,wBAAsB,eAAe,CAAC,GAAG,EAAE,MAAM,EAAE,YAAY,UAA4B,GAAG,OAAO,CAAC,gBAAgB,CAAC,CA+BtH;AAED,MAAM,WAAW,cAAc;IAAG,MAAM,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,IAAI,CAAC,mBAAmB,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE;AAEnG,wBAAsB,cAAc,CAClC,GAAG,EAAE,MAAM,EACX,IAAI,EAAE,OAAO,EACb,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,EAC/B,SAAS,EAAE,MAAM,EACjB,SAAS,UAAO,EAChB,aAAa,SAAI,GAChB,OAAO,CAAC,cAAc,CAAC,CAyCzB"}
@@ -0,0 +1,141 @@
1
+ "use strict";
2
+ /** DNS-aware provider endpoint validation and connection pinning (#667). */
3
+ Object.defineProperty(exports, "__esModule", { value: true });
4
+ exports.privateEndpointsAllowed = privateEndpointsAllowed;
5
+ exports.hostnameAllowed = hostnameAllowed;
6
+ exports.addressAllowed = addressAllowed;
7
+ exports.resolveEndpoint = resolveEndpoint;
8
+ exports.postJsonPinned = postJsonPinned;
9
+ const promises_1 = require("node:dns/promises");
10
+ const http = require("node:http");
11
+ const https = require("node:https");
12
+ const node_net_1 = require("node:net");
13
+ const BLOCKED_SUFFIXES = [".local", ".internal", ".lan", ".test", ".invalid", ".localhost"];
14
+ const blocked = new node_net_1.BlockList();
15
+ for (const [network, prefix] of [
16
+ ["0.0.0.0", 8], ["10.0.0.0", 8], ["100.64.0.0", 10], ["127.0.0.0", 8],
17
+ ["169.254.0.0", 16], ["172.16.0.0", 12], ["192.0.0.0", 24], ["192.0.2.0", 24], ["192.168.0.0", 16],
18
+ ["198.18.0.0", 15], ["198.51.100.0", 24], ["203.0.113.0", 24], ["224.0.0.0", 4],
19
+ ["240.0.0.0", 4],
20
+ ])
21
+ blocked.addSubnet(network, prefix, "ipv4");
22
+ for (const [network, prefix] of [
23
+ ["::", 128], ["::1", 128], ["100::", 64], ["2001:db8::", 32], ["fc00::", 7],
24
+ ["fe80::", 10], ["ff00::", 8],
25
+ ])
26
+ blocked.addSubnet(network, prefix, "ipv6");
27
+ function privateEndpointsAllowed() {
28
+ return ["1", "true", "yes"].includes((process.env.IICP_PROXY_ALLOW_LOOPBACK_NODES ?? "").trim().toLowerCase());
29
+ }
30
+ function hostnameAllowed(host, allowPrivate = false) {
31
+ if (!host)
32
+ return false;
33
+ if (allowPrivate)
34
+ return true;
35
+ const normalized = host.replace(/\.$/, "").toLowerCase();
36
+ if (["localhost", "0.0.0.0", "::1", "::"].includes(normalized))
37
+ return false;
38
+ if (BLOCKED_SUFFIXES.some((suffix) => normalized.endsWith(suffix)))
39
+ return false;
40
+ return (0, node_net_1.isIP)(normalized) !== 0 || normalized.includes(".") || normalized.includes(":");
41
+ }
42
+ function addressAllowed(address, allowPrivate = false) {
43
+ if (allowPrivate)
44
+ return true;
45
+ const family = (0, node_net_1.isIP)(address);
46
+ if (family === 0)
47
+ return false;
48
+ if (family === 4)
49
+ return !blocked.check(address, "ipv4");
50
+ const dottedMapped = /^::ffff:(\d+\.\d+\.\d+\.\d+)$/i.exec(address);
51
+ if (dottedMapped)
52
+ return addressAllowed(dottedMapped[1], false);
53
+ if (/^::ffff:/i.test(address))
54
+ return false; // conservatively refuse hexadecimal mapped forms
55
+ return !blocked.check(address, "ipv6");
56
+ }
57
+ async function resolveEndpoint(url, allowPrivate = privateEndpointsAllowed()) {
58
+ let parsed;
59
+ try {
60
+ parsed = new URL(url);
61
+ }
62
+ catch {
63
+ throw new Error("IICP-ENDPOINT-REFUSED: invalid provider URL");
64
+ }
65
+ if (!["http:", "https:"].includes(parsed.protocol)) {
66
+ throw new Error("IICP-ENDPOINT-REFUSED: provider endpoint must use HTTP or HTTPS");
67
+ }
68
+ if (parsed.username || parsed.password) {
69
+ throw new Error("IICP-ENDPOINT-REFUSED: provider endpoint must not contain user info");
70
+ }
71
+ const host = parsed.hostname.replace(/^\[|\]$/g, "").replace(/\.$/, "").toLowerCase();
72
+ if (!hostnameAllowed(host, allowPrivate)) {
73
+ throw new Error("IICP-ENDPOINT-REFUSED: provider hostname is prohibited by network policy");
74
+ }
75
+ const port = Number(parsed.port || (parsed.protocol === "https:" ? 443 : 80));
76
+ let answers;
77
+ const literalFamily = (0, node_net_1.isIP)(host);
78
+ if (literalFamily) {
79
+ answers = [{ address: host, family: literalFamily }];
80
+ }
81
+ else {
82
+ try {
83
+ answers = await (0, promises_1.lookup)(host, { all: true, verbatim: true });
84
+ }
85
+ catch {
86
+ throw new Error("IICP-ENDPOINT-REFUSED: provider hostname resolution failed");
87
+ }
88
+ }
89
+ const unique = [...new Map(answers.map((answer) => [`${answer.family}:${answer.address}`, answer])).values()];
90
+ if (unique.length === 0)
91
+ throw new Error("IICP-ENDPOINT-REFUSED: provider hostname returned no addresses");
92
+ if (unique.some((answer) => !addressAllowed(answer.address, allowPrivate))) {
93
+ throw new Error("IICP-ENDPOINT-REFUSED: provider hostname resolved to a prohibited address");
94
+ }
95
+ return { url: parsed, host, port, addresses: unique };
96
+ }
97
+ async function postJsonPinned(url, body, headers, timeoutMs, tlsVerify = true, redirectCount = 0) {
98
+ const endpoint = await resolveEndpoint(url);
99
+ const selected = endpoint.addresses[0];
100
+ const payload = JSON.stringify(body);
101
+ const requestHeaders = { ...headers, "Content-Length": String(Buffer.byteLength(payload)) };
102
+ const transport = endpoint.url.protocol === "https:" ? https : http;
103
+ const pinnedLookup = (_hostname, _options, callback) => {
104
+ callback(null, selected.address, selected.family);
105
+ };
106
+ const response = await new Promise((resolve, reject) => {
107
+ const req = transport.request({
108
+ protocol: endpoint.url.protocol,
109
+ hostname: endpoint.host,
110
+ port: endpoint.port,
111
+ path: `${endpoint.url.pathname}${endpoint.url.search}`,
112
+ method: "POST",
113
+ headers: requestHeaders,
114
+ servername: endpoint.host,
115
+ rejectUnauthorized: tlsVerify,
116
+ agent: false,
117
+ lookup: pinnedLookup,
118
+ }, (res) => {
119
+ const chunks = [];
120
+ res.on("data", (chunk) => chunks.push(Buffer.isBuffer(chunk) ? chunk : Buffer.from(chunk)));
121
+ res.on("end", () => resolve({ status: res.statusCode ?? 0, headers: res.headers, text: Buffer.concat(chunks).toString("utf8") }));
122
+ });
123
+ req.setTimeout(timeoutMs, () => req.destroy(new Error(`Request timed out after ${timeoutMs}ms`)));
124
+ req.on("error", reject);
125
+ req.end(payload);
126
+ });
127
+ if (response.status === 307 || response.status === 308) {
128
+ const location = response.headers.location;
129
+ if (!location || redirectCount >= 3)
130
+ throw new Error("IICP-ENDPOINT-REFUSED: provider redirect limit exceeded or omitted Location");
131
+ const next = new URL(location, endpoint.url);
132
+ if (next.origin !== endpoint.url.origin)
133
+ throw new Error("IICP-ENDPOINT-REFUSED: cross-origin provider redirect is not allowed");
134
+ return postJsonPinned(next.toString(), body, headers, timeoutMs, tlsVerify, redirectCount + 1);
135
+ }
136
+ if (response.status >= 300 && response.status < 400) {
137
+ throw new Error("IICP-ENDPOINT-REFUSED: provider redirect method is not allowed");
138
+ }
139
+ return response;
140
+ }
141
+ //# sourceMappingURL=endpoint_security.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"endpoint_security.js","sourceRoot":"","sources":["../src/endpoint_security.ts"],"names":[],"mappings":"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"}
package/dist/index.d.ts CHANGED
@@ -4,6 +4,10 @@ export { evaluatePreNormativeProfile } from "./profile_compatibility.js";
4
4
  export type { ProfileCompatibilityDecision } from "./profile_compatibility.js";
5
5
  export type { DiscoveryResult, ProfileNegotiation, ProfileRequest, RouteConstraints } from "./types.js";
6
6
  export { projectExecutionConstraints, projectRouteOptions } from "./request_projection.js";
7
+ export { DISPATCH_TICKET_V2_PROFILE, FileDispatchTrustBundleStore, LocalDispatchReplayCache, TrustBundleStoreCorrupt, TrustBundleStoreError, TrustBundleStoreLocked, canonicalDispatchTrustBundle, canonicalTicketClaims, verifyDispatchTicketV2, } from "./dispatch_ticket_trust.js";
8
+ export type { DispatchTicketBindings, AdminRecoveryAuthorization, DispatchTrustBundle, DispatchTrustDecision, DispatchTrustKey, StoredDispatchTrustBundle, TrustBundleInstallResult, TrustBundleInstallStatus, TrustBundleStore, } from "./dispatch_ticket_trust.js";
9
+ export { BackendCancellationRegistry, BoundedObserverBuffer, LifecycleConflict, LifecycleResumeUnavailable, LifecycleStore, ObserverLagged, SERVICE_LIFECYCLE_PROFILE, TERMINAL_LIFECYCLE_STATES, UnknownLifecycleTask } from "./service_lifecycle.js";
10
+ export type { BackendCancellationEvidence, BackendCancellationEvidenceLevel, BackendCancellationHandler, BackendCancellationOutcome, LifecycleEvent, LifecycleRecord, LifecycleSnapshot } from "./service_lifecycle.js";
7
11
  export { IicpError } from "./errors.js";
8
12
  export { IicpNode } from "./node.js";
9
13
  export { McpToolPolicy, toolRiskLabel, TOOL_RISK_KEYWORDS } from "./mcp_policy.js";
@@ -26,6 +30,7 @@ export type { AnthropicOptions } from "./backends/anthropic.js";
26
30
  export { getBackendHandler, BACKEND_TYPES } from "./backends/index.js";
27
31
  export type { BackendType } from "./backends/index.js";
28
32
  export type { BackendHandler, BackendOptions } from "./backends/base.js";
33
+ export { withBackendCancellation } from "./backends/base.js";
29
34
  export { qosPriority, isQueueEligible, QOS_PRIORITY, QUEUE_ELIGIBLE, QUEUE_WAIT_MS } from "./scheduler.js";
30
35
  export { AvailabilityEvaluator } from "./availability.js";
31
36
  export type { Window } from "./availability.js";
@@ -48,4 +53,14 @@ export { CapacityExceededError, ConcurrencyGate } from "./concurrency.js";
48
53
  export { RECOVERY_EXIT_CODE, DEFAULT_RECOVERY_GRACE_CHECKS, DEFAULT_RECOVERY_CHECK_EVERY_HEARTBEATS, nodeRegistryPrefix, envGraceChecks, envCheckEveryHeartbeats, supervisedRecoveryEnabled, classifyRecovery, registryNodePresence, } from "./recovery.js";
49
54
  export type { RecoveryState, RecoveryAction, DirectoryPresence } from "./recovery.js";
50
55
  export type { ChatMessage, ChatOptions, ChatResponse, ChatChoice, ChatUsage, ClientConfig, DiscoverOptions, Node, RoutingPolicy, RoutingProfile, TaskAuth, TaskConstraints, TaskMetrics, TaskRequest, TaskResponse, } from "./types.js";
56
+ export { evaluatePolicyDataHandling } from "./policy_data_handling.js";
57
+ export { evaluatePolicyOperationalEvidence } from "./policy_operational_evidence.js";
58
+ export type { PolicyEvidenceDecision, PolicyEvidenceRecord } from "./policy_operational_evidence.js";
59
+ export { POLICY_DETAIL_FIELDS, evaluatePolicyDetailDisclosure, verifyPolicyDetailConsumerToken } from "./policy_detail_disclosure.js";
60
+ export type { PolicyDetailDisclosureDecision } from "./policy_detail_disclosure.js";
61
+ export { evaluateDistributedLifecycle } from "./service_lifecycle_distributed.js";
62
+ export { evaluateLifecycleIdentity } from "./service_lifecycle_identity.js";
63
+ export type { PolicyDataDecision, PolicyDataRecord } from "./policy_data_handling.js";
64
+ export { decideLifecycleAccounting } from "./service_lifecycle_accounting.js";
65
+ export type { LifecycleAccountingDecision, LifecycleAccountingInput, } from "./service_lifecycle_accounting.js";
51
66
  //# sourceMappingURL=index.d.ts.map