diff --git a/bukkit/src/main/java/com/github/games647/fastlogin/bukkit/listener/protocollib/ProtocolLibListener.java b/bukkit/src/main/java/com/github/games647/fastlogin/bukkit/listener/protocollib/ProtocolLibListener.java index 85645720..122f5027 100644 --- a/bukkit/src/main/java/com/github/games647/fastlogin/bukkit/listener/protocollib/ProtocolLibListener.java +++ b/bukkit/src/main/java/com/github/games647/fastlogin/bukkit/listener/protocollib/ProtocolLibListener.java @@ -179,7 +179,8 @@ public class ProtocolLibListener extends PacketAdapter { private boolean verifyNonce(Player sender, PacketContainer packet, ClientPublicKey clientPublicKey, byte[] expectedToken) { try { - if (MinecraftVersion.atOrAbove(new MinecraftVersion(1, 19, 0))) { + if (MinecraftVersion.atOrAbove(new MinecraftVersion(1, 19, 0)) + && !MinecraftVersion.atOrAbove(new MinecraftVersion(1, 19, 3))) { Either either = packet.getSpecificModifier(Either.class).read(0); if (clientPublicKey == null) { Optional left = either.left(); @@ -222,27 +223,34 @@ public class ProtocolLibListener extends PacketAdapter { plugin.removeSession(player.getAddress()); PacketContainer packet = packetEvent.getPacket(); - val profileKey = packet.getOptionals(BukkitConverters.getWrappedPublicKeyDataConverter()) - .optionRead(0); + Optional clientKey = Optional.empty(); + if (MinecraftVersion.atOrAbove(new MinecraftVersion(1, 19, 3))) { + // public key sent separate + clientKey = Optional.empty(); + } else { + val profileKey = packet.getOptionals(BukkitConverters.getWrappedPublicKeyDataConverter()) + .optionRead(0); - val clientKey = profileKey.flatMap(Function.identity()).flatMap(data -> { - Instant expires = data.getExpireTime(); - PublicKey key = data.getKey(); - byte[] signature = data.getSignature(); - return Optional.of(ClientPublicKey.of(expires, key, signature)); - }); + clientKey = profileKey.flatMap(Function.identity()).flatMap(data -> { + Instant expires = data.getExpireTime(); + PublicKey key = data.getKey(); + byte[] signature = data.getSignature(); + return Optional.of(ClientPublicKey.of(expires, key, signature)); + }); - // start reading from index 1, because 0 is already used by the public key - Optional sessionUUID = packet.getOptionals(Converters.passthrough(UUID.class)).readSafely(1); - if (verifyClientKeys && sessionUUID.isPresent() && clientKey.isPresent() - && verifyPublicKey(clientKey.get(), sessionUUID.get())) { - // missing or incorrect - // expired always not allowed - player.kickPlayer(plugin.getCore().getMessage("invalid-public-key")); - plugin.getLog().warn("Invalid public key from player {}", username); - return; + // start reading from index 1, because 0 is already used by the public key + Optional sessionUUID = packet.getOptionals(Converters.passthrough(UUID.class)).readSafely(1); + if (verifyClientKeys && sessionUUID.isPresent() && clientKey.isPresent() + && verifyPublicKey(clientKey.get(), sessionUUID.get())) { + // missing or incorrect + // expired always not allowed + player.kickPlayer(plugin.getCore().getMessage("invalid-public-key")); + plugin.getLog().warn("Invalid public key from player {}", username); + return; + } } + plugin.getLog().trace("GameProfile {} with {} connecting", sessionKey, username); packetEvent.getAsyncMarker().incrementProcessingDelay();