]> git.ipfire.org Git - thirdparty/wireguard-go.git/commitdiff
device: optimize Peer.String even more
authorJason A. Donenfeld <Jason@zx2c4.com>
Thu, 13 May 2021 23:07:55 +0000 (01:07 +0200)
committerJason A. Donenfeld <Jason@zx2c4.com>
Tue, 18 May 2021 15:43:53 +0000 (17:43 +0200)
This reduces the allocation, branches, and amount of base64 encoding.

Signed-off-by: Jason A. Donenfeld <Jason@zx2c4.com>
device/peer.go

index d2f6d0773e3895ee5c7001e244ff33cf76661602..c8b825d62b782037f21f35848be1d91560729470 100644 (file)
@@ -7,7 +7,6 @@ package device
 
 import (
        "container/list"
-       "encoding/base64"
        "errors"
        "sync"
        "sync/atomic"
@@ -150,19 +149,22 @@ func (peer *Peer) String() string {
        //   return fmt.Sprintf("peer(%s)", abbreviatedKey)
        //
        // except that it is considerably more efficient.
-       const prefix = "peer("
-       b := make([]byte, len(prefix)+44)
-       copy(b, prefix)
-       r := b[len(prefix):]
-       base64.StdEncoding.Encode(r, peer.handshake.remoteStatic[:])
-       r = r[4:]
-       copy(r, "…")
-       r = r[len("…"):]
-       copy(r, b[len(prefix)+39:len(prefix)+43])
-       r = r[4:]
-       r[0] = ')'
-       r = r[1:]
-       return string(b[:len(b)-len(r)])
+       src := peer.handshake.remoteStatic
+       b64 := func(input byte) byte {
+               return input + 'A' + byte(((25-int(input))>>8)&6) - byte(((51-int(input))>>8)&75) - byte(((61-int(input))>>8)&15) + byte(((62-int(input))>>8)&3)
+       }
+       b := []byte("peer(____…____)")
+       const first = len("peer(")
+       const second = len("peer(____…")
+       b[first+0] = b64((src[0] >> 2) & 63)
+       b[first+1] = b64(((src[0] << 4) | (src[1] >> 4)) & 63)
+       b[first+2] = b64(((src[1] << 2) | (src[2] >> 6)) & 63)
+       b[first+3] = b64(src[2] & 63)
+       b[second+0] = b64(src[29] & 63)
+       b[second+1] = b64((src[30] >> 2) & 63)
+       b[second+2] = b64(((src[30] << 4) | (src[31] >> 4)) & 63)
+       b[second+3] = b64((src[31] << 2) & 63)
+       return string(b)
 }
 
 func (peer *Peer) Start() {