diff --git a/contracts/src/utils/ECDSA.sol b/contracts/src/utils/ECDSA.sol index 821936ad..f6112ccb 100644 --- a/contracts/src/utils/ECDSA.sol +++ b/contracts/src/utils/ECDSA.sol @@ -31,7 +31,7 @@ library ECDSA { if (signer == address(0)) return false; - bytes memory publicKeyBytes = abi.encodePacked(bytes1(0x04), publicKey.x, publicKey.y); + bytes memory publicKeyBytes = abi.encodePacked(publicKey.x, publicKey.y); bytes32 publicKeyHash = keccak256(publicKeyBytes); diff --git a/contracts/test/account/ExperimentalDelegation.t.sol b/contracts/test/account/ExperimentalDelegation.t.sol index cc36541f..b7d20d56 100644 --- a/contracts/test/account/ExperimentalDelegation.t.sol +++ b/contracts/test/account/ExperimentalDelegation.t.sol @@ -88,6 +88,31 @@ contract ExperimentalDelegationTest is Test { assertEq(expiry, 0); } + function test_authorize_withSecp256k1Key() public { + vm.pauseGasMetering(); + + VmSafe.Wallet memory wallet = vm.createWallet("wallet"); + + ExperimentalDelegation.Key[] memory keys = new ExperimentalDelegation.Key[](1); + keys[0] = ExperimentalDelegation.Key( + 0, ExperimentalDelegation.KeyType.Secp256k1, ECDSA.PublicKey(wallet.publicKeyX, wallet.publicKeyY) + ); + + vm.expectRevert(); + delegation.keys(0); + + vm.prank(address(delegation)); + vm.resumeGasMetering(); + delegation.authorize(keys); + vm.pauseGasMetering(); + + (uint256 expiry, ExperimentalDelegation.KeyType keyType, ECDSA.PublicKey memory authorizedPublicKey) = + delegation.keys(0); + assertEq(authorizedPublicKey.x, wallet.publicKeyX); + assertEq(authorizedPublicKey.y, wallet.publicKeyY); + assertEq(expiry, 0); + } + function test_authorize_withAuthorizedKey() public { vm.pauseGasMetering(); @@ -322,4 +347,27 @@ contract ExperimentalDelegationTest is Test { bytes4(keccak256("isValidSignature(bytes32,bytes)")) ); } + + function test_isValidSignature_forAuthorizingSecp256k1Key() public { + bytes32 hash = keccak256(abi.encodePacked(delegation.nonce(), keccak256("0xdeadbeef"))); + VmSafe.Wallet memory wallet = vm.createWallet("wallet"); + + ExperimentalDelegation.Key[] memory keys = new ExperimentalDelegation.Key[](1); + keys[0] = ExperimentalDelegation.Key( + 0, ExperimentalDelegation.KeyType.Secp256k1, ECDSA.PublicKey(wallet.publicKeyX, wallet.publicKeyY) + ); + + vm.prank(address(delegation)); + delegation.authorize(keys); + + (uint8 v, bytes32 r, bytes32 s) = vm.sign(wallet.privateKey, hash); + ExperimentalDelegation.WrappedSignature memory wrappedSignature = ExperimentalDelegation.WrappedSignature( + 0, ECDSA.Signature(uint256(r), uint256(s), v == 27 ? 0 : 1), false, "0x" + ); + + assertEq( + delegation.isValidSignature(hash, abi.encode(wrappedSignature)), + bytes4(keccak256("isValidSignature(bytes32,bytes)")) + ); + } }