github.com/gopacket/gopacket@v1.1.0/pcapgo/ngwrite_dsb_test.go (about)

     1  package pcapgo
     2  
     3  import (
     4  	"fmt"
     5  	"github.com/gopacket/gopacket/layers"
     6  	"io"
     7  	"math"
     8  	"net"
     9  	"os"
    10  	"testing"
    11  )
    12  
    13  // TestNgWriterDSB tests the WriteDecryptionSecretsBlock function.
    14  func TestNgWriterDSB(t *testing.T) {
    15  
    16  	// Test that we can read a DSB file.
    17  	pcapngFile := "tests/le/test300.pcapng"
    18  	tlsKey := "CLIENT_RANDOM 65bafa1a1a37aebce6ab7af420f9a6ca10513ad1d53aececbe831a28982a5c18 8d1e0c21e653f8e0720c987c3daaca094ff6eb1ccc9e15a8384a214139dfdcf25f0ee77ac81250c7a11b8da561313528\n"
    19  	testf, err := os.Open(pcapngFile)
    20  	if err != nil {
    21  		t.Fatal("Couldn't open file:", err)
    22  	}
    23  	defer testf.Close()
    24  	options := DefaultNgReaderOptions
    25  	options.SkipUnknownVersion = true
    26  	var r *NgReader
    27  	r, err = NewNgReader(testf, options)
    28  	if err != nil {
    29  		t.Fatal("Couldn't read start of file:", err)
    30  	}
    31  
    32  	b := &BufferPacketSource{}
    33  	for {
    34  		data, ci, err := r.ReadPacketData()
    35  		if err == io.EOF {
    36  			t.Log("ReadPacketData returned EOF")
    37  			break
    38  		}
    39  		b.data = append(b.data, data)
    40  		b.ci = append(b.ci, ci)
    41  	}
    42  
    43  	t.Logf("bigEndian %t", r.bigEndian)
    44  	t.Logf("len(b.data) %d", len(b.data))
    45  	t.Logf("len(b.ci) %d", len(b.ci))
    46  
    47  	tmpPcapng := "tests/dbs_tmp.pcapng"
    48  	writer, err := createPcapng(tmpPcapng)
    49  
    50  	//write Decryption Secrets Block
    51  	err = writer.WriteDecryptionSecretsBlock(DSB_SECRETS_TYPE_TLS, []byte(tlsKey))
    52  	if err != nil {
    53  		t.Fatal("Couldn't write Decryption Secrets Block:", err)
    54  	}
    55  
    56  	for i, ci := range b.ci {
    57  		err = writer.WritePacket(ci, b.data[i])
    58  		if err != nil {
    59  			t.Fatal(err)
    60  		}
    61  	}
    62  	err = writer.Flush()
    63  	if err != nil {
    64  		t.Fatal(err)
    65  	}
    66  
    67  	t.Log("Wrote Decryption Secrets Block.")
    68  
    69  	// TODO check DSB
    70  
    71  	os.Remove(tmpPcapng)
    72  }
    73  
    74  func createPcapng(pcapngFilename string) (*NgWriter, error) {
    75  	pcapFile, err := os.OpenFile(pcapngFilename, os.O_TRUNC|os.O_WRONLY|os.O_CREATE, 0644)
    76  	if err != nil {
    77  		return nil, fmt.Errorf("error creating pcap file: %v", err)
    78  	}
    79  
    80  	pcapOption := NgWriterOptions{
    81  		SectionInfo: NgSectionInfo{
    82  			Hardware:    "eCapture Hardware",
    83  			OS:          "",
    84  			Application: "ecapture.lua",
    85  			Comment:     "see https://ecapture.cc for more information.",
    86  		},
    87  	}
    88  	// write interface description
    89  	ngIface := NgInterface{
    90  		Name:       "eth0",
    91  		Comment:    "gopacket: https://github.com/google/gopacket",
    92  		Filter:     "",
    93  		LinkType:   layers.LinkTypeEthernet,
    94  		SnapLength: uint32(math.MaxUint16),
    95  	}
    96  
    97  	pcapWriter, err := NewNgWriterInterface(pcapFile, ngIface, pcapOption)
    98  	if err != nil {
    99  		return nil, err
   100  	}
   101  
   102  	netIfs, err := net.Interfaces()
   103  	if err != nil {
   104  		return nil, err
   105  	}
   106  	// insert other interfaces into pcapng file
   107  	for _, iface := range netIfs {
   108  		ngIface = NgInterface{
   109  			Name:       iface.Name,
   110  			Comment:    "see https://ecapture.cc for more information.",
   111  			Filter:     "",
   112  			LinkType:   layers.LinkTypeEthernet,
   113  			SnapLength: uint32(math.MaxUint16),
   114  		}
   115  
   116  		_, err = pcapWriter.AddInterface(ngIface)
   117  		if err != nil {
   118  			return nil, err
   119  		}
   120  	}
   121  	return pcapWriter, nil
   122  }