Skip to content

Commit

Permalink
fix checkUserState function
Browse files Browse the repository at this point in the history
  • Loading branch information
volodymyr-basiuk committed Apr 9, 2024
1 parent aad0e2d commit 9e2694e
Show file tree
Hide file tree
Showing 8 changed files with 73 additions and 19 deletions.
4 changes: 2 additions & 2 deletions package-lock.json

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 1 addition & 1 deletion package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "@iden3/js-iden3-auth",
"version": "1.3.1",
"version": "1.3.2",
"description": "iden3-auth implementation in JavaScript",
"main": "dist/cjs/index.js",
"source": "./src/index.ts",
Expand Down
8 changes: 6 additions & 2 deletions src/circuits/atomicMtpV2.ts
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ import { Resolvers } from '@lib/state/resolver';
import { checkQueryV2Circuits, ClaimOutputs, Query } from '@lib/circuits/query';
import { PubSignalsVerifier, VerifyOpts } from '@lib/circuits/registry';
import { IDOwnershipPubSignals } from '@lib/circuits/ownershipVerifier';
import { checkIssuerNonRevState, checkUserState, getResolverByID } from '@lib/circuits/common';
import { checkIssuerNonRevState, checkIssuerState, getResolverByID } from '@lib/circuits/common';
import { DocumentLoader } from '@iden3/js-jsonld-merklization';
import {
AtomicQueryMTPV2PubSignals,
Expand Down Expand Up @@ -75,7 +75,11 @@ export class AtomicQueryMTPV2PubSignalsVerifier
throw new Error(`resolver not found for issuerID ${this.pubSignals.issuerID.string()}`);
}

await checkUserState(resolver, this.pubSignals.issuerID, this.pubSignals.issuerClaimIdenState);
await checkIssuerState(
resolver,
this.pubSignals.issuerID,
this.pubSignals.issuerClaimIdenState
);

if (this.pubSignals.isRevocationChecked === 0) {
return;
Expand Down
4 changes: 2 additions & 2 deletions src/circuits/atomicSigV2.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@ import { PubSignalsVerifier, VerifyOpts } from '@lib/circuits/registry';
import { checkQueryV2Circuits, ClaimOutputs, Query } from '@lib/circuits/query';
import { Resolvers } from '@lib/state/resolver';
import { IDOwnershipPubSignals } from '@lib/circuits/ownershipVerifier';
import { checkIssuerNonRevState, checkUserState, getResolverByID } from '@lib/circuits/common';
import { checkIssuerNonRevState, checkIssuerState, getResolverByID } from '@lib/circuits/common';
import { getDateFromUnixTimestamp } from '@iden3/js-iden3-core';
import { DocumentLoader } from '@iden3/js-jsonld-merklization';
import {
Expand Down Expand Up @@ -68,7 +68,7 @@ export class AtomicQuerySigV2PubSignalsVerifier
throw new Error(`resolver not found for issuerID ${this.pubSignals.issuerID.string()}`);
}

await checkUserState(resolver, this.pubSignals.issuerID, this.pubSignals.issuerAuthState);
await checkIssuerState(resolver, this.pubSignals.issuerID, this.pubSignals.issuerAuthState);

if (this.pubSignals.isRevocationChecked === 0) {
return;
Expand Down
4 changes: 2 additions & 2 deletions src/circuits/atomicV3.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@ import { PubSignalsVerifier, VerifyOpts } from '@lib/circuits/registry';
import { ClaimOutputs, Query } from '@lib/circuits/query';
import { Resolvers } from '@lib/state/resolver';
import { IDOwnershipPubSignals } from '@lib/circuits/ownershipVerifier';
import { checkIssuerNonRevState, checkUserState, getResolverByID } from '@lib/circuits/common';
import { checkIssuerNonRevState, checkIssuerState, getResolverByID } from '@lib/circuits/common';
import { DID, getDateFromUnixTimestamp } from '@iden3/js-iden3-core';
import { DocumentLoader, getDocumentLoader } from '@iden3/js-jsonld-merklization';
import {
Expand Down Expand Up @@ -194,7 +194,7 @@ export class AtomicQueryV3PubSignalsVerifier
throw new Error(`resolver not found for issuerID ${this.pubSignals.issuerID.string()}`);
}

await checkUserState(resolver, this.pubSignals.issuerID, this.pubSignals.issuerState);
await checkIssuerState(resolver, this.pubSignals.issuerID, this.pubSignals.issuerState);

if (this.pubSignals.isRevocationChecked === 0) {
return;
Expand Down
17 changes: 7 additions & 10 deletions src/circuits/common.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2,22 +2,19 @@ import { Id, DID } from '@iden3/js-iden3-core';
import { IStateResolver, ResolvedState, Resolvers } from '@lib/state/resolver';
import { Hash } from '@iden3/js-merkletree';

export const userStateError = new Error(`user state is not valid`);
export const issuerStateError = new Error(`issuer state is not valid`);
export const gistStateError = new Error(`gist state is not valid`);

export async function checkUserState(
export async function checkIssuerState(
resolver: IStateResolver,
userId: Id,
userState: Hash
): Promise<ResolvedState> {
const userStateResolved: ResolvedState = await resolver.resolve(
userId.bigInt(),
userState.bigInt()
);
if (!userStateResolved.latest) {
throw userStateError;
): Promise<void> {
try {
await resolver.resolve(userId.bigInt(), userState.bigInt());
} catch {
throw issuerStateError;
}
return userStateResolved;
}

export async function checkGlobalState(
Expand Down
20 changes: 20 additions & 0 deletions test/common.test.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
import { DID } from '@iden3/js-iden3-core';
import { checkIssuerState } from '@lib/circuits/common';
import { mockResolverWithNoStateInContract, mockResolverWithNotLatesState } from './mocks';
import { Hash } from '@iden3/js-merkletree';

describe('Common', () => {
const issuerDID = DID.parse('did:iden3:polygon:mumbai:x6suHR8HkEYczV9yVeAKKiXCZAd25P8WS6QvNhszk');
const issuerID = DID.idFromDID(issuerDID);
const hash = Hash.fromBigInt(
BigInt('13483594486393726782589954979757194488582220051583949915340451442108840786819')
);
it('checkIssuerState fails', async () => {
await expect(
checkIssuerState(mockResolverWithNoStateInContract, issuerID, hash)
).rejects.toThrow('issuer state is not valid');
});
it('checkIssuerState', async () => {
await checkIssuerState(mockResolverWithNotLatesState, issuerID, hash);
});
});
33 changes: 33 additions & 0 deletions test/mocks.ts
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,36 @@ class MockResolver implements IStateResolver {
}
}

class MockResolverWithNoStateInContract implements IStateResolver {
resolve(): Promise<ResolvedState> {
throw new Error('State is not genesis and not registered in the smart contract');
}
rootResolve(): Promise<ResolvedState> {
throw new Error('GIST root does not exist in the smart contract');
}
}

class MockResolverWithNotLatesState implements IStateResolver {
resolve(): Promise<ResolvedState> {
const t: ResolvedState = {
latest: false,
state: null,
genesis: false,
transitionTimestamp: 1712653265
};
return Promise.resolve(t);
}
rootResolve(): Promise<ResolvedState> {
const t: ResolvedState = {
latest: false,
state: null,
genesis: false,
transitionTimestamp: 1712653265
};
return Promise.resolve(t);
}
}

export const exampleDidDoc = {
'@context': [
'https://www.w3.org/ns/did/v1',
Expand Down Expand Up @@ -53,6 +83,9 @@ export const testOpts: VerifyOpts = {
};

const mockStateResolver: MockResolver = new MockResolver();
export const mockResolverWithNoStateInContract: MockResolver =
new MockResolverWithNoStateInContract();
export const mockResolverWithNotLatesState: MockResolver = new MockResolverWithNotLatesState();
export const resolvers: Resolvers = {
'polygon:amoy': mockStateResolver,
'polygon:mumbai': mockStateResolver
Expand Down

0 comments on commit 9e2694e

Please sign in to comment.