penguin/homekey-go

homekey-go

internal/blegateway/relay_test.go

raw ยท 1911 bytes

package blegateway

import (
	"encoding/binary"
	"testing"
)

func TestRelayResponses(t *testing.T) {
	sid := uint32(0x12345678)
	seq := uint16(8)
	good := packet(0x11, sid, seq, 0, 2, []byte{0x90, 0})
	data, ready, e := parseResponse(good, sid, seq)
	if e != nil || !ready || len(data) != 2 {
		t.Fatal("valid response rejected")
	}
	for _, b := range [][]byte{packet(0x11, sid-1, seq, 0, 2, []byte{0x90, 0}), packet(0x11, sid, seq-1, 0, 2, []byte{0x90, 0}), packet(0x10, sid, seq, 0, 0, nil)} {
		_, ready, e := parseResponse(b, sid, seq)
		if e != nil || ready {
			t.Fatal("stale or pending response accepted")
		}
	}
	for _, b := range [][]byte{good[:13], packet(0x11, sid, seq, 1, 2, []byte{0x90, 0}), packet(0x12, sid, seq, 0, 1, []byte{3}), packet(0x11, sid, seq, 0, 1, []byte{0x90})} {
		if _, _, e := parseResponse(b, sid, seq); e == nil {
			t.Fatal("malformed/error response accepted")
		}
	}
}
func TestCardSession(t *testing.T) {
	b := make([]byte, 18)
	b[0] = 1
	b[1] = 1
	b[2] = 4
	b[3] = 0x20
	binary.BigEndian.PutUint32(b[4:], 123)
	copy(b[8:], []byte{1, 2, 3, 4})
	c, e := parseCard(b)
	if e != nil || c.Session != 123 || len(c.UID) != 4 || c.SAK != 0x20 {
		t.Fatal("card status rejected")
	}
	b[2] = 11
	if _, e := parseCard(b); e == nil {
		t.Fatal("bad UID accepted")
	}
}

func TestECPConfiguration(t *testing.T) {
	group := []byte{1, 2, 3, 4, 5, 6, 7, 8}
	b, err := ecpConfigPacket(group)
	if err != nil || len(b) != 20 || b[1] != 3 || binary.BigEndian.Uint16(b[10:]) != 8 {
		t.Fatal("bad ECP packet")
	}
	for _, v := range b[2:10] {
		if v != 0 {
			t.Fatal("configuration must be session-independent")
		}
	}
	for i, v := range group {
		if b[12+i] != v {
			t.Fatal("wrong group")
		}
	}
	b, err = ecpConfigPacket(nil)
	if err != nil || len(b) != 12 {
		t.Fatal("bad disable packet")
	}
	if _, err = ecpConfigPacket(group[:7]); err == nil {
		t.Fatal("accepted invalid group")
	}
}