| // 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" |
| "log" |
| "os" |
| |
| "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 := os.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 := os.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 := os.WriteFile(fmt.Sprintf("internal/fuzz/jsonfuzz/corpus/%x", sha1.Sum(json)), json, 0777); err != nil { |
| log.Fatal(err) |
| } |
| } |
| } |