forked from cerc-io/plugeth
tests/fuzzers/bls1381: add bls fuzzer (#21796)
* added bls fuzzer * crypto/bls12381: revert bls-changes, fixup fuzzer tests * fuzzers: split bls fuzzing into 8 different units * fuzzers/bls: remove (now stale) corpus * crypto/bls12381: added blsfuzz corpus * fuzzers/bls12381: fix the bls corpus * fuzzers: fix oss-fuzz script * tests/fuzzers: fixups on bls corpus * test/fuzzers: remove leftover corpus Co-authored-by: Marius van der Wijden <m.vanderwijden@live.de>
This commit is contained in:
parent
bddf5aaa2f
commit
6104ab6b6d
@ -1393,6 +1393,15 @@ func BenchmarkMultiplication(t *testing.B) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func BenchmarkInverse(t *testing.B) {
|
||||||
|
a, _ := new(fe).rand(rand.Reader)
|
||||||
|
b, _ := new(fe).rand(rand.Reader)
|
||||||
|
t.ResetTimer()
|
||||||
|
for i := 0; i < t.N; i++ {
|
||||||
|
inverse(a, b)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
func padBytes(in []byte, size int) []byte {
|
func padBytes(in []byte, size int) []byte {
|
||||||
out := make([]byte, size)
|
out := make([]byte, size)
|
||||||
if len(in) > size {
|
if len(in) > size {
|
||||||
|
19
oss-fuzz.sh
19
oss-fuzz.sh
@ -30,13 +30,20 @@ function compile_fuzzer {
|
|||||||
path=$SRC/go-ethereum/$1
|
path=$SRC/go-ethereum/$1
|
||||||
func=$2
|
func=$2
|
||||||
fuzzer=$3
|
fuzzer=$3
|
||||||
echo "Building $fuzzer"
|
corpusfile="${path}/testdata/${fuzzer}_seed_corpus.zip"
|
||||||
|
echo "Building $fuzzer (expecting corpus at $corpusfile)"
|
||||||
(cd $path && \
|
(cd $path && \
|
||||||
go-fuzz -func $func -o $WORK/$fuzzer.a . && \
|
go-fuzz -func $func -o $WORK/$fuzzer.a . && \
|
||||||
echo "First stage built OK" && \
|
echo "First stage built OK" && \
|
||||||
$CXX $CXXFLAGS $LIB_FUZZING_ENGINE $WORK/$fuzzer.a -o $OUT/$fuzzer && \
|
$CXX $CXXFLAGS $LIB_FUZZING_ENGINE $WORK/$fuzzer.a -o $OUT/$fuzzer && \
|
||||||
echo "Second stage built ok" )
|
echo "Second stage built ok" )
|
||||||
|
|
||||||
|
## Check if there exists a seed corpus file
|
||||||
|
if [ -f $corpusfile ]
|
||||||
|
then
|
||||||
|
cp $corpusfile $OUT/
|
||||||
|
echo "Found seed corpus: $corpusfile"
|
||||||
|
fi
|
||||||
}
|
}
|
||||||
|
|
||||||
compile_fuzzer common/bitutil Fuzz fuzzBitutilCompress
|
compile_fuzzer common/bitutil Fuzz fuzzBitutilCompress
|
||||||
@ -51,6 +58,16 @@ compile_fuzzer tests/fuzzers/rlp Fuzz fuzzRlp
|
|||||||
compile_fuzzer tests/fuzzers/trie Fuzz fuzzTrie
|
compile_fuzzer tests/fuzzers/trie Fuzz fuzzTrie
|
||||||
compile_fuzzer tests/fuzzers/stacktrie Fuzz fuzzStackTrie
|
compile_fuzzer tests/fuzzers/stacktrie Fuzz fuzzStackTrie
|
||||||
|
|
||||||
|
compile_fuzzer tests/fuzzers/bls12381 FuzzG1Add fuzz_g1_add
|
||||||
|
compile_fuzzer tests/fuzzers/bls12381 FuzzG1Mul fuzz_g1_mul
|
||||||
|
compile_fuzzer tests/fuzzers/bls12381 FuzzG1MultiExp fuzz_g1_multiexp
|
||||||
|
compile_fuzzer tests/fuzzers/bls12381 FuzzG2Add fuzz_g2_add
|
||||||
|
compile_fuzzer tests/fuzzers/bls12381 FuzzG2Mul fuzz_g2_mul
|
||||||
|
compile_fuzzer tests/fuzzers/bls12381 FuzzG2MultiExp fuzz_g2_multiexp
|
||||||
|
compile_fuzzer tests/fuzzers/bls12381 FuzzPairing fuzz_pairing
|
||||||
|
compile_fuzzer tests/fuzzers/bls12381 FuzzMapG1 fuzz_map_g1
|
||||||
|
compile_fuzzer tests/fuzzers/bls12381 FuzzMapG2 fuzz_map_g2
|
||||||
|
|
||||||
# This doesn't work very well @TODO
|
# This doesn't work very well @TODO
|
||||||
#compile_fuzzertests/fuzzers/abi Fuzz fuzzAbi
|
#compile_fuzzertests/fuzzers/abi Fuzz fuzzAbi
|
||||||
|
|
||||||
|
101
tests/fuzzers/bls12381/bls_fuzzer.go
Normal file
101
tests/fuzzers/bls12381/bls_fuzzer.go
Normal file
@ -0,0 +1,101 @@
|
|||||||
|
// Copyright 2020 The go-ethereum Authors
|
||||||
|
// This file is part of the go-ethereum library.
|
||||||
|
//
|
||||||
|
// The go-ethereum library is free software: you can redistribute it and/or modify
|
||||||
|
// it under the terms of the GNU Lesser General Public License as published by
|
||||||
|
// the Free Software Foundation, either version 3 of the License, or
|
||||||
|
// (at your option) any later version.
|
||||||
|
//
|
||||||
|
// The go-ethereum library is distributed in the hope that it will be useful,
|
||||||
|
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
// GNU Lesser General Public License for more details.
|
||||||
|
//
|
||||||
|
// You should have received a copy of the GNU Lesser General Public License
|
||||||
|
// along with the go-ethereum library. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
|
||||||
|
package bls
|
||||||
|
|
||||||
|
import (
|
||||||
|
"bytes"
|
||||||
|
"fmt"
|
||||||
|
|
||||||
|
"github.com/ethereum/go-ethereum/common"
|
||||||
|
"github.com/ethereum/go-ethereum/core/vm"
|
||||||
|
)
|
||||||
|
|
||||||
|
const (
|
||||||
|
blsG1Add = byte(10)
|
||||||
|
blsG1Mul = byte(11)
|
||||||
|
blsG1MultiExp = byte(12)
|
||||||
|
blsG2Add = byte(13)
|
||||||
|
blsG2Mul = byte(14)
|
||||||
|
blsG2MultiExp = byte(15)
|
||||||
|
blsPairing = byte(16)
|
||||||
|
blsMapG1 = byte(17)
|
||||||
|
blsMapG2 = byte(18)
|
||||||
|
)
|
||||||
|
|
||||||
|
func FuzzG1Add(data []byte) int { return fuzz(blsG1Add, data) }
|
||||||
|
func FuzzG1Mul(data []byte) int { return fuzz(blsG1Mul, data) }
|
||||||
|
func FuzzG1MultiExp(data []byte) int { return fuzz(blsG1MultiExp, data) }
|
||||||
|
func FuzzG2Add(data []byte) int { return fuzz(blsG2Add, data) }
|
||||||
|
func FuzzG2Mul(data []byte) int { return fuzz(blsG2Mul, data) }
|
||||||
|
func FuzzG2MultiExp(data []byte) int { return fuzz(blsG2MultiExp, data) }
|
||||||
|
func FuzzPairing(data []byte) int { return fuzz(blsPairing, data) }
|
||||||
|
func FuzzMapG1(data []byte) int { return fuzz(blsMapG1, data) }
|
||||||
|
func FuzzMapG2(data []byte) int { return fuzz(blsMapG2, data) }
|
||||||
|
|
||||||
|
func checkInput(id byte, inputLen int) bool {
|
||||||
|
switch id {
|
||||||
|
case blsG1Add:
|
||||||
|
return inputLen == 256
|
||||||
|
case blsG1Mul:
|
||||||
|
return inputLen == 160
|
||||||
|
case blsG1MultiExp:
|
||||||
|
return inputLen%160 == 0
|
||||||
|
case blsG2Add:
|
||||||
|
return inputLen == 512
|
||||||
|
case blsG2Mul:
|
||||||
|
return inputLen == 288
|
||||||
|
case blsG2MultiExp:
|
||||||
|
return inputLen%288 == 0
|
||||||
|
case blsPairing:
|
||||||
|
return inputLen%384 == 0
|
||||||
|
case blsMapG1:
|
||||||
|
return inputLen == 64
|
||||||
|
case blsMapG2:
|
||||||
|
return inputLen == 128
|
||||||
|
}
|
||||||
|
panic("programmer error")
|
||||||
|
}
|
||||||
|
|
||||||
|
// The fuzzer functions must return
|
||||||
|
// 1 if the fuzzer should increase priority of the
|
||||||
|
// given input during subsequent fuzzing (for example, the input is lexically
|
||||||
|
// correct and was parsed successfully);
|
||||||
|
// -1 if the input must not be added to corpus even if gives new coverage; and
|
||||||
|
// 0 otherwise
|
||||||
|
// other values are reserved for future use.
|
||||||
|
func fuzz(id byte, data []byte) int {
|
||||||
|
// Even on bad input, it should not crash, so we still test the gas calc
|
||||||
|
precompile := vm.PrecompiledContractsYoloV2[common.BytesToAddress([]byte{id})]
|
||||||
|
gas := precompile.RequiredGas(data)
|
||||||
|
if !checkInput(id, len(data)) {
|
||||||
|
return 0
|
||||||
|
}
|
||||||
|
// If the gas cost is too large (25M), bail out
|
||||||
|
if gas > 25*1000*1000 {
|
||||||
|
return 0
|
||||||
|
}
|
||||||
|
cpy := make([]byte, len(data))
|
||||||
|
copy(cpy, data)
|
||||||
|
_, err := precompile.Run(cpy)
|
||||||
|
if !bytes.Equal(cpy, data) {
|
||||||
|
panic(fmt.Sprintf("input data modified, precompile %d: %x %x", id, data, cpy))
|
||||||
|
}
|
||||||
|
if err != nil {
|
||||||
|
return 0
|
||||||
|
}
|
||||||
|
return 1
|
||||||
|
}
|
BIN
tests/fuzzers/bls12381/testdata/fuzz_g1_add_seed_corpus.zip
vendored
Normal file
BIN
tests/fuzzers/bls12381/testdata/fuzz_g1_add_seed_corpus.zip
vendored
Normal file
Binary file not shown.
BIN
tests/fuzzers/bls12381/testdata/fuzz_g1_mul_seed_corpus.zip
vendored
Normal file
BIN
tests/fuzzers/bls12381/testdata/fuzz_g1_mul_seed_corpus.zip
vendored
Normal file
Binary file not shown.
BIN
tests/fuzzers/bls12381/testdata/fuzz_g1_multiexp_seed_corpus.zip
vendored
Normal file
BIN
tests/fuzzers/bls12381/testdata/fuzz_g1_multiexp_seed_corpus.zip
vendored
Normal file
Binary file not shown.
BIN
tests/fuzzers/bls12381/testdata/fuzz_g2_add_seed_corpus.zip
vendored
Normal file
BIN
tests/fuzzers/bls12381/testdata/fuzz_g2_add_seed_corpus.zip
vendored
Normal file
Binary file not shown.
BIN
tests/fuzzers/bls12381/testdata/fuzz_g2_mul_seed_corpus.zip
vendored
Normal file
BIN
tests/fuzzers/bls12381/testdata/fuzz_g2_mul_seed_corpus.zip
vendored
Normal file
Binary file not shown.
BIN
tests/fuzzers/bls12381/testdata/fuzz_g2_multiexp_seed_corpus.zip
vendored
Normal file
BIN
tests/fuzzers/bls12381/testdata/fuzz_g2_multiexp_seed_corpus.zip
vendored
Normal file
Binary file not shown.
BIN
tests/fuzzers/bls12381/testdata/fuzz_map_g1_seed_corpus.zip
vendored
Normal file
BIN
tests/fuzzers/bls12381/testdata/fuzz_map_g1_seed_corpus.zip
vendored
Normal file
Binary file not shown.
BIN
tests/fuzzers/bls12381/testdata/fuzz_map_g2_seed_corpus.zip
vendored
Normal file
BIN
tests/fuzzers/bls12381/testdata/fuzz_map_g2_seed_corpus.zip
vendored
Normal file
Binary file not shown.
BIN
tests/fuzzers/bls12381/testdata/fuzz_pairing_seed_corpus.zip
vendored
Normal file
BIN
tests/fuzzers/bls12381/testdata/fuzz_pairing_seed_corpus.zip
vendored
Normal file
Binary file not shown.
Loading…
Reference in New Issue
Block a user