diff options
Diffstat (limited to 'internal/cmd/generate-corpus/main.go')
-rw-r--r-- | internal/cmd/generate-corpus/main.go | 137 |
1 files changed, 137 insertions, 0 deletions
diff --git a/internal/cmd/generate-corpus/main.go b/internal/cmd/generate-corpus/main.go new file mode 100644 index 00000000..8f77dea9 --- /dev/null +++ b/internal/cmd/generate-corpus/main.go @@ -0,0 +1,137 @@ +// Copyright 2019 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. + +// Program generate-corpus generates a seed corpus for the fuzzers. +// +// This command is not run automatically because its output is not stable. +// It's present in source control mainly as documentation of where the seed +// corpus came from. +package main + +import ( + "crypto/sha1" + "fmt" + "io/ioutil" + "log" + + "google.golang.org/protobuf/encoding/protojson" + "google.golang.org/protobuf/encoding/prototext" + "google.golang.org/protobuf/proto" + + fuzzpb "google.golang.org/protobuf/internal/testprotos/fuzz" + testpb "google.golang.org/protobuf/internal/testprotos/test" +) + +var messages = []proto.Message{ + &fuzzpb.Fuzz{ + TestAllTypes: &testpb.TestAllTypes{ + OptionalInt32: proto.Int32(1001), + OptionalInt64: proto.Int64(1002), + OptionalUint32: proto.Uint32(1003), + OptionalUint64: proto.Uint64(1004), + OptionalSint32: proto.Int32(1005), + OptionalSint64: proto.Int64(1006), + OptionalFixed32: proto.Uint32(1007), + OptionalFixed64: proto.Uint64(1008), + OptionalSfixed32: proto.Int32(1009), + OptionalSfixed64: proto.Int64(1010), + OptionalFloat: proto.Float32(1011.5), + OptionalDouble: proto.Float64(1012.5), + OptionalBool: proto.Bool(true), + OptionalString: proto.String("string"), + OptionalBytes: []byte("bytes"), + OptionalNestedEnum: testpb.TestAllTypes_BAR.Enum(), + Optionalgroup: &testpb.TestAllTypes_OptionalGroup{ + A: proto.Int32(1017), + }, + OptionalNestedMessage: &testpb.TestAllTypes_NestedMessage{ + A: proto.Int32(42), + Corecursive: &testpb.TestAllTypes{ + OptionalInt32: proto.Int32(43), + }, + }, + RepeatedInt32: []int32{1001, 2001}, + RepeatedInt64: []int64{1002, 2002}, + RepeatedUint32: []uint32{1003, 2003}, + RepeatedUint64: []uint64{1004, 2004}, + RepeatedSint32: []int32{1005, 2005}, + RepeatedSint64: []int64{1006, 2006}, + RepeatedFixed32: []uint32{1007, 2007}, + RepeatedFixed64: []uint64{1008, 2008}, + RepeatedSfixed32: []int32{1009, 2009}, + RepeatedSfixed64: []int64{1010, 2010}, + RepeatedFloat: []float32{1011.5, 2011.5}, + RepeatedDouble: []float64{1012.5, 2012.5}, + RepeatedBool: []bool{true, false}, + RepeatedString: []string{"foo", "bar"}, + RepeatedBytes: [][]byte{[]byte("FOO"), []byte("BAR")}, + RepeatedNestedEnum: []testpb.TestAllTypes_NestedEnum{ + testpb.TestAllTypes_FOO, + testpb.TestAllTypes_BAR, + }, + RepeatedNestedMessage: []*testpb.TestAllTypes_NestedMessage{ + {A: proto.Int32(1)}, + nil, + {A: proto.Int32(2)}, + }, + Repeatedgroup: []*testpb.TestAllTypes_RepeatedGroup{ + {A: proto.Int32(1017)}, + nil, + {A: proto.Int32(2017)}, + }, + MapInt32Int32: map[int32]int32{1056: 1156, 2056: 2156}, + MapInt64Int64: map[int64]int64{1057: 1157, 2057: 2157}, + MapUint32Uint32: map[uint32]uint32{1058: 1158, 2058: 2158}, + MapUint64Uint64: map[uint64]uint64{1059: 1159, 2059: 2159}, + MapSint32Sint32: map[int32]int32{1060: 1160, 2060: 2160}, + MapSint64Sint64: map[int64]int64{1061: 1161, 2061: 2161}, + MapFixed32Fixed32: map[uint32]uint32{1062: 1162, 2062: 2162}, + MapFixed64Fixed64: map[uint64]uint64{1063: 1163, 2063: 2163}, + MapSfixed32Sfixed32: map[int32]int32{1064: 1164, 2064: 2164}, + MapSfixed64Sfixed64: map[int64]int64{1065: 1165, 2065: 2165}, + MapInt32Float: map[int32]float32{1066: 1166.5, 2066: 2166.5}, + MapInt32Double: map[int32]float64{1067: 1167.5, 2067: 2167.5}, + MapBoolBool: map[bool]bool{true: false, false: true}, + MapStringString: map[string]string{"69.1.key": "69.1.val", "69.2.key": "69.2.val"}, + MapStringBytes: map[string][]byte{"70.1.key": []byte("70.1.val"), "70.2.key": []byte("70.2.val")}, + MapStringNestedMessage: map[string]*testpb.TestAllTypes_NestedMessage{ + "71.1.key": {A: proto.Int32(1171)}, + "71.2.key": {A: proto.Int32(2171)}, + }, + MapStringNestedEnum: map[string]testpb.TestAllTypes_NestedEnum{ + "73.1.key": testpb.TestAllTypes_FOO, + "73.2.key": testpb.TestAllTypes_BAR, + }, + OneofField: &testpb.TestAllTypes_OneofUint32{1111}, + }, + }, +} + +func main() { + for _, m := range messages { + wire, err := proto.Marshal(m) + if err != nil { + log.Fatal(err) + } + if err := ioutil.WriteFile(fmt.Sprintf("internal/fuzz/wirefuzz/corpus/%x", sha1.Sum(wire)), wire, 0777); err != nil { + log.Fatal(err) + } + + text, err := prototext.Marshal(m) + if err != nil { + log.Fatal(err) + } + if err := ioutil.WriteFile(fmt.Sprintf("internal/fuzz/textfuzz/corpus/%x", sha1.Sum(text)), text, 0777); err != nil { + log.Fatal(err) + } + + json, err := protojson.Marshal(m) + if err != nil { + log.Fatal(err) + } + if err := ioutil.WriteFile(fmt.Sprintf("internal/fuzz/jsonfuzz/corpus/%x", sha1.Sum(json)), json, 0777); err != nil { + log.Fatal(err) + } + } +} |