@0xpolygonid/js-sdk 1.7.4 → 1.8.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/dist/browser/esm/index.js +13086 -11852
- package/dist/browser/esm/index.js.map +1 -1
- package/dist/browser/umd/index.js +13115 -11861
- package/dist/browser/umd/index.js.map +1 -1
- package/dist/node/cjs/circuits/atomic-query-mtp-v2.js +3 -3
- package/dist/node/cjs/circuits/atomic-query-sig-v2.js +3 -3
- package/dist/node/cjs/circuits/atomic-query-v3.js +18 -13
- package/dist/node/cjs/circuits/auth-v2.js +1 -1
- package/dist/node/cjs/circuits/index.js +0 -1
- package/dist/node/cjs/circuits/linked-multi-query.js +16 -6
- package/dist/node/cjs/circuits/models.js +0 -5
- package/dist/node/cjs/credentials/credential-wallet.js +1 -3
- package/dist/node/cjs/credentials/index.js +1 -0
- package/dist/node/cjs/credentials/models.js +2 -0
- package/dist/node/cjs/credentials/status/credential-status-publisher.js +23 -4
- package/dist/node/cjs/iden3comm/constants.js +3 -1
- package/dist/node/cjs/iden3comm/handlers/auth.js +119 -14
- package/dist/node/cjs/kms/key-providers/sec256k1-provider.js +5 -2
- package/dist/node/cjs/proof/common.js +3 -4
- package/dist/node/cjs/proof/index.js +2 -1
- package/dist/node/cjs/proof/proof-service.js +22 -2
- package/dist/node/cjs/proof/provers/index.js +19 -0
- package/dist/node/cjs/proof/{inputs-generator.js → provers/inputs-generator.js} +43 -40
- package/dist/node/cjs/proof/{prover.js → provers/prover.js} +1 -1
- package/dist/node/cjs/proof/verifiers/index.js +18 -0
- package/dist/node/cjs/proof/verifiers/pub-signals-verifier.js +344 -0
- package/dist/node/cjs/proof/verifiers/query.js +190 -0
- package/dist/node/cjs/schema-processor/json/parser.js +39 -198
- package/dist/node/cjs/schema-processor/utils.js +13 -26
- package/dist/node/cjs/storage/blockchain/state.js +53 -8
- package/dist/node/cjs/storage/filters/jsonQuery.js +2 -2
- package/dist/node/cjs/utils/compare-func.js +11 -0
- package/dist/node/cjs/utils/index.js +2 -0
- package/dist/node/cjs/utils/message-bus.js +73 -0
- package/dist/node/cjs/verifiable/core-utils.js +234 -0
- package/dist/node/cjs/verifiable/credential.js +139 -1
- package/dist/node/cjs/verifiable/index.js +1 -0
- package/dist/node/esm/circuits/atomic-query-mtp-v2.js +3 -3
- package/dist/node/esm/circuits/atomic-query-sig-v2.js +3 -3
- package/dist/node/esm/circuits/atomic-query-v3.js +18 -13
- package/dist/node/esm/circuits/auth-v2.js +2 -2
- package/dist/node/esm/circuits/index.js +0 -1
- package/dist/node/esm/circuits/linked-multi-query.js +16 -6
- package/dist/node/esm/circuits/models.js +0 -5
- package/dist/node/esm/credentials/credential-wallet.js +1 -3
- package/dist/node/esm/credentials/index.js +1 -0
- package/dist/node/esm/credentials/models.js +1 -0
- package/dist/node/esm/credentials/status/credential-status-publisher.js +23 -4
- package/dist/node/esm/iden3comm/constants.js +3 -1
- package/dist/node/esm/iden3comm/handlers/auth.js +116 -13
- package/dist/node/esm/kms/key-providers/sec256k1-provider.js +5 -2
- package/dist/node/esm/proof/common.js +4 -5
- package/dist/node/esm/proof/index.js +2 -1
- package/dist/node/esm/proof/proof-service.js +22 -2
- package/dist/node/esm/proof/provers/index.js +3 -0
- package/dist/node/esm/proof/{inputs-generator.js → provers/inputs-generator.js} +40 -37
- package/dist/node/esm/proof/{prover.js → provers/prover.js} +1 -1
- package/dist/node/esm/proof/verifiers/index.js +2 -0
- package/dist/node/esm/proof/verifiers/pub-signals-verifier.js +340 -0
- package/dist/node/esm/proof/verifiers/query.js +186 -0
- package/dist/node/esm/schema-processor/json/parser.js +40 -199
- package/dist/node/esm/schema-processor/utils.js +13 -26
- package/dist/node/esm/storage/blockchain/state.js +53 -8
- package/dist/node/esm/storage/filters/jsonQuery.js +2 -2
- package/dist/node/esm/utils/compare-func.js +7 -0
- package/dist/node/esm/utils/index.js +2 -0
- package/dist/node/esm/utils/message-bus.js +66 -0
- package/dist/node/esm/verifiable/core-utils.js +200 -0
- package/dist/node/esm/verifiable/credential.js +118 -3
- package/dist/node/esm/verifiable/index.js +1 -0
- package/dist/types/circuits/index.d.ts +0 -1
- package/dist/types/circuits/linked-multi-query.d.ts +3 -3
- package/dist/types/circuits/models.d.ts +0 -4
- package/dist/types/credentials/credential-wallet.d.ts +2 -60
- package/dist/types/credentials/index.d.ts +1 -0
- package/dist/types/credentials/models.d.ts +68 -0
- package/dist/types/credentials/status/credential-status-publisher.d.ts +2 -0
- package/dist/types/iden3comm/constants.d.ts +1 -0
- package/dist/types/iden3comm/handlers/auth.d.ts +53 -13
- package/dist/types/iden3comm/types/protocol/credentials.d.ts +16 -0
- package/dist/types/identity/identity-wallet.d.ts +3 -1
- package/dist/types/kms/key-providers/sec256k1-provider.d.ts +1 -1
- package/dist/types/proof/index.d.ts +2 -1
- package/dist/types/proof/proof-service.d.ts +28 -3
- package/dist/types/proof/provers/index.d.ts +3 -0
- package/dist/types/proof/{inputs-generator.d.ts → provers/inputs-generator.d.ts} +15 -9
- package/dist/types/proof/{prover.d.ts → provers/prover.d.ts} +2 -2
- package/dist/types/proof/verifiers/index.d.ts +2 -0
- package/dist/types/proof/verifiers/pub-signals-verifier.d.ts +58 -0
- package/dist/types/proof/verifiers/query.d.ts +25 -0
- package/dist/types/schema-processor/json/parser.d.ts +47 -28
- package/dist/types/schema-processor/utils.d.ts +9 -4
- package/dist/types/storage/blockchain/state.d.ts +5 -1
- package/dist/types/storage/interfaces/state.d.ts +8 -0
- package/dist/types/utils/compare-func.d.ts +1 -0
- package/dist/types/utils/index.d.ts +2 -0
- package/dist/types/utils/message-bus.d.ts +62 -0
- package/dist/types/verifiable/core-utils.d.ts +84 -0
- package/dist/types/verifiable/credential.d.ts +11 -1
- package/dist/types/verifiable/index.d.ts +1 -0
- package/dist/types/verifiable/proof.d.ts +4 -0
- package/package.json +10 -10
- package/dist/node/cjs/circuits/linked-nullifier.js +0 -57
- package/dist/node/esm/circuits/linked-nullifier.js +0 -52
- package/dist/types/circuits/linked-nullifier.d.ts +0 -37
- /package/dist/node/cjs/proof/{witness_calculator.js → provers/witness_calculator.js} +0 -0
- /package/dist/node/esm/proof/{witness_calculator.js → provers/witness_calculator.js} +0 -0
- /package/dist/types/proof/{witness_calculator.d.ts → provers/witness_calculator.d.ts} +0 -0
|
@@ -1,22 +1,31 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.InputGenerator = void 0;
|
|
3
|
+
exports.InputGenerator = exports.circuitValidator = void 0;
|
|
4
4
|
const js_iden3_core_1 = require("@iden3/js-iden3-core");
|
|
5
|
-
const verifiable_1 = require("
|
|
6
|
-
const circuits_1 = require("
|
|
7
|
-
const common_1 = require("
|
|
8
|
-
const credentials_1 = require("
|
|
9
|
-
const
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
5
|
+
const verifiable_1 = require("../../verifiable");
|
|
6
|
+
const circuits_1 = require("../../circuits");
|
|
7
|
+
const common_1 = require("../common");
|
|
8
|
+
const credentials_1 = require("../../credentials");
|
|
9
|
+
const allOperations = Object.values(circuits_1.QueryOperators);
|
|
10
|
+
const v2Operations = [
|
|
11
|
+
circuits_1.Operators.NOOP,
|
|
12
|
+
circuits_1.Operators.EQ,
|
|
13
|
+
circuits_1.Operators.LT,
|
|
14
|
+
circuits_1.Operators.GT,
|
|
15
|
+
circuits_1.Operators.IN,
|
|
16
|
+
circuits_1.Operators.NIN,
|
|
17
|
+
circuits_1.Operators.NE
|
|
18
|
+
];
|
|
19
|
+
exports.circuitValidator = {
|
|
20
|
+
[circuits_1.CircuitId.AtomicQueryMTPV2]: { maxQueriesCount: 1, supportedOperations: v2Operations },
|
|
21
|
+
[circuits_1.CircuitId.AtomicQueryMTPV2OnChain]: { maxQueriesCount: 1, supportedOperations: v2Operations },
|
|
22
|
+
[circuits_1.CircuitId.AtomicQuerySigV2]: { maxQueriesCount: 1, supportedOperations: v2Operations },
|
|
23
|
+
[circuits_1.CircuitId.AtomicQuerySigV2OnChain]: { maxQueriesCount: 1, supportedOperations: v2Operations },
|
|
24
|
+
[circuits_1.CircuitId.AtomicQueryV3]: { maxQueriesCount: 1, supportedOperations: allOperations },
|
|
25
|
+
[circuits_1.CircuitId.AtomicQueryV3OnChain]: { maxQueriesCount: 1, supportedOperations: allOperations },
|
|
26
|
+
[circuits_1.CircuitId.AuthV2]: { maxQueriesCount: 0, supportedOperations: [] },
|
|
27
|
+
[circuits_1.CircuitId.StateTransition]: { maxQueriesCount: 0, supportedOperations: [] },
|
|
28
|
+
[circuits_1.CircuitId.LinkedMultiQuery10]: { maxQueriesCount: 10, supportedOperations: allOperations }
|
|
20
29
|
};
|
|
21
30
|
class InputGenerator {
|
|
22
31
|
constructor(_identityWallet, _credentialWallet, _stateStorage) {
|
|
@@ -30,7 +39,7 @@ class InputGenerator {
|
|
|
30
39
|
circuitInputs.id = js_iden3_core_1.DID.idFromDID(identifier);
|
|
31
40
|
circuitInputs.requestID = BigInt(proofReq.id);
|
|
32
41
|
const query = circuitQueries[0];
|
|
33
|
-
query.operator =
|
|
42
|
+
query.operator = this.transformV2QueryOperator(query.operator);
|
|
34
43
|
circuitInputs.query = query;
|
|
35
44
|
circuitInputs.claim = {
|
|
36
45
|
issuerID: circuitClaimData.issuerId,
|
|
@@ -77,7 +86,7 @@ class InputGenerator {
|
|
|
77
86
|
circuitInputs.signature = signature;
|
|
78
87
|
circuitInputs.challenge = params.challenge;
|
|
79
88
|
const query = circuitQueries[0];
|
|
80
|
-
query.operator =
|
|
89
|
+
query.operator = this.transformV2QueryOperator(query.operator);
|
|
81
90
|
circuitInputs.query = query;
|
|
82
91
|
circuitInputs.claim = {
|
|
83
92
|
issuerID: circuitClaimData.issuerId,
|
|
@@ -107,7 +116,7 @@ class InputGenerator {
|
|
|
107
116
|
circuitInputs.profileNonce = BigInt(params.authProfileNonce);
|
|
108
117
|
circuitInputs.skipClaimRevocationCheck = params.skipRevocation;
|
|
109
118
|
const query = circuitQueries[0];
|
|
110
|
-
query.operator =
|
|
119
|
+
query.operator = this.transformV2QueryOperator(query.operator);
|
|
111
120
|
circuitInputs.query = query;
|
|
112
121
|
circuitInputs.currentTimeStamp = (0, js_iden3_core_1.getUnixTimestamp)(new Date());
|
|
113
122
|
return circuitInputs.inputsMarshal();
|
|
@@ -134,7 +143,7 @@ class InputGenerator {
|
|
|
134
143
|
circuitInputs.profileNonce = BigInt(params.authProfileNonce);
|
|
135
144
|
circuitInputs.skipClaimRevocationCheck = params.skipRevocation;
|
|
136
145
|
const query = circuitQueries[0];
|
|
137
|
-
query.operator =
|
|
146
|
+
query.operator = this.transformV2QueryOperator(query.operator);
|
|
138
147
|
circuitInputs.query = query;
|
|
139
148
|
circuitInputs.currentTimeStamp = (0, js_iden3_core_1.getUnixTimestamp)(new Date());
|
|
140
149
|
if (authClaimData.treeState) {
|
|
@@ -196,7 +205,10 @@ class InputGenerator {
|
|
|
196
205
|
circuitInputs.profileNonce = BigInt(params.authProfileNonce);
|
|
197
206
|
circuitInputs.skipClaimRevocationCheck = params.skipRevocation;
|
|
198
207
|
const query = circuitQueries[0];
|
|
199
|
-
query.values =
|
|
208
|
+
query.values =
|
|
209
|
+
query.operator === circuits_1.Operators.SD || query.operator === circuits_1.Operators.NOOP
|
|
210
|
+
? new Array(circuits_1.defaultValueArraySize).fill(0)
|
|
211
|
+
: query.values;
|
|
200
212
|
circuitInputs.query = query;
|
|
201
213
|
circuitInputs.currentTimeStamp = (0, js_iden3_core_1.getUnixTimestamp)(new Date());
|
|
202
214
|
circuitInputs.proofType = proofType;
|
|
@@ -244,7 +256,10 @@ class InputGenerator {
|
|
|
244
256
|
circuitInputs.profileNonce = BigInt(params.authProfileNonce);
|
|
245
257
|
circuitInputs.skipClaimRevocationCheck = params.skipRevocation;
|
|
246
258
|
const query = circuitQueries[0];
|
|
247
|
-
query.values =
|
|
259
|
+
query.values =
|
|
260
|
+
query.operator === circuits_1.Operators.SD || query.operator === circuits_1.Operators.NOOP
|
|
261
|
+
? new Array(circuits_1.defaultValueArraySize).fill(0)
|
|
262
|
+
: query.values;
|
|
248
263
|
circuitInputs.query = query;
|
|
249
264
|
circuitInputs.currentTimeStamp = (0, js_iden3_core_1.getUnixTimestamp)(new Date());
|
|
250
265
|
circuitInputs.proofType = proofType;
|
|
@@ -284,28 +299,13 @@ class InputGenerator {
|
|
|
284
299
|
}
|
|
285
300
|
return circuitInputs.inputsMarshal();
|
|
286
301
|
};
|
|
287
|
-
this.
|
|
288
|
-
const circuitClaimData = await this.newCircuitClaimData(preparedCredential);
|
|
289
|
-
circuitClaimData.nonRevProof = (0, common_1.toClaimNonRevStatus)(preparedCredential.revStatus);
|
|
290
|
-
const circuitInputs = new circuits_1.LinkedNullifierInputs();
|
|
291
|
-
circuitInputs.linkNonce = params.linkNonce ?? BigInt(0);
|
|
292
|
-
circuitInputs.issuerClaim = circuitClaimData.claim;
|
|
293
|
-
circuitInputs.id = js_iden3_core_1.DID.idFromDID(identifier);
|
|
294
|
-
circuitInputs.claimSubjectProfileNonce = BigInt(params.credentialSubjectProfileNonce);
|
|
295
|
-
circuitInputs.verifierID = params.verifierDid ? js_iden3_core_1.DID.idFromDID(params.verifierDid) : undefined;
|
|
296
|
-
circuitInputs.nullifierSessionID = proofReq.params?.nullifierSessionID
|
|
297
|
-
? BigInt(proofReq.params?.nullifierSessionID?.toString())
|
|
298
|
-
: BigInt(0);
|
|
299
|
-
return circuitInputs.inputsMarshal();
|
|
300
|
-
};
|
|
301
|
-
this.linkedMultiQuery10PrepareInputs = async ({ preparedCredential, proofReq, params, circuitQueries }) => {
|
|
302
|
+
this.linkedMultiQuery10PrepareInputs = async ({ preparedCredential, params, circuitQueries }) => {
|
|
302
303
|
const circuitClaimData = await this.newCircuitClaimData(preparedCredential);
|
|
303
304
|
circuitClaimData.nonRevProof = (0, common_1.toClaimNonRevStatus)(preparedCredential.revStatus);
|
|
304
305
|
const circuitInputs = new circuits_1.LinkedMultiQueryInputs();
|
|
305
306
|
circuitInputs.linkNonce = params.linkNonce ?? BigInt(0);
|
|
306
307
|
circuitInputs.claim = circuitClaimData.claim;
|
|
307
308
|
circuitInputs.query = circuitQueries;
|
|
308
|
-
circuitInputs.queryLength = circuitValidator[proofReq.circuitId].maxQueriesCount;
|
|
309
309
|
return circuitInputs.inputsMarshal();
|
|
310
310
|
};
|
|
311
311
|
}
|
|
@@ -313,8 +313,8 @@ class InputGenerator {
|
|
|
313
313
|
const { circuitId } = ctx.proofReq;
|
|
314
314
|
const fnName = `${circuitId.split('-')[0]}PrepareInputs`;
|
|
315
315
|
const queriesLength = ctx.circuitQueries.length;
|
|
316
|
-
if (queriesLength > circuitValidator[circuitId].maxQueriesCount) {
|
|
317
|
-
throw new Error(`circuit ${circuitId} supports only ${circuitValidator[circuitId].maxQueriesCount} queries`);
|
|
316
|
+
if (queriesLength > exports.circuitValidator[circuitId].maxQueriesCount) {
|
|
317
|
+
throw new Error(`circuit ${circuitId} supports only ${exports.circuitValidator[circuitId].maxQueriesCount} queries`);
|
|
318
318
|
}
|
|
319
319
|
const fn = this[fnName];
|
|
320
320
|
if (!fn) {
|
|
@@ -389,5 +389,8 @@ class InputGenerator {
|
|
|
389
389
|
coreClaim: authCoreClaim
|
|
390
390
|
};
|
|
391
391
|
}
|
|
392
|
+
transformV2QueryOperator(operator) {
|
|
393
|
+
return operator === circuits_1.Operators.SD || operator === circuits_1.Operators.NOOP ? circuits_1.Operators.EQ : operator;
|
|
394
|
+
}
|
|
392
395
|
}
|
|
393
396
|
exports.InputGenerator = InputGenerator;
|
|
@@ -2,9 +2,9 @@
|
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.NativeProver = void 0;
|
|
4
4
|
const witness_calculator_1 = require("./witness_calculator");
|
|
5
|
-
const utils_1 = require("../utils");
|
|
6
5
|
const snarkjs_1 = require("snarkjs");
|
|
7
6
|
const ffjavascript_1 = require("ffjavascript");
|
|
7
|
+
const utils_1 = require("../../utils");
|
|
8
8
|
/**
|
|
9
9
|
* NativeProver service responsible for zk generation and verification of groth16 algorithm with bn128 curve
|
|
10
10
|
* @public
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __exportStar = (this && this.__exportStar) || function(m, exports) {
|
|
14
|
+
for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
|
|
15
|
+
};
|
|
16
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
17
|
+
__exportStar(require("./pub-signals-verifier"), exports);
|
|
18
|
+
__exportStar(require("./query"), exports);
|
|
@@ -0,0 +1,344 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.PubSignalsVerifier = exports.userStateError = void 0;
|
|
4
|
+
const js_crypto_1 = require("@iden3/js-crypto");
|
|
5
|
+
const js_iden3_core_1 = require("@iden3/js-iden3-core");
|
|
6
|
+
const js_jsonld_merklization_1 = require("@iden3/js-jsonld-merklization");
|
|
7
|
+
const utils_1 = require("../../utils");
|
|
8
|
+
const verifiable_1 = require("../../verifiable");
|
|
9
|
+
const atomic_query_mtp_v2_1 = require("../../circuits/atomic-query-mtp-v2");
|
|
10
|
+
const atomic_query_sig_v2_1 = require("../../circuits/atomic-query-sig-v2");
|
|
11
|
+
const atomic_query_v3_1 = require("../../circuits/atomic-query-v3");
|
|
12
|
+
const auth_v2_1 = require("../../circuits/auth-v2");
|
|
13
|
+
const common_1 = require("../../circuits/common");
|
|
14
|
+
const linked_multi_query_1 = require("../../circuits/linked-multi-query");
|
|
15
|
+
const models_1 = require("../../circuits/models");
|
|
16
|
+
const query_1 = require("./query");
|
|
17
|
+
const common_2 = require("../common");
|
|
18
|
+
exports.userStateError = new Error(`user state is not valid`);
|
|
19
|
+
const zeroInt = 0n;
|
|
20
|
+
const defaultProofVerifyOpts = 1 * 60 * 60 * 1000; // 1 hour
|
|
21
|
+
const defaultAuthVerifyOpts = 5 * 60 * 1000; // 5 minutes
|
|
22
|
+
/**
|
|
23
|
+
* PubSignalsVerifier provides verify method
|
|
24
|
+
* @public
|
|
25
|
+
* @class PubSignalsVerifier
|
|
26
|
+
*/
|
|
27
|
+
class PubSignalsVerifier {
|
|
28
|
+
/**
|
|
29
|
+
* Creates an instance of PubSignalsVerifier.
|
|
30
|
+
* @param {DocumentLoader} _documentLoader document loader
|
|
31
|
+
* @param {IStateStorage} _stateStorage state storage
|
|
32
|
+
*/
|
|
33
|
+
constructor(_documentLoader, _stateStorage) {
|
|
34
|
+
this._documentLoader = _documentLoader;
|
|
35
|
+
this._stateStorage = _stateStorage;
|
|
36
|
+
this.credentialAtomicQueryMTPV2Verify = async ({ query, verifiablePresentation, sender, challenge, pubSignals, opts }) => {
|
|
37
|
+
let mtpv2PubSignals = new atomic_query_mtp_v2_1.AtomicQueryMTPV2PubSignals();
|
|
38
|
+
mtpv2PubSignals = mtpv2PubSignals.pubSignalsUnmarshal(utils_1.byteEncoder.encode(JSON.stringify(pubSignals)));
|
|
39
|
+
if (!mtpv2PubSignals.userID) {
|
|
40
|
+
throw new Error('user id is not presented in proof public signals');
|
|
41
|
+
}
|
|
42
|
+
if (!mtpv2PubSignals.requestID) {
|
|
43
|
+
throw new Error('requestId is not presented in proof public signals');
|
|
44
|
+
}
|
|
45
|
+
this.userId = mtpv2PubSignals.userID;
|
|
46
|
+
this.challenge = mtpv2PubSignals.requestID;
|
|
47
|
+
// verify query
|
|
48
|
+
const outs = {
|
|
49
|
+
issuerId: mtpv2PubSignals.issuerID,
|
|
50
|
+
schemaHash: mtpv2PubSignals.claimSchema,
|
|
51
|
+
slotIndex: mtpv2PubSignals.slotIndex,
|
|
52
|
+
operator: mtpv2PubSignals.operator,
|
|
53
|
+
value: mtpv2PubSignals.value,
|
|
54
|
+
timestamp: mtpv2PubSignals.timestamp,
|
|
55
|
+
merklized: mtpv2PubSignals.merklized,
|
|
56
|
+
claimPathKey: mtpv2PubSignals.claimPathKey,
|
|
57
|
+
claimPathNotExists: mtpv2PubSignals.claimPathNotExists,
|
|
58
|
+
valueArraySize: mtpv2PubSignals.getValueArrSize(),
|
|
59
|
+
isRevocationChecked: mtpv2PubSignals.isRevocationChecked
|
|
60
|
+
};
|
|
61
|
+
await (0, query_1.checkQueryRequest)(query, outs, models_1.CircuitId.AtomicQueryMTPV2, this._documentLoader, verifiablePresentation, opts);
|
|
62
|
+
// verify state
|
|
63
|
+
await this.checkStateExistenceForId(mtpv2PubSignals.issuerID, mtpv2PubSignals.issuerClaimIdenState);
|
|
64
|
+
if (mtpv2PubSignals.isRevocationChecked !== 0) {
|
|
65
|
+
await this.checkRevocationState(mtpv2PubSignals.issuerID, mtpv2PubSignals.issuerClaimNonRevState, opts);
|
|
66
|
+
}
|
|
67
|
+
// verify ID ownership
|
|
68
|
+
this.verifyIdOwnership(sender, challenge);
|
|
69
|
+
return mtpv2PubSignals;
|
|
70
|
+
};
|
|
71
|
+
this.credentialAtomicQuerySigV2Verify = async ({ query, verifiablePresentation, sender, challenge, pubSignals, opts }) => {
|
|
72
|
+
let sigV2PubSignals = new atomic_query_sig_v2_1.AtomicQuerySigV2PubSignals();
|
|
73
|
+
sigV2PubSignals = sigV2PubSignals.pubSignalsUnmarshal(utils_1.byteEncoder.encode(JSON.stringify(pubSignals)));
|
|
74
|
+
this.userId = sigV2PubSignals.userID;
|
|
75
|
+
this.challenge = sigV2PubSignals.requestID;
|
|
76
|
+
// verify query
|
|
77
|
+
const outs = {
|
|
78
|
+
issuerId: sigV2PubSignals.issuerID,
|
|
79
|
+
schemaHash: sigV2PubSignals.claimSchema,
|
|
80
|
+
slotIndex: sigV2PubSignals.slotIndex,
|
|
81
|
+
operator: sigV2PubSignals.operator,
|
|
82
|
+
value: sigV2PubSignals.value,
|
|
83
|
+
timestamp: sigV2PubSignals.timestamp,
|
|
84
|
+
merklized: sigV2PubSignals.merklized,
|
|
85
|
+
claimPathKey: sigV2PubSignals.claimPathKey,
|
|
86
|
+
claimPathNotExists: sigV2PubSignals.claimPathNotExists,
|
|
87
|
+
valueArraySize: sigV2PubSignals.getValueArrSize(),
|
|
88
|
+
isRevocationChecked: sigV2PubSignals.isRevocationChecked
|
|
89
|
+
};
|
|
90
|
+
await (0, query_1.checkQueryRequest)(query, outs, models_1.CircuitId.AtomicQuerySigV2, this._documentLoader, verifiablePresentation, opts);
|
|
91
|
+
// verify state
|
|
92
|
+
await this.checkStateExistenceForId(sigV2PubSignals.issuerID, sigV2PubSignals.issuerAuthState);
|
|
93
|
+
if (sigV2PubSignals.isRevocationChecked !== 0) {
|
|
94
|
+
await this.checkRevocationState(sigV2PubSignals.issuerID, sigV2PubSignals.issuerClaimNonRevState, opts);
|
|
95
|
+
}
|
|
96
|
+
// verify Id ownership
|
|
97
|
+
this.verifyIdOwnership(sender, challenge);
|
|
98
|
+
return sigV2PubSignals;
|
|
99
|
+
};
|
|
100
|
+
this.credentialAtomicQueryV3Verify = async ({ query, verifiablePresentation, sender, challenge, pubSignals, opts, params }) => {
|
|
101
|
+
let v3PubSignals = new atomic_query_v3_1.AtomicQueryV3PubSignals();
|
|
102
|
+
v3PubSignals = v3PubSignals.pubSignalsUnmarshal(utils_1.byteEncoder.encode(JSON.stringify(pubSignals)));
|
|
103
|
+
this.userId = v3PubSignals.userID;
|
|
104
|
+
this.challenge = v3PubSignals.requestID;
|
|
105
|
+
// verify query
|
|
106
|
+
const outs = {
|
|
107
|
+
issuerId: v3PubSignals.issuerID,
|
|
108
|
+
schemaHash: v3PubSignals.claimSchema,
|
|
109
|
+
slotIndex: v3PubSignals.slotIndex,
|
|
110
|
+
operator: v3PubSignals.operator,
|
|
111
|
+
value: v3PubSignals.value,
|
|
112
|
+
timestamp: v3PubSignals.timestamp,
|
|
113
|
+
merklized: v3PubSignals.merklized,
|
|
114
|
+
claimPathKey: v3PubSignals.claimPathKey,
|
|
115
|
+
claimPathNotExists: v3PubSignals.claimPathNotExists,
|
|
116
|
+
valueArraySize: v3PubSignals.getValueArrSize(),
|
|
117
|
+
isRevocationChecked: v3PubSignals.isRevocationChecked
|
|
118
|
+
};
|
|
119
|
+
await (0, query_1.checkQueryRequest)(query, outs, models_1.CircuitId.AtomicQueryV3, this._documentLoader, verifiablePresentation, opts);
|
|
120
|
+
const { proofType, verifierID, nullifier, nullifierSessionID, linkID } = v3PubSignals;
|
|
121
|
+
switch (query.proofType) {
|
|
122
|
+
case verifiable_1.ProofType.BJJSignature:
|
|
123
|
+
if (proofType !== 1) {
|
|
124
|
+
throw new Error('wrong proof type for BJJSignature');
|
|
125
|
+
}
|
|
126
|
+
break;
|
|
127
|
+
case verifiable_1.ProofType.Iden3SparseMerkleTreeProof:
|
|
128
|
+
if (proofType !== 2) {
|
|
129
|
+
throw new Error('wrong proof type for Iden3SparseMerkleTreeProof');
|
|
130
|
+
}
|
|
131
|
+
break;
|
|
132
|
+
default:
|
|
133
|
+
throw new Error('invalid proof type');
|
|
134
|
+
}
|
|
135
|
+
const nSessionId = BigInt(params?.nullifierSessionId ?? 0);
|
|
136
|
+
if (nSessionId !== 0n) {
|
|
137
|
+
if (BigInt(nullifier ?? 0) === 0n) {
|
|
138
|
+
throw new Error('nullifier should be provided for nullification and should not be 0');
|
|
139
|
+
}
|
|
140
|
+
// verify nullifier information
|
|
141
|
+
const verifierDIDParam = params?.verifierDid;
|
|
142
|
+
if (!verifierDIDParam) {
|
|
143
|
+
throw new Error('verifierDid is required');
|
|
144
|
+
}
|
|
145
|
+
const id = js_iden3_core_1.DID.idFromDID(verifierDIDParam);
|
|
146
|
+
if (verifierID.bigInt() != id.bigInt()) {
|
|
147
|
+
throw new Error('wrong verifier is used for nullification');
|
|
148
|
+
}
|
|
149
|
+
if (nullifierSessionID !== nSessionId) {
|
|
150
|
+
throw new Error(`wrong verifier session id is used for nullification, expected ${nSessionId}, got ${nullifierSessionID}`);
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
else if (nullifierSessionID !== 0n) {
|
|
154
|
+
throw new Error(`Nullifier id is generated but wasn't requested`);
|
|
155
|
+
}
|
|
156
|
+
if (!query.groupId && linkID !== 0n) {
|
|
157
|
+
throw new Error(`proof contains link id, but group id is not provided`);
|
|
158
|
+
}
|
|
159
|
+
if (query.groupId && linkID === 0n) {
|
|
160
|
+
throw new Error("proof doesn't contain link id, but group id is provided");
|
|
161
|
+
}
|
|
162
|
+
// verify state
|
|
163
|
+
await this.checkStateExistenceForId(v3PubSignals.issuerID, v3PubSignals.issuerState);
|
|
164
|
+
if (v3PubSignals.isRevocationChecked !== 0) {
|
|
165
|
+
await this.checkRevocationState(v3PubSignals.issuerID, v3PubSignals.issuerClaimNonRevState, opts);
|
|
166
|
+
}
|
|
167
|
+
this.verifyIdOwnership(sender, challenge);
|
|
168
|
+
return v3PubSignals;
|
|
169
|
+
};
|
|
170
|
+
this.authV2Verify = async ({ sender, challenge, pubSignals, opts }) => {
|
|
171
|
+
let authV2PubSignals = new auth_v2_1.AuthV2PubSignals();
|
|
172
|
+
authV2PubSignals = authV2PubSignals.pubSignalsUnmarshal(utils_1.byteEncoder.encode(JSON.stringify(pubSignals)));
|
|
173
|
+
this.userId = authV2PubSignals.userID;
|
|
174
|
+
this.challenge = authV2PubSignals.challenge;
|
|
175
|
+
// no query verification
|
|
176
|
+
// verify state
|
|
177
|
+
const gist = await this.checkGlobalState(authV2PubSignals.GISTRoot);
|
|
178
|
+
let acceptedStateTransitionDelay = defaultAuthVerifyOpts;
|
|
179
|
+
if (opts?.acceptedStateTransitionDelay) {
|
|
180
|
+
acceptedStateTransitionDelay = opts.acceptedStateTransitionDelay;
|
|
181
|
+
}
|
|
182
|
+
if (!gist.latest) {
|
|
183
|
+
const timeDiff = Date.now() - (0, js_iden3_core_1.getDateFromUnixTimestamp)(Number(gist.transitionTimestamp)).getTime();
|
|
184
|
+
if (timeDiff > acceptedStateTransitionDelay) {
|
|
185
|
+
throw new Error('global state is outdated');
|
|
186
|
+
}
|
|
187
|
+
}
|
|
188
|
+
// verify Id ownership
|
|
189
|
+
this.verifyIdOwnership(sender, challenge);
|
|
190
|
+
return new common_1.BaseConfig();
|
|
191
|
+
};
|
|
192
|
+
this.linkedMultiQuery10Verify = async ({ query, pubSignals }) => {
|
|
193
|
+
let multiQueryPubSignals = new linked_multi_query_1.LinkedMultiQueryPubSignals();
|
|
194
|
+
multiQueryPubSignals = multiQueryPubSignals.pubSignalsUnmarshal(utils_1.byteEncoder.encode(JSON.stringify(pubSignals)));
|
|
195
|
+
// verify query
|
|
196
|
+
let schema;
|
|
197
|
+
const ldOpts = { documentLoader: this._documentLoader };
|
|
198
|
+
try {
|
|
199
|
+
schema = (await ldOpts.documentLoader(query.context || '')).document;
|
|
200
|
+
}
|
|
201
|
+
catch (e) {
|
|
202
|
+
throw new Error(`can't load schema for request query`);
|
|
203
|
+
}
|
|
204
|
+
const ldContextJSON = JSON.stringify(schema);
|
|
205
|
+
const credentialSubject = query.credentialSubject;
|
|
206
|
+
const schemaId = await js_jsonld_merklization_1.Path.getTypeIDFromContext(JSON.stringify(schema), query.type || '', ldOpts);
|
|
207
|
+
const schemaHash = (0, verifiable_1.caclulateCoreSchemaHash)(utils_1.byteEncoder.encode(schemaId));
|
|
208
|
+
const queriesMetadata = await (0, common_2.parseQueriesMetadata)(query.type || '', ldContextJSON, credentialSubject, ldOpts);
|
|
209
|
+
const queryHashes = queriesMetadata.map((queryMeta) => {
|
|
210
|
+
const valueHash = js_crypto_1.poseidon.spongeHashX(queryMeta.values, 6);
|
|
211
|
+
return js_crypto_1.poseidon.hash([
|
|
212
|
+
schemaHash.bigInt(),
|
|
213
|
+
BigInt(queryMeta.slotIndex),
|
|
214
|
+
BigInt(queryMeta.operator),
|
|
215
|
+
BigInt(queryMeta.claimPathKey),
|
|
216
|
+
queryMeta.merklizedSchema ? 0n : 1n,
|
|
217
|
+
valueHash
|
|
218
|
+
]);
|
|
219
|
+
});
|
|
220
|
+
const circuitQueryHashes = multiQueryPubSignals.circuitQueryHash
|
|
221
|
+
.filter((i) => i !== 0n)
|
|
222
|
+
.sort(utils_1.bigIntCompare);
|
|
223
|
+
queryHashes.sort(utils_1.bigIntCompare);
|
|
224
|
+
if (!queryHashes.every((queryHash, i) => queryHash === circuitQueryHashes[i])) {
|
|
225
|
+
throw new Error('query hashes do not match');
|
|
226
|
+
}
|
|
227
|
+
return multiQueryPubSignals;
|
|
228
|
+
};
|
|
229
|
+
this.verifyIdOwnership = (sender, challenge) => {
|
|
230
|
+
const senderId = js_iden3_core_1.DID.idFromDID(js_iden3_core_1.DID.parse(sender));
|
|
231
|
+
if (senderId.string() !== this.userId.string()) {
|
|
232
|
+
throw new Error(`sender id is not used for proof creation, expected ${sender}, user from public signals: ${this.userId.string()}`);
|
|
233
|
+
}
|
|
234
|
+
if (challenge !== this.challenge) {
|
|
235
|
+
throw new Error(`challenge is not used for proof creation, expected ${challenge}, challenge from public signals: ${this.challenge} `);
|
|
236
|
+
}
|
|
237
|
+
};
|
|
238
|
+
this.checkStateExistenceForId = async (userId, userState) => {
|
|
239
|
+
const { latest } = await this.resolve(userId, userState.bigInt());
|
|
240
|
+
if (!latest) {
|
|
241
|
+
throw exports.userStateError;
|
|
242
|
+
}
|
|
243
|
+
};
|
|
244
|
+
this.checkGlobalState = async (state) => {
|
|
245
|
+
const gistStateResolved = await this.rootResolve(state.bigInt());
|
|
246
|
+
return gistStateResolved;
|
|
247
|
+
};
|
|
248
|
+
this.checkRevocationStateForId = async (issuerId, issuerClaimNonRevState) => {
|
|
249
|
+
const issuerNonRevStateResolved = await this.resolve(issuerId, issuerClaimNonRevState.bigInt());
|
|
250
|
+
return issuerNonRevStateResolved;
|
|
251
|
+
};
|
|
252
|
+
this.checkRevocationState = async (issuerID, issuerClaimNonRevState, opts) => {
|
|
253
|
+
const issuerNonRevStateResolved = await this.checkRevocationStateForId(issuerID, issuerClaimNonRevState);
|
|
254
|
+
const acceptedStateTransitionDelay = opts?.acceptedStateTransitionDelay ?? defaultProofVerifyOpts;
|
|
255
|
+
if (!issuerNonRevStateResolved.latest) {
|
|
256
|
+
const timeDiff = Date.now() -
|
|
257
|
+
(0, js_iden3_core_1.getDateFromUnixTimestamp)(Number(issuerNonRevStateResolved.transitionTimestamp)).getTime();
|
|
258
|
+
if (timeDiff > acceptedStateTransitionDelay) {
|
|
259
|
+
throw new Error('issuer state is outdated');
|
|
260
|
+
}
|
|
261
|
+
}
|
|
262
|
+
};
|
|
263
|
+
}
|
|
264
|
+
/**
|
|
265
|
+
* verify public signals
|
|
266
|
+
*
|
|
267
|
+
* @param {string} circuitId circuit id
|
|
268
|
+
* @param {VerifyContext} ctx verification parameters
|
|
269
|
+
* @returns `Promise<BaseConfig>`
|
|
270
|
+
*/
|
|
271
|
+
async verify(circuitId, ctx) {
|
|
272
|
+
const fnName = `${circuitId.split('-')[0]}Verify`;
|
|
273
|
+
const fn = this[fnName];
|
|
274
|
+
if (!fn) {
|
|
275
|
+
throw new Error(`public signals verifier for ${circuitId} not found`);
|
|
276
|
+
}
|
|
277
|
+
return fn(ctx);
|
|
278
|
+
}
|
|
279
|
+
async resolve(id, state) {
|
|
280
|
+
const idBigInt = id.bigInt();
|
|
281
|
+
const did = js_iden3_core_1.DID.parseFromId(id);
|
|
282
|
+
// check if id is genesis
|
|
283
|
+
const isGenesis = (0, utils_1.isGenesisState)(did, state);
|
|
284
|
+
let contractState;
|
|
285
|
+
try {
|
|
286
|
+
contractState = await this._stateStorage.getStateInfoByIdAndState(idBigInt, state);
|
|
287
|
+
}
|
|
288
|
+
catch (e) {
|
|
289
|
+
if (e.errorArgs[0] === 'State does not exist') {
|
|
290
|
+
if (isGenesis) {
|
|
291
|
+
return {
|
|
292
|
+
latest: true,
|
|
293
|
+
transitionTimestamp: 0
|
|
294
|
+
};
|
|
295
|
+
}
|
|
296
|
+
throw new Error('State is not genesis and not registered in the smart contract');
|
|
297
|
+
}
|
|
298
|
+
throw e;
|
|
299
|
+
}
|
|
300
|
+
if (!contractState.id || contractState.id.toString() !== idBigInt.toString()) {
|
|
301
|
+
throw new Error(`state was recorded for another identity`);
|
|
302
|
+
}
|
|
303
|
+
if (!contractState.state || contractState.state.toString() !== state.toString()) {
|
|
304
|
+
if (!contractState.replacedAtTimestamp ||
|
|
305
|
+
contractState.replacedAtTimestamp.toString() === zeroInt.toString()) {
|
|
306
|
+
throw new Error(`no information about state transition`);
|
|
307
|
+
}
|
|
308
|
+
return {
|
|
309
|
+
latest: false,
|
|
310
|
+
transitionTimestamp: contractState.replacedAtTimestamp.toString()
|
|
311
|
+
};
|
|
312
|
+
}
|
|
313
|
+
return { latest: true, transitionTimestamp: 0 };
|
|
314
|
+
}
|
|
315
|
+
async rootResolve(state) {
|
|
316
|
+
let globalStateInfo;
|
|
317
|
+
try {
|
|
318
|
+
globalStateInfo = await this._stateStorage.getGISTRootInfo(state);
|
|
319
|
+
}
|
|
320
|
+
catch (e) {
|
|
321
|
+
if (e.errorArgs[0] === 'Root does not exist') {
|
|
322
|
+
throw new Error('GIST root does not exist in the smart contract');
|
|
323
|
+
}
|
|
324
|
+
throw e;
|
|
325
|
+
}
|
|
326
|
+
if (globalStateInfo.root.toString() !== state.toString()) {
|
|
327
|
+
throw new Error(`gist info contains invalid state`);
|
|
328
|
+
}
|
|
329
|
+
if (globalStateInfo.replacedByRoot.toString() !== zeroInt.toString()) {
|
|
330
|
+
if (globalStateInfo.replacedAtTimestamp.toString() === zeroInt.toString()) {
|
|
331
|
+
throw new Error(`state was replaced, but replaced time unknown`);
|
|
332
|
+
}
|
|
333
|
+
return {
|
|
334
|
+
latest: false,
|
|
335
|
+
transitionTimestamp: globalStateInfo.replacedAtTimestamp.toString()
|
|
336
|
+
};
|
|
337
|
+
}
|
|
338
|
+
return {
|
|
339
|
+
latest: true,
|
|
340
|
+
transitionTimestamp: 0
|
|
341
|
+
};
|
|
342
|
+
}
|
|
343
|
+
}
|
|
344
|
+
exports.PubSignalsVerifier = PubSignalsVerifier;
|