diff --git a/go.mod b/go.mod index 4cb4aff..4bc03e1 100644 --- a/go.mod +++ b/go.mod @@ -4,5 +4,6 @@ go 1.18 require ( github.com/warthog618/gpiod v0.8.0 // indirect - golang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae // indirect + golang.org/x/crypto v0.0.0-20220331220935-ae2d96664a29 // indirect + golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1 // indirect ) diff --git a/go.sum b/go.sum index d8aee82..b809ab9 100644 --- a/go.sum +++ b/go.sum @@ -1,4 +1,8 @@ github.com/warthog618/gpiod v0.8.0 h1:qxH9XVvWHpTxzWFSndBcujFyNH5zVRzHM63tcmm85o4= github.com/warthog618/gpiod v0.8.0/go.mod h1:a7Csa+IJtDBZ39++zC/6Srjo01qWejt/5velrDWuNkY= +golang.org/x/crypto v0.0.0-20220331220935-ae2d96664a29 h1:tkVvjkPTB7pnW3jnid7kNyAMPVWllTNOf/qKDze4p9o= +golang.org/x/crypto v0.0.0-20220331220935-ae2d96664a29/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= golang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae h1:/WDfKMnPU+m5M4xB+6x4kaepxRw6jWvR5iDRdvjHgy8= golang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1 h1:SrN+KX8Art/Sf4HNj6Zcz06G7VEz+7w9tdXTPOZ7+l4= +golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= diff --git a/godoor.go b/godoor.go index 3ad4a87..d844af4 100644 --- a/godoor.go +++ b/godoor.go @@ -1,6 +1,11 @@ package main -import "fmt" +import ( + "encoding/json" + "fmt" + "io" + "net/http" +) import "time" const wiegand_a = 17 @@ -8,12 +13,56 @@ const wiegand_b = 18 const wiegand_bit_timeout = time.Millisecond * 8 const solenoid = 21 +type card struct { + UidHash string `json:"uid_hash"` +} + +type cardToken struct { + Token card `json:"token"` +} + +type cardList struct { + AllowedUids []cardToken `json:"allowed_uids"` +} + +type ValidUids map[string]bool // bool has no meaning + func main() { wiegand := WiegandSetup(wiegand_a, wiegand_b, wiegand_bit_timeout, solenoid) - //openDoor(solenoid_line) - go wiegand.cardRunner() + client := http.Client{} + req, err := http.NewRequest(http.MethodGet, "urlrul", nil) + if err != nil { + panic(err) + } + req.Header.Add("KEY", "keykey") + resp, err := client.Do(req) + if err != nil { + panic(err) + } + fmt.Printf("%v\n", resp) + + var cl cardList + + body, err := io.ReadAll(resp.Body) + if err != nil { + panic(err) + } + + err = json.Unmarshal(body, &cl) + if err != nil { + panic(err) + } + + validUids := make(ValidUids) + for i, val := range cl.AllowedUids { + fmt.Printf("%d: %+v\n", i, val.Token.UidHash) + validUids[val.Token.UidHash] = false + } + + go wiegand.cardRunner(validUids) + fmt.Printf("Sleeping\n") for { diff --git a/wiegand.go b/wiegand.go index 1fe1bdd..6e6aee1 100644 --- a/wiegand.go +++ b/wiegand.go @@ -1,7 +1,10 @@ package main import ( + "encoding/binary" + "encoding/hex" "fmt" + "golang.org/x/crypto/scrypt" "time" ) @@ -36,7 +39,7 @@ func printCardId(card uint64) { fmt.Printf("\n") } -func (w *Wiegand) cardRunner() { +func (w *Wiegand) cardRunner(validUids ValidUids) { for { // Wait for bit timeout fmt.Printf("Waiting for bit timeout\n") @@ -56,6 +59,24 @@ func (w *Wiegand) cardRunner() { printCardId(card) + b := make([]byte, 8) + binary.LittleEndian.PutUint64(b, card) + hashed, err := scrypt.Key(b, []byte("hashsah"), 16384, 8, 1, 64) + if err != nil { + panic(err) + } + + hashedHex := hex.EncodeToString(hashed) + fmt.Println(hashedHex) + + _, ok := validUids[hashedHex] + if ok { + fmt.Println("Opening door") + w.OpenDoor() + } else { + fmt.Println("Unknown card") + } + w.bitNr = 0 } }