]> git.ipfire.org Git - thirdparty/wireguard-go.git/commitdiff
device: avoid hex allocations in IpcGet
authorJason A. Donenfeld <Jason@zx2c4.com>
Wed, 27 Jan 2021 23:49:31 +0000 (00:49 +0100)
committerJason A. Donenfeld <Jason@zx2c4.com>
Thu, 28 Jan 2021 14:22:34 +0000 (15:22 +0100)
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>
device/noise-types.go
device/uapi.go

index 90108d476a047117a00fef46a3d5175ae6547938..3688f7d5de098f9b671d678803359e143e02f96a 100644 (file)
@@ -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[:])
-}
index bfef8779da5ca7293f53b941a9b03852ab5abab9..6f7fb2a48d6e40bc8206d8466449ccfd5631c7e3 100644 (file)
@@ -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())