github.com/amitbet/vnc2video@v0.0.0-20190616012314-9d50b9dab1d9/security_vencryptplain.go (about)

     1  package vnc2video
     2  
     3  import (
     4  	"bytes"
     5  	"encoding/binary"
     6  	"fmt"
     7  )
     8  
     9  func (*ClientAuthVeNCrypt02Plain) Type() SecurityType {
    10  	return SecTypeVeNCrypt
    11  }
    12  
    13  func (*ClientAuthVeNCrypt02Plain) SubType() SecuritySubType {
    14  	return SecSubTypeVeNCrypt02Plain
    15  }
    16  
    17  // ClientAuthVeNCryptPlain see https://www.berrange.com/~dan/vencrypt.txt
    18  type ClientAuthVeNCrypt02Plain struct {
    19  	Username []byte
    20  	Password []byte
    21  }
    22  
    23  func (auth *ClientAuthVeNCrypt02Plain) Auth(c Conn) error {
    24  	if err := binary.Write(c, binary.BigEndian, []uint8{0, 2}); err != nil {
    25  		return err
    26  	}
    27  	if err := c.Flush(); err != nil {
    28  		return err
    29  	}
    30  	var (
    31  		major, minor uint8
    32  	)
    33  
    34  	if err := binary.Read(c, binary.BigEndian, &major); err != nil {
    35  		return err
    36  	}
    37  	if err := binary.Read(c, binary.BigEndian, &minor); err != nil {
    38  		return err
    39  	}
    40  	res := uint8(1)
    41  	if major == 0 && minor == 2 {
    42  		res = uint8(0)
    43  	}
    44  	if err := binary.Write(c, binary.BigEndian, res); err != nil {
    45  		return err
    46  	}
    47  	c.Flush()
    48  	if err := binary.Write(c, binary.BigEndian, uint8(1)); err != nil {
    49  		return err
    50  	}
    51  	if err := binary.Write(c, binary.BigEndian, auth.SubType()); err != nil {
    52  		return err
    53  	}
    54  	if err := c.Flush(); err != nil {
    55  		return err
    56  	}
    57  	var secType SecuritySubType
    58  	if err := binary.Read(c, binary.BigEndian, &secType); err != nil {
    59  		return err
    60  	}
    61  	if secType != auth.SubType() {
    62  		binary.Write(c, binary.BigEndian, uint8(1))
    63  		c.Flush()
    64  		return fmt.Errorf("invalid sectype")
    65  	}
    66  	if len(auth.Password) == 0 || len(auth.Username) == 0 {
    67  		return fmt.Errorf("Security Handshake failed; no username and/or password provided for VeNCryptAuth.")
    68  	}
    69  	/*
    70  		if err := binary.Write(c, binary.BigEndian, uint32(len(auth.Username))); err != nil {
    71  			return err
    72  		}
    73  
    74  		if err := binary.Write(c, binary.BigEndian, uint32(len(auth.Password))); err != nil {
    75  			return err
    76  		}
    77  
    78  		if err := binary.Write(c, binary.BigEndian, auth.Username); err != nil {
    79  			return err
    80  		}
    81  
    82  		if err := binary.Write(c, binary.BigEndian, auth.Password); err != nil {
    83  			return err
    84  		}
    85  	*/
    86  	var (
    87  		uLength, pLength uint32
    88  	)
    89  	if err := binary.Read(c, binary.BigEndian, &uLength); err != nil {
    90  		return err
    91  	}
    92  	if err := binary.Read(c, binary.BigEndian, &pLength); err != nil {
    93  		return err
    94  	}
    95  
    96  	username := make([]byte, uLength)
    97  	password := make([]byte, pLength)
    98  	if err := binary.Read(c, binary.BigEndian, &username); err != nil {
    99  		return err
   100  	}
   101  
   102  	if err := binary.Read(c, binary.BigEndian, &password); err != nil {
   103  		return err
   104  	}
   105  	if !bytes.Equal(auth.Username, username) || !bytes.Equal(auth.Password, password) {
   106  		return fmt.Errorf("invalid username/password")
   107  	}
   108  	return nil
   109  }