@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.
Files changed (108) hide show
  1. package/dist/browser/esm/index.js +13086 -11852
  2. package/dist/browser/esm/index.js.map +1 -1
  3. package/dist/browser/umd/index.js +13115 -11861
  4. package/dist/browser/umd/index.js.map +1 -1
  5. package/dist/node/cjs/circuits/atomic-query-mtp-v2.js +3 -3
  6. package/dist/node/cjs/circuits/atomic-query-sig-v2.js +3 -3
  7. package/dist/node/cjs/circuits/atomic-query-v3.js +18 -13
  8. package/dist/node/cjs/circuits/auth-v2.js +1 -1
  9. package/dist/node/cjs/circuits/index.js +0 -1
  10. package/dist/node/cjs/circuits/linked-multi-query.js +16 -6
  11. package/dist/node/cjs/circuits/models.js +0 -5
  12. package/dist/node/cjs/credentials/credential-wallet.js +1 -3
  13. package/dist/node/cjs/credentials/index.js +1 -0
  14. package/dist/node/cjs/credentials/models.js +2 -0
  15. package/dist/node/cjs/credentials/status/credential-status-publisher.js +23 -4
  16. package/dist/node/cjs/iden3comm/constants.js +3 -1
  17. package/dist/node/cjs/iden3comm/handlers/auth.js +119 -14
  18. package/dist/node/cjs/kms/key-providers/sec256k1-provider.js +5 -2
  19. package/dist/node/cjs/proof/common.js +3 -4
  20. package/dist/node/cjs/proof/index.js +2 -1
  21. package/dist/node/cjs/proof/proof-service.js +22 -2
  22. package/dist/node/cjs/proof/provers/index.js +19 -0
  23. package/dist/node/cjs/proof/{inputs-generator.js → provers/inputs-generator.js} +43 -40
  24. package/dist/node/cjs/proof/{prover.js → provers/prover.js} +1 -1
  25. package/dist/node/cjs/proof/verifiers/index.js +18 -0
  26. package/dist/node/cjs/proof/verifiers/pub-signals-verifier.js +344 -0
  27. package/dist/node/cjs/proof/verifiers/query.js +190 -0
  28. package/dist/node/cjs/schema-processor/json/parser.js +39 -198
  29. package/dist/node/cjs/schema-processor/utils.js +13 -26
  30. package/dist/node/cjs/storage/blockchain/state.js +53 -8
  31. package/dist/node/cjs/storage/filters/jsonQuery.js +2 -2
  32. package/dist/node/cjs/utils/compare-func.js +11 -0
  33. package/dist/node/cjs/utils/index.js +2 -0
  34. package/dist/node/cjs/utils/message-bus.js +73 -0
  35. package/dist/node/cjs/verifiable/core-utils.js +234 -0
  36. package/dist/node/cjs/verifiable/credential.js +139 -1
  37. package/dist/node/cjs/verifiable/index.js +1 -0
  38. package/dist/node/esm/circuits/atomic-query-mtp-v2.js +3 -3
  39. package/dist/node/esm/circuits/atomic-query-sig-v2.js +3 -3
  40. package/dist/node/esm/circuits/atomic-query-v3.js +18 -13
  41. package/dist/node/esm/circuits/auth-v2.js +2 -2
  42. package/dist/node/esm/circuits/index.js +0 -1
  43. package/dist/node/esm/circuits/linked-multi-query.js +16 -6
  44. package/dist/node/esm/circuits/models.js +0 -5
  45. package/dist/node/esm/credentials/credential-wallet.js +1 -3
  46. package/dist/node/esm/credentials/index.js +1 -0
  47. package/dist/node/esm/credentials/models.js +1 -0
  48. package/dist/node/esm/credentials/status/credential-status-publisher.js +23 -4
  49. package/dist/node/esm/iden3comm/constants.js +3 -1
  50. package/dist/node/esm/iden3comm/handlers/auth.js +116 -13
  51. package/dist/node/esm/kms/key-providers/sec256k1-provider.js +5 -2
  52. package/dist/node/esm/proof/common.js +4 -5
  53. package/dist/node/esm/proof/index.js +2 -1
  54. package/dist/node/esm/proof/proof-service.js +22 -2
  55. package/dist/node/esm/proof/provers/index.js +3 -0
  56. package/dist/node/esm/proof/{inputs-generator.js → provers/inputs-generator.js} +40 -37
  57. package/dist/node/esm/proof/{prover.js → provers/prover.js} +1 -1
  58. package/dist/node/esm/proof/verifiers/index.js +2 -0
  59. package/dist/node/esm/proof/verifiers/pub-signals-verifier.js +340 -0
  60. package/dist/node/esm/proof/verifiers/query.js +186 -0
  61. package/dist/node/esm/schema-processor/json/parser.js +40 -199
  62. package/dist/node/esm/schema-processor/utils.js +13 -26
  63. package/dist/node/esm/storage/blockchain/state.js +53 -8
  64. package/dist/node/esm/storage/filters/jsonQuery.js +2 -2
  65. package/dist/node/esm/utils/compare-func.js +7 -0
  66. package/dist/node/esm/utils/index.js +2 -0
  67. package/dist/node/esm/utils/message-bus.js +66 -0
  68. package/dist/node/esm/verifiable/core-utils.js +200 -0
  69. package/dist/node/esm/verifiable/credential.js +118 -3
  70. package/dist/node/esm/verifiable/index.js +1 -0
  71. package/dist/types/circuits/index.d.ts +0 -1
  72. package/dist/types/circuits/linked-multi-query.d.ts +3 -3
  73. package/dist/types/circuits/models.d.ts +0 -4
  74. package/dist/types/credentials/credential-wallet.d.ts +2 -60
  75. package/dist/types/credentials/index.d.ts +1 -0
  76. package/dist/types/credentials/models.d.ts +68 -0
  77. package/dist/types/credentials/status/credential-status-publisher.d.ts +2 -0
  78. package/dist/types/iden3comm/constants.d.ts +1 -0
  79. package/dist/types/iden3comm/handlers/auth.d.ts +53 -13
  80. package/dist/types/iden3comm/types/protocol/credentials.d.ts +16 -0
  81. package/dist/types/identity/identity-wallet.d.ts +3 -1
  82. package/dist/types/kms/key-providers/sec256k1-provider.d.ts +1 -1
  83. package/dist/types/proof/index.d.ts +2 -1
  84. package/dist/types/proof/proof-service.d.ts +28 -3
  85. package/dist/types/proof/provers/index.d.ts +3 -0
  86. package/dist/types/proof/{inputs-generator.d.ts → provers/inputs-generator.d.ts} +15 -9
  87. package/dist/types/proof/{prover.d.ts → provers/prover.d.ts} +2 -2
  88. package/dist/types/proof/verifiers/index.d.ts +2 -0
  89. package/dist/types/proof/verifiers/pub-signals-verifier.d.ts +58 -0
  90. package/dist/types/proof/verifiers/query.d.ts +25 -0
  91. package/dist/types/schema-processor/json/parser.d.ts +47 -28
  92. package/dist/types/schema-processor/utils.d.ts +9 -4
  93. package/dist/types/storage/blockchain/state.d.ts +5 -1
  94. package/dist/types/storage/interfaces/state.d.ts +8 -0
  95. package/dist/types/utils/compare-func.d.ts +1 -0
  96. package/dist/types/utils/index.d.ts +2 -0
  97. package/dist/types/utils/message-bus.d.ts +62 -0
  98. package/dist/types/verifiable/core-utils.d.ts +84 -0
  99. package/dist/types/verifiable/credential.d.ts +11 -1
  100. package/dist/types/verifiable/index.d.ts +1 -0
  101. package/dist/types/verifiable/proof.d.ts +4 -0
  102. package/package.json +10 -10
  103. package/dist/node/cjs/circuits/linked-nullifier.js +0 -57
  104. package/dist/node/esm/circuits/linked-nullifier.js +0 -52
  105. package/dist/types/circuits/linked-nullifier.d.ts +0 -37
  106. /package/dist/node/cjs/proof/{witness_calculator.js → provers/witness_calculator.js} +0 -0
  107. /package/dist/node/esm/proof/{witness_calculator.js → provers/witness_calculator.js} +0 -0
  108. /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("../verifiable");
