Skip to content

Commit 08b9da4

Browse files
committed
Fix personal sign fallback, only do NestedPersonalSign
1 parent 756a119 commit 08b9da4

File tree

5 files changed

+10
-63
lines changed

5 files changed

+10
-63
lines changed
Lines changed: 4 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,10 @@
11
{
22
"isValidSignature_P256": "41828",
3-
"isValidSignature_P256_personalSign": "33738",
4-
"isValidSignature_P256_personalSign_notNested_usingHashTypedData": "306194",
5-
"isValidSignature_P256_typedData_notNested_safeERC1271Caller": "32853",
3+
"isValidSignature_P256_personalSign": "33678",
4+
"isValidSignature_P256_typedData_notNested_safeERC1271Caller": "32820",
65
"isValidSignature_P256_withHook": "47986",
76
"isValidSignature_WebAuthnP256": "48515",
87
"isValidSignature_rootKey": "17370",
9-
"isValidSignature_rootKey_personalSign": "9301",
10-
"isValidSignature_rootKey_personalSign_notNested_usingHashTypedData": "13708",
11-
"isValidSignature_rootKey_typedData_notNested_safeERC1271Caller": "8416"
8+
"isValidSignature_rootKey_personalSign": "9241",
9+
"isValidSignature_rootKey_typedData_notNested_safeERC1271Caller": "8383"
1210
}

