|
|
//go:build gofuzz
// +build gofuzz
// Copyright 2020 ConsenSys Software 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.
// Code generated by consensys/gnark-crypto DO NOT EDIT
package ff
import ( "bytes" "encoding/binary" "io" "math/big" "math/bits" )
const ( fuzzInteresting = 1 fuzzNormal = 0 fuzzDiscard = -1 )
// Fuzz arithmetic operations fuzzer
func Fuzz(data []byte) int { r := bytes.NewReader(data)
var e1, e2 Element e1.SetRawBytes(r) e2.SetRawBytes(r)
{ // mul assembly
var c, _c Element a, _a, b, _b := e1, e1, e2, e2 c.Mul(&a, &b) _mulGeneric(&_c, &_a, &_b)
if !c.Equal(&_c) { panic("mul asm != mul generic on Element") } }
{ // inverse
inv := e1 inv.Inverse(&inv)
var bInv, b1, b2 big.Int e1.ToBigIntRegular(&b1) bInv.ModInverse(&b1, Modulus()) inv.ToBigIntRegular(&b2)
if b2.Cmp(&bInv) != 0 { panic("inverse operation doesn't match big int result") } }
{ // a + -a == 0
a, b := e1, e1 b.Neg(&b) a.Add(&a, &b) if !a.IsZero() { panic("a + -a != 0") } }
return fuzzNormal
}
// SetRawBytes reads up to Bytes (bytes needed to represent Element) from reader
// and interpret it as big endian uint64
// used for fuzzing purposes only
func (z *Element) SetRawBytes(r io.Reader) {
buf := make([]byte, 8)
for i := 0; i < len(z); i++ { if _, err := io.ReadFull(r, buf); err != nil { goto eof } z[i] = binary.BigEndian.Uint64(buf[:]) } eof: z[3] %= qElement[3]
if z.BiggerModulus() { var b uint64 z[0], b = bits.Sub64(z[0], qElement[0], 0) z[1], b = bits.Sub64(z[1], qElement[1], b) z[2], b = bits.Sub64(z[2], qElement[2], b) z[3], b = bits.Sub64(z[3], qElement[3], b) }
return }
func (z *Element) BiggerModulus() bool { if z[3] > qElement[3] { return true } if z[3] < qElement[3] { return false }
if z[2] > qElement[2] { return true } if z[2] < qElement[2] { return false }
if z[1] > qElement[1] { return true } if z[1] < qElement[1] { return false }
return z[0] >= qElement[0] }
|