github.com/c2s/go-ethereum@v1.9.7/crypto/bn256/bn256_fuzz.go (about)

     1  // Copyright 2018 Péter Szilágyi. All rights reserved.
     2  // Use of this source code is governed by a BSD-style license that can be found
     3  // in the LICENSE file.
     4  
     5  // +build gofuzz
     6  
     7  package bn256
     8  
     9  import (
    10  	"bytes"
    11  	"math/big"
    12  
    13  	cloudflare "github.com/ethereum/go-ethereum/crypto/bn256/cloudflare"
    14  	google "github.com/ethereum/go-ethereum/crypto/bn256/google"
    15  )
    16  
    17  // FuzzAdd fuzzez bn256 addition between the Google and Cloudflare libraries.
    18  func FuzzAdd(data []byte) int {
    19  	// Ensure we have enough data in the first place
    20  	if len(data) != 128 {
    21  		return 0
    22  	}
    23  	// Ensure both libs can parse the first curve point
    24  	xc := new(cloudflare.G1)
    25  	_, errc := xc.Unmarshal(data[:64])
    26  
    27  	xg := new(google.G1)
    28  	_, errg := xg.Unmarshal(data[:64])
    29  
    30  	if (errc == nil) != (errg == nil) {
    31  		panic("parse mismatch")
    32  	} else if errc != nil {
    33  		return 0
    34  	}
    35  	// Ensure both libs can parse the second curve point
    36  	yc := new(cloudflare.G1)
    37  	_, errc = yc.Unmarshal(data[64:])
    38  
    39  	yg := new(google.G1)
    40  	_, errg = yg.Unmarshal(data[64:])
    41  
    42  	if (errc == nil) != (errg == nil) {
    43  		panic("parse mismatch")
    44  	} else if errc != nil {
    45  		return 0
    46  	}
    47  	// Add the two points and ensure they result in the same output
    48  	rc := new(cloudflare.G1)
    49  	rc.Add(xc, yc)
    50  
    51  	rg := new(google.G1)
    52  	rg.Add(xg, yg)
    53  
    54  	if !bytes.Equal(rc.Marshal(), rg.Marshal()) {
    55  		panic("add mismatch")
    56  	}
    57  	return 0
    58  }
    59  
    60  // FuzzMul fuzzez bn256 scalar multiplication between the Google and Cloudflare
    61  // libraries.
    62  func FuzzMul(data []byte) int {
    63  	// Ensure we have enough data in the first place
    64  	if len(data) != 96 {
    65  		return 0
    66  	}
    67  	// Ensure both libs can parse the curve point
    68  	pc := new(cloudflare.G1)
    69  	_, errc := pc.Unmarshal(data[:64])
    70  
    71  	pg := new(google.G1)
    72  	_, errg := pg.Unmarshal(data[:64])
    73  
    74  	if (errc == nil) != (errg == nil) {
    75  		panic("parse mismatch")
    76  	} else if errc != nil {
    77  		return 0
    78  	}
    79  	// Add the two points and ensure they result in the same output
    80  	rc := new(cloudflare.G1)
    81  	rc.ScalarMult(pc, new(big.Int).SetBytes(data[64:]))
    82  
    83  	rg := new(google.G1)
    84  	rg.ScalarMult(pg, new(big.Int).SetBytes(data[64:]))
    85  
    86  	if !bytes.Equal(rc.Marshal(), rg.Marshal()) {
    87  		panic("scalar mul mismatch")
    88  	}
    89  	return 0
    90  }
    91  
    92  func FuzzPair(data []byte) int {
    93  	// Ensure we have enough data in the first place
    94  	if len(data) != 192 {
    95  		return 0
    96  	}
    97  	// Ensure both libs can parse the curve point
    98  	pc := new(cloudflare.G1)
    99  	_, errc := pc.Unmarshal(data[:64])
   100  
   101  	pg := new(google.G1)
   102  	_, errg := pg.Unmarshal(data[:64])
   103  
   104  	if (errc == nil) != (errg == nil) {
   105  		panic("parse mismatch")
   106  	} else if errc != nil {
   107  		return 0
   108  	}
   109  	// Ensure both libs can parse the twist point
   110  	tc := new(cloudflare.G2)
   111  	_, errc = tc.Unmarshal(data[64:])
   112  
   113  	tg := new(google.G2)
   114  	_, errg = tg.Unmarshal(data[64:])
   115  
   116  	if (errc == nil) != (errg == nil) {
   117  		panic("parse mismatch")
   118  	} else if errc != nil {
   119  		return 0
   120  	}
   121  	// Pair the two points and ensure thet result in the same output
   122  	if cloudflare.PairingCheck([]*cloudflare.G1{pc}, []*cloudflare.G2{tc}) != google.PairingCheck([]*google.G1{pg}, []*google.G2{tg}) {
   123  		panic("pair mismatch")
   124  	}
   125  	return 0
   126  }