Commit 84a0346f authored by lbeder's avatar lbeder Committed by Mark Tyneway

Refactor to use SignatureChecker for EIP712 and EIP1271 verification

parent 2f444c2d
...@@ -2,8 +2,7 @@ ...@@ -2,8 +2,7 @@
pragma solidity 0.8.19; pragma solidity 0.8.19;
import { EIP712 } from "@openzeppelin/contracts/utils/cryptography/draft-EIP712.sol"; import { EIP712 } from "@openzeppelin/contracts/utils/cryptography/draft-EIP712.sol";
import { ECDSA } from "@openzeppelin/contracts/utils/cryptography/ECDSA.sol"; import { SignatureChecker } from "@openzeppelin/contracts/utils/cryptography/SignatureChecker.sol";
import { IERC1271 } from "@openzeppelin/contracts/interfaces/IERC1271.sol";
import { Address } from "@openzeppelin/contracts/utils/Address.sol"; import { Address } from "@openzeppelin/contracts/utils/Address.sol";
import { import {
...@@ -86,7 +85,7 @@ abstract contract EIP1271Verifier is EIP712 { ...@@ -86,7 +85,7 @@ abstract contract EIP1271Verifier is EIP712 {
nonce = _nonces[request.attester]++; nonce = _nonces[request.attester]++;
} }
bytes32 digest = _hashTypedDataV4( bytes32 hash = _hashTypedDataV4(
keccak256( keccak256(
abi.encode( abi.encode(
ATTEST_TYPEHASH, ATTEST_TYPEHASH,
...@@ -100,7 +99,15 @@ abstract contract EIP1271Verifier is EIP712 { ...@@ -100,7 +99,15 @@ abstract contract EIP1271Verifier is EIP712 {
) )
) )
); );
_verifySignature(digest, signature, request.attester); if (
!SignatureChecker.isValidSignatureNow(
request.attester,
hash,
abi.encodePacked(signature.r, signature.s, signature.v)
)
) {
revert InvalidSignature();
}
} }
/// @notice Verifies delegated revocation request. /// @notice Verifies delegated revocation request.
...@@ -114,28 +121,14 @@ abstract contract EIP1271Verifier is EIP712 { ...@@ -114,28 +121,14 @@ abstract contract EIP1271Verifier is EIP712 {
nonce = _nonces[request.revoker]++; nonce = _nonces[request.revoker]++;
} }
bytes32 digest = _hashTypedDataV4(keccak256(abi.encode(REVOKE_TYPEHASH, request.schema, data.uid, nonce))); bytes32 hash = _hashTypedDataV4(keccak256(abi.encode(REVOKE_TYPEHASH, request.schema, data.uid, nonce)));
_verifySignature(digest, signature, request.revoker); if (
} !SignatureChecker.isValidSignatureNow(
request.revoker,
/// @notice Verifies EIP712 signatures (with EIP1271 support). hash,
/// @param digest The typed-data digest to verify. abi.encodePacked(signature.r, signature.s, signature.v)
/// @param signature The signature to verify (either a "real" ECDSA signature or an EIP1271-aware signature). )
/// @param signer The signer to verify the signature against. ) {
function _verifySignature(bytes32 digest, Signature memory signature, address signer) private view {
// If the signer is a contract, check if it's EIP1271 compliant.
if (signer.isContract()) {
bytes4 magicValue = IERC1271(signer).isValidSignature(digest, abi.encode(signature));
if (magicValue != IERC1271.isValidSignature.selector) {
revert InvalidSignature();
}
return;
}
// If the signer is an EOA, verify the signature using the standard (non-malleable) ECDSA signature
// verification.
if (ECDSA.recover(digest, signature.v, signature.r, signature.s) != signer) {
revert InvalidSignature(); revert InvalidSignature();
} }
} }
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment