@mcp-i/core 0.1.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.
- package/LICENSE +21 -0
- package/README.md +390 -0
- package/dist/auth/handshake.d.ts +104 -0
- package/dist/auth/handshake.d.ts.map +1 -0
- package/dist/auth/handshake.js +230 -0
- package/dist/auth/handshake.js.map +1 -0
- package/dist/auth/index.d.ts +3 -0
- package/dist/auth/index.d.ts.map +1 -0
- package/dist/auth/index.js +2 -0
- package/dist/auth/index.js.map +1 -0
- package/dist/auth/types.d.ts +31 -0
- package/dist/auth/types.d.ts.map +1 -0
- package/dist/auth/types.js +7 -0
- package/dist/auth/types.js.map +1 -0
- package/dist/delegation/audience-validator.d.ts +9 -0
- package/dist/delegation/audience-validator.d.ts.map +1 -0
- package/dist/delegation/audience-validator.js +17 -0
- package/dist/delegation/audience-validator.js.map +1 -0
- package/dist/delegation/bitstring.d.ts +37 -0
- package/dist/delegation/bitstring.d.ts.map +1 -0
- package/dist/delegation/bitstring.js +117 -0
- package/dist/delegation/bitstring.js.map +1 -0
- package/dist/delegation/cascading-revocation.d.ts +45 -0
- package/dist/delegation/cascading-revocation.d.ts.map +1 -0
- package/dist/delegation/cascading-revocation.js +148 -0
- package/dist/delegation/cascading-revocation.js.map +1 -0
- package/dist/delegation/delegation-graph.d.ts +49 -0
- package/dist/delegation/delegation-graph.d.ts.map +1 -0
- package/dist/delegation/delegation-graph.js +99 -0
- package/dist/delegation/delegation-graph.js.map +1 -0
- package/dist/delegation/did-key-resolver.d.ts +64 -0
- package/dist/delegation/did-key-resolver.d.ts.map +1 -0
- package/dist/delegation/did-key-resolver.js +154 -0
- package/dist/delegation/did-key-resolver.js.map +1 -0
- package/dist/delegation/did-web-resolver.d.ts +83 -0
- package/dist/delegation/did-web-resolver.d.ts.map +1 -0
- package/dist/delegation/did-web-resolver.js +218 -0
- package/dist/delegation/did-web-resolver.js.map +1 -0
- package/dist/delegation/index.d.ts +21 -0
- package/dist/delegation/index.d.ts.map +1 -0
- package/dist/delegation/index.js +21 -0
- package/dist/delegation/index.js.map +1 -0
- package/dist/delegation/outbound-headers.d.ts +81 -0
- package/dist/delegation/outbound-headers.d.ts.map +1 -0
- package/dist/delegation/outbound-headers.js +139 -0
- package/dist/delegation/outbound-headers.js.map +1 -0
- package/dist/delegation/outbound-proof.d.ts +43 -0
- package/dist/delegation/outbound-proof.d.ts.map +1 -0
- package/dist/delegation/outbound-proof.js +52 -0
- package/dist/delegation/outbound-proof.js.map +1 -0
- package/dist/delegation/statuslist-manager.d.ts +44 -0
- package/dist/delegation/statuslist-manager.d.ts.map +1 -0
- package/dist/delegation/statuslist-manager.js +126 -0
- package/dist/delegation/statuslist-manager.js.map +1 -0
- package/dist/delegation/storage/memory-graph-storage.d.ts +70 -0
- package/dist/delegation/storage/memory-graph-storage.d.ts.map +1 -0
- package/dist/delegation/storage/memory-graph-storage.js +145 -0
- package/dist/delegation/storage/memory-graph-storage.js.map +1 -0
- package/dist/delegation/storage/memory-statuslist-storage.d.ts +19 -0
- package/dist/delegation/storage/memory-statuslist-storage.d.ts.map +1 -0
- package/dist/delegation/storage/memory-statuslist-storage.js +33 -0
- package/dist/delegation/storage/memory-statuslist-storage.js.map +1 -0
- package/dist/delegation/utils.d.ts +49 -0
- package/dist/delegation/utils.d.ts.map +1 -0
- package/dist/delegation/utils.js +131 -0
- package/dist/delegation/utils.js.map +1 -0
- package/dist/delegation/vc-issuer.d.ts +56 -0
- package/dist/delegation/vc-issuer.d.ts.map +1 -0
- package/dist/delegation/vc-issuer.js +80 -0
- package/dist/delegation/vc-issuer.js.map +1 -0
- package/dist/delegation/vc-verifier.d.ts +112 -0
- package/dist/delegation/vc-verifier.d.ts.map +1 -0
- package/dist/delegation/vc-verifier.js +280 -0
- package/dist/delegation/vc-verifier.js.map +1 -0
- package/dist/index.d.ts +45 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +53 -0
- package/dist/index.js.map +1 -0
- package/dist/logging/index.d.ts +2 -0
- package/dist/logging/index.d.ts.map +1 -0
- package/dist/logging/index.js +2 -0
- package/dist/logging/index.js.map +1 -0
- package/dist/logging/logger.d.ts +23 -0
- package/dist/logging/logger.d.ts.map +1 -0
- package/dist/logging/logger.js +82 -0
- package/dist/logging/logger.js.map +1 -0
- package/dist/middleware/index.d.ts +7 -0
- package/dist/middleware/index.d.ts.map +1 -0
- package/dist/middleware/index.js +7 -0
- package/dist/middleware/index.js.map +1 -0
- package/dist/middleware/with-mcpi.d.ts +152 -0
- package/dist/middleware/with-mcpi.d.ts.map +1 -0
- package/dist/middleware/with-mcpi.js +472 -0
- package/dist/middleware/with-mcpi.js.map +1 -0
- package/dist/proof/errors.d.ts +49 -0
- package/dist/proof/errors.d.ts.map +1 -0
- package/dist/proof/errors.js +61 -0
- package/dist/proof/errors.js.map +1 -0
- package/dist/proof/generator.d.ts +65 -0
- package/dist/proof/generator.d.ts.map +1 -0
- package/dist/proof/generator.js +163 -0
- package/dist/proof/generator.js.map +1 -0
- package/dist/proof/index.d.ts +4 -0
- package/dist/proof/index.d.ts.map +1 -0
- package/dist/proof/index.js +4 -0
- package/dist/proof/index.js.map +1 -0
- package/dist/proof/verifier.d.ts +108 -0
- package/dist/proof/verifier.d.ts.map +1 -0
- package/dist/proof/verifier.js +299 -0
- package/dist/proof/verifier.js.map +1 -0
- package/dist/providers/base.d.ts +64 -0
- package/dist/providers/base.d.ts.map +1 -0
- package/dist/providers/base.js +19 -0
- package/dist/providers/base.js.map +1 -0
- package/dist/providers/index.d.ts +3 -0
- package/dist/providers/index.d.ts.map +1 -0
- package/dist/providers/index.js +3 -0
- package/dist/providers/index.js.map +1 -0
- package/dist/providers/memory.d.ts +33 -0
- package/dist/providers/memory.d.ts.map +1 -0
- package/dist/providers/memory.js +102 -0
- package/dist/providers/memory.js.map +1 -0
- package/dist/session/index.d.ts +2 -0
- package/dist/session/index.d.ts.map +1 -0
- package/dist/session/index.js +2 -0
- package/dist/session/index.js.map +1 -0
- package/dist/session/manager.d.ts +77 -0
- package/dist/session/manager.d.ts.map +1 -0
- package/dist/session/manager.js +251 -0
- package/dist/session/manager.js.map +1 -0
- package/dist/types/protocol.d.ts +320 -0
- package/dist/types/protocol.d.ts.map +1 -0
- package/dist/types/protocol.js +229 -0
- package/dist/types/protocol.js.map +1 -0
- package/dist/utils/base58.d.ts +31 -0
- package/dist/utils/base58.d.ts.map +1 -0
- package/dist/utils/base58.js +104 -0
- package/dist/utils/base58.js.map +1 -0
- package/dist/utils/base64.d.ts +13 -0
- package/dist/utils/base64.d.ts.map +1 -0
- package/dist/utils/base64.js +99 -0
- package/dist/utils/base64.js.map +1 -0
- package/dist/utils/crypto-service.d.ts +37 -0
- package/dist/utils/crypto-service.d.ts.map +1 -0
- package/dist/utils/crypto-service.js +153 -0
- package/dist/utils/crypto-service.js.map +1 -0
- package/dist/utils/did-helpers.d.ts +156 -0
- package/dist/utils/did-helpers.d.ts.map +1 -0
- package/dist/utils/did-helpers.js +193 -0
- package/dist/utils/did-helpers.js.map +1 -0
- package/dist/utils/ed25519-constants.d.ts +18 -0
- package/dist/utils/ed25519-constants.d.ts.map +1 -0
- package/dist/utils/ed25519-constants.js +21 -0
- package/dist/utils/ed25519-constants.js.map +1 -0
- package/dist/utils/index.d.ts +5 -0
- package/dist/utils/index.d.ts.map +1 -0
- package/dist/utils/index.js +5 -0
- package/dist/utils/index.js.map +1 -0
- package/package.json +105 -0
- package/src/__tests__/integration/full-flow.test.ts +362 -0
- package/src/__tests__/providers/base.test.ts +173 -0
- package/src/__tests__/providers/memory.test.ts +332 -0
- package/src/__tests__/utils/mock-providers.ts +319 -0
- package/src/__tests__/utils/node-crypto-provider.ts +93 -0
- package/src/auth/handshake.ts +411 -0
- package/src/auth/index.ts +11 -0
- package/src/auth/types.ts +40 -0
- package/src/delegation/__tests__/audience-validator.test.ts +110 -0
- package/src/delegation/__tests__/bitstring.test.ts +346 -0
- package/src/delegation/__tests__/cascading-revocation.test.ts +624 -0
- package/src/delegation/__tests__/delegation-graph.test.ts +623 -0
- package/src/delegation/__tests__/did-key-resolver.test.ts +265 -0
- package/src/delegation/__tests__/did-web-resolver.test.ts +467 -0
- package/src/delegation/__tests__/outbound-headers.test.ts +230 -0
- package/src/delegation/__tests__/outbound-proof.test.ts +179 -0
- package/src/delegation/__tests__/statuslist-manager.test.ts +515 -0
- package/src/delegation/__tests__/utils.test.ts +185 -0
- package/src/delegation/__tests__/vc-issuer.test.ts +487 -0
- package/src/delegation/__tests__/vc-verifier.test.ts +1029 -0
- package/src/delegation/audience-validator.ts +24 -0
- package/src/delegation/bitstring.ts +160 -0
- package/src/delegation/cascading-revocation.ts +224 -0
- package/src/delegation/delegation-graph.ts +143 -0
- package/src/delegation/did-key-resolver.ts +181 -0
- package/src/delegation/did-web-resolver.ts +270 -0
- package/src/delegation/index.ts +33 -0
- package/src/delegation/outbound-headers.ts +193 -0
- package/src/delegation/outbound-proof.ts +90 -0
- package/src/delegation/statuslist-manager.ts +219 -0
- package/src/delegation/storage/__tests__/memory-graph-storage.test.ts +366 -0
- package/src/delegation/storage/__tests__/memory-statuslist-storage.test.ts +228 -0
- package/src/delegation/storage/memory-graph-storage.ts +178 -0
- package/src/delegation/storage/memory-statuslist-storage.ts +42 -0
- package/src/delegation/utils.ts +189 -0
- package/src/delegation/vc-issuer.ts +137 -0
- package/src/delegation/vc-verifier.ts +440 -0
- package/src/index.ts +264 -0
- package/src/logging/__tests__/logger.test.ts +366 -0
- package/src/logging/index.ts +6 -0
- package/src/logging/logger.ts +91 -0
- package/src/middleware/__tests__/with-mcpi.test.ts +504 -0
- package/src/middleware/index.ts +16 -0
- package/src/middleware/with-mcpi.ts +766 -0
- package/src/proof/__tests__/proof-generator.test.ts +483 -0
- package/src/proof/__tests__/verifier.test.ts +488 -0
- package/src/proof/errors.ts +75 -0
- package/src/proof/generator.ts +255 -0
- package/src/proof/index.ts +22 -0
- package/src/proof/verifier.ts +449 -0
- package/src/providers/base.ts +68 -0
- package/src/providers/index.ts +15 -0
- package/src/providers/memory.ts +130 -0
- package/src/session/__tests__/session-manager.test.ts +342 -0
- package/src/session/index.ts +7 -0
- package/src/session/manager.ts +332 -0
- package/src/types/protocol.ts +596 -0
- package/src/utils/__tests__/base58.test.ts +281 -0
- package/src/utils/__tests__/base64.test.ts +239 -0
- package/src/utils/__tests__/crypto-service.test.ts +530 -0
- package/src/utils/__tests__/did-helpers.test.ts +156 -0
- package/src/utils/base58.ts +115 -0
- package/src/utils/base64.ts +116 -0
- package/src/utils/crypto-service.ts +209 -0
- package/src/utils/did-helpers.ts +210 -0
- package/src/utils/ed25519-constants.ts +23 -0
- package/src/utils/index.ts +9 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"statuslist-manager.d.ts","sourceRoot":"","sources":["../../src/delegation/statuslist-manager.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,EACV,wBAAwB,EACxB,gBAAgB,EACjB,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EAAoB,KAAK,mBAAmB,EAAE,KAAK,qBAAqB,EAAE,MAAM,gBAAgB,CAAC;AACxG,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAC;AAGxD,MAAM,WAAW,yBAAyB;IACxC,aAAa,CAAC,YAAY,EAAE,MAAM,GAAG,OAAO,CAAC,wBAAwB,GAAG,IAAI,CAAC,CAAC;IAC9E,aAAa,CAAC,YAAY,EAAE,MAAM,EAAE,UAAU,EAAE,wBAAwB,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACzF,aAAa,CAAC,YAAY,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;CACtD;AAED,MAAM,WAAW,0BAA0B;IACzC,MAAM,IAAI,MAAM,CAAC;IACjB,QAAQ,IAAI,MAAM,CAAC;CACpB;AAED,qBAAa,qBAAqB;IAK9B,OAAO,CAAC,OAAO;IACf,OAAO,CAAC,QAAQ;IAChB,OAAO,CAAC,eAAe;IACvB,OAAO,CAAC,UAAU;IAClB,OAAO,CAAC,YAAY;IARtB,OAAO,CAAC,iBAAiB,CAAS;IAClC,OAAO,CAAC,eAAe,CAAS;gBAGtB,OAAO,EAAE,yBAAyB,EAClC,QAAQ,EAAE,0BAA0B,EACpC,eAAe,EAAE,iBAAiB,EAClC,UAAU,EAAE,mBAAmB,EAC/B,YAAY,EAAE,qBAAqB,EAC3C,OAAO,CAAC,EAAE;QACR,iBAAiB,CAAC,EAAE,MAAM,CAAC;QAC3B,eAAe,CAAC,EAAE,MAAM,CAAC;KAC1B;IAMG,mBAAmB,CAAC,OAAO,EAAE,YAAY,GAAG,YAAY,GAAG,OAAO,CAAC,gBAAgB,CAAC;IAkBpF,YAAY,CAAC,gBAAgB,EAAE,gBAAgB,EAAE,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC;IA6CjF,WAAW,CAAC,gBAAgB,EAAE,gBAAgB,GAAG,OAAO,CAAC,OAAO,CAAC;IAkBjE,iBAAiB,CAAC,YAAY,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;YAelD,sBAAsB;IAgDpC,oBAAoB,IAAI,MAAM;IAI9B,kBAAkB,IAAI,MAAM;CAG7B;AAED,wBAAgB,uBAAuB,CACrC,OAAO,EAAE,yBAAyB,EAClC,QAAQ,EAAE,0BAA0B,EACpC,eAAe,EAAE,iBAAiB,EAClC,UAAU,EAAE,mBAAmB,EAC/B,YAAY,EAAE,qBAAqB,EACnC,OAAO,CAAC,EAAE;IACR,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,eAAe,CAAC,EAAE,MAAM,CAAC;CAC1B,GACA,qBAAqB,CASvB"}
|
|
@@ -0,0 +1,126 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* StatusList2021 Manager
|
|
3
|
+
*
|
|
4
|
+
* Manages StatusList2021 credentials for efficient delegation revocation.
|
|
5
|
+
*
|
|
6
|
+
* Related Spec: W3C StatusList2021
|
|
7
|
+
*/
|
|
8
|
+
import { BitstringManager } from './bitstring.js';
|
|
9
|
+
import { canonicalizeJSON } from './utils.js';
|
|
10
|
+
export class StatusList2021Manager {
|
|
11
|
+
storage;
|
|
12
|
+
identity;
|
|
13
|
+
signingFunction;
|
|
14
|
+
compressor;
|
|
15
|
+
decompressor;
|
|
16
|
+
statusListBaseUrl;
|
|
17
|
+
defaultListSize;
|
|
18
|
+
constructor(storage, identity, signingFunction, compressor, decompressor, options) {
|
|
19
|
+
this.storage = storage;
|
|
20
|
+
this.identity = identity;
|
|
21
|
+
this.signingFunction = signingFunction;
|
|
22
|
+
this.compressor = compressor;
|
|
23
|
+
this.decompressor = decompressor;
|
|
24
|
+
this.statusListBaseUrl = options?.statusListBaseUrl || 'https://status.example.com';
|
|
25
|
+
this.defaultListSize = options?.defaultListSize || 131072;
|
|
26
|
+
}
|
|
27
|
+
async allocateStatusEntry(purpose) {
|
|
28
|
+
const statusListId = `${this.statusListBaseUrl}/${purpose}/v1`;
|
|
29
|
+
const index = await this.storage.allocateIndex(statusListId);
|
|
30
|
+
await this.ensureStatusListExists(statusListId, purpose);
|
|
31
|
+
const credentialStatus = {
|
|
32
|
+
id: `${statusListId}#${index}`,
|
|
33
|
+
type: 'StatusList2021Entry',
|
|
34
|
+
statusPurpose: purpose,
|
|
35
|
+
statusListIndex: index.toString(),
|
|
36
|
+
statusListCredential: statusListId,
|
|
37
|
+
};
|
|
38
|
+
return credentialStatus;
|
|
39
|
+
}
|
|
40
|
+
async updateStatus(credentialStatus, revoked) {
|
|
41
|
+
const { statusListCredential, statusListIndex } = credentialStatus;
|
|
42
|
+
const statusList = await this.storage.getStatusList(statusListCredential);
|
|
43
|
+
if (!statusList) {
|
|
44
|
+
throw new Error(`Status list not found: ${statusListCredential}`);
|
|
45
|
+
}
|
|
46
|
+
const manager = await BitstringManager.decode(statusList.credentialSubject.encodedList, this.compressor, this.decompressor);
|
|
47
|
+
const index = parseInt(statusListIndex, 10);
|
|
48
|
+
manager.setBit(index, revoked);
|
|
49
|
+
const encodedList = await manager.encode();
|
|
50
|
+
const updatedCredential = {
|
|
51
|
+
...statusList,
|
|
52
|
+
credentialSubject: {
|
|
53
|
+
...statusList.credentialSubject,
|
|
54
|
+
encodedList,
|
|
55
|
+
},
|
|
56
|
+
};
|
|
57
|
+
const unsignedCredential = { ...updatedCredential };
|
|
58
|
+
delete unsignedCredential['proof'];
|
|
59
|
+
const canonicalVC = canonicalizeJSON(unsignedCredential);
|
|
60
|
+
const proof = await this.signingFunction(canonicalVC, this.identity.getDid(), this.identity.getKeyId());
|
|
61
|
+
const signedCredential = {
|
|
62
|
+
...updatedCredential,
|
|
63
|
+
proof,
|
|
64
|
+
};
|
|
65
|
+
await this.storage.setStatusList(statusListCredential, signedCredential);
|
|
66
|
+
}
|
|
67
|
+
async checkStatus(credentialStatus) {
|
|
68
|
+
const { statusListCredential, statusListIndex } = credentialStatus;
|
|
69
|
+
const statusList = await this.storage.getStatusList(statusListCredential);
|
|
70
|
+
if (!statusList) {
|
|
71
|
+
return false;
|
|
72
|
+
}
|
|
73
|
+
const manager = await BitstringManager.decode(statusList.credentialSubject.encodedList, this.compressor, this.decompressor);
|
|
74
|
+
const index = parseInt(statusListIndex, 10);
|
|
75
|
+
return manager.getBit(index);
|
|
76
|
+
}
|
|
77
|
+
async getRevokedIndices(statusListId) {
|
|
78
|
+
const statusList = await this.storage.getStatusList(statusListId);
|
|
79
|
+
if (!statusList) {
|
|
80
|
+
return [];
|
|
81
|
+
}
|
|
82
|
+
const manager = await BitstringManager.decode(statusList.credentialSubject.encodedList, this.compressor, this.decompressor);
|
|
83
|
+
return manager.getSetBits();
|
|
84
|
+
}
|
|
85
|
+
async ensureStatusListExists(statusListId, purpose) {
|
|
86
|
+
const existing = await this.storage.getStatusList(statusListId);
|
|
87
|
+
if (existing) {
|
|
88
|
+
return;
|
|
89
|
+
}
|
|
90
|
+
const manager = new BitstringManager(this.defaultListSize, this.compressor, this.decompressor);
|
|
91
|
+
const encodedList = await manager.encode();
|
|
92
|
+
const unsignedCredential = {
|
|
93
|
+
'@context': [
|
|
94
|
+
'https://www.w3.org/2018/credentials/v1',
|
|
95
|
+
'https://w3id.org/vc/status-list/2021/v1',
|
|
96
|
+
],
|
|
97
|
+
id: statusListId,
|
|
98
|
+
type: ['VerifiableCredential', 'StatusList2021Credential'],
|
|
99
|
+
issuer: this.identity.getDid(),
|
|
100
|
+
issuanceDate: new Date().toISOString(),
|
|
101
|
+
credentialSubject: {
|
|
102
|
+
id: `${statusListId}#list`,
|
|
103
|
+
type: 'StatusList2021',
|
|
104
|
+
statusPurpose: purpose,
|
|
105
|
+
encodedList,
|
|
106
|
+
},
|
|
107
|
+
};
|
|
108
|
+
const canonicalVC = canonicalizeJSON(unsignedCredential);
|
|
109
|
+
const proof = await this.signingFunction(canonicalVC, this.identity.getDid(), this.identity.getKeyId());
|
|
110
|
+
const signedCredential = {
|
|
111
|
+
...unsignedCredential,
|
|
112
|
+
proof,
|
|
113
|
+
};
|
|
114
|
+
await this.storage.setStatusList(statusListId, signedCredential);
|
|
115
|
+
}
|
|
116
|
+
getStatusListBaseUrl() {
|
|
117
|
+
return this.statusListBaseUrl;
|
|
118
|
+
}
|
|
119
|
+
getDefaultListSize() {
|
|
120
|
+
return this.defaultListSize;
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
export function createStatusListManager(storage, identity, signingFunction, compressor, decompressor, options) {
|
|
124
|
+
return new StatusList2021Manager(storage, identity, signingFunction, compressor, decompressor, options);
|
|
125
|
+
}
|
|
126
|
+
//# sourceMappingURL=statuslist-manager.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"statuslist-manager.js","sourceRoot":"","sources":["../../src/delegation/statuslist-manager.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* In-Memory Delegation Graph Storage Provider
|
|
3
|
+
*
|
|
4
|
+
* Memory-based implementation for testing and development.
|
|
5
|
+
* NOT suitable for production (no persistence).
|
|
6
|
+
*
|
|
7
|
+
* SOLID: Implements DelegationGraphStorageProvider interface
|
|
8
|
+
*/
|
|
9
|
+
import type { DelegationGraphStorageProvider, DelegationNode } from '../delegation-graph.js';
|
|
10
|
+
/**
|
|
11
|
+
* Memory-based Delegation Graph storage
|
|
12
|
+
*
|
|
13
|
+
* Stores delegation nodes in memory with efficient graph queries.
|
|
14
|
+
* Useful for:
|
|
15
|
+
* - Unit tests
|
|
16
|
+
* - Integration tests
|
|
17
|
+
* - Development/debugging
|
|
18
|
+
* - Examples
|
|
19
|
+
*/
|
|
20
|
+
export declare class MemoryDelegationGraphStorage implements DelegationGraphStorageProvider {
|
|
21
|
+
private nodes;
|
|
22
|
+
/**
|
|
23
|
+
* Get a delegation node by ID
|
|
24
|
+
*/
|
|
25
|
+
getNode(delegationId: string): Promise<DelegationNode | null>;
|
|
26
|
+
/**
|
|
27
|
+
* Save a delegation node
|
|
28
|
+
*/
|
|
29
|
+
setNode(node: DelegationNode): Promise<void>;
|
|
30
|
+
/**
|
|
31
|
+
* Get all children of a delegation
|
|
32
|
+
*/
|
|
33
|
+
getChildren(delegationId: string): Promise<DelegationNode[]>;
|
|
34
|
+
/**
|
|
35
|
+
* Get the full chain from root to this delegation
|
|
36
|
+
*/
|
|
37
|
+
getChain(delegationId: string): Promise<DelegationNode[]>;
|
|
38
|
+
/**
|
|
39
|
+
* Get all descendants (children, grandchildren, etc.)
|
|
40
|
+
*
|
|
41
|
+
* Uses BFS for efficiency.
|
|
42
|
+
*/
|
|
43
|
+
getDescendants(delegationId: string): Promise<DelegationNode[]>;
|
|
44
|
+
/**
|
|
45
|
+
* Delete a node
|
|
46
|
+
*/
|
|
47
|
+
deleteNode(delegationId: string): Promise<void>;
|
|
48
|
+
/**
|
|
49
|
+
* Clear all data (for testing)
|
|
50
|
+
*/
|
|
51
|
+
clear(): void;
|
|
52
|
+
/**
|
|
53
|
+
* Get all node IDs (for testing)
|
|
54
|
+
*/
|
|
55
|
+
getAllNodeIds(): string[];
|
|
56
|
+
/**
|
|
57
|
+
* Get graph statistics (for testing/debugging)
|
|
58
|
+
*/
|
|
59
|
+
getStats(): {
|
|
60
|
+
totalNodes: number;
|
|
61
|
+
rootNodes: number;
|
|
62
|
+
leafNodes: number;
|
|
63
|
+
maxDepth: number;
|
|
64
|
+
};
|
|
65
|
+
/**
|
|
66
|
+
* Synchronous chain retrieval (for stats)
|
|
67
|
+
*/
|
|
68
|
+
private getChainSync;
|
|
69
|
+
}
|
|
70
|
+
//# sourceMappingURL=memory-graph-storage.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"memory-graph-storage.d.ts","sourceRoot":"","sources":["../../../src/delegation/storage/memory-graph-storage.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,KAAK,EACV,8BAA8B,EAC9B,cAAc,EACf,MAAM,wBAAwB,CAAC;AAEhC;;;;;;;;;GASG;AACH,qBAAa,4BACX,YAAW,8BAA8B;IAEzC,OAAO,CAAC,KAAK,CAAqC;IAElD;;OAEG;IACG,OAAO,CAAC,YAAY,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,GAAG,IAAI,CAAC;IAInE;;OAEG;IACG,OAAO,CAAC,IAAI,EAAE,cAAc,GAAG,OAAO,CAAC,IAAI,CAAC;IAIlD;;OAEG;IACG,WAAW,CAAC,YAAY,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,EAAE,CAAC;IASlE;;OAEG;IACG,QAAQ,CAAC,YAAY,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,EAAE,CAAC;IAgB/D;;;;OAIG;IACG,cAAc,CAAC,YAAY,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,EAAE,CAAC;IA+BrE;;OAEG;IACG,UAAU,CAAC,YAAY,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAIrD;;OAEG;IACH,KAAK,IAAI,IAAI;IAIb;;OAEG;IACH,aAAa,IAAI,MAAM,EAAE;IAIzB;;OAEG;IACH,QAAQ,IAAI;QACV,UAAU,EAAE,MAAM,CAAC;QACnB,SAAS,EAAE,MAAM,CAAC;QAClB,SAAS,EAAE,MAAM,CAAC;QAClB,QAAQ,EAAE,MAAM,CAAC;KAClB;IAqBD;;OAEG;IACH,OAAO,CAAC,YAAY;CAcrB"}
|
|
@@ -0,0 +1,145 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* In-Memory Delegation Graph Storage Provider
|
|
3
|
+
*
|
|
4
|
+
* Memory-based implementation for testing and development.
|
|
5
|
+
* NOT suitable for production (no persistence).
|
|
6
|
+
*
|
|
7
|
+
* SOLID: Implements DelegationGraphStorageProvider interface
|
|
8
|
+
*/
|
|
9
|
+
/**
|
|
10
|
+
* Memory-based Delegation Graph storage
|
|
11
|
+
*
|
|
12
|
+
* Stores delegation nodes in memory with efficient graph queries.
|
|
13
|
+
* Useful for:
|
|
14
|
+
* - Unit tests
|
|
15
|
+
* - Integration tests
|
|
16
|
+
* - Development/debugging
|
|
17
|
+
* - Examples
|
|
18
|
+
*/
|
|
19
|
+
export class MemoryDelegationGraphStorage {
|
|
20
|
+
nodes = new Map();
|
|
21
|
+
/**
|
|
22
|
+
* Get a delegation node by ID
|
|
23
|
+
*/
|
|
24
|
+
async getNode(delegationId) {
|
|
25
|
+
return this.nodes.get(delegationId) || null;
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* Save a delegation node
|
|
29
|
+
*/
|
|
30
|
+
async setNode(node) {
|
|
31
|
+
this.nodes.set(node.id, node);
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* Get all children of a delegation
|
|
35
|
+
*/
|
|
36
|
+
async getChildren(delegationId) {
|
|
37
|
+
const parent = this.nodes.get(delegationId);
|
|
38
|
+
if (!parent)
|
|
39
|
+
return [];
|
|
40
|
+
return parent.children
|
|
41
|
+
.map((childId) => this.nodes.get(childId))
|
|
42
|
+
.filter((node) => node !== undefined);
|
|
43
|
+
}
|
|
44
|
+
/**
|
|
45
|
+
* Get the full chain from root to this delegation
|
|
46
|
+
*/
|
|
47
|
+
async getChain(delegationId) {
|
|
48
|
+
const chain = [];
|
|
49
|
+
let currentId = delegationId;
|
|
50
|
+
// Walk up the tree to root
|
|
51
|
+
while (currentId) {
|
|
52
|
+
const node = this.nodes.get(currentId);
|
|
53
|
+
if (!node)
|
|
54
|
+
break;
|
|
55
|
+
chain.unshift(node); // Add to front (root first)
|
|
56
|
+
currentId = node.parentId;
|
|
57
|
+
}
|
|
58
|
+
return chain;
|
|
59
|
+
}
|
|
60
|
+
/**
|
|
61
|
+
* Get all descendants (children, grandchildren, etc.)
|
|
62
|
+
*
|
|
63
|
+
* Uses BFS for efficiency.
|
|
64
|
+
*/
|
|
65
|
+
async getDescendants(delegationId) {
|
|
66
|
+
const descendants = [];
|
|
67
|
+
const queue = [delegationId];
|
|
68
|
+
const visited = new Set();
|
|
69
|
+
while (queue.length > 0) {
|
|
70
|
+
const currentId = queue.shift();
|
|
71
|
+
// Skip if already visited (prevent infinite loops)
|
|
72
|
+
if (visited.has(currentId))
|
|
73
|
+
continue;
|
|
74
|
+
visited.add(currentId);
|
|
75
|
+
const node = this.nodes.get(currentId);
|
|
76
|
+
if (!node)
|
|
77
|
+
continue;
|
|
78
|
+
// Add children to queue
|
|
79
|
+
for (const childId of node.children) {
|
|
80
|
+
if (!visited.has(childId)) {
|
|
81
|
+
queue.push(childId);
|
|
82
|
+
const childNode = this.nodes.get(childId);
|
|
83
|
+
if (childNode) {
|
|
84
|
+
descendants.push(childNode);
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
return descendants;
|
|
90
|
+
}
|
|
91
|
+
/**
|
|
92
|
+
* Delete a node
|
|
93
|
+
*/
|
|
94
|
+
async deleteNode(delegationId) {
|
|
95
|
+
this.nodes.delete(delegationId);
|
|
96
|
+
}
|
|
97
|
+
/**
|
|
98
|
+
* Clear all data (for testing)
|
|
99
|
+
*/
|
|
100
|
+
clear() {
|
|
101
|
+
this.nodes.clear();
|
|
102
|
+
}
|
|
103
|
+
/**
|
|
104
|
+
* Get all node IDs (for testing)
|
|
105
|
+
*/
|
|
106
|
+
getAllNodeIds() {
|
|
107
|
+
return Array.from(this.nodes.keys());
|
|
108
|
+
}
|
|
109
|
+
/**
|
|
110
|
+
* Get graph statistics (for testing/debugging)
|
|
111
|
+
*/
|
|
112
|
+
getStats() {
|
|
113
|
+
const nodes = Array.from(this.nodes.values());
|
|
114
|
+
const rootNodes = nodes.filter((n) => n.parentId === null).length;
|
|
115
|
+
const leafNodes = nodes.filter((n) => n.children.length === 0).length;
|
|
116
|
+
// Calculate max depth
|
|
117
|
+
let maxDepth = 0;
|
|
118
|
+
for (const node of nodes) {
|
|
119
|
+
const chain = this.getChainSync(node.id);
|
|
120
|
+
maxDepth = Math.max(maxDepth, chain.length - 1);
|
|
121
|
+
}
|
|
122
|
+
return {
|
|
123
|
+
totalNodes: nodes.length,
|
|
124
|
+
rootNodes,
|
|
125
|
+
leafNodes,
|
|
126
|
+
maxDepth,
|
|
127
|
+
};
|
|
128
|
+
}
|
|
129
|
+
/**
|
|
130
|
+
* Synchronous chain retrieval (for stats)
|
|
131
|
+
*/
|
|
132
|
+
getChainSync(delegationId) {
|
|
133
|
+
const chain = [];
|
|
134
|
+
let currentId = delegationId;
|
|
135
|
+
while (currentId) {
|
|
136
|
+
const node = this.nodes.get(currentId);
|
|
137
|
+
if (!node)
|
|
138
|
+
break;
|
|
139
|
+
chain.unshift(node);
|
|
140
|
+
currentId = node.parentId;
|
|
141
|
+
}
|
|
142
|
+
return chain;
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
//# sourceMappingURL=memory-graph-storage.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"memory-graph-storage.js","sourceRoot":"","sources":["../../../src/delegation/storage/memory-graph-storage.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* In-Memory StatusList Storage Provider
|
|
3
|
+
*
|
|
4
|
+
* Memory-based implementation for testing and development.
|
|
5
|
+
* NOT suitable for production (no persistence).
|
|
6
|
+
*/
|
|
7
|
+
import type { StatusList2021Credential } from '../../types/protocol.js';
|
|
8
|
+
import type { StatusListStorageProvider } from '../statuslist-manager.js';
|
|
9
|
+
export declare class MemoryStatusListStorage implements StatusListStorageProvider {
|
|
10
|
+
private statusLists;
|
|
11
|
+
private indexCounters;
|
|
12
|
+
getStatusList(statusListId: string): Promise<StatusList2021Credential | null>;
|
|
13
|
+
setStatusList(statusListId: string, credential: StatusList2021Credential): Promise<void>;
|
|
14
|
+
allocateIndex(statusListId: string): Promise<number>;
|
|
15
|
+
getIndexCount(statusListId: string): number;
|
|
16
|
+
clear(): void;
|
|
17
|
+
getAllStatusListIds(): string[];
|
|
18
|
+
}
|
|
19
|
+
//# sourceMappingURL=memory-statuslist-storage.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"memory-statuslist-storage.d.ts","sourceRoot":"","sources":["../../../src/delegation/storage/memory-statuslist-storage.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,yBAAyB,CAAC;AACxE,OAAO,KAAK,EAAE,yBAAyB,EAAE,MAAM,0BAA0B,CAAC;AAE1E,qBAAa,uBAAwB,YAAW,yBAAyB;IACvE,OAAO,CAAC,WAAW,CAA+C;IAClE,OAAO,CAAC,aAAa,CAA6B;IAE5C,aAAa,CAAC,YAAY,EAAE,MAAM,GAAG,OAAO,CAAC,wBAAwB,GAAG,IAAI,CAAC;IAI7E,aAAa,CAAC,YAAY,EAAE,MAAM,EAAE,UAAU,EAAE,wBAAwB,GAAG,OAAO,CAAC,IAAI,CAAC;IAIxF,aAAa,CAAC,YAAY,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAO1D,aAAa,CAAC,YAAY,EAAE,MAAM,GAAG,MAAM;IAI3C,KAAK,IAAI,IAAI;IAKb,mBAAmB,IAAI,MAAM,EAAE;CAGhC"}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* In-Memory StatusList Storage Provider
|
|
3
|
+
*
|
|
4
|
+
* Memory-based implementation for testing and development.
|
|
5
|
+
* NOT suitable for production (no persistence).
|
|
6
|
+
*/
|
|
7
|
+
export class MemoryStatusListStorage {
|
|
8
|
+
statusLists = new Map();
|
|
9
|
+
indexCounters = new Map();
|
|
10
|
+
async getStatusList(statusListId) {
|
|
11
|
+
return this.statusLists.get(statusListId) || null;
|
|
12
|
+
}
|
|
13
|
+
async setStatusList(statusListId, credential) {
|
|
14
|
+
this.statusLists.set(statusListId, credential);
|
|
15
|
+
}
|
|
16
|
+
async allocateIndex(statusListId) {
|
|
17
|
+
const current = this.indexCounters.get(statusListId) || 0;
|
|
18
|
+
const allocated = current;
|
|
19
|
+
this.indexCounters.set(statusListId, current + 1);
|
|
20
|
+
return allocated;
|
|
21
|
+
}
|
|
22
|
+
getIndexCount(statusListId) {
|
|
23
|
+
return this.indexCounters.get(statusListId) || 0;
|
|
24
|
+
}
|
|
25
|
+
clear() {
|
|
26
|
+
this.statusLists.clear();
|
|
27
|
+
this.indexCounters.clear();
|
|
28
|
+
}
|
|
29
|
+
getAllStatusListIds() {
|
|
30
|
+
return Array.from(this.statusLists.keys());
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
//# sourceMappingURL=memory-statuslist-storage.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"memory-statuslist-storage.js","sourceRoot":"","sources":["../../../src/delegation/storage/memory-statuslist-storage.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAKH,MAAM,OAAO,uBAAuB;IAC1B,WAAW,GAAG,IAAI,GAAG,EAAoC,CAAC;IAC1D,aAAa,GAAG,IAAI,GAAG,EAAkB,CAAC;IAElD,KAAK,CAAC,aAAa,CAAC,YAAoB;QACtC,OAAO,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,YAAY,CAAC,IAAI,IAAI,CAAC;IACpD,CAAC;IAED,KAAK,CAAC,aAAa,CAAC,YAAoB,EAAE,UAAoC;QAC5E,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,YAAY,EAAE,UAAU,CAAC,CAAC;IACjD,CAAC;IAED,KAAK,CAAC,aAAa,CAAC,YAAoB;QACtC,MAAM,OAAO,GAAG,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC;QAC1D,MAAM,SAAS,GAAG,OAAO,CAAC;QAC1B,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,YAAY,EAAE,OAAO,GAAG,CAAC,CAAC,CAAC;QAClD,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,aAAa,CAAC,YAAoB;QAChC,OAAO,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC;IACnD,CAAC;IAED,KAAK;QACH,IAAI,CAAC,WAAW,CAAC,KAAK,EAAE,CAAC;QACzB,IAAI,CAAC,aAAa,CAAC,KAAK,EAAE,CAAC;IAC7B,CAAC;IAED,mBAAmB;QACjB,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,IAAI,EAAE,CAAC,CAAC;IAC7C,CAAC;CACF"}
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Delegation Utilities
|
|
3
|
+
*
|
|
4
|
+
* Shared utility functions for delegation credential operations.
|
|
5
|
+
*/
|
|
6
|
+
/**
|
|
7
|
+
* Canonicalize a JSON value using RFC 8785 (JSON Canonicalization Scheme).
|
|
8
|
+
*
|
|
9
|
+
* Wraps `json-canonicalize` with input validation to reject values that are
|
|
10
|
+
* not representable in JSON (Infinity, NaN, undefined, functions, symbols,
|
|
11
|
+
* bigints). The underlying library silently coerces these to `"null"` or
|
|
12
|
+
* `"undefined"`, which is dangerous for cryptographic canonicalization where
|
|
13
|
+
* distinct inputs must produce distinct outputs.
|
|
14
|
+
*
|
|
15
|
+
* @throws {TypeError} If `obj` is not a valid JSON value
|
|
16
|
+
*/
|
|
17
|
+
export declare function canonicalizeJSON(obj: unknown): string;
|
|
18
|
+
export interface VCJWTHeader {
|
|
19
|
+
alg: 'EdDSA';
|
|
20
|
+
typ: 'JWT' | 'vc+jwt';
|
|
21
|
+
kid?: string;
|
|
22
|
+
}
|
|
23
|
+
export interface VCJWTPayload {
|
|
24
|
+
iss: string;
|
|
25
|
+
sub?: string;
|
|
26
|
+
aud?: string | string[];
|
|
27
|
+
exp?: number;
|
|
28
|
+
iat?: number;
|
|
29
|
+
jti?: string;
|
|
30
|
+
vc: Record<string, unknown>;
|
|
31
|
+
}
|
|
32
|
+
export interface EncodeVCAsJWTOptions {
|
|
33
|
+
keyId?: string;
|
|
34
|
+
}
|
|
35
|
+
export declare function createUnsignedVCJWT(vc: Record<string, unknown>, options?: EncodeVCAsJWTOptions): {
|
|
36
|
+
header: VCJWTHeader;
|
|
37
|
+
payload: VCJWTPayload;
|
|
38
|
+
encodedHeader: string;
|
|
39
|
+
encodedPayload: string;
|
|
40
|
+
signingInput: string;
|
|
41
|
+
};
|
|
42
|
+
export declare function completeVCJWT(signingInput: string, signature: string): string;
|
|
43
|
+
export declare function parseVCJWT(jwt: string): {
|
|
44
|
+
header: VCJWTHeader;
|
|
45
|
+
payload: VCJWTPayload;
|
|
46
|
+
signature: string;
|
|
47
|
+
signingInput: string;
|
|
48
|
+
} | null;
|
|
49
|
+
//# sourceMappingURL=utils.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../src/delegation/utils.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAKH;;;;;;;;;;GAUG;AACH,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,OAAO,GAAG,MAAM,CAGrD;AAmDD,MAAM,WAAW,WAAW;IAC1B,GAAG,EAAE,OAAO,CAAC;IACb,GAAG,EAAE,KAAK,GAAG,QAAQ,CAAC;IACtB,GAAG,CAAC,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,YAAY;IAC3B,GAAG,EAAE,MAAM,CAAC;IACZ,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,GAAG,CAAC,EAAE,MAAM,GAAG,MAAM,EAAE,CAAC;IACxB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,EAAE,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CAC7B;AAED,MAAM,WAAW,oBAAoB;IACnC,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,wBAAgB,mBAAmB,CACjC,EAAE,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC3B,OAAO,GAAE,oBAAyB,GACjC;IACD,MAAM,EAAE,WAAW,CAAC;IACpB,OAAO,EAAE,YAAY,CAAC;IACtB,aAAa,EAAE,MAAM,CAAC;IACtB,cAAc,EAAE,MAAM,CAAC;IACvB,YAAY,EAAE,MAAM,CAAC;CACtB,CAmDA;AAED,wBAAgB,aAAa,CAAC,YAAY,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,MAAM,CAE7E;AAED,wBAAgB,UAAU,CAAC,GAAG,EAAE,MAAM,GAAG;IACvC,MAAM,EAAE,WAAW,CAAC;IACpB,OAAO,EAAE,YAAY,CAAC;IACtB,SAAS,EAAE,MAAM,CAAC;IAClB,YAAY,EAAE,MAAM,CAAC;CACtB,GAAG,IAAI,CAsBP"}
|
|
@@ -0,0 +1,131 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Delegation Utilities
|
|
3
|
+
*
|
|
4
|
+
* Shared utility functions for delegation credential operations.
|
|
5
|
+
*/
|
|
6
|
+
import { base64urlEncodeFromString, base64urlDecodeToString } from '../utils/base64.js';
|
|
7
|
+
import { canonicalize } from 'json-canonicalize';
|
|
8
|
+
/**
|
|
9
|
+
* Canonicalize a JSON value using RFC 8785 (JSON Canonicalization Scheme).
|
|
10
|
+
*
|
|
11
|
+
* Wraps `json-canonicalize` with input validation to reject values that are
|
|
12
|
+
* not representable in JSON (Infinity, NaN, undefined, functions, symbols,
|
|
13
|
+
* bigints). The underlying library silently coerces these to `"null"` or
|
|
14
|
+
* `"undefined"`, which is dangerous for cryptographic canonicalization where
|
|
15
|
+
* distinct inputs must produce distinct outputs.
|
|
16
|
+
*
|
|
17
|
+
* @throws {TypeError} If `obj` is not a valid JSON value
|
|
18
|
+
*/
|
|
19
|
+
export function canonicalizeJSON(obj) {
|
|
20
|
+
assertJsonSafe(obj);
|
|
21
|
+
return canonicalize(obj);
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* Recursively validates that a value is JSON-safe.
|
|
25
|
+
* Throws TypeError for Infinity, NaN, undefined, functions, symbols, bigints.
|
|
26
|
+
*/
|
|
27
|
+
function assertJsonSafe(value, path = '$') {
|
|
28
|
+
if (value === null || typeof value === 'boolean' || typeof value === 'string') {
|
|
29
|
+
return;
|
|
30
|
+
}
|
|
31
|
+
if (typeof value === 'number') {
|
|
32
|
+
if (!Number.isFinite(value)) {
|
|
33
|
+
throw new TypeError(`Cannot canonicalize non-finite number at ${path}: ${value}`);
|
|
34
|
+
}
|
|
35
|
+
return;
|
|
36
|
+
}
|
|
37
|
+
if (typeof value === 'undefined') {
|
|
38
|
+
throw new TypeError(`Cannot canonicalize undefined at ${path}`);
|
|
39
|
+
}
|
|
40
|
+
if (typeof value === 'function') {
|
|
41
|
+
throw new TypeError(`Cannot canonicalize function at ${path}`);
|
|
42
|
+
}
|
|
43
|
+
if (typeof value === 'symbol') {
|
|
44
|
+
throw new TypeError(`Cannot canonicalize symbol at ${path}`);
|
|
45
|
+
}
|
|
46
|
+
if (typeof value === 'bigint') {
|
|
47
|
+
throw new TypeError(`Cannot canonicalize bigint at ${path}`);
|
|
48
|
+
}
|
|
49
|
+
if (Array.isArray(value)) {
|
|
50
|
+
for (let i = 0; i < value.length; i++) {
|
|
51
|
+
assertJsonSafe(value[i], `${path}[${i}]`);
|
|
52
|
+
}
|
|
53
|
+
return;
|
|
54
|
+
}
|
|
55
|
+
if (typeof value === 'object') {
|
|
56
|
+
for (const [key, val] of Object.entries(value)) {
|
|
57
|
+
assertJsonSafe(val, `${path}.${key}`);
|
|
58
|
+
}
|
|
59
|
+
return;
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
export function createUnsignedVCJWT(vc, options = {}) {
|
|
63
|
+
const header = {
|
|
64
|
+
alg: 'EdDSA',
|
|
65
|
+
typ: 'JWT',
|
|
66
|
+
};
|
|
67
|
+
if (options.keyId) {
|
|
68
|
+
header.kid = options.keyId;
|
|
69
|
+
}
|
|
70
|
+
const issuer = typeof vc['issuer'] === 'string'
|
|
71
|
+
? vc['issuer']
|
|
72
|
+
: vc['issuer']?.['id'];
|
|
73
|
+
const subject = vc['credentialSubject']?.['id'];
|
|
74
|
+
let exp;
|
|
75
|
+
let iat;
|
|
76
|
+
if (vc['expirationDate'] && typeof vc['expirationDate'] === 'string') {
|
|
77
|
+
exp = Math.floor(new Date(vc['expirationDate']).getTime() / 1000);
|
|
78
|
+
}
|
|
79
|
+
if (vc['issuanceDate'] && typeof vc['issuanceDate'] === 'string') {
|
|
80
|
+
iat = Math.floor(new Date(vc['issuanceDate']).getTime() / 1000);
|
|
81
|
+
}
|
|
82
|
+
const vcWithoutProof = { ...vc };
|
|
83
|
+
delete vcWithoutProof['proof'];
|
|
84
|
+
const payload = {
|
|
85
|
+
iss: issuer,
|
|
86
|
+
vc: vcWithoutProof,
|
|
87
|
+
};
|
|
88
|
+
if (subject)
|
|
89
|
+
payload.sub = subject;
|
|
90
|
+
if (exp)
|
|
91
|
+
payload.exp = exp;
|
|
92
|
+
if (iat)
|
|
93
|
+
payload.iat = iat;
|
|
94
|
+
if (vc['id'] && typeof vc['id'] === 'string')
|
|
95
|
+
payload.jti = vc['id'];
|
|
96
|
+
const encodedHeader = base64urlEncodeFromString(JSON.stringify(header));
|
|
97
|
+
const encodedPayload = base64urlEncodeFromString(JSON.stringify(payload));
|
|
98
|
+
const signingInput = `${encodedHeader}.${encodedPayload}`;
|
|
99
|
+
return {
|
|
100
|
+
header,
|
|
101
|
+
payload,
|
|
102
|
+
encodedHeader,
|
|
103
|
+
encodedPayload,
|
|
104
|
+
signingInput,
|
|
105
|
+
};
|
|
106
|
+
}
|
|
107
|
+
export function completeVCJWT(signingInput, signature) {
|
|
108
|
+
return `${signingInput}.${signature}`;
|
|
109
|
+
}
|
|
110
|
+
export function parseVCJWT(jwt) {
|
|
111
|
+
const parts = jwt.split('.');
|
|
112
|
+
if (parts.length !== 3) {
|
|
113
|
+
return null;
|
|
114
|
+
}
|
|
115
|
+
try {
|
|
116
|
+
const headerJson = base64urlDecodeToString(parts[0]);
|
|
117
|
+
const payloadJson = base64urlDecodeToString(parts[1]);
|
|
118
|
+
const header = JSON.parse(headerJson);
|
|
119
|
+
const payload = JSON.parse(payloadJson);
|
|
120
|
+
return {
|
|
121
|
+
header,
|
|
122
|
+
payload,
|
|
123
|
+
signature: parts[2],
|
|
124
|
+
signingInput: `${parts[0]}.${parts[1]}`,
|
|
125
|
+
};
|
|
126
|
+
}
|
|
127
|
+
catch {
|
|
128
|
+
return null;
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
//# sourceMappingURL=utils.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"utils.js","sourceRoot":"","sources":["../../src/delegation/utils.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,yBAAyB,EAAE,uBAAuB,EAAE,MAAM,oBAAoB,CAAC;AACxF,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAEjD;;;;;;;;;;GAUG;AACH,MAAM,UAAU,gBAAgB,CAAC,GAAY;IAC3C,cAAc,CAAC,GAAG,CAAC,CAAC;IACpB,OAAO,YAAY,CAAC,GAAG,CAAC,CAAC;AAC3B,CAAC;AAED;;;GAGG;AACH,SAAS,cAAc,CAAC,KAAc,EAAE,IAAI,GAAG,GAAG;IAChD,IAAI,KAAK,KAAK,IAAI,IAAI,OAAO,KAAK,KAAK,SAAS,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;QAC9E,OAAO;IACT,CAAC;IAED,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;QAC9B,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;YAC5B,MAAM,IAAI,SAAS,CACjB,4CAA4C,IAAI,KAAK,KAAK,EAAE,CAC7D,CAAC;QACJ,CAAC;QACD,OAAO;IACT,CAAC;IAED,IAAI,OAAO,KAAK,KAAK,WAAW,EAAE,CAAC;QACjC,MAAM,IAAI,SAAS,CAAC,oCAAoC,IAAI,EAAE,CAAC,CAAC;IAClE,CAAC;IAED,IAAI,OAAO,KAAK,KAAK,UAAU,EAAE,CAAC;QAChC,MAAM,IAAI,SAAS,CAAC,mCAAmC,IAAI,EAAE,CAAC,CAAC;IACjE,CAAC;IAED,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;QAC9B,MAAM,IAAI,SAAS,CAAC,iCAAiC,IAAI,EAAE,CAAC,CAAC;IAC/D,CAAC;IAED,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;QAC9B,MAAM,IAAI,SAAS,CAAC,iCAAiC,IAAI,EAAE,CAAC,CAAC;IAC/D,CAAC;IAED,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;QACzB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;YACtC,cAAc,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,GAAG,IAAI,IAAI,CAAC,GAAG,CAAC,CAAC;QAC5C,CAAC;QACD,OAAO;IACT,CAAC;IAED,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;QAC9B,KAAK,MAAM,CAAC,GAAG,EAAE,GAAG,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,KAAgC,CAAC,EAAE,CAAC;YAC1E,cAAc,CAAC,GAAG,EAAE,GAAG,IAAI,IAAI,GAAG,EAAE,CAAC,CAAC;QACxC,CAAC;QACD,OAAO;IACT,CAAC;AACH,CAAC;AAsBD,MAAM,UAAU,mBAAmB,CACjC,EAA2B,EAC3B,UAAgC,EAAE;IAQlC,MAAM,MAAM,GAAgB;QAC1B,GAAG,EAAE,OAAO;QACZ,GAAG,EAAE,KAAK;KACX,CAAC;IACF,IAAI,OAAO,CAAC,KAAK,EAAE,CAAC;QAClB,MAAM,CAAC,GAAG,GAAG,OAAO,CAAC,KAAK,CAAC;IAC7B,CAAC;IAED,MAAM,MAAM,GACV,OAAO,EAAE,CAAC,QAAQ,CAAC,KAAK,QAAQ;QAC9B,CAAC,CAAC,EAAE,CAAC,QAAQ,CAAC;QACd,CAAC,CAAG,EAAE,CAAC,QAAQ,CAA6B,EAAE,CAAC,IAAI,CAAY,CAAC;IACpE,MAAM,OAAO,GAAI,EAAE,CAAC,mBAAmB,CAA6B,EAAE,CAAC,IAAI,CAE9D,CAAC;IAEd,IAAI,GAAuB,CAAC;IAC5B,IAAI,GAAuB,CAAC;IAE5B,IAAI,EAAE,CAAC,gBAAgB,CAAC,IAAI,OAAO,EAAE,CAAC,gBAAgB,CAAC,KAAK,QAAQ,EAAE,CAAC;QACrE,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,IAAI,CAAC,EAAE,CAAC,gBAAgB,CAAC,CAAC,CAAC,OAAO,EAAE,GAAG,IAAI,CAAC,CAAC;IACpE,CAAC;IACD,IAAI,EAAE,CAAC,cAAc,CAAC,IAAI,OAAO,EAAE,CAAC,cAAc,CAAC,KAAK,QAAQ,EAAE,CAAC;QACjE,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,IAAI,CAAC,EAAE,CAAC,cAAc,CAAC,CAAC,CAAC,OAAO,EAAE,GAAG,IAAI,CAAC,CAAC;IAClE,CAAC;IAED,MAAM,cAAc,GAAG,EAAE,GAAG,EAAE,EAAE,CAAC;IACjC,OAAO,cAAc,CAAC,OAAO,CAAC,CAAC;IAE/B,MAAM,OAAO,GAAiB;QAC5B,GAAG,EAAE,MAAM;QACX,EAAE,EAAE,cAAc;KACnB,CAAC;IAEF,IAAI,OAAO;QAAE,OAAO,CAAC,GAAG,GAAG,OAAO,CAAC;IACnC,IAAI,GAAG;QAAE,OAAO,CAAC,GAAG,GAAG,GAAG,CAAC;IAC3B,IAAI,GAAG;QAAE,OAAO,CAAC,GAAG,GAAG,GAAG,CAAC;IAC3B,IAAI,EAAE,CAAC,IAAI,CAAC,IAAI,OAAO,EAAE,CAAC,IAAI,CAAC,KAAK,QAAQ;QAAE,OAAO,CAAC,GAAG,GAAG,EAAE,CAAC,IAAI,CAAC,CAAC;IAErE,MAAM,aAAa,GAAG,yBAAyB,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC;IACxE,MAAM,cAAc,GAAG,yBAAyB,CAAC,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,CAAC;IAC1E,MAAM,YAAY,GAAG,GAAG,aAAa,IAAI,cAAc,EAAE,CAAC;IAE1D,OAAO;QACL,MAAM;QACN,OAAO;QACP,aAAa;QACb,cAAc;QACd,YAAY;KACb,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,aAAa,CAAC,YAAoB,EAAE,SAAiB;IACnE,OAAO,GAAG,YAAY,IAAI,SAAS,EAAE,CAAC;AACxC,CAAC;AAED,MAAM,UAAU,UAAU,CAAC,GAAW;IAMpC,MAAM,KAAK,GAAG,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IAC7B,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACvB,OAAO,IAAI,CAAC;IACd,CAAC;IAED,IAAI,CAAC;QACH,MAAM,UAAU,GAAG,uBAAuB,CAAC,KAAK,CAAC,CAAC,CAAE,CAAC,CAAC;QACtD,MAAM,WAAW,GAAG,uBAAuB,CAAC,KAAK,CAAC,CAAC,CAAE,CAAC,CAAC;QAEvD,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,UAAU,CAAgB,CAAC;QACrD,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,WAAW,CAAiB,CAAC;QAExD,OAAO;YACL,MAAM;YACN,OAAO;YACP,SAAS,EAAE,KAAK,CAAC,CAAC,CAAE;YACpB,YAAY,EAAE,GAAG,KAAK,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,CAAC,CAAC,EAAE;SACxC,CAAC;IACJ,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC"}
|