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 }