1.19.3 Message signing support.

This commit is contained in:
BruceChen 2023-01-13 16:12:10 +08:00
parent e447fea16b
commit fe0b268878
13 changed files with 532 additions and 313 deletions

View file

@ -2,8 +2,9 @@
using System.Collections.Generic;
using System.Security.Cryptography;
using System.Text;
using ImageMagick;
using MinecraftClient.Protocol.Handlers;
using MinecraftClient.Protocol.Message;
using static MinecraftClient.Protocol.Message.LastSeenMessageList;
namespace MinecraftClient.Protocol.Keys
{
@ -111,6 +112,33 @@ namespace MinecraftClient.Protocol.Keys
return data.ToArray();
}
public static byte[] GetSignatureData_1_19_3(string message, Guid playerUuid, Guid chatUuid, int messageIndex, DateTimeOffset timestamp, ref byte[] salt, AcknowledgedMessage[] lastSeenMessages)
{
List<byte> data = new();
// net.minecraft.network.message.SignedMessage#update
data.AddRange(DataTypes.GetInt(1));
// message link
// net.minecraft.network.message.MessageLink#update
data.AddRange(DataTypes.GetUUID(playerUuid));
data.AddRange(DataTypes.GetUUID(chatUuid));
data.AddRange(DataTypes.GetInt(messageIndex));
// message body
// net.minecraft.network.message.MessageBody#update
data.AddRange(salt);
data.AddRange(DataTypes.GetLong(timestamp.ToUnixTimeSeconds()));
byte[] messageBytes = Encoding.UTF8.GetBytes(message);
data.AddRange(DataTypes.GetInt(messageBytes.Length));
data.AddRange(messageBytes);
data.AddRange(DataTypes.GetInt(lastSeenMessages.Length));
foreach (AcknowledgedMessage ack in lastSeenMessages)
data.AddRange(ack.signature);
return data.ToArray();
}
public static byte[] GetSignatureData(byte[]? precedingSignature, Guid sender, byte[] bodySign)
{
List<byte> data = new();

View file

@ -1,6 +1,7 @@
using System;
using System.Security.Cryptography;
using MinecraftClient.Protocol.Message;
using static MinecraftClient.Protocol.Message.LastSeenMessageList;
namespace MinecraftClient.Protocol.Keys
{
@ -43,7 +44,7 @@ namespace MinecraftClient.Protocol.Keys
}
/// <summary>
/// Sign message - 1.19.1 and above
/// Sign message - 1.19.1 and 1.19.2
/// </summary>
/// <param name="message">Message content</param>
/// <param name="uuid">Sender uuid</param>
@ -64,10 +65,21 @@ namespace MinecraftClient.Protocol.Keys
return msgSign;
}
public byte[] SignMessage(string message, DateTimeOffset timestamp, ref byte[] salt, int messageCount, Guid sender, Guid sessionUuid)
/// <summary>
/// Sign message - 1.19.3 and above
/// </summary>
/// <param name="message">Message content</param>
/// <param name="uuid">Sender uuid</param>
/// <param name="timestamp">Timestamp</param>
/// <param name="salt">Salt</param>
/// <param name="lastSeenMessages">LastSeenMessageList</param>
/// <returns>Signature data</returns>
public byte[] SignMessage(string message, Guid playerUuid, Guid chatUuid, int messageIndex, DateTimeOffset timestamp, ref byte[] salt, AcknowledgedMessage[] lastSeenMessages)
{
byte[] data = KeyUtils.GetSignatureData(message, timestamp, ref salt, messageCount, sender, sessionUuid);
return SignData(data);
byte[] bodySignData = KeyUtils.GetSignatureData_1_19_3(message, playerUuid, chatUuid, messageIndex, timestamp, ref salt, lastSeenMessages);
return SignData(bodySignData);
}
}
}