Add 'caller' signature type
This commit is contained in:
committed by
Amir Bandeali
parent
2fe4e380d1
commit
d0f32d1865
@@ -26,6 +26,7 @@ contract MixinSignatureValidator is
|
||||
{
|
||||
enum SignatureType {
|
||||
Invalid,
|
||||
Caller,
|
||||
Ecrecover
|
||||
}
|
||||
|
||||
@@ -36,27 +37,44 @@ contract MixinSignatureValidator is
|
||||
public view
|
||||
returns (bool isValid)
|
||||
{
|
||||
// TODO: Domain separation: make hash depend on role. (Taker sig should not be valid as maker sig, etc.)
|
||||
|
||||
require(signature.length >= 1);
|
||||
|
||||
// Select signature type
|
||||
SignatureType signatureType = SignatureType(uint8(signature[0]));
|
||||
if (signatureType != SignatureType.Ecrecover) {
|
||||
valid = false;
|
||||
return;
|
||||
}
|
||||
|
||||
// Verify using ecrecover
|
||||
require(signature.length == 66);
|
||||
uint8 v = uint8(signature[1]);
|
||||
bytes32 r = get32(signature, 2);
|
||||
bytes32 s = get32(signature, 34);
|
||||
address recovered = ecrecover(
|
||||
keccak256("\x19Ethereum Signed Message:\n32", hash),
|
||||
v,
|
||||
r,
|
||||
s
|
||||
);
|
||||
isValid = signer == recovered;
|
||||
// Zero is always an invalid signature
|
||||
if (signatureType == SignatureType.Invalid) {
|
||||
require(signature.length == 1);
|
||||
isValid = false;
|
||||
return;
|
||||
|
||||
// Implicitly signed by caller
|
||||
} else if (signatureType == SignatureType.Caller) {
|
||||
require(signature.length == 1);
|
||||
isValid = signer == msg.sender;
|
||||
return;
|
||||
|
||||
// Signed using web3.eth_sign
|
||||
} else if (signatureType == SignatureType.Ecrecover) {
|
||||
require(signature.length == 66);
|
||||
uint8 v = uint8(signature[1]);
|
||||
bytes32 r = get32(signature, 2);
|
||||
bytes32 s = get32(signature, 34);
|
||||
address recovered = ecrecover(
|
||||
keccak256("\x19Ethereum Signed Message:\n32", hash),
|
||||
v,
|
||||
r,
|
||||
s
|
||||
);
|
||||
isValid = signer == recovered;
|
||||
return;
|
||||
|
||||
// Anything else is illegal
|
||||
} else {
|
||||
revert();
|
||||
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
function get32(bytes b, uint256 index)
|
||||
|
Reference in New Issue
Block a user