Skip to content

Commit

Permalink
test: Adjustments
Browse files Browse the repository at this point in the history
  • Loading branch information
0xJurassicPunk committed Feb 1, 2023
1 parent ea43957 commit 825674d
Show file tree
Hide file tree
Showing 3 changed files with 60 additions and 32 deletions.
67 changes: 44 additions & 23 deletions test/foundry/SignatureChecker.t.sol
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@ abstract contract TestParameters is TestHelpers {
address internal user2 = vm.addr(privateKeyUser2);
}

contract SignatureCheckerTest is TestHelpers, TestParameters {
contract SignatureCheckerCalldataTest is TestHelpers, TestParameters {
PublicSignatureChecker public signatureChecker;

function setUp() public {
Expand All @@ -27,54 +27,66 @@ contract SignatureCheckerTest is TestHelpers, TestParameters {
bytes memory signature = _signMessage(randomMessage, privateKeyUser1);
bytes32 hashedMessage = _computeHash(randomMessage);

assertTrue(signatureChecker.verify(hashedMessage, user1, signature));
assertTrue(signatureChecker.verifyCalldata(hashedMessage, user1, signature));
assertTrue(signatureChecker.verifyMemory(hashedMessage, user1, signature));
}

function testSignEOAEIP2098(bytes32 randomMessage) public {
bytes memory signature = _eip2098Signature(_signMessage(randomMessage, privateKeyUser1));
bytes32 hashedMessage = _computeHash(randomMessage);

assertTrue(signatureChecker.verify(hashedMessage, user1, signature));
assertTrue(signatureChecker.verifyCalldata(hashedMessage, user1, signature));
assertTrue(signatureChecker.verifyMemory(hashedMessage, user1, signature));
}

function testSignERC1271(bytes32 randomMessage) public {
ERC1271Contract erc1271Contract = new ERC1271Contract(user1);
bytes memory signature = _signMessage(randomMessage, privateKeyUser1);

bytes32 hashedMessage = _computeHash(randomMessage);
assertTrue(signatureChecker.verify(hashedMessage, address(erc1271Contract), signature));

assertTrue(signatureChecker.verifyCalldata(hashedMessage, address(erc1271Contract), signature));
assertTrue(signatureChecker.verifyMemory(hashedMessage, address(erc1271Contract), signature));
}

function testRevertIfWrongSignatureERC1271(bytes32 randomMessage) public {
function testRevertIfSignatureERC1271IsInvalid(bytes32 randomMessage) public {
ERC1271Contract erc1271Contract = new ERC1271Contract(user1);
bytes memory signature = _signMessage(randomMessage, privateKeyUser2);

bytes32 hashedMessage = _computeHash(randomMessage);
vm.expectRevert(InvalidSignatureERC1271.selector);
signatureChecker.verify(hashedMessage, address(erc1271Contract), signature);

vm.expectRevert(SignatureERC1271Invalid.selector);
signatureChecker.verifyCalldata(hashedMessage, address(erc1271Contract), signature);

vm.expectRevert(SignatureERC1271Invalid.selector);
signatureChecker.verifyMemory(hashedMessage, address(erc1271Contract), signature);
}

function testRevertIfWrongSignatureEOA(bytes32 randomMessage) public {
function testRevertIfSignatureEOAIsInvalid(bytes32 randomMessage) public {
bytes memory signature = _signMessage(randomMessage, privateKeyUser2);

bytes32 hashedMessage = _computeHash(randomMessage);
vm.expectRevert(InvalidSignatureEOA.selector);
signatureChecker.verify(hashedMessage, user1, signature);

vm.expectRevert(SignatureEOAInvalid.selector);
signatureChecker.verifyCalldata(hashedMessage, user1, signature);

vm.expectRevert(SignatureEOAInvalid.selector);
signatureChecker.verifyMemory(hashedMessage, user1, signature);
}

function testRevertIfWrongVParameter(bytes32 randomMessage, uint8 v) public {
function testRevertIfVParameterIsInvalid(bytes32 randomMessage, uint8 v) public {
vm.assume(v != 27 && v != 28);
(, bytes32 r, bytes32 s) = vm.sign(privateKeyUser1, keccak256(abi.encodePacked(randomMessage)));

// Encode the signature
bytes memory signature = abi.encodePacked(r, s, v);
bytes32 hashedMessage = _computeHash(randomMessage);

vm.expectRevert(abi.encodeWithSelector(BadSignatureV.selector, v));
signatureChecker.verify(hashedMessage, user1, signature);
vm.expectRevert(abi.encodeWithSelector(SignatureParameterVInvalid.selector, v));
signatureChecker.verifyCalldata(hashedMessage, user1, signature);

vm.expectRevert(abi.encodeWithSelector(SignatureParameterVInvalid.selector, v));
signatureChecker.verifyMemory(hashedMessage, user1, signature);
}

function testRevertIfWrongSParameter(bytes32 randomMessage, bytes32 s) public {
function testRevertIfSParameterIsInvalid(bytes32 randomMessage, bytes32 s) public {
vm.assume(uint256(s) > 0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5D576E7357A4501DDFE92F46681B20A0);

(uint8 v, bytes32 r, ) = vm.sign(privateKeyUser1, keccak256(abi.encodePacked(randomMessage)));
Expand All @@ -83,8 +95,11 @@ contract SignatureCheckerTest is TestHelpers, TestParameters {
bytes memory signature = abi.encodePacked(r, s, v);
bytes32 hashedMessage = _computeHash(randomMessage);

vm.expectRevert(abi.encodeWithSelector(BadSignatureS.selector));
signatureChecker.verify(hashedMessage, user1, signature);
vm.expectRevert(abi.encodeWithSelector(SignatureParameterSInvalid.selector));
signatureChecker.verifyCalldata(hashedMessage, user1, signature);

vm.expectRevert(abi.encodeWithSelector(SignatureParameterSInvalid.selector));
signatureChecker.verifyMemory(hashedMessage, user1, signature);
}

function testRevertIfRecoveredAddressIsNull(bytes32 randomMessage) public {
Expand All @@ -96,16 +111,22 @@ contract SignatureCheckerTest is TestHelpers, TestParameters {
bytes32 hashedMessage = _computeHash(randomMessage);

vm.expectRevert(abi.encodeWithSelector(NullSignerAddress.selector));
signatureChecker.verify(hashedMessage, user1, signature);
signatureChecker.verifyCalldata(hashedMessage, user1, signature);

vm.expectRevert(abi.encodeWithSelector(NullSignerAddress.selector));
signatureChecker.verifyMemory(hashedMessage, user1, signature);
}

function testRevertIfWrongSignatureLength(bytes32 randomMessage, uint256 length) public {
function testRevertIfSignatureLengthIsInvalid(bytes32 randomMessage, uint256 length) public {
// @dev Getting OutOfGas starting from 16,776,985, probably due to memory cost
vm.assume(length != 64 && length != 65 && length < 16_776_985);
bytes memory signature = new bytes(length);

bytes32 hashedMessage = _computeHash(randomMessage);
vm.expectRevert(abi.encodeWithSelector(WrongSignatureLength.selector, length));
signatureChecker.verify(hashedMessage, user1, signature);
vm.expectRevert(abi.encodeWithSelector(SignatureLengthInvalid.selector, length));
signatureChecker.verifyCalldata(hashedMessage, user1, signature);

vm.expectRevert(abi.encodeWithSelector(SignatureLengthInvalid.selector, length));
signatureChecker.verifyMemory(hashedMessage, user1, signature);
}
}
12 changes: 6 additions & 6 deletions test/foundry/utils/ERC1271Contract.sol
Original file line number Diff line number Diff line change
Expand Up @@ -5,9 +5,9 @@ import {IERC1271} from "../../../contracts/interfaces/generic/IERC1271.sol";

contract ERC1271Contract is IERC1271 {
// Custom errors
error BadSignatureS();
error BadSignatureV(uint8 v);
error WrongSignatureLength(uint256 length);
error SignatureParameterSInvalid();
error SignatureParameterVInvalid(uint8 v);
error SignatureLengthInvalid(uint256 length);

address public owner;

Expand Down Expand Up @@ -41,15 +41,15 @@ contract ERC1271Contract is IERC1271 {
v := byte(0, calldataload(add(signature.offset, 0x40)))
}
} else {
revert WrongSignatureLength(signature.length);
revert SignatureLengthInvalid(signature.length);
}

if (uint256(s) > 0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5D576E7357A4501DDFE92F46681B20A0) {
revert BadSignatureS();
revert SignatureParameterSInvalid();
}

if (v != 27 && v != 28) {
revert BadSignatureV(v);
revert SignatureParameterVInvalid(v);
}

address signer = ecrecover(hash, v, r, s);
Expand Down
13 changes: 10 additions & 3 deletions test/foundry/utils/PublicSignatureChecker.sol
Original file line number Diff line number Diff line change
@@ -1,12 +1,19 @@
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.17;

import {SignatureChecker} from "../../../contracts/SignatureChecker.sol";
import {SignatureCheckerCalldata} from "../../../contracts/SignatureCheckerCalldata.sol";
import {SignatureCheckerMemory} from "../../../contracts/SignatureCheckerMemory.sol";

contract PublicSignatureChecker {
function verify(bytes32 hash, address signer, bytes calldata signature) external view returns (bool) {
function verifyCalldata(bytes32 hash, address signer, bytes calldata signature) external view returns (bool) {
// It will revert if it is wrong
SignatureChecker.verify(hash, signer, signature);
SignatureCheckerCalldata.verify(hash, signer, signature);
return true;
}

function verifyMemory(bytes32 hash, address signer, bytes memory signature) external view returns (bool) {
// It will revert if it is wrong
SignatureCheckerMemory.verify(hash, signer, signature);
return true;
}
}

0 comments on commit 825674d

Please sign in to comment.