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 }