This commit is contained in:
BruceChen 2023-01-14 02:41:03 +08:00
parent 0ce9690778
commit 052060b23c
4 changed files with 44 additions and 21 deletions

View file

@ -670,11 +670,12 @@ namespace MinecraftClient.Protocol.Handlers
} }
} }
// Todo: verify message
bool verifyResult; bool verifyResult;
if (!isOnlineMode) if (!isOnlineMode || messageSignature == null)
verifyResult = false; verifyResult = false;
else if (senderUUID == handler.GetUserUuid()) else
{
if (senderUUID == handler.GetUserUuid())
verifyResult = true; verifyResult = true;
else else
{ {
@ -684,15 +685,13 @@ namespace MinecraftClient.Protocol.Handlers
else else
{ {
verifyResult = false; verifyResult = false;
//bool lastVerifyResult = player.IsMessageChainLegal(); verifyResult = player.VerifyMessage(message, senderUUID, player.ChatUuid, index, timestamp, salt, ref messageSignature, previousMessageSignatures);
//verifyResult = player.VerifyMessage(message, timestamp, salt, ref headerSignature, ref precedingSignature, lastSeenMessages); }
//if (lastVerifyResult && !verifyResult)
// log.Warn(string.Format(Translations.chat_message_chain_broken, senderDisplayName));
} }
} }
ChatMessage chat = new(message, false, chatTypeId, senderUUID, unsignedChatContent, senderDisplayName, senderTeamName, timestamp, messageSignature, verifyResult); ChatMessage chat = new(message, false, chatTypeId, senderUUID, unsignedChatContent, senderDisplayName, senderTeamName, timestamp, messageSignature, verifyResult);
if (isOnlineMode && !chat.LacksSender() && messageSignature != null) if (isOnlineMode && !chat.LacksSender() && verifyResult)
Acknowledge(chat); Acknowledge(chat);
handler.OnTextReceived(chat); handler.OnTextReceived(chat);
} }
@ -727,9 +726,8 @@ namespace MinecraftClient.Protocol.Handlers
int messageType_ = dataTypes.ReadNextVarInt(packetData); int messageType_ = dataTypes.ReadNextVarInt(packetData);
string messageName = dataTypes.ReadNextString(packetData); string messageName = dataTypes.ReadNextString(packetData);
string? targetName_ = dataTypes.ReadNextBool(packetData) ? dataTypes.ReadNextString(packetData) : null; string? targetName_ = dataTypes.ReadNextBool(packetData) ? dataTypes.ReadNextString(packetData) : null;
ChatMessage profilelessChat = new(message_, messageName, true, messageType_, Guid.Empty, true); ChatMessage profilelessChat = new(message_, targetName_ ?? messageName, true, messageType_, Guid.Empty, true);
profilelessChat.isSenderJson = true; profilelessChat.isSenderJson = true;
profilelessChat.teamName = targetName_;
handler.OnTextReceived(profilelessChat); handler.OnTextReceived(profilelessChat);
break; break;
case PacketTypesIn.CombatEvent: case PacketTypesIn.CombatEvent:

View file

@ -31,7 +31,7 @@ namespace MinecraftClient.Protocol.Message
public bool? isSignatureLegal; public bool? isSignatureLegal;
public ChatMessage(string content, bool isJson, int chatType, Guid senderUUID, string? unsignedContent, string displayName, string? teamName, long timestamp, byte[] signature, bool isSignatureLegal) public ChatMessage(string content, bool isJson, int chatType, Guid senderUUID, string? unsignedContent, string displayName, string? teamName, long timestamp, byte[]? signature, bool isSignatureLegal)
{ {
isSignedChat = true; isSignedChat = true;
isSystemChat = false; isSystemChat = false;

View file

@ -1,5 +1,9 @@
using System; using System;
using System.Collections.Generic;
using System.Data.SqlTypes;
using System.Linq; using System.Linq;
using System.Text;
using MinecraftClient.Protocol.Handlers;
using MinecraftClient.Protocol.Keys; using MinecraftClient.Protocol.Keys;
using MinecraftClient.Protocol.Message; using MinecraftClient.Protocol.Message;
@ -28,6 +32,8 @@ namespace MinecraftClient.Protocol
// For message signature // For message signature
public int MessageIndex = -1;
public Guid ChatUuid = Guid.Empty; public Guid ChatUuid = Guid.Empty;
private PublicKey? PublicKey; private PublicKey? PublicKey;
@ -131,7 +137,7 @@ namespace MinecraftClient.Protocol
} }
/// <summary> /// <summary>
/// Verify message - 1.19.1 and above /// Verify message - 1.19.1 and 1.19.2
/// </summary> /// </summary>
/// <param name="message">Message content</param> /// <param name="message">Message content</param>
/// <param name="timestamp">Timestamp</param> /// <param name="timestamp">Timestamp</param>
@ -169,7 +175,7 @@ namespace MinecraftClient.Protocol
} }
/// <summary> /// <summary>
/// Verify message head - 1.19.1 and above /// Verify message head - 1.19.1 and 1.19.2
/// </summary> /// </summary>
/// <param name="precedingSignature">Preceding message signature</param> /// <param name="precedingSignature">Preceding message signature</param>
/// <param name="headerSignature">Message signature</param> /// <param name="headerSignature">Message signature</param>
@ -197,5 +203,24 @@ namespace MinecraftClient.Protocol
return res; return res;
} }
/// <summary>
/// Verify message - 1.19.3 and above
/// </summary>
/// <param name="message">Message content</param>
/// <param name="timestamp">Timestamp</param>
/// <param name="salt">Salt</param>
/// <param name="signature">Message signature</param>
/// <param name="precedingSignature">Preceding message signature</param>
/// <param name="lastSeenMessages">LastSeenMessages</param>
/// <returns>Is this message chain vaild</returns>
public bool VerifyMessage(string message, Guid playerUuid, Guid chatUuid, int messageIndex, long timestamp, long salt, ref byte[] signature, Tuple<int, byte[]?>[] previousMessageSignatures)
{
if (PublicKey == null || IsKeyExpired())
return false;
// net.minecraft.server.network.ServerPlayNetworkHandler#validateMessage
return true;
}
} }
} }

View file

@ -58,7 +58,7 @@ namespace MinecraftClient.Protocol.Keys
} }
/// <summary> /// <summary>
/// Verify message - 1.19.1 and above /// Verify message - 1.19.1 and 1.19.2
/// </summary> /// </summary>
/// <param name="message">Message content</param> /// <param name="message">Message content</param>
/// <param name="uuid">Sender uuid</param> /// <param name="uuid">Sender uuid</param>
@ -79,7 +79,7 @@ namespace MinecraftClient.Protocol.Keys
} }
/// <summary> /// <summary>
/// Verify message head - 1.19.1 and above /// Verify message head - 1.19.1 and 1.19.2
/// </summary> /// </summary>
/// <param name="bodyDigest">Message body hash</param> /// <param name="bodyDigest">Message body hash</param>
/// <param name="signature">Message signature</param> /// <param name="signature">Message signature</param>