bettercap/packets/dot11_test.go
2019-06-30 22:22:36 +02:00

275 lines
5.7 KiB
Go

package packets
import (
"github.com/google/gopacket"
"github.com/google/gopacket/layers"
"net"
"reflect"
"testing"
)
func TestDot11Vars(t *testing.T) {
var units = []struct {
got interface{}
exp interface{}
}{
{openFlags, 1057},
{wpaFlags, 1041},
{fakeApRates, []byte{0x82, 0x84, 0x8b, 0x96, 0x24, 0x30, 0x48, 0x6c, 0x03, 0x01}},
{fakeApWpaRSN, []byte{
0x01, 0x00, // RSN Version 1
0x00, 0x0f, 0xac, 0x02, // Group Cipher Suite : 00-0f-ac TKIP
0x02, 0x00, // 2 Pairwise Cipher Suites (next two lines)
0x00, 0x0f, 0xac, 0x04, // AES Cipher / CCMP
0x00, 0x0f, 0xac, 0x02, // TKIP Cipher
0x01, 0x00, // 1 Authentication Key Management Suite (line below)
0x00, 0x0f, 0xac, 0x02, // Pre-Shared Key
0x00, 0x00,
}},
{wpaSignatureBytes, []byte{0, 0x50, 0xf2, 1}},
}
for _, u := range units {
if !reflect.DeepEqual(u.exp, u.got) {
t.Fatalf("expected '%v', got '%v'", u.exp, u.got)
}
}
}
func BuildDot11ApConfig() Dot11ApConfig {
ssid := "I still love Ruby, don't worry!"
bssid, _ := net.ParseMAC("pi:ca:tw:as:he:re")
channel := 1
encryption := false
config := Dot11ApConfig{
SSID: ssid,
BSSID: bssid,
Channel: channel,
Encryption: encryption,
}
return config
}
func TestDot11ApConfig(t *testing.T) {
ssid := "I still love Ruby, don't worry!"
bssid, _ := net.ParseMAC("pi:ca:tw:as:he:re")
channel := 1
encryption := false
config := Dot11ApConfig{
SSID: ssid,
BSSID: bssid,
Channel: channel,
Encryption: encryption,
}
var units = []struct {
got interface{}
exp interface{}
}{
{config.SSID, ssid},
{config.BSSID, bssid},
{config.Channel, channel},
{config.Encryption, encryption},
}
for _, u := range units {
if !reflect.DeepEqual(u.exp, u.got) {
t.Fatalf("expected '%v', got '%v'", u.exp, u.got)
}
}
}
func TestDot11Info(t *testing.T) {
id := layers.Dot11InformationElementIDSSID
info := []byte{}
dot11InfoElement := Dot11Info(id, info)
var units = []struct {
got interface{}
exp interface{}
}{
{dot11InfoElement.ID, id},
{dot11InfoElement.Length, uint8(len(info))},
{dot11InfoElement.Info, info},
}
for _, u := range units {
if !reflect.DeepEqual(u.exp, u.got) {
t.Fatalf("expected '%v', got '%v'", u.exp, u.got)
}
}
}
func TestNewDot11Beacon(t *testing.T) {
conf := BuildDot11ApConfig()
seq := uint16(0)
err, bytes := NewDot11Beacon(conf, seq)
if err != nil {
t.Error(err)
}
if len(bytes) <= 0 {
t.Error("unable to create new dot11 beacon")
}
}
func TestNewDot11Deauth(t *testing.T) {
mac, _ := net.ParseMAC("00:00:00:00:00:00")
seq := uint16(0)
err, bytes := NewDot11Deauth(mac, mac, mac, seq)
if err != nil {
t.Error(err)
}
if len(bytes) <= 0 {
t.Error("unable to create new dot11 beacon")
}
}
func BuildDot11Packet() gopacket.Packet {
mac, _ := net.ParseMAC("00:00:00:00:00:00")
seq := uint16(0)
_, bytes := Serialize(
&layers.RadioTap{},
&layers.Dot11{
Address1: mac,
Address2: mac,
Address3: mac,
Type: layers.Dot11TypeMgmtDeauthentication,
SequenceNumber: seq,
},
&layers.Dot11MgmtDeauthentication{
Reason: layers.Dot11ReasonClass2FromNonAuth,
},
)
return gopacket.NewPacket(bytes, layers.LayerTypeRadioTap, gopacket.Default)
}
func TestDot11Parse(t *testing.T) {
packet := BuildDot11Packet()
ok, radiotap, dot11 := Dot11Parse(packet)
var units = []struct {
got interface{}
exp interface{}
}{
// testing for the known bad cases
{ok, false},
{radiotap, nil},
{dot11, nil},
}
for _, u := range units {
if reflect.DeepEqual(u.exp, u.got) {
t.Fatalf("expected '%v', got '%v'", u.exp, u.got)
}
}
}
func TestDot11ParseIDSSID(t *testing.T) {
conf := BuildDot11ApConfig()
seq := uint16(0)
err, bytes := NewDot11Beacon(conf, seq)
if err != nil {
t.Error(err)
}
packet := gopacket.NewPacket(bytes, layers.LayerTypeRadioTap, gopacket.Default)
ok, id := Dot11ParseIDSSID(packet)
var units = []struct {
got interface{}
exp interface{}
}{
{ok, true},
{id, "I still love Ruby, don't worry!"},
}
for _, u := range units {
if !reflect.DeepEqual(u.exp, u.got) {
t.Fatalf("expected '%v', got '%v'", u.exp, u.got)
}
}
}
func TestDot11ParseEncryption(t *testing.T) {
ssid := "I still love Ruby, don't worry!"
bssid, _ := net.ParseMAC("pi:ca:tw:as:he:re")
channel := 1
encryption := true
config := Dot11ApConfig{
SSID: ssid,
BSSID: bssid,
Channel: channel,
Encryption: encryption,
}
seq := uint16(0)
err, bytes := NewDot11Beacon(config, seq)
if err != nil {
t.Error(err)
}
packet := gopacket.NewPacket(bytes, layers.LayerTypeRadioTap, gopacket.Default)
_, _, dot11 := Dot11Parse(packet)
found, enc, cipher, auth := Dot11ParseEncryption(packet, dot11)
var units = []struct {
got interface{}
exp interface{}
}{
{found, true},
{enc, "WPA2"},
{cipher, "TKIP"},
{auth, "PSK"},
}
for _, u := range units {
if !reflect.DeepEqual(u.exp, u.got) {
t.Fatalf("expected '%v', got '%v'", u.exp, u.got)
}
}
}
func TestDot11IsDataFor(t *testing.T) {
mac, _ := net.ParseMAC("00:00:00:00:00:00")
seq := uint16(0)
_, bytes := Serialize(
&layers.RadioTap{},
&layers.Dot11{
Address1: mac,
Address2: mac,
Address3: mac,
Type: layers.Dot11TypeData,
SequenceNumber: seq,
},
)
packet := gopacket.NewPacket(bytes, layers.LayerTypeRadioTap, gopacket.Default)
station, _ := net.ParseMAC("00:00:00:00:00:00")
_, _, dot11 := Dot11Parse(packet)
if !Dot11IsDataFor(dot11, station) {
t.Error("unable to determine dot11 packet is for a given station")
}
}
// TODO: add Dot11ParseDSSet test. Not sure how to build proper
// example packet to complete this test, for now. <3
//func TestDot11ParseDSSet(t *testing.T) {
//}