Skip to content

Commit 2931af5

Browse files
authored
Added wrappers for MessageSignature (#2362)
1 parent 08ea2da commit 2931af5

File tree

6 files changed

+98
-33
lines changed

6 files changed

+98
-33
lines changed

src/main/java/com/comphenix/protocol/events/AbstractStructure.java

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1017,7 +1017,7 @@ public StructureModifier<Either<byte[], WrappedSaltedSignature>> getLoginSignatu
10171017
}
10181018

10191019
/**
1020-
* @return read/writer structure direct access to signature data like chat messages
1020+
* @return read/writer structure direct access to salted signature data like chat messages
10211021
*/
10221022
public StructureModifier<WrappedSaltedSignature> getSignatures() {
10231023
return structureModifier.withType(
@@ -1026,6 +1026,16 @@ public StructureModifier<WrappedSaltedSignature> getSignatures() {
10261026
);
10271027
}
10281028

1029+
/**
1030+
* @return read/writer structure direct access to unsalted signature data for example in chat message (since 1.19.3)
1031+
*/
1032+
public StructureModifier<WrappedMessageSignature> getMessageSignatures() {
1033+
return structureModifier.withType(
1034+
MinecraftReflection.getMessageSignatureClass(),
1035+
BukkitConverters.getWrappedMessageSignatureConverter()
1036+
);
1037+
}
1038+
10291039
/**
10301040
* @param leftConverter converter for left values
10311041
* @param rightConverter converter for right values

src/main/java/com/comphenix/protocol/utility/MinecraftReflection.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1573,6 +1573,10 @@ public static Class<?> getProfilePublicKeyClass() {
15731573
return getMinecraftClass("world.entity.player.ProfilePublicKey");
15741574
}
15751575

1576+
public static Class<?> getMessageSignatureClass() {
1577+
return getMinecraftClass("network.chat.MessageSignature");
1578+
}
1579+
15761580
public static Class<?> getSaltedSignatureClass() {
15771581
try {
15781582
return getMinecraftClass("SaltedSignature");

src/main/java/com/comphenix/protocol/wrappers/BukkitConverters.java

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -615,6 +615,13 @@ public static EquivalentConverter<WrappedSaltedSignature> getWrappedSignatureCon
615615
return ignoreNull(handle(WrappedSaltedSignature::getHandle, WrappedSaltedSignature::new, WrappedSaltedSignature.class));
616616
}
617617

618+
/**
619+
* @return converter for an encoded cryptographic message signature
620+
*/
621+
public static EquivalentConverter<WrappedMessageSignature> getWrappedMessageSignatureConverter() {
622+
return ignoreNull(handle(WrappedMessageSignature::getHandle, WrappedMessageSignature::new, WrappedMessageSignature.class));
623+
}
624+
618625
public static EquivalentConverter<WrappedLevelChunkData.ChunkData> getWrappedChunkDataConverter() {
619626
return ignoreNull(handle(WrappedLevelChunkData.ChunkData::getHandle, WrappedLevelChunkData.ChunkData::new, WrappedLevelChunkData.ChunkData.class));
620627
}
Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,48 @@
1+
package com.comphenix.protocol.wrappers;
2+
3+
import com.comphenix.protocol.reflect.StructureModifier;
4+
import com.comphenix.protocol.reflect.accessors.Accessors;
5+
import com.comphenix.protocol.reflect.accessors.ConstructorAccessor;
6+
import com.comphenix.protocol.utility.MinecraftReflection;
7+
8+
/**
9+
* @author Lukas Alt
10+
* @since 24.04.2023
11+
*/
12+
public class WrappedMessageSignature extends AbstractWrapper {
13+
private final static Class<?> HANDLE_TYPE = MinecraftReflection.getMessageSignatureClass();
14+
private static ConstructorAccessor CONSTRUCTOR;
15+
private StructureModifier<Object> modifier;
16+
17+
/**
18+
* Construct a new NMS wrapper.
19+
*
20+
* @param handle - the NMS handle
21+
*/
22+
public WrappedMessageSignature(Object handle) {
23+
super(HANDLE_TYPE);
24+
this.setHandle(handle);
25+
}
26+
27+
public WrappedMessageSignature(byte[] bytes) {
28+
super(HANDLE_TYPE);
29+
if(CONSTRUCTOR == null) {
30+
CONSTRUCTOR = Accessors.getConstructorAccessor(HANDLE_TYPE, byte[].class);
31+
}
32+
this.setHandle(CONSTRUCTOR.invoke(bytes));
33+
}
34+
35+
@Override
36+
protected void setHandle(Object handle) {
37+
super.setHandle(handle);
38+
this.modifier = new StructureModifier<>(HANDLE_TYPE).withTarget(handle);
39+
}
40+
41+
public byte[] getBytes() {
42+
return modifier.<byte[]>withType(byte[].class).read(0);
43+
}
44+
45+
public void setBytes(byte[] bytes) {
46+
modifier.<byte[]>withType(byte[].class).write(0, bytes);
47+
}
48+
}

src/test/java/com/comphenix/protocol/events/PacketContainerTest.java

Lines changed: 6 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -774,21 +774,17 @@ public void testPlayerInfoActions() {
774774
Assertions.assertEquals(NativeGameMode.CREATIVE, firstData.getGameMode());
775775
}
776776

777-
// TODO: fix this this at some point
778-
/*
779777
@Test
780778
public void testSignedChatMessage() {
781779
PacketContainer chatPacket = new PacketContainer(PacketType.Play.Client.CHAT);
782780

783-
byte[] signature = new byte[512];
784-
long salt = 124L;
785-
WrappedSaltedSignature wrappedSignature = new WrappedSaltedSignature(salt, signature);
786-
chatPacket.getSignatures().write(0, wrappedSignature);
781+
byte[] signature = new byte[256];
782+
WrappedMessageSignature wrappedSignature = new WrappedMessageSignature(signature);
783+
chatPacket.getMessageSignatures().write(0, wrappedSignature);
787784

788-
WrappedSaltedSignature read = chatPacket.getSignatures().read(0);
789-
assertEquals(salt, read.getSalt());
790-
assertArrayEquals(signature, read.getSignature());
791-
}*/
785+
WrappedMessageSignature read = chatPacket.getMessageSignatures().read(0);
786+
assertArrayEquals(signature, read.getBytes());
787+
}
792788

