Fix a bug in message signature

This commit is contained in:
BruceChen 2022-09-12 19:02:08 +08:00
parent bf3acb9cad
commit 34277e3fbd
2 changed files with 15 additions and 2 deletions

View file

@ -595,7 +595,7 @@ namespace MinecraftClient.Protocol.Handlers
bool lastVerifyResult = player.IsMessageChainLegal(); bool lastVerifyResult = player.IsMessageChainLegal();
verifyResult = player.VerifyMessageHead(ref precedingSignature, ref headerSignature, ref bodyDigest); verifyResult = player.VerifyMessageHead(ref precedingSignature, ref headerSignature, ref bodyDigest);
if (lastVerifyResult && !verifyResult) if (lastVerifyResult && !verifyResult)
log.Warn("Player " + player.Name + "'s message chain is broken!"); log.Warn(Translations.Get("chat.message_chain_broken", player.Name));
} }
} }
} }

View file

@ -46,6 +46,7 @@ namespace MinecraftClient.Protocol
Gamemode = gamemode; Gamemode = gamemode;
Ping = ping; Ping = ping;
DisplayName = displayName; DisplayName = displayName;
lastMessageVerified = false;
if (timeStamp != null && publicKey != null && signature != null) if (timeStamp != null && publicKey != null && signature != null)
{ {
DateTimeOffset dateTimeOffset = DateTimeOffset.FromUnixTimeMilliseconds((long)timeStamp); DateTimeOffset dateTimeOffset = DateTimeOffset.FromUnixTimeMilliseconds((long)timeStamp);
@ -53,13 +54,13 @@ namespace MinecraftClient.Protocol
try try
{ {
PublicKey = new PublicKey(publicKey, signature); PublicKey = new PublicKey(publicKey, signature);
lastMessageVerified = true;
} }
catch (System.Security.Cryptography.CryptographicException) catch (System.Security.Cryptography.CryptographicException)
{ {
PublicKey = null; PublicKey = null;
} }
} }
lastMessageVerified = true;
precedingSignature = null; precedingSignature = null;
} }
@ -121,9 +122,15 @@ namespace MinecraftClient.Protocol
if (this.lastMessageVerified == false) if (this.lastMessageVerified == false)
return false; return false;
if (PublicKey == null || IsKeyExpired() || (this.precedingSignature != null && precedingSignature == null)) if (PublicKey == null || IsKeyExpired() || (this.precedingSignature != null && precedingSignature == null))
{
this.lastMessageVerified = false;
return false; return false;
}
if (this.precedingSignature != null && !this.precedingSignature.SequenceEqual(precedingSignature!)) if (this.precedingSignature != null && !this.precedingSignature.SequenceEqual(precedingSignature!))
{
this.lastMessageVerified = false;
return false; return false;
}
DateTimeOffset timeOffset = DateTimeOffset.FromUnixTimeMilliseconds(timestamp); DateTimeOffset timeOffset = DateTimeOffset.FromUnixTimeMilliseconds(timestamp);
@ -150,9 +157,15 @@ namespace MinecraftClient.Protocol
if (this.lastMessageVerified == false) if (this.lastMessageVerified == false)
return false; return false;
if (PublicKey == null || IsKeyExpired() || (this.precedingSignature != null && precedingSignature == null)) if (PublicKey == null || IsKeyExpired() || (this.precedingSignature != null && precedingSignature == null))
{
this.lastMessageVerified = false;
return false; return false;
}
if (this.precedingSignature != null && !this.precedingSignature.SequenceEqual(precedingSignature!)) if (this.precedingSignature != null && !this.precedingSignature.SequenceEqual(precedingSignature!))
{
this.lastMessageVerified = false;
return false; return false;
}
bool res = PublicKey.VerifyHeader(Uuid, ref bodyDigest, ref headerSignature, ref precedingSignature); bool res = PublicKey.VerifyHeader(Uuid, ref bodyDigest, ref headerSignature, ref precedingSignature);