-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathlib_certifyer.sol
65 lines (51 loc) · 1.8 KB
/
lib_certifyer.sol
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
pragma solidity 0.5.4;
library Certifyer {
//event Vrs(uint8 v, bytes32 r, bytes32 s);
function splitSignature(bytes sig) pure public returns (uint8, bytes32, bytes32) {
require(sig.length == 65);
bytes32 r;
bytes32 s;
uint8 v;
assembly {
// first 32 bytes, after the length prefix
r := mload(add(sig, 32))
// second 32 bytes
s := mload(add(sig, 64))
// final byte (first byte of the next 32 bytes)
v := byte(0, mload(add(sig, 96)))
}
return (v, r, s);
}
function uint2str(uint i) pure public returns (bytes){
if (i == 0) return "0";
uint j = i;
uint length=0;
while (j != 0){
length++;
j /= 10;
}
bytes memory bstr = new bytes(length);
uint k = length - 1;
while (i != 0){
bstr[k--] = byte(48 + i % 10);
i /= 10;
}
return bstr;
}
function messageHash(bytes message) pure public returns (bytes32) {
return keccak256(abi.encodePacked("\x19Ethereum Signed Message:\n",uint2str(message.length), message));
//return keccak256("\x19Ethereum Signed Message:\n\x32\x30", message);
}
function recoverSignerFromMessageHash(bytes32 message_hash, bytes sig) pure public returns (address) {
uint8 v;
bytes32 r;
bytes32 s;
//bytes32 ethMessage = keccak256("\x19Ethereum Signed Message:\n",bytes(message).length, message);
(v, r, s) = splitSignature(sig);
//emit Vrs(v,r,s);
return ecrecover(message_hash, v, r, s);
}
function recoverSignerFromMessage(bytes message, bytes sig) pure public returns (address) {
return recoverSignerFromMessageHash(messageHash(message), sig);
}
}