diff options
| author | 2023-01-30 10:45:34 +0100 | |
|---|---|---|
| committer | 2023-01-30 10:45:34 +0100 | |
| commit | 356e238793e16569f23723c338db72a0b2c8c344 (patch) | |
| tree | 44e4e6e40fca58d96a36cd5db13448c6960c034e /vendor/golang.org/x/crypto | |
| parent | [chore]: Bump github.com/microcosm-cc/bluemonday from 1.0.21 to 1.0.22 (#1399) (diff) | |
| download | gotosocial-356e238793e16569f23723c338db72a0b2c8c344.tar.xz | |
[chore]: Bump github.com/go-playground/validator/v10 (#1400)
Bumps [github.com/go-playground/validator/v10](https://github.com/go-playground/validator) from 10.11.1 to 10.11.2.
- [Release notes](https://github.com/go-playground/validator/releases)
- [Commits](https://github.com/go-playground/validator/compare/v10.11.1...v10.11.2)
---
updated-dependencies:
- dependency-name: github.com/go-playground/validator/v10
  dependency-type: direct:production
  update-type: version-update:semver-patch
...
Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Diffstat (limited to 'vendor/golang.org/x/crypto')
| -rw-r--r-- | vendor/golang.org/x/crypto/acme/acme.go | 2 | ||||
| -rw-r--r-- | vendor/golang.org/x/crypto/acme/autocert/autocert.go | 4 | ||||
| -rw-r--r-- | vendor/golang.org/x/crypto/acme/autocert/cache.go | 5 | ||||
| -rw-r--r-- | vendor/golang.org/x/crypto/acme/http.go | 6 | ||||
| -rw-r--r-- | vendor/golang.org/x/crypto/acme/rfc8555.go | 5 | ||||
| -rw-r--r-- | vendor/golang.org/x/crypto/acme/types.go | 4 | ||||
| -rw-r--r-- | vendor/golang.org/x/crypto/bcrypt/bcrypt.go | 11 | ||||
| -rw-r--r-- | vendor/golang.org/x/crypto/sha3/keccakf.go | 194 | ||||
| -rw-r--r-- | vendor/golang.org/x/crypto/ssh/certs.go | 2 | ||||
| -rw-r--r-- | vendor/golang.org/x/crypto/ssh/cipher.go | 11 | ||||
| -rw-r--r-- | vendor/golang.org/x/crypto/ssh/common.go | 19 | ||||
| -rw-r--r-- | vendor/golang.org/x/crypto/ssh/connection.go | 2 | ||||
| -rw-r--r-- | vendor/golang.org/x/crypto/ssh/handshake.go | 69 | ||||
| -rw-r--r-- | vendor/golang.org/x/crypto/ssh/keys.go | 2 | ||||
| -rw-r--r-- | vendor/golang.org/x/crypto/ssh/messages.go | 2 | ||||
| -rw-r--r-- | vendor/golang.org/x/crypto/ssh/server.go | 27 | ||||
| -rw-r--r-- | vendor/golang.org/x/crypto/ssh/session.go | 7 | 
17 files changed, 214 insertions, 158 deletions
diff --git a/vendor/golang.org/x/crypto/acme/acme.go b/vendor/golang.org/x/crypto/acme/acme.go index 7f1cd80c0..aaafea2bc 100644 --- a/vendor/golang.org/x/crypto/acme/acme.go +++ b/vendor/golang.org/x/crypto/acme/acme.go @@ -88,7 +88,7 @@ type Client struct {  	//  	// The following algorithms are supported:  	// RS256, ES256, ES384 and ES512. -	// See RFC7518 for more details about the algorithms. +	// See RFC 7518 for more details about the algorithms.  	Key crypto.Signer  	// HTTPClient optionally specifies an HTTP client to use diff --git a/vendor/golang.org/x/crypto/acme/autocert/autocert.go b/vendor/golang.org/x/crypto/acme/autocert/autocert.go index 0061c2881..6b4cdf406 100644 --- a/vendor/golang.org/x/crypto/acme/autocert/autocert.go +++ b/vendor/golang.org/x/crypto/acme/autocert/autocert.go @@ -463,7 +463,7 @@ func (m *Manager) cert(ctx context.Context, ck certKey) (*tls.Certificate, error  		leaf: cert.Leaf,  	}  	m.state[ck] = s -	go m.startRenew(ck, s.key, s.leaf.NotAfter) +	m.startRenew(ck, s.key, s.leaf.NotAfter)  	return cert, nil  } @@ -609,7 +609,7 @@ func (m *Manager) createCert(ctx context.Context, ck certKey) (*tls.Certificate,  	}  	state.cert = der  	state.leaf = leaf -	go m.startRenew(ck, state.key, state.leaf.NotAfter) +	m.startRenew(ck, state.key, state.leaf.NotAfter)  	return state.tlscert()  } diff --git a/vendor/golang.org/x/crypto/acme/autocert/cache.go b/vendor/golang.org/x/crypto/acme/autocert/cache.go index 3156a081f..758ab12cb 100644 --- a/vendor/golang.org/x/crypto/acme/autocert/cache.go +++ b/vendor/golang.org/x/crypto/acme/autocert/cache.go @@ -7,7 +7,6 @@ package autocert  import (  	"context"  	"errors" -	"io/ioutil"  	"os"  	"path/filepath"  ) @@ -48,7 +47,7 @@ func (d DirCache) Get(ctx context.Context, name string) ([]byte, error) {  		done = make(chan struct{})  	)  	go func() { -		data, err = ioutil.ReadFile(name) +		data, err = os.ReadFile(name)  		close(done)  	}()  	select { @@ -119,7 +118,7 @@ func (d DirCache) Delete(ctx context.Context, name string) error {  // writeTempFile writes b to a temporary file, closes the file and returns its path.  func (d DirCache) writeTempFile(prefix string, b []byte) (name string, reterr error) {  	// TempFile uses 0600 permissions -	f, err := ioutil.TempFile(string(d), prefix) +	f, err := os.CreateTemp(string(d), prefix)  	if err != nil {  		return "", err  	} diff --git a/vendor/golang.org/x/crypto/acme/http.go b/vendor/golang.org/x/crypto/acme/http.go index 2b4c1a10d..58836e5d3 100644 --- a/vendor/golang.org/x/crypto/acme/http.go +++ b/vendor/golang.org/x/crypto/acme/http.go @@ -12,7 +12,7 @@ import (  	"encoding/json"  	"errors"  	"fmt" -	"io/ioutil" +	"io"  	"math/big"  	"net/http"  	"strconv" @@ -156,7 +156,7 @@ func (c *Client) get(ctx context.Context, url string, ok resOkay) (*http.Respons  	}  } -// postAsGet is POST-as-GET, a replacement for GET in RFC8555 +// postAsGet is POST-as-GET, a replacement for GET in RFC 8555  // as described in https://tools.ietf.org/html/rfc8555#section-6.3.  // It makes a POST request in KID form with zero JWS payload.  // See nopayload doc comments in jws.go. @@ -310,7 +310,7 @@ func isRetriable(code int) bool {  func responseError(resp *http.Response) error {  	// don't care if ReadAll returns an error:  	// json.Unmarshal will fail in that case anyway -	b, _ := ioutil.ReadAll(resp.Body) +	b, _ := io.ReadAll(resp.Body)  	e := &wireError{Status: resp.StatusCode}  	if err := json.Unmarshal(b, e); err != nil {  		// this is not a regular error response: diff --git a/vendor/golang.org/x/crypto/acme/rfc8555.go b/vendor/golang.org/x/crypto/acme/rfc8555.go index 940e70b85..ee24dfdec 100644 --- a/vendor/golang.org/x/crypto/acme/rfc8555.go +++ b/vendor/golang.org/x/crypto/acme/rfc8555.go @@ -13,7 +13,6 @@ import (  	"errors"  	"fmt"  	"io" -	"io/ioutil"  	"net/http"  	"time"  ) @@ -390,7 +389,7 @@ func (c *Client) fetchCertRFC(ctx context.Context, url string, bundle bool) ([][  	// Get all the bytes up to a sane maximum.  	// Account very roughly for base64 overhead.  	const max = maxCertChainSize + maxCertChainSize/33 -	b, err := ioutil.ReadAll(io.LimitReader(res.Body, max+1)) +	b, err := io.ReadAll(io.LimitReader(res.Body, max+1))  	if err != nil {  		return nil, fmt.Errorf("acme: fetch cert response stream: %v", err)  	} @@ -469,7 +468,7 @@ func (c *Client) ListCertAlternates(ctx context.Context, url string) ([]string,  	// We don't need the body but we need to discard it so we don't end up  	// preventing keep-alive -	if _, err := io.Copy(ioutil.Discard, res.Body); err != nil { +	if _, err := io.Copy(io.Discard, res.Body); err != nil {  		return nil, fmt.Errorf("acme: cert alternates response stream: %v", err)  	}  	alts := linkHeader(res.Header, "alternate") diff --git a/vendor/golang.org/x/crypto/acme/types.go b/vendor/golang.org/x/crypto/acme/types.go index 67b825201..4888726fe 100644 --- a/vendor/golang.org/x/crypto/acme/types.go +++ b/vendor/golang.org/x/crypto/acme/types.go @@ -297,7 +297,7 @@ type Directory struct {  	// CAA consists of lowercase hostname elements, which the ACME server  	// recognises as referring to itself for the purposes of CAA record validation -	// as defined in RFC6844. +	// as defined in RFC 6844.  	CAA []string  	// ExternalAccountRequired indicates that the CA requires for all account-related @@ -440,7 +440,7 @@ func DomainIDs(names ...string) []AuthzID {  // IPIDs creates a slice of AuthzID with "ip" identifier type.  // Each element of addr is textual form of an address as defined -// in RFC1123 Section 2.1 for IPv4 and in RFC5952 Section 4 for IPv6. +// in RFC 1123 Section 2.1 for IPv4 and in RFC 5952 Section 4 for IPv6.  func IPIDs(addr ...string) []AuthzID {  	a := make([]AuthzID, len(addr))  	for i, v := range addr { diff --git a/vendor/golang.org/x/crypto/bcrypt/bcrypt.go b/vendor/golang.org/x/crypto/bcrypt/bcrypt.go index aeb73f81a..5577c0f93 100644 --- a/vendor/golang.org/x/crypto/bcrypt/bcrypt.go +++ b/vendor/golang.org/x/crypto/bcrypt/bcrypt.go @@ -50,7 +50,7 @@ func (ih InvalidHashPrefixError) Error() string {  type InvalidCostError int  func (ic InvalidCostError) Error() string { -	return fmt.Sprintf("crypto/bcrypt: cost %d is outside allowed range (%d,%d)", int(ic), int(MinCost), int(MaxCost)) +	return fmt.Sprintf("crypto/bcrypt: cost %d is outside allowed range (%d,%d)", int(ic), MinCost, MaxCost)  }  const ( @@ -82,11 +82,20 @@ type hashed struct {  	minor byte  } +// ErrPasswordTooLong is returned when the password passed to +// GenerateFromPassword is too long (i.e. > 72 bytes). +var ErrPasswordTooLong = errors.New("bcrypt: password length exceeds 72 bytes") +  // GenerateFromPassword returns the bcrypt hash of the password at the given  // cost. If the cost given is less than MinCost, the cost will be set to  // DefaultCost, instead. Use CompareHashAndPassword, as defined in this package,  // to compare the returned hashed password with its cleartext version. +// GenerateFromPassword does not accept passwords longer than 72 bytes, which +// is the longest password bcrypt will operate on.  func GenerateFromPassword(password []byte, cost int) ([]byte, error) { +	if len(password) > 72 { +		return nil, ErrPasswordTooLong +	}  	p, err := newFromPassword(password, cost)  	if err != nil {  		return nil, err diff --git a/vendor/golang.org/x/crypto/sha3/keccakf.go b/vendor/golang.org/x/crypto/sha3/keccakf.go index 0f4ae8bac..e5faa375c 100644 --- a/vendor/golang.org/x/crypto/sha3/keccakf.go +++ b/vendor/golang.org/x/crypto/sha3/keccakf.go @@ -7,6 +7,8 @@  package sha3 +import "math/bits" +  // rc stores the round constants for use in the ι step.  var rc = [24]uint64{  	0x0000000000000001, @@ -60,13 +62,13 @@ func keccakF1600(a *[25]uint64) {  		bc0 = a[0] ^ d0  		t = a[6] ^ d1 -		bc1 = t<<44 | t>>(64-44) +		bc1 = bits.RotateLeft64(t, 44)  		t = a[12] ^ d2 -		bc2 = t<<43 | t>>(64-43) +		bc2 = bits.RotateLeft64(t, 43)  		t = a[18] ^ d3 -		bc3 = t<<21 | t>>(64-21) +		bc3 = bits.RotateLeft64(t, 21)  		t = a[24] ^ d4 -		bc4 = t<<14 | t>>(64-14) +		bc4 = bits.RotateLeft64(t, 14)  		a[0] = bc0 ^ (bc2 &^ bc1) ^ rc[i]  		a[6] = bc1 ^ (bc3 &^ bc2)  		a[12] = bc2 ^ (bc4 &^ bc3) @@ -74,15 +76,15 @@ func keccakF1600(a *[25]uint64) {  		a[24] = bc4 ^ (bc1 &^ bc0)  		t = a[10] ^ d0 -		bc2 = t<<3 | t>>(64-3) +		bc2 = bits.RotateLeft64(t, 3)  		t = a[16] ^ d1 -		bc3 = t<<45 | t>>(64-45) +		bc3 = bits.RotateLeft64(t, 45)  		t = a[22] ^ d2 -		bc4 = t<<61 | t>>(64-61) +		bc4 = bits.RotateLeft64(t, 61)  		t = a[3] ^ d3 -		bc0 = t<<28 | t>>(64-28) +		bc0 = bits.RotateLeft64(t, 28)  		t = a[9] ^ d4 -		bc1 = t<<20 | t>>(64-20) +		bc1 = bits.RotateLeft64(t, 20)  		a[10] = bc0 ^ (bc2 &^ bc1)  		a[16] = bc1 ^ (bc3 &^ bc2)  		a[22] = bc2 ^ (bc4 &^ bc3) @@ -90,15 +92,15 @@ func keccakF1600(a *[25]uint64) {  		a[9] = bc4 ^ (bc1 &^ bc0)  		t = a[20] ^ d0 -		bc4 = t<<18 | t>>(64-18) +		bc4 = bits.RotateLeft64(t, 18)  		t = a[1] ^ d1 -		bc0 = t<<1 | t>>(64-1) +		bc0 = bits.RotateLeft64(t, 1)  		t = a[7] ^ d2 -		bc1 = t<<6 | t>>(64-6) +		bc1 = bits.RotateLeft64(t, 6)  		t = a[13] ^ d3 -		bc2 = t<<25 | t>>(64-25) +		bc2 = bits.RotateLeft64(t, 25)  		t = a[19] ^ d4 -		bc3 = t<<8 | t>>(64-8) +		bc3 = bits.RotateLeft64(t, 8)  		a[20] = bc0 ^ (bc2 &^ bc1)  		a[1] = bc1 ^ (bc3 &^ bc2)  		a[7] = bc2 ^ (bc4 &^ bc3) @@ -106,15 +108,15 @@ func keccakF1600(a *[25]uint64) {  		a[19] = bc4 ^ (bc1 &^ bc0)  		t = a[5] ^ d0 -		bc1 = t<<36 | t>>(64-36) +		bc1 = bits.RotateLeft64(t, 36)  		t = a[11] ^ d1 -		bc2 = t<<10 | t>>(64-10) +		bc2 = bits.RotateLeft64(t, 10)  		t = a[17] ^ d2 -		bc3 = t<<15 | t>>(64-15) +		bc3 = bits.RotateLeft64(t, 15)  		t = a[23] ^ d3 -		bc4 = t<<56 | t>>(64-56) +		bc4 = bits.RotateLeft64(t, 56)  		t = a[4] ^ d4 -		bc0 = t<<27 | t>>(64-27) +		bc0 = bits.RotateLeft64(t, 27)  		a[5] = bc0 ^ (bc2 &^ bc1)  		a[11] = bc1 ^ (bc3 &^ bc2)  		a[17] = bc2 ^ (bc4 &^ bc3) @@ -122,15 +124,15 @@ func keccakF1600(a *[25]uint64) {  		a[4] = bc4 ^ (bc1 &^ bc0)  		t = a[15] ^ d0 -		bc3 = t<<41 | t>>(64-41) +		bc3 = bits.RotateLeft64(t, 41)  		t = a[21] ^ d1 -		bc4 = t<<2 | t>>(64-2) +		bc4 = bits.RotateLeft64(t, 2)  		t = a[2] ^ d2 -		bc0 = t<<62 | t>>(64-62) +		bc0 = bits.RotateLeft64(t, 62)  		t = a[8] ^ d3 -		bc1 = t<<55 | t>>(64-55) +		bc1 = bits.RotateLeft64(t, 55)  		t = a[14] ^ d4 -		bc2 = t<<39 | t>>(64-39) +		bc2 = bits.RotateLeft64(t, 39)  		a[15] = bc0 ^ (bc2 &^ bc1)  		a[21] = bc1 ^ (bc3 &^ bc2)  		a[2] = bc2 ^ (bc4 &^ bc3) @@ -151,13 +153,13 @@ func keccakF1600(a *[25]uint64) {  		bc0 = a[0] ^ d0  		t = a[16] ^ d1 -		bc1 = t<<44 | t>>(64-44) +		bc1 = bits.RotateLeft64(t, 44)  		t = a[7] ^ d2 -		bc2 = t<<43 | t>>(64-43) +		bc2 = bits.RotateLeft64(t, 43)  		t = a[23] ^ d3 -		bc3 = t<<21 | t>>(64-21) +		bc3 = bits.RotateLeft64(t, 21)  		t = a[14] ^ d4 -		bc4 = t<<14 | t>>(64-14) +		bc4 = bits.RotateLeft64(t, 14)  		a[0] = bc0 ^ (bc2 &^ bc1) ^ rc[i+1]  		a[16] = bc1 ^ (bc3 &^ bc2)  		a[7] = bc2 ^ (bc4 &^ bc3) @@ -165,15 +167,15 @@ func keccakF1600(a *[25]uint64) {  		a[14] = bc4 ^ (bc1 &^ bc0)  		t = a[20] ^ d0 -		bc2 = t<<3 | t>>(64-3) +		bc2 = bits.RotateLeft64(t, 3)  		t = a[11] ^ d1 -		bc3 = t<<45 | t>>(64-45) +		bc3 = bits.RotateLeft64(t, 45)  		t = a[2] ^ d2 -		bc4 = t<<61 | t>>(64-61) +		bc4 = bits.RotateLeft64(t, 61)  		t = a[18] ^ d3 -		bc0 = t<<28 | t>>(64-28) +		bc0 = bits.RotateLeft64(t, 28)  		t = a[9] ^ d4 -		bc1 = t<<20 | t>>(64-20) +		bc1 = bits.RotateLeft64(t, 20)  		a[20] = bc0 ^ (bc2 &^ bc1)  		a[11] = bc1 ^ (bc3 &^ bc2)  		a[2] = bc2 ^ (bc4 &^ bc3) @@ -181,15 +183,15 @@ func keccakF1600(a *[25]uint64) {  		a[9] = bc4 ^ (bc1 &^ bc0)  		t = a[15] ^ d0 -		bc4 = t<<18 | t>>(64-18) +		bc4 = bits.RotateLeft64(t, 18)  		t = a[6] ^ d1 -		bc0 = t<<1 | t>>(64-1) +		bc0 = bits.RotateLeft64(t, 1)  		t = a[22] ^ d2 -		bc1 = t<<6 | t>>(64-6) +		bc1 = bits.RotateLeft64(t, 6)  		t = a[13] ^ d3 -		bc2 = t<<25 | t>>(64-25) +		bc2 = bits.RotateLeft64(t, 25)  		t = a[4] ^ d4 -		bc3 = t<<8 | t>>(64-8) +		bc3 = bits.RotateLeft64(t, 8)  		a[15] = bc0 ^ (bc2 &^ bc1)  		a[6] = bc1 ^ (bc3 &^ bc2)  		a[22] = bc2 ^ (bc4 &^ bc3) @@ -197,15 +199,15 @@ func keccakF1600(a *[25]uint64) {  		a[4] = bc4 ^ (bc1 &^ bc0)  		t = a[10] ^ d0 -		bc1 = t<<36 | t>>(64-36) +		bc1 = bits.RotateLeft64(t, 36)  		t = a[1] ^ d1 -		bc2 = t<<10 | t>>(64-10) +		bc2 = bits.RotateLeft64(t, 10)  		t = a[17] ^ d2 -		bc3 = t<<15 | t>>(64-15) +		bc3 = bits.RotateLeft64(t, 15)  		t = a[8] ^ d3 -		bc4 = t<<56 | t>>(64-56) +		bc4 = bits.RotateLeft64(t, 56)  		t = a[24] ^ d4 -		bc0 = t<<27 | t>>(64-27) +		bc0 = bits.RotateLeft64(t, 27)  		a[10] = bc0 ^ (bc2 &^ bc1)  		a[1] = bc1 ^ (bc3 &^ bc2)  		a[17] = bc2 ^ (bc4 &^ bc3) @@ -213,15 +215,15 @@ func keccakF1600(a *[25]uint64) {  		a[24] = bc4 ^ (bc1 &^ bc0)  		t = a[5] ^ d0 -		bc3 = t<<41 | t>>(64-41) +		bc3 = bits.RotateLeft64(t, 41)  		t = a[21] ^ d1 -		bc4 = t<<2 | t>>(64-2) +		bc4 = bits.RotateLeft64(t, 2)  		t = a[12] ^ d2 -		bc0 = t<<62 | t>>(64-62) +		bc0 = bits.RotateLeft64(t, 62)  		t = a[3] ^ d3 -		bc1 = t<<55 | t>>(64-55) +		bc1 = bits.RotateLeft64(t, 55)  		t = a[19] ^ d4 -		bc2 = t<<39 | t>>(64-39) +		bc2 = bits.RotateLeft64(t, 39)  		a[5] = bc0 ^ (bc2 &^ bc1)  		a[21] = bc1 ^ (bc3 &^ bc2)  		a[12] = bc2 ^ (bc4 &^ bc3) @@ -242,13 +244,13 @@ func keccakF1600(a *[25]uint64) {  		bc0 = a[0] ^ d0  		t = a[11] ^ d1 -		bc1 = t<<44 | t>>(64-44) +		bc1 = bits.RotateLeft64(t, 44)  		t = a[22] ^ d2 -		bc2 = t<<43 | t>>(64-43) +		bc2 = bits.RotateLeft64(t, 43)  		t = a[8] ^ d3 -		bc3 = t<<21 | t>>(64-21) +		bc3 = bits.RotateLeft64(t, 21)  		t = a[19] ^ d4 -		bc4 = t<<14 | t>>(64-14) +		bc4 = bits.RotateLeft64(t, 14)  		a[0] = bc0 ^ (bc2 &^ bc1) ^ rc[i+2]  		a[11] = bc1 ^ (bc3 &^ bc2)  		a[22] = bc2 ^ (bc4 &^ bc3) @@ -256,15 +258,15 @@ func keccakF1600(a *[25]uint64) {  		a[19] = bc4 ^ (bc1 &^ bc0)  		t = a[15] ^ d0 -		bc2 = t<<3 | t>>(64-3) +		bc2 = bits.RotateLeft64(t, 3)  		t = a[1] ^ d1 -		bc3 = t<<45 | t>>(64-45) +		bc3 = bits.RotateLeft64(t, 45)  		t = a[12] ^ d2 -		bc4 = t<<61 | t>>(64-61) +		bc4 = bits.RotateLeft64(t, 61)  		t = a[23] ^ d3 -		bc0 = t<<28 | t>>(64-28) +		bc0 = bits.RotateLeft64(t, 28)  		t = a[9] ^ d4 -		bc1 = t<<20 | t>>(64-20) +		bc1 = bits.RotateLeft64(t, 20)  		a[15] = bc0 ^ (bc2 &^ bc1)  		a[1] = bc1 ^ (bc3 &^ bc2)  		a[12] = bc2 ^ (bc4 &^ bc3) @@ -272,15 +274,15 @@ func keccakF1600(a *[25]uint64) {  		a[9] = bc4 ^ (bc1 &^ bc0)  		t = a[5] ^ d0 -		bc4 = t<<18 | t>>(64-18) +		bc4 = bits.RotateLeft64(t, 18)  		t = a[16] ^ d1 -		bc0 = t<<1 | t>>(64-1) +		bc0 = bits.RotateLeft64(t, 1)  		t = a[2] ^ d2 -		bc1 = t<<6 | t>>(64-6) +		bc1 = bits.RotateLeft64(t, 6)  		t = a[13] ^ d3 -		bc2 = t<<25 | t>>(64-25) +		bc2 = bits.RotateLeft64(t, 25)  		t = a[24] ^ d4 -		bc3 = t<<8 | t>>(64-8) +		bc3 = bits.RotateLeft64(t, 8)  		a[5] = bc0 ^ (bc2 &^ bc1)  		a[16] = bc1 ^ (bc3 &^ bc2)  		a[2] = bc2 ^ (bc4 &^ bc3) @@ -288,15 +290,15 @@ func keccakF1600(a *[25]uint64) {  		a[24] = bc4 ^ (bc1 &^ bc0)  		t = a[20] ^ d0 -		bc1 = t<<36 | t>>(64-36) +		bc1 = bits.RotateLeft64(t, 36)  		t = a[6] ^ d1 -		bc2 = t<<10 | t>>(64-10) +		bc2 = bits.RotateLeft64(t, 10)  		t = a[17] ^ d2 -		bc3 = t<<15 | t>>(64-15) +		bc3 = bits.RotateLeft64(t, 15)  		t = a[3] ^ d3 -		bc4 = t<<56 | t>>(64-56) +		bc4 = bits.RotateLeft64(t, 56)  		t = a[14] ^ d4 -		bc0 = t<<27 | t>>(64-27) +		bc0 = bits.RotateLeft64(t, 27)  		a[20] = bc0 ^ (bc2 &^ bc1)  		a[6] = bc1 ^ (bc3 &^ bc2)  		a[17] = bc2 ^ (bc4 &^ bc3) @@ -304,15 +306,15 @@ func keccakF1600(a *[25]uint64) {  		a[14] = bc4 ^ (bc1 &^ bc0)  		t = a[10] ^ d0 -		bc3 = t<<41 | t>>(64-41) +		bc3 = bits.RotateLeft64(t, 41)  		t = a[21] ^ d1 -		bc4 = t<<2 | t>>(64-2) +		bc4 = bits.RotateLeft64(t, 2)  		t = a[7] ^ d2 -		bc0 = t<<62 | t>>(64-62) +		bc0 = bits.RotateLeft64(t, 62)  		t = a[18] ^ d3 -		bc1 = t<<55 | t>>(64-55) +		bc1 = bits.RotateLeft64(t, 55)  		t = a[4] ^ d4 -		bc2 = t<<39 | t>>(64-39) +		bc2 = bits.RotateLeft64(t, 39)  		a[10] = bc0 ^ (bc2 &^ bc1)  		a[21] = bc1 ^ (bc3 &^ bc2)  		a[7] = bc2 ^ (bc4 &^ bc3) @@ -333,13 +335,13 @@ func keccakF1600(a *[25]uint64) {  		bc0 = a[0] ^ d0  		t = a[1] ^ d1 -		bc1 = t<<44 | t>>(64-44) +		bc1 = bits.RotateLeft64(t, 44)  		t = a[2] ^ d2 -		bc2 = t<<43 | t>>(64-43) +		bc2 = bits.RotateLeft64(t, 43)  		t = a[3] ^ d3 -		bc3 = t<<21 | t>>(64-21) +		bc3 = bits.RotateLeft64(t, 21)  		t = a[4] ^ d4 -		bc4 = t<<14 | t>>(64-14) +		bc4 = bits.RotateLeft64(t, 14)  		a[0] = bc0 ^ (bc2 &^ bc1) ^ rc[i+3]  		a[1] = bc1 ^ (bc3 &^ bc2)  		a[2] = bc2 ^ (bc4 &^ bc3) @@ -347,15 +349,15 @@ func keccakF1600(a *[25]uint64) {  		a[4] = bc4 ^ (bc1 &^ bc0)  		t = a[5] ^ d0 -		bc2 = t<<3 | t>>(64-3) +		bc2 = bits.RotateLeft64(t, 3)  		t = a[6] ^ d1 -		bc3 = t<<45 | t>>(64-45) +		bc3 = bits.RotateLeft64(t, 45)  		t = a[7] ^ d2 -		bc4 = t<<61 | t>>(64-61) +		bc4 = bits.RotateLeft64(t, 61)  		t = a[8] ^ d3 -		bc0 = t<<28 | t>>(64-28) +		bc0 = bits.RotateLeft64(t, 28)  		t = a[9] ^ d4 -		bc1 = t<<20 | t>>(64-20) +		bc1 = bits.RotateLeft64(t, 20)  		a[5] = bc0 ^ (bc2 &^ bc1)  		a[6] = bc1 ^ (bc3 &^ bc2)  		a[7] = bc2 ^ (bc4 &^ bc3) @@ -363,15 +365,15 @@ func keccakF1600(a *[25]uint64) {  		a[9] = bc4 ^ (bc1 &^ bc0)  		t = a[10] ^ d0 -		bc4 = t<<18 | t>>(64-18) +		bc4 = bits.RotateLeft64(t, 18)  		t = a[11] ^ d1 -		bc0 = t<<1 | t>>(64-1) +		bc0 = bits.RotateLeft64(t, 1)  		t = a[12] ^ d2 -		bc1 = t<<6 | t>>(64-6) +		bc1 = bits.RotateLeft64(t, 6)  		t = a[13] ^ d3 -		bc2 = t<<25 | t>>(64-25) +		bc2 = bits.RotateLeft64(t, 25)  		t = a[14] ^ d4 -		bc3 = t<<8 | t>>(64-8) +		bc3 = bits.RotateLeft64(t, 8)  		a[10] = bc0 ^ (bc2 &^ bc1)  		a[11] = bc1 ^ (bc3 &^ bc2)  		a[12] = bc2 ^ (bc4 &^ bc3) @@ -379,15 +381,15 @@ func keccakF1600(a *[25]uint64) {  		a[14] = bc4 ^ (bc1 &^ bc0)  		t = a[15] ^ d0 -		bc1 = t<<36 | t>>(64-36) +		bc1 = bits.RotateLeft64(t, 36)  		t = a[16] ^ d1 -		bc2 = t<<10 | t>>(64-10) +		bc2 = bits.RotateLeft64(t, 10)  		t = a[17] ^ d2 -		bc3 = t<<15 | t>>(64-15) +		bc3 = bits.RotateLeft64(t, 15)  		t = a[18] ^ d3 -		bc4 = t<<56 | t>>(64-56) +		bc4 = bits.RotateLeft64(t, 56)  		t = a[19] ^ d4 -		bc0 = t<<27 | t>>(64-27) +		bc0 = bits.RotateLeft64(t, 27)  		a[15] = bc0 ^ (bc2 &^ bc1)  		a[16] = bc1 ^ (bc3 &^ bc2)  		a[17] = bc2 ^ (bc4 &^ bc3) @@ -395,15 +397,15 @@ func keccakF1600(a *[25]uint64) {  		a[19] = bc4 ^ (bc1 &^ bc0)  		t = a[20] ^ d0 -		bc3 = t<<41 | t>>(64-41) +		bc3 = bits.RotateLeft64(t, 41)  		t = a[21] ^ d1 -		bc4 = t<<2 | t>>(64-2) +		bc4 = bits.RotateLeft64(t, 2)  		t = a[22] ^ d2 -		bc0 = t<<62 | t>>(64-62) +		bc0 = bits.RotateLeft64(t, 62)  		t = a[23] ^ d3 -		bc1 = t<<55 | t>>(64-55) +		bc1 = bits.RotateLeft64(t, 55)  		t = a[24] ^ d4 -		bc2 = t<<39 | t>>(64-39) +		bc2 = bits.RotateLeft64(t, 39)  		a[20] = bc0 ^ (bc2 &^ bc1)  		a[21] = bc1 ^ (bc3 &^ bc2)  		a[22] = bc2 ^ (bc4 &^ bc3) diff --git a/vendor/golang.org/x/crypto/ssh/certs.go b/vendor/golang.org/x/crypto/ssh/certs.go index 4600c2077..fc04d03e1 100644 --- a/vendor/golang.org/x/crypto/ssh/certs.go +++ b/vendor/golang.org/x/crypto/ssh/certs.go @@ -251,7 +251,7 @@ type algorithmOpenSSHCertSigner struct {  // private key is held by signer. It returns an error if the public key in cert  // doesn't match the key used by signer.  func NewCertSigner(cert *Certificate, signer Signer) (Signer, error) { -	if bytes.Compare(cert.Key.Marshal(), signer.PublicKey().Marshal()) != 0 { +	if !bytes.Equal(cert.Key.Marshal(), signer.PublicKey().Marshal()) {  		return nil, errors.New("ssh: signer and cert have different public key")  	} diff --git a/vendor/golang.org/x/crypto/ssh/cipher.go b/vendor/golang.org/x/crypto/ssh/cipher.go index 770e8a663..87f48552c 100644 --- a/vendor/golang.org/x/crypto/ssh/cipher.go +++ b/vendor/golang.org/x/crypto/ssh/cipher.go @@ -15,7 +15,6 @@ import (  	"fmt"  	"hash"  	"io" -	"io/ioutil"  	"golang.org/x/crypto/chacha20"  	"golang.org/x/crypto/internal/poly1305" @@ -97,13 +96,13 @@ func streamCipherMode(skip int, createFunc func(key, iv []byte) (cipher.Stream,  // are not supported and will not be negotiated, even if explicitly requested in  // ClientConfig.Crypto.Ciphers.  var cipherModes = map[string]*cipherMode{ -	// Ciphers from RFC4344, which introduced many CTR-based ciphers. Algorithms +	// Ciphers from RFC 4344, which introduced many CTR-based ciphers. Algorithms  	// are defined in the order specified in the RFC.  	"aes128-ctr": {16, aes.BlockSize, streamCipherMode(0, newAESCTR)},  	"aes192-ctr": {24, aes.BlockSize, streamCipherMode(0, newAESCTR)},  	"aes256-ctr": {32, aes.BlockSize, streamCipherMode(0, newAESCTR)}, -	// Ciphers from RFC4345, which introduces security-improved arcfour ciphers. +	// Ciphers from RFC 4345, which introduces security-improved arcfour ciphers.  	// They are defined in the order specified in the RFC.  	"arcfour128": {16, 0, streamCipherMode(1536, newRC4)},  	"arcfour256": {32, 0, streamCipherMode(1536, newRC4)}, @@ -111,7 +110,7 @@ var cipherModes = map[string]*cipherMode{  	// Cipher defined in RFC 4253, which describes SSH Transport Layer Protocol.  	// Note that this cipher is not safe, as stated in RFC 4253: "Arcfour (and  	// RC4) has problems with weak keys, and should be used with caution." -	// RFC4345 introduces improved versions of Arcfour. +	// RFC 4345 introduces improved versions of Arcfour.  	"arcfour": {16, 0, streamCipherMode(0, newRC4)},  	// AEAD ciphers @@ -497,7 +496,7 @@ func (c *cbcCipher) readCipherPacket(seqNum uint32, r io.Reader) ([]byte, error)  			// data, to make distinguishing between  			// failing MAC and failing length check more  			// difficult. -			io.CopyN(ioutil.Discard, r, int64(c.oracleCamouflage)) +			io.CopyN(io.Discard, r, int64(c.oracleCamouflage))  		}  	}  	return p, err @@ -642,7 +641,7 @@ const chacha20Poly1305ID = "chacha20-poly1305@openssh.com"  //  //	https://tools.ietf.org/html/draft-josefsson-ssh-chacha20-poly1305-openssh-00  // -// the methods here also implement padding, which RFC4253 Section 6 +// the methods here also implement padding, which RFC 4253 Section 6  // also requires of stream ciphers.  type chacha20Poly1305Cipher struct {  	lengthKey  [32]byte diff --git a/vendor/golang.org/x/crypto/ssh/common.go b/vendor/golang.org/x/crypto/ssh/common.go index 2a47a61de..c7964275d 100644 --- a/vendor/golang.org/x/crypto/ssh/common.go +++ b/vendor/golang.org/x/crypto/ssh/common.go @@ -10,6 +10,7 @@ import (  	"fmt"  	"io"  	"math" +	"strings"  	"sync"  	_ "crypto/sha1" @@ -118,6 +119,20 @@ func algorithmsForKeyFormat(keyFormat string) []string {  	}  } +// supportedPubKeyAuthAlgos specifies the supported client public key +// authentication algorithms. Note that this doesn't include certificate types +// since those use the underlying algorithm. This list is sent to the client if +// it supports the server-sig-algs extension. Order is irrelevant. +var supportedPubKeyAuthAlgos = []string{ +	KeyAlgoED25519, +	KeyAlgoSKED25519, KeyAlgoSKECDSA256, +	KeyAlgoECDSA256, KeyAlgoECDSA384, KeyAlgoECDSA521, +	KeyAlgoRSASHA256, KeyAlgoRSASHA512, KeyAlgoRSA, +	KeyAlgoDSA, +} + +var supportedPubKeyAuthAlgosList = strings.Join(supportedPubKeyAuthAlgos, ",") +  // unexpectedMessageError results when the SSH message that we received didn't  // match what we wanted.  func unexpectedMessageError(expected, got uint8) error { @@ -149,7 +164,7 @@ type directionAlgorithms struct {  // rekeyBytes returns a rekeying intervals in bytes.  func (a *directionAlgorithms) rekeyBytes() int64 { -	// According to RFC4344 block ciphers should rekey after +	// According to RFC 4344 block ciphers should rekey after  	// 2^(BLOCKSIZE/4) blocks. For all AES flavors BLOCKSIZE is  	// 128.  	switch a.Cipher { @@ -158,7 +173,7 @@ func (a *directionAlgorithms) rekeyBytes() int64 {  	} -	// For others, stick with RFC4253 recommendation to rekey after 1 Gb of data. +	// For others, stick with RFC 4253 recommendation to rekey after 1 Gb of data.  	return 1 << 30  } diff --git a/vendor/golang.org/x/crypto/ssh/connection.go b/vendor/golang.org/x/crypto/ssh/connection.go index fd6b0681b..35661a52b 100644 --- a/vendor/golang.org/x/crypto/ssh/connection.go +++ b/vendor/golang.org/x/crypto/ssh/connection.go @@ -52,7 +52,7 @@ type Conn interface {  	// SendRequest sends a global request, and returns the  	// reply. If wantReply is true, it returns the response status -	// and payload. See also RFC4254, section 4. +	// and payload. See also RFC 4254, section 4.  	SendRequest(name string, wantReply bool, payload []byte) (bool, []byte, error)  	// OpenChannel tries to open an channel. If the request is diff --git a/vendor/golang.org/x/crypto/ssh/handshake.go b/vendor/golang.org/x/crypto/ssh/handshake.go index 653dc4d2c..07a1843e0 100644 --- a/vendor/golang.org/x/crypto/ssh/handshake.go +++ b/vendor/golang.org/x/crypto/ssh/handshake.go @@ -58,11 +58,13 @@ type handshakeTransport struct {  	incoming  chan []byte  	readError error -	mu             sync.Mutex -	writeError     error -	sentInitPacket []byte -	sentInitMsg    *kexInitMsg -	pendingPackets [][]byte // Used when a key exchange is in progress. +	mu               sync.Mutex +	writeError       error +	sentInitPacket   []byte +	sentInitMsg      *kexInitMsg +	pendingPackets   [][]byte // Used when a key exchange is in progress. +	writePacketsLeft uint32 +	writeBytesLeft   int64  	// If the read loop wants to schedule a kex, it pings this  	// channel, and the write loop will send out a kex @@ -71,7 +73,8 @@ type handshakeTransport struct {  	// If the other side requests or confirms a kex, its kexInit  	// packet is sent here for the write loop to find it. -	startKex chan *pendingKex +	startKex    chan *pendingKex +	kexLoopDone chan struct{} // closed (with writeError non-nil) when kexLoop exits  	// data for host key checking  	hostKeyCallback HostKeyCallback @@ -86,12 +89,10 @@ type handshakeTransport struct {  	// Algorithms agreed in the last key exchange.  	algorithms *algorithms +	// Counters exclusively owned by readLoop.  	readPacketsLeft uint32  	readBytesLeft   int64 -	writePacketsLeft uint32 -	writeBytesLeft   int64 -  	// The session ID or nil if first kex did not complete yet.  	sessionID []byte  } @@ -108,7 +109,8 @@ func newHandshakeTransport(conn keyingTransport, config *Config, clientVersion,  		clientVersion: clientVersion,  		incoming:      make(chan []byte, chanSize),  		requestKex:    make(chan struct{}, 1), -		startKex:      make(chan *pendingKex, 1), +		startKex:      make(chan *pendingKex), +		kexLoopDone:   make(chan struct{}),  		config: config,  	} @@ -340,16 +342,17 @@ write:  		t.mu.Unlock()  	} +	// Unblock reader. +	t.conn.Close() +  	// drain startKex channel. We don't service t.requestKex  	// because nobody does blocking sends there. -	go func() { -		for init := range t.startKex { -			init.done <- t.writeError -		} -	}() +	for request := range t.startKex { +		request.done <- t.getWriteError() +	} -	// Unblock reader. -	t.conn.Close() +	// Mark that the loop is done so that Close can return. +	close(t.kexLoopDone)  }  // The protocol uses uint32 for packet counters, so we can't let them @@ -545,7 +548,16 @@ func (t *handshakeTransport) writePacket(p []byte) error {  }  func (t *handshakeTransport) Close() error { -	return t.conn.Close() +	// Close the connection. This should cause the readLoop goroutine to wake up +	// and close t.startKex, which will shut down kexLoop if running. +	err := t.conn.Close() + +	// Wait for the kexLoop goroutine to complete. +	// At that point we know that the readLoop goroutine is complete too, +	// because kexLoop itself waits for readLoop to close the startKex channel. +	<-t.kexLoopDone + +	return err  }  func (t *handshakeTransport) enterKeyExchange(otherInitPacket []byte) error { @@ -615,7 +627,8 @@ func (t *handshakeTransport) enterKeyExchange(otherInitPacket []byte) error {  		return err  	} -	if t.sessionID == nil { +	firstKeyExchange := t.sessionID == nil +	if firstKeyExchange {  		t.sessionID = result.H  	}  	result.SessionID = t.sessionID @@ -626,6 +639,24 @@ func (t *handshakeTransport) enterKeyExchange(otherInitPacket []byte) error {  	if err = t.conn.writePacket([]byte{msgNewKeys}); err != nil {  		return err  	} + +	// On the server side, after the first SSH_MSG_NEWKEYS, send a SSH_MSG_EXT_INFO +	// message with the server-sig-algs extension if the client supports it. See +	// RFC 8308, Sections 2.4 and 3.1. +	if !isClient && firstKeyExchange && contains(clientInit.KexAlgos, "ext-info-c") { +		extInfo := &extInfoMsg{ +			NumExtensions: 1, +			Payload:       make([]byte, 0, 4+15+4+len(supportedPubKeyAuthAlgosList)), +		} +		extInfo.Payload = appendInt(extInfo.Payload, len("server-sig-algs")) +		extInfo.Payload = append(extInfo.Payload, "server-sig-algs"...) +		extInfo.Payload = appendInt(extInfo.Payload, len(supportedPubKeyAuthAlgosList)) +		extInfo.Payload = append(extInfo.Payload, supportedPubKeyAuthAlgosList...) +		if err := t.conn.writePacket(Marshal(extInfo)); err != nil { +			return err +		} +	} +  	if packet, err := t.conn.readPacket(); err != nil {  		return err  	} else if packet[0] != msgNewKeys { diff --git a/vendor/golang.org/x/crypto/ssh/keys.go b/vendor/golang.org/x/crypto/ssh/keys.go index 1c7de1a6d..729698041 100644 --- a/vendor/golang.org/x/crypto/ssh/keys.go +++ b/vendor/golang.org/x/crypto/ssh/keys.go @@ -184,7 +184,7 @@ func ParseKnownHosts(in []byte) (marker string, hosts []string, pubKey PublicKey  	return "", nil, nil, "", nil, io.EOF  } -// ParseAuthorizedKeys parses a public key from an authorized_keys +// ParseAuthorizedKey parses a public key from an authorized_keys  // file used in OpenSSH according to the sshd(8) manual page.  func ParseAuthorizedKey(in []byte) (out PublicKey, comment string, options []string, rest []byte, err error) {  	for len(in) > 0 { diff --git a/vendor/golang.org/x/crypto/ssh/messages.go b/vendor/golang.org/x/crypto/ssh/messages.go index 19bc67c46..922032d95 100644 --- a/vendor/golang.org/x/crypto/ssh/messages.go +++ b/vendor/golang.org/x/crypto/ssh/messages.go @@ -68,7 +68,7 @@ type kexInitMsg struct {  // See RFC 4253, section 8. -// Diffie-Helman +// Diffie-Hellman  const msgKexDHInit = 30  type kexDHInitMsg struct { diff --git a/vendor/golang.org/x/crypto/ssh/server.go b/vendor/golang.org/x/crypto/ssh/server.go index 70045bdfd..9e3870292 100644 --- a/vendor/golang.org/x/crypto/ssh/server.go +++ b/vendor/golang.org/x/crypto/ssh/server.go @@ -68,8 +68,16 @@ type ServerConfig struct {  	// NoClientAuth is true if clients are allowed to connect without  	// authenticating. +	// To determine NoClientAuth at runtime, set NoClientAuth to true +	// and the optional NoClientAuthCallback to a non-nil value.  	NoClientAuth bool +	// NoClientAuthCallback, if non-nil, is called when a user +	// attempts to authenticate with auth method "none". +	// NoClientAuth must also be set to true for this be used, or +	// this func is unused. +	NoClientAuthCallback func(ConnMetadata) (*Permissions, error) +  	// MaxAuthTries specifies the maximum number of authentication attempts  	// permitted per connection. If set to a negative number, the number of  	// attempts are unlimited. If set to zero, the number of attempts are limited @@ -283,15 +291,6 @@ func (s *connection) serverHandshake(config *ServerConfig) (*Permissions, error)  	return perms, err  } -func isAcceptableAlgo(algo string) bool { -	switch algo { -	case KeyAlgoRSA, KeyAlgoRSASHA256, KeyAlgoRSASHA512, KeyAlgoDSA, KeyAlgoECDSA256, KeyAlgoECDSA384, KeyAlgoECDSA521, KeyAlgoSKECDSA256, KeyAlgoED25519, KeyAlgoSKED25519, -		CertAlgoRSAv01, CertAlgoDSAv01, CertAlgoECDSA256v01, CertAlgoECDSA384v01, CertAlgoECDSA521v01, CertAlgoSKECDSA256v01, CertAlgoED25519v01, CertAlgoSKED25519v01: -		return true -	} -	return false -} -  func checkSourceAddress(addr net.Addr, sourceAddrs string) error {  	if addr == nil {  		return errors.New("ssh: no address known for client, but source-address match required") @@ -455,7 +454,11 @@ userAuthLoop:  		switch userAuthReq.Method {  		case "none":  			if config.NoClientAuth { -				authErr = nil +				if config.NoClientAuthCallback != nil { +					perms, authErr = config.NoClientAuthCallback(s) +				} else { +					authErr = nil +				}  			}  			// allow initial attempt of 'none' without penalty @@ -502,7 +505,7 @@ userAuthLoop:  				return nil, parseError(msgUserAuthRequest)  			}  			algo := string(algoBytes) -			if !isAcceptableAlgo(algo) { +			if !contains(supportedPubKeyAuthAlgos, underlyingAlgo(algo)) {  				authErr = fmt.Errorf("ssh: algorithm %q not accepted", algo)  				break  			} @@ -560,7 +563,7 @@ userAuthLoop:  				// algorithm name that corresponds to algo with  				// sig.Format.  This is usually the same, but  				// for certs, the names differ. -				if !isAcceptableAlgo(sig.Format) { +				if !contains(supportedPubKeyAuthAlgos, sig.Format) {  					authErr = fmt.Errorf("ssh: algorithm %q not accepted", sig.Format)  					break  				} diff --git a/vendor/golang.org/x/crypto/ssh/session.go b/vendor/golang.org/x/crypto/ssh/session.go index eca31a22d..acef62259 100644 --- a/vendor/golang.org/x/crypto/ssh/session.go +++ b/vendor/golang.org/x/crypto/ssh/session.go @@ -13,7 +13,6 @@ import (  	"errors"  	"fmt"  	"io" -	"io/ioutil"  	"sync"  ) @@ -124,7 +123,7 @@ type Session struct {  	// output and error.  	//  	// If either is nil, Run connects the corresponding file -	// descriptor to an instance of ioutil.Discard. There is a +	// descriptor to an instance of io.Discard. There is a  	// fixed amount of buffering that is shared for the two streams.  	// If either blocks it may eventually cause the remote  	// command to block. @@ -506,7 +505,7 @@ func (s *Session) stdout() {  		return  	}  	if s.Stdout == nil { -		s.Stdout = ioutil.Discard +		s.Stdout = io.Discard  	}  	s.copyFuncs = append(s.copyFuncs, func() error {  		_, err := io.Copy(s.Stdout, s.ch) @@ -519,7 +518,7 @@ func (s *Session) stderr() {  		return  	}  	if s.Stderr == nil { -		s.Stderr = ioutil.Discard +		s.Stderr = io.Discard  	}  	s.copyFuncs = append(s.copyFuncs, func() error {  		_, err := io.Copy(s.Stderr, s.ch.Stderr())  | 
