ethereum: prevent invalid guardian sets or same signer signatures

Co-authored-by: valentin <valentinvonalbrecht@yahoo.de>
This commit is contained in:
Hendrik Hofstadt 2020-08-30 17:30:43 +02:00
parent 7dc309c490
commit 4871022fee
1 changed files with 5 additions and 0 deletions

View File

@ -99,11 +99,16 @@ contract Wormhole is ReentrancyGuard {
require(!consumedVAAs[hash], "VAA was already executed"); require(!consumedVAAs[hash], "VAA was already executed");
GuardianSet memory guardian_set = guardian_sets[vaa_guardian_set_index]; GuardianSet memory guardian_set = guardian_sets[vaa_guardian_set_index];
require(guardian_set.keys.length > 0, "invalid guardian set");
require(guardian_set.expiration_time == 0 || guardian_set.expiration_time > block.timestamp, "guardian set has expired"); require(guardian_set.expiration_time == 0 || guardian_set.expiration_time > block.timestamp, "guardian set has expired");
require(((guardian_set.keys.length / 4) * 3) + 1 <= len_signers, "no quorum"); require(((guardian_set.keys.length / 4) * 3) + 1 <= len_signers, "no quorum");
int16 last_index = - 1;
for (uint i = 0; i < len_signers; i++) { for (uint i = 0; i < len_signers; i++) {
uint8 index = vaa.toUint8(6 + i * 66); uint8 index = vaa.toUint8(6 + i * 66);
require(index > last_index, "signature indices must be ascending");
last_index = int16(index);
bytes32 r = vaa.toBytes32(7 + i * 66); bytes32 r = vaa.toBytes32(7 + i * 66);
bytes32 s = vaa.toBytes32(39 + i * 66); bytes32 s = vaa.toBytes32(39 + i * 66);
uint8 v = vaa.toUint8(71 + i * 66); uint8 v = vaa.toUint8(71 + i * 66);