From 21f2543059b26db5c1de59a55792dc7b35afea44 Mon Sep 17 00:00:00 2001 From: Adam Date: Sat, 16 Dec 2017 18:24:00 -0500 Subject: [PATCH] cache: fix compression with encryption --- .../net/runelite/cache/fs/jagex/DataFile.java | 27 +++++++++---------- .../runelite/cache/fs/jagex/DataFileTest.java | 26 +++++++++++++++++- 2 files changed, 38 insertions(+), 15 deletions(-) diff --git a/cache/src/main/java/net/runelite/cache/fs/jagex/DataFile.java b/cache/src/main/java/net/runelite/cache/fs/jagex/DataFile.java index f4401a45af..cd770999ff 100644 --- a/cache/src/main/java/net/runelite/cache/fs/jagex/DataFile.java +++ b/cache/src/main/java/net/runelite/cache/fs/jagex/DataFile.java @@ -24,6 +24,8 @@ */ package net.runelite.cache.fs.jagex; +import static com.google.common.primitives.Bytes.concat; +import com.google.common.primitives.Ints; import java.io.Closeable; import java.io.File; import java.io.FileNotFoundException; @@ -376,7 +378,6 @@ public class DataFile implements Closeable res.data = data; res.revision = revision; res.crc = crc32.getHash(); - int length = revision != -1 ? b.length - 2 : b.length; res.compression = compression; return res; } @@ -384,33 +385,31 @@ public class DataFile implements Closeable public static byte[] compress(byte[] data, int compression, int revision, int[] keys) throws IOException { OutputStream stream = new OutputStream(); - stream.writeByte(compression); byte[] compressedData; + int length; switch (compression) { case CompressionType.NONE: compressedData = data; - compressedData = encrypt(compressedData, compressedData.length, keys); - stream.writeInt(data.length); + length = compressedData.length; break; case CompressionType.BZ2: - compressedData = BZip2.compress(data); - compressedData = encrypt(compressedData, compressedData.length, keys); - - stream.writeInt(compressedData.length); - stream.writeInt(data.length); + compressedData = concat(Ints.toByteArray(data.length), BZip2.compress(data)); + length = compressedData.length - 4; break; case CompressionType.GZ: - compressedData = GZip.compress(data); - compressedData = encrypt(compressedData, compressedData.length, keys); - - stream.writeInt(compressedData.length); - stream.writeInt(data.length); + compressedData = concat(Ints.toByteArray(data.length), GZip.compress(data)); + length = compressedData.length - 4; break; default: throw new RuntimeException("Unknown compression type"); } + compressedData = encrypt(compressedData, compressedData.length, keys); + + stream.writeByte(compression); + stream.writeInt(length); + stream.writeBytes(compressedData); if (revision != -1) { diff --git a/cache/src/test/java/net/runelite/cache/fs/jagex/DataFileTest.java b/cache/src/test/java/net/runelite/cache/fs/jagex/DataFileTest.java index eb0338816a..bc7b8ea962 100644 --- a/cache/src/test/java/net/runelite/cache/fs/jagex/DataFileTest.java +++ b/cache/src/test/java/net/runelite/cache/fs/jagex/DataFileTest.java @@ -131,7 +131,7 @@ public class DataFileTest } @Test - public void testKeys() throws IOException + public void testEnc() throws IOException { File file = folder.newFile(); int[] keys = new int[] @@ -153,4 +153,28 @@ public class DataFileTest Assert.assertEquals(res.crc, res2.crc); Assert.assertEquals(42, res2.revision); } + + @Test + public void testEncGz() throws IOException + { + File file = folder.newFile(); + int[] keys = new int[] + { + 4, 8, 15, 16 + }; + + DataFile df = new DataFile(file); + + byte[] compressedData = DataFile.compress("testtesttesttest1".getBytes(), CompressionType.GZ, 42, keys); + DataFileWriteResult res = df.write(42, 3, compressedData, 0); + + compressedData = df.read(42, 3, res.sector, res.compressedLength); + DataFileReadResult res2 = DataFile.decompress(compressedData, keys); + + byte[] buf = res2.data; + String str = new String(buf); + Assert.assertEquals("testtesttesttest1", str); + Assert.assertEquals(res.crc, res2.crc); + Assert.assertEquals(42, res2.revision); + } }