Skip to content

Support more generic IVerifier for ZKEmailUtils #173

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Draft
wants to merge 1 commit into
base: master
Choose a base branch
from
Draft
Show file tree
Hide file tree
Changes from all 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
3 changes: 1 addition & 2 deletions contracts/mocks/account/AccountZKEmailMock.sol
Original file line number Diff line number Diff line change
Expand Up @@ -7,9 +7,8 @@ import {ERC721Holder} from "@openzeppelin/contracts/token/ERC721/utils/ERC721Hol
import {ERC1155Holder} from "@openzeppelin/contracts/token/ERC1155/utils/ERC1155Holder.sol";
import {ERC7739, EIP712} from "../../utils/cryptography/signers/ERC7739.sol";
import {ERC7821} from "../../account/extensions/ERC7821.sol";
import {SignerZKEmail} from "../../utils/cryptography/signers/SignerZKEmail.sol";
import {IVerifier, SignerZKEmail} from "../../utils/cryptography/signers/SignerZKEmail.sol";
import {IDKIMRegistry} from "@zk-email/contracts/DKIMRegistry.sol";
import {IVerifier} from "@zk-email/email-tx-builder/src/interfaces/IVerifier.sol";

contract AccountZKEmailMock is Account, SignerZKEmail, ERC7739, ERC7821, ERC721Holder, ERC1155Holder {
constructor(
Expand Down
8 changes: 5 additions & 3 deletions contracts/mocks/utils/cryptography/ZKEmailVerifierMock.sol
Original file line number Diff line number Diff line change
Expand Up @@ -2,15 +2,17 @@

pragma solidity ^0.8.20;

import {IVerifier, EmailProof} from "@zk-email/email-tx-builder/src/interfaces/IVerifier.sol";
import {EmailProof} from "@zk-email/email-tx-builder/src/interfaces/IVerifier.sol";
import {IVerifier} from "../../../utils/cryptography/ZKEmailUtils.sol";

contract ZKEmailVerifierMock is IVerifier {
function commandBytes() external pure returns (uint256) {
// Same as in https://github.com/zkemail/email-tx-builder/blob/1452943807a5fdc732e1113c34792c76cf7dd031/packages/contracts/src/utils/Verifier.sol#L15
return 605;
}

function verifyEmailProof(EmailProof memory proof) external pure returns (bool) {
return proof.proof.length > 0 && bytes1(proof.proof[0]) == 0x01; // boolean true
function verifyEmailProof(bytes memory proof) external pure returns (bool) {
EmailProof memory emailProof = abi.decode(proof, (EmailProof));
return emailProof.proof.length > 0 && bytes1(emailProof.proof[0]) == 0x01; // boolean true
}
}
11 changes: 9 additions & 2 deletions contracts/utils/cryptography/ZKEmailUtils.sol
Original file line number Diff line number Diff line change
Expand Up @@ -5,10 +5,14 @@ pragma solidity ^0.8.24;
import {Bytes} from "@openzeppelin/contracts/utils/Bytes.sol";
import {Strings} from "@openzeppelin/contracts/utils/Strings.sol";
import {IDKIMRegistry} from "@zk-email/contracts/DKIMRegistry.sol";
import {IVerifier} from "@zk-email/email-tx-builder/src/interfaces/IVerifier.sol";
import {EmailAuthMsg} from "@zk-email/email-tx-builder/src/interfaces/IEmailTypes.sol";
import {CommandUtils} from "@zk-email/email-tx-builder/src/libraries/CommandUtils.sol";

interface IVerifier {
function commandBytes() external view returns (uint256);
function verifyEmailProof(bytes memory proof) external view returns (bool);
}

/**
* @dev Library for https://docs.zk.email[ZKEmail] signature validation utilities.
*
Expand Down Expand Up @@ -102,7 +106,10 @@ library ZKEmailUtils {
) {
return EmailProofError.DKIMPublicKeyHash;
} else {
return verifier.verifyEmailProof(emailAuthMsg.proof) ? EmailProofError.NoError : EmailProofError.EmailProof;
return
verifier.verifyEmailProof(abi.encode(emailAuthMsg.proof))
? EmailProofError.NoError
: EmailProofError.EmailProof;
}
}

Expand Down
3 changes: 1 addition & 2 deletions contracts/utils/cryptography/signers/SignerZKEmail.sol
Original file line number Diff line number Diff line change
Expand Up @@ -3,10 +3,9 @@
pragma solidity ^0.8.24;

import {IDKIMRegistry} from "@zk-email/contracts/DKIMRegistry.sol";
import {IVerifier} from "@zk-email/email-tx-builder/src/interfaces/IVerifier.sol";
import {EmailAuthMsg} from "@zk-email/email-tx-builder/src/interfaces/IEmailTypes.sol";
import {AbstractSigner} from "./AbstractSigner.sol";
import {ZKEmailUtils} from "../ZKEmailUtils.sol";
import {IVerifier, ZKEmailUtils} from "../ZKEmailUtils.sol";

/**
* @dev Implementation of {AbstractSigner} using https://docs.zk.email[ZKEmail] signatures.
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,10 +3,9 @@
pragma solidity ^0.8.24;

import {IDKIMRegistry} from "@zk-email/contracts/DKIMRegistry.sol";
import {IVerifier} from "@zk-email/email-tx-builder/src/interfaces/IVerifier.sol";
import {EmailAuthMsg} from "@zk-email/email-tx-builder/src/interfaces/IEmailTypes.sol";
import {IERC7913SignatureVerifier} from "../../../interfaces/IERC7913.sol";
import {ZKEmailUtils} from "../ZKEmailUtils.sol";
import {IVerifier, ZKEmailUtils} from "../ZKEmailUtils.sol";

/**
* @dev ERC-7913 signature verifier that supports ZKEmail accounts.
Expand Down
16 changes: 8 additions & 8 deletions test/utils/cryptography/ZKEmailUtils.t.sol
Original file line number Diff line number Diff line change
Expand Up @@ -2,12 +2,12 @@
pragma solidity ^0.8.24;

import {Test} from "forge-std/Test.sol";
import {ZKEmailUtils} from "../../../contracts/utils/cryptography/ZKEmailUtils.sol";
import {IVerifier, ZKEmailUtils} from "../../../contracts/utils/cryptography/ZKEmailUtils.sol";
import {ECDSAOwnedDKIMRegistry} from "@zk-email/email-tx-builder/src/utils/ECDSAOwnedDKIMRegistry.sol";
import {Groth16Verifier} from "@zk-email/email-tx-builder/test/fixtures/Groth16Verifier.sol";
import {Verifier} from "@zk-email/email-tx-builder/src/utils/Verifier.sol";
import {IDKIMRegistry} from "@zk-email/contracts/DKIMRegistry.sol";
import {IVerifier, EmailProof} from "@zk-email/email-tx-builder/src/interfaces/IVerifier.sol";
import {EmailProof} from "@zk-email/email-tx-builder/src/interfaces/IVerifier.sol";
import {Strings} from "@openzeppelin/contracts/utils/Strings.sol";
import {CommandUtils} from "@zk-email/email-tx-builder/src/libraries/CommandUtils.sol";
import {MessageHashUtils} from "@openzeppelin/contracts/utils/cryptography/MessageHashUtils.sol";
Expand Down Expand Up @@ -125,7 +125,7 @@ contract ZKEmailUtilsTest is Test {
emailAuthMsg.proof.isCodeExist = isCodeExist;
emailAuthMsg.proof.proof = proof;

_mockVerifyEmailProof(emailAuthMsg.proof);
_mockVerifyEmailProof(abi.encode(emailAuthMsg.proof));

// Test validation
ZKEmailUtils.EmailProofError err = ZKEmailUtils.isValidZKEmail(
Expand Down Expand Up @@ -166,7 +166,7 @@ contract ZKEmailUtilsTest is Test {
template[0] = commandPrefix;
template[1] = CommandUtils.UINT_MATCHER;

_mockVerifyEmailProof(emailAuthMsg.proof);
_mockVerifyEmailProof(abi.encode(emailAuthMsg.proof));

ZKEmailUtils.EmailProofError err = ZKEmailUtils.isValidZKEmail(
emailAuthMsg,
Expand Down Expand Up @@ -205,7 +205,7 @@ contract ZKEmailUtilsTest is Test {
emailAuthMsg.proof.isCodeExist = isCodeExist;
emailAuthMsg.proof.proof = proof;

_mockVerifyEmailProof(emailAuthMsg.proof);
_mockVerifyEmailProof(abi.encode(emailAuthMsg.proof));

string[] memory template = new string[](2);
template[0] = commandPrefix;
Expand Down Expand Up @@ -251,7 +251,7 @@ contract ZKEmailUtilsTest is Test {
template[0] = commandPrefix;
template[1] = CommandUtils.ETH_ADDR_MATCHER;

_mockVerifyEmailProof(emailAuthMsg.proof);
_mockVerifyEmailProof(abi.encode(emailAuthMsg.proof));

ZKEmailUtils.EmailProofError err = ZKEmailUtils.isValidZKEmail(
emailAuthMsg,
Expand Down Expand Up @@ -380,7 +380,7 @@ contract ZKEmailUtilsTest is Test {
Verifier verifier = new Verifier();
Groth16Verifier groth16Verifier = new Groth16Verifier();
verifier.initialize(msg.sender, address(groth16Verifier));
return verifier;
return IVerifier(address(verifier));
}

function _createECDSAOwnedDKIMRegistry() private returns (IDKIMRegistry) {
Expand All @@ -394,7 +394,7 @@ contract ZKEmailUtilsTest is Test {
return ecdsaDkim;
}

function _mockVerifyEmailProof(EmailProof memory emailProof) private {
function _mockVerifyEmailProof(bytes memory emailProof) private {
vm.mockCall(address(_verifier), abi.encodeCall(IVerifier.verifyEmailProof, (emailProof)), abi.encode(true));
}

Expand Down
Loading