@docknetwork/wallet-sdk-wasm 1.7.7-alpha.0 → 1.9.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/package.json +7 -20
- package/rollup.config.mjs +1 -0
- package/src/globals.d.ts +4 -1
- package/src/services/blockchain/cached-did-resolver.ts +4 -3
- package/src/services/blockchain/normalize-did-document.ts +73 -0
- package/src/services/blockchain/service.ts +0 -2
- package/src/services/credential/bbs-revocation.test.js +147 -0
- package/src/services/credential/bbs-revocation.ts +65 -18
- package/src/services/credential/config.ts +7 -0
- package/src/services/credential/index.test.js +261 -17
- package/src/services/credential/oid4vci.js +44 -0
- package/src/services/credential/oid4vci.test.js +162 -0
- package/src/services/credential/pex-helpers.js +77 -31
- package/src/services/credential/pex-helpers.test.js +4 -4
- package/src/services/credential/sd-jwt.ts +41 -5
- package/src/services/credential/service-rpc.js +6 -0
- package/src/services/credential/service.ts +171 -16
- package/src/services/credential/utils.js +3 -5
- package/src/services/delegation/index.android.js +3 -0
- package/src/services/delegation/index.ios.js +3 -0
- package/src/services/delegation/index.ts +1 -0
- package/src/services/delegation/service-rpc.ts +21 -0
- package/src/services/delegation/service.ts +59 -0
- package/src/services/edv/service-rpc.js +18 -2
- package/src/services/edv/service.test.js +327 -0
- package/src/services/edv/service.ts +103 -13
- package/src/services/index.js +2 -0
- package/src/wallet/rpc-storage-interface.js +9 -4
- package/lib/core/crypto.js +0 -45
- package/lib/core/crypto.mjs +0 -33
- package/lib/core/format-utils.js +0 -51
- package/lib/core/format-utils.mjs +0 -42
- package/lib/core/keychain.js +0 -61
- package/lib/core/keychain.mjs +0 -37
- package/lib/core/logger.js +0 -13
- package/lib/core/logger.mjs +0 -9
- package/lib/core/storage.js +0 -14
- package/lib/core/storage.mjs +0 -9
- package/lib/core/validation.js +0 -29
- package/lib/core/validation.mjs +0 -16
- package/lib/core/webview-logger.js +0 -49
- package/lib/core/webview-logger.mjs +0 -41
- package/lib/errors.js +0 -17
- package/lib/errors.mjs +0 -12
- package/lib/events.js +0 -18
- package/lib/events.mjs +0 -13
- package/lib/index.js +0 -146
- package/lib/index.mjs +0 -144
- package/lib/logger.js +0 -22
- package/lib/logger.mjs +0 -17
- package/lib/modules/event-manager.js +0 -46
- package/lib/modules/event-manager.mjs +0 -37
- package/lib/modules/network-manager.js +0 -80
- package/lib/modules/network-manager.mjs +0 -71
- package/lib/mrklt.js +0 -2
- package/lib/mrklt.mjs +0 -1
- package/lib/rpc-client.js +0 -83
- package/lib/rpc-client.mjs +0 -73
- package/lib/rpc-server.js +0 -97
- package/lib/rpc-server.mjs +0 -95
- package/lib/rpc-util.js +0 -113
- package/lib/rpc-util.mjs +0 -103
- package/lib/sandbox-rpc-server.js +0 -28
- package/lib/sandbox-rpc-server.mjs +0 -26
- package/lib/sandbox.js +0 -102
- package/lib/sandbox.mjs +0 -100
- package/lib/services/blockchain/cached-did-resolver.js +0 -113
- package/lib/services/blockchain/cached-did-resolver.mjs +0 -109
- package/lib/services/blockchain/configs.js +0 -7
- package/lib/services/blockchain/configs.mjs +0 -3
- package/lib/services/blockchain/index.android.js +0 -18
- package/lib/services/blockchain/index.android.mjs +0 -14
- package/lib/services/blockchain/index.ios.js +0 -18
- package/lib/services/blockchain/index.ios.mjs +0 -14
- package/lib/services/blockchain/index.js +0 -36
- package/lib/services/blockchain/index.mjs +0 -28
- package/lib/services/blockchain/service-rpc.js +0 -72
- package/lib/services/blockchain/service-rpc.mjs +0 -68
- package/lib/services/blockchain/service.js +0 -312
- package/lib/services/blockchain/service.mjs +0 -306
- package/lib/services/credential/bbs-revocation.js +0 -92
- package/lib/services/credential/bbs-revocation.mjs +0 -87
- package/lib/services/credential/bound-check.js +0 -77
- package/lib/services/credential/bound-check.mjs +0 -64
- package/lib/services/credential/config.js +0 -56
- package/lib/services/credential/config.mjs +0 -47
- package/lib/services/credential/delegatable-credentials.js +0 -300
- package/lib/services/credential/delegatable-credentials.mjs +0 -263
- package/lib/services/credential/index.android.js +0 -19
- package/lib/services/credential/index.android.mjs +0 -15
- package/lib/services/credential/index.ios.js +0 -19
- package/lib/services/credential/index.ios.mjs +0 -15
- package/lib/services/credential/index.js +0 -106
- package/lib/services/credential/index.mjs +0 -67
- package/lib/services/credential/pex-helpers.js +0 -333
- package/lib/services/credential/pex-helpers.mjs +0 -319
- package/lib/services/credential/range-proofs-example.js +0 -107
- package/lib/services/credential/range-proofs-example.mjs +0 -103
- package/lib/services/credential/sd-jwt.js +0 -214
- package/lib/services/credential/sd-jwt.mjs +0 -200
- package/lib/services/credential/service-rpc.js +0 -61
- package/lib/services/credential/service-rpc.mjs +0 -57
- package/lib/services/credential/service.js +0 -683
- package/lib/services/credential/service.mjs +0 -672
- package/lib/services/credential/utils.js +0 -103
- package/lib/services/credential/utils.mjs +0 -78
- package/lib/services/dids/config.js +0 -40
- package/lib/services/dids/config.mjs +0 -31
- package/lib/services/dids/index.android.js +0 -19
- package/lib/services/dids/index.android.mjs +0 -15
- package/lib/services/dids/index.ios.js +0 -19
- package/lib/services/dids/index.ios.mjs +0 -15
- package/lib/services/dids/index.js +0 -23
- package/lib/services/dids/index.mjs +0 -19
- package/lib/services/dids/keypair-utils.js +0 -142
- package/lib/services/dids/keypair-utils.mjs +0 -113
- package/lib/services/dids/service-rpc.js +0 -37
- package/lib/services/dids/service-rpc.mjs +0 -33
- package/lib/services/dids/service.js +0 -100
- package/lib/services/dids/service.mjs +0 -92
- package/lib/services/edv/configs.js +0 -25
- package/lib/services/edv/configs.mjs +0 -16
- package/lib/services/edv/hmac.js +0 -88
- package/lib/services/edv/hmac.mjs +0 -63
- package/lib/services/edv/index.android.js +0 -19
- package/lib/services/edv/index.android.mjs +0 -15
- package/lib/services/edv/index.ios.js +0 -19
- package/lib/services/edv/index.ios.mjs +0 -15
- package/lib/services/edv/index.js +0 -32
- package/lib/services/edv/index.mjs +0 -24
- package/lib/services/edv/service-rpc.js +0 -78
- package/lib/services/edv/service-rpc.mjs +0 -74
- package/lib/services/edv/service.js +0 -370
- package/lib/services/edv/service.mjs +0 -357
- package/lib/services/index.js +0 -94
- package/lib/services/index.mjs +0 -92
- package/lib/services/pex/config.js +0 -29
- package/lib/services/pex/config.mjs +0 -20
- package/lib/services/pex/index.android.js +0 -19
- package/lib/services/pex/index.android.mjs +0 -15
- package/lib/services/pex/index.ios.js +0 -19
- package/lib/services/pex/index.ios.mjs +0 -15
- package/lib/services/pex/index.js +0 -12
- package/lib/services/pex/index.mjs +0 -4
- package/lib/services/pex/service-rpc.js +0 -39
- package/lib/services/pex/service-rpc.mjs +0 -35
- package/lib/services/pex/service.js +0 -91
- package/lib/services/pex/service.mjs +0 -86
- package/lib/services/pex/tests/jest.config.js +0 -25
- package/lib/services/pex/tests/jest.config.mjs +0 -23
- package/lib/services/relay-service/configs.js +0 -45
- package/lib/services/relay-service/configs.mjs +0 -36
- package/lib/services/relay-service/index.android.js +0 -21
- package/lib/services/relay-service/index.android.mjs +0 -17
- package/lib/services/relay-service/index.ios.js +0 -21
- package/lib/services/relay-service/index.ios.mjs +0 -17
- package/lib/services/relay-service/index.js +0 -14
- package/lib/services/relay-service/index.mjs +0 -6
- package/lib/services/relay-service/service-rpc.js +0 -47
- package/lib/services/relay-service/service-rpc.mjs +0 -43
- package/lib/services/relay-service/service.js +0 -181
- package/lib/services/relay-service/service.mjs +0 -173
- package/lib/services/rpc-service-client.js +0 -36
- package/lib/services/rpc-service-client.mjs +0 -28
- package/lib/services/sandbox.js +0 -10
- package/lib/services/sandbox.mjs +0 -8
- package/lib/services/storage/configs.js +0 -7
- package/lib/services/storage/configs.mjs +0 -3
- package/lib/services/storage/index.android.js +0 -18
- package/lib/services/storage/index.android.mjs +0 -14
- package/lib/services/storage/index.ios.js +0 -18
- package/lib/services/storage/index.ios.mjs +0 -14
- package/lib/services/storage/index.js +0 -26
- package/lib/services/storage/index.mjs +0 -24
- package/lib/services/storage/service-rpc.js +0 -37
- package/lib/services/storage/service-rpc.mjs +0 -33
- package/lib/services/storage/service.js +0 -32
- package/lib/services/storage/service.mjs +0 -27
- package/lib/services/test-utils.js +0 -98
- package/lib/services/test-utils.mjs +0 -84
- package/lib/services/util-crypto/configs.js +0 -23
- package/lib/services/util-crypto/configs.mjs +0 -15
- package/lib/services/util-crypto/index.android.js +0 -19
- package/lib/services/util-crypto/index.android.mjs +0 -15
- package/lib/services/util-crypto/index.ios.js +0 -19
- package/lib/services/util-crypto/index.ios.mjs +0 -15
- package/lib/services/util-crypto/index.js +0 -14
- package/lib/services/util-crypto/index.mjs +0 -6
- package/lib/services/util-crypto/service-rpc.js +0 -42
- package/lib/services/util-crypto/service-rpc.mjs +0 -38
- package/lib/services/util-crypto/service.js +0 -108
- package/lib/services/util-crypto/service.mjs +0 -83
- package/lib/services/wallet/configs.js +0 -32
- package/lib/services/wallet/configs.mjs +0 -23
- package/lib/services/wallet/index.android.js +0 -21
- package/lib/services/wallet/index.android.mjs +0 -17
- package/lib/services/wallet/index.ios.js +0 -21
- package/lib/services/wallet/index.ios.mjs +0 -17
- package/lib/services/wallet/index.js +0 -17
- package/lib/services/wallet/index.mjs +0 -9
- package/lib/services/wallet/service-rpc.js +0 -33
- package/lib/services/wallet/service-rpc.mjs +0 -29
- package/lib/services/wallet/service.js +0 -62
- package/lib/services/wallet/service.mjs +0 -57
- package/lib/setup-nodejs.js +0 -93
- package/lib/setup-nodejs.mjs +0 -91
- package/lib/setup-tests.js +0 -92
- package/lib/setup-tests.mjs +0 -90
- package/lib/src/core/crypto.d.ts +0 -8
- package/lib/src/core/crypto.d.ts.map +0 -1
- package/lib/src/core/format-utils.d.ts +0 -26
- package/lib/src/core/format-utils.d.ts.map +0 -1
- package/lib/src/core/logger.d.ts +0 -3
- package/lib/src/core/logger.d.ts.map +0 -1
- package/lib/src/core/storage.d.ts +0 -8
- package/lib/src/core/storage.d.ts.map +0 -1
- package/lib/src/core/validation.d.ts +0 -6
- package/lib/src/core/validation.d.ts.map +0 -1
- package/lib/src/errors.d.ts +0 -7
- package/lib/src/errors.d.ts.map +0 -1
- package/lib/src/logger.d.ts +0 -5
- package/lib/src/logger.d.ts.map +0 -1
- package/lib/src/modules/event-manager.d.ts +0 -12
- package/lib/src/modules/event-manager.d.ts.map +0 -1
- package/lib/src/modules/network-manager.d.ts +0 -32
- package/lib/src/modules/network-manager.d.ts.map +0 -1
- package/lib/src/rpc-client.d.ts +0 -4
- package/lib/src/rpc-client.d.ts.map +0 -1
- package/lib/src/rpc-util.d.ts +0 -11
- package/lib/src/rpc-util.d.ts.map +0 -1
- package/lib/src/services/blockchain/cached-did-resolver.d.ts +0 -28
- package/lib/src/services/blockchain/cached-did-resolver.d.ts.map +0 -1
- package/lib/src/services/blockchain/cached-did-resolver.test.d.ts +0 -2
- package/lib/src/services/blockchain/cached-did-resolver.test.d.ts.map +0 -1
- package/lib/src/services/blockchain/configs.d.ts +0 -7
- package/lib/src/services/blockchain/configs.d.ts.map +0 -1
- package/lib/src/services/blockchain/service.d.ts +0 -155
- package/lib/src/services/blockchain/service.d.ts.map +0 -1
- package/lib/src/services/credential/bbs-revocation.d.ts +0 -10
- package/lib/src/services/credential/bbs-revocation.d.ts.map +0 -1
- package/lib/src/services/credential/bound-check.d.ts +0 -61
- package/lib/src/services/credential/bound-check.d.ts.map +0 -1
- package/lib/src/services/credential/bound-check.test.d.ts +0 -2
- package/lib/src/services/credential/bound-check.test.d.ts.map +0 -1
- package/lib/src/services/credential/config.d.ts +0 -10
- package/lib/src/services/credential/config.d.ts.map +0 -1
- package/lib/src/services/credential/delegatable-credentials.d.ts +0 -272
- package/lib/src/services/credential/delegatable-credentials.d.ts.map +0 -1
- package/lib/src/services/credential/index.d.ts +0 -35
- package/lib/src/services/credential/index.d.ts.map +0 -1
- package/lib/src/services/credential/pex-helpers.d.ts +0 -23
- package/lib/src/services/credential/pex-helpers.d.ts.map +0 -1
- package/lib/src/services/credential/range-proofs-example.d.ts +0 -2
- package/lib/src/services/credential/range-proofs-example.d.ts.map +0 -1
- package/lib/src/services/credential/sd-jwt.test.d.ts +0 -2
- package/lib/src/services/credential/sd-jwt.test.d.ts.map +0 -1
- package/lib/src/services/credential/service.d.ts +0 -313
- package/lib/src/services/credential/service.d.ts.map +0 -1
- package/lib/src/services/credential/utils.d.ts +0 -3
- package/lib/src/services/credential/utils.d.ts.map +0 -1
- package/lib/src/services/dids/config.d.ts +0 -24
- package/lib/src/services/dids/config.d.ts.map +0 -1
- package/lib/src/services/dids/keypair-utils.d.ts +0 -15
- package/lib/src/services/dids/keypair-utils.d.ts.map +0 -1
- package/lib/src/services/dids/service-rpc.d.ts +0 -11
- package/lib/src/services/dids/service-rpc.d.ts.map +0 -1
- package/lib/src/services/dids/service.d.ts +0 -70
- package/lib/src/services/dids/service.d.ts.map +0 -1
- package/lib/src/services/edv/configs.d.ts +0 -12
- package/lib/src/services/edv/configs.d.ts.map +0 -1
- package/lib/src/services/edv/hmac.d.ts +0 -29
- package/lib/src/services/edv/hmac.d.ts.map +0 -1
- package/lib/src/services/edv/service.d.ts +0 -229
- package/lib/src/services/edv/service.d.ts.map +0 -1
- package/lib/src/services/pex/config.d.ts +0 -21
- package/lib/src/services/pex/config.d.ts.map +0 -1
- package/lib/src/services/pex/service.d.ts +0 -21
- package/lib/src/services/pex/service.d.ts.map +0 -1
- package/lib/src/services/relay-service/configs.d.ts +0 -35
- package/lib/src/services/relay-service/configs.d.ts.map +0 -1
- package/lib/src/services/relay-service/service-rpc.d.ts +0 -12
- package/lib/src/services/relay-service/service-rpc.d.ts.map +0 -1
- package/lib/src/services/relay-service/service.d.ts +0 -159
- package/lib/src/services/relay-service/service.d.ts.map +0 -1
- package/lib/src/services/rpc-service-client.d.ts +0 -7
- package/lib/src/services/rpc-service-client.d.ts.map +0 -1
- package/lib/src/services/storage/configs.d.ts +0 -2
- package/lib/src/services/storage/configs.d.ts.map +0 -1
- package/lib/src/services/storage/index.d.ts +0 -2
- package/lib/src/services/storage/index.d.ts.map +0 -1
- package/lib/src/services/storage/service-rpc.d.ts +0 -9
- package/lib/src/services/storage/service-rpc.d.ts.map +0 -1
- package/lib/src/services/storage/service.d.ts +0 -10
- package/lib/src/services/storage/service.d.ts.map +0 -1
- package/lib/src/services/util-crypto/configs.d.ts +0 -5
- package/lib/src/services/util-crypto/configs.d.ts.map +0 -1
- package/lib/src/services/util-crypto/index.d.ts +0 -2
- package/lib/src/services/util-crypto/index.d.ts.map +0 -1
- package/lib/src/services/util-crypto/service.d.ts +0 -10
- package/lib/src/services/util-crypto/service.d.ts.map +0 -1
- package/lib/src/services/wallet/configs.d.ts +0 -13
- package/lib/src/services/wallet/configs.d.ts.map +0 -1
- package/lib/src/services/wallet/service.d.ts +0 -13
- package/lib/src/services/wallet/service.d.ts.map +0 -1
- package/lib/src/types.d.ts +0 -12
- package/lib/src/types.d.ts.map +0 -1
- package/lib/src/wallet/memory-storage-interface.d.ts +0 -31
- package/lib/src/wallet/memory-storage-interface.d.ts.map +0 -1
- package/lib/src/wallet/memory-storage-wallet.d.ts +0 -6
- package/lib/src/wallet/memory-storage-wallet.d.ts.map +0 -1
- package/lib/src/wallet/rpc-storage-interface.d.ts +0 -32
- package/lib/src/wallet/rpc-storage-interface.d.ts.map +0 -1
- package/lib/src/wallet/rpc-storage-wallet.d.ts +0 -6
- package/lib/src/wallet/rpc-storage-wallet.d.ts.map +0 -1
- package/lib/test-utils.js +0 -46
- package/lib/test-utils.mjs +0 -38
- package/lib/tsconfig.tsbuildinfo +0 -1
- package/lib/types.js +0 -7
- package/lib/types.mjs +0 -3
- package/lib/wallet/memory-storage-interface.js +0 -101
- package/lib/wallet/memory-storage-interface.mjs +0 -95
- package/lib/wallet/memory-storage-wallet.js +0 -30
- package/lib/wallet/memory-storage-wallet.mjs +0 -24
- package/lib/wallet/rpc-storage-interface.js +0 -134
- package/lib/wallet/rpc-storage-interface.mjs +0 -128
- package/lib/wallet/rpc-storage-wallet.js +0 -46
- package/lib/wallet/rpc-storage-wallet.mjs +0 -40
|
@@ -1,672 +0,0 @@
|
|
|
1
|
-
import { serviceName, validation } from './config.mjs';
|
|
2
|
-
import { Accumulator, WitnessUpdatePublicInfo, MembershipWitness, VB_ACCUMULATOR_22 } from '@docknetwork/crypto-wasm-ts';
|
|
3
|
-
import { OpenID4VCIClientV1_0_13 } from '@sphereon/oid4vci-client';
|
|
4
|
-
import { Alg } from '@sphereon/oid4vci-common';
|
|
5
|
-
import { getKeypairFromDoc } from '@docknetwork/universal-wallet/methods/keypairs';
|
|
6
|
-
import { hexToU8a } from '@docknetwork/credential-sdk/utils';
|
|
7
|
-
import { VerifiableCredential, getSuiteFromKeyDoc, VerifiablePresentation, verifyPresentation, verifyCredential, Presentation } from '@docknetwork/credential-sdk/vc';
|
|
8
|
-
import { PEX } from '@sphereon/pex';
|
|
9
|
-
import { blockchainService } from '../blockchain/service.mjs';
|
|
10
|
-
import { hasProvingKey, fetchProvingKey, applyEnforceBounds } from './bound-check.mjs';
|
|
11
|
-
import assert from 'assert';
|
|
12
|
-
import { getIsRevoked, getWitnessDetails } from './bbs-revocation.mjs';
|
|
13
|
-
import { getPexRequiredAttributes, shouldSkipAttribute } from './pex-helpers.mjs';
|
|
14
|
-
import { didService } from '../dids/service.mjs';
|
|
15
|
-
import { createSDJWTPresentation, isSDJWTCredential, verifySDJWT, credentialToW3C } from './sd-jwt.mjs';
|
|
16
|
-
import '@cosmjs/proto-signing';
|
|
17
|
-
import '@docknetwork/cheqd-blockchain-api';
|
|
18
|
-
import '@docknetwork/cheqd-blockchain-modules';
|
|
19
|
-
import '@docknetwork/credential-sdk/modules';
|
|
20
|
-
import '@docknetwork/credential-sdk/resolver';
|
|
21
|
-
import '@docknetwork/crypto-wasm-ts/lib/index';
|
|
22
|
-
import 'events';
|
|
23
|
-
import '../../core/logger.mjs';
|
|
24
|
-
import '../../modules/event-manager.mjs';
|
|
25
|
-
import '../util-crypto/service.mjs';
|
|
26
|
-
import '@scure/bip39';
|
|
27
|
-
import '@scure/bip39/wordlists/english';
|
|
28
|
-
import '../util-crypto/configs.mjs';
|
|
29
|
-
import '@docknetwork/credential-sdk/types';
|
|
30
|
-
import '../blockchain/cached-did-resolver.mjs';
|
|
31
|
-
import '../storage/index.mjs';
|
|
32
|
-
import '../storage/service.mjs';
|
|
33
|
-
import '../storage/service-rpc.mjs';
|
|
34
|
-
import '../rpc-service-client.mjs';
|
|
35
|
-
import '../../rpc-client.mjs';
|
|
36
|
-
import 'json-rpc-2.0';
|
|
37
|
-
import '../../core/crypto.mjs';
|
|
38
|
-
import 'crypto';
|
|
39
|
-
import '../../logger.mjs';
|
|
40
|
-
import '../../rpc-util.mjs';
|
|
41
|
-
import '@docknetwork/crypto-wasm-ts/lib/legosnark';
|
|
42
|
-
import 'base64url';
|
|
43
|
-
import '@astronautlabs/jsonpath';
|
|
44
|
-
import '@docknetwork/wallet-sdk-dids/lib';
|
|
45
|
-
import '../dids/config.mjs';
|
|
46
|
-
import '@docknetwork/credential-sdk/keypairs';
|
|
47
|
-
import './utils.mjs';
|
|
48
|
-
import 'base58-universal';
|
|
49
|
-
import '@docknetwork/credential-sdk/vc/crypto';
|
|
50
|
-
import '@digitalbazaar/x25519-key-agreement-key-2020';
|
|
51
|
-
import '@digitalbazaar/x25519-key-agreement-key-2019';
|
|
52
|
-
import '@digitalbazaar/ed25519-verification-key-2018';
|
|
53
|
-
import '@digitalbazaar/ed25519-verification-key-2020';
|
|
54
|
-
import '../dids/keypair-utils.mjs';
|
|
55
|
-
import '@sd-jwt/sd-jwt-vc';
|
|
56
|
-
import '@sd-jwt/crypto-nodejs';
|
|
57
|
-
|
|
58
|
-
// @ts-nocheck
|
|
59
|
-
/**
|
|
60
|
-
* PEX (Presentation Exchange) instance for credential filtering
|
|
61
|
-
* @private
|
|
62
|
-
*/
|
|
63
|
-
const pex = new PEX();
|
|
64
|
-
/**
|
|
65
|
-
* Checks if a credential uses BBS+ signature
|
|
66
|
-
* @param {Object} credential - The credential to check
|
|
67
|
-
* @returns {boolean} True if the credential uses BBS+ signature
|
|
68
|
-
* @example
|
|
69
|
-
* const isBBS = isBBSPlusCredential(credential);
|
|
70
|
-
* if (isBBS) {
|
|
71
|
-
* console.log('This credential uses BBS+ signatures');
|
|
72
|
-
* }
|
|
73
|
-
*/
|
|
74
|
-
function isBBSPlusCredential(credential) {
|
|
75
|
-
return ((typeof credential?.proof?.type === 'string' &&
|
|
76
|
-
credential.proof.type.includes('BBS+SignatureDock')) ||
|
|
77
|
-
(Array.isArray(credential['@context']) &&
|
|
78
|
-
credential['@context'].find(context => typeof context === 'string' && context.indexOf('bbs') > -1)));
|
|
79
|
-
}
|
|
80
|
-
/**
|
|
81
|
-
* Checks if a credential uses KVAC (BBDT16) signature
|
|
82
|
-
* @param {Object} credential - The credential to check
|
|
83
|
-
* @returns {boolean} True if the credential uses KVAC signature
|
|
84
|
-
* @example
|
|
85
|
-
* const isKVAC = isKvacCredential(credential);
|
|
86
|
-
*/
|
|
87
|
-
function isKvacCredential(credential) {
|
|
88
|
-
return (typeof credential?.proof?.type === 'string' &&
|
|
89
|
-
credential.proof.type.toLowerCase().includes('bbdt16'));
|
|
90
|
-
}
|
|
91
|
-
/**
|
|
92
|
-
* Checks if a credential is anonymous (BBS+ or KVAC)
|
|
93
|
-
* @param {Object} credential - The credential to check
|
|
94
|
-
* @returns {boolean} True if the credential is anonymous
|
|
95
|
-
* @example
|
|
96
|
-
* if (isAnnonymousCredential(credential)) {
|
|
97
|
-
* console.log('This credential supports selective disclosure');
|
|
98
|
-
* }
|
|
99
|
-
*/
|
|
100
|
-
function isAnnonymousCredential(credential) {
|
|
101
|
-
return isBBSPlusCredential(credential) || isKvacCredential(credential);
|
|
102
|
-
}
|
|
103
|
-
/**
|
|
104
|
-
* Service class for managing verifiable credentials
|
|
105
|
-
* @class
|
|
106
|
-
* @description Provides methods for creating, signing, verifying, and presenting
|
|
107
|
-
* verifiable credentials with support for various signature types
|
|
108
|
-
*/
|
|
109
|
-
class CredentialService {
|
|
110
|
-
/**
|
|
111
|
-
* Creates a new CredentialService instance
|
|
112
|
-
* @constructor
|
|
113
|
-
*/
|
|
114
|
-
constructor() {
|
|
115
|
-
this.name = serviceName;
|
|
116
|
-
}
|
|
117
|
-
rpcMethods = [
|
|
118
|
-
CredentialService.prototype.generateCredential,
|
|
119
|
-
CredentialService.prototype.signCredential,
|
|
120
|
-
CredentialService.prototype.createPresentation,
|
|
121
|
-
CredentialService.prototype.verifyCredential,
|
|
122
|
-
CredentialService.prototype.createBBSPresentation,
|
|
123
|
-
CredentialService.prototype.deriveVCFromPresentation,
|
|
124
|
-
CredentialService.prototype.isBBSPlusCredential,
|
|
125
|
-
CredentialService.prototype.isKvacCredential,
|
|
126
|
-
CredentialService.prototype.isSDJWTCredential,
|
|
127
|
-
CredentialService.prototype.credentialToW3C,
|
|
128
|
-
CredentialService.prototype.createSDJWTPresentation,
|
|
129
|
-
CredentialService.prototype.acquireOIDCredential,
|
|
130
|
-
];
|
|
131
|
-
createSDJWTPresentation(params) {
|
|
132
|
-
const { attributesToReveal, credential } = params;
|
|
133
|
-
return createSDJWTPresentation({ attributesToReveal, credential });
|
|
134
|
-
}
|
|
135
|
-
/**
|
|
136
|
-
* Generates a new verifiable credential template
|
|
137
|
-
* @param {Object} [params={}] - Generation parameters
|
|
138
|
-
* @param {Object} [params.subject] - The credential subject
|
|
139
|
-
* @returns {VerifiableCredential} A new verifiable credential instance
|
|
140
|
-
* @example
|
|
141
|
-
* const credential = credentialService.generateCredential({
|
|
142
|
-
* subject: { id: 'did:example:123', name: 'Alice' }
|
|
143
|
-
* });
|
|
144
|
-
*/
|
|
145
|
-
generateCredential(params = {}) {
|
|
146
|
-
validation.generateCredential(params);
|
|
147
|
-
const { subject } = params;
|
|
148
|
-
const vc = new VerifiableCredential();
|
|
149
|
-
vc.addType('DockAuthCredential');
|
|
150
|
-
vc.addContext({
|
|
151
|
-
dk: 'https://ld.dock.io/credentials#',
|
|
152
|
-
DockAuthCredential: 'dk:DockAuthCredential',
|
|
153
|
-
});
|
|
154
|
-
if (subject) {
|
|
155
|
-
vc.setSubject(subject);
|
|
156
|
-
vc.addContext({
|
|
157
|
-
state: 'dk:state',
|
|
158
|
-
});
|
|
159
|
-
}
|
|
160
|
-
return vc;
|
|
161
|
-
}
|
|
162
|
-
/**
|
|
163
|
-
* Signs a verifiable credential
|
|
164
|
-
* @param {Object} params - Signing parameters
|
|
165
|
-
* @param {Object} params.vcJson - The credential JSON to sign
|
|
166
|
-
* @param {Object} params.keyDoc - The key document for signing
|
|
167
|
-
* @returns {Promise<VerifiableCredential>} The signed verifiable credential
|
|
168
|
-
* @throws {Error} If validation fails or signing fails
|
|
169
|
-
* @example
|
|
170
|
-
* const signedCredential = await credentialService.signCredential({
|
|
171
|
-
* vcJson: credentialData,
|
|
172
|
-
* keyDoc: issuerKeyDocument
|
|
173
|
-
* });
|
|
174
|
-
*/
|
|
175
|
-
async signCredential(params) {
|
|
176
|
-
validation.signCredential(params);
|
|
177
|
-
const { vcJson, keyDoc } = params;
|
|
178
|
-
const verifiableCredential = new VerifiableCredential();
|
|
179
|
-
verifiableCredential.setFromJSON(vcJson);
|
|
180
|
-
const kp = getKeypairFromDoc(keyDoc);
|
|
181
|
-
kp.signer = kp.signer();
|
|
182
|
-
const suite = await getSuiteFromKeyDoc(kp);
|
|
183
|
-
verifiableCredential.setIssuer(keyDoc.controller);
|
|
184
|
-
await verifiableCredential.sign(suite);
|
|
185
|
-
return verifiableCredential;
|
|
186
|
-
}
|
|
187
|
-
/**
|
|
188
|
-
* Creates a verifiable presentation from credentials
|
|
189
|
-
* @param {Object} params - Presentation parameters
|
|
190
|
-
* @param {Array<Object>} params.credentials - Array of verifiable credentials to include
|
|
191
|
-
* @param {Object} params.keyDoc - The key document for signing the presentation
|
|
192
|
-
* @param {string} [params.challenge] - Challenge string for the presentation proof
|
|
193
|
-
* @param {string} [params.id] - Presentation identifier
|
|
194
|
-
* @param {string} [params.domain] - Domain for the presentation proof
|
|
195
|
-
* @returns {Promise<Object>} The signed verifiable presentation
|
|
196
|
-
* @throws {Error} If validation fails
|
|
197
|
-
* @example
|
|
198
|
-
* const presentation = await credentialService.createPresentation({
|
|
199
|
-
* credentials: [credential1, credential2],
|
|
200
|
-
* keyDoc: holderKeyDocument,
|
|
201
|
-
* challenge: 'abc123',
|
|
202
|
-
* domain: 'example.com'
|
|
203
|
-
* });
|
|
204
|
-
*/
|
|
205
|
-
async createPresentation(params) {
|
|
206
|
-
validation.createPresentation(params);
|
|
207
|
-
const { credentials, keyDoc, challenge, id, domain } = params;
|
|
208
|
-
const vp = new VerifiablePresentation(id);
|
|
209
|
-
let shouldSkipSigning = false;
|
|
210
|
-
let jwtCredentials = [];
|
|
211
|
-
for (const signedVC of credentials) {
|
|
212
|
-
if (typeof signedVC === 'string') {
|
|
213
|
-
jwtCredentials.push(signedVC);
|
|
214
|
-
shouldSkipSigning = true;
|
|
215
|
-
}
|
|
216
|
-
else {
|
|
217
|
-
vp.addCredential(signedVC);
|
|
218
|
-
}
|
|
219
|
-
shouldSkipSigning = shouldSkipSigning || isAnnonymousCredential(signedVC);
|
|
220
|
-
}
|
|
221
|
-
if (!shouldSkipSigning) {
|
|
222
|
-
vp.setHolder(keyDoc.controller);
|
|
223
|
-
}
|
|
224
|
-
const keyPair = getKeypairFromDoc(keyDoc);
|
|
225
|
-
keyPair.signer = keyPair.signer();
|
|
226
|
-
const suite = await getSuiteFromKeyDoc(keyPair);
|
|
227
|
-
if (shouldSkipSigning) {
|
|
228
|
-
const result = vp.toJSON();
|
|
229
|
-
result.verifiableCredential.push(...jwtCredentials);
|
|
230
|
-
return result;
|
|
231
|
-
}
|
|
232
|
-
return vp.sign(suite, challenge, domain, blockchainService.resolver);
|
|
233
|
-
}
|
|
234
|
-
/**
|
|
235
|
-
* Verifies a verifiable presentation
|
|
236
|
-
* @param {Object} params - Verification parameters
|
|
237
|
-
* @param {Object} params.presentation - The presentation to verify
|
|
238
|
-
* @param {Object} [params.options] - Verification options
|
|
239
|
-
* @returns {Promise<Object>} Verification result with verified status and any errors
|
|
240
|
-
* @example
|
|
241
|
-
* const result = await credentialService.verifyPresentation({
|
|
242
|
-
* presentation: presentationData
|
|
243
|
-
* });
|
|
244
|
-
* console.log('Verified:', result.verified);
|
|
245
|
-
*/
|
|
246
|
-
async verifyPresentation({ presentation, options }) {
|
|
247
|
-
return verifyPresentation(presentation, options);
|
|
248
|
-
}
|
|
249
|
-
/**
|
|
250
|
-
* Verifies a verifiable credential including revocation check
|
|
251
|
-
* @param {Object} params - Verification parameters
|
|
252
|
-
* @param {Object} params.credential - The credential to verify
|
|
253
|
-
* @param {Object} [params.membershipWitness] - Membership witness for revocation check
|
|
254
|
-
* @returns {Promise<Object>} Verification result
|
|
255
|
-
* @returns {boolean} returns.verified - Whether the credential is valid
|
|
256
|
-
* @returns {string} [returns.error] - Error message if verification failed
|
|
257
|
-
* @throws {Error} If validation fails
|
|
258
|
-
* @example
|
|
259
|
-
* const result = await credentialService.verifyCredential({
|
|
260
|
-
* credential: credentialData,
|
|
261
|
-
* membershipWitness: witnessData
|
|
262
|
-
* });
|
|
263
|
-
* if (!result.verified) {
|
|
264
|
-
* console.error('Verification failed:', result.error);
|
|
265
|
-
* }
|
|
266
|
-
*/
|
|
267
|
-
async verifyCredential(params) {
|
|
268
|
-
validation.verifyCredential(params);
|
|
269
|
-
let { credential, membershipWitness } = params;
|
|
270
|
-
if (credential._sd_jwt) {
|
|
271
|
-
credential = credential?._sd_jwt?.encoded;
|
|
272
|
-
}
|
|
273
|
-
if (typeof credential === 'string' && isSDJWTCredential(credential)) {
|
|
274
|
-
return verifySDJWT(credential);
|
|
275
|
-
}
|
|
276
|
-
const result = await verifyCredential(credential, {
|
|
277
|
-
resolver: blockchainService.resolver,
|
|
278
|
-
revocationApi: { dock: blockchainService.dock },
|
|
279
|
-
});
|
|
280
|
-
const { credentialStatus } = credential;
|
|
281
|
-
if (result.verified && credentialStatus?.id) {
|
|
282
|
-
try {
|
|
283
|
-
const isRevoked = await getIsRevoked(credential, membershipWitness);
|
|
284
|
-
if (isRevoked) {
|
|
285
|
-
result.verified = false;
|
|
286
|
-
result.error = 'revocation check: the credential is revoked';
|
|
287
|
-
}
|
|
288
|
-
}
|
|
289
|
-
catch (err) {
|
|
290
|
-
console.log('Unable to get revocation status');
|
|
291
|
-
console.error(err);
|
|
292
|
-
}
|
|
293
|
-
}
|
|
294
|
-
return result;
|
|
295
|
-
}
|
|
296
|
-
/**
|
|
297
|
-
* Filters credentials based on a presentation definition
|
|
298
|
-
* @param {Object} params - Filter parameters
|
|
299
|
-
* @param {Array<Object>} params.credentials - Array of credentials to filter
|
|
300
|
-
* @param {Object} params.presentationDefinition - PEX presentation definition
|
|
301
|
-
* @param {string} [params.holderDid] - DID of the credential holder
|
|
302
|
-
* @returns {Object} Filtered credentials matching the presentation definition
|
|
303
|
-
* @example
|
|
304
|
-
* const filtered = credentialService.filterCredentials({
|
|
305
|
-
* credentials: allCredentials,
|
|
306
|
-
* presentationDefinition: definition,
|
|
307
|
-
* holderDid: 'did:example:holder'
|
|
308
|
-
* });
|
|
309
|
-
*/
|
|
310
|
-
filterCredentials(params) {
|
|
311
|
-
const { credentials, presentationDefinition, holderDid } = params;
|
|
312
|
-
const result = pex.selectFrom(presentationDefinition, credentials, holderDid);
|
|
313
|
-
return result;
|
|
314
|
-
}
|
|
315
|
-
/**
|
|
316
|
-
* Evaluates a presentation against a presentation definition
|
|
317
|
-
* @param {Object} params - Evaluation parameters
|
|
318
|
-
* @param {Object} params.presentation - The presentation to evaluate
|
|
319
|
-
* @param {Object} params.presentationDefinition - PEX presentation definition
|
|
320
|
-
* @returns {Object} Evaluation result with validation details
|
|
321
|
-
* @example
|
|
322
|
-
* const evaluation = credentialService.evaluatePresentation({
|
|
323
|
-
* presentation: presentationData,
|
|
324
|
-
* presentationDefinition: definition
|
|
325
|
-
* });
|
|
326
|
-
*/
|
|
327
|
-
evaluatePresentation(params) {
|
|
328
|
-
const { presentation, presentationDefinition } = params;
|
|
329
|
-
const result = pex.evaluatePresentation(presentationDefinition, presentation);
|
|
330
|
-
return result;
|
|
331
|
-
}
|
|
332
|
-
/**
|
|
333
|
-
* Checks if a credential uses BBS+ signature
|
|
334
|
-
* @param {Object} params - Check parameters
|
|
335
|
-
* @param {Object} params.credential - The credential to check
|
|
336
|
-
* @returns {boolean} True if the credential uses BBS+ signature
|
|
337
|
-
*/
|
|
338
|
-
isBBSPlusCredential(params) {
|
|
339
|
-
const { credential } = params;
|
|
340
|
-
return isBBSPlusCredential(credential);
|
|
341
|
-
}
|
|
342
|
-
/**
|
|
343
|
-
* Checks if a credential uses KVAC signature
|
|
344
|
-
* @param {Object} params - Check parameters
|
|
345
|
-
* @param {Object} params.credential - The credential to check
|
|
346
|
-
* @returns {boolean} True if the credential uses KVAC signature
|
|
347
|
-
*/
|
|
348
|
-
isKvacCredential(params) {
|
|
349
|
-
const { credential } = params;
|
|
350
|
-
return isKvacCredential(credential);
|
|
351
|
-
}
|
|
352
|
-
/**
|
|
353
|
-
* Checks if a credential is an SD-JWT (Selective Disclosure JWT) credential
|
|
354
|
-
* @param {Object} params - Check parameters
|
|
355
|
-
* @param {string} params.credential - The JWT string to check
|
|
356
|
-
* @returns {boolean} True if the credential is an SD-JWT credential
|
|
357
|
-
* @example
|
|
358
|
-
* const isSDJWT = credentialService.isSDJWTCredential({
|
|
359
|
-
* credential: 'eyJ0eXAiOiJ2YytzZC1qd3Q...'
|
|
360
|
-
* });
|
|
361
|
-
*/
|
|
362
|
-
isSDJWTCredential(params) {
|
|
363
|
-
const { credential } = params;
|
|
364
|
-
return isSDJWTCredential(credential);
|
|
365
|
-
}
|
|
366
|
-
/**
|
|
367
|
-
* Converts a credential to W3C Verifiable Credential format
|
|
368
|
-
* @description Handles both SD-JWT credentials (needs decoding) and regular W3C credentials (returns as-is)
|
|
369
|
-
* @param {Object} params - Conversion parameters
|
|
370
|
-
* @param {string|Object} params.credential - Either an SD-JWT string or a credential object
|
|
371
|
-
* @returns {Promise<Object>} W3C Verifiable Credential format
|
|
372
|
-
* @throws {Error} If credential cannot be converted to W3C format
|
|
373
|
-
* @example
|
|
374
|
-
* // Convert SD-JWT to W3C format
|
|
375
|
-
* const w3cCredential = await credentialService.credentialToW3C({
|
|
376
|
-
* credential: 'eyJ0eXAiOiJ2YytzZC1qd3Q...'
|
|
377
|
-
* });
|
|
378
|
-
*
|
|
379
|
-
* // Returns W3C credential as-is
|
|
380
|
-
* const w3cCredential = await credentialService.credentialToW3C({
|
|
381
|
-
* credential: { '@context': [...], type: [...], ... }
|
|
382
|
-
* });
|
|
383
|
-
*/
|
|
384
|
-
async credentialToW3C(params) {
|
|
385
|
-
const { credential } = params;
|
|
386
|
-
return credentialToW3C(credential);
|
|
387
|
-
}
|
|
388
|
-
/**
|
|
389
|
-
* Acquires a credential through OpenID for Verifiable Credentials (OID4VC)
|
|
390
|
-
* @param {Object} params - Acquisition parameters
|
|
391
|
-
* @param {string} params.uri - The credential offer URI
|
|
392
|
-
* @param {string} [params.authorizationCode] - Authorization code if required
|
|
393
|
-
* @param {Object} params.holderKeyDocument - Key document for the credential holder
|
|
394
|
-
* @returns {Promise<Object>} Result containing the credential or authorization URL
|
|
395
|
-
* @returns {Object} [returns.credential] - The acquired credential
|
|
396
|
-
* @returns {string} [returns.authorizationURL] - Authorization URL if auth is required
|
|
397
|
-
* @example
|
|
398
|
-
* const result = await credentialService.acquireOIDCredential({
|
|
399
|
-
* uri: 'openid-credential-offer://...',
|
|
400
|
-
* holderKeyDocument: keyDoc
|
|
401
|
-
* });
|
|
402
|
-
*/
|
|
403
|
-
async acquireOIDCredential({ uri, authorizationCode, holderKeyDocument, }) {
|
|
404
|
-
const searchParams = new URL(uri).searchParams;
|
|
405
|
-
new URLSearchParams(searchParams);
|
|
406
|
-
const client = await OpenID4VCIClientV1_0_13.fromURI({
|
|
407
|
-
uri: uri,
|
|
408
|
-
clientId: 'dock.wallet',
|
|
409
|
-
authorizationRequest: {
|
|
410
|
-
redirectUri: 'dock-wallet://credentials/callback',
|
|
411
|
-
clientId: 'dock.wallet',
|
|
412
|
-
// Hack: we need the scope property to avoid 'CredentialOffer format is wrong.' error
|
|
413
|
-
scope: []
|
|
414
|
-
},
|
|
415
|
-
});
|
|
416
|
-
const format = 'ldp_vc';
|
|
417
|
-
const { scope } = client.getCredentialsSupported()[0];
|
|
418
|
-
const scopeSplit = scope.split(':');
|
|
419
|
-
const credentialTypes = scopeSplit[scopeSplit.length - 1];
|
|
420
|
-
let code;
|
|
421
|
-
if (client.credentialOffer?.preAuthorizedCode) {
|
|
422
|
-
code = client.credentialOffer?.preAuthorizedCode;
|
|
423
|
-
}
|
|
424
|
-
else {
|
|
425
|
-
if (authorizationCode) {
|
|
426
|
-
code = authorizationCode;
|
|
427
|
-
}
|
|
428
|
-
else {
|
|
429
|
-
return {
|
|
430
|
-
authorizationURL: client.authorizationURL,
|
|
431
|
-
};
|
|
432
|
-
}
|
|
433
|
-
}
|
|
434
|
-
await client.acquireAccessToken({
|
|
435
|
-
code,
|
|
436
|
-
});
|
|
437
|
-
try {
|
|
438
|
-
const response = await client.acquireCredentials({
|
|
439
|
-
credentialTypes,
|
|
440
|
-
proofCallbacks: {
|
|
441
|
-
signCallback: async (args) => {
|
|
442
|
-
// use service method here
|
|
443
|
-
const jwt = await didService.createSignedJWT({
|
|
444
|
-
payload: args.payload,
|
|
445
|
-
privateKeyDoc: holderKeyDocument,
|
|
446
|
-
headerInput: args.header,
|
|
447
|
-
});
|
|
448
|
-
return jwt;
|
|
449
|
-
},
|
|
450
|
-
},
|
|
451
|
-
context: 'truverawallet',
|
|
452
|
-
format: format,
|
|
453
|
-
alg: Alg.EdDSA,
|
|
454
|
-
kid: holderKeyDocument.id,
|
|
455
|
-
});
|
|
456
|
-
return {
|
|
457
|
-
credential: response.credential,
|
|
458
|
-
};
|
|
459
|
-
}
|
|
460
|
-
catch (err) {
|
|
461
|
-
console.error(err);
|
|
462
|
-
}
|
|
463
|
-
}
|
|
464
|
-
/**
|
|
465
|
-
* Creates a BBS+ presentation with selective disclosure
|
|
466
|
-
* @param {Object} params - Presentation parameters
|
|
467
|
-
* @param {Array<Object>} params.credentials - Array of credentials with attributes to reveal
|
|
468
|
-
* @param {Object} params.credentials[].credential - The BBS+ credential
|
|
469
|
-
* @param {Array<string>} [params.credentials[].attributesToReveal] - Attributes to reveal
|
|
470
|
-
* @returns {Promise<Object>} The BBS+ presentation
|
|
471
|
-
* @throws {Error} If validation fails
|
|
472
|
-
* @example
|
|
473
|
-
* const presentation = await credentialService.createBBSPresentation({
|
|
474
|
-
* credentials: [{
|
|
475
|
-
* credential: bbsCredential,
|
|
476
|
-
* attributesToReveal: ['name', 'age']
|
|
477
|
-
* }]
|
|
478
|
-
* });
|
|
479
|
-
*/
|
|
480
|
-
async createBBSPresentation(params) {
|
|
481
|
-
validation.createBBSPresentation(params);
|
|
482
|
-
const { credentials } = params;
|
|
483
|
-
const bbsPlusPresentation = new Presentation();
|
|
484
|
-
for (const { credential, attributesToReveal } of credentials) {
|
|
485
|
-
const idx = await bbsPlusPresentation.addCredentialToPresent(credential, {
|
|
486
|
-
resolver: blockchainService.resolver,
|
|
487
|
-
});
|
|
488
|
-
if (Array.isArray(attributesToReveal) && attributesToReveal.length > 0) {
|
|
489
|
-
await bbsPlusPresentation.addAttributeToReveal(idx, attributesToReveal);
|
|
490
|
-
}
|
|
491
|
-
}
|
|
492
|
-
return bbsPlusPresentation.createPresentation();
|
|
493
|
-
}
|
|
494
|
-
/**
|
|
495
|
-
* Gets the accumulator ID from a credential's status
|
|
496
|
-
* @param {Object} params - Parameters
|
|
497
|
-
* @param {Object} params.credential - The credential to get accumulator ID from
|
|
498
|
-
* @returns {string|null} The accumulator ID or null if not present
|
|
499
|
-
* @throws {Error} If credential is not provided
|
|
500
|
-
*/
|
|
501
|
-
getAccumulatorId({ credential }) {
|
|
502
|
-
assert(!!credential, `credential is required`);
|
|
503
|
-
if (!credential?.credentialStatus) {
|
|
504
|
-
return null;
|
|
505
|
-
}
|
|
506
|
-
return credential?.credentialStatus.id;
|
|
507
|
-
}
|
|
508
|
-
/**
|
|
509
|
-
* Gets accumulator data from the blockchain for a credential
|
|
510
|
-
* @param {Object} params - Parameters
|
|
511
|
-
* @param {Object} params.credential - The credential to get accumulator data for
|
|
512
|
-
* @returns {Promise<Object|null>} The accumulator data or null if not found
|
|
513
|
-
* @throws {Error} If credential is not provided
|
|
514
|
-
*/
|
|
515
|
-
async getAccumulatorData({ credential }) {
|
|
516
|
-
assert(!!credential, `credential is required`);
|
|
517
|
-
const accumulatorId = await this.getAccumulatorId({ credential });
|
|
518
|
-
if (!accumulatorId) {
|
|
519
|
-
return null;
|
|
520
|
-
}
|
|
521
|
-
return blockchainService.dock.accumulatorModule.getAccumulator(accumulatorId, false);
|
|
522
|
-
}
|
|
523
|
-
/**
|
|
524
|
-
* Updates the membership witness with the latest accumulator state
|
|
525
|
-
* @description The witness is generated by the issuer when the credential is created
|
|
526
|
-
* and is stored in the wallet when the credential is imported. This method updates
|
|
527
|
-
* it with the latest accumulator changes from the blockchain.
|
|
528
|
-
* @param {Object} params - Update parameters
|
|
529
|
-
* @param {Object} params.credential - The credential with revocation status
|
|
530
|
-
* @param {Object} params.membershipWitnessJSON - Current membership witness in JSON format
|
|
531
|
-
* @returns {Promise<Object>} Updated membership witness in JSON format
|
|
532
|
-
* @throws {Error} If updates cannot be fetched or applied
|
|
533
|
-
*/
|
|
534
|
-
async updateMembershipWitness({ credential, membershipWitnessJSON }) {
|
|
535
|
-
const revocationId = credential.credentialStatus.revocationId;
|
|
536
|
-
const member = Accumulator.encodePositiveNumberAsAccumulatorMember(revocationId);
|
|
537
|
-
let updates = [];
|
|
538
|
-
try {
|
|
539
|
-
updates = await dock.accumulatorModule.getUpdatesFromBlock(accumulatorId, accumulator.lastModified);
|
|
540
|
-
}
|
|
541
|
-
catch (err) {
|
|
542
|
-
if (err.code === -32000) {
|
|
543
|
-
console.error(err);
|
|
544
|
-
// "-32000: Client error: UnknownBlock: State already discarded for BlockId::Hash(<hash>)"
|
|
545
|
-
// This means that the node has discarded old blocks to preserve space. This should not happen with a full node
|
|
546
|
-
updates = [];
|
|
547
|
-
}
|
|
548
|
-
else {
|
|
549
|
-
throw err;
|
|
550
|
-
}
|
|
551
|
-
}
|
|
552
|
-
const additions = [];
|
|
553
|
-
const removals = [];
|
|
554
|
-
if (updates.length && updates[0].additions !== null) {
|
|
555
|
-
for (const a of updates[0].additions) {
|
|
556
|
-
additions.push(hexToU8a(a));
|
|
557
|
-
}
|
|
558
|
-
}
|
|
559
|
-
if (updates.length && updates[0].removals !== null) {
|
|
560
|
-
for (const a of updates[0].removals) {
|
|
561
|
-
removals.push(hexToU8a(a));
|
|
562
|
-
}
|
|
563
|
-
}
|
|
564
|
-
const queriedWitnessInfo = new WitnessUpdatePublicInfo(hexToU8a(updates[0].witnessUpdateInfo));
|
|
565
|
-
const witness = MembershipWitness.fromJSON(membershipWitnessJSON);
|
|
566
|
-
witness.updateUsingPublicInfoPostBatchUpdate(member, additions, removals, queriedWitnessInfo);
|
|
567
|
-
return witness.toJSON();
|
|
568
|
-
}
|
|
569
|
-
/**
|
|
570
|
-
* Derives verifiable credentials from a presentation with selective disclosure
|
|
571
|
-
* @param {Object} params - Derivation parameters
|
|
572
|
-
* @param {Array<Object>} params.credentials - Array of credential objects
|
|
573
|
-
* @param {Object} params.credentials[].credential - The credential
|
|
574
|
-
* @param {Array<string>} params.credentials[].attributesToReveal - Attributes to reveal
|
|
575
|
-
* @param {Object} [params.credentials[].witness] - Membership witness for revocation
|
|
576
|
-
* @param {Object} [params.options={}] - Additional options for derivation
|
|
577
|
-
* @param {Object} [params.proofRequest] - Proof request with constraints
|
|
578
|
-
* @returns {Promise<Array>} Array of derived credentials
|
|
579
|
-
* @throws {Error} If validation fails
|
|
580
|
-
* @example
|
|
581
|
-
* const derivedCredentials = await credentialService.deriveVCFromPresentation({
|
|
582
|
-
* credentials: [{
|
|
583
|
-
* credential: bbsCredential,
|
|
584
|
-
* attributesToReveal: ['name', 'dateOfBirth']
|
|
585
|
-
* }]
|
|
586
|
-
* });
|
|
587
|
-
*/
|
|
588
|
-
async deriveVCFromPresentation(params) {
|
|
589
|
-
validation.deriveVCFromPresentation(params);
|
|
590
|
-
const { credentials, options = {}, proofRequest } = params;
|
|
591
|
-
const presentation = new Presentation();
|
|
592
|
-
const selectedCredentials = credentials.map(({ credential }) => credential);
|
|
593
|
-
let descriptorBounds = [];
|
|
594
|
-
for (const { credential } of credentials) {
|
|
595
|
-
await presentation.addCredentialToPresent(credential, {
|
|
596
|
-
resolver: blockchainService.resolver,
|
|
597
|
-
});
|
|
598
|
-
}
|
|
599
|
-
if (proofRequest && hasProvingKey(proofRequest)) {
|
|
600
|
-
const { provingKey, provingKeyId } = await fetchProvingKey(proofRequest);
|
|
601
|
-
descriptorBounds = applyEnforceBounds({
|
|
602
|
-
builder: presentation.presBuilder,
|
|
603
|
-
proofRequest,
|
|
604
|
-
provingKey,
|
|
605
|
-
provingKeyId,
|
|
606
|
-
selectedCredentials,
|
|
607
|
-
});
|
|
608
|
-
}
|
|
609
|
-
let pexRequiredAttributes = [];
|
|
610
|
-
if (proofRequest?.request) {
|
|
611
|
-
pexRequiredAttributes = getPexRequiredAttributes(proofRequest.request, selectedCredentials);
|
|
612
|
-
}
|
|
613
|
-
let idx = 0;
|
|
614
|
-
for (const { attributesToReveal, witness, credential } of credentials) {
|
|
615
|
-
const attributesToSkip = descriptorBounds[idx]
|
|
616
|
-
? descriptorBounds[idx].map(bound => bound.attributeName)
|
|
617
|
-
: [];
|
|
618
|
-
const filteredAttributes = attributesToReveal.filter(attribute => !attributesToSkip.includes(attribute) && !shouldSkipAttribute(attribute));
|
|
619
|
-
const _pexRequiredAttributes = pexRequiredAttributes[idx] || [];
|
|
620
|
-
_pexRequiredAttributes.forEach(attr => {
|
|
621
|
-
if (!filteredAttributes.includes(attr)) {
|
|
622
|
-
filteredAttributes.push(attr);
|
|
623
|
-
}
|
|
624
|
-
});
|
|
625
|
-
if (Array.isArray(filteredAttributes) && filteredAttributes.length > 0) {
|
|
626
|
-
presentation.addAttributeToReveal(idx, filteredAttributes);
|
|
627
|
-
}
|
|
628
|
-
if (witness) {
|
|
629
|
-
const details = await getWitnessDetails(credential, witness);
|
|
630
|
-
const chainModule = credential.credentialStatus.id.indexOf('dock:accumulator') === 0
|
|
631
|
-
? blockchainService.modules.accumulator.modules[0]
|
|
632
|
-
: blockchainService.modules.accumulator.modules[blockchainService.modules.accumulator.modules.length - 1];
|
|
633
|
-
const accumulatorModuleClass = chainModule.constructor;
|
|
634
|
-
presentation.presBuilder.addAccumInfoForCredStatus(idx, details.membershipWitness, accumulatorModuleClass.accumulatedFromHex(details.accumulator.accumulated, VB_ACCUMULATOR_22.VBPos), details.pk, details.params);
|
|
635
|
-
}
|
|
636
|
-
idx++;
|
|
637
|
-
}
|
|
638
|
-
const credentialsFromPresentation = await presentation.deriveCredentials(options);
|
|
639
|
-
return credentialsFromPresentation;
|
|
640
|
-
}
|
|
641
|
-
/**
|
|
642
|
-
* Test method for range proofs
|
|
643
|
-
* @private
|
|
644
|
-
* @returns {Promise<void>}
|
|
645
|
-
*/
|
|
646
|
-
async testRangeProof() {
|
|
647
|
-
console.log('test');
|
|
648
|
-
}
|
|
649
|
-
}
|
|
650
|
-
/**
|
|
651
|
-
* Singleton instance of the credential service
|
|
652
|
-
* @type {CredentialService}
|
|
653
|
-
* @example
|
|
654
|
-
* import { credentialService } from '@docknetwork/wallet-sdk-wasm/services/credential';
|
|
655
|
-
*
|
|
656
|
-
* // Create and sign a credential
|
|
657
|
-
* const credential = credentialService.generateCredential({
|
|
658
|
-
* subject: { id: 'did:example:123' }
|
|
659
|
-
* });
|
|
660
|
-
* const signed = await credentialService.signCredential({
|
|
661
|
-
* vcJson: credential,
|
|
662
|
-
* keyDoc: issuerKey
|
|
663
|
-
* });
|
|
664
|
-
*
|
|
665
|
-
* // Verify a credential
|
|
666
|
-
* const result = await credentialService.verifyCredential({
|
|
667
|
-
* credential: signedCredential
|
|
668
|
-
* });
|
|
669
|
-
*/
|
|
670
|
-
const credentialService = new CredentialService();
|
|
671
|
-
|
|
672
|
-
export { credentialService, isAnnonymousCredential, isBBSPlusCredential, isKvacCredential };
|