// Copyright 2019 The GoPacket Authors. All rights reserved. // // Use of this source code is governed by a BSD-style license that can be found // in the LICENSE file in the root of the source tree. package layers import ( "encoding/binary" "github.com/google/gopacket" ) // FuzzLayer is a fuzz target for the layers package of gopacket // A fuzz target is a function processing a binary blob (byte slice) // The process here is to interpret this data as a packet, and print the layers contents. // The decoding options and the starting layer are encoded in the first bytes. // The function returns 1 if this is a valid packet (no error layer) func FuzzLayer(data []byte) int { if len(data) < 3 { return 0 } // use the first two bytes to choose the top level layer startLayer := binary.BigEndian.Uint16(data[:2]) var fuzzOpts = gopacket.DecodeOptions{ Lazy: data[2]&0x1 != 0, NoCopy: data[2]&0x2 != 0, SkipDecodeRecovery: data[2]&0x4 != 0, DecodeStreamsAsDatagrams: data[2]&0x8 != 0, } p := gopacket.NewPacket(data[3:], gopacket.LayerType(startLayer), fuzzOpts) for _, l := range p.Layers() { gopacket.LayerString(l) } if p.ErrorLayer() != nil { return 0 } return 1 }