@kya-os/mcp-i-core 1.4.18 → 1.6.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (37) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +14 -0
  3. package/dist/auth/handshake.d.ts +119 -0
  4. package/dist/auth/handshake.js +250 -0
  5. package/dist/auth/index.d.ts +6 -0
  6. package/dist/auth/index.js +11 -0
  7. package/dist/auth/types.d.ts +46 -0
  8. package/dist/auth/types.js +10 -0
  9. package/dist/delegation/index.d.ts +1 -0
  10. package/dist/delegation/index.js +1 -0
  11. package/dist/delegation/outbound-proof.d.ts +70 -0
  12. package/dist/delegation/outbound-proof.js +67 -0
  13. package/dist/identity/user-did-manager.js +5 -3
  14. package/dist/index.d.ts +5 -0
  15. package/dist/index.js +25 -2
  16. package/dist/proof/generator.d.ts +109 -0
  17. package/dist/proof/generator.js +236 -0
  18. package/dist/proof/index.d.ts +5 -0
  19. package/dist/proof/index.js +11 -0
  20. package/dist/providers/base.d.ts +5 -1
  21. package/dist/runtime/base.d.ts +127 -13
  22. package/dist/runtime/base.js +199 -51
  23. package/dist/runtime/ext-apps-constants.d.ts +14 -0
  24. package/dist/runtime/ext-apps-constants.js +17 -0
  25. package/dist/services/batch-delegation.service.d.ts +1 -1
  26. package/dist/services/batch-delegation.service.js +4 -4
  27. package/dist/services/proof-verifier.js +1 -1
  28. package/dist/session/index.d.ts +5 -0
  29. package/dist/session/index.js +11 -0
  30. package/dist/session/manager.d.ts +113 -0
  31. package/dist/session/manager.js +273 -0
  32. package/docs/API_REFERENCE.md +76 -0
  33. package/docs/COMPLIANCE_MATRIX.md +691 -0
  34. package/docs/STATUSLIST2021_GUIDE.md +696 -0
  35. package/docs/W3C_VC_DELEGATION_GUIDE.md +710 -0
  36. package/package.json +22 -6
  37. package/vitest.config.mts +8 -7
