github.com/amitbet/vnc2video@v0.0.0-20190616012314-9d50b9dab1d9/security_aten.go (about) 1 package vnc2video 2 3 import ( 4 "bytes" 5 "encoding/binary" 6 "fmt" 7 ) 8 9 type ClientAuthATEN struct { 10 Username []byte 11 Password []byte 12 } 13 14 func (*ClientAuthATEN) Type() SecurityType { 15 return SecTypeATEN 16 } 17 18 func (*ClientAuthATEN) SubType() SecuritySubType { 19 return SecSubTypeUnknown 20 } 21 22 func charCodeAt(s string, n int) rune { 23 for i, r := range s { 24 if i == n { 25 return r 26 } 27 } 28 return 0 29 } 30 31 func (auth *ClientAuthATEN) Auth(c Conn) error { 32 var definedAuthLen = 24 33 34 if len(auth.Username) > definedAuthLen || len(auth.Password) > definedAuthLen { 35 return fmt.Errorf("username/password is too long, allowed 0-23") 36 } 37 38 nt, err := readTightTunnels(c) 39 if err != nil { 40 return err 41 } 42 /* 43 fmt.Printf("tunnels %d\n", nt) 44 for i := uint32(0); i < nt; i++ { 45 code, vendor, signature, err := readTightCaps(c) 46 if err != nil { 47 return err 48 } 49 fmt.Printf("code %d vendor %s signature %s\n", code, vendor, signature) 50 } 51 */ 52 if ((nt&0xffff0ff0)>>0 == 0xaff90fb0) || (nt <= 0 || nt > 0x1000000) { 53 c.SetProtoVersion("aten1") 54 var skip [20]byte 55 binary.Read(c, binary.BigEndian, &skip) 56 //fmt.Printf("skip %v\n", skip) 57 } 58 59 username := make([]byte, definedAuthLen) 60 password := make([]byte, definedAuthLen) 61 copy(username, auth.Username) 62 copy(password, auth.Password) 63 challenge := bytes.Join([][]byte{username, password}, []byte("")) 64 if err := binary.Write(c, binary.BigEndian, challenge); err != nil { 65 return err 66 } 67 68 if err := c.Flush(); err != nil { 69 return err 70 } 71 /* 72 73 sendUsername := make([]byte, definedAuthLen) 74 for i := 0; i < definedAuthLen; i++ { 75 if i < len(auth.Username) { 76 sendUsername[i] = byte(charCodeAt(string(auth.Username), i)) 77 } else { 78 sendUsername[i] = 0 79 } 80 } 81 82 sendPassword := make([]byte, definedAuthLen) 83 84 for i := 0; i < definedAuthLen; i++ { 85 if i < len(auth.Password) { 86 sendPassword[i] = byte(charCodeAt(string(auth.Password), i)) 87 } else { 88 sendPassword[i] = 0 89 } 90 } 91 92 if err := binary.Write(c, binary.BigEndian, sendUsername); err != nil { 93 return err 94 } 95 if err := binary.Write(c, binary.BigEndian, sendPassword); err != nil { 96 return err 97 } 98 99 if err := c.Flush(); err != nil { 100 return err 101 } 102 */ 103 //var pp [10]byte 104 //binary.Read(c, binary.BigEndian, &pp) 105 //fmt.Printf("ddd %v\n", pp) 106 return nil 107 }