@0xpolygonid/js-sdk 1.14.0 → 1.15.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/README.md +0 -4
- package/dist/browser/esm/index.js +3484 -3456
- package/dist/browser/esm/index.js.map +1 -1
- package/dist/browser/umd/index.js +3507 -3479
- package/dist/browser/umd/index.js.map +1 -1
- package/dist/node/cjs/iden3comm/constants.js +3 -1
- package/dist/node/cjs/iden3comm/handlers/credential-proposal.js +11 -8
- package/dist/node/cjs/iden3comm/handlers/message-handler.js +14 -3
- package/dist/node/cjs/iden3comm/handlers/payment.js +4 -4
- package/dist/node/cjs/iden3comm/packers/zkp.js +23 -16
- package/dist/node/cjs/iden3comm/types/index.js +1 -0
- package/dist/node/cjs/iden3comm/types/models.js +2 -0
- package/dist/node/cjs/identity/identity-wallet.js +3 -0
- package/dist/node/cjs/proof/proof-service.js +16 -12
- package/dist/node/cjs/proof/verifiers/pub-signals-verifier.js +4 -5
- package/dist/node/esm/iden3comm/constants.js +2 -0
- package/dist/node/esm/iden3comm/handlers/credential-proposal.js +7 -4
- package/dist/node/esm/iden3comm/handlers/message-handler.js +14 -3
- package/dist/node/esm/iden3comm/handlers/payment.js +4 -4
- package/dist/node/esm/iden3comm/packers/zkp.js +24 -17
- package/dist/node/esm/iden3comm/types/index.js +1 -0
- package/dist/node/esm/iden3comm/types/models.js +1 -0
- package/dist/node/esm/identity/identity-wallet.js +3 -0
- package/dist/node/esm/proof/proof-service.js +18 -14
- package/dist/node/esm/proof/verifiers/pub-signals-verifier.js +4 -5
- package/dist/types/iden3comm/constants.d.ts +2 -0
- package/dist/types/iden3comm/handlers/auth.d.ts +3 -5
- package/dist/types/iden3comm/handlers/message-handler.d.ts +2 -0
- package/dist/types/iden3comm/packers/zkp.d.ts +6 -5
- package/dist/types/iden3comm/types/index.d.ts +1 -0
- package/dist/types/iden3comm/types/models.d.ts +6 -0
- package/dist/types/iden3comm/types/packer.d.ts +2 -1
- package/dist/types/iden3comm/types/protocol/payment.d.ts +5 -5
- package/dist/types/identity/identity-wallet.d.ts +8 -0
- package/dist/types/proof/proof-service.d.ts +2 -2
- package/dist/types/proof/verifiers/pub-signals-verifier.d.ts +1 -1
- package/package.json +1 -1
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.SUPPORTED_PUBLIC_KEY_TYPES = exports.MediaType = exports.PROTOCOL_MESSAGE_TYPE = void 0;
|
|
3
|
+
exports.DEFAULT_AUTH_VERIFY_DELAY = exports.DEFAULT_PROOF_VERIFY_DELAY = exports.SUPPORTED_PUBLIC_KEY_TYPES = exports.MediaType = exports.PROTOCOL_MESSAGE_TYPE = void 0;
|
|
4
4
|
const IDEN3_PROTOCOL = 'https://iden3-communication.io/';
|
|
5
5
|
/**
|
|
6
6
|
* Constants for Iden3 protocol
|
|
@@ -74,3 +74,5 @@ exports.SUPPORTED_PUBLIC_KEY_TYPES = {
|
|
|
74
74
|
'JsonWebKey2020'
|
|
75
75
|
]
|
|
76
76
|
};
|
|
77
|
+
exports.DEFAULT_PROOF_VERIFY_DELAY = 1 * 60 * 60 * 1000; // 1 hour
|
|
78
|
+
exports.DEFAULT_AUTH_VERIFY_DELAY = 5 * 60 * 1000; // 5 minutes
|
|
@@ -25,7 +25,6 @@ var __importStar = (this && this.__importStar) || function (mod) {
|
|
|
25
25
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
26
26
|
exports.CredentialProposalHandler = exports.createProposal = exports.createProposalRequest = void 0;
|
|
27
27
|
const constants_1 = require("../constants");
|
|
28
|
-
const constants_2 = require("../constants");
|
|
29
28
|
const js_iden3_core_1 = require("@iden3/js-iden3-core");
|
|
30
29
|
const uuid = __importStar(require("uuid"));
|
|
31
30
|
const js_jwz_1 = require("@iden3/js-jwz");
|
|
@@ -46,7 +45,7 @@ function createProposalRequest(sender, receiver, opts) {
|
|
|
46
45
|
thid: uuidv4,
|
|
47
46
|
from: sender.string(),
|
|
48
47
|
to: receiver.string(),
|
|
49
|
-
typ:
|
|
48
|
+
typ: constants_1.MediaType.PlainMessage,
|
|
50
49
|
type: constants_1.PROTOCOL_MESSAGE_TYPE.PROPOSAL_REQUEST_MESSAGE_TYPE,
|
|
51
50
|
body: opts
|
|
52
51
|
};
|
|
@@ -68,7 +67,7 @@ function createProposal(sender, receiver, proposals) {
|
|
|
68
67
|
thid: uuidv4,
|
|
69
68
|
from: sender.string(),
|
|
70
69
|
to: receiver.string(),
|
|
71
|
-
typ:
|
|
70
|
+
typ: constants_1.MediaType.PlainMessage,
|
|
72
71
|
type: constants_1.PROTOCOL_MESSAGE_TYPE.PROPOSAL_MESSAGE_TYPE,
|
|
73
72
|
body: {
|
|
74
73
|
proposals: proposals || []
|
|
@@ -129,7 +128,6 @@ class CredentialProposalHandler extends message_handler_1.AbstractMessageHandler
|
|
|
129
128
|
if (!proposalRequest.body?.credentials?.length) {
|
|
130
129
|
throw new Error(`failed request. no 'credentials' in body`);
|
|
131
130
|
}
|
|
132
|
-
const senderDID = js_iden3_core_1.DID.parse(proposalRequest.from);
|
|
133
131
|
let credOfferMessage = undefined;
|
|
134
132
|
let proposalMessage = undefined;
|
|
135
133
|
for (let i = 0; i < proposalRequest.body.credentials.length; i++) {
|
|
@@ -137,7 +135,12 @@ class CredentialProposalHandler extends message_handler_1.AbstractMessageHandler
|
|
|
137
135
|
// check if there is credentials in the wallet
|
|
138
136
|
let credsFromWallet = [];
|
|
139
137
|
try {
|
|
140
|
-
credsFromWallet = await this._identityWallet.
|
|
138
|
+
credsFromWallet = await this._identityWallet.credentialWallet.findByQuery({
|
|
139
|
+
credentialSubject: {
|
|
140
|
+
id: {
|
|
141
|
+
$eq: proposalRequest.from
|
|
142
|
+
}
|
|
143
|
+
},
|
|
141
144
|
type: cred.type,
|
|
142
145
|
context: cred.context
|
|
143
146
|
});
|
|
@@ -198,9 +201,9 @@ class CredentialProposalHandler extends message_handler_1.AbstractMessageHandler
|
|
|
198
201
|
async handleProposalRequest(request,
|
|
199
202
|
//eslint-disable-next-line @typescript-eslint/no-unused-vars
|
|
200
203
|
opts) {
|
|
201
|
-
if (this._params.packerParams.mediaType ===
|
|
204
|
+
if (this._params.packerParams.mediaType === constants_1.MediaType.SignedMessage &&
|
|
202
205
|
!this._params.packerParams.packerOptions) {
|
|
203
|
-
throw new Error(`jws packer options are required for ${
|
|
206
|
+
throw new Error(`jws packer options are required for ${constants_1.MediaType.SignedMessage}`);
|
|
204
207
|
}
|
|
205
208
|
const proposalRequest = await this.parseProposalRequest(request);
|
|
206
209
|
if (!proposalRequest.from) {
|
|
@@ -209,7 +212,7 @@ class CredentialProposalHandler extends message_handler_1.AbstractMessageHandler
|
|
|
209
212
|
const senderDID = js_iden3_core_1.DID.parse(proposalRequest.from);
|
|
210
213
|
const message = await this.handleProposalRequestMessage(proposalRequest);
|
|
211
214
|
const response = utils_1.byteEncoder.encode(JSON.stringify(message));
|
|
212
|
-
const packerOpts = this._params.packerParams.mediaType ===
|
|
215
|
+
const packerOpts = this._params.packerParams.mediaType === constants_1.MediaType.SignedMessage
|
|
213
216
|
? this._params.packerParams.packerOptions
|
|
214
217
|
: {
|
|
215
218
|
provingMethodAlg: js_jwz_1.proving.provingMethodGroth16AuthV2Instance.methodAlg
|
|
@@ -1,6 +1,8 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.MessageHandler = exports.AbstractMessageHandler = void 0;
|
|
4
|
+
const constants_1 = require("../constants");
|
|
5
|
+
const js_jwz_1 = require("@iden3/js-jwz");
|
|
4
6
|
/**
|
|
5
7
|
* Base implementation of protocol message handler
|
|
6
8
|
*
|
|
@@ -87,10 +89,19 @@ class MessageHandler {
|
|
|
87
89
|
return Promise.reject(new Error('Message handler not provided'));
|
|
88
90
|
}
|
|
89
91
|
const response = await this.messageHandler.handle(message, context);
|
|
90
|
-
if (response) {
|
|
91
|
-
return
|
|
92
|
+
if (!response) {
|
|
93
|
+
return null;
|
|
92
94
|
}
|
|
93
|
-
|
|
95
|
+
let packerParams = {};
|
|
96
|
+
const senderDID = context?.senderDID;
|
|
97
|
+
if (unpackedMediaType === constants_1.MediaType.ZKPMessage && senderDID) {
|
|
98
|
+
packerParams = {
|
|
99
|
+
senderDID,
|
|
100
|
+
provingMethodAlg: js_jwz_1.proving.provingMethodGroth16AuthV2Instance.methodAlg
|
|
101
|
+
};
|
|
102
|
+
return this._params.packageManager.packMessage(unpackedMediaType, response, packerParams);
|
|
103
|
+
}
|
|
104
|
+
return this._params.packageManager.packMessage(constants_1.MediaType.PlainMessage, response, packerParams);
|
|
94
105
|
}
|
|
95
106
|
}
|
|
96
107
|
exports.MessageHandler = MessageHandler;
|
|
@@ -130,7 +130,7 @@ class PaymentHandler extends message_handler_1.AbstractMessageHandler {
|
|
|
130
130
|
if (!paymentRequest.from) {
|
|
131
131
|
throw new Error(`failed request. empty 'from' field`);
|
|
132
132
|
}
|
|
133
|
-
if (!paymentRequest.body
|
|
133
|
+
if (!paymentRequest.body.payments?.length) {
|
|
134
134
|
throw new Error(`failed request. no 'payments' in body`);
|
|
135
135
|
}
|
|
136
136
|
if (!ctx.paymentHandler) {
|
|
@@ -201,12 +201,12 @@ class PaymentHandler extends message_handler_1.AbstractMessageHandler {
|
|
|
201
201
|
if (opts.paymentRequest.from !== payment.to) {
|
|
202
202
|
throw new Error(`sender of the request is not a target of response - expected ${opts.paymentRequest.from}, given ${payment.to}`);
|
|
203
203
|
}
|
|
204
|
-
if (!payment.body
|
|
204
|
+
if (!payment.body.payments.length) {
|
|
205
205
|
throw new Error(`failed request. empty 'payments' field in body`);
|
|
206
206
|
}
|
|
207
207
|
for (let i = 0; i < payment.body.payments.length; i++) {
|
|
208
|
-
const p = payment.body
|
|
209
|
-
const paymentRequestData = opts.paymentRequest.body
|
|
208
|
+
const p = payment.body.payments[i];
|
|
209
|
+
const paymentRequestData = opts.paymentRequest.body.payments.find((r) => r.data.id === p.id);
|
|
210
210
|
if (!paymentRequestData) {
|
|
211
211
|
throw new Error(`can't find payment request for payment id ${p.id}`);
|
|
212
212
|
}
|
|
@@ -8,6 +8,7 @@ const envelope_1 = require("../utils/envelope");
|
|
|
8
8
|
const errors_1 = require("../errors");
|
|
9
9
|
const constants_1 = require("../constants");
|
|
10
10
|
const utils_1 = require("../../utils");
|
|
11
|
+
const constants_2 = require("../constants");
|
|
11
12
|
const { getProvingMethod } = js_jwz_1.proving;
|
|
12
13
|
/**
|
|
13
14
|
* Handler to
|
|
@@ -57,8 +58,8 @@ class VerificationHandlerFunc {
|
|
|
57
58
|
* @param {Array<string>} pubSignals - signals that must contain user id and state
|
|
58
59
|
* @returns `Promise<boolean>`
|
|
59
60
|
*/
|
|
60
|
-
verify(id, pubSignals) {
|
|
61
|
-
return this.stateVerificationFunc(id, pubSignals);
|
|
61
|
+
verify(id, pubSignals, opts) {
|
|
62
|
+
return this.stateVerificationFunc(id, pubSignals, opts);
|
|
62
63
|
}
|
|
63
64
|
}
|
|
64
65
|
exports.VerificationHandlerFunc = VerificationHandlerFunc;
|
|
@@ -75,9 +76,12 @@ class ZKPPacker {
|
|
|
75
76
|
* @param {Map<string, ProvingParams>} provingParamsMap - string is derived by JSON.parse(ProvingMethodAlg)
|
|
76
77
|
* @param {Map<string, VerificationParams>} verificationParamsMap - string is derived by JSON.parse(ProvingMethodAlg)
|
|
77
78
|
*/
|
|
78
|
-
constructor(provingParamsMap, verificationParamsMap
|
|
79
|
+
constructor(provingParamsMap, verificationParamsMap, _opts = {
|
|
80
|
+
acceptedStateTransitionDelay: constants_2.DEFAULT_AUTH_VERIFY_DELAY
|
|
81
|
+
}) {
|
|
79
82
|
this.provingParamsMap = provingParamsMap;
|
|
80
83
|
this.verificationParamsMap = verificationParamsMap;
|
|
84
|
+
this._opts = _opts;
|
|
81
85
|
}
|
|
82
86
|
/**
|
|
83
87
|
* Packs a basic message using the specified parameters.
|
|
@@ -125,7 +129,7 @@ class ZKPPacker {
|
|
|
125
129
|
if (!isValid) {
|
|
126
130
|
throw new Error(errors_1.ErrProofIsInvalid);
|
|
127
131
|
}
|
|
128
|
-
const verificationResult = await verificationParams?.verificationFn?.verify(token.circuitId, token.zkProof.pub_signals);
|
|
132
|
+
const verificationResult = await verificationParams?.verificationFn?.verify(token.circuitId, token.zkProof.pub_signals, this._opts);
|
|
129
133
|
if (!verificationResult) {
|
|
130
134
|
throw new Error(errors_1.ErrStateVerificationFailed);
|
|
131
135
|
}
|
|
@@ -139,23 +143,26 @@ class ZKPPacker {
|
|
|
139
143
|
}
|
|
140
144
|
}
|
|
141
145
|
exports.ZKPPacker = ZKPPacker;
|
|
142
|
-
const verifySender = (token, msg) => {
|
|
146
|
+
const verifySender = async (token, msg) => {
|
|
143
147
|
switch (token.circuitId) {
|
|
144
148
|
case index_1.CircuitId.AuthV2:
|
|
145
|
-
|
|
146
|
-
|
|
149
|
+
{
|
|
150
|
+
if (!msg.from) {
|
|
151
|
+
throw new Error(errors_1.ErrSenderNotUsedTokenCreation);
|
|
152
|
+
}
|
|
153
|
+
const authSignals = new index_1.AuthV2PubSignals().pubSignalsUnmarshal(utils_1.byteEncoder.encode(JSON.stringify(token.zkProof.pub_signals)));
|
|
154
|
+
const did = js_iden3_core_1.DID.parseFromId(authSignals.userID);
|
|
155
|
+
const msgHash = await token.getMessageHash();
|
|
156
|
+
const challenge = js_iden3_core_1.BytesHelper.bytesToInt(msgHash.reverse());
|
|
157
|
+
if (challenge !== authSignals.challenge) {
|
|
158
|
+
throw new Error(errors_1.ErrSenderNotUsedTokenCreation);
|
|
159
|
+
}
|
|
160
|
+
if (msg.from !== did.string()) {
|
|
161
|
+
throw new Error(errors_1.ErrSenderNotUsedTokenCreation);
|
|
162
|
+
}
|
|
147
163
|
}
|
|
148
164
|
break;
|
|
149
165
|
default:
|
|
150
166
|
throw new Error(errors_1.ErrUnknownCircuitID);
|
|
151
167
|
}
|
|
152
168
|
};
|
|
153
|
-
const verifyAuthV2Sender = (from, pubSignals) => {
|
|
154
|
-
const authSignals = new index_1.AuthV2PubSignals();
|
|
155
|
-
const pubSig = authSignals.pubSignalsUnmarshal(utils_1.byteEncoder.encode(JSON.stringify(pubSignals)));
|
|
156
|
-
return pubSig.userID ? checkSender(from, pubSig.userID) : false;
|
|
157
|
-
};
|
|
158
|
-
const checkSender = (from, id) => {
|
|
159
|
-
const did = js_iden3_core_1.DID.parseFromId(id);
|
|
160
|
-
return from === did.string();
|
|
161
|
-
};
|
|
@@ -23,4 +23,5 @@ __exportStar(require("./protocol/contract-request"), exports);
|
|
|
23
23
|
__exportStar(require("./protocol/proposal-request"), exports);
|
|
24
24
|
__exportStar(require("./protocol/payment"), exports);
|
|
25
25
|
__exportStar(require("./packer"), exports);
|
|
26
|
+
__exportStar(require("./models"), exports);
|
|
26
27
|
__exportStar(require("./packageManager"), exports);
|
|
@@ -68,6 +68,9 @@ class IdentityWallet {
|
|
|
68
68
|
this._inputsGenerator = new proof_1.InputGenerator(this, _credentialWallet, _storage.states);
|
|
69
69
|
this._transactionService = new blockchain_1.TransactionService(_storage.states.getRpcProvider());
|
|
70
70
|
}
|
|
71
|
+
get credentialWallet() {
|
|
72
|
+
return this._credentialWallet;
|
|
73
|
+
}
|
|
71
74
|
getCredentialStatusPublisherRegistry(_opts) {
|
|
72
75
|
if (!_opts?.credentialStatusPublisherRegistry) {
|
|
73
76
|
const registry = new credential_status_publisher_1.CredentialStatusPublisherRegistry();
|
|
@@ -2,12 +2,12 @@
|
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.ProofService = void 0;
|
|
4
4
|
const js_iden3_core_1 = require("@iden3/js-iden3-core");
|
|
5
|
-
const js_merkletree_1 = require("@iden3/js-merkletree");
|
|
6
5
|
const circuits_1 = require("../circuits");
|
|
7
6
|
const verifiable_1 = require("../verifiable");
|
|
8
7
|
const common_1 = require("./common");
|
|
9
8
|
const prover_1 = require("./provers/prover");
|
|
10
9
|
const js_jsonld_merklization_1 = require("@iden3/js-jsonld-merklization");
|
|
10
|
+
const iden3comm_1 = require("../iden3comm");
|
|
11
11
|
const schema_processor_1 = require("../schema-processor");
|
|
12
12
|
const encoding_1 = require("../utils/encoding");
|
|
13
13
|
const inputs_generator_1 = require("./provers/inputs-generator");
|
|
@@ -200,10 +200,6 @@ class ProofService {
|
|
|
200
200
|
const { nonce: authProfileNonce, genesisDID } = await this._identityWallet.getGenesisDIDMetadata(did);
|
|
201
201
|
const challenge = js_iden3_core_1.BytesHelper.bytesToInt(hash.reverse());
|
|
202
202
|
const authPrepared = await this._inputsGenerator.prepareAuthBJJCredential(genesisDID);
|
|
203
|
-
const authClaimData = await this._inputsGenerator.newCircuitClaimData({
|
|
204
|
-
credential: authPrepared.credential,
|
|
205
|
-
credentialCoreClaim: authPrepared.coreClaim
|
|
206
|
-
});
|
|
207
203
|
const signature = await this._identityWallet.signChallenge(challenge, authPrepared.credential);
|
|
208
204
|
const id = js_iden3_core_1.DID.idFromDID(genesisDID);
|
|
209
205
|
const stateProof = await this._stateStorage.getGISTProof(id.bigInt());
|
|
@@ -211,21 +207,24 @@ class ProofService {
|
|
|
211
207
|
const authInputs = new circuits_1.AuthV2Inputs();
|
|
212
208
|
authInputs.genesisID = id;
|
|
213
209
|
authInputs.profileNonce = BigInt(authProfileNonce);
|
|
214
|
-
authInputs.authClaim =
|
|
215
|
-
authInputs.authClaimIncMtp =
|
|
210
|
+
authInputs.authClaim = authPrepared.coreClaim;
|
|
211
|
+
authInputs.authClaimIncMtp = authPrepared.incProof.proof;
|
|
216
212
|
authInputs.authClaimNonRevMtp = authPrepared.nonRevProof.proof;
|
|
217
|
-
authInputs.treeState =
|
|
213
|
+
authInputs.treeState = authPrepared.incProof.treeState;
|
|
218
214
|
authInputs.signature = signature;
|
|
219
215
|
authInputs.challenge = challenge;
|
|
220
216
|
authInputs.gistProof = gistProof;
|
|
221
217
|
return authInputs.inputsMarshal();
|
|
222
218
|
}
|
|
223
|
-
async verifyState(circuitId, pubSignals
|
|
219
|
+
async verifyState(circuitId, pubSignals, opts = {
|
|
220
|
+
acceptedStateTransitionDelay: iden3comm_1.PROTOCOL_CONSTANTS.DEFAULT_AUTH_VERIFY_DELAY
|
|
221
|
+
}) {
|
|
224
222
|
if (circuitId !== circuits_1.CircuitId.AuthV2) {
|
|
225
223
|
throw new Error(`CircuitId is not supported ${circuitId}`);
|
|
226
224
|
}
|
|
227
|
-
const
|
|
228
|
-
const
|
|
225
|
+
const authV2PubSignals = new circuits_1.AuthV2PubSignals().pubSignalsUnmarshal(encoding_1.byteEncoder.encode(JSON.stringify(pubSignals)));
|
|
226
|
+
const gistRoot = authV2PubSignals.GISTRoot.bigInt();
|
|
227
|
+
const userId = authV2PubSignals.userID.bigInt();
|
|
229
228
|
const globalStateInfo = await this._stateStorage.getGISTRootInfo(gistRoot, userId);
|
|
230
229
|
if (globalStateInfo.createdAtTimestamp === 0n) {
|
|
231
230
|
throw new Error(`gist state doesn't exists in contract`);
|
|
@@ -237,7 +236,12 @@ class ProofService {
|
|
|
237
236
|
if (globalStateInfo.replacedAtTimestamp === 0n) {
|
|
238
237
|
throw new Error(`state was replaced, but replaced time unknown`);
|
|
239
238
|
}
|
|
240
|
-
|
|
239
|
+
const timeDiff = Date.now() -
|
|
240
|
+
(0, js_iden3_core_1.getDateFromUnixTimestamp)(Number(globalStateInfo.replacedAtTimestamp)).getTime();
|
|
241
|
+
if (timeDiff >
|
|
242
|
+
(opts?.acceptedStateTransitionDelay ?? iden3comm_1.PROTOCOL_CONSTANTS.DEFAULT_AUTH_VERIFY_DELAY)) {
|
|
243
|
+
throw new Error('global state is outdated');
|
|
244
|
+
}
|
|
241
245
|
}
|
|
242
246
|
return true;
|
|
243
247
|
}
|
|
@@ -16,10 +16,9 @@ const query_1 = require("./query");
|
|
|
16
16
|
const common_2 = require("../common");
|
|
17
17
|
const circuits_1 = require("../../circuits");
|
|
18
18
|
const query_hash_1 = require("./query-hash");
|
|
19
|
+
const iden3comm_1 = require("../../iden3comm");
|
|
19
20
|
exports.userStateError = new Error(`user state is not valid`);
|
|
20
21
|
const zeroInt = 0n;
|
|
21
|
-
const defaultProofVerifyOpts = 1 * 60 * 60 * 1000; // 1 hour
|
|
22
|
-
const defaultAuthVerifyOpts = 5 * 60 * 1000; // 5 minutes
|
|
23
22
|
/**
|
|
24
23
|
* PubSignalsVerifier provides verify method
|
|
25
24
|
* @public
|
|
@@ -221,7 +220,7 @@ class PubSignalsVerifier {
|
|
|
221
220
|
// no query verification
|
|
222
221
|
// verify state
|
|
223
222
|
const gist = await this.checkGlobalState(authV2PubSignals.GISTRoot, this.userId);
|
|
224
|
-
let acceptedStateTransitionDelay =
|
|
223
|
+
let acceptedStateTransitionDelay = iden3comm_1.PROTOCOL_CONSTANTS.DEFAULT_AUTH_VERIFY_DELAY;
|
|
225
224
|
if (opts?.acceptedStateTransitionDelay) {
|
|
226
225
|
acceptedStateTransitionDelay = opts.acceptedStateTransitionDelay;
|
|
227
226
|
}
|
|
@@ -308,7 +307,7 @@ class PubSignalsVerifier {
|
|
|
308
307
|
};
|
|
309
308
|
this.checkRevocationState = async (issuerID, issuerClaimNonRevState, opts) => {
|
|
310
309
|
const issuerNonRevStateResolved = await this.checkRevocationStateForId(issuerID, issuerClaimNonRevState);
|
|
311
|
-
const acceptedStateTransitionDelay = opts?.acceptedStateTransitionDelay ??
|
|
310
|
+
const acceptedStateTransitionDelay = opts?.acceptedStateTransitionDelay ?? iden3comm_1.PROTOCOL_CONSTANTS.DEFAULT_PROOF_VERIFY_DELAY;
|
|
312
311
|
if (!issuerNonRevStateResolved.latest) {
|
|
313
312
|
const timeDiff = Date.now() -
|
|
314
313
|
(0, js_iden3_core_1.getDateFromUnixTimestamp)(Number(issuerNonRevStateResolved.transitionTimestamp)).getTime();
|
|
@@ -392,7 +391,7 @@ class PubSignalsVerifier {
|
|
|
392
391
|
catch (e) {
|
|
393
392
|
const stateNotExistErr = (e?.errorArgs ?? [])[0];
|
|
394
393
|
const errMsg = stateNotExistErr || e.message;
|
|
395
|
-
if (errMsg
|
|
394
|
+
if (errMsg.includes('State does not exist')) {
|
|
396
395
|
if (isGenesis) {
|
|
397
396
|
return {
|
|
398
397
|
latest: true,
|
|
@@ -1,5 +1,4 @@
|
|
|
1
|
-
import { PROTOCOL_MESSAGE_TYPE } from '../constants';
|
|
2
|
-
import { MediaType } from '../constants';
|
|
1
|
+
import { PROTOCOL_MESSAGE_TYPE, MediaType } from '../constants';
|
|
3
2
|
import { DID } from '@iden3/js-iden3-core';
|
|
4
3
|
import * as uuid from 'uuid';
|
|
5
4
|
import { proving } from '@iden3/js-jwz';
|
|
@@ -101,7 +100,6 @@ export class CredentialProposalHandler extends AbstractMessageHandler {
|
|
|
101
100
|
if (!proposalRequest.body?.credentials?.length) {
|
|
102
101
|
throw new Error(`failed request. no 'credentials' in body`);
|
|
103
102
|
}
|
|
104
|
-
const senderDID = DID.parse(proposalRequest.from);
|
|
105
103
|
let credOfferMessage = undefined;
|
|
106
104
|
let proposalMessage = undefined;
|
|
107
105
|
for (let i = 0; i < proposalRequest.body.credentials.length; i++) {
|
|
@@ -109,7 +107,12 @@ export class CredentialProposalHandler extends AbstractMessageHandler {
|
|
|
109
107
|
// check if there is credentials in the wallet
|
|
110
108
|
let credsFromWallet = [];
|
|
111
109
|
try {
|
|
112
|
-
credsFromWallet = await this._identityWallet.
|
|
110
|
+
credsFromWallet = await this._identityWallet.credentialWallet.findByQuery({
|
|
111
|
+
credentialSubject: {
|
|
112
|
+
id: {
|
|
113
|
+
$eq: proposalRequest.from
|
|
114
|
+
}
|
|
115
|
+
},
|
|
113
116
|
type: cred.type,
|
|
114
117
|
context: cred.context
|
|
115
118
|
});
|
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
import { MediaType } from '../constants';
|
|
2
|
+
import { proving } from '@iden3/js-jwz';
|
|
1
3
|
/**
|
|
2
4
|
* Base implementation of protocol message handler
|
|
3
5
|
*
|
|
@@ -83,9 +85,18 @@ export class MessageHandler {
|
|
|
83
85
|
return Promise.reject(new Error('Message handler not provided'));
|
|
84
86
|
}
|
|
85
87
|
const response = await this.messageHandler.handle(message, context);
|
|
86
|
-
if (response) {
|
|
87
|
-
return
|
|
88
|
+
if (!response) {
|
|
89
|
+
return null;
|
|
88
90
|
}
|
|
89
|
-
|
|
91
|
+
let packerParams = {};
|
|
92
|
+
const senderDID = context?.senderDID;
|
|
93
|
+
if (unpackedMediaType === MediaType.ZKPMessage && senderDID) {
|
|
94
|
+
packerParams = {
|
|
95
|
+
senderDID,
|
|
96
|
+
provingMethodAlg: proving.provingMethodGroth16AuthV2Instance.methodAlg
|
|
97
|
+
};
|
|
98
|
+
return this._params.packageManager.packMessage(unpackedMediaType, response, packerParams);
|
|
99
|
+
}
|
|
100
|
+
return this._params.packageManager.packMessage(MediaType.PlainMessage, response, packerParams);
|
|
90
101
|
}
|
|
91
102
|
}
|
|
@@ -102,7 +102,7 @@ export class PaymentHandler extends AbstractMessageHandler {
|
|
|
102
102
|
if (!paymentRequest.from) {
|
|
103
103
|
throw new Error(`failed request. empty 'from' field`);
|
|
104
104
|
}
|
|
105
|
-
if (!paymentRequest.body
|
|
105
|
+
if (!paymentRequest.body.payments?.length) {
|
|
106
106
|
throw new Error(`failed request. no 'payments' in body`);
|
|
107
107
|
}
|
|
108
108
|
if (!ctx.paymentHandler) {
|
|
@@ -173,12 +173,12 @@ export class PaymentHandler extends AbstractMessageHandler {
|
|
|
173
173
|
if (opts.paymentRequest.from !== payment.to) {
|
|
174
174
|
throw new Error(`sender of the request is not a target of response - expected ${opts.paymentRequest.from}, given ${payment.to}`);
|
|
175
175
|
}
|
|
176
|
-
if (!payment.body
|
|
176
|
+
if (!payment.body.payments.length) {
|
|
177
177
|
throw new Error(`failed request. empty 'payments' field in body`);
|
|
178
178
|
}
|
|
179
179
|
for (let i = 0; i < payment.body.payments.length; i++) {
|
|
180
|
-
const p = payment.body
|
|
181
|
-
const paymentRequestData = opts.paymentRequest.body
|
|
180
|
+
const p = payment.body.payments[i];
|
|
181
|
+
const paymentRequestData = opts.paymentRequest.body.payments.find((r) => r.data.id === p.id);
|
|
182
182
|
if (!paymentRequestData) {
|
|
183
183
|
throw new Error(`can't find payment request for payment id ${p.id}`);
|
|
184
184
|
}
|
|
@@ -1,10 +1,11 @@
|
|
|
1
1
|
import { Token, Header, ProvingMethodAlg, proving } from '@iden3/js-jwz';
|
|
2
2
|
import { AuthV2PubSignals, CircuitId } from '../../circuits/index';
|
|
3
|
-
import { DID } from '@iden3/js-iden3-core';
|
|
3
|
+
import { BytesHelper, DID } from '@iden3/js-iden3-core';
|
|
4
4
|
import { bytesToProtocolMessage } from '../utils/envelope';
|
|
5
5
|
import { ErrNoProvingMethodAlg, ErrPackedWithUnsupportedCircuit, ErrProofIsInvalid, ErrSenderNotUsedTokenCreation, ErrStateVerificationFailed, ErrUnknownCircuitID } from '../errors';
|
|
6
6
|
import { MediaType } from '../constants';
|
|
7
7
|
import { byteDecoder, byteEncoder } from '../../utils';
|
|
8
|
+
import { DEFAULT_AUTH_VERIFY_DELAY } from '../constants';
|
|
8
9
|
const { getProvingMethod } = proving;
|
|
9
10
|
/**
|
|
10
11
|
* Handler to
|
|
@@ -53,8 +54,8 @@ export class VerificationHandlerFunc {
|
|
|
53
54
|
* @param {Array<string>} pubSignals - signals that must contain user id and state
|
|
54
55
|
* @returns `Promise<boolean>`
|
|
55
56
|
*/
|
|
56
|
-
verify(id, pubSignals) {
|
|
57
|
-
return this.stateVerificationFunc(id, pubSignals);
|
|
57
|
+
verify(id, pubSignals, opts) {
|
|
58
|
+
return this.stateVerificationFunc(id, pubSignals, opts);
|
|
58
59
|
}
|
|
59
60
|
}
|
|
60
61
|
/**
|
|
@@ -70,9 +71,12 @@ export class ZKPPacker {
|
|
|
70
71
|
* @param {Map<string, ProvingParams>} provingParamsMap - string is derived by JSON.parse(ProvingMethodAlg)
|
|
71
72
|
* @param {Map<string, VerificationParams>} verificationParamsMap - string is derived by JSON.parse(ProvingMethodAlg)
|
|
72
73
|
*/
|
|
73
|
-
constructor(provingParamsMap, verificationParamsMap
|
|
74
|
+
constructor(provingParamsMap, verificationParamsMap, _opts = {
|
|
75
|
+
acceptedStateTransitionDelay: DEFAULT_AUTH_VERIFY_DELAY
|
|
76
|
+
}) {
|
|
74
77
|
this.provingParamsMap = provingParamsMap;
|
|
75
78
|
this.verificationParamsMap = verificationParamsMap;
|
|
79
|
+
this._opts = _opts;
|
|
76
80
|
}
|
|
77
81
|
/**
|
|
78
82
|
* Packs a basic message using the specified parameters.
|
|
@@ -120,7 +124,7 @@ export class ZKPPacker {
|
|
|
120
124
|
if (!isValid) {
|
|
121
125
|
throw new Error(ErrProofIsInvalid);
|
|
122
126
|
}
|
|
123
|
-
const verificationResult = await verificationParams?.verificationFn?.verify(token.circuitId, token.zkProof.pub_signals);
|
|
127
|
+
const verificationResult = await verificationParams?.verificationFn?.verify(token.circuitId, token.zkProof.pub_signals, this._opts);
|
|
124
128
|
if (!verificationResult) {
|
|
125
129
|
throw new Error(ErrStateVerificationFailed);
|
|
126
130
|
}
|
|
@@ -133,23 +137,26 @@ export class ZKPPacker {
|
|
|
133
137
|
return MediaType.ZKPMessage;
|
|
134
138
|
}
|
|
135
139
|
}
|
|
136
|
-
const verifySender = (token, msg) => {
|
|
140
|
+
const verifySender = async (token, msg) => {
|
|
137
141
|
switch (token.circuitId) {
|
|
138
142
|
case CircuitId.AuthV2:
|
|
139
|
-
|
|
140
|
-
|
|
143
|
+
{
|
|
144
|
+
if (!msg.from) {
|
|
145
|
+
throw new Error(ErrSenderNotUsedTokenCreation);
|
|
146
|
+
}
|
|
147
|
+
const authSignals = new AuthV2PubSignals().pubSignalsUnmarshal(byteEncoder.encode(JSON.stringify(token.zkProof.pub_signals)));
|
|
148
|
+
const did = DID.parseFromId(authSignals.userID);
|
|
149
|
+
const msgHash = await token.getMessageHash();
|
|
150
|
+
const challenge = BytesHelper.bytesToInt(msgHash.reverse());
|
|
151
|
+
if (challenge !== authSignals.challenge) {
|
|
152
|
+
throw new Error(ErrSenderNotUsedTokenCreation);
|
|
153
|
+
}
|
|
154
|
+
if (msg.from !== did.string()) {
|
|
155
|
+
throw new Error(ErrSenderNotUsedTokenCreation);
|
|
156
|
+
}
|
|
141
157
|
}
|
|
142
158
|
break;
|
|
143
159
|
default:
|
|
144
160
|
throw new Error(ErrUnknownCircuitID);
|
|
145
161
|
}
|
|
146
162
|
};
|
|
147
|
-
const verifyAuthV2Sender = (from, pubSignals) => {
|
|
148
|
-
const authSignals = new AuthV2PubSignals();
|
|
149
|
-
const pubSig = authSignals.pubSignalsUnmarshal(byteEncoder.encode(JSON.stringify(pubSignals)));
|
|
150
|
-
return pubSig.userID ? checkSender(from, pubSig.userID) : false;
|
|
151
|
-
};
|
|
152
|
-
const checkSender = (from, id) => {
|
|
153
|
-
const did = DID.parseFromId(id);
|
|
154
|
-
return from === did.string();
|
|
155
|
-
};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -42,6 +42,9 @@ export class IdentityWallet {
|
|
|
42
42
|
this._inputsGenerator = new InputGenerator(this, _credentialWallet, _storage.states);
|
|
43
43
|
this._transactionService = new TransactionService(_storage.states.getRpcProvider());
|
|
44
44
|
}
|
|
45
|
+
get credentialWallet() {
|
|
46
|
+
return this._credentialWallet;
|
|
47
|
+
}
|
|
45
48
|
getCredentialStatusPublisherRegistry(_opts) {
|
|
46
49
|
if (!_opts?.credentialStatusPublisherRegistry) {
|
|
47
50
|
const registry = new CredentialStatusPublisherRegistry();
|
|
@@ -1,10 +1,10 @@
|
|
|
1
|
-
import { BytesHelper, DID, MerklizedRootPosition } from '@iden3/js-iden3-core';
|
|
2
|
-
import {
|
|
3
|
-
import { AuthV2Inputs, CircuitId, Operators, Query, ValueProof } from '../circuits';
|
|
1
|
+
import { BytesHelper, DID, MerklizedRootPosition, getDateFromUnixTimestamp } from '@iden3/js-iden3-core';
|
|
2
|
+
import { AuthV2Inputs, AuthV2PubSignals, CircuitId, Operators, Query, ValueProof } from '../circuits';
|
|
4
3
|
import { createVerifiablePresentation } from '../verifiable';
|
|
5
4
|
import { parseCredentialSubject, parseQueryMetadata, toGISTProof, transformQueryValueToBigInts } from './common';
|
|
6
5
|
import { NativeProver } from './provers/prover';
|
|
7
6
|
import { getDocumentLoader } from '@iden3/js-jsonld-merklization';
|
|
7
|
+
import { PROTOCOL_CONSTANTS } from '../iden3comm';
|
|
8
8
|
import { cacheLoader } from '../schema-processor';
|
|
9
9
|
import { byteDecoder, byteEncoder } from '../utils/encoding';
|
|
10
10
|
import { InputGenerator } from './provers/inputs-generator';
|
|
@@ -197,10 +197,6 @@ export class ProofService {
|
|
|
197
197
|
const { nonce: authProfileNonce, genesisDID } = await this._identityWallet.getGenesisDIDMetadata(did);
|
|
198
198
|
const challenge = BytesHelper.bytesToInt(hash.reverse());
|
|
199
199
|
const authPrepared = await this._inputsGenerator.prepareAuthBJJCredential(genesisDID);
|
|
200
|
-
const authClaimData = await this._inputsGenerator.newCircuitClaimData({
|
|
201
|
-
credential: authPrepared.credential,
|
|
202
|
-
credentialCoreClaim: authPrepared.coreClaim
|
|
203
|
-
});
|
|
204
200
|
const signature = await this._identityWallet.signChallenge(challenge, authPrepared.credential);
|
|
205
201
|
const id = DID.idFromDID(genesisDID);
|
|
206
202
|
const stateProof = await this._stateStorage.getGISTProof(id.bigInt());
|
|
@@ -208,21 +204,24 @@ export class ProofService {
|
|
|
208
204
|
const authInputs = new AuthV2Inputs();
|
|
209
205
|
authInputs.genesisID = id;
|
|
210
206
|
authInputs.profileNonce = BigInt(authProfileNonce);
|
|
211
|
-
authInputs.authClaim =
|
|
212
|
-
authInputs.authClaimIncMtp =
|
|
207
|
+
authInputs.authClaim = authPrepared.coreClaim;
|
|
208
|
+
authInputs.authClaimIncMtp = authPrepared.incProof.proof;
|
|
213
209
|
authInputs.authClaimNonRevMtp = authPrepared.nonRevProof.proof;
|
|
214
|
-
authInputs.treeState =
|
|
210
|
+
authInputs.treeState = authPrepared.incProof.treeState;
|
|
215
211
|
authInputs.signature = signature;
|
|
216
212
|
authInputs.challenge = challenge;
|
|
217
213
|
authInputs.gistProof = gistProof;
|
|
218
214
|
return authInputs.inputsMarshal();
|
|
219
215
|
}
|
|
220
|
-
async verifyState(circuitId, pubSignals
|
|
216
|
+
async verifyState(circuitId, pubSignals, opts = {
|
|
217
|
+
acceptedStateTransitionDelay: PROTOCOL_CONSTANTS.DEFAULT_AUTH_VERIFY_DELAY
|
|
218
|
+
}) {
|
|
221
219
|
if (circuitId !== CircuitId.AuthV2) {
|
|
222
220
|
throw new Error(`CircuitId is not supported ${circuitId}`);
|
|
223
221
|
}
|
|
224
|
-
const
|
|
225
|
-
const
|
|
222
|
+
const authV2PubSignals = new AuthV2PubSignals().pubSignalsUnmarshal(byteEncoder.encode(JSON.stringify(pubSignals)));
|
|
223
|
+
const gistRoot = authV2PubSignals.GISTRoot.bigInt();
|
|
224
|
+
const userId = authV2PubSignals.userID.bigInt();
|
|
226
225
|
const globalStateInfo = await this._stateStorage.getGISTRootInfo(gistRoot, userId);
|
|
227
226
|
if (globalStateInfo.createdAtTimestamp === 0n) {
|
|
228
227
|
throw new Error(`gist state doesn't exists in contract`);
|
|
@@ -234,7 +233,12 @@ export class ProofService {
|
|
|
234
233
|
if (globalStateInfo.replacedAtTimestamp === 0n) {
|
|
235
234
|
throw new Error(`state was replaced, but replaced time unknown`);
|
|
236
235
|
}
|
|
237
|
-
|
|
236
|
+
const timeDiff = Date.now() -
|
|
237
|
+
getDateFromUnixTimestamp(Number(globalStateInfo.replacedAtTimestamp)).getTime();
|
|
238
|
+
if (timeDiff >
|
|
239
|
+
(opts?.acceptedStateTransitionDelay ?? PROTOCOL_CONSTANTS.DEFAULT_AUTH_VERIFY_DELAY)) {
|
|
240
|
+
throw new Error('global state is outdated');
|
|
241
|
+
}
|
|
238
242
|
}
|
|
239
243
|
return true;
|
|
240
244
|
}
|