snapshots/MinimalDelegationTest.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
{
2-
"minimalDelegationEntry bytecode size": "20946",
2+
"minimalDelegationEntry bytecode size": "20885",
33
"register": "184758",
44
"revoke": "54560",
55
"validateUserOp_missingAccountFunds": "64567",

src/ERC1271.sol

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@ abstract contract ERC1271 is IERC1271, BaseAuthorization {
2424
function setERC1271CallerIsSafe(address caller, bool isSafe) external onlyThis {
2525
_erc1271CallerIsSafe[caller] = isSafe;
2626
}
27-
27+
2828
/// @inheritdoc IERC1271
2929
function isValidSignature(bytes32 hash, bytes calldata signature) public view virtual returns (bytes4);
3030
}

src/MinimalDelegation.sol

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -201,18 +201,16 @@ contract MinimalDelegation is
201201
// Must be branched because we do abi decoding in memory which will throw since the encoding schemes are different
202202
// ECDSA signatures are 65 bytes while P256 signatures are 64 bytes
203203
if (signature.length == 64 || signature.length == 65) {
204-
if(_isSafeERC1271Caller(msg.sender)) {
204+
if (_isSafeERC1271Caller(msg.sender)) {
205205
// If the caller is safe we can simply verify the key's signature over `data`
206206
// Data is already hashed with the app's domain separator so we don't rehash
207207
isValid = key.verify(data, signature);
208208
} else {
209209
// Otherwise, we try to verify the signature using NestedPersonalSign
210-
// falling back to regular PersonalSign
211-
isValid =
212-
_isValidNestedPersonalSignature(key, data, signature)
213-
|| key.verify(hashTypedData(data), signature);
210+
isValid = _isValidNestedPersonalSignature(key, data, signature);
214211
}
215212
} else {
213+
// If there is additional data in the signature we assume we are using the TypedDataSign path
216214
isValid = _isValidTypedDataSig(key, data, signature);
217215
}
218216
// Early return if the signature is invalid

test/MinimalDelegation.isValidSignature.t.sol

Lines changed: 1 addition & 50 deletions
Original file line numberDiff line numberDiff line change
@@ -341,7 +341,7 @@ contract MinimalDelegationIsValidSignatureTest is DelegationHandler, HookHandler
341341
assertEq(result, _1271_MAGIC_VALUE);
342342
}
343343

344-
function test_isValidSignature_personalSign_notNested_andNotHashTypedData_isInvalid() public {
344+
function test_isValidSignature_personalSign_notNested_isInvalid() public {
345345
string memory message = "test";
346346
bytes32 messageHash = MessageHashUtils.toEthSignedMessageHash(bytes(message));
347347
// Incorrectly do personal_sign instead of over the typed PersonalSign digest
@@ -352,21 +352,6 @@ contract MinimalDelegationIsValidSignatureTest is DelegationHandler, HookHandler
352352
assertEq(signerAccount.isValidSignature(messageHash, wrappedSignature), _1271_INVALID_VALUE);
353353
}
354354

355-
function test_isValidSignature_personalSign_p256Key_notNested_andNotHashTypedData_isInvalid() public {
356-
TestKey memory p256Key = TestKeyManager.initDefault(KeyType.P256);
357-
vm.prank(address(signerAccount));
358-
signerAccount.register(p256Key.toKey());
359-
360-
string memory message = "test";
361-
bytes32 messageHash = MessageHashUtils.toEthSignedMessageHash(bytes(message));
362-
// Incorrectly do personal_sign instead of over the typed PersonalSign digest
363-
bytes memory signature = p256Key.sign(messageHash);
364-
bytes memory wrappedSignature = abi.encode(p256Key.toKeyHash(), signature, EMPTY_HOOK_DATA);
365-
// Should return the invalid value
366-
vm.prank(address(mockERC1271VerifyingContract));
367-
assertEq(signerAccount.isValidSignature(messageHash, wrappedSignature), _1271_INVALID_VALUE);
368-
}
369-
370355
/// forge-config: default.isolate = true
371356
/// forge-config: ci.isolate = true
372357
function test_isValidSignature_rootKey_notNested_safeERC1271Caller_isValid_gas() public {
@@ -407,38 +392,4 @@ contract MinimalDelegationIsValidSignatureTest is DelegationHandler, HookHandler
407392
assertEq(result, _1271_MAGIC_VALUE);
408393
vm.snapshotGasLastCall("isValidSignature_P256_typedData_notNested_safeERC1271Caller");
409394
}
410-
411-
/// forge-config: default.isolate = true
412-
/// forge-config: ci.isolate = true
413-
function test_isValidSignature_rootKey_personalSign_notNested_usingHashTypedData_isValid_gas() public {
414-
string memory message = "test";
415-
bytes32 messageHash = MessageHashUtils.toEthSignedMessageHash(bytes(message));
416-
// We don't do ERC-7739 NestedPersonalSign, but rather apply EIP-712 hashing over the message
417-
// which is also accepted since it protects against replay attacks by using the account's domain separator
418-
bytes memory signature = signerTestKey.sign(signerAccount.hashTypedData(messageHash));
419-
bytes memory wrappedSignature = abi.encode(KeyLib.ROOT_KEY_HASH, signature, EMPTY_HOOK_DATA);
420-
vm.prank(address(mockERC1271VerifyingContract));
421-
// Should be valid and return the magic value
422-
assertEq(signerAccount.isValidSignature(messageHash, wrappedSignature), _1271_MAGIC_VALUE);
423-
vm.snapshotGasLastCall("isValidSignature_rootKey_personalSign_notNested_usingHashTypedData");
424-
}
425-
426-
/// forge-config: default.isolate = true
427-
/// forge-config: ci.isolate = true
428-
function test_isValidSignature_p256Key_personalSign_notNested_usingHashTypedData_isValid_gas() public {
429-
TestKey memory p256Key = TestKeyManager.initDefault(KeyType.P256);
430-
vm.prank(address(signerAccount));
431-
signerAccount.register(p256Key.toKey());
432-
433-
string memory message = "test";
434-
bytes32 messageHash = MessageHashUtils.toEthSignedMessageHash(bytes(message));
435-
// We don't do ERC-7739 NestedPersonalSign, but rather apply EIP-712 hashing over the message
436-
// which is also accepted since it protects against replay attacks by using the account's domain separator
437-
bytes memory signature = p256Key.sign(signerAccount.hashTypedData(messageHash));
438-
bytes memory wrappedSignature = abi.encode(p256Key.toKeyHash(), signature, EMPTY_HOOK_DATA);
439-
vm.prank(address(mockERC1271VerifyingContract));
440-
// Should be valid and return the magic value
441-
assertEq(signerAccount.isValidSignature(messageHash, wrappedSignature), _1271_MAGIC_VALUE);
442-
vm.snapshotGasLastCall("isValidSignature_P256_personalSign_notNested_usingHashTypedData");
443-
}
444395
}

0 commit comments

Comments
 (0)