package/dist/index.d.ts CHANGED
@@ -8,6 +8,7 @@ export { CryptoProvider, ClockProvider, FetchProvider, StorageProvider, NonceCac
8
8
  export { MemoryStorageProvider, MemoryNonceCacheProvider, MemoryIdentityProvider, } from "./providers/memory";
9
9
  export { MCPIRuntimeBase } from "./runtime/base";
10
10
  export type { RuntimeWithAccessControl } from "./runtime/base";
11
+ export { CONSENT_UI_RESOURCE_URI } from "./runtime/ext-apps-constants";
11
12
  export type { IAuditLogger } from "./runtime/audit-logger";
12
13
  export * from "./utils";
13
14
  export { ToolProtectionService } from "./services/tool-protection.service";
@@ -55,6 +56,7 @@ export { DelegationGraphManager, createDelegationGraph, type DelegationNode, typ
55
56
  export { CascadingRevocationManager, createCascadingRevocationManager, type RevocationEvent, type RevocationHook, type CascadingRevocationOptions, } from "./delegation/cascading-revocation";
56
57
  export { MemoryStatusListStorage } from "./delegation/storage/memory-statuslist-storage";
57
58
  export { MemoryDelegationGraphStorage } from "./delegation/storage/memory-graph-storage";
59
+ export { buildDelegationProofJWT, buildChainString, type DelegationProofOptions, type Ed25519PrivateJWK, } from "./delegation/outbound-proof";
58
60
  export { createDidKeyResolver, isEd25519DidKey, extractPublicKeyFromDidKey, publicKeyToJwk, resolveDidKeySync, } from "./delegation/did-key-resolver";
59
61
  export { base58Encode, base58Decode, isValidBase58 } from "./utils/base58";
60
62
  export { SchemaVerifier, createSchemaVerifier, type SchemaMetadata, type FieldComplianceResult, type SchemaComplianceReport, type FullComplianceReport, } from "./compliance/schema-verifier";
@@ -71,4 +73,7 @@ export { IdpTokenResolver } from "./identity/idp-token-resolver";
71
73
  export type { IdpTokenResolverConfig } from "./identity/idp-token-resolver";
72
74
  export type { IIdpTokenStorage, TokenUsageMetadata, IdpTokensWithMetadata, } from "./identity/idp-token-storage.interface";
73
75
  export { logger, createDefaultConsoleLogger, type Logger, type Level, } from "./logging";
76
+ export { ProofGenerator, createProofResponse, extractCanonicalData, type ProofAgentIdentity, type ToolRequest, type ToolResponse, type ProofOptions, } from "./proof";
77
+ export { SessionManager, createHandshakeRequest, validateHandshakeFormat, type SessionConfig, type HandshakeResult, } from "./session";
78
+ export { verifyOrHints, hasSensitiveScopes, MemoryResumeTokenStore, type AuthHandshakeConfig, type VerifyOrHintsResult, type AgentReputation, type ResumeTokenStore, type DelegationVerifier, type VerifyDelegationResult, } from "./auth";
74
79
  //# sourceMappingURL=index.d.ts.map
package/dist/index.js CHANGED
@@ -20,8 +20,9 @@ var __exportStar = (this && this.__exportStar) || function(m, exports) {
20
20
  for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
21
21
  };
22
22
  Object.defineProperty(exports, "__esModule", { value: true });
23
- exports.createStatusListManager = exports.StatusList2021Manager = exports.createDelegationVerifier = exports.DelegationCredentialVerifier = exports.createDelegationIssuer = exports.DelegationCredentialIssuer = exports.createDelegationErrorFormatter = exports.DelegationErrorFormatter = exports.OAuthRequiredError = exports.DelegationRequiredError = exports.NoOpToolProtectionCache = exports.InMemoryToolProtectionCache = exports.createProofVerificationError = exports.PROOF_VERIFICATION_ERROR_CODES = exports.ProofVerificationError = exports.migrateLegacyKeys = exports.StorageKeyHelpers = exports.createStorageProviders = exports.NoOpOAuthConfigCache = exports.InMemoryOAuthConfigCache = exports.BatchDelegationService = exports.OAuthTokenRetrievalService = exports.ProviderValidationError = exports.ProviderValidator = exports.CredentialAuthModeError = exports.ConsentOnlyModeError = exports.ProviderResolver = exports.OAuthProviderRegistry = exports.ToolContextBuilder = exports.defaultSecretResolver = exports.OAuthService = exports.OAuthConfigService = exports.createSessionRegistrationService = exports.SessionRegistrationService = exports.authorizationMatches = exports.AccessControlApiService = exports.ProofVerifier = exports.CryptoService = exports.PolicyService = exports.ToolProtectionService = exports.MCPIRuntimeBase = exports.MemoryIdentityProvider = exports.MemoryNonceCacheProvider = exports.MemoryStorageProvider = exports.IdentityProvider = exports.NonceCacheProvider = exports.StorageProvider = exports.FetchProvider = exports.ClockProvider = exports.CryptoProvider = void 0;
24
- exports.createDefaultConsoleLogger = exports.logger = exports.IdpTokenResolver = exports.UserDidManager = exports.isPolicyEnabled = exports.hasMergedPolicy = exports.extractPolicy = exports.getPolicy = exports.hasMergedToolProtections = exports.extractToolProtections = exports.getToolProtection = exports.fetchRemoteConfig = exports.bytesToBase64 = exports.base64urlDecodeToString = exports.base64urlDecodeToBytes = exports.base64urlEncodeFromString = exports.base64urlEncodeFromBytes = exports.parseVCJWT = exports.completeVCJWT = exports.createUnsignedVCJWT = exports.canonicalizeJSON = exports.getSchemaStats = exports.getCriticalSchemas = exports.getSchemaById = exports.getSchemasByCategory = exports.getAllSchemas = exports.SCHEMA_REGISTRY = exports.createSchemaVerifier = exports.SchemaVerifier = exports.isValidBase58 = exports.base58Decode = exports.base58Encode = exports.resolveDidKeySync = exports.publicKeyToJwk = exports.extractPublicKeyFromDidKey = exports.isEd25519DidKey = exports.createDidKeyResolver = exports.MemoryDelegationGraphStorage = exports.MemoryStatusListStorage = exports.createCascadingRevocationManager = exports.CascadingRevocationManager = exports.createDelegationGraph = exports.DelegationGraphManager = exports.isIndexSet = exports.BitstringManager = void 0;
23
+ exports.StatusList2021Manager = exports.createDelegationVerifier = exports.DelegationCredentialVerifier = exports.createDelegationIssuer = exports.DelegationCredentialIssuer = exports.createDelegationErrorFormatter = exports.DelegationErrorFormatter = exports.OAuthRequiredError = exports.DelegationRequiredError = exports.NoOpToolProtectionCache = exports.InMemoryToolProtectionCache = exports.createProofVerificationError = exports.PROOF_VERIFICATION_ERROR_CODES = exports.ProofVerificationError = exports.migrateLegacyKeys = exports.StorageKeyHelpers = exports.createStorageProviders = exports.NoOpOAuthConfigCache = exports.InMemoryOAuthConfigCache = exports.BatchDelegationService = exports.OAuthTokenRetrievalService = exports.ProviderValidationError = exports.ProviderValidator = exports.CredentialAuthModeError = exports.ConsentOnlyModeError = exports.ProviderResolver = exports.OAuthProviderRegistry = exports.ToolContextBuilder = exports.defaultSecretResolver = exports.OAuthService = exports.OAuthConfigService = exports.createSessionRegistrationService = exports.SessionRegistrationService = exports.authorizationMatches = exports.AccessControlApiService = exports.ProofVerifier = exports.CryptoService = exports.PolicyService = exports.ToolProtectionService = exports.CONSENT_UI_RESOURCE_URI = exports.MCPIRuntimeBase = exports.MemoryIdentityProvider = exports.MemoryNonceCacheProvider = exports.MemoryStorageProvider = exports.IdentityProvider = exports.NonceCacheProvider = exports.StorageProvider = exports.FetchProvider = exports.ClockProvider = exports.CryptoProvider = void 0;
24
+ exports.createProofResponse = exports.ProofGenerator = exports.createDefaultConsoleLogger = exports.logger = exports.IdpTokenResolver = exports.UserDidManager = exports.isPolicyEnabled = exports.hasMergedPolicy = exports.extractPolicy = exports.getPolicy = exports.hasMergedToolProtections = exports.extractToolProtections = exports.getToolProtection = exports.fetchRemoteConfig = exports.bytesToBase64 = exports.base64urlDecodeToString = exports.base64urlDecodeToBytes = exports.base64urlEncodeFromString = exports.base64urlEncodeFromBytes = exports.parseVCJWT = exports.completeVCJWT = exports.createUnsignedVCJWT = exports.canonicalizeJSON = exports.getSchemaStats = exports.getCriticalSchemas = exports.getSchemaById = exports.getSchemasByCategory = exports.getAllSchemas = exports.SCHEMA_REGISTRY = exports.createSchemaVerifier = exports.SchemaVerifier = exports.isValidBase58 = exports.base58Decode = exports.base58Encode = exports.resolveDidKeySync = exports.publicKeyToJwk = exports.extractPublicKeyFromDidKey = exports.isEd25519DidKey = exports.createDidKeyResolver = exports.buildChainString = exports.buildDelegationProofJWT = exports.MemoryDelegationGraphStorage = exports.MemoryStatusListStorage = exports.createCascadingRevocationManager = exports.CascadingRevocationManager = exports.createDelegationGraph = exports.DelegationGraphManager = exports.isIndexSet = exports.BitstringManager = exports.createStatusListManager = void 0;
25
+ exports.MemoryResumeTokenStore = exports.hasSensitiveScopes = exports.verifyOrHints = exports.validateHandshakeFormat = exports.createHandshakeRequest = exports.SessionManager = exports.extractCanonicalData = void 0;
25
26
  // Base providers
26
27
  var base_1 = require("./providers/base");
27
28
  Object.defineProperty(exports, "CryptoProvider", { enumerable: true, get: function () { return base_1.CryptoProvider; } });
@@ -38,6 +39,9 @@ Object.defineProperty(exports, "MemoryIdentityProvider", { enumerable: true, get
38
39
  // Runtime
39
40
  var base_2 = require("./runtime/base");
40
41
  Object.defineProperty(exports, "MCPIRuntimeBase", { enumerable: true, get: function () { return base_2.MCPIRuntimeBase; } });
42
+ // MCP Apps consent constants
43
+ var ext_apps_constants_1 = require("./runtime/ext-apps-constants");
44
+ Object.defineProperty(exports, "CONSENT_UI_RESOURCE_URI", { enumerable: true, get: function () { return ext_apps_constants_1.CONSENT_UI_RESOURCE_URI; } });
41
45
  // Utilities
42
46
  __exportStar(require("./utils"), exports);
43
47
  // Tool Protection
@@ -139,6 +143,10 @@ var memory_statuslist_storage_1 = require("./delegation/storage/memory-statuslis
139
143
  Object.defineProperty(exports, "MemoryStatusListStorage", { enumerable: true, get: function () { return memory_statuslist_storage_1.MemoryStatusListStorage; } });
140
144
  var memory_graph_storage_1 = require("./delegation/storage/memory-graph-storage");
141
145
  Object.defineProperty(exports, "MemoryDelegationGraphStorage", { enumerable: true, get: function () { return memory_graph_storage_1.MemoryDelegationGraphStorage; } });
146
+ // Outbound Delegation Proof (Phase 1 — Outbound Propagation)
147
+ var outbound_proof_1 = require("./delegation/outbound-proof");
148
+ Object.defineProperty(exports, "buildDelegationProofJWT", { enumerable: true, get: function () { return outbound_proof_1.buildDelegationProofJWT; } });
149
+ Object.defineProperty(exports, "buildChainString", { enumerable: true, get: function () { return outbound_proof_1.buildChainString; } });
142
150
  // DID:key Resolver (Phase 3 VC Verification)
143
151
  var did_key_resolver_1 = require("./delegation/did-key-resolver");
144
152
  Object.defineProperty(exports, "createDidKeyResolver", { enumerable: true, get: function () { return did_key_resolver_1.createDidKeyResolver; } });
@@ -198,4 +206,19 @@ Object.defineProperty(exports, "IdpTokenResolver", { enumerable: true, get: func
198
206
  var logging_1 = require("./logging");
199
207
  Object.defineProperty(exports, "logger", { enumerable: true, get: function () { return logging_1.logger; } });
200
208
  Object.defineProperty(exports, "createDefaultConsoleLogger", { enumerable: true, get: function () { return logging_1.createDefaultConsoleLogger; } });
209
+ // Proof generation (platform-agnostic protocol reference — Phase 2)
210
+ var proof_1 = require("./proof");
211
+ Object.defineProperty(exports, "ProofGenerator", { enumerable: true, get: function () { return proof_1.ProofGenerator; } });
212
+ Object.defineProperty(exports, "createProofResponse", { enumerable: true, get: function () { return proof_1.createProofResponse; } });
213
+ Object.defineProperty(exports, "extractCanonicalData", { enumerable: true, get: function () { return proof_1.extractCanonicalData; } });
214
+ // Session management (platform-agnostic protocol reference — Phase 2)
215
+ var session_1 = require("./session");
216
+ Object.defineProperty(exports, "SessionManager", { enumerable: true, get: function () { return session_1.SessionManager; } });
217
+ Object.defineProperty(exports, "createHandshakeRequest", { enumerable: true, get: function () { return session_1.createHandshakeRequest; } });
218
+ Object.defineProperty(exports, "validateHandshakeFormat", { enumerable: true, get: function () { return session_1.validateHandshakeFormat; } });
219
+ // Auth handshake (platform-agnostic protocol reference — Phase 2)
220
+ var auth_1 = require("./auth");
221
+ Object.defineProperty(exports, "verifyOrHints", { enumerable: true, get: function () { return auth_1.verifyOrHints; } });
222
+ Object.defineProperty(exports, "hasSensitiveScopes", { enumerable: true, get: function () { return auth_1.hasSensitiveScopes; } });
223
+ Object.defineProperty(exports, "MemoryResumeTokenStore", { enumerable: true, get: function () { return auth_1.MemoryResumeTokenStore; } });
201
224
  //# sourceMappingURL=index.js.map
@@ -0,0 +1,109 @@
1
+ /**
2
+ * Proof Generation — Platform-agnostic Protocol Reference
3
+ *
4
+ * Handles JCS canonicalization, SHA-256 digest generation, and Ed25519 JWS
5
+ * signing (compact format) according to MCP-I requirements 5.1, 5.2, 5.3, 5.6.
6
+ *
7
+ * This module is the authoritative proof implementation. All platform adapters
8
+ * (Node.js, Cloudflare Workers) inject a CryptoProvider and delegate here.
9
+ */
10
+ import { DetachedProof } from "@kya-os/contracts/proof";
11
+ import { SessionContext } from "@kya-os/contracts/handshake";
12
+ import { CryptoProvider } from "../providers/base";
13
+ /**
14
+ * Minimal agent identity required by ProofGenerator.
15
+ * Structurally compatible with both AgentIdentity definitions
16
+ * in mcp-i-core (providers/base) and packages/mcp-i (runtime/identity).
17
+ */
18
+ export interface ProofAgentIdentity {
19
+ did: string;
20
+ kid: string;
21
+ privateKey: string;
22
+ publicKey: string;
23
+ }
24
+ /**
25
+ * Tool request structure for proof generation
26
+ */
27
+ export interface ToolRequest {
28
+ method: string;
29
+ params?: unknown;
30
+ }
31
+ /**
32
+ * Tool response structure for proof generation
33
+ */
34
+ export interface ToolResponse {
35
+ data: unknown;
36
+ meta?: {
37
+ proof?: DetachedProof;
38
+ [key: string]: unknown;
39
+ };
40
+ }
41
+ /**
42
+ * Proof generation options
43
+ */
44
+ export interface ProofOptions {
45
+ scopeId?: string;
46
+ delegationRef?: string;
47
+ clientDid?: string;
48
+ }
49
+ /**
50
+ * Platform-agnostic proof generator.
51
+ * Requires a CryptoProvider for all cryptographic operations.
52
+ */
53
+ export declare class ProofGenerator {
54
+ private identity;
55
+ private cryptoProvider;
56
+ constructor(identity: ProofAgentIdentity, cryptoProvider: CryptoProvider);
57
+ /**
58
+ * Generate proof for tool request/response.
59
+ * Requirements: 5.1, 5.2, 5.3, 5.6
60
+ */
61
+ generateProof(request: ToolRequest, response: ToolResponse, session: SessionContext, options?: ProofOptions): Promise<DetachedProof>;
62
+ /**
63
+ * Generate canonical hashes for request and response.
64
+ * Requirement: 5.1
65
+ */
66
+ private generateCanonicalHashes;
67
+ /**
68
+ * Generate SHA-256 hash with JCS canonicalization.
69
+ * Requirement: 5.2
70
+ *
71
+ * Delegates to CryptoProvider.hash() which must return "sha256:<hex>".
72
+ */
73
+ private generateSHA256Hash;
74
+ /**
75
+ * JCS canonicalization implementation (RFC 8785)
76
+ */
77
+ private canonicalizeJSON;
78
+ /**
79
+ * Generate Ed25519 JWS in compact format (header.payload.signature).
80
+ * Requirement: 5.3
81
+ *
82
+ * Uses standard JWT claims (aud, sub, iss) in addition to custom claims.
83
+ */
84
+ private generateJWS;
85
+ /**
86
+ * Format base64 private key as PKCS#8 PEM for JOSE library.
87
+ */
88
+ private formatPrivateKeyAsPEM;
89
+ /**
90
+ * Verify a proof (for testing/validation).
91
+ */
92
+ verifyProof(proof: DetachedProof, request: ToolRequest, response: ToolResponse): Promise<boolean>;
93
+ /**
94
+ * Convert base64 public key to Ed25519 JWK format.
95
+ */
96
+ private base64PublicKeyToJWK;
97
+ }
98
+ /**
99
+ * Create a tool response with proof.
100
+ */
101
+ export declare function createProofResponse(request: ToolRequest, data: unknown, identity: ProofAgentIdentity, session: SessionContext, cryptoProvider: CryptoProvider, options?: ProofOptions): Promise<ToolResponse>;
102
+ /**
103
+ * Extract canonical data for hashing (utility for testing).
104
+ */
105
+ export declare function extractCanonicalData(request: ToolRequest, response: ToolResponse): {
106
+ request: unknown;
107
+ response: unknown;
108
+ };
109
+ //# sourceMappingURL=generator.d.ts.map
@@ -0,0 +1,236 @@
1
+ "use strict";
2
+ /**
3
+ * Proof Generation — Platform-agnostic Protocol Reference
4
+ *
5
+ * Handles JCS canonicalization, SHA-256 digest generation, and Ed25519 JWS
6
+ * signing (compact format) according to MCP-I requirements 5.1, 5.2, 5.3, 5.6.
7
+ *
8
+ * This module is the authoritative proof implementation. All platform adapters
9
+ * (Node.js, Cloudflare Workers) inject a CryptoProvider and delegate here.
10
+ */
11
+ Object.defineProperty(exports, "__esModule", { value: true });
12
+ exports.ProofGenerator = void 0;
13
+ exports.createProofResponse = createProofResponse;
14
+ exports.extractCanonicalData = extractCanonicalData;
15
+ const jose_1 = require("jose");
16
+ const json_canonicalize_1 = require("json-canonicalize");
17
+ const crypto_service_1 = require("../services/crypto.service");
18
+ /**
19
+ * Platform-agnostic proof generator.
20
+ * Requires a CryptoProvider for all cryptographic operations.
21
+ */
22
+ class ProofGenerator {
23
+ identity;
24
+ cryptoProvider;
25
+ constructor(identity, cryptoProvider) {
26
+ this.identity = identity;
27
+ this.cryptoProvider = cryptoProvider;
28
+ }
29
+ /**
30
+ * Generate proof for tool request/response.
31
+ * Requirements: 5.1, 5.2, 5.3, 5.6
32
+ */
33
+ async generateProof(request, response, session, options = {}) {
34
+ const hashes = await this.generateCanonicalHashes(request, response);
35
+ const meta = {
36
+ did: this.identity.did,
37
+ kid: this.identity.kid,
38
+ ts: Math.floor(Date.now() / 1000),
39
+ nonce: session.nonce,
40
+ audience: session.audience,
41
+ sessionId: session.sessionId,
42
+ requestHash: hashes.requestHash,
43
+ responseHash: hashes.responseHash,
44
+ ...options,
45
+ };
46
+ const jws = await this.generateJWS(meta);
47
+ return { jws, meta };
48
+ }
49
+ /**
50
+ * Generate canonical hashes for request and response.
51
+ * Requirement: 5.1
52
+ */
53
+ async generateCanonicalHashes(request, response) {
54
+ const canonicalRequest = {
55
+ method: request.method,
56
+ ...(request.params ? { params: request.params } : {}),
57
+ };
58
+ const canonicalResponse = response.data;
59
+ const requestHash = await this.generateSHA256Hash(canonicalRequest);
60
+ const responseHash = await this.generateSHA256Hash(canonicalResponse);
61
+ return { requestHash, responseHash };
62
+ }
63
+ /**
64
+ * Generate SHA-256 hash with JCS canonicalization.
65
+ * Requirement: 5.2
66
+ *
67
+ * Delegates to CryptoProvider.hash() which must return "sha256:<hex>".
68
+ */
69
+ async generateSHA256Hash(data) {
70
+ const canonicalJson = this.canonicalizeJSON(data);
71
+ const encoded = new TextEncoder().encode(canonicalJson);
72
+ return this.cryptoProvider.hash(encoded);
73
+ }
74
+ /**
75
+ * JCS canonicalization implementation (RFC 8785)
76
+ */
77
+ canonicalizeJSON(obj) {
78
+ return (0, json_canonicalize_1.canonicalize)(obj);
79
+ }
80
+ /**
81
+ * Generate Ed25519 JWS in compact format (header.payload.signature).
82
+ * Requirement: 5.3
83
+ *
84
+ * Uses standard JWT claims (aud, sub, iss) in addition to custom claims.
85
+ */
86
+ async generateJWS(meta) {
87
+ try {
88
+ const privateKeyPem = this.formatPrivateKeyAsPEM(this.identity.privateKey);
89
+ const privateKey = await (0, jose_1.importPKCS8)(privateKeyPem, "EdDSA");
90
+ const payload = {
91
+ aud: meta.audience,
92
+ sub: meta.did,
93
+ iss: meta.did,
94
+ requestHash: meta.requestHash,
95
+ responseHash: meta.responseHash,
96
+ ts: meta.ts,
97
+ nonce: meta.nonce,
98
+ sessionId: meta.sessionId,
99
+ ...(meta.scopeId && { scopeId: meta.scopeId }),
100
+ ...(meta.delegationRef && { delegationRef: meta.delegationRef }),
101
+ ...(meta.clientDid && { clientDid: meta.clientDid }),
102
+ };
103
+ const jwt = await new jose_1.SignJWT(payload)
104
+ .setProtectedHeader({
105
+ alg: "EdDSA",
106
+ kid: this.identity.kid,
107
+ })
108
+ .sign(privateKey);
109
+ return jwt;
110
+ }
111
+ catch (error) {
112
+ throw new Error(`Failed to generate JWS: ${error instanceof Error ? error.message : "Unknown error"}`);
113
+ }
114
+ }
115
+ /**
116
+ * Format base64 private key as PKCS#8 PEM for JOSE library.
117
+ */
118
+ formatPrivateKeyAsPEM(base64PrivateKey) {
119
+ // Decode the base64 private key bytes
120
+ // Use platform-agnostic approach (atob + Uint8Array)
121
+ const binaryStr = atob(base64PrivateKey);
122
+ const keyData = new Uint8Array(binaryStr.length);
123
+ for (let i = 0; i < binaryStr.length; i++) {
124
+ keyData[i] = binaryStr.charCodeAt(i);
125
+ }
126
+ // Ed25519 PKCS#8 header (ASN.1 encoding)
127
+ const pkcs8Header = new Uint8Array([
128
+ 0x30,
129
+ 0x2e, // SEQUENCE, length 46
130
+ 0x02,
131
+ 0x01,
132
+ 0x00, // INTEGER version 0
133
+ 0x30,
134
+ 0x05, // SEQUENCE, length 5
135
+ 0x06,
136
+ 0x03,
137
+ 0x2b,
138
+ 0x65,
139
+ 0x70, // OID for Ed25519
140
+ 0x04,
141
+ 0x22, // OCTET STRING, length 34
142
+ 0x04,
143
+ 0x20, // OCTET STRING, length 32 (the actual key)
144
+ ]);
145
+ // Take first 32 bytes of key (Ed25519 raw private key)
146
+ const rawKey = keyData.subarray(0, 32);
147
+ const fullKey = new Uint8Array(pkcs8Header.length + rawKey.length);
148
+ fullKey.set(pkcs8Header);
149
+ fullKey.set(rawKey, pkcs8Header.length);
150
+ // Base64-encode the full DER-encoded key
151
+ let binaryStrOut = "";
152
+ for (let i = 0; i < fullKey.length; i++) {
153
+ binaryStrOut += String.fromCharCode(fullKey[i]);
154
+ }
155
+ const base64Key = btoa(binaryStrOut);
156
+ // Format as PEM with 64-char line breaks
157
+ const formattedKey = base64Key.match(/.{1,64}/g)?.join("\n") ?? base64Key;
158
+ return ("-----BEGIN PRIVATE KEY-----\n" +
159
+ formattedKey +
160
+ "\n-----END PRIVATE KEY-----");
161
+ }
162
+ /**
163
+ * Verify a proof (for testing/validation).
164
+ */
165
+ async verifyProof(proof, request, response) {
166
+ try {
167
+ const expectedHashes = await this.generateCanonicalHashes(request, response);
168
+ if (proof.meta.requestHash !== expectedHashes.requestHash ||
169
+ proof.meta.responseHash !== expectedHashes.responseHash) {
170
+ return false;
171
+ }
172
+ const publicKeyJwk = this.base64PublicKeyToJWK(this.identity.publicKey);
173
+ const cryptoService = new crypto_service_1.CryptoService(this.cryptoProvider);
174
+ return cryptoService.verifyJWS(proof.jws, publicKeyJwk, {
175
+ expectedKid: this.identity.kid,
176
+ alg: "EdDSA",
177
+ });
178
+ }
179
+ catch {
180
+ return false;
181
+ }
182
+ }
183
+ /**
184
+ * Convert base64 public key to Ed25519 JWK format.
185
+ */
186
+ base64PublicKeyToJWK(publicKeyBase64) {
187
+ // Decode base64 to bytes (platform-agnostic)
188
+ const binaryStr = atob(publicKeyBase64);
189
+ const publicKeyBytes = new Uint8Array(binaryStr.length);
190
+ for (let i = 0; i < binaryStr.length; i++) {
191
+ publicKeyBytes[i] = binaryStr.charCodeAt(i);
192
+ }
193
+ if (publicKeyBytes.length !== 32) {
194
+ throw new Error(`Invalid Ed25519 public key length: ${publicKeyBytes.length}`);
195
+ }
196
+ // Convert to base64url
197
+ let binaryStrOut = "";
198
+ for (let i = 0; i < publicKeyBytes.length; i++) {
199
+ binaryStrOut += String.fromCharCode(publicKeyBytes[i]);
200
+ }
201
+ const base64url = btoa(binaryStrOut)
202
+ .replace(/\+/g, "-")
203
+ .replace(/\//g, "_")
204
+ .replace(/=/g, "");
205
+ return {
206
+ kty: "OKP",
207
+ crv: "Ed25519",
208
+ x: base64url,
209
+ kid: this.identity.kid,
210
+ };
211
+ }
212
+ }
213
+ exports.ProofGenerator = ProofGenerator;
214
+ /**
215
+ * Create a tool response with proof.
216
+ */
217
+ async function createProofResponse(request, data, identity, session, cryptoProvider, options = {}) {
218
+ const response = { data };
219
+ const proofGenerator = new ProofGenerator(identity, cryptoProvider);
220
+ const proof = await proofGenerator.generateProof(request, response, session, options);
221
+ response.meta = { proof };
222
+ return response;
223
+ }
224
+ /**
225
+ * Extract canonical data for hashing (utility for testing).
226
+ */
227
+ function extractCanonicalData(request, response) {
228
+ return {
229
+ request: {
230
+ method: request.method,
231
+ ...(request.params ? { params: request.params } : {}),
232
+ },
233
+ response: response.data,
234
+ };
235
+ }
236
+ //# sourceMappingURL=generator.js.map
@@ -0,0 +1,5 @@
1
+ /**
2
+ * Proof module — platform-agnostic proof generation reference implementation.
3
+ */
4
+ export { ProofGenerator, createProofResponse, extractCanonicalData, type ProofAgentIdentity, type ToolRequest, type ToolResponse, type ProofOptions, } from "./generator";
5
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1,11 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.extractCanonicalData = exports.createProofResponse = exports.ProofGenerator = void 0;
4
+ /**
5
+ * Proof module — platform-agnostic proof generation reference implementation.
6
+ */
7
+ var generator_1 = require("./generator");
8
+ Object.defineProperty(exports, "ProofGenerator", { enumerable: true, get: function () { return generator_1.ProofGenerator; } });
9
+ Object.defineProperty(exports, "createProofResponse", { enumerable: true, get: function () { return generator_1.createProofResponse; } });
10
+ Object.defineProperty(exports, "extractCanonicalData", { enumerable: true, get: function () { return generator_1.extractCanonicalData; } });
11
+ //# sourceMappingURL=index.js.map
@@ -14,7 +14,11 @@ export declare abstract class CryptoProvider {
14
14
  privateKey: string;
15
15
  publicKey: string;
16
16
  }>;
17
- abstract hash(data: Uint8Array): Promise<Uint8Array>;
17
+ /**
18
+ * Compute SHA-256 hash of data.
19
+ * Returns "sha256:<hex>" format for cross-platform parity.
20
+ */
21
+ abstract hash(data: Uint8Array): Promise<string>;
18
22
  abstract randomBytes(length: number): Promise<Uint8Array>;
19
23
  }
20
24
  /**