From 8d6a432820f2899786741a25b78e9443b42fb7e1 Mon Sep 17 00:00:00 2001 From: Eugene Dzhurinsky Date: Sat, 10 Aug 2019 00:16:18 -0400 Subject: [PATCH] Allow to override pin ids for RFID reader, for non-standard setups. Fixed config file. --- .../board/rootfs_overlay/root/.seedkeeper | 4 +- firmware/Makefile | 1 + firmware/app/config.go | 4 ++ firmware/app/service/service.go | 12 +++++- firmware/pass/rfid_password_provider.go | 40 +++++++++++++++++-- firmware/storage/file_storage.go | 11 +++++ firmware/storage/storage.go | 10 +++++ 7 files changed, 77 insertions(+), 5 deletions(-) diff --git a/buildroot/board/rootfs_overlay/root/.seedkeeper b/buildroot/board/rootfs_overlay/root/.seedkeeper index f3fea49..c561c15 100644 --- a/buildroot/board/rootfs_overlay/root/.seedkeeper +++ b/buildroot/board/rootfs_overlay/root/.seedkeeper @@ -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, diff --git a/firmware/Makefile b/firmware/Makefile index 452ff65..4cdc41f 100644 --- a/firmware/Makefile +++ b/firmware/Makefile @@ -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 diff --git a/firmware/app/config.go b/firmware/app/config.go index f28cdcc..41c4c27 100644 --- a/firmware/app/config.go +++ b/firmware/app/config.go @@ -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"` @@ -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}, diff --git a/firmware/app/service/service.go b/firmware/app/service/service.go index f5d8183..286cd04 100644 --- a/firmware/app/service/service.go +++ b/firmware/app/service/service.go @@ -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) diff --git a/firmware/pass/rfid_password_provider.go b/firmware/pass/rfid_password_provider.go index e8167cc..bf0311d 100644 --- a/firmware/pass/rfid_password_provider.go +++ b/firmware/pass/rfid_password_provider.go @@ -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") } diff --git a/firmware/storage/file_storage.go b/firmware/storage/file_storage.go index e648fd0..7abc2a2 100644 --- a/firmware/storage/file_storage.go +++ b/firmware/storage/file_storage.go @@ -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 ) diff --git a/firmware/storage/storage.go b/firmware/storage/storage.go index f8f9e00..d62cde4 100644 --- a/firmware/storage/storage.go +++ b/firmware/storage/storage.go @@ -1,6 +1,8 @@ package storage import ( + "io" + "github.com/jdevelop/passkeeper/firmware" ) @@ -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 +}