"expvar"
"fmt"
"io"
- "io/ioutil"
"math"
"math/big"
"strconv"
"sync"
"github.com/anacrolix/missinggo/perf"
- "github.com/bradfitz/iter"
)
const (
return h.Sum(nil)
}
-func newEncrypt(initer bool, s []byte, skey []byte) (c *rc4.Cipher) {
+func newEncrypt(initer bool, s, skey []byte) (c *rc4.Cipher) {
c, err := rc4.NewCipher(hash([]byte(func() string {
if initer {
return "keyA"
return ret
}
}()
- cr.c.XORKeyStream(be[:], b)
+ cr.c.XORKeyStream(be, b)
n, err = cr.w.Write(be[:len(b)])
if n != len(b) {
// The cipher will have advanced beyond the callers stream position.
var b [96]byte
_, err := io.ReadFull(h.conn, b[:])
if err != nil {
- return fmt.Errorf("error reading Y: %s", err)
+ return fmt.Errorf("error reading Y: %w", err)
}
var Y, S big.Int
Y.SetBytes(b[:])
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)
if err != nil {
return
}
- _, err = io.CopyN(ioutil.Discard, r, int64(padLen))
+ _, err = io.CopyN(io.Discard, r, int64(padLen))
if err != nil {
return
}
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
}
cryptoProvidesCount.Add(strconv.FormatUint(uint64(provides), 16), 1)
chosen = h.chooseMethod(provides)
- _, err = io.CopyN(ioutil.Discard, r, int64(padLen))
+ _, err = io.CopyN(io.Discard, r, int64(padLen))
if err != nil {
return
}
}()
err = h.establishS()
if err != nil {
- err = fmt.Errorf("error while establishing secret: %s", err)
+ err = fmt.Errorf("error while establishing secret: %w", err)
return
}
pad := make([]byte, newPadLen())
return
}
-func InitiateHandshake(rw io.ReadWriter, skey []byte, initialPayload []byte, cryptoProvides CryptoMethod) (ret io.ReadWriter, method CryptoMethod, err error) {
+func InitiateHandshake(
+ rw io.ReadWriter, skey, initialPayload []byte, cryptoProvides CryptoMethod,
+) (
+ ret io.ReadWriter, method CryptoMethod, err error,
+) {
h := handshake{
conn: rw,
initer: true,