Skip to content

Commit

Permalink
Allow to override pin ids for RFID reader, for non-standard setups.
Browse files Browse the repository at this point in the history
Fixed config file.
  • Loading branch information
jdevelop committed Aug 10, 2019
1 parent acce037 commit 8d6a432
Show file tree
Hide file tree
Showing 7 changed files with 77 additions and 5 deletions.
4 changes: 3 additions & 1 deletion buildroot/board/rootfs_overlay/root/.seedkeeper
Expand Up @@ -9,10 +9,12 @@
"key_up": 26,
"key_down": 21
},
"seeds": {
"passwords": {
"file": "/root/seedstorage.enc"
},
"rfid": {
"irq_pin" : "17",
"reset_pin": "27",
"access_key": [
255,
255,
Expand Down
1 change: 1 addition & 0 deletions firmware/Makefile
Expand Up @@ -24,6 +24,7 @@ ${OUT}/splash:

packr-dep:
go get -u github.com/gobuffalo/packr/packr
go mod tidy

upx: ${OUT}/service ${OUT}/util ${OUT}/splash
upx ${OUT}/service
Expand Down
4 changes: 4 additions & 0 deletions firmware/app/config.go
Expand Up @@ -26,6 +26,8 @@ type passwords struct {
}

type rfid struct {
RfidIRQPin string `json:"irq_pin,omitempty"`
RfidResetPin string `json:"reset_pin,omitempty"`
RfidAccessKey [6]byte `json:"access_key,omitempty"`
RfidAccessSector int `json:"access_sector,omitempty"`
RfidAccessBlock int `json:"access_block,omitempty"`
Expand Down Expand Up @@ -68,6 +70,8 @@ var DefaultConfig = Config{
PasswordFile: "/root/passwordstorage.enc",
},
Rfid: rfid{
RfidIRQPin: "17",
RfidResetPin: "27",
RfidAccessBlock: 1,
RfidAccessSector: 1,
RfidAccessKey: [...]byte{1, 2, 3, 4, 5, 6},
Expand Down
12 changes: 11 additions & 1 deletion firmware/app/service/service.go
Expand Up @@ -97,7 +97,17 @@ func main() {
raspberry.SelfCheckFailure(err)
}

rfid, err := pass.NewRFIDPass(c.Rfid.RfidAccessKey, c.Rfid.RfidAccessSector, c.Rfid.RfidAccessBlock)
pinsConf := make([]pass.PinConfF, 0)
if c.Rfid.RfidIRQPin != "" {
db.Log("Using RFID IRQ pin " + c.Rfid.RfidIRQPin)
pinsConf = append(pinsConf, pass.WithIRQPin(c.Rfid.RfidIRQPin))
}
if c.Rfid.RfidResetPin != "" {
db.Log("Using RFID reset pin " + c.Rfid.RfidResetPin)
pinsConf = append(pinsConf, pass.WithResetPin(c.Rfid.RfidResetPin))
}

rfid, err := pass.NewRFIDPass(c.Rfid.RfidAccessKey, c.Rfid.RfidAccessSector, c.Rfid.RfidAccessBlock, pinsConf...)
if err != nil {
db.Log("RFID failure")
raspberry.SelfCheckFailure(err)
Expand Down
40 changes: 37 additions & 3 deletions firmware/pass/rfid_password_provider.go
Expand Up @@ -29,17 +29,51 @@ const (
irqPinStr = "17"
)

func NewRFIDPass(cardKey [6]byte, pwdSector, pwdBlock int) (*RFID, error) {
type config struct {
resetPin, irqPin string
}

var defaultConfig = config{
resetPin: "27",
irqPin: "17",
}

type PinConfF func(*config) *config

func WithResetPin(pin string) PinConfF {
return func(c *config) *config {
c.resetPin = pin
return c
}
}

func WithIRQPin(pin string) PinConfF {
return func(c *config) *config {
c.irqPin = pin
return c
}
}

func NewRFIDPass(cardKey [6]byte, pwdSector, pwdBlock int, confs ...PinConfF) (*RFID, error) {
dev, err := spireg.Open("")
if err != nil {
return nil, err
}

resetPin := gpioreg.ByName(resetPinStr)
c := defaultConfig
{
cc := &c
for _, f := range confs {
cc = f(cc)
}
c = *cc
}

resetPin := gpioreg.ByName(c.resetPin)
if resetPin == nil {
return nil, fmt.Errorf("can't open reset pin")
}
irqPin := gpioreg.ByName(irqPinStr)
irqPin := gpioreg.ByName(c.irqPin)
if irqPin == nil {
return nil, fmt.Errorf("can't open irq pin")
}
Expand Down
11 changes: 11 additions & 0 deletions firmware/storage/file_storage.go
Expand Up @@ -183,10 +183,21 @@ func (s *PlainText) Close() error {
return s.file.Close()
}

func (s *PlainText) BackupStorage(f func(io.Reader) error) error {
s.file.Seek(0, 0)
return nil
}

func (s *PlainText) RestoreStorage(src io.Reader) error {
return nil
}

var (
p PlainText
_ CredentialsStorageRead = &p
_ CredentialsStorageWrite = &p
_ CredentialsStorageList = &p
_ CredentialsStorageRemove = &p
_ CredentialsStorageBackup = &p
_ CredentialsStorageBackup = &p
)
10 changes: 10 additions & 0 deletions firmware/storage/storage.go
@@ -1,6 +1,8 @@
package storage

import (
"io"

"github.com/jdevelop/passkeeper/firmware"
)

Expand All @@ -19,3 +21,11 @@ type CredentialsStorageList interface {
type CredentialsStorageRemove interface {
RemoveCredentials(string) error
}

type CredentialsStorageBackup interface {
BackupStorage(func(io.Reader) error) error
}

type CredentialsStorageRestore interface {
RestoreStorage(io.Reader) error
}

0 comments on commit 8d6a432

Please sign in to comment.