func()

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
}