File: fuzz.go

package info (click to toggle)
golang-github-schollz-mnemonicode 1.0.1-2
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid, trixie
  • size: 200 kB
  • sloc: makefile: 3
file content (70 lines) | stat: -rw-r--r-- 1,483 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
// For use with go-fuzz, "github.com/dvyukov/go-fuzz"
//
// +build gofuzz

package mnemonicode

import (
	"bytes"
	"fmt"

	"golang.org/x/text/transform"
)

var (
	tenc    = NewEncodeTransformer(nil)
	tdec    = NewDecodeTransformer()
	tencdec = transform.Chain(tenc, tdec)
)

//go:generate go-fuzz-build bitbucket.org/dchapes/mnemonicode
// Then:
//	go-fuzz -bin=mnemonicode-fuzz.zip -workdir=fuzz

// Fuzz is for use with go-fuzz, "github.com/dvyukov/go-fuzz"
func Fuzz(data []byte) int {
	words := EncodeWordList(nil, data)
	if len(words) != WordsRequired(len(data)) {
		panic("bad WordsRequired result")
	}
	data2, err := DecodeWordList(nil, words)
	if err != nil {
		fmt.Println("words:", words)
		panic(err)
	}
	if !bytes.Equal(data, data2) {
		fmt.Println("words:", words)
		panic("data != data2")
	}

	data3, _, err := transform.Bytes(tencdec, data)
	if err != nil {
		panic(err)
	}
	if !bytes.Equal(data, data3) {
		fmt.Println("words:", words)
		panic("data != data3")
	}

	if len(data) == 0 {
		return 0
	}
	return 1
}

//go:generate go-fuzz-build -func Fuzz2 -o mnemonicode-fuzz2.zip bitbucket.org/dchapes/mnemonicode
// Then:
//	go-fuzz -bin=mnemonicode-fuzz2.zip -workdir=fuzz2

// Fuzz2 is another fuzz tester, this time with words as input rather than binary data.
func Fuzz2(data []byte) int {
	_, _, err := transform.Bytes(tdec, data)
	if err != nil {
		if _, ok := err.(WordError); !ok {
			return 0
		}
		fmt.Println("Unexpected error")
		panic(err)
	}
	return 1
}