6
- const circuits_1 = require("../circuits");
7
- const common_1 = require("./common");
8
- const credentials_1 = require("../credentials");
9
- const circuitValidator = {
10
- [circuits_1.CircuitId.AtomicQueryMTPV2]: { maxQueriesCount: 1 },
11
- [circuits_1.CircuitId.AtomicQueryMTPV2OnChain]: { maxQueriesCount: 1 },
12
- [circuits_1.CircuitId.AtomicQuerySigV2]: { maxQueriesCount: 1 },
13
- [circuits_1.CircuitId.AtomicQuerySigV2OnChain]: { maxQueriesCount: 1 },
14
- [circuits_1.CircuitId.AtomicQueryV3]: { maxQueriesCount: 1 },
15
- [circuits_1.CircuitId.AtomicQueryV3OnChain]: { maxQueriesCount: 1 },
16
- [circuits_1.CircuitId.AuthV2]: { maxQueriesCount: 0 },
17
- [circuits_1.CircuitId.StateTransition]: { maxQueriesCount: 0 },
18
- [circuits_1.CircuitId.LinkedNullifier]: { maxQueriesCount: 1 },
19
- [circuits_1.CircuitId.LinkedMultiQuery10]: { maxQueriesCount: 10 }
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 = query.operator === circuits_1.Operators.SD ? circuits_1.Operators.EQ : 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 = query.operator === circuits_1.Operators.SD ? circuits_1.Operators.EQ : 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 = query.operator === circuits_1.Operators.SD ? circuits_1.Operators.EQ : 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 = query.operator === circuits_1.Operators.SD ? circuits_1.Operators.EQ : 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 = query.operator === circuits_1.Operators.SD ? new Array(64).fill(0) : 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 = query.operator === circuits_1.Operators.SD ? new Array(64).fill(0) : 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.linkedNullifierPrepareInputs = async ({ preparedCredential, identifier, proofReq, params }) => {
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;