Skip to content
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