793789
private void assertPacketsEqualAndSerializable(PacketContainer constructed, PacketContainer cloned) {
794790
StructureModifier<Object> firstMod = constructed.getModifier(), secondMod = cloned.getModifier();

src/test/java/com/comphenix/protocol/wrappers/BukkitConvertersTest.java

Lines changed: 22 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -16,18 +16,9 @@
1616
import org.junit.jupiter.api.BeforeAll;
1717
import org.junit.jupiter.api.Test;
1818

19-
import java.security.KeyFactory;
20-
import java.security.KeyPair;
21-
import java.security.KeyPairGenerator;
22-
import java.security.PublicKey;
23-
import java.security.spec.EncodedKeySpec;
24-
import java.security.spec.X509EncodedKeySpec;
25-
import java.time.Instant;
2619
import java.util.Random;
27-
import java.util.UUID;
2820

29-
import static org.junit.jupiter.api.Assertions.assertEquals;
30-
import static org.junit.jupiter.api.Assertions.assertTrue;
21+
import static org.junit.jupiter.api.Assertions.*;
3122

3223
public class BukkitConvertersTest {
3324

@@ -69,18 +60,27 @@ public void testEither() {
6960
assertEquals(wrapped.right(), nmsEither.right());
7061
}
7162

72-
@Test
73-
public void testPacketContainerConverter() {
74-
for (PacketType type : PacketType.values()) {
75-
if (!type.isSupported()) {
76-
continue;
77-
}
78-
PacketContainer container = new PacketContainer(type);
79-
Object generic = BukkitConverters.getPacketContainerConverter().getGeneric(container);
80-
Object specific = BukkitConverters.getPacketContainerConverter().getSpecific(generic);
81-
assertTrue(EqualsBuilder.reflectionEquals(container, specific)); // PacketContainer does not properly implement equals(.)
82-
}
83-
}
63+
@Test
64+
public void testPacketContainerConverter() {
65+
for (PacketType type : PacketType.values()) {
66+
if(!type.isSupported()) {
67+
continue;
68+
}
69+
PacketContainer container = new PacketContainer(type);
70+
Object generic = BukkitConverters.getPacketContainerConverter().getGeneric(container);
71+
Object specific = BukkitConverters.getPacketContainerConverter().getSpecific(generic);
72+
assertTrue(EqualsBuilder.reflectionEquals(container, specific)); // PacketContainer does not properly implement equals(.)
73+
}
74+
}
75+
76+
@Test
77+
void getWrappedMessageSignatureConverter() {
78+
byte[] data = new byte[256];
79+
new Random().nextBytes(data);
80+
WrappedMessageSignature messageSignature = new WrappedMessageSignature(data);
81+
82+
assertArrayEquals(data, BukkitConverters.getWrappedMessageSignatureConverter().getSpecific(BukkitConverters.getWrappedMessageSignatureConverter().getGeneric(messageSignature)).getBytes());
83+
}
8484

8585
@Test
8686
public void testRemoteChatSessionDataConverter() throws Exception {

0 commit comments

Comments
 (0)