Files
mysql-tunnel/internal/mysqlserver/auth.go
T
2026-09-21 16:46:55 +08:00

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
}