From: Matt Joiner Date: Mon, 4 Jan 2021 00:34:04 +0000 (+1100) Subject: mse: Optimize allocations receiving handshakes X-Git-Tag: v1.20.0~2 X-Git-Url: http://www.git.stargrave.org/?a=commitdiff_plain;h=be639852e393156e2a4dce9185e54ecc45aa7081;p=btrtrc.git mse: Optimize allocations receiving handshakes --- diff --git a/mse/mse.go b/mse/mse.go index 85d55a7d..d4a0368e 100644 --- a/mse/mse.go +++ b/mse/mse.go @@ -19,7 +19,6 @@ import ( "sync" "github.com/anacrolix/missinggo/perf" - "github.com/bradfitz/iter" ) const ( @@ -286,18 +285,22 @@ func (h *handshake) postWrite(b []byte) error { return nil } -func xor(dst, src []byte) (ret []byte) { - max := len(dst) - if max > len(src) { - max = len(src) - } - ret = make([]byte, 0, max) - for i := range iter.N(max) { - ret = append(ret, dst[i]^src[i]) +func xor(a, b []byte) (ret []byte) { + max := len(a) + if max > len(b) { + max = len(b) } + ret = make([]byte, max) + xorInPlace(ret, a, b) return } +func xorInPlace(dst, a, b []byte) { + for i := range dst { + dst[i] = a[i] ^ b[i] + } +} + func marshal(w io.Writer, data ...interface{}) (err error) { for _, data := range data { err = binary.Write(w, binary.BigEndian, data) @@ -438,9 +441,17 @@ func (h *handshake) receiverSteps() (ret io.ReadWriter, chosen CryptoMethod, err if err != nil { return } + expectedHash := hash(req3, h.s[:]) + eachHash := sha1.New() + var sum, xored [sha1.Size]byte err = ErrNoSecretKeyMatch h.skeys(func(skey []byte) bool { - if bytes.Equal(xor(hash(req2, skey), hash(req3, h.s[:])), b[:]) { + eachHash.Reset() + eachHash.Write(req2) + eachHash.Write(skey) + eachHash.Sum(sum[:0]) + xorInPlace(xored[:], sum[:], expectedHash) + if bytes.Equal(xored[:], b[:]) { h.skey = skey err = nil return false