@@ -154,44 +154,47 @@ func (d MySQLDriver) Open(dsn string) (driver.Conn, error) {
154
154
}
155
155
156
156
func handleAuthResult (mc * mysqlConn , oldCipher []byte , pluginName string ) error {
157
-
158
- // handle caching_sha2_password
159
- if pluginName == "caching_sha2_password" {
160
- auth , err := mc .readCachingSha2PasswordAuthResult ()
161
- if err != nil {
162
- return err
163
- }
164
-
165
- switch auth {
166
- case cachingSha2PasswordOK :
167
- return nil // auth successful
168
-
169
- case cachingSha2PasswordFastAuthSuccess :
170
- // continue to read result packet...
171
-
172
- case cachingSha2PasswordPerformFullAuthentication :
173
- if mc .cfg .tls != nil || mc .cfg .Net == "unix" {
174
- if err = mc .writeClearAuthPacket (); err != nil {
175
- return err
157
+ // Read Result Packet
158
+ cipher , err := mc .readResultOK ()
159
+ if err == nil {
160
+ // handle caching_sha2_password
161
+ // https://insidemysql.com/preparing-your-community-connector-for-mysql-8-part-2-sha256/
162
+ if pluginName == "caching_sha2_password" {
163
+ if len (cipher ) == 1 {
164
+ switch cipher [0 ] {
165
+ case cachingSha2PasswordFastAuthSuccess :
166
+ cipher , err = mc .readResultOK ()
167
+ if err == nil {
168
+ return nil // auth successful
169
+ }
170
+
171
+ case cachingSha2PasswordPerformFullAuthentication :
172
+ if mc .cfg .tls != nil || mc .cfg .Net == "unix" {
173
+ if err = mc .writeClearAuthPacket (); err != nil {
174
+ return err
175
+ }
176
+ } else {
177
+ if err = mc .writePublicKeyAuthPacket (oldCipher ); err != nil {
178
+ return err
179
+ }
180
+ }
181
+ cipher , err = mc .readResultOK ()
182
+ if err == nil {
183
+ return nil // auth successful
184
+ }
185
+
186
+ default :
187
+ return ErrMalformPkt
176
188
}
177
189
} else {
178
- if err = mc .writePublicKeyAuthPacket (oldCipher ); err != nil {
179
- return err
180
- }
190
+ return ErrMalformPkt
181
191
}
182
- // continue to read result packet...
183
192
184
- default :
185
- return ErrMalformPkt
193
+ } else {
194
+ return nil // auth successful
186
195
}
187
196
}
188
197
189
- // Read Result Packet
190
- cipher , err := mc .readResultOK ()
191
- if err == nil {
192
- return nil // auth successful
193
- }
194
-
195
198
if mc .cfg == nil {
196
199
return err // auth failed and retry not possible
197
200
}
0 commit comments