diff options
author | Jake Potrebic <[email protected]> | 2024-06-13 08:45:43 -0700 |
---|---|---|
committer | Jake Potrebic <[email protected]> | 2024-06-13 08:45:43 -0700 |
commit | 7fbb8278e70c1904e09f2144f0e3897468a4906f (patch) | |
tree | 29b32894108673952ea75c6ea4e476e015756e5d /patches/server/1006-Use-Velocity-compression-and-cipher-natives.patch | |
parent | 79e2cb620ef03539390d97940824b38b707918f5 (diff) | |
download | Paper-7fbb8278e70c1904e09f2144f0e3897468a4906f.tar.gz Paper-7fbb8278e70c1904e09f2144f0e3897468a4906f.zip |
Finish API patches
Diffstat (limited to 'patches/server/1006-Use-Velocity-compression-and-cipher-natives.patch')
-rw-r--r-- | patches/server/1006-Use-Velocity-compression-and-cipher-natives.patch | 375 |
1 files changed, 0 insertions, 375 deletions
diff --git a/patches/server/1006-Use-Velocity-compression-and-cipher-natives.patch b/patches/server/1006-Use-Velocity-compression-and-cipher-natives.patch deleted file mode 100644 index c83372d4cd..0000000000 --- a/patches/server/1006-Use-Velocity-compression-and-cipher-natives.patch +++ /dev/null @@ -1,375 +0,0 @@ -From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 -From: Andrew Steinborn <[email protected]> -Date: Mon, 26 Jul 2021 02:15:17 -0400 -Subject: [PATCH] Use Velocity compression and cipher natives - - -diff --git a/build.gradle.kts b/build.gradle.kts -index 48b8db6d5fdf9b2f7155b9356418178f5594ddcb..4998aff0b7cb084dcda15c6a18bbe45e99b6000a 100644 ---- a/build.gradle.kts -+++ b/build.gradle.kts -@@ -37,6 +37,11 @@ dependencies { - runtimeOnly("org.xerial:sqlite-jdbc:3.45.3.0") - runtimeOnly("com.mysql:mysql-connector-j:8.3.0") - runtimeOnly("com.lmax:disruptor:3.4.4") // Paper -+ // Paper start - Use Velocity cipher -+ implementation("com.velocitypowered:velocity-native:3.1.2-SNAPSHOT") { -+ isTransitive = false -+ } -+ // Paper end - Use Velocity cipher - - runtimeOnly("org.apache.maven:maven-resolver-provider:3.9.6") - runtimeOnly("org.apache.maven.resolver:maven-resolver-connector-basic:1.9.18") -diff --git a/src/main/java/net/minecraft/network/CipherDecoder.java b/src/main/java/net/minecraft/network/CipherDecoder.java -index 778beb445eac5769b9e4e07b4d1294c50ae2602b..7b895b6a626da6297f07582e96d98ecfb6c8c951 100644 ---- a/src/main/java/net/minecraft/network/CipherDecoder.java -+++ b/src/main/java/net/minecraft/network/CipherDecoder.java -@@ -7,13 +7,29 @@ import java.util.List; - import javax.crypto.Cipher; - - public class CipherDecoder extends MessageToMessageDecoder<ByteBuf> { -- private final CipherBase cipher; -+ private final com.velocitypowered.natives.encryption.VelocityCipher cipher; // Paper - Use Velocity cipher - -- public CipherDecoder(Cipher cipher) { -- this.cipher = new CipherBase(cipher); -+ public CipherDecoder(com.velocitypowered.natives.encryption.VelocityCipher cipher) { // Paper - Use Velocity cipher -+ this.cipher = cipher; // Paper - Use Velocity cipher - } - - protected void decode(ChannelHandlerContext channelHandlerContext, ByteBuf byteBuf, List<Object> list) throws Exception { -- list.add(this.cipher.decipher(channelHandlerContext, byteBuf)); -+ // Paper start - Use Velocity cipher -+ ByteBuf compatible = com.velocitypowered.natives.util.MoreByteBufUtils.ensureCompatible(channelHandlerContext.alloc(), cipher, byteBuf); -+ try { -+ cipher.process(compatible); -+ list.add(compatible); -+ } catch (Exception e) { -+ compatible.release(); // compatible will never be used if we throw an exception -+ throw e; -+ } -+ // Paper end - Use Velocity cipher - } -+ -+ // Paper start - Use Velocity cipher -+ @Override -+ public void handlerRemoved(ChannelHandlerContext ctx) throws Exception { -+ cipher.close(); -+ } -+ // Paper end - Use Velocity cipher - } -diff --git a/src/main/java/net/minecraft/network/CipherEncoder.java b/src/main/java/net/minecraft/network/CipherEncoder.java -index 0f3d502a9680006bcdcd7d272240a2e5c3b46790..ffa1c48585fbbc1d30826d435043527f6183a3ee 100644 ---- a/src/main/java/net/minecraft/network/CipherEncoder.java -+++ b/src/main/java/net/minecraft/network/CipherEncoder.java -@@ -4,15 +4,32 @@ import io.netty.buffer.ByteBuf; - import io.netty.channel.ChannelHandlerContext; - import io.netty.handler.codec.MessageToByteEncoder; - import javax.crypto.Cipher; -+import java.util.List; - --public class CipherEncoder extends MessageToByteEncoder<ByteBuf> { -- private final CipherBase cipher; -+public class CipherEncoder extends io.netty.handler.codec.MessageToMessageEncoder<ByteBuf> { // Paper - Use Velocity cipher; change superclass -+ private final com.velocitypowered.natives.encryption.VelocityCipher cipher; // Paper - Use Velocity cipher - -- public CipherEncoder(Cipher cipher) { -- this.cipher = new CipherBase(cipher); -+ public CipherEncoder(com.velocitypowered.natives.encryption.VelocityCipher cipher) { // Paper - Use Velocity cipher -+ this.cipher = cipher; // Paper - Use Velocity cipher - } - -- protected void encode(ChannelHandlerContext channelHandlerContext, ByteBuf byteBuf, ByteBuf byteBuf2) throws Exception { -- this.cipher.encipher(byteBuf, byteBuf2); -+ protected void encode(ChannelHandlerContext channelHandlerContext, ByteBuf byteBuf, List<Object> list) throws Exception { -+ // Paper start - Use Velocity cipher -+ ByteBuf compatible = com.velocitypowered.natives.util.MoreByteBufUtils.ensureCompatible(channelHandlerContext.alloc(), cipher, byteBuf); -+ try { -+ cipher.process(compatible); -+ list.add(compatible); -+ } catch (Exception e) { -+ compatible.release(); // compatible will never be used if we throw an exception -+ throw e; -+ } -+ // Paper end - Use Velocity cipher - } -+ -+ // Paper start - Use Velocity cipher -+ @Override -+ public void handlerRemoved(ChannelHandlerContext ctx) throws Exception { -+ cipher.close(); -+ } -+ // Paper end - Use Velocity cipher - } -diff --git a/src/main/java/net/minecraft/network/CompressionDecoder.java b/src/main/java/net/minecraft/network/CompressionDecoder.java -index 5927c928b27f64bd3973e95d5867b59f67476d41..ba3619b03ea73e4ea55ae2eb79d3b6cd1f48a191 100644 ---- a/src/main/java/net/minecraft/network/CompressionDecoder.java -+++ b/src/main/java/net/minecraft/network/CompressionDecoder.java -@@ -13,13 +13,20 @@ public class CompressionDecoder extends ByteToMessageDecoder { - public static final int MAXIMUM_COMPRESSED_LENGTH = 2097152; - public static final int MAXIMUM_UNCOMPRESSED_LENGTH = 8388608; - private final Inflater inflater; -+ private com.velocitypowered.natives.compression.VelocityCompressor compressor; // Paper - Use Velocity cipher - private int threshold; - private boolean validateDecompressed; - -+ // Paper start - Use Velocity cipher - public CompressionDecoder(int compressionThreshold, boolean rejectsBadPackets) { -+ this(null, compressionThreshold, rejectsBadPackets); -+ } -+ public CompressionDecoder(com.velocitypowered.natives.compression.VelocityCompressor compressor, int compressionThreshold, boolean rejectsBadPackets) { - this.threshold = compressionThreshold; - this.validateDecompressed = rejectsBadPackets; -- this.inflater = new Inflater(); -+ this.inflater = compressor == null ? new Inflater() : null; -+ this.compressor = compressor; -+ // Paper end - Use Velocity cipher - } - - protected void decode(ChannelHandlerContext channelHandlerContext, ByteBuf byteBuf, List<Object> list) throws Exception { -@@ -38,14 +45,42 @@ public class CompressionDecoder extends ByteToMessageDecoder { - } - } - -+ if (inflater != null) { // Paper - Use Velocity cipher; fallback to vanilla inflater - this.setupInflaterInput(byteBuf); - ByteBuf byteBuf2 = this.inflate(channelHandlerContext, i); - this.inflater.reset(); - list.add(byteBuf2); -+ return; // Paper - Use Velocity cipher -+ } // Paper - use velocity compression -+ -+ // Paper start - Use Velocity cipher -+ int claimedUncompressedSize = i; // OBFHELPER -+ ByteBuf compatibleIn = com.velocitypowered.natives.util.MoreByteBufUtils.ensureCompatible(channelHandlerContext.alloc(), this.compressor, byteBuf); -+ ByteBuf uncompressed = com.velocitypowered.natives.util.MoreByteBufUtils.preferredBuffer(channelHandlerContext.alloc(), this.compressor, claimedUncompressedSize); -+ try { -+ this.compressor.inflate(compatibleIn, uncompressed, claimedUncompressedSize); -+ list.add(uncompressed); -+ byteBuf.clear(); -+ } catch (Exception e) { -+ uncompressed.release(); -+ throw e; -+ } finally { -+ compatibleIn.release(); -+ } -+ // Paper end - Use Velocity cipher - } - } - } - -+ // Paper start - Use Velocity cipher -+ @Override -+ public void handlerRemoved0(ChannelHandlerContext ctx) throws Exception { -+ if (this.compressor != null) { -+ this.compressor.close(); -+ } -+ } -+ // Paper end - Use Velocity cipher -+ - private void setupInflaterInput(ByteBuf buf) { - ByteBuffer byteBuffer; - if (buf.nioBufferCount() > 0) { -@@ -82,7 +117,7 @@ public class CompressionDecoder extends ByteToMessageDecoder { - } - } - -- public void setThreshold(int compressionThreshold, boolean rejectsBadPackets) { -+ public void setThreshold(com.velocitypowered.natives.compression.VelocityCompressor compressor, int compressionThreshold, boolean rejectsBadPackets) { // Paper - Use Velocity cipher - this.threshold = compressionThreshold; - this.validateDecompressed = rejectsBadPackets; - } -diff --git a/src/main/java/net/minecraft/network/CompressionEncoder.java b/src/main/java/net/minecraft/network/CompressionEncoder.java -index 34a80d2f34555663ab1b394972957089214cb337..ec30c291188ac3bba7f1c3bc397576d1edb0a57f 100644 ---- a/src/main/java/net/minecraft/network/CompressionEncoder.java -+++ b/src/main/java/net/minecraft/network/CompressionEncoder.java -@@ -6,16 +6,31 @@ import io.netty.handler.codec.MessageToByteEncoder; - import java.util.zip.Deflater; - - public class CompressionEncoder extends MessageToByteEncoder<ByteBuf> { -- private final byte[] encodeBuf = new byte[8192]; -+ @javax.annotation.Nullable private final byte[] encodeBuf; // Paper - Use Velocity cipher -+ @javax.annotation.Nullable // Paper - Use Velocity cipher - private final Deflater deflater; -+ @javax.annotation.Nullable // Paper - Use Velocity cipher -+ private final com.velocitypowered.natives.compression.VelocityCompressor compressor; // Paper - Use Velocity cipher - private int threshold; - -+ // Paper start - Use Velocity cipher - public CompressionEncoder(int compressionThreshold) { -+ this(null, compressionThreshold); -+ } -+ public CompressionEncoder(@javax.annotation.Nullable com.velocitypowered.natives.compression.VelocityCompressor compressor, int compressionThreshold) { - this.threshold = compressionThreshold; -- this.deflater = new Deflater(); -+ if (compressor == null) { -+ this.encodeBuf = new byte[8192]; -+ this.deflater = new Deflater(); -+ } else { -+ this.encodeBuf = null; -+ this.deflater = null; -+ } -+ this.compressor = compressor; -+ // Paper end - Use Velocity cipher - } - -- protected void encode(ChannelHandlerContext channelHandlerContext, ByteBuf byteBuf, ByteBuf byteBuf2) { -+ protected void encode(ChannelHandlerContext channelHandlerContext, ByteBuf byteBuf, ByteBuf byteBuf2) throws Exception { // Paper - Use Velocity cipher - int i = byteBuf.readableBytes(); - if (i > 8388608) { - throw new IllegalArgumentException("Packet too big (is " + i + ", should be less than 8388608)"); -@@ -24,6 +39,7 @@ public class CompressionEncoder extends MessageToByteEncoder<ByteBuf> { - VarInt.write(byteBuf2, 0); - byteBuf2.writeBytes(byteBuf); - } else { -+ if (this.deflater != null) { // Paper - Use Velocity cipher - byte[] bs = new byte[i]; - byteBuf.readBytes(bs); - VarInt.write(byteBuf2, bs.length); -@@ -36,10 +52,47 @@ public class CompressionEncoder extends MessageToByteEncoder<ByteBuf> { - } - - this.deflater.reset(); -+ // Paper start - Use Velocity cipher -+ return; -+ } -+ -+ VarInt.write(byteBuf2, i); -+ final ByteBuf compatibleIn = com.velocitypowered.natives.util.MoreByteBufUtils.ensureCompatible(channelHandlerContext.alloc(), this.compressor, byteBuf); -+ try { -+ this.compressor.deflate(compatibleIn, byteBuf2); -+ } finally { -+ compatibleIn.release(); -+ } - } - } - } - -+ @Override -+ protected ByteBuf allocateBuffer(ChannelHandlerContext ctx, ByteBuf msg, boolean preferDirect) throws Exception{ -+ if (this.compressor != null) { -+ // We allocate bytes to be compressed plus 1 byte. This covers two cases: -+ // -+ // - Compression -+ // According to https://github.com/ebiggers/libdeflate/blob/master/libdeflate.h#L103, -+ // if the data compresses well (and we do not have some pathological case) then the maximum -+ // size the compressed size will ever be is the input size minus one. -+ // - Uncompressed -+ // This is fairly obvious - we will then have one more than the uncompressed size. -+ final int initialBufferSize = msg.readableBytes() + 1; -+ return com.velocitypowered.natives.util.MoreByteBufUtils.preferredBuffer(ctx.alloc(), this.compressor, initialBufferSize); -+ } -+ -+ return super.allocateBuffer(ctx, msg, preferDirect); -+ } -+ -+ @Override -+ public void handlerRemoved(ChannelHandlerContext ctx) throws Exception { -+ if (this.compressor != null) { -+ this.compressor.close(); -+ // Paper end - Use Velocity cipher -+ } -+ } -+ - public int getThreshold() { - return this.threshold; - } -diff --git a/src/main/java/net/minecraft/network/Connection.java b/src/main/java/net/minecraft/network/Connection.java -index f94458d4270042062b9ae18931cc8179ef1fb420..63066dfde00569833546da01cd580434f8be6593 100644 ---- a/src/main/java/net/minecraft/network/Connection.java -+++ b/src/main/java/net/minecraft/network/Connection.java -@@ -763,11 +763,28 @@ public class Connection extends SimpleChannelInboundHandler<Packet<?>> { - return networkmanager; - } - -- public void setEncryptionKey(Cipher decryptionCipher, Cipher encryptionCipher) { -- this.encrypted = true; -- this.channel.pipeline().addBefore("splitter", "decrypt", new CipherDecoder(decryptionCipher)); -- this.channel.pipeline().addBefore("prepender", "encrypt", new CipherEncoder(encryptionCipher)); -+ // Paper start - Use Velocity cipher -+// public void setEncryptionKey(Cipher decryptionCipher, Cipher encryptionCipher) { -+// this.encrypted = true; -+// this.channel.pipeline().addBefore("splitter", "decrypt", new CipherDecoder(decryptionCipher)); -+// this.channel.pipeline().addBefore("prepender", "encrypt", new CipherEncoder(encryptionCipher)); -+// } -+ -+ public void setupEncryption(javax.crypto.SecretKey key) throws net.minecraft.util.CryptException { -+ if (!this.encrypted) { -+ try { -+ com.velocitypowered.natives.encryption.VelocityCipher decryption = com.velocitypowered.natives.util.Natives.cipher.get().forDecryption(key); -+ com.velocitypowered.natives.encryption.VelocityCipher encryption = com.velocitypowered.natives.util.Natives.cipher.get().forEncryption(key); -+ -+ this.encrypted = true; -+ this.channel.pipeline().addBefore("splitter", "decrypt", new CipherDecoder(decryption)); -+ this.channel.pipeline().addBefore("prepender", "encrypt", new CipherEncoder(encryption)); -+ } catch (java.security.GeneralSecurityException e) { -+ throw new net.minecraft.util.CryptException(e); -+ } -+ } - } -+ // Paper end - Use Velocity cipher - - public boolean isEncrypted() { - return this.encrypted; -@@ -800,12 +817,13 @@ public class Connection extends SimpleChannelInboundHandler<Packet<?>> { - - public void setupCompression(int compressionThreshold, boolean rejectsBadPackets) { - if (compressionThreshold >= 0) { -+ com.velocitypowered.natives.compression.VelocityCompressor compressor = com.velocitypowered.natives.util.Natives.compress.get().create(io.papermc.paper.configuration.GlobalConfiguration.get().misc.compressionLevel.or(-1)); // Paper - Use Velocity cipher - ChannelHandler channelhandler = this.channel.pipeline().get("decompress"); - - if (channelhandler instanceof CompressionDecoder) { - CompressionDecoder packetdecompressor = (CompressionDecoder) channelhandler; - -- packetdecompressor.setThreshold(compressionThreshold, rejectsBadPackets); -+ packetdecompressor.setThreshold(compressor, compressionThreshold, rejectsBadPackets); // Paper - Use Velocity cipher - } else { - this.channel.pipeline().addAfter("splitter", "decompress", new CompressionDecoder(compressionThreshold, rejectsBadPackets)); - } -@@ -816,7 +834,7 @@ public class Connection extends SimpleChannelInboundHandler<Packet<?>> { - - packetcompressor.setThreshold(compressionThreshold); - } else { -- this.channel.pipeline().addAfter("prepender", "compress", new CompressionEncoder(compressionThreshold)); -+ this.channel.pipeline().addAfter("prepender", "compress", new CompressionEncoder(compressor, compressionThreshold)); // Paper - Use Velocity cipher - } - this.channel.pipeline().fireUserEventTriggered(io.papermc.paper.network.ConnectionEvent.COMPRESSION_THRESHOLD_SET); // Paper - Add Channel initialization listeners - } else { -diff --git a/src/main/java/net/minecraft/server/network/ServerConnectionListener.java b/src/main/java/net/minecraft/server/network/ServerConnectionListener.java -index a08d9aa6e420f691795df9b627a9cd5b5c0112c5..52f537b7bfbdeaad9d17c0e88a1ed1c8925a833f 100644 ---- a/src/main/java/net/minecraft/server/network/ServerConnectionListener.java -+++ b/src/main/java/net/minecraft/server/network/ServerConnectionListener.java -@@ -106,6 +106,11 @@ public class ServerConnectionListener { - ServerConnectionListener.LOGGER.info("Using default channel type"); - } - -+ // Paper start - Use Velocity cipher -+ ServerConnectionListener.LOGGER.info("Paper: Using " + com.velocitypowered.natives.util.Natives.compress.getLoadedVariant() + " compression from Velocity."); -+ ServerConnectionListener.LOGGER.info("Paper: Using " + com.velocitypowered.natives.util.Natives.cipher.getLoadedVariant() + " cipher from Velocity."); -+ // Paper end - Use Velocity cipher -+ - this.channels.add(((ServerBootstrap) ((ServerBootstrap) (new ServerBootstrap()).channel(oclass)).childHandler(new ChannelInitializer<Channel>() { - protected void initChannel(Channel channel) { - try { -diff --git a/src/main/java/net/minecraft/server/network/ServerLoginPacketListenerImpl.java b/src/main/java/net/minecraft/server/network/ServerLoginPacketListenerImpl.java -index cb006ae0e5be2f1d31261bdd36964229ec44416d..b656741eb68adeb04bf995f1045902cb6bd5f2e7 100644 ---- a/src/main/java/net/minecraft/server/network/ServerLoginPacketListenerImpl.java -+++ b/src/main/java/net/minecraft/server/network/ServerLoginPacketListenerImpl.java -@@ -280,12 +280,14 @@ public class ServerLoginPacketListenerImpl implements ServerLoginPacketListener, - } - - SecretKey secretkey = packet.getSecretKey(privatekey); -- Cipher cipher = Crypt.getCipher(2, secretkey); -- Cipher cipher1 = Crypt.getCipher(1, secretkey); -+ // Paper start - Use Velocity cipher -+// Cipher cipher = Crypt.getCipher(2, secretkey); -+// Cipher cipher1 = Crypt.getCipher(1, secretkey); -+ // Paper end - Use Velocity cipher - - s = (new BigInteger(Crypt.digestData("", this.server.getKeyPair().getPublic(), secretkey))).toString(16); - this.state = ServerLoginPacketListenerImpl.State.AUTHENTICATING; -- this.connection.setEncryptionKey(cipher, cipher1); -+ this.connection.setupEncryption(secretkey); // Paper - Use Velocity cipher - } catch (CryptException cryptographyexception) { - throw new IllegalStateException("Protocol error", cryptographyexception); - } |