@kya-os/mcp-i-core 1.3.12 → 1.3.14
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/dist/config/remote-config.js +9 -12
- package/dist/runtime/base.js +11 -0
- package/dist/services/access-control.service.js +5 -0
- package/dist/services/tool-protection.service.js +17 -8
- package/package.json +2 -2
- package/.turbo/turbo-build.log +0 -4
- package/.turbo/turbo-test$colon$coverage.log +0 -4586
- package/.turbo/turbo-test.log +0 -3169
- package/COMPLIANCE_IMPROVEMENT_REPORT.md +0 -483
- package/Composer 3.md +0 -615
- package/GPT-5.md +0 -1169
- package/OPUS-plan.md +0 -352
- package/PHASE_3_AND_4.1_SUMMARY.md +0 -585
- package/PHASE_3_SUMMARY.md +0 -317
- package/PHASE_4.1.3_SUMMARY.md +0 -428
- package/PHASE_4.1_COMPLETE.md +0 -525
- package/PHASE_4_USER_DID_IDENTITY_LINKING_PLAN.md +0 -1240
- package/SCHEMA_COMPLIANCE_REPORT.md +0 -275
- package/TEST_PLAN.md +0 -571
- package/coverage/coverage-final.json +0 -60
- package/dist/cache/oauth-config-cache.d.ts.map +0 -1
- package/dist/cache/oauth-config-cache.js.map +0 -1
- package/dist/cache/tool-protection-cache.d.ts.map +0 -1
- package/dist/cache/tool-protection-cache.js.map +0 -1
- package/dist/compliance/index.d.ts.map +0 -1
- package/dist/compliance/index.js.map +0 -1
- package/dist/compliance/schema-registry.d.ts.map +0 -1
- package/dist/compliance/schema-registry.js.map +0 -1
- package/dist/compliance/schema-verifier.d.ts.map +0 -1
- package/dist/compliance/schema-verifier.js.map +0 -1
- package/dist/config/remote-config.d.ts.map +0 -1
- package/dist/config/remote-config.js.map +0 -1
- package/dist/config.d.ts.map +0 -1
- package/dist/config.js.map +0 -1
- package/dist/delegation/audience-validator.d.ts.map +0 -1
- package/dist/delegation/audience-validator.js.map +0 -1
- package/dist/delegation/bitstring.d.ts.map +0 -1
- package/dist/delegation/bitstring.js.map +0 -1
- package/dist/delegation/cascading-revocation.d.ts.map +0 -1
- package/dist/delegation/cascading-revocation.js.map +0 -1
- package/dist/delegation/delegation-graph.d.ts.map +0 -1
- package/dist/delegation/delegation-graph.js.map +0 -1
- package/dist/delegation/did-key-resolver.d.ts.map +0 -1
- package/dist/delegation/did-key-resolver.js.map +0 -1
- package/dist/delegation/index.d.ts.map +0 -1
- package/dist/delegation/index.js.map +0 -1
- package/dist/delegation/statuslist-manager.d.ts.map +0 -1
- package/dist/delegation/statuslist-manager.js.map +0 -1
- package/dist/delegation/storage/index.d.ts.map +0 -1
- package/dist/delegation/storage/index.js.map +0 -1
- package/dist/delegation/storage/memory-graph-storage.d.ts.map +0 -1
- package/dist/delegation/storage/memory-graph-storage.js.map +0 -1
- package/dist/delegation/storage/memory-statuslist-storage.d.ts.map +0 -1
- package/dist/delegation/storage/memory-statuslist-storage.js.map +0 -1
- package/dist/delegation/utils.d.ts.map +0 -1
- package/dist/delegation/utils.js.map +0 -1
- package/dist/delegation/vc-issuer.d.ts.map +0 -1
- package/dist/delegation/vc-issuer.js.map +0 -1
- package/dist/delegation/vc-verifier.d.ts.map +0 -1
- package/dist/delegation/vc-verifier.js.map +0 -1
- package/dist/identity/idp-token-resolver.d.ts.map +0 -1
- package/dist/identity/idp-token-resolver.js.map +0 -1
- package/dist/identity/idp-token-storage.interface.d.ts.map +0 -1
- package/dist/identity/idp-token-storage.interface.js.map +0 -1
- package/dist/identity/user-did-manager.d.ts.map +0 -1
- package/dist/identity/user-did-manager.js.map +0 -1
- package/dist/index.d.ts.map +0 -1
- package/dist/index.js.map +0 -1
- package/dist/providers/base.d.ts.map +0 -1
- package/dist/providers/base.js.map +0 -1
- package/dist/providers/memory.d.ts.map +0 -1
- package/dist/providers/memory.js.map +0 -1
- package/dist/runtime/audit-logger.d.ts.map +0 -1
- package/dist/runtime/audit-logger.js.map +0 -1
- package/dist/runtime/base.d.ts.map +0 -1
- package/dist/runtime/base.js.map +0 -1
- package/dist/services/access-control.service.d.ts.map +0 -1
- package/dist/services/access-control.service.js.map +0 -1
- package/dist/services/authorization/authorization-registry.d.ts.map +0 -1
- package/dist/services/authorization/authorization-registry.js.map +0 -1
- package/dist/services/authorization/types.d.ts.map +0 -1
- package/dist/services/authorization/types.js.map +0 -1
- package/dist/services/batch-delegation.service.d.ts.map +0 -1
- package/dist/services/batch-delegation.service.js.map +0 -1
- package/dist/services/crypto.service.d.ts.map +0 -1
- package/dist/services/crypto.service.js.map +0 -1
- package/dist/services/errors.d.ts.map +0 -1
- package/dist/services/errors.js.map +0 -1
- package/dist/services/index.d.ts.map +0 -1
- package/dist/services/index.js.map +0 -1
- package/dist/services/oauth-config.service.d.ts.map +0 -1
- package/dist/services/oauth-config.service.js.map +0 -1
- package/dist/services/oauth-provider-registry.d.ts.map +0 -1
- package/dist/services/oauth-provider-registry.js.map +0 -1
- package/dist/services/oauth-service.d.ts.map +0 -1
- package/dist/services/oauth-service.js.map +0 -1
- package/dist/services/oauth-token-retrieval.service.d.ts.map +0 -1
- package/dist/services/oauth-token-retrieval.service.js.map +0 -1
- package/dist/services/proof-verifier.d.ts.map +0 -1
- package/dist/services/proof-verifier.js.map +0 -1
- package/dist/services/provider-resolver.d.ts.map +0 -1
- package/dist/services/provider-resolver.js.map +0 -1
- package/dist/services/provider-validator.d.ts.map +0 -1
- package/dist/services/provider-validator.js.map +0 -1
- package/dist/services/session-registration.service.d.ts.map +0 -1
- package/dist/services/session-registration.service.js.map +0 -1
- package/dist/services/storage.service.d.ts.map +0 -1
- package/dist/services/storage.service.js.map +0 -1
- package/dist/services/tool-context-builder.d.ts.map +0 -1
- package/dist/services/tool-context-builder.js.map +0 -1
- package/dist/services/tool-protection.service.d.ts.map +0 -1
- package/dist/services/tool-protection.service.js.map +0 -1
- package/dist/types/oauth-required-error.d.ts.map +0 -1
- package/dist/types/oauth-required-error.js.map +0 -1
- package/dist/types/tool-protection.d.ts.map +0 -1
- package/dist/types/tool-protection.js.map +0 -1
- package/dist/utils/base58.d.ts.map +0 -1
- package/dist/utils/base58.js.map +0 -1
- package/dist/utils/base64.d.ts.map +0 -1
- package/dist/utils/base64.js.map +0 -1
- package/dist/utils/cors.d.ts.map +0 -1
- package/dist/utils/cors.js.map +0 -1
- package/dist/utils/did-helpers.d.ts.map +0 -1
- package/dist/utils/did-helpers.js.map +0 -1
- package/dist/utils/index.d.ts.map +0 -1
- package/dist/utils/index.js.map +0 -1
- package/dist/utils/storage-keys.d.ts.map +0 -1
- package/dist/utils/storage-keys.js.map +0 -1
- package/docs/API_REFERENCE.md +0 -1362
- package/docs/COMPLIANCE_MATRIX.md +0 -691
- package/docs/STATUSLIST2021_GUIDE.md +0 -696
- package/docs/W3C_VC_DELEGATION_GUIDE.md +0 -710
- package/src/__tests__/cache/tool-protection-cache.test.ts +0 -640
- package/src/__tests__/config/provider-runtime-config.test.ts +0 -309
- package/src/__tests__/delegation-e2e.test.ts +0 -690
- package/src/__tests__/identity/user-did-manager.test.ts +0 -232
- package/src/__tests__/index.test.ts +0 -56
- package/src/__tests__/integration/full-flow.test.ts +0 -789
- package/src/__tests__/integration.test.ts +0 -281
- package/src/__tests__/providers/base.test.ts +0 -173
- package/src/__tests__/providers/memory.test.ts +0 -319
- package/src/__tests__/regression/phase2-regression.test.ts +0 -429
- package/src/__tests__/runtime/audit-logger.test.ts +0 -154
- package/src/__tests__/runtime/base-extensions.test.ts +0 -595
- package/src/__tests__/runtime/base.test.ts +0 -869
- package/src/__tests__/runtime/delegation-flow.test.ts +0 -164
- package/src/__tests__/runtime/proof-client-did.test.ts +0 -376
- package/src/__tests__/runtime/route-interception.test.ts +0 -686
- package/src/__tests__/runtime/tool-protection-enforcement.test.ts +0 -908
- package/src/__tests__/services/agentshield-integration.test.ts +0 -791
- package/src/__tests__/services/cache-busting.test.ts +0 -125
- package/src/__tests__/services/oauth-service-pkce.test.ts +0 -556
- package/src/__tests__/services/provider-resolver-edge-cases.test.ts +0 -591
- package/src/__tests__/services/tool-protection-merged-config.test.ts +0 -485
- package/src/__tests__/services/tool-protection-oauth-provider.test.ts +0 -480
- package/src/__tests__/services/tool-protection.service.test.ts +0 -1373
- package/src/__tests__/utils/mock-providers.ts +0 -340
- package/src/cache/oauth-config-cache.d.ts +0 -69
- package/src/cache/oauth-config-cache.d.ts.map +0 -1
- package/src/cache/oauth-config-cache.js.map +0 -1
- package/src/cache/oauth-config-cache.ts +0 -123
- package/src/cache/tool-protection-cache.ts +0 -171
- package/src/compliance/EXAMPLE.md +0 -412
- package/src/compliance/__tests__/schema-verifier.test.ts +0 -797
- package/src/compliance/index.ts +0 -8
- package/src/compliance/schema-registry.ts +0 -460
- package/src/compliance/schema-verifier.ts +0 -708
- package/src/config/__tests__/merged-config.spec.ts +0 -445
- package/src/config/__tests__/remote-config.spec.ts +0 -268
- package/src/config/remote-config.ts +0 -264
- package/src/config.ts +0 -312
- package/src/delegation/__tests__/audience-validator.test.ts +0 -112
- package/src/delegation/__tests__/bitstring.test.ts +0 -346
- package/src/delegation/__tests__/cascading-revocation.test.ts +0 -628
- package/src/delegation/__tests__/delegation-graph.test.ts +0 -584
- package/src/delegation/__tests__/did-key-resolver.test.ts +0 -265
- package/src/delegation/__tests__/utils.test.ts +0 -152
- package/src/delegation/__tests__/vc-issuer.test.ts +0 -442
- package/src/delegation/__tests__/vc-verifier.test.ts +0 -922
- package/src/delegation/audience-validator.ts +0 -52
- package/src/delegation/bitstring.ts +0 -278
- package/src/delegation/cascading-revocation.ts +0 -370
- package/src/delegation/delegation-graph.ts +0 -299
- package/src/delegation/did-key-resolver.ts +0 -179
- package/src/delegation/index.ts +0 -14
- package/src/delegation/statuslist-manager.ts +0 -353
- package/src/delegation/storage/__tests__/memory-graph-storage.test.ts +0 -366
- package/src/delegation/storage/__tests__/memory-statuslist-storage.test.ts +0 -228
- package/src/delegation/storage/index.ts +0 -9
- package/src/delegation/storage/memory-graph-storage.ts +0 -178
- package/src/delegation/storage/memory-statuslist-storage.ts +0 -77
- package/src/delegation/utils.ts +0 -221
- package/src/delegation/vc-issuer.ts +0 -232
- package/src/delegation/vc-verifier.ts +0 -568
- package/src/identity/idp-token-resolver.ts +0 -181
- package/src/identity/idp-token-storage.interface.ts +0 -94
- package/src/identity/user-did-manager.ts +0 -526
- package/src/index.ts +0 -310
- package/src/providers/base.d.ts +0 -91
- package/src/providers/base.d.ts.map +0 -1
- package/src/providers/base.js.map +0 -1
- package/src/providers/base.ts +0 -96
- package/src/providers/memory.ts +0 -142
- package/src/runtime/audit-logger.ts +0 -39
- package/src/runtime/base.ts +0 -1392
- package/src/services/__tests__/access-control.integration.test.ts +0 -443
- package/src/services/__tests__/access-control.proof-response-validation.test.ts +0 -578
- package/src/services/__tests__/access-control.service.test.ts +0 -970
- package/src/services/__tests__/batch-delegation.service.test.ts +0 -351
- package/src/services/__tests__/crypto.service.test.ts +0 -531
- package/src/services/__tests__/oauth-provider-registry.test.ts +0 -142
- package/src/services/__tests__/proof-verifier.integration.test.ts +0 -485
- package/src/services/__tests__/proof-verifier.test.ts +0 -489
- package/src/services/__tests__/provider-resolution.integration.test.ts +0 -202
- package/src/services/__tests__/provider-resolver.test.ts +0 -213
- package/src/services/__tests__/storage.service.test.ts +0 -358
- package/src/services/access-control.service.ts +0 -990
- package/src/services/authorization/authorization-registry.ts +0 -66
- package/src/services/authorization/types.ts +0 -71
- package/src/services/batch-delegation.service.ts +0 -137
- package/src/services/crypto.service.ts +0 -302
- package/src/services/errors.ts +0 -76
- package/src/services/index.ts +0 -18
- package/src/services/oauth-config.service.d.ts +0 -53
- package/src/services/oauth-config.service.d.ts.map +0 -1
- package/src/services/oauth-config.service.js.map +0 -1
- package/src/services/oauth-config.service.ts +0 -192
- package/src/services/oauth-provider-registry.d.ts +0 -57
- package/src/services/oauth-provider-registry.d.ts.map +0 -1
- package/src/services/oauth-provider-registry.js.map +0 -1
- package/src/services/oauth-provider-registry.ts +0 -141
- package/src/services/oauth-service.ts +0 -544
- package/src/services/oauth-token-retrieval.service.ts +0 -245
- package/src/services/proof-verifier.ts +0 -478
- package/src/services/provider-resolver.d.ts +0 -48
- package/src/services/provider-resolver.d.ts.map +0 -1
- package/src/services/provider-resolver.js.map +0 -1
- package/src/services/provider-resolver.ts +0 -146
- package/src/services/provider-validator.ts +0 -170
- package/src/services/session-registration.service.ts +0 -251
- package/src/services/storage.service.ts +0 -566
- package/src/services/tool-context-builder.ts +0 -237
- package/src/services/tool-protection.service.ts +0 -1070
- package/src/types/oauth-required-error.ts +0 -63
- package/src/types/tool-protection.ts +0 -155
- package/src/utils/__tests__/did-helpers.test.ts +0 -156
- package/src/utils/base58.ts +0 -109
- package/src/utils/base64.ts +0 -148
- package/src/utils/cors.ts +0 -83
- package/src/utils/did-helpers.ts +0 -210
- package/src/utils/index.ts +0 -8
- package/src/utils/storage-keys.ts +0 -278
- package/tsconfig.json +0 -21
- package/vitest.config.ts +0 -56
|
@@ -1,353 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* StatusList2021 Manager
|
|
3
|
-
*
|
|
4
|
-
* Manages StatusList2021 credentials for efficient delegation revocation.
|
|
5
|
-
* Follows the Python POC design from Delegation-Revocation.md.
|
|
6
|
-
*
|
|
7
|
-
* SOLID Principles:
|
|
8
|
-
* - Single Responsibility: Manages status list allocation and updates
|
|
9
|
-
* - Open/Closed: Extensible via storage provider interface
|
|
10
|
-
* - Liskov Substitution: Any storage provider can be used
|
|
11
|
-
* - Interface Segregation: Minimal storage interface
|
|
12
|
-
* - Dependency Inversion: Depends on abstractions (storage, signing)
|
|
13
|
-
*
|
|
14
|
-
* Related Spec: W3C StatusList2021
|
|
15
|
-
* Python Reference: Delegation-Revocation.md
|
|
16
|
-
*/
|
|
17
|
-
|
|
18
|
-
import type {
|
|
19
|
-
StatusList2021Credential,
|
|
20
|
-
CredentialStatus,
|
|
21
|
-
} from '@kya-os/contracts';
|
|
22
|
-
import { BitstringManager, CompressionFunction, DecompressionFunction } from './bitstring';
|
|
23
|
-
import { VCSigningFunction } from './vc-issuer';
|
|
24
|
-
import { canonicalizeJSON } from './utils';
|
|
25
|
-
|
|
26
|
-
/**
|
|
27
|
-
* Storage provider interface for status lists
|
|
28
|
-
*
|
|
29
|
-
* Platform-specific implementations (CloudflareKV, DynamoDB, Redis, etc.)
|
|
30
|
-
* implement this interface.
|
|
31
|
-
*/
|
|
32
|
-
export interface StatusListStorageProvider {
|
|
33
|
-
/**
|
|
34
|
-
* Get a status list credential by ID
|
|
35
|
-
*
|
|
36
|
-
* @param statusListId - The status list URL
|
|
37
|
-
* @returns The status list credential, or null if not found
|
|
38
|
-
*/
|
|
39
|
-
getStatusList(statusListId: string): Promise<StatusList2021Credential | null>;
|
|
40
|
-
|
|
41
|
-
/**
|
|
42
|
-
* Save a status list credential
|
|
43
|
-
*
|
|
44
|
-
* @param statusListId - The status list URL
|
|
45
|
-
* @param credential - The status list credential
|
|
46
|
-
*/
|
|
47
|
-
setStatusList(
|
|
48
|
-
statusListId: string,
|
|
49
|
-
credential: StatusList2021Credential
|
|
50
|
-
): Promise<void>;
|
|
51
|
-
|
|
52
|
-
/**
|
|
53
|
-
* Allocate a new index in a status list
|
|
54
|
-
*
|
|
55
|
-
* Thread-safe allocation of the next available index.
|
|
56
|
-
*
|
|
57
|
-
* @param statusListId - The status list URL
|
|
58
|
-
* @returns The allocated index
|
|
59
|
-
*/
|
|
60
|
-
allocateIndex(statusListId: string): Promise<number>;
|
|
61
|
-
}
|
|
62
|
-
|
|
63
|
-
/**
|
|
64
|
-
* Identity provider for signing status list credentials
|
|
65
|
-
*/
|
|
66
|
-
export interface StatusListIdentityProvider {
|
|
67
|
-
/** Get the DID of this identity */
|
|
68
|
-
getDid(): string;
|
|
69
|
-
|
|
70
|
-
/** Get the key ID of this identity */
|
|
71
|
-
getKeyId(): string;
|
|
72
|
-
}
|
|
73
|
-
|
|
74
|
-
/**
|
|
75
|
-
* StatusList2021 Manager
|
|
76
|
-
*
|
|
77
|
-
* Manages status lists for efficient delegation revocation.
|
|
78
|
-
* Per Delegation-Revocation.md:
|
|
79
|
-
* - StatusList2021 for efficient revocation distribution
|
|
80
|
-
* - Compressed bitstrings for scalability
|
|
81
|
-
* - Separate lists for revocation vs suspension
|
|
82
|
-
*/
|
|
83
|
-
export class StatusList2021Manager {
|
|
84
|
-
private statusListBaseUrl: string;
|
|
85
|
-
private defaultListSize: number;
|
|
86
|
-
|
|
87
|
-
constructor(
|
|
88
|
-
private storage: StatusListStorageProvider,
|
|
89
|
-
private identity: StatusListIdentityProvider,
|
|
90
|
-
private signingFunction: VCSigningFunction,
|
|
91
|
-
private compressor: CompressionFunction,
|
|
92
|
-
private decompressor: DecompressionFunction,
|
|
93
|
-
options?: {
|
|
94
|
-
/** Base URL for status lists (e.g., "https://example.com/status") */
|
|
95
|
-
statusListBaseUrl?: string;
|
|
96
|
-
/** Default size for new status lists (number of entries) */
|
|
97
|
-
defaultListSize?: number;
|
|
98
|
-
}
|
|
99
|
-
) {
|
|
100
|
-
this.statusListBaseUrl = options?.statusListBaseUrl || 'https://status.example.com';
|
|
101
|
-
this.defaultListSize = options?.defaultListSize || 131072; // 128K entries (16KB compressed)
|
|
102
|
-
}
|
|
103
|
-
|
|
104
|
-
/**
|
|
105
|
-
* Allocate a status entry for a new delegation credential
|
|
106
|
-
*
|
|
107
|
-
* Per Delegation-Revocation.md: Each delegation gets a unique status list entry.
|
|
108
|
-
*
|
|
109
|
-
* @param purpose - "revocation" or "suspension"
|
|
110
|
-
* @returns CredentialStatus entry for the delegation VC
|
|
111
|
-
*/
|
|
112
|
-
async allocateStatusEntry(
|
|
113
|
-
purpose: 'revocation' | 'suspension'
|
|
114
|
-
): Promise<CredentialStatus> {
|
|
115
|
-
// Determine which status list to use
|
|
116
|
-
const statusListId = `${this.statusListBaseUrl}/${purpose}/v1`;
|
|
117
|
-
|
|
118
|
-
// Allocate index in the status list (thread-safe)
|
|
119
|
-
const index = await this.storage.allocateIndex(statusListId);
|
|
120
|
-
|
|
121
|
-
// Ensure the status list exists
|
|
122
|
-
await this.ensureStatusListExists(statusListId, purpose);
|
|
123
|
-
|
|
124
|
-
// Create the credential status entry
|
|
125
|
-
const credentialStatus: CredentialStatus = {
|
|
126
|
-
id: `${statusListId}#${index}`,
|
|
127
|
-
type: 'StatusList2021Entry',
|
|
128
|
-
statusPurpose: purpose,
|
|
129
|
-
statusListIndex: index.toString(),
|
|
130
|
-
statusListCredential: statusListId,
|
|
131
|
-
};
|
|
132
|
-
|
|
133
|
-
return credentialStatus;
|
|
134
|
-
}
|
|
135
|
-
|
|
136
|
-
/**
|
|
137
|
-
* Revoke or suspend a delegation by updating its status
|
|
138
|
-
*
|
|
139
|
-
* @param credentialStatus - The credential status entry from the VC
|
|
140
|
-
* @param revoked - true to revoke/suspend, false to restore
|
|
141
|
-
*/
|
|
142
|
-
async updateStatus(
|
|
143
|
-
credentialStatus: CredentialStatus,
|
|
144
|
-
revoked: boolean
|
|
145
|
-
): Promise<void> {
|
|
146
|
-
const { statusListCredential, statusListIndex } = credentialStatus;
|
|
147
|
-
|
|
148
|
-
// Get the current status list
|
|
149
|
-
const statusList = await this.storage.getStatusList(statusListCredential);
|
|
150
|
-
if (!statusList) {
|
|
151
|
-
throw new Error(`Status list not found: ${statusListCredential}`);
|
|
152
|
-
}
|
|
153
|
-
|
|
154
|
-
// Decode the bitstring
|
|
155
|
-
const manager = await BitstringManager.decode(
|
|
156
|
-
statusList.credentialSubject.encodedList,
|
|
157
|
-
this.compressor,
|
|
158
|
-
this.decompressor
|
|
159
|
-
);
|
|
160
|
-
|
|
161
|
-
// Update the bit
|
|
162
|
-
const index = parseInt(statusListIndex, 10);
|
|
163
|
-
manager.setBit(index, revoked);
|
|
164
|
-
|
|
165
|
-
// Re-encode
|
|
166
|
-
const encodedList = await manager.encode();
|
|
167
|
-
|
|
168
|
-
// Update the credential
|
|
169
|
-
const updatedCredential: StatusList2021Credential = {
|
|
170
|
-
...statusList,
|
|
171
|
-
credentialSubject: {
|
|
172
|
-
...statusList.credentialSubject,
|
|
173
|
-
encodedList,
|
|
174
|
-
},
|
|
175
|
-
};
|
|
176
|
-
|
|
177
|
-
// Re-sign the credential (proof changes when content changes)
|
|
178
|
-
const unsignedCredential = { ...updatedCredential };
|
|
179
|
-
delete (unsignedCredential as any).proof;
|
|
180
|
-
|
|
181
|
-
const canonicalVC = canonicalizeJSON(unsignedCredential);
|
|
182
|
-
const proof = await this.signingFunction(
|
|
183
|
-
canonicalVC,
|
|
184
|
-
this.identity.getDid(),
|
|
185
|
-
this.identity.getKeyId()
|
|
186
|
-
);
|
|
187
|
-
|
|
188
|
-
const signedCredential: StatusList2021Credential = {
|
|
189
|
-
...updatedCredential,
|
|
190
|
-
proof,
|
|
191
|
-
};
|
|
192
|
-
|
|
193
|
-
// Save the updated status list
|
|
194
|
-
await this.storage.setStatusList(statusListCredential, signedCredential);
|
|
195
|
-
}
|
|
196
|
-
|
|
197
|
-
/**
|
|
198
|
-
* Check if a credential is revoked
|
|
199
|
-
*
|
|
200
|
-
* @param credentialStatus - The credential status entry
|
|
201
|
-
* @returns true if revoked/suspended, false otherwise
|
|
202
|
-
*/
|
|
203
|
-
async checkStatus(credentialStatus: CredentialStatus): Promise<boolean> {
|
|
204
|
-
const { statusListCredential, statusListIndex } = credentialStatus;
|
|
205
|
-
|
|
206
|
-
// Get the status list
|
|
207
|
-
const statusList = await this.storage.getStatusList(statusListCredential);
|
|
208
|
-
if (!statusList) {
|
|
209
|
-
// Status list doesn't exist = not revoked
|
|
210
|
-
return false;
|
|
211
|
-
}
|
|
212
|
-
|
|
213
|
-
// Decode and check the bit
|
|
214
|
-
const manager = await BitstringManager.decode(
|
|
215
|
-
statusList.credentialSubject.encodedList,
|
|
216
|
-
this.compressor,
|
|
217
|
-
this.decompressor
|
|
218
|
-
);
|
|
219
|
-
|
|
220
|
-
const index = parseInt(statusListIndex, 10);
|
|
221
|
-
return manager.getBit(index);
|
|
222
|
-
}
|
|
223
|
-
|
|
224
|
-
/**
|
|
225
|
-
* Get all revoked indices in a status list
|
|
226
|
-
*
|
|
227
|
-
* Useful for debugging or auditing.
|
|
228
|
-
*
|
|
229
|
-
* @param statusListId - The status list URL
|
|
230
|
-
* @returns Array of revoked indices
|
|
231
|
-
*/
|
|
232
|
-
async getRevokedIndices(statusListId: string): Promise<number[]> {
|
|
233
|
-
const statusList = await this.storage.getStatusList(statusListId);
|
|
234
|
-
if (!statusList) {
|
|
235
|
-
return [];
|
|
236
|
-
}
|
|
237
|
-
|
|
238
|
-
const manager = await BitstringManager.decode(
|
|
239
|
-
statusList.credentialSubject.encodedList,
|
|
240
|
-
this.compressor,
|
|
241
|
-
this.decompressor
|
|
242
|
-
);
|
|
243
|
-
|
|
244
|
-
return manager.getSetBits();
|
|
245
|
-
}
|
|
246
|
-
|
|
247
|
-
/**
|
|
248
|
-
* Ensure a status list exists, creating it if needed
|
|
249
|
-
*
|
|
250
|
-
* @param statusListId - The status list URL
|
|
251
|
-
* @param purpose - "revocation" or "suspension"
|
|
252
|
-
*/
|
|
253
|
-
private async ensureStatusListExists(
|
|
254
|
-
statusListId: string,
|
|
255
|
-
purpose: 'revocation' | 'suspension'
|
|
256
|
-
): Promise<void> {
|
|
257
|
-
// Check if it already exists
|
|
258
|
-
const existing = await this.storage.getStatusList(statusListId);
|
|
259
|
-
if (existing) {
|
|
260
|
-
return;
|
|
261
|
-
}
|
|
262
|
-
|
|
263
|
-
// Create a new status list
|
|
264
|
-
const manager = new BitstringManager(
|
|
265
|
-
this.defaultListSize,
|
|
266
|
-
this.compressor,
|
|
267
|
-
this.decompressor
|
|
268
|
-
);
|
|
269
|
-
const encodedList = await manager.encode();
|
|
270
|
-
|
|
271
|
-
// Create the unsigned credential
|
|
272
|
-
const unsignedCredential = {
|
|
273
|
-
'@context': [
|
|
274
|
-
'https://www.w3.org/2018/credentials/v1',
|
|
275
|
-
'https://w3id.org/vc/status-list/2021/v1',
|
|
276
|
-
] as [string, string],
|
|
277
|
-
id: statusListId,
|
|
278
|
-
type: ['VerifiableCredential', 'StatusList2021Credential'] as ['VerifiableCredential', 'StatusList2021Credential'],
|
|
279
|
-
issuer: this.identity.getDid(),
|
|
280
|
-
issuanceDate: new Date().toISOString(),
|
|
281
|
-
credentialSubject: {
|
|
282
|
-
id: `${statusListId}#list`,
|
|
283
|
-
type: 'StatusList2021' as const,
|
|
284
|
-
statusPurpose: purpose,
|
|
285
|
-
encodedList,
|
|
286
|
-
},
|
|
287
|
-
};
|
|
288
|
-
|
|
289
|
-
// Sign it
|
|
290
|
-
const canonicalVC = canonicalizeJSON(unsignedCredential);
|
|
291
|
-
const proof = await this.signingFunction(
|
|
292
|
-
canonicalVC,
|
|
293
|
-
this.identity.getDid(),
|
|
294
|
-
this.identity.getKeyId()
|
|
295
|
-
);
|
|
296
|
-
|
|
297
|
-
const signedCredential: StatusList2021Credential = {
|
|
298
|
-
...unsignedCredential,
|
|
299
|
-
proof,
|
|
300
|
-
};
|
|
301
|
-
|
|
302
|
-
// Store it
|
|
303
|
-
await this.storage.setStatusList(statusListId, signedCredential);
|
|
304
|
-
}
|
|
305
|
-
|
|
306
|
-
/**
|
|
307
|
-
* Get the status list base URL
|
|
308
|
-
*/
|
|
309
|
-
getStatusListBaseUrl(): string {
|
|
310
|
-
return this.statusListBaseUrl;
|
|
311
|
-
}
|
|
312
|
-
|
|
313
|
-
/**
|
|
314
|
-
* Get the default list size
|
|
315
|
-
*/
|
|
316
|
-
getDefaultListSize(): number {
|
|
317
|
-
return this.defaultListSize;
|
|
318
|
-
}
|
|
319
|
-
}
|
|
320
|
-
|
|
321
|
-
/**
|
|
322
|
-
* Create a StatusList2021 manager
|
|
323
|
-
*
|
|
324
|
-
* Convenience factory function.
|
|
325
|
-
*
|
|
326
|
-
* @param storage - Storage provider
|
|
327
|
-
* @param identity - Identity provider
|
|
328
|
-
* @param signingFunction - VC signing function
|
|
329
|
-
* @param compressor - Compression function
|
|
330
|
-
* @param decompressor - Decompression function
|
|
331
|
-
* @param options - Manager options
|
|
332
|
-
* @returns StatusList2021Manager instance
|
|
333
|
-
*/
|
|
334
|
-
export function createStatusListManager(
|
|
335
|
-
storage: StatusListStorageProvider,
|
|
336
|
-
identity: StatusListIdentityProvider,
|
|
337
|
-
signingFunction: VCSigningFunction,
|
|
338
|
-
compressor: CompressionFunction,
|
|
339
|
-
decompressor: DecompressionFunction,
|
|
340
|
-
options?: {
|
|
341
|
-
statusListBaseUrl?: string;
|
|
342
|
-
defaultListSize?: number;
|
|
343
|
-
}
|
|
344
|
-
): StatusList2021Manager {
|
|
345
|
-
return new StatusList2021Manager(
|
|
346
|
-
storage,
|
|
347
|
-
identity,
|
|
348
|
-
signingFunction,
|
|
349
|
-
compressor,
|
|
350
|
-
decompressor,
|
|
351
|
-
options
|
|
352
|
-
);
|
|
353
|
-
}
|