From 34e63b7eae890d1f729d6f3b9a444c6361a442ec Mon Sep 17 00:00:00 2001 From: games647 Date: Fri, 24 Jun 2022 16:46:46 +0200 Subject: [PATCH] Make profile key optional --- .../listener/protocollib/EncryptionUtil.java | 2 +- .../listener/protocollib/NameCheckTask.java | 5 +++-- .../listener/protocollib/ProtocolLibListener.java | 15 ++++++--------- .../protocollib/ProtocolLibLoginSource.java | 4 ++-- .../protocollib/packet/ClientPublicKey.java | 3 +++ 5 files changed, 15 insertions(+), 14 deletions(-) diff --git a/bukkit/src/main/java/com/github/games647/fastlogin/bukkit/listener/protocollib/EncryptionUtil.java b/bukkit/src/main/java/com/github/games647/fastlogin/bukkit/listener/protocollib/EncryptionUtil.java index 8a0b9dca..179cc45f 100644 --- a/bukkit/src/main/java/com/github/games647/fastlogin/bukkit/listener/protocollib/EncryptionUtil.java +++ b/bukkit/src/main/java/com/github/games647/fastlogin/bukkit/listener/protocollib/EncryptionUtil.java @@ -148,7 +148,7 @@ class EncryptionUtil { public static boolean verifyClientKey(ClientPublicKey clientKey, Instant verifyTimstamp) throws NoSuchAlgorithmException, InvalidKeyException, SignatureException { - if (!verifyTimstamp.isBefore(clientKey.expiry())) { + if (clientKey.isExpired(verifyTimstamp)) { return false; } diff --git a/bukkit/src/main/java/com/github/games647/fastlogin/bukkit/listener/protocollib/NameCheckTask.java b/bukkit/src/main/java/com/github/games647/fastlogin/bukkit/listener/protocollib/NameCheckTask.java index d3b38eae..e58aed61 100644 --- a/bukkit/src/main/java/com/github/games647/fastlogin/bukkit/listener/protocollib/NameCheckTask.java +++ b/bukkit/src/main/java/com/github/games647/fastlogin/bukkit/listener/protocollib/NameCheckTask.java @@ -71,9 +71,10 @@ public class NameCheckTask extends JoinManagement clientKey = packetEvent.getPacket().getOptionals(BukkitConverters.getWrappedPublicKeyDataConverter()).read(0); + Optional clientKey = packetEvent.getPacket() + .getOptionals(BukkitConverters.getWrappedPublicKeyDataConverter()).read(0); - super.onLogin(username, new ProtocolLibLoginSource(player, random, clientKey.get(), serverKey)); + super.onLogin(username, new ProtocolLibLoginSource(player, random, serverKey, clientKey.orElse(null))); } finally { ProtocolLibrary.getProtocolManager().getAsynchronousManager().signalPacketTransmission(packetEvent); } 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 10377b04..ea50a75f 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 @@ -31,8 +31,8 @@ import com.comphenix.protocol.events.PacketAdapter; import com.comphenix.protocol.events.PacketContainer; import com.comphenix.protocol.events.PacketEvent; import com.comphenix.protocol.reflect.FuzzyReflection; +import com.comphenix.protocol.wrappers.BukkitConverters; import com.comphenix.protocol.wrappers.WrappedGameProfile; -import com.comphenix.protocol.wrappers.WrappedProfilePublicKey; import com.comphenix.protocol.wrappers.WrappedProfilePublicKey.WrappedProfileKeyData; import com.github.games647.fastlogin.bukkit.BukkitLoginSession; import com.github.games647.fastlogin.bukkit.FastLoginBukkit; @@ -173,7 +173,10 @@ public class ProtocolLibListener extends PacketAdapter { username = (String) packetEvent.getPacket().getMeta("original_name").get(); } - if (!verifyPublicKey(packet)) { + PacketContainer packet = packetEvent.getPacket(); + WrappedProfileKeyData profileKey = packet.getOptionals(BukkitConverters.getWrappedPublicKeyDataConverter()) + .read(0).orElse(null); + if (profileKey != null && !verifyPublicKey(profileKey)) { plugin.getLog().warn("Invalid public key from player {}", username); return; } @@ -185,13 +188,7 @@ public class ProtocolLibListener extends PacketAdapter { plugin.getScheduler().runAsync(nameCheckTask); } - private boolean verifyPublicKey(PacketContainer packet) { - WrappedProfileKeyData profileKey = packet.getProfilePublicKeys().optionRead(0) - .map(WrappedProfilePublicKey::getKeyData).orElse(null); - if (profileKey == null) { - return true; - } - + private boolean verifyPublicKey(WrappedProfileKeyData profileKey) { Instant expires = profileKey.getExpireTime(); PublicKey key = profileKey.getKey(); byte[] signature = profileKey.getSignature(); diff --git a/bukkit/src/main/java/com/github/games647/fastlogin/bukkit/listener/protocollib/ProtocolLibLoginSource.java b/bukkit/src/main/java/com/github/games647/fastlogin/bukkit/listener/protocollib/ProtocolLibLoginSource.java index d4c1130c..55701e40 100644 --- a/bukkit/src/main/java/com/github/games647/fastlogin/bukkit/listener/protocollib/ProtocolLibLoginSource.java +++ b/bukkit/src/main/java/com/github/games647/fastlogin/bukkit/listener/protocollib/ProtocolLibLoginSource.java @@ -55,11 +55,11 @@ class ProtocolLibLoginSource implements LoginSource { private final String serverId = ""; private byte[] verifyToken; - public ProtocolLibLoginSource(Player player, Random random, WrappedProfileKeyData clientPublicKey, PublicKey serverPublicKey) { + public ProtocolLibLoginSource(Player player, Random random, PublicKey serverPublicKey, WrappedProfileKeyData clientPublicKey) { this.player = player; this.random = random; - this.clientPublicKey = clientPublicKey; this.publicKey = serverPublicKey; + this.clientPublicKey = clientPublicKey; } @Override diff --git a/bukkit/src/main/java/com/github/games647/fastlogin/bukkit/listener/protocollib/packet/ClientPublicKey.java b/bukkit/src/main/java/com/github/games647/fastlogin/bukkit/listener/protocollib/packet/ClientPublicKey.java index 24c4733f..510d77d1 100644 --- a/bukkit/src/main/java/com/github/games647/fastlogin/bukkit/listener/protocollib/packet/ClientPublicKey.java +++ b/bukkit/src/main/java/com/github/games647/fastlogin/bukkit/listener/protocollib/packet/ClientPublicKey.java @@ -30,4 +30,7 @@ import java.time.Instant; public record ClientPublicKey(Instant expiry, PublicKey key, byte[] signature) { + public boolean isExpired(Instant verifyTimestamp) { + return verifyTimestamp.isBefore(expiry); + } }