summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorJason A. Donenfeld <Jason@zx2c4.com>2021-01-28 00:49:31 +0100
committerJason A. Donenfeld <Jason@zx2c4.com>2021-01-28 15:22:34 +0100
commit34c047c762c31911333833c56a6dc50c52c84f5f (patch)
treedca8ea6dc6fb03d939f0f012f6a61f44b6688a1e
parentd4725bc45685187088c84234a6d2be396a1373e5 (diff)
device: avoid hex allocations in IpcGet
benchmark old ns/op new ns/op delta BenchmarkUAPIGet-16 2872 2157 -24.90% benchmark old allocs new allocs delta BenchmarkUAPIGet-16 30 18 -40.00% benchmark old bytes new bytes delta BenchmarkUAPIGet-16 737 256 -65.26% Signed-off-by: Jason A. Donenfeld <Jason@zx2c4.com>
-rw-r--r--device/noise-types.go12
-rw-r--r--device/uapi.go17
2 files changed, 14 insertions, 15 deletions
diff --git a/device/noise-types.go b/device/noise-types.go
index 90108d4..3688f7d 100644
--- a/device/noise-types.go
+++ b/device/noise-types.go
@@ -60,18 +60,10 @@ func (key *NoisePrivateKey) FromMaybeZeroHex(src string) (err error) {
return
}
-func (key NoisePrivateKey) ToHex() string {
- return hex.EncodeToString(key[:])
-}
-
func (key *NoisePublicKey) FromHex(src string) error {
return loadExactHex(key[:], src)
}
-func (key NoisePublicKey) ToHex() string {
- return hex.EncodeToString(key[:])
-}
-
func (key NoisePublicKey) IsZero() bool {
var zero NoisePublicKey
return key.Equals(zero)
@@ -84,7 +76,3 @@ func (key NoisePublicKey) Equals(tar NoisePublicKey) bool {
func (key *NoisePresharedKey) FromHex(src string) error {
return loadExactHex(key[:], src)
}
-
-func (key NoisePresharedKey) ToHex() string {
- return hex.EncodeToString(key[:])
-}
diff --git a/device/uapi.go b/device/uapi.go
index bfef877..6f7fb2a 100644
--- a/device/uapi.go
+++ b/device/uapi.go
@@ -57,6 +57,17 @@ func (device *Device) IpcGetOperation(w io.Writer) error {
fmt.Fprintf(buf, format, args...)
buf.WriteByte('\n')
}
+ keyf := func(prefix string, key *[32]byte) {
+ buf.Grow(len(key)*2 + 2 + len(prefix))
+ buf.WriteString(prefix)
+ buf.WriteByte('=')
+ const hex = "0123456789abcdef"
+ for i := 0; i < len(key); i++ {
+ buf.WriteByte(hex[key[i]>>4])
+ buf.WriteByte(hex[key[i]&0xf])
+ }
+ buf.WriteByte('\n')
+ }
func() {
@@ -74,7 +85,7 @@ func (device *Device) IpcGetOperation(w io.Writer) error {
// serialize device related values
if !device.staticIdentity.privateKey.IsZero() {
- sendf("private_key=%s", device.staticIdentity.privateKey.ToHex())
+ keyf("private_key", (*[32]byte)(&device.staticIdentity.privateKey))
}
if device.net.port != 0 {
@@ -91,8 +102,8 @@ func (device *Device) IpcGetOperation(w io.Writer) error {
peer.RLock()
defer peer.RUnlock()
- sendf("public_key=%s", peer.handshake.remoteStatic.ToHex())
- sendf("preshared_key=%s", peer.handshake.presharedKey.ToHex())
+ keyf("public_key", (*[32]byte)(&peer.handshake.remoteStatic))
+ keyf("preshared_key", (*[32]byte)(&peer.handshake.presharedKey))
sendf("protocol_version=1")
if peer.endpoint != nil {
sendf("endpoint=%s", peer.endpoint.DstToString())