in vncclient/client.go [416:458]
func (c *ClientConn) securityHandshakeVersion3() error {
var err error
// Respond with the version we will support
if _, err = c.c.Write([]byte("RFB 003.003\n")); err != nil {
return err
}
// 7.1.2 Security Handshake from server
var securityType uint32
if err = binary.Read(c.c, binary.BigEndian, &securityType); err != nil {
return err
}
clientSecurityTypes := c.config.Auth
if clientSecurityTypes == nil {
clientSecurityTypes = []ClientAuth{new(ClientAuthNone)}
}
var auth ClientAuth
FindAuth:
for _, curAuth := range clientSecurityTypes {
if curAuth.SecurityType() == uint8(securityType) {
// We use the first matching supported authentication
auth = curAuth
break FindAuth
}
}
if auth == nil {
if securityType == 0 {
return errors.Errorf("server returned an invalid security type: %#v. That means it likely rejected our connection.", securityType)
} else {
return errors.Errorf("did not support server-requested auth scheme: %#v", securityType)
}
}
if err = auth.Handshake(c.c); err != nil {
return err
}
return nil
}