45 lines
890 B
Go
45 lines
890 B
Go
package mysqlserver
|
|
|
|
import (
|
|
"crypto/sha1"
|
|
"crypto/subtle"
|
|
)
|
|
|
|
func nativePasswordToken(password string, scramble []byte) []byte {
|
|
if password == "" {
|
|
return []byte{}
|
|
}
|
|
if len(scramble) > 20 {
|
|
scramble = scramble[:20]
|
|
}
|
|
hash1 := sha1.Sum([]byte(password))
|
|
hash2 := sha1.Sum(hash1[:])
|
|
h := sha1.New()
|
|
h.Write(scramble)
|
|
h.Write(hash2[:])
|
|
hash3 := h.Sum(nil)
|
|
out := make([]byte, 20)
|
|
for i := 0; i < 20; i++ {
|
|
out[i] = hash1[i] ^ hash3[i]
|
|
}
|
|
return out
|
|
}
|
|
|
|
func verifyNativePassword(password string, scramble, auth []byte) bool {
|
|
if password == "" {
|
|
return len(auth) == 0
|
|
}
|
|
want := nativePasswordToken(password, scramble)
|
|
if len(auth) != len(want) {
|
|
return false
|
|
}
|
|
return subtle.ConstantTimeCompare(auth, want) == 1
|
|
}
|
|
|
|
func usernamesEqual(a, b string) bool {
|
|
if len(a) != len(b) {
|
|
return false
|
|
}
|
|
return subtle.ConstantTimeCompare([]byte(a), []byte(b)) == 1
|
|
}
|