58 lines
1.7 KiB
Go
58 lines
1.7 KiB
Go
package server
|
|
|
|
// see: https://dev.mysql.com/doc/dev/mysql-server/latest/page_protocol_connection_phase_packets_protocol_handshake_v10.html
|
|
func (c *Conn) writeInitialHandshake() error {
|
|
data := make([]byte, 4)
|
|
|
|
//min version 10
|
|
data = append(data, 10)
|
|
|
|
//server version[00]
|
|
data = append(data, c.serverConf.serverVersion...)
|
|
data = append(data, 0x00)
|
|
|
|
//connection id
|
|
data = append(data, byte(c.connectionID), byte(c.connectionID>>8), byte(c.connectionID>>16), byte(c.connectionID>>24))
|
|
|
|
//auth-plugin-data-part-1
|
|
data = append(data, c.salt[0:8]...)
|
|
|
|
//filter 0x00 byte, terminating the first part of a scramble
|
|
data = append(data, 0x00)
|
|
|
|
defaultFlag := c.serverConf.capability
|
|
//capability flag lower 2 bytes, using default capability here
|
|
data = append(data, byte(defaultFlag), byte(defaultFlag>>8))
|
|
|
|
//charset
|
|
data = append(data, c.serverConf.collationId)
|
|
|
|
//status
|
|
data = append(data, byte(c.status), byte(c.status>>8))
|
|
|
|
//capability flag upper 2 bytes, using default capability here
|
|
data = append(data, byte(defaultFlag>>16), byte(defaultFlag>>24))
|
|
|
|
// server supports CLIENT_PLUGIN_AUTH and CLIENT_SECURE_CONNECTION
|
|
data = append(data, byte(8+12+1))
|
|
|
|
//reserved 10 [00]
|
|
data = append(data, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0)
|
|
|
|
//auth-plugin-data-part-2
|
|
data = append(data, c.salt[8:]...)
|
|
// second part of the password cipher [mininum 13 bytes],
|
|
// where len=MAX(13, length of auth-plugin-data - 8)
|
|
// add \NUL to terminate the string
|
|
data = append(data, 0x00)
|
|
|
|
// auth plugin name
|
|
data = append(data, c.serverConf.defaultAuthMethod...)
|
|
|
|
// EOF if MySQL version (>= 5.5.7 and < 5.5.10) or (>= 5.6.0 and < 5.6.2)
|
|
// \NUL otherwise, so we use \NUL
|
|
data = append(data, 0)
|
|
|
|
return c.WritePacket(data)
|
|
}
|