Add 'caller' signature type

This commit is contained in:
Remco Bloemen
2018-02-06 23:13:26 -08:00
committed by Amir Bandeali
parent 2fe4e380d1
commit d0f32d1865

View File

@@ -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)