From 34277e3fbd1e0d555d2f6c040151d373c140c4ed Mon Sep 17 00:00:00 2001 From: BruceChen Date: Mon, 12 Sep 2022 19:02:08 +0800 Subject: [PATCH] Fix a bug in message signature --- MinecraftClient/Protocol/Handlers/Protocol18.cs | 2 +- MinecraftClient/Protocol/PlayerInfo.cs | 15 ++++++++++++++- 2 files changed, 15 insertions(+), 2 deletions(-) diff --git a/MinecraftClient/Protocol/Handlers/Protocol18.cs b/MinecraftClient/Protocol/Handlers/Protocol18.cs index 3f7b233c..aa22af19 100644 --- a/MinecraftClient/Protocol/Handlers/Protocol18.cs +++ b/MinecraftClient/Protocol/Handlers/Protocol18.cs @@ -595,7 +595,7 @@ namespace MinecraftClient.Protocol.Handlers bool lastVerifyResult = player.IsMessageChainLegal(); verifyResult = player.VerifyMessageHead(ref precedingSignature, ref headerSignature, ref bodyDigest); if (lastVerifyResult && !verifyResult) - log.Warn("Player " + player.Name + "'s message chain is broken!"); + log.Warn(Translations.Get("chat.message_chain_broken", player.Name)); } } } diff --git a/MinecraftClient/Protocol/PlayerInfo.cs b/MinecraftClient/Protocol/PlayerInfo.cs index b16376ce..3d6f0a40 100644 --- a/MinecraftClient/Protocol/PlayerInfo.cs +++ b/MinecraftClient/Protocol/PlayerInfo.cs @@ -46,6 +46,7 @@ namespace MinecraftClient.Protocol Gamemode = gamemode; Ping = ping; DisplayName = displayName; + lastMessageVerified = false; if (timeStamp != null && publicKey != null && signature != null) { DateTimeOffset dateTimeOffset = DateTimeOffset.FromUnixTimeMilliseconds((long)timeStamp); @@ -53,13 +54,13 @@ namespace MinecraftClient.Protocol try { PublicKey = new PublicKey(publicKey, signature); + lastMessageVerified = true; } catch (System.Security.Cryptography.CryptographicException) { PublicKey = null; } } - lastMessageVerified = true; precedingSignature = null; } @@ -121,9 +122,15 @@ namespace MinecraftClient.Protocol if (this.lastMessageVerified == false) return false; if (PublicKey == null || IsKeyExpired() || (this.precedingSignature != null && precedingSignature == null)) + { + this.lastMessageVerified = false; return false; + } if (this.precedingSignature != null && !this.precedingSignature.SequenceEqual(precedingSignature!)) + { + this.lastMessageVerified = false; return false; + } DateTimeOffset timeOffset = DateTimeOffset.FromUnixTimeMilliseconds(timestamp); @@ -150,9 +157,15 @@ namespace MinecraftClient.Protocol if (this.lastMessageVerified == false) return false; if (PublicKey == null || IsKeyExpired() || (this.precedingSignature != null && precedingSignature == null)) + { + this.lastMessageVerified = false; return false; + } if (this.precedingSignature != null && !this.precedingSignature.SequenceEqual(precedingSignature!)) + { + this.lastMessageVerified = false; return false; + } bool res = PublicKey.VerifyHeader(Uuid, ref bodyDigest, ref headerSignature, ref precedingSignature);