1
0
mirror of https://github.com/golang/go synced 2024-11-25 22:37:59 -07:00

math/big: Add fuzzer

This commit is contained in:
AdamKorcz 2021-03-15 14:24:34 +00:00
parent 4350e4961a
commit 3b46420ba9

74
src/math/big/fuzz.go Normal file
View File

@ -0,0 +1,74 @@
// Copyright 2021 The Go Authors. All rights reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.
//go:build gofuzz
// +build gofuzz
package big
import (
"strings"
)
func FuzzCmp(data []byte) int {
if !IsDivisibleBy(len(data), 2) {
return -1
}
half := len(data) / 2
halfOne := data[:half]
x, err := natFromString(string(halfOne))
if err != nil {
return 0
}
halfTwo := data[half:]
y, err := natFromString(string(halfTwo))
if err != nil {
return 0
}
x.cmp(y)
return 1
}
func FuzzExpNN(data []byte) int {
if !IsDivisibleBy(len(data), 3) {
return -1
}
firstThird := len(data) / 3
x, err := natFromString(string(data[:firstThird]))
if err != nil {
return 0
}
secondThird := firstThird * 2
y, err := natFromString(string(data[firstThird:secondThird]))
if err != nil {
return 0
}
z, err := natFromString(string(data[secondThird:]))
if err != nil {
return 0
}
p := nat(nil).expNN(x, y, z)
const n = 165
p = p.shl(p, n)
return 1
}
func IsDivisibleBy(n int, divisibleby int) bool {
return (n % divisibleby) == 0
}
func natFromString(s string) (nat, error) {
x, _, _, err := nat(nil).scan(strings.NewReader(s), 0, false)
if err != nil {
return nil, err
}
return x, nil
}