oss-fuzz/projects/golang/encoding_fuzzer.go

67 lines
1.3 KiB
Go
Raw Normal View History

package encoding
import (
"bytes"
"encoding/base32"
"encoding/base64"
"encoding/gob"
"encoding/json"
"encoding/xml"
fuzz "github.com/AdaLogics/go-fuzz-headers"
)
func FuzzEncoding(data []byte) int {
f := fuzz.NewConsumer(data)
decType, err := f.GetInt()
if err != nil {
return 0
}
b1, err := f.GetBytes()
if err != nil {
return 0
}
switch decType % 5 {
case 0:
e, err := f.GetString()
if err != nil || len(e) != 32 {
return 0
}
enc := base32.NewEncoding(e)
d := base32.NewDecoder(enc, bytes.NewReader(b1))
dbuf := make([]byte, enc.DecodedLen(len(e)))
_, _ = d.Read(dbuf)
case 1:
e, err := f.GetString()
if err != nil || len(e) != 64 {
return 0
}
for i := 0; i < len(e); i++ {
if e[i] == '\n' || e[i] == '\r' {
return 0
}
}
enc := base64.NewEncoding(e)
d := base64.NewDecoder(enc, bytes.NewReader(b1))
dbuf := make([]byte, enc.DecodedLen(len(e)))
_, _ = d.Read(dbuf)
case 2:
b2, err := f.GetBytes()
if err != nil {
return 0
}
d := gob.NewDecoder(bytes.NewReader(b1))
_ = d.Decode(b2)
case 3:
b2, err := f.GetBytes()
if err != nil {
return 0
}
d := json.NewDecoder(bytes.NewReader(b1))
_ = d.Decode(b2)
case 4:
d := xml.NewDecoder(bytes.NewReader(b1))
_, _ = d.Token()
}
return 1
}