GPCM: Check payload major/minor version

This commit is contained in:
Palapeli 2025-12-29 18:08:24 -05:00
parent cf3a2edd3e
commit c824ed12a5
No known key found for this signature in database
GPG Key ID: 1FFE8F556A474925

View File

@ -25,6 +25,18 @@ const (
UnitCodeDSAndWii = 0xff
)
type MinimumPayloadVersion struct {
major byte
minor int
}
var MinimumPayloadVersions = []MinimumPayloadVersion{
{
major: 0,
minor: 1,
},
}
func generateResponse(gpcmChallenge, nasChallenge, authToken, clientChallenge string) string {
hasher := md5.New()
hasher.Write([]byte(nasChallenge))
@ -375,13 +387,31 @@ func (g *GameSpySession) exLogin(command common.GameSpyCommand) {
qr2.SetDeviceAuthenticated(g.User.ProfileId)
}
func checkPayloadVersion(payloadVer string) bool {
verInt, err := strconv.ParseInt(payloadVer, 0, 32)
if err != nil {
return false
}
major := byte(verInt>>24) & 255
minor := int(verInt>>12) & 4095
// beta := verInt & 4095
for _, v := range MinimumPayloadVersions {
if v.major == major && minor >= v.minor {
return true
}
}
return false
}
func (g *GameSpySession) verifyExLoginInfo(command common.GameSpyCommand, authToken string) (defaultKey bool, deviceId uint32) {
payloadVer, payloadVerExists := command.OtherValues["wl:ver"]
signature, signatureExists := command.OtherValues["wl:sig"]
defaultKey = false
deviceId = 0
if !payloadVerExists || payloadVer != "5" {
if !payloadVerExists || !checkPayloadVersion(payloadVer) {
g.replyError(GPError{
ErrorCode: ErrLogin.ErrorCode,
ErrorString: "The payload version is invalid.",