commit e3efd43f94e6f502942e52c0a77474c1ab474962
parent 97693535acd9ae096cffa7e635491aa97264c4a1
Author: Joshua Callary <joshuacallary@miraitechnologies.com.au>
Date: Fri, 2 Aug 2024 02:47:13 +1000
pcap: Added Encoding function to encode to .pcap
Diffstat:
3 files changed, 68 insertions(+), 4 deletions(-)
diff --git a/pcap/parser.go b/pcap/parser.go
@@ -1,8 +1,10 @@
package pcap
import (
+ "bytes"
"encoding/binary"
"errors"
+ "fmt"
"io"
)
@@ -35,9 +37,8 @@ type File struct {
func decode(reader io.Reader) (*File, error) {
var header GlobalHeader
- err := binary.Read(reader, binary.LittleEndian, &header)
- if err != nil {
+ if err := binary.Read(reader, binary.LittleEndian, &header); err != nil {
return nil, err
}
@@ -58,8 +59,7 @@ func decode(reader io.Reader) (*File, error) {
}
data := make([]byte, header.InclLen)
- _, err = io.ReadFull(reader, data)
- if err != nil {
+ if _, err = io.ReadFull(reader, data); err != nil {
return nil, err
}
@@ -74,3 +74,22 @@ func decode(reader io.Reader) (*File, error) {
Packets: packets,
}, nil
}
+
+func encode(file *File) ([]byte, error) {
+ buf := new(bytes.Buffer)
+
+ if err := binary.Write(buf, binary.LittleEndian, &file.Header); err != nil {
+ return nil, fmt.Errorf("global header: %v", err)
+ }
+
+ for _, packet := range file.Packets {
+ if err := binary.Write(buf, binary.LittleEndian, &packet.Header); err != nil {
+ return nil, fmt.Errorf("Packet Header: %v", err)
+ }
+ if err := binary.Write(buf, binary.LittleEndian, &packet.Data); err != nil {
+ return nil, fmt.Errorf("Packet Data: %v", err)
+ }
+ }
+
+ return buf.Bytes(), nil
+}
diff --git a/pcap/parser_test.go b/pcap/parser_test.go
@@ -31,4 +31,49 @@ func TestReadFile(t *testing.T) {
fmt.Printf("Data %d: %x\n", i, packet.Data)
}
+
+ encodePcapFile, err := encode(pcapFile)
+
+ if err != nil {
+ t.Fatalf("encode file: %v", err)
+ }
+
+ fmt.Printf("Encoded PCAP: %x\n", encodePcapFile)
+
+ f, err := os.Create("testing/pcap_file_encode.pcap")
+ if err != nil {
+ t.Fatal(err)
+ }
+ defer f.Close()
+
+ _, err = f.Write(encodePcapFile)
+ if err != nil {
+ t.Fatalf("Failed to write to PCAP file")
+ }
+
+ filePathTwo := "testing/pcap_file_encode.pcap"
+
+ fileTwo, err := os.Open(filePathTwo)
+ if err != nil {
+ t.Fatal("Failed to open file")
+ }
+ defer fileTwo.Close()
+
+ pcap, err := decode(fileTwo)
+ if err != nil {
+ t.Fatalf("Failed to read PCAP file: %v", err)
+ }
+
+ if len(pcap.Packets) == 0 {
+ t.Fatal("Should be at least one packet but there is 0")
+ }
+
+ fmt.Printf("PCAP Header: %+v\n", pcap.Header)
+
+ for i, packet := range pcap.Packets {
+ fmt.Printf("Packet %d: %+v\n", i, packet.Header)
+
+ fmt.Printf("Data %d: %x\n", i, packet.Data)
+ }
+
}
diff --git a/pcap/testing/pcap_file_encode.pcap b/pcap/testing/pcap_file_encode.pcap
Binary files differ.