summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
-rw-r--r--types/key/disco.go25
-rw-r--r--types/key/machine.go25
-rw-r--r--types/key/node.go24
3 files changed, 74 insertions, 0 deletions
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
+}