mirror of https://github.com/ConsenSys/mythril
parent
851fb8ff5b
commit
95c7d04ada
@ -0,0 +1,113 @@ |
||||
from mythril.laser.smt import Solver, symbol_factory, And |
||||
from mythril.laser.ethereum.keccak_function_manager import keccak_function_manager |
||||
import z3 |
||||
import pytest |
||||
|
||||
|
||||
@pytest.mark.parametrize( |
||||
"input1, input2, expected", |
||||
[ |
||||
(symbol_factory.BitVecVal(100, 8), symbol_factory.BitVecVal(101, 8), z3.unsat), |
||||
(symbol_factory.BitVecVal(100, 8), symbol_factory.BitVecVal(100, 16), z3.unsat), |
||||
(symbol_factory.BitVecVal(100, 8), symbol_factory.BitVecVal(100, 8), z3.sat), |
||||
( |
||||
symbol_factory.BitVecSym("N1", 256), |
||||
symbol_factory.BitVecSym("N2", 256), |
||||
z3.sat, |
||||
), |
||||
], |
||||
) |
||||
def test_keccak_basic(input1, input2, expected): |
||||
s = Solver() |
||||
|
||||
o1, c1 = keccak_function_manager.create_keccak(input1) |
||||
o2, c2 = keccak_function_manager.create_keccak(input2) |
||||
s.add(c1) |
||||
s.add(c2) |
||||
|
||||
s.add(o1 == o2) |
||||
assert s.check() == expected |
||||
|
||||
|
||||
def test_keccak_complex_eq(): |
||||
""" |
||||
check for keccak(keccak(b)*2) == keccak(keccak(a)*2) && a != b |
||||
:return: |
||||
""" |
||||
s = Solver() |
||||
a = symbol_factory.BitVecSym("a", 160) |
||||
b = symbol_factory.BitVecSym("b", 160) |
||||
o1, c1 = keccak_function_manager.create_keccak(a) |
||||
o2, c2 = keccak_function_manager.create_keccak(b) |
||||
s.add(And(c1, c2)) |
||||
two = symbol_factory.BitVecVal(2, 256) |
||||
o1 = two * o1 |
||||
o2 = two * o2 |
||||
o1, c1 = keccak_function_manager.create_keccak(o1) |
||||
o2, c2 = keccak_function_manager.create_keccak(o2) |
||||
|
||||
s.add(And(c1, c2)) |
||||
s.add(o1 == o2) |
||||
s.add(a != b) |
||||
|
||||
assert s.check() == z3.unsat |
||||
|
||||
|
||||
def test_keccak_complex_eq2(): |
||||
""" |
||||
check for keccak(keccak(b)*2) == keccak(keccak(a)*2) |
||||
This isn't combined with prev test because incremental solving here requires extra-extra work |
||||
(solution is literally the opposite of prev one) so it will take forever to solve. |
||||
:return: |
||||
""" |
||||
s = Solver() |
||||
a = symbol_factory.BitVecSym("a", 160) |
||||
b = symbol_factory.BitVecSym("b", 160) |
||||
o1, c1 = keccak_function_manager.create_keccak(a) |
||||
o2, c2 = keccak_function_manager.create_keccak(b) |
||||
s.add(And(c1, c2)) |
||||
two = symbol_factory.BitVecVal(2, 256) |
||||
o1 = two * o1 |
||||
o2 = two * o2 |
||||
o1, c1 = keccak_function_manager.create_keccak(o1) |
||||
o2, c2 = keccak_function_manager.create_keccak(o2) |
||||
|
||||
s.add(And(c1, c2)) |
||||
s.add(o1 == o2) |
||||
|
||||
assert s.check() == z3.sat |
||||
|
||||
|
||||
def test_keccak_simple_number(): |
||||
""" |
||||
check for keccak(b) == 10 |
||||
:return: |
||||
""" |
||||
s = Solver() |
||||
a = symbol_factory.BitVecSym("a", 160) |
||||
ten = symbol_factory.BitVecVal(10, 256) |
||||
o, c = keccak_function_manager.create_keccak(a) |
||||
|
||||
s.add(c) |
||||
s.add(ten == o) |
||||
|
||||
assert s.check() == z3.unsat |
||||
|
||||
|
||||
def test_keccak_other_num(): |
||||
""" |
||||
check keccak(keccak(a)*2) == b |
||||
:return: |
||||
""" |
||||
s = Solver() |
||||
a = symbol_factory.BitVecSym("a", 160) |
||||
b = symbol_factory.BitVecSym("b", 256) |
||||
o, c = keccak_function_manager.create_keccak(a) |
||||
two = symbol_factory.BitVecVal(2, 256) |
||||
o = two * o |
||||
s.add(c) |
||||
o, c = keccak_function_manager.create_keccak(o) |
||||
s.add(c) |
||||
s.add(b == o) |
||||
|
||||
assert s.check() == z3.sat |
Loading…
Reference in new issue