This commit changes the behavior of BitCurve.Add to be more inline with btcd. It fixes two different bugs: 1) When adding a point at infinity to another point, the other point should be returned. While this is undefined behavior, it is better to be more inline with the go standard library. Thus (0,0) + (a, b) = (a,b) 2) Adding the same point to itself produced the point at infinity. This is incorrect, now doubleJacobian is used to correctly calculate it. Thus (a,b) + (a,b) == 2* (a,b) and not (0,0) anymore. The change also adds a differential fuzzer for Add, testing it against btcd. Co-authored-by: Felix Lange <fjl@twurst.com>
		
			
				
	
	
		
			125 lines
		
	
	
		
			4.7 KiB
		
	
	
	
		
			Bash
		
	
	
	
	
	
			
		
		
	
	
			125 lines
		
	
	
		
			4.7 KiB
		
	
	
	
		
			Bash
		
	
	
	
	
	
| #/bin/bash -eu
 | |
| # Copyright 2020 Google Inc.
 | |
| #
 | |
| # Licensed under the Apache License, Version 2.0 (the "License");
 | |
| # you may not use this file except in compliance with the License.
 | |
| # You may obtain a copy of the License at
 | |
| #
 | |
| #      http://www.apache.org/licenses/LICENSE-2.0
 | |
| #
 | |
| # Unless required by applicable law or agreed to in writing, software
 | |
| # distributed under the License is distributed on an "AS IS" BASIS,
 | |
| # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 | |
| # See the License for the specific language governing permissions and
 | |
| # limitations under the License.
 | |
| #
 | |
| ################################################################################
 | |
| 
 | |
| # This file is for integration with Google OSS-Fuzz.
 | |
| # The following ENV variables are available when executing on OSS-fuzz:
 | |
| #
 | |
| # /out/         $OUT    Directory to store build artifacts (fuzz targets, dictionaries, options files, seed corpus archives).
 | |
| # /src/         $SRC    Directory to checkout source files.
 | |
| # /work/        $WORK   Directory to store intermediate files.
 | |
| #
 | |
| # $CC, $CXX, $CCC       The C and C++ compiler binaries.
 | |
| # $CFLAGS, $CXXFLAGS    C and C++ compiler flags.
 | |
| # $LIB_FUZZING_ENGINE   C++ compiler argument to link fuzz target against the prebuilt engine library (e.g. libFuzzer).
 | |
| 
 | |
| # This sets the -coverpgk for the coverage report when the corpus is executed through go test
 | |
| coverpkg="github.com/ethereum/go-ethereum/..."
 | |
| 
 | |
