From 43a73a856dd852c33d08c1d3b6d2c8606c03d3ef Mon Sep 17 00:00:00 2001 From: Kristoffer Dalby Date: Fri, 17 Nov 2023 10:32:16 +0100 Subject: [PATCH] types/key: add database scan/value to publickeys Signed-off-by: Kristoffer Dalby --- types/key/disco.go | 25 +++++++++++++++++++++++++ types/key/machine.go | 25 +++++++++++++++++++++++++ types/key/node.go | 24 ++++++++++++++++++++++++ 3 files changed, 74 insertions(+) diff --git a/types/key/disco.go b/types/key/disco.go index 14005b506..a1cc4d0a5 100644 --- a/types/key/disco.go +++ b/types/key/disco.go @@ -5,6 +5,8 @@ package key import ( "crypto/subtle" + "database/sql/driver" + "errors" "fmt" "go4.org/mem" @@ -142,6 +144,29 @@ func (k *DiscoPublic) UnmarshalText(b []byte) error { return parseHex(k.k[:], mem.B(b), mem.S(discoPublicHexPrefix)) } +func (k DiscoPublic) Value() (driver.Value, error) { + return k.MarshalText() +} + +func (k *DiscoPublic) Scan(value interface{}) error { + var val []byte + switch value.(type) { + case string: + val = []byte(value.(string)) + case []byte: + val = value.([]byte) + default: + return errors.New("Incompatible type for DiscoPublic") + } + + err := k.UnmarshalText(val) + if err != nil { + return err + } + + return nil +} + type DiscoShared struct { _ structs.Incomparable // because == isn't constant-time k [32]byte diff --git a/types/key/machine.go b/types/key/machine.go index a05f3cc1f..2d42f7502 100644 --- a/types/key/machine.go +++ b/types/key/machine.go @@ -6,7 +6,9 @@ package key import ( "bytes" "crypto/subtle" + "database/sql/driver" "encoding/hex" + "errors" "go4.org/mem" "golang.org/x/crypto/curve25519" @@ -262,3 +264,26 @@ func (k MachinePublic) MarshalText() ([]byte, error) { func (k *MachinePublic) UnmarshalText(b []byte) error { return parseHex(k.k[:], mem.B(b), mem.S(machinePublicHexPrefix)) } + +func (k MachinePublic) Value() (driver.Value, error) { + return k.MarshalText() +} + +func (k *MachinePublic) Scan(value interface{}) error { + var val []byte + switch value.(type) { + case string: + val = []byte(value.(string)) + case []byte: + val = value.([]byte) + default: + return errors.New("Incompatible type for MachinePublic") + } + + err := k.UnmarshalText(val) + if err != nil { + return err + } + + return nil +} diff --git a/types/key/node.go b/types/key/node.go index 6142bf68a..1fb24be80 100644 --- a/types/key/node.go +++ b/types/key/node.go @@ -7,6 +7,7 @@ import ( "bufio" "bytes" "crypto/subtle" + "database/sql/driver" "encoding/hex" "errors" "fmt" @@ -379,3 +380,26 @@ func (k NodePublic) WireGuardGoString() string { b[second+3] = b64((k.k[31] << 2) & 63) return string(b) } + +func (k NodePublic) Value() (driver.Value, error) { + return k.MarshalText() +} + +func (k *NodePublic) Scan(value interface{}) error { + var val []byte + switch value.(type) { + case string: + val = []byte(value.(string)) + case []byte: + val = value.([]byte) + default: + return errors.New("Incompatible type for NodePublic") + } + + err := k.UnmarshalText(val) + if err != nil { + return err + } + + return nil +}