@docknetwork/wallet-sdk-wasm 1.5.14 → 1.7.6
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/generate-docs.js +49 -0
- package/jsdoc.conf.json +29 -6
- package/lib/index.js +9 -1
- package/lib/index.mjs +9 -1
- package/lib/modules/network-manager.js +15 -12
- package/lib/modules/network-manager.mjs +15 -12
- package/lib/rpc-server.js +11 -1
- package/lib/rpc-server.mjs +11 -1
- package/lib/services/blockchain/cached-did-resolver.js +113 -0
- package/lib/services/blockchain/cached-did-resolver.mjs +109 -0
- package/lib/services/blockchain/index.js +11 -0
- package/lib/services/blockchain/index.mjs +11 -0
- package/lib/services/blockchain/service-rpc.js +12 -0
- package/lib/services/blockchain/service-rpc.mjs +12 -0
- package/lib/services/blockchain/service.js +161 -19
- package/lib/services/blockchain/service.mjs +162 -20
- package/lib/services/credential/bbs-revocation.js +11 -0
- package/lib/services/credential/bbs-revocation.mjs +11 -0
- package/lib/services/credential/bound-check.js +1 -1
- package/lib/services/credential/bound-check.mjs +1 -1
- package/lib/services/credential/config.js +4 -1
- package/lib/services/credential/config.mjs +4 -1
- package/lib/services/credential/delegatable-credentials.js +300 -0
- package/lib/services/credential/delegatable-credentials.mjs +263 -0
- package/lib/services/credential/index.js +53 -0
- package/lib/services/credential/index.mjs +18 -0
- package/lib/services/credential/pex-helpers.js +4 -4
- package/lib/services/credential/pex-helpers.mjs +4 -4
- package/lib/services/credential/sd-jwt.js +214 -0
- package/lib/services/credential/sd-jwt.mjs +200 -0
- package/lib/services/credential/service-rpc.js +9 -0
- package/lib/services/credential/service-rpc.mjs +9 -0
- package/lib/services/credential/service.js +324 -7
- package/lib/services/credential/service.mjs +324 -7
- package/lib/services/edv/index.js +1 -0
- package/lib/services/edv/index.mjs +1 -0
- package/lib/services/edv/service-rpc.js +23 -0
- package/lib/services/edv/service-rpc.mjs +23 -0
- package/lib/services/edv/service.js +226 -2
- package/lib/services/edv/service.mjs +223 -3
- package/lib/services/index.js +14 -0
- package/lib/services/index.mjs +14 -0
- package/lib/services/pex/config.js +4 -0
- package/lib/services/pex/config.mjs +4 -0
- package/lib/services/pex/service-rpc.js +4 -0
- package/lib/services/pex/service-rpc.mjs +4 -0
- package/lib/services/pex/service.js +7 -0
- package/lib/services/pex/service.mjs +7 -0
- package/lib/services/relay-service/service.js +124 -1
- package/lib/services/relay-service/service.mjs +124 -1
- package/lib/services/rpc-service-client.js +0 -3
- package/lib/services/rpc-service-client.mjs +0 -3
- package/lib/services/storage/index.js +19 -2
- package/lib/services/storage/index.mjs +24 -1
- package/lib/services/storage/service-rpc.js +7 -3
- package/lib/services/storage/service-rpc.mjs +7 -3
- package/lib/services/storage/service.js +4 -0
- package/lib/services/storage/service.mjs +4 -0
- package/lib/setup-nodejs.js +9 -1
- package/lib/setup-nodejs.mjs +9 -1
- package/lib/setup-tests.js +9 -1
- package/lib/setup-tests.mjs +9 -1
- package/lib/src/modules/event-manager.d.ts +0 -1
- package/lib/src/modules/event-manager.d.ts.map +1 -1
- package/lib/src/modules/network-manager.d.ts +2 -4
- package/lib/src/modules/network-manager.d.ts.map +1 -1
- package/lib/src/services/blockchain/cached-did-resolver.d.ts +28 -0
- package/lib/src/services/blockchain/cached-did-resolver.d.ts.map +1 -0
- package/lib/src/services/blockchain/cached-did-resolver.test.d.ts +2 -0
- package/lib/src/services/blockchain/cached-did-resolver.test.d.ts.map +1 -0
- package/lib/src/services/blockchain/configs.d.ts +1 -2
- package/lib/src/services/blockchain/configs.d.ts.map +1 -1
- package/lib/src/services/blockchain/service.d.ts +117 -19
- package/lib/src/services/blockchain/service.d.ts.map +1 -1
- package/lib/src/services/credential/bbs-revocation.d.ts +1 -1
- package/lib/src/services/credential/bbs-revocation.d.ts.map +1 -1
- package/lib/src/services/credential/bound-check.d.ts.map +1 -1
- package/lib/src/services/credential/config.d.ts.map +1 -1
- package/lib/src/services/credential/delegatable-credentials.d.ts +272 -0
- package/lib/src/services/credential/delegatable-credentials.d.ts.map +1 -0
- package/lib/src/services/credential/index.d.ts +4 -0
- package/lib/src/services/credential/index.d.ts.map +1 -1
- package/lib/src/services/credential/pex-helpers.d.ts +2 -2
- package/lib/src/services/credential/pex-helpers.d.ts.map +1 -1
- package/lib/src/services/credential/sd-jwt.test.d.ts +2 -0
- package/lib/src/services/credential/sd-jwt.test.d.ts.map +1 -0
- package/lib/src/services/credential/service.d.ts +274 -4
- package/lib/src/services/credential/service.d.ts.map +1 -1
- package/lib/src/services/dids/keypair-utils.d.ts +2 -2
- package/lib/src/services/dids/keypair-utils.d.ts.map +1 -1
- package/lib/src/services/dids/service.d.ts +35 -3
- package/lib/src/services/dids/service.d.ts.map +1 -1
- package/lib/src/services/edv/service.d.ts +201 -2
- package/lib/src/services/edv/service.d.ts.map +1 -1
- package/lib/src/services/pex/config.d.ts +1 -0
- package/lib/src/services/pex/config.d.ts.map +1 -1
- package/lib/src/services/pex/service.d.ts +1 -0
- package/lib/src/services/pex/service.d.ts.map +1 -1
- package/lib/src/services/relay-service/service.d.ts +148 -8
- package/lib/src/services/relay-service/service.d.ts.map +1 -1
- package/lib/src/services/rpc-service-client.d.ts +2 -2
- package/lib/src/services/rpc-service-client.d.ts.map +1 -1
- package/lib/src/services/storage/index.d.ts +1 -1
- package/lib/src/services/storage/index.d.ts.map +1 -1
- package/lib/src/services/storage/service-rpc.d.ts +9 -0
- package/lib/src/services/storage/service-rpc.d.ts.map +1 -0
- package/lib/src/services/storage/service.d.ts +1 -0
- package/lib/src/services/storage/service.d.ts.map +1 -1
- package/lib/src/services/util-crypto/service.d.ts +2 -2
- package/lib/src/services/util-crypto/service.d.ts.map +1 -1
- package/lib/tsconfig.tsbuildinfo +1 -1
- package/lib/wallet/rpc-storage-interface.js +13 -3
- package/lib/wallet/rpc-storage-interface.mjs +11 -1
- package/lib/wallet/rpc-storage-wallet.js +10 -0
- package/lib/wallet/rpc-storage-wallet.mjs +10 -0
- package/package.json +29 -16
- package/rollup.config.mjs +5 -3
- package/src/globals.d.ts +3 -0
- package/src/modules/network-manager.ts +15 -14
- package/src/services/blockchain/cached-did-resolver.test.ts +288 -0
- package/src/services/blockchain/cached-did-resolver.ts +126 -0
- package/src/services/blockchain/configs.ts +1 -2
- package/src/services/blockchain/service-rpc.js +12 -0
- package/src/services/blockchain/service.ts +167 -20
- package/src/services/credential/bound-check.ts +1 -1
- package/src/services/credential/config.ts +7 -1
- package/src/services/credential/delegatable-credentials.ts +409 -0
- package/src/services/credential/index.ts +16 -0
- package/src/services/credential/pex-helpers.js +4 -4
- package/src/services/credential/pex-helpers.test.js +2 -2
- package/src/services/credential/sd-jwt.test.ts +718 -0
- package/src/services/credential/sd-jwt.ts +231 -0
- package/src/services/credential/service-rpc.js +9 -0
- package/src/services/credential/service.ts +328 -7
- package/src/services/edv/index.test.js +229 -0
- package/src/services/edv/service-rpc.js +23 -0
- package/src/services/edv/service.ts +272 -1
- package/src/services/pex/config.ts +4 -0
- package/src/services/pex/service-rpc.js +4 -0
- package/src/services/pex/service.ts +13 -0
- package/src/services/pex/tests/pex-service.test.js +210 -0
- package/src/services/relay-service/service.ts +130 -1
- package/src/services/rpc-service-client.js +0 -3
- package/src/services/storage/index.js +15 -1
- package/src/services/storage/service-rpc.js +7 -3
- package/src/services/storage/service.ts +5 -0
|
@@ -16,6 +16,7 @@ var assert = require('assert');
|
|
|
16
16
|
var services_credential_bbsRevocation = require('./bbs-revocation.js');
|
|
17
17
|
var services_credential_pexHelpers = require('./pex-helpers.js');
|
|
18
18
|
var services_dids_service = require('../dids/service.js');
|
|
19
|
+
var services_credential_sdJwt = require('./sd-jwt.js');
|
|
19
20
|
require('@cosmjs/proto-signing');
|
|
20
21
|
require('@docknetwork/cheqd-blockchain-api');
|
|
21
22
|
require('@docknetwork/cheqd-blockchain-modules');
|
|
@@ -30,6 +31,17 @@ require('@scure/bip39');
|
|
|
30
31
|
require('@scure/bip39/wordlists/english');
|
|
31
32
|
require('../util-crypto/configs.js');
|
|
32
33
|
require('@docknetwork/credential-sdk/types');
|
|
34
|
+
require('../blockchain/cached-did-resolver.js');
|
|
35
|
+
require('../storage/index.js');
|
|
36
|
+
require('../storage/service.js');
|
|
37
|
+
require('../storage/service-rpc.js');
|
|
38
|
+
require('../rpc-service-client.js');
|
|
39
|
+
require('../../rpc-client.js');
|
|
40
|
+
require('json-rpc-2.0');
|
|
41
|
+
require('../../core/crypto.js');
|
|
42
|
+
require('crypto');
|
|
43
|
+
require('../../logger.js');
|
|
44
|
+
require('../../rpc-util.js');
|
|
33
45
|
require('@docknetwork/crypto-wasm-ts/lib/legosnark');
|
|
34
46
|
require('base64url');
|
|
35
47
|
require('@astronautlabs/jsonpath');
|
|
@@ -44,27 +56,69 @@ require('@digitalbazaar/x25519-key-agreement-key-2019');
|
|
|
44
56
|
require('@digitalbazaar/ed25519-verification-key-2018');
|
|
45
57
|
require('@digitalbazaar/ed25519-verification-key-2020');
|
|
46
58
|
require('../dids/keypair-utils.js');
|
|
59
|
+
require('@sd-jwt/sd-jwt-vc');
|
|
60
|
+
require('@sd-jwt/crypto-nodejs');
|
|
47
61
|
|
|
48
62
|
function _interopDefaultLegacy (e) { return e && typeof e === 'object' && 'default' in e ? e : { 'default': e }; }
|
|
49
63
|
|
|
50
64
|
var assert__default = /*#__PURE__*/_interopDefaultLegacy(assert);
|
|
51
65
|
|
|
52
66
|
// @ts-nocheck
|
|
67
|
+
/**
|
|
68
|
+
* PEX (Presentation Exchange) instance for credential filtering
|
|
69
|
+
* @private
|
|
70
|
+
*/
|
|
53
71
|
const pex = new pex$1.PEX();
|
|
72
|
+
/**
|
|
73
|
+
* Checks if a credential uses BBS+ signature
|
|
74
|
+
* @param {Object} credential - The credential to check
|
|
75
|
+
* @returns {boolean} True if the credential uses BBS+ signature
|
|
76
|
+
* @example
|
|
77
|
+
* const isBBS = isBBSPlusCredential(credential);
|
|
78
|
+
* if (isBBS) {
|
|
79
|
+
* console.log('This credential uses BBS+ signatures');
|
|
80
|
+
* }
|
|
81
|
+
*/
|
|
54
82
|
function isBBSPlusCredential(credential) {
|
|
55
83
|
return ((typeof credential?.proof?.type === 'string' &&
|
|
56
84
|
credential.proof.type.includes('BBS+SignatureDock')) ||
|
|
57
85
|
(Array.isArray(credential['@context']) &&
|
|
58
86
|
credential['@context'].find(context => typeof context === 'string' && context.indexOf('bbs') > -1)));
|
|
59
87
|
}
|
|
88
|
+
/**
|
|
89
|
+
* Checks if a credential uses KVAC (BBDT16) signature
|
|
90
|
+
* @param {Object} credential - The credential to check
|
|
91
|
+
* @returns {boolean} True if the credential uses KVAC signature
|
|
92
|
+
* @example
|
|
93
|
+
* const isKVAC = isKvacCredential(credential);
|
|
94
|
+
*/
|
|
60
95
|
function isKvacCredential(credential) {
|
|
61
96
|
return (typeof credential?.proof?.type === 'string' &&
|
|
62
97
|
credential.proof.type.toLowerCase().includes('bbdt16'));
|
|
63
98
|
}
|
|
99
|
+
/**
|
|
100
|
+
* Checks if a credential is anonymous (BBS+ or KVAC)
|
|
101
|
+
* @param {Object} credential - The credential to check
|
|
102
|
+
* @returns {boolean} True if the credential is anonymous
|
|
103
|
+
* @example
|
|
104
|
+
* if (isAnnonymousCredential(credential)) {
|
|
105
|
+
* console.log('This credential supports selective disclosure');
|
|
106
|
+
* }
|
|
107
|
+
*/
|
|
64
108
|
function isAnnonymousCredential(credential) {
|
|
65
109
|
return isBBSPlusCredential(credential) || isKvacCredential(credential);
|
|
66
110
|
}
|
|
111
|
+
/**
|
|
112
|
+
* Service class for managing verifiable credentials
|
|
113
|
+
* @class
|
|
114
|
+
* @description Provides methods for creating, signing, verifying, and presenting
|
|
115
|
+
* verifiable credentials with support for various signature types
|
|
116
|
+
*/
|
|
67
117
|
class CredentialService {
|
|
118
|
+
/**
|
|
119
|
+
* Creates a new CredentialService instance
|
|
120
|
+
* @constructor
|
|
121
|
+
*/
|
|
68
122
|
constructor() {
|
|
69
123
|
this.name = services_credential_config.serviceName;
|
|
70
124
|
}
|
|
@@ -77,8 +131,25 @@ class CredentialService {
|
|
|
77
131
|
CredentialService.prototype.deriveVCFromPresentation,
|
|
78
132
|
CredentialService.prototype.isBBSPlusCredential,
|
|
79
133
|
CredentialService.prototype.isKvacCredential,
|
|
134
|
+
CredentialService.prototype.isSDJWTCredential,
|
|
135
|
+
CredentialService.prototype.credentialToW3C,
|
|
136
|
+
CredentialService.prototype.createSDJWTPresentation,
|
|
80
137
|
CredentialService.prototype.acquireOIDCredential,
|
|
81
138
|
];
|
|
139
|
+
createSDJWTPresentation(params) {
|
|
140
|
+
const { attributesToReveal, credential } = params;
|
|
141
|
+
return services_credential_sdJwt.createSDJWTPresentation({ attributesToReveal, credential });
|
|
142
|
+
}
|
|
143
|
+
/**
|
|
144
|
+
* Generates a new verifiable credential template
|
|
145
|
+
* @param {Object} [params={}] - Generation parameters
|
|
146
|
+
* @param {Object} [params.subject] - The credential subject
|
|
147
|
+
* @returns {VerifiableCredential} A new verifiable credential instance
|
|
148
|
+
* @example
|
|
149
|
+
* const credential = credentialService.generateCredential({
|
|
150
|
+
* subject: { id: 'did:example:123', name: 'Alice' }
|
|
151
|
+
* });
|
|
152
|
+
*/
|
|
82
153
|
generateCredential(params = {}) {
|
|
83
154
|
services_credential_config.validation.generateCredential(params);
|
|
84
155
|
const { subject } = params;
|
|
@@ -96,6 +167,19 @@ class CredentialService {
|
|
|
96
167
|
}
|
|
97
168
|
return vc$1;
|
|
98
169
|
}
|
|
170
|
+
/**
|
|
171
|
+
* Signs a verifiable credential
|
|
172
|
+
* @param {Object} params - Signing parameters
|
|
173
|
+
* @param {Object} params.vcJson - The credential JSON to sign
|
|
174
|
+
* @param {Object} params.keyDoc - The key document for signing
|
|
175
|
+
* @returns {Promise<VerifiableCredential>} The signed verifiable credential
|
|
176
|
+
* @throws {Error} If validation fails or signing fails
|
|
177
|
+
* @example
|
|
178
|
+
* const signedCredential = await credentialService.signCredential({
|
|
179
|
+
* vcJson: credentialData,
|
|
180
|
+
* keyDoc: issuerKeyDocument
|
|
181
|
+
* });
|
|
182
|
+
*/
|
|
99
183
|
async signCredential(params) {
|
|
100
184
|
services_credential_config.validation.signCredential(params);
|
|
101
185
|
const { vcJson, keyDoc } = params;
|
|
@@ -108,13 +192,38 @@ class CredentialService {
|
|
|
108
192
|
await verifiableCredential.sign(suite);
|
|
109
193
|
return verifiableCredential;
|
|
110
194
|
}
|
|
195
|
+
/**
|
|
196
|
+
* Creates a verifiable presentation from credentials
|
|
197
|
+
* @param {Object} params - Presentation parameters
|
|
198
|
+
* @param {Array<Object>} params.credentials - Array of verifiable credentials to include
|
|
199
|
+
* @param {Object} params.keyDoc - The key document for signing the presentation
|
|
200
|
+
* @param {string} [params.challenge] - Challenge string for the presentation proof
|
|
201
|
+
* @param {string} [params.id] - Presentation identifier
|
|
202
|
+
* @param {string} [params.domain] - Domain for the presentation proof
|
|
203
|
+
* @returns {Promise<Object>} The signed verifiable presentation
|
|
204
|
+
* @throws {Error} If validation fails
|
|
205
|
+
* @example
|
|
206
|
+
* const presentation = await credentialService.createPresentation({
|
|
207
|
+
* credentials: [credential1, credential2],
|
|
208
|
+
* keyDoc: holderKeyDocument,
|
|
209
|
+
* challenge: 'abc123',
|
|
210
|
+
* domain: 'example.com'
|
|
211
|
+
* });
|
|
212
|
+
*/
|
|
111
213
|
async createPresentation(params) {
|
|
112
214
|
services_credential_config.validation.createPresentation(params);
|
|
113
215
|
const { credentials, keyDoc, challenge, id, domain } = params;
|
|
114
216
|
const vp = new vc.VerifiablePresentation(id);
|
|
115
217
|
let shouldSkipSigning = false;
|
|
218
|
+
let jwtCredentials = [];
|
|
116
219
|
for (const signedVC of credentials) {
|
|
117
|
-
|
|
220
|
+
if (typeof signedVC === 'string') {
|
|
221
|
+
jwtCredentials.push(signedVC);
|
|
222
|
+
shouldSkipSigning = true;
|
|
223
|
+
}
|
|
224
|
+
else {
|
|
225
|
+
vp.addCredential(signedVC);
|
|
226
|
+
}
|
|
118
227
|
shouldSkipSigning = shouldSkipSigning || isAnnonymousCredential(signedVC);
|
|
119
228
|
}
|
|
120
229
|
if (!shouldSkipSigning) {
|
|
@@ -124,16 +233,54 @@ class CredentialService {
|
|
|
124
233
|
keyPair.signer = keyPair.signer();
|
|
125
234
|
const suite = await vc.getSuiteFromKeyDoc(keyPair);
|
|
126
235
|
if (shouldSkipSigning) {
|
|
127
|
-
|
|
236
|
+
const result = vp.toJSON();
|
|
237
|
+
result.verifiableCredential.push(...jwtCredentials);
|
|
238
|
+
return result;
|
|
128
239
|
}
|
|
129
240
|
return vp.sign(suite, challenge, domain, services_blockchain_service.blockchainService.resolver);
|
|
130
241
|
}
|
|
242
|
+
/**
|
|
243
|
+
* Verifies a verifiable presentation
|
|
244
|
+
* @param {Object} params - Verification parameters
|
|
245
|
+
* @param {Object} params.presentation - The presentation to verify
|
|
246
|
+
* @param {Object} [params.options] - Verification options
|
|
247
|
+
* @returns {Promise<Object>} Verification result with verified status and any errors
|
|
248
|
+
* @example
|
|
249
|
+
* const result = await credentialService.verifyPresentation({
|
|
250
|
+
* presentation: presentationData
|
|
251
|
+
* });
|
|
252
|
+
* console.log('Verified:', result.verified);
|
|
253
|
+
*/
|
|
131
254
|
async verifyPresentation({ presentation, options }) {
|
|
132
255
|
return vc.verifyPresentation(presentation, options);
|
|
133
256
|
}
|
|
257
|
+
/**
|
|
258
|
+
* Verifies a verifiable credential including revocation check
|
|
259
|
+
* @param {Object} params - Verification parameters
|
|
260
|
+
* @param {Object} params.credential - The credential to verify
|
|
261
|
+
* @param {Object} [params.membershipWitness] - Membership witness for revocation check
|
|
262
|
+
* @returns {Promise<Object>} Verification result
|
|
263
|
+
* @returns {boolean} returns.verified - Whether the credential is valid
|
|
264
|
+
* @returns {string} [returns.error] - Error message if verification failed
|
|
265
|
+
* @throws {Error} If validation fails
|
|
266
|
+
* @example
|
|
267
|
+
* const result = await credentialService.verifyCredential({
|
|
268
|
+
* credential: credentialData,
|
|
269
|
+
* membershipWitness: witnessData
|
|
270
|
+
* });
|
|
271
|
+
* if (!result.verified) {
|
|
272
|
+
* console.error('Verification failed:', result.error);
|
|
273
|
+
* }
|
|
274
|
+
*/
|
|
134
275
|
async verifyCredential(params) {
|
|
135
276
|
services_credential_config.validation.verifyCredential(params);
|
|
136
|
-
|
|
277
|
+
let { credential, membershipWitness } = params;
|
|
278
|
+
if (credential._sd_jwt) {
|
|
279
|
+
credential = credential?._sd_jwt?.encoded;
|
|
280
|
+
}
|
|
281
|
+
if (typeof credential === 'string' && services_credential_sdJwt.isSDJWTCredential(credential)) {
|
|
282
|
+
return services_credential_sdJwt.verifySDJWT(credential);
|
|
283
|
+
}
|
|
137
284
|
const result = await vc.verifyCredential(credential, {
|
|
138
285
|
resolver: services_blockchain_service.blockchainService.resolver,
|
|
139
286
|
revocationApi: { dock: services_blockchain_service.blockchainService.dock },
|
|
@@ -154,24 +301,113 @@ class CredentialService {
|
|
|
154
301
|
}
|
|
155
302
|
return result;
|
|
156
303
|
}
|
|
304
|
+
/**
|
|
305
|
+
* Filters credentials based on a presentation definition
|
|
306
|
+
* @param {Object} params - Filter parameters
|
|
307
|
+
* @param {Array<Object>} params.credentials - Array of credentials to filter
|
|
308
|
+
* @param {Object} params.presentationDefinition - PEX presentation definition
|
|
309
|
+
* @param {string} [params.holderDid] - DID of the credential holder
|
|
310
|
+
* @returns {Object} Filtered credentials matching the presentation definition
|
|
311
|
+
* @example
|
|
312
|
+
* const filtered = credentialService.filterCredentials({
|
|
313
|
+
* credentials: allCredentials,
|
|
314
|
+
* presentationDefinition: definition,
|
|
315
|
+
* holderDid: 'did:example:holder'
|
|
316
|
+
* });
|
|
317
|
+
*/
|
|
157
318
|
filterCredentials(params) {
|
|
158
319
|
const { credentials, presentationDefinition, holderDid } = params;
|
|
159
320
|
const result = pex.selectFrom(presentationDefinition, credentials, holderDid);
|
|
160
321
|
return result;
|
|
161
322
|
}
|
|
323
|
+
/**
|
|
324
|
+
* Evaluates a presentation against a presentation definition
|
|
325
|
+
* @param {Object} params - Evaluation parameters
|
|
326
|
+
* @param {Object} params.presentation - The presentation to evaluate
|
|
327
|
+
* @param {Object} params.presentationDefinition - PEX presentation definition
|
|
328
|
+
* @returns {Object} Evaluation result with validation details
|
|
329
|
+
* @example
|
|
330
|
+
* const evaluation = credentialService.evaluatePresentation({
|
|
331
|
+
* presentation: presentationData,
|
|
332
|
+
* presentationDefinition: definition
|
|
333
|
+
* });
|
|
334
|
+
*/
|
|
162
335
|
evaluatePresentation(params) {
|
|
163
336
|
const { presentation, presentationDefinition } = params;
|
|
164
337
|
const result = pex.evaluatePresentation(presentationDefinition, presentation);
|
|
165
338
|
return result;
|
|
166
339
|
}
|
|
340
|
+
/**
|
|
341
|
+
* Checks if a credential uses BBS+ signature
|
|
342
|
+
* @param {Object} params - Check parameters
|
|
343
|
+
* @param {Object} params.credential - The credential to check
|
|
344
|
+
* @returns {boolean} True if the credential uses BBS+ signature
|
|
345
|
+
*/
|
|
167
346
|
isBBSPlusCredential(params) {
|
|
168
347
|
const { credential } = params;
|
|
169
348
|
return isBBSPlusCredential(credential);
|
|
170
349
|
}
|
|
350
|
+
/**
|
|
351
|
+
* Checks if a credential uses KVAC signature
|
|
352
|
+
* @param {Object} params - Check parameters
|
|
353
|
+
* @param {Object} params.credential - The credential to check
|
|
354
|
+
* @returns {boolean} True if the credential uses KVAC signature
|
|
355
|
+
*/
|
|
171
356
|
isKvacCredential(params) {
|
|
172
357
|
const { credential } = params;
|
|
173
358
|
return isKvacCredential(credential);
|
|
174
359
|
}
|
|
360
|
+
/**
|
|
361
|
+
* Checks if a credential is an SD-JWT (Selective Disclosure JWT) credential
|
|
362
|
+
* @param {Object} params - Check parameters
|
|
363
|
+
* @param {string} params.credential - The JWT string to check
|
|
364
|
+
* @returns {boolean} True if the credential is an SD-JWT credential
|
|
365
|
+
* @example
|
|
366
|
+
* const isSDJWT = credentialService.isSDJWTCredential({
|
|
367
|
+
* credential: 'eyJ0eXAiOiJ2YytzZC1qd3Q...'
|
|
368
|
+
* });
|
|
369
|
+
*/
|
|
370
|
+
isSDJWTCredential(params) {
|
|
371
|
+
const { credential } = params;
|
|
372
|
+
return services_credential_sdJwt.isSDJWTCredential(credential);
|
|
373
|
+
}
|
|
374
|
+
/**
|
|
375
|
+
* Converts a credential to W3C Verifiable Credential format
|
|
376
|
+
* @description Handles both SD-JWT credentials (needs decoding) and regular W3C credentials (returns as-is)
|
|
377
|
+
* @param {Object} params - Conversion parameters
|
|
378
|
+
* @param {string|Object} params.credential - Either an SD-JWT string or a credential object
|
|
379
|
+
* @returns {Promise<Object>} W3C Verifiable Credential format
|
|
380
|
+
* @throws {Error} If credential cannot be converted to W3C format
|
|
381
|
+
* @example
|
|
382
|
+
* // Convert SD-JWT to W3C format
|
|
383
|
+
* const w3cCredential = await credentialService.credentialToW3C({
|
|
384
|
+
* credential: 'eyJ0eXAiOiJ2YytzZC1qd3Q...'
|
|
385
|
+
* });
|
|
386
|
+
*
|
|
387
|
+
* // Returns W3C credential as-is
|
|
388
|
+
* const w3cCredential = await credentialService.credentialToW3C({
|
|
389
|
+
* credential: { '@context': [...], type: [...], ... }
|
|
390
|
+
* });
|
|
391
|
+
*/
|
|
392
|
+
async credentialToW3C(params) {
|
|
393
|
+
const { credential } = params;
|
|
394
|
+
return services_credential_sdJwt.credentialToW3C(credential);
|
|
395
|
+
}
|
|
396
|
+
/**
|
|
397
|
+
* Acquires a credential through OpenID for Verifiable Credentials (OID4VC)
|
|
398
|
+
* @param {Object} params - Acquisition parameters
|
|
399
|
+
* @param {string} params.uri - The credential offer URI
|
|
400
|
+
* @param {string} [params.authorizationCode] - Authorization code if required
|
|
401
|
+
* @param {Object} params.holderKeyDocument - Key document for the credential holder
|
|
402
|
+
* @returns {Promise<Object>} Result containing the credential or authorization URL
|
|
403
|
+
* @returns {Object} [returns.credential] - The acquired credential
|
|
404
|
+
* @returns {string} [returns.authorizationURL] - Authorization URL if auth is required
|
|
405
|
+
* @example
|
|
406
|
+
* const result = await credentialService.acquireOIDCredential({
|
|
407
|
+
* uri: 'openid-credential-offer://...',
|
|
408
|
+
* holderKeyDocument: keyDoc
|
|
409
|
+
* });
|
|
410
|
+
*/
|
|
175
411
|
async acquireOIDCredential({ uri, authorizationCode, holderKeyDocument, }) {
|
|
176
412
|
const searchParams = new URL(uri).searchParams;
|
|
177
413
|
new URLSearchParams(searchParams);
|
|
@@ -181,6 +417,8 @@ class CredentialService {
|
|
|
181
417
|
authorizationRequest: {
|
|
182
418
|
redirectUri: 'dock-wallet://credentials/callback',
|
|
183
419
|
clientId: 'dock.wallet',
|
|
420
|
+
// Hack: we need the scope property to avoid 'CredentialOffer format is wrong.' error
|
|
421
|
+
scope: []
|
|
184
422
|
},
|
|
185
423
|
});
|
|
186
424
|
const format = 'ldp_vc';
|
|
@@ -231,6 +469,22 @@ class CredentialService {
|
|
|
231
469
|
console.error(err);
|
|
232
470
|
}
|
|
233
471
|
}
|
|
472
|
+
/**
|
|
473
|
+
* Creates a BBS+ presentation with selective disclosure
|
|
474
|
+
* @param {Object} params - Presentation parameters
|
|
475
|
+
* @param {Array<Object>} params.credentials - Array of credentials with attributes to reveal
|
|
476
|
+
* @param {Object} params.credentials[].credential - The BBS+ credential
|
|
477
|
+
* @param {Array<string>} [params.credentials[].attributesToReveal] - Attributes to reveal
|
|
478
|
+
* @returns {Promise<Object>} The BBS+ presentation
|
|
479
|
+
* @throws {Error} If validation fails
|
|
480
|
+
* @example
|
|
481
|
+
* const presentation = await credentialService.createBBSPresentation({
|
|
482
|
+
* credentials: [{
|
|
483
|
+
* credential: bbsCredential,
|
|
484
|
+
* attributesToReveal: ['name', 'age']
|
|
485
|
+
* }]
|
|
486
|
+
* });
|
|
487
|
+
*/
|
|
234
488
|
async createBBSPresentation(params) {
|
|
235
489
|
services_credential_config.validation.createBBSPresentation(params);
|
|
236
490
|
const { credentials } = params;
|
|
@@ -245,6 +499,13 @@ class CredentialService {
|
|
|
245
499
|
}
|
|
246
500
|
return bbsPlusPresentation.createPresentation();
|
|
247
501
|
}
|
|
502
|
+
/**
|
|
503
|
+
* Gets the accumulator ID from a credential's status
|
|
504
|
+
* @param {Object} params - Parameters
|
|
505
|
+
* @param {Object} params.credential - The credential to get accumulator ID from
|
|
506
|
+
* @returns {string|null} The accumulator ID or null if not present
|
|
507
|
+
* @throws {Error} If credential is not provided
|
|
508
|
+
*/
|
|
248
509
|
getAccumulatorId({ credential }) {
|
|
249
510
|
assert__default["default"](!!credential, `credential is required`);
|
|
250
511
|
if (!credential?.credentialStatus) {
|
|
@@ -252,6 +513,13 @@ class CredentialService {
|
|
|
252
513
|
}
|
|
253
514
|
return credential?.credentialStatus.id;
|
|
254
515
|
}
|
|
516
|
+
/**
|
|
517
|
+
* Gets accumulator data from the blockchain for a credential
|
|
518
|
+
* @param {Object} params - Parameters
|
|
519
|
+
* @param {Object} params.credential - The credential to get accumulator data for
|
|
520
|
+
* @returns {Promise<Object|null>} The accumulator data or null if not found
|
|
521
|
+
* @throws {Error} If credential is not provided
|
|
522
|
+
*/
|
|
255
523
|
async getAccumulatorData({ credential }) {
|
|
256
524
|
assert__default["default"](!!credential, `credential is required`);
|
|
257
525
|
const accumulatorId = await this.getAccumulatorId({ credential });
|
|
@@ -261,10 +529,15 @@ class CredentialService {
|
|
|
261
529
|
return services_blockchain_service.blockchainService.dock.accumulatorModule.getAccumulator(accumulatorId, false);
|
|
262
530
|
}
|
|
263
531
|
/**
|
|
264
|
-
*
|
|
265
|
-
* The witness is generated by the issuer when the credential is created
|
|
266
|
-
*
|
|
267
|
-
*
|
|
532
|
+
* Updates the membership witness with the latest accumulator state
|
|
533
|
+
* @description The witness is generated by the issuer when the credential is created
|
|
534
|
+
* and is stored in the wallet when the credential is imported. This method updates
|
|
535
|
+
* it with the latest accumulator changes from the blockchain.
|
|
536
|
+
* @param {Object} params - Update parameters
|
|
537
|
+
* @param {Object} params.credential - The credential with revocation status
|
|
538
|
+
* @param {Object} params.membershipWitnessJSON - Current membership witness in JSON format
|
|
539
|
+
* @returns {Promise<Object>} Updated membership witness in JSON format
|
|
540
|
+
* @throws {Error} If updates cannot be fetched or applied
|
|
268
541
|
*/
|
|
269
542
|
async updateMembershipWitness({ credential, membershipWitnessJSON }) {
|
|
270
543
|
const revocationId = credential.credentialStatus.revocationId;
|
|
@@ -301,6 +574,25 @@ class CredentialService {
|
|
|
301
574
|
witness.updateUsingPublicInfoPostBatchUpdate(member, additions, removals, queriedWitnessInfo);
|
|
302
575
|
return witness.toJSON();
|
|
303
576
|
}
|
|
577
|
+
/**
|
|
578
|
+
* Derives verifiable credentials from a presentation with selective disclosure
|
|
579
|
+
* @param {Object} params - Derivation parameters
|
|
580
|
+
* @param {Array<Object>} params.credentials - Array of credential objects
|
|
581
|
+
* @param {Object} params.credentials[].credential - The credential
|
|
582
|
+
* @param {Array<string>} params.credentials[].attributesToReveal - Attributes to reveal
|
|
583
|
+
* @param {Object} [params.credentials[].witness] - Membership witness for revocation
|
|
584
|
+
* @param {Object} [params.options={}] - Additional options for derivation
|
|
585
|
+
* @param {Object} [params.proofRequest] - Proof request with constraints
|
|
586
|
+
* @returns {Promise<Array>} Array of derived credentials
|
|
587
|
+
* @throws {Error} If validation fails
|
|
588
|
+
* @example
|
|
589
|
+
* const derivedCredentials = await credentialService.deriveVCFromPresentation({
|
|
590
|
+
* credentials: [{
|
|
591
|
+
* credential: bbsCredential,
|
|
592
|
+
* attributesToReveal: ['name', 'dateOfBirth']
|
|
593
|
+
* }]
|
|
594
|
+
* });
|
|
595
|
+
*/
|
|
304
596
|
async deriveVCFromPresentation(params) {
|
|
305
597
|
services_credential_config.validation.deriveVCFromPresentation(params);
|
|
306
598
|
const { credentials, options = {}, proofRequest } = params;
|
|
@@ -354,10 +646,35 @@ class CredentialService {
|
|
|
354
646
|
const credentialsFromPresentation = await presentation.deriveCredentials(options);
|
|
355
647
|
return credentialsFromPresentation;
|
|
356
648
|
}
|
|
649
|
+
/**
|
|
650
|
+
* Test method for range proofs
|
|
651
|
+
* @private
|
|
652
|
+
* @returns {Promise<void>}
|
|
653
|
+
*/
|
|
357
654
|
async testRangeProof() {
|
|
358
655
|
console.log('test');
|
|
359
656
|
}
|
|
360
657
|
}
|
|
658
|
+
/**
|
|
659
|
+
* Singleton instance of the credential service
|
|
660
|
+
* @type {CredentialService}
|
|
661
|
+
* @example
|
|
662
|
+
* import { credentialService } from '@docknetwork/wallet-sdk-wasm/services/credential';
|
|
663
|
+
*
|
|
664
|
+
* // Create and sign a credential
|
|
665
|
+
* const credential = credentialService.generateCredential({
|
|
666
|
+
* subject: { id: 'did:example:123' }
|
|
667
|
+
* });
|
|
668
|
+
* const signed = await credentialService.signCredential({
|
|
669
|
+
* vcJson: credential,
|
|
670
|
+
* keyDoc: issuerKey
|
|
671
|
+
* });
|
|
672
|
+
*
|
|
673
|
+
* // Verify a credential
|
|
674
|
+
* const result = await credentialService.verifyCredential({
|
|
675
|
+
* credential: signedCredential
|
|
676
|
+
* });
|
|
677
|
+
*/
|
|
361
678
|
const credentialService = new CredentialService();
|
|
362
679
|
|
|
363
680
|
exports.credentialService = credentialService;
|