Skip to content
Merged
Show file tree
Hide file tree
Changes from 4 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
7 changes: 5 additions & 2 deletions contracts/verifiers/AnonAadhaarCredentialIssuer.sol
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,6 @@ error InvalidIssuerDidHash();
error InvalidExpirationDate(uint256 expected, uint256 provided);
error ProofExpired();
error InvalidPubKeyHash();
error NullifierAlreadyExists();
error NullifierDoesNotExist();
error InvalidVerifierAddress();
error InvalidStateContractAddress();
Expand Down Expand Up @@ -428,7 +427,6 @@ contract AnonAadhaarCredentialIssuer is IdentityBase, Ownable2StepUpgradeable {
if (expirationDate <= block.timestamp) revert ProofExpired();
if (!$.publicKeysHashes[pubKeyHash]) revert InvalidPubKeyHash();
if (!$.qrVersions[qrVersion]) revert UnsupportedQrVersion(qrVersion);
if ($._nullifiersToRevocationNonce[nullifier] != 0) revert NullifierAlreadyExists();
}

function _addHashAndTransit(uint256 hi, uint256 hv) internal {
Expand All @@ -439,6 +437,11 @@ contract AnonAadhaarCredentialIssuer is IdentityBase, Ownable2StepUpgradeable {
function _setNullifier(uint256 nullifier, uint64 revocationNonce) private {
if (revocationNonce == 0) revert InvalidRevocationNonce(revocationNonce);
AnonAadhaarCredentialIssuerStorage storage $ = _getAnonAadhaarCredentialIssuerStorage();
uint64 existingNonce = $._nullifiersToRevocationNonce[nullifier];
if (existingNonce != 0) {
_getIdentityBaseStorage().identity.revokeClaim(existingNonce);
emit CredentialRevoked(nullifier, existingNonce);
}
$._nullifiersToRevocationNonce[nullifier] = revocationNonce;
}

Expand Down
9 changes: 5 additions & 4 deletions contracts/verifiers/PassportCredentialIssuer.sol
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,6 @@ error IssuanceDateExpired(uint256 issuanceDate);
error IssuanceDateInFuture(uint256 issuanceDate);
error CurrentDateExpired(uint256 currentDate);
error CurrentDateInFuture(uint256 currentDate);
error NullifierAlreadyExists(uint256 nullifier);
error NullifierDoesNotExist(uint256 nullifier);
error LengthMismatch(uint256 length1, uint256 length2);
error NoVerifierSet();
Expand Down Expand Up @@ -547,9 +546,6 @@ contract PassportCredentialIssuer is IdentityBase, EIP712Upgradeable, Ownable2St
revert IssuanceDateInFuture(issuanceDate);

if ($._issuerDidHash != issuerDidHash) revert InvalidIssuerDidHash();

if ($._nullifiersToRevocationNonce[nullifier] != 0)
revert NullifierAlreadyExists(nullifier);
}

function _addHashAndTransit(uint256 hi, uint256 hv) internal {
Expand All @@ -565,6 +561,11 @@ contract PassportCredentialIssuer is IdentityBase, EIP712Upgradeable, Ownable2St
function _setNullifier(uint256 nullifier, uint64 revocationNonce) internal {
if (revocationNonce == 0) revert InvalidRevocationNonce(revocationNonce);
PassportCredentialIssuerStorage storage $ = _getPassportCredentialIssuerStorage();
uint64 existingNonce = $._nullifiersToRevocationNonce[nullifier];
if (existingNonce != 0) {
_getIdentityBaseStorage().identity.revokeClaim(existingNonce);
emit CredentialRevoked(nullifier, existingNonce);
}
$._nullifiersToRevocationNonce[nullifier] = revocationNonce;
}

Expand Down
10 changes: 2 additions & 8 deletions test/integration/AnonAadhaarCredentialIssuer.integration.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -54,15 +54,7 @@ describe("Anon aadhaar credential issuer", function () {
// Get proof from the contract
const proof = anonAadhaarIssuer.getClaimProof(anonAadhaarProof.pub_signals[2]);
expect((await proof).existence).to.be.equal(true);

// Check nullifier
await expect(
anonAadhaarIssuer.verifyAadhaar(
{ circuitId: "anon_aadhaar_v1", proof: credentialZkProof },
"0x",
),
).to.be.revertedWithCustomError(anonAadhaarIssuer, "NullifierAlreadyExists");

expect(await anonAadhaarIssuer.nullifierExists(anonAadhaarProof.pub_signals[1])).to.be.true;
await anonAadhaarIssuer.revokeCredential(anonAadhaarProof.pub_signals[1]);

Expand All @@ -72,6 +64,8 @@ describe("Anon aadhaar credential issuer", function () {
"0x",
),
).to.be.revertedWith("Identity trees haven't changed");

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

remove these empty lines, please.


});
});
});
26 changes: 22 additions & 4 deletions test/integration/PassportCredentialIssuer.integration.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,9 @@ describe("Commitment Registration Tests", function () {
let deployedActors: DeployedActors;
let snapshotId: string;
let baseCredentialProof: any;
let baseCredentialProof2: any;
let credentialProof: any;
let credentialProof2: any;
let baseCredentialProofCurrentDateExpired: any;
let credentialProofCurrentDateExpired: any;
let baseCredentialProofIssuanceDateExpired: any;
Expand All @@ -34,6 +36,7 @@ describe("Commitment Registration Tests", function () {
deployedActors = await deploySystemFixtures();

baseCredentialProof = await generateCredentialProof(deployedActors.mockPassport);
baseCredentialProof2 = await generateCredentialProof(deployedActors.mockPassport);
const currentDateExpired = new Date();
currentDateExpired.setDate(currentDateExpired.getDate() - 10);
baseCredentialProofCurrentDateExpired = await generateCredentialProof(
Expand Down Expand Up @@ -74,6 +77,7 @@ describe("Commitment Registration Tests", function () {

beforeEach(async () => {
credentialProof = structuredClone(baseCredentialProof);
credentialProof2 = structuredClone(baseCredentialProof2);
credentialProofCurrentDateExpired = structuredClone(baseCredentialProofCurrentDateExpired);
credentialProofIssuanceDateExpired = structuredClone(baseCredentialProofIssuanceDateExpired);
credentialProofRevocationNonceZero = structuredClone(credentialProofRevocationNonceZero);
Expand Down Expand Up @@ -153,16 +157,30 @@ describe("Commitment Registration Tests", function () {
expect(await passportCredentialIssuer.nullifierExists(signedPassportData.nullifier)).to.be
.true;

// Check nullifier
// Reissue passport should work (revoking previous nullifier)
const credentialPreparedProof2 = prepareProof(credentialProof2.proof);

const credentialZkProof2 = packZKProof(
credentialProof2.publicSignals,
credentialPreparedProof2.pi_a,
credentialPreparedProof2.pi_b,
credentialPreparedProof2.pi_c,
);

expect(await passportCredentialIssuer.nullifierExists(signedPassportData.nullifier)).to.be
.true;

await expect(
passportCredentialIssuer.verifyPassport(
{ circuitId: "credential_sha256", proof: credentialZkProof },
{ circuitId: "credential_sha256", proof: credentialZkProof2 },
passportSignatureProof,
),
).to.be.revertedWithCustomError(passportCredentialIssuer, "NullifierAlreadyExists");
).not.to.be.reverted;
expect(await passportCredentialIssuer.nullifierExists(signedPassportData.nullifier)).to.be
.true;

// Check nullifier
await passportCredentialIssuer.revokeCredential(signedPassportData.nullifier);

expect(await passportCredentialIssuer.nullifierExists(signedPassportData.nullifier)).to.be
.false;

Expand Down
Loading