diff options
Diffstat (limited to 'vendor/golang.org/x/crypto')
| -rw-r--r-- | vendor/golang.org/x/crypto/sha3/hashes.go | 34 | ||||
| -rw-r--r-- | vendor/golang.org/x/crypto/sha3/hashes_generic.go | 27 | ||||
| -rw-r--r-- | vendor/golang.org/x/crypto/sha3/hashes_noasm.go | 23 | ||||
| -rw-r--r-- | vendor/golang.org/x/crypto/sha3/sha3.go | 62 | ||||
| -rw-r--r-- | vendor/golang.org/x/crypto/sha3/sha3_s390x.go | 48 | ||||
| -rw-r--r-- | vendor/golang.org/x/crypto/sha3/shake.go | 16 | ||||
| -rw-r--r-- | vendor/golang.org/x/crypto/sha3/shake_generic.go | 19 | ||||
| -rw-r--r-- | vendor/golang.org/x/crypto/sha3/shake_noasm.go | 15 | ||||
| -rw-r--r-- | vendor/golang.org/x/crypto/sha3/xor.go | 45 | ||||
| -rw-r--r-- | vendor/golang.org/x/crypto/sha3/xor_generic.go | 28 | ||||
| -rw-r--r-- | vendor/golang.org/x/crypto/sha3/xor_unaligned.go | 66 | ||||
| -rw-r--r-- | vendor/golang.org/x/crypto/ssh/keys.go | 8 | ||||
| -rw-r--r-- | vendor/golang.org/x/crypto/ssh/server.go | 30 | 
13 files changed, 184 insertions, 237 deletions
| diff --git a/vendor/golang.org/x/crypto/sha3/hashes.go b/vendor/golang.org/x/crypto/sha3/hashes.go index 0d8043fd2..5eae6cb92 100644 --- a/vendor/golang.org/x/crypto/sha3/hashes.go +++ b/vendor/golang.org/x/crypto/sha3/hashes.go @@ -16,39 +16,43 @@ import (  // Its generic security strength is 224 bits against preimage attacks,  // and 112 bits against collision attacks.  func New224() hash.Hash { -	if h := new224Asm(); h != nil { -		return h -	} -	return &state{rate: 144, outputLen: 28, dsbyte: 0x06} +	return new224()  }  // New256 creates a new SHA3-256 hash.  // Its generic security strength is 256 bits against preimage attacks,  // and 128 bits against collision attacks.  func New256() hash.Hash { -	if h := new256Asm(); h != nil { -		return h -	} -	return &state{rate: 136, outputLen: 32, dsbyte: 0x06} +	return new256()  }  // New384 creates a new SHA3-384 hash.  // Its generic security strength is 384 bits against preimage attacks,  // and 192 bits against collision attacks.  func New384() hash.Hash { -	if h := new384Asm(); h != nil { -		return h -	} -	return &state{rate: 104, outputLen: 48, dsbyte: 0x06} +	return new384()  }  // New512 creates a new SHA3-512 hash.  // Its generic security strength is 512 bits against preimage attacks,  // and 256 bits against collision attacks.  func New512() hash.Hash { -	if h := new512Asm(); h != nil { -		return h -	} +	return new512() +} + +func new224Generic() *state { +	return &state{rate: 144, outputLen: 28, dsbyte: 0x06} +} + +func new256Generic() *state { +	return &state{rate: 136, outputLen: 32, dsbyte: 0x06} +} + +func new384Generic() *state { +	return &state{rate: 104, outputLen: 48, dsbyte: 0x06} +} + +func new512Generic() *state {  	return &state{rate: 72, outputLen: 64, dsbyte: 0x06}  } diff --git a/vendor/golang.org/x/crypto/sha3/hashes_generic.go b/vendor/golang.org/x/crypto/sha3/hashes_generic.go deleted file mode 100644 index fe8c84793..000000000 --- a/vendor/golang.org/x/crypto/sha3/hashes_generic.go +++ /dev/null @@ -1,27 +0,0 @@ -// Copyright 2017 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -//go:build !gc || purego || !s390x - -package sha3 - -import ( -	"hash" -) - -// new224Asm returns an assembly implementation of SHA3-224 if available, -// otherwise it returns nil. -func new224Asm() hash.Hash { return nil } - -// new256Asm returns an assembly implementation of SHA3-256 if available, -// otherwise it returns nil. -func new256Asm() hash.Hash { return nil } - -// new384Asm returns an assembly implementation of SHA3-384 if available, -// otherwise it returns nil. -func new384Asm() hash.Hash { return nil } - -// new512Asm returns an assembly implementation of SHA3-512 if available, -// otherwise it returns nil. -func new512Asm() hash.Hash { return nil } diff --git a/vendor/golang.org/x/crypto/sha3/hashes_noasm.go b/vendor/golang.org/x/crypto/sha3/hashes_noasm.go new file mode 100644 index 000000000..9d85fb621 --- /dev/null +++ b/vendor/golang.org/x/crypto/sha3/hashes_noasm.go @@ -0,0 +1,23 @@ +// Copyright 2023 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +//go:build !gc || purego || !s390x + +package sha3 + +func new224() *state { +	return new224Generic() +} + +func new256() *state { +	return new256Generic() +} + +func new384() *state { +	return new384Generic() +} + +func new512() *state { +	return new512Generic() +} diff --git a/vendor/golang.org/x/crypto/sha3/sha3.go b/vendor/golang.org/x/crypto/sha3/sha3.go index 4884d172a..afedde5ab 100644 --- a/vendor/golang.org/x/crypto/sha3/sha3.go +++ b/vendor/golang.org/x/crypto/sha3/sha3.go @@ -23,7 +23,6 @@ const (  type state struct {  	// Generic sponge components.  	a    [25]uint64 // main state of the hash -	buf  []byte     // points into storage  	rate int        // the number of bytes of state to use  	// dsbyte contains the "domain separation" bits and the first bit of @@ -40,7 +39,8 @@ type state struct {  	//      Extendable-Output Functions (May 2014)"  	dsbyte byte -	storage storageBuf +	i, n    int // storage[i:n] is the buffer, i is only used while squeezing +	storage [maxRate]byte  	// Specific to SHA-3 and SHAKE.  	outputLen int             // the default output size in bytes @@ -54,24 +54,18 @@ func (d *state) BlockSize() int { return d.rate }  func (d *state) Size() int { return d.outputLen }  // Reset clears the internal state by zeroing the sponge state and -// the byte buffer, and setting Sponge.state to absorbing. +// the buffer indexes, and setting Sponge.state to absorbing.  func (d *state) Reset() {  	// Zero the permutation's state.  	for i := range d.a {  		d.a[i] = 0  	}  	d.state = spongeAbsorbing -	d.buf = d.storage.asBytes()[:0] +	d.i, d.n = 0, 0  }  func (d *state) clone() *state {  	ret := *d -	if ret.state == spongeAbsorbing { -		ret.buf = ret.storage.asBytes()[:len(ret.buf)] -	} else { -		ret.buf = ret.storage.asBytes()[d.rate-cap(d.buf) : d.rate] -	} -  	return &ret  } @@ -82,43 +76,40 @@ func (d *state) permute() {  	case spongeAbsorbing:  		// If we're absorbing, we need to xor the input into the state  		// before applying the permutation. -		xorIn(d, d.buf) -		d.buf = d.storage.asBytes()[:0] +		xorIn(d, d.storage[:d.rate]) +		d.n = 0  		keccakF1600(&d.a)  	case spongeSqueezing:  		// If we're squeezing, we need to apply the permutation before  		// copying more output.  		keccakF1600(&d.a) -		d.buf = d.storage.asBytes()[:d.rate] -		copyOut(d, d.buf) +		d.i = 0 +		copyOut(d, d.storage[:d.rate])  	}  }  // pads appends the domain separation bits in dsbyte, applies  // the multi-bitrate 10..1 padding rule, and permutes the state. -func (d *state) padAndPermute(dsbyte byte) { -	if d.buf == nil { -		d.buf = d.storage.asBytes()[:0] -	} +func (d *state) padAndPermute() {  	// Pad with this instance's domain-separator bits. We know that there's  	// at least one byte of space in d.buf because, if it were full,  	// permute would have been called to empty it. dsbyte also contains the  	// first one bit for the padding. See the comment in the state struct. -	d.buf = append(d.buf, dsbyte) -	zerosStart := len(d.buf) -	d.buf = d.storage.asBytes()[:d.rate] -	for i := zerosStart; i < d.rate; i++ { -		d.buf[i] = 0 +	d.storage[d.n] = d.dsbyte +	d.n++ +	for d.n < d.rate { +		d.storage[d.n] = 0 +		d.n++  	}  	// This adds the final one bit for the padding. Because of the way that  	// bits are numbered from the LSB upwards, the final bit is the MSB of  	// the last byte. -	d.buf[d.rate-1] ^= 0x80 +	d.storage[d.rate-1] ^= 0x80  	// Apply the permutation  	d.permute()  	d.state = spongeSqueezing -	d.buf = d.storage.asBytes()[:d.rate] -	copyOut(d, d.buf) +	d.n = d.rate +	copyOut(d, d.storage[:d.rate])  }  // Write absorbs more data into the hash's state. It panics if any @@ -127,28 +118,25 @@ func (d *state) Write(p []byte) (written int, err error) {  	if d.state != spongeAbsorbing {  		panic("sha3: Write after Read")  	} -	if d.buf == nil { -		d.buf = d.storage.asBytes()[:0] -	}  	written = len(p)  	for len(p) > 0 { -		if len(d.buf) == 0 && len(p) >= d.rate { +		if d.n == 0 && len(p) >= d.rate {  			// The fast path; absorb a full "rate" bytes of input and apply the permutation.  			xorIn(d, p[:d.rate])  			p = p[d.rate:]  			keccakF1600(&d.a)  		} else {  			// The slow path; buffer the input until we can fill the sponge, and then xor it in. -			todo := d.rate - len(d.buf) +			todo := d.rate - d.n  			if todo > len(p) {  				todo = len(p)  			} -			d.buf = append(d.buf, p[:todo]...) +			d.n += copy(d.storage[d.n:], p[:todo])  			p = p[todo:]  			// If the sponge is full, apply the permutation. -			if len(d.buf) == d.rate { +			if d.n == d.rate {  				d.permute()  			}  		} @@ -161,19 +149,19 @@ func (d *state) Write(p []byte) (written int, err error) {  func (d *state) Read(out []byte) (n int, err error) {  	// If we're still absorbing, pad and apply the permutation.  	if d.state == spongeAbsorbing { -		d.padAndPermute(d.dsbyte) +		d.padAndPermute()  	}  	n = len(out)  	// Now, do the squeezing.  	for len(out) > 0 { -		n := copy(out, d.buf) -		d.buf = d.buf[n:] +		n := copy(out, d.storage[d.i:d.n]) +		d.i += n  		out = out[n:]  		// Apply the permutation if we've squeezed the sponge dry. -		if len(d.buf) == 0 { +		if d.i == d.rate {  			d.permute()  		}  	} diff --git a/vendor/golang.org/x/crypto/sha3/sha3_s390x.go b/vendor/golang.org/x/crypto/sha3/sha3_s390x.go index b4fbbf869..00d8034ae 100644 --- a/vendor/golang.org/x/crypto/sha3/sha3_s390x.go +++ b/vendor/golang.org/x/crypto/sha3/sha3_s390x.go @@ -248,56 +248,56 @@ func (s *asmState) Clone() ShakeHash {  	return s.clone()  } -// new224Asm returns an assembly implementation of SHA3-224 if available, -// otherwise it returns nil. -func new224Asm() hash.Hash { +// new224 returns an assembly implementation of SHA3-224 if available, +// otherwise it returns a generic implementation. +func new224() hash.Hash {  	if cpu.S390X.HasSHA3 {  		return newAsmState(sha3_224)  	} -	return nil +	return new224Generic()  } -// new256Asm returns an assembly implementation of SHA3-256 if available, -// otherwise it returns nil. -func new256Asm() hash.Hash { +// new256 returns an assembly implementation of SHA3-256 if available, +// otherwise it returns a generic implementation. +func new256() hash.Hash {  	if cpu.S390X.HasSHA3 {  		return newAsmState(sha3_256)  	} -	return nil +	return new256Generic()  } -// new384Asm returns an assembly implementation of SHA3-384 if available, -// otherwise it returns nil. -func new384Asm() hash.Hash { +// new384 returns an assembly implementation of SHA3-384 if available, +// otherwise it returns a generic implementation. +func new384() hash.Hash {  	if cpu.S390X.HasSHA3 {  		return newAsmState(sha3_384)  	} -	return nil +	return new384Generic()  } -// new512Asm returns an assembly implementation of SHA3-512 if available, -// otherwise it returns nil. -func new512Asm() hash.Hash { +// new512 returns an assembly implementation of SHA3-512 if available, +// otherwise it returns a generic implementation. +func new512() hash.Hash {  	if cpu.S390X.HasSHA3 {  		return newAsmState(sha3_512)  	} -	return nil +	return new512Generic()  } -// newShake128Asm returns an assembly implementation of SHAKE-128 if available, -// otherwise it returns nil. -func newShake128Asm() ShakeHash { +// newShake128 returns an assembly implementation of SHAKE-128 if available, +// otherwise it returns a generic implementation. +func newShake128() ShakeHash {  	if cpu.S390X.HasSHA3 {  		return newAsmState(shake_128)  	} -	return nil +	return newShake128Generic()  } -// newShake256Asm returns an assembly implementation of SHAKE-256 if available, -// otherwise it returns nil. -func newShake256Asm() ShakeHash { +// newShake256 returns an assembly implementation of SHAKE-256 if available, +// otherwise it returns a generic implementation. +func newShake256() ShakeHash {  	if cpu.S390X.HasSHA3 {  		return newAsmState(shake_256)  	} -	return nil +	return newShake256Generic()  } diff --git a/vendor/golang.org/x/crypto/sha3/shake.go b/vendor/golang.org/x/crypto/sha3/shake.go index bb6998402..1ea9275b8 100644 --- a/vendor/golang.org/x/crypto/sha3/shake.go +++ b/vendor/golang.org/x/crypto/sha3/shake.go @@ -115,19 +115,21 @@ func (c *state) Clone() ShakeHash {  // Its generic security strength is 128 bits against all attacks if at  // least 32 bytes of its output are used.  func NewShake128() ShakeHash { -	if h := newShake128Asm(); h != nil { -		return h -	} -	return &state{rate: rate128, outputLen: 32, dsbyte: dsbyteShake} +	return newShake128()  }  // NewShake256 creates a new SHAKE256 variable-output-length ShakeHash.  // Its generic security strength is 256 bits against all attacks if  // at least 64 bytes of its output are used.  func NewShake256() ShakeHash { -	if h := newShake256Asm(); h != nil { -		return h -	} +	return newShake256() +} + +func newShake128Generic() *state { +	return &state{rate: rate128, outputLen: 32, dsbyte: dsbyteShake} +} + +func newShake256Generic() *state {  	return &state{rate: rate256, outputLen: 64, dsbyte: dsbyteShake}  } diff --git a/vendor/golang.org/x/crypto/sha3/shake_generic.go b/vendor/golang.org/x/crypto/sha3/shake_generic.go deleted file mode 100644 index 8d31cf5be..000000000 --- a/vendor/golang.org/x/crypto/sha3/shake_generic.go +++ /dev/null @@ -1,19 +0,0 @@ -// Copyright 2017 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -//go:build !gc || purego || !s390x - -package sha3 - -// newShake128Asm returns an assembly implementation of SHAKE-128 if available, -// otherwise it returns nil. -func newShake128Asm() ShakeHash { -	return nil -} - -// newShake256Asm returns an assembly implementation of SHAKE-256 if available, -// otherwise it returns nil. -func newShake256Asm() ShakeHash { -	return nil -} diff --git a/vendor/golang.org/x/crypto/sha3/shake_noasm.go b/vendor/golang.org/x/crypto/sha3/shake_noasm.go new file mode 100644 index 000000000..4276ba4ab --- /dev/null +++ b/vendor/golang.org/x/crypto/sha3/shake_noasm.go @@ -0,0 +1,15 @@ +// Copyright 2023 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +//go:build !gc || purego || !s390x + +package sha3 + +func newShake128() *state { +	return newShake128Generic() +} + +func newShake256() *state { +	return newShake256Generic() +} diff --git a/vendor/golang.org/x/crypto/sha3/xor.go b/vendor/golang.org/x/crypto/sha3/xor.go index 7337cca88..6ada5c957 100644 --- a/vendor/golang.org/x/crypto/sha3/xor.go +++ b/vendor/golang.org/x/crypto/sha3/xor.go @@ -2,22 +2,39 @@  // Use of this source code is governed by a BSD-style  // license that can be found in the LICENSE file. -//go:build (!amd64 && !386 && !ppc64le) || purego -  package sha3 -// A storageBuf is an aligned array of maxRate bytes. -type storageBuf [maxRate]byte - -func (b *storageBuf) asBytes() *[maxRate]byte { -	return (*[maxRate]byte)(b) -} +import ( +	"crypto/subtle" +	"encoding/binary" +	"unsafe" -var ( -	xorIn            = xorInGeneric -	copyOut          = copyOutGeneric -	xorInUnaligned   = xorInGeneric -	copyOutUnaligned = copyOutGeneric +	"golang.org/x/sys/cpu"  ) -const xorImplementationUnaligned = "generic" +// xorIn xors the bytes in buf into the state. +func xorIn(d *state, buf []byte) { +	if cpu.IsBigEndian { +		for i := 0; len(buf) >= 8; i++ { +			a := binary.LittleEndian.Uint64(buf) +			d.a[i] ^= a +			buf = buf[8:] +		} +	} else { +		ab := (*[25 * 64 / 8]byte)(unsafe.Pointer(&d.a)) +		subtle.XORBytes(ab[:], ab[:], buf) +	} +} + +// copyOut copies uint64s to a byte buffer. +func copyOut(d *state, b []byte) { +	if cpu.IsBigEndian { +		for i := 0; len(b) >= 8; i++ { +			binary.LittleEndian.PutUint64(b, d.a[i]) +			b = b[8:] +		} +	} else { +		ab := (*[25 * 64 / 8]byte)(unsafe.Pointer(&d.a)) +		copy(b, ab[:]) +	} +} diff --git a/vendor/golang.org/x/crypto/sha3/xor_generic.go b/vendor/golang.org/x/crypto/sha3/xor_generic.go deleted file mode 100644 index 8d9477112..000000000 --- a/vendor/golang.org/x/crypto/sha3/xor_generic.go +++ /dev/null @@ -1,28 +0,0 @@ -// Copyright 2015 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package sha3 - -import "encoding/binary" - -// xorInGeneric xors the bytes in buf into the state; it -// makes no non-portable assumptions about memory layout -// or alignment. -func xorInGeneric(d *state, buf []byte) { -	n := len(buf) / 8 - -	for i := 0; i < n; i++ { -		a := binary.LittleEndian.Uint64(buf) -		d.a[i] ^= a -		buf = buf[8:] -	} -} - -// copyOutGeneric copies uint64s to a byte buffer. -func copyOutGeneric(d *state, b []byte) { -	for i := 0; len(b) >= 8; i++ { -		binary.LittleEndian.PutUint64(b, d.a[i]) -		b = b[8:] -	} -} diff --git a/vendor/golang.org/x/crypto/sha3/xor_unaligned.go b/vendor/golang.org/x/crypto/sha3/xor_unaligned.go deleted file mode 100644 index 870e2d16e..000000000 --- a/vendor/golang.org/x/crypto/sha3/xor_unaligned.go +++ /dev/null @@ -1,66 +0,0 @@ -// Copyright 2015 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -//go:build (amd64 || 386 || ppc64le) && !purego - -package sha3 - -import "unsafe" - -// A storageBuf is an aligned array of maxRate bytes. -type storageBuf [maxRate / 8]uint64 - -func (b *storageBuf) asBytes() *[maxRate]byte { -	return (*[maxRate]byte)(unsafe.Pointer(b)) -} - -// xorInUnaligned uses unaligned reads and writes to update d.a to contain d.a -// XOR buf. -func xorInUnaligned(d *state, buf []byte) { -	n := len(buf) -	bw := (*[maxRate / 8]uint64)(unsafe.Pointer(&buf[0]))[: n/8 : n/8] -	if n >= 72 { -		d.a[0] ^= bw[0] -		d.a[1] ^= bw[1] -		d.a[2] ^= bw[2] -		d.a[3] ^= bw[3] -		d.a[4] ^= bw[4] -		d.a[5] ^= bw[5] -		d.a[6] ^= bw[6] -		d.a[7] ^= bw[7] -		d.a[8] ^= bw[8] -	} -	if n >= 104 { -		d.a[9] ^= bw[9] -		d.a[10] ^= bw[10] -		d.a[11] ^= bw[11] -		d.a[12] ^= bw[12] -	} -	if n >= 136 { -		d.a[13] ^= bw[13] -		d.a[14] ^= bw[14] -		d.a[15] ^= bw[15] -		d.a[16] ^= bw[16] -	} -	if n >= 144 { -		d.a[17] ^= bw[17] -	} -	if n >= 168 { -		d.a[18] ^= bw[18] -		d.a[19] ^= bw[19] -		d.a[20] ^= bw[20] -	} -} - -func copyOutUnaligned(d *state, buf []byte) { -	ab := (*[maxRate]uint8)(unsafe.Pointer(&d.a[0])) -	copy(buf, ab[:]) -} - -var ( -	xorIn   = xorInUnaligned -	copyOut = copyOutUnaligned -) - -const xorImplementationUnaligned = "unaligned" diff --git a/vendor/golang.org/x/crypto/ssh/keys.go b/vendor/golang.org/x/crypto/ssh/keys.go index df4ebdada..7967665f1 100644 --- a/vendor/golang.org/x/crypto/ssh/keys.go +++ b/vendor/golang.org/x/crypto/ssh/keys.go @@ -904,6 +904,10 @@ func (k *skECDSAPublicKey) Verify(data []byte, sig *Signature) error {  	return errors.New("ssh: signature did not verify")  } +func (k *skECDSAPublicKey) CryptoPublicKey() crypto.PublicKey { +	return &k.PublicKey +} +  type skEd25519PublicKey struct {  	// application is a URL-like string, typically "ssh:" for SSH.  	// see openssh/PROTOCOL.u2f for details. @@ -1000,6 +1004,10 @@ func (k *skEd25519PublicKey) Verify(data []byte, sig *Signature) error {  	return nil  } +func (k *skEd25519PublicKey) CryptoPublicKey() crypto.PublicKey { +	return k.PublicKey +} +  // NewSignerFromKey takes an *rsa.PrivateKey, *dsa.PrivateKey,  // *ecdsa.PrivateKey or any other crypto.Signer and returns a  // corresponding Signer instance. ECDSA keys must use P-256, P-384 or diff --git a/vendor/golang.org/x/crypto/ssh/server.go b/vendor/golang.org/x/crypto/ssh/server.go index e2ae4f891..3ca9e89e2 100644 --- a/vendor/golang.org/x/crypto/ssh/server.go +++ b/vendor/golang.org/x/crypto/ssh/server.go @@ -462,6 +462,24 @@ func (p *PartialSuccessError) Error() string {  // It is returned in ServerAuthError.Errors from NewServerConn.  var ErrNoAuth = errors.New("ssh: no auth passed yet") +// BannerError is an error that can be returned by authentication handlers in +// ServerConfig to send a banner message to the client. +type BannerError struct { +	Err     error +	Message string +} + +func (b *BannerError) Unwrap() error { +	return b.Err +} + +func (b *BannerError) Error() string { +	if b.Err == nil { +		return b.Message +	} +	return b.Err.Error() +} +  func (s *connection) serverAuthenticate(config *ServerConfig) (*Permissions, error) {  	sessionID := s.transport.getSessionID()  	var cache pubKeyCache @@ -734,6 +752,18 @@ userAuthLoop:  			config.AuthLogCallback(s, userAuthReq.Method, authErr)  		} +		var bannerErr *BannerError +		if errors.As(authErr, &bannerErr) { +			if bannerErr.Message != "" { +				bannerMsg := &userAuthBannerMsg{ +					Message: bannerErr.Message, +				} +				if err := s.transport.writePacket(Marshal(bannerMsg)); err != nil { +					return nil, err +				} +			} +		} +  		if authErr == nil {  			break userAuthLoop  		} | 