| function coverbuild {
 | |
|   path=$1
 | |
|   function=$2
 | |
|   fuzzer=$3
 | |
|   tags=""
 | |
| 
 | |
|   if [[ $#  -eq 4 ]]; then
 | |
|     tags="-tags $4"
 | |
|   fi
 | |
|   cd $path
 | |
|   fuzzed_package=`pwd | rev | cut -d'/' -f 1 | rev`
 | |
|   cp $GOPATH/ossfuzz_coverage_runner.go ./"${function,,}"_test.go
 | |
|   sed -i -e 's/FuzzFunction/'$function'/' ./"${function,,}"_test.go
 | |
|   sed -i -e 's/mypackagebeingfuzzed/'$fuzzed_package'/' ./"${function,,}"_test.go
 | |
|   sed -i -e 's/TestFuzzCorpus/Test'$function'Corpus/' ./"${function,,}"_test.go
 | |
| 
 | |
| cat << DOG > $OUT/$fuzzer
 | |
| #/bin/sh
 | |
| 
 | |
|   cd $OUT/$path
 | |
|   go test -run Test${function}Corpus -v $tags -coverprofile \$1 -coverpkg $coverpkg
 | |
| 
 | |
| DOG
 | |
| 
 | |
|   chmod +x $OUT/$fuzzer
 | |
|   #echo "Built script $OUT/$fuzzer"
 | |
|   #cat $OUT/$fuzzer
 | |
|   cd -
 | |
| }
 | |
| 
 | |
| function compile_fuzzer {
 | |
|   # Inputs:
 | |
|   # $1: The package to fuzz, within go-ethereum
 | |
|   # $2: The name of the fuzzing function
 | |
|   # $3: The name to give to the final fuzzing-binary
 | |
| 
 | |
|   path=$GOPATH/src/github.com/ethereum/go-ethereum/$1
 | |
|   func=$2
 | |
|   fuzzer=$3
 | |
| 
 | |
|   echo "Building $fuzzer"
 | |
| 
 | |
|   # Do a coverage-build or a regular build
 | |
|   if [[ $SANITIZER = *coverage* ]]; then
 | |
|     coverbuild $path $func $fuzzer $coverpkg
 | |
|   else
 | |
|     (cd $path && \
 | |
|         go-fuzz -func $func -o $WORK/$fuzzer.a . && \
 | |
|         $CXX $CXXFLAGS $LIB_FUZZING_ENGINE $WORK/$fuzzer.a -o $OUT/$fuzzer)
 | |
|   fi
 | |
| 
 | |
|   ## Check if there exists a seed corpus file
 | |
|   corpusfile="${path}/testdata/${fuzzer}_seed_corpus.zip"
 | |
|   if [ -f $corpusfile ]
 | |
|   then
 | |
|     cp $corpusfile $OUT/
 | |
|     echo "Found seed corpus: $corpusfile"
 | |
|   fi
 | |
| }
 | |
| 
 | |
| compile_fuzzer tests/fuzzers/bitutil  Fuzz      fuzzBitutilCompress
 | |
| compile_fuzzer tests/fuzzers/bn256    FuzzAdd   fuzzBn256Add
 | |
| compile_fuzzer tests/fuzzers/bn256    FuzzMul   fuzzBn256Mul
 | |
| compile_fuzzer tests/fuzzers/bn256    FuzzPair  fuzzBn256Pair
 | |
| compile_fuzzer tests/fuzzers/runtime  Fuzz      fuzzVmRuntime
 | |
| compile_fuzzer tests/fuzzers/keystore   Fuzz fuzzKeystore
 | |
| compile_fuzzer tests/fuzzers/txfetcher  Fuzz fuzzTxfetcher
 | |
| compile_fuzzer tests/fuzzers/rlp        Fuzz fuzzRlp
 | |
| compile_fuzzer tests/fuzzers/trie       Fuzz fuzzTrie
 | |
| compile_fuzzer tests/fuzzers/stacktrie  Fuzz fuzzStackTrie
 | |
| compile_fuzzer tests/fuzzers/difficulty Fuzz fuzzDifficulty
 | |
| compile_fuzzer tests/fuzzers/abi        Fuzz fuzzAbi
 | |
| compile_fuzzer tests/fuzzers/les        Fuzz fuzzLes
 | |
| compile_fuzzer tests/fuzzers/secp265k1  Fuzz fuzzSecp256k1
 | |
| compile_fuzzer tests/fuzzers/vflux      FuzzClientPool fuzzClientPool
 | |
| 
 | |
| 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
 | |
| 
 | |
| compile_fuzzer tests/fuzzers/bls12381  FuzzCrossG1Add fuzz_cross_g1_add
 | |
| compile_fuzzer tests/fuzzers/bls12381  FuzzCrossG1MultiExp fuzz_cross_g1_multiexp
 | |
| compile_fuzzer tests/fuzzers/bls12381  FuzzCrossG2Add fuzz_cross_g2_add
 | |
| compile_fuzzer tests/fuzzers/bls12381  FuzzCrossPairing fuzz_cross_pairing
 | |
| 
 | |
| #TODO: move this to tests/fuzzers, if possible
 | |
| compile_fuzzer crypto/blake2b  Fuzz      fuzzBlake2b
 |