diff --git a/cache/pom.xml b/cache/pom.xml
index 989cdaaa0c..b252575d02 100644
--- a/cache/pom.xml
+++ b/cache/pom.xml
@@ -74,11 +74,6 @@
gson
2.4
-
- org.bouncycastle
- bcprov-ext-jdk14
- 1.54
-
io.netty
netty-all
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 1942debdcb..f4401a45af 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
@@ -30,11 +30,6 @@ import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.RandomAccessFile;
import java.nio.ByteBuffer;
-import java.security.InvalidKeyException;
-import java.security.NoSuchAlgorithmException;
-import javax.crypto.BadPaddingException;
-import javax.crypto.IllegalBlockSizeException;
-import javax.crypto.NoSuchPaddingException;
import net.runelite.cache.util.BZip2;
import net.runelite.cache.io.InputStream;
import net.runelite.cache.io.OutputStream;
@@ -432,16 +427,8 @@ public class DataFile implements Closeable
return data;
}
- try
- {
- Xtea xtea = new Xtea(keys);
- return xtea.decrypt(data, length);
- }
- catch (NoSuchAlgorithmException | NoSuchPaddingException | InvalidKeyException | IllegalBlockSizeException | BadPaddingException ex)
- {
- logger.warn("unable to xtea decrypt", ex);
- return null;
- }
+ Xtea xtea = new Xtea(keys);
+ return xtea.decrypt(data, length);
}
private static byte[] encrypt(byte[] data, int length, int[] keys)
@@ -451,15 +438,7 @@ public class DataFile implements Closeable
return data;
}
- try
- {
- Xtea xtea = new Xtea(keys);
- return xtea.encrypt(data, length);
- }
- catch (NoSuchAlgorithmException | NoSuchPaddingException | InvalidKeyException | IllegalBlockSizeException | BadPaddingException ex)
- {
- logger.warn("unable to xtea encrypt", ex);
- return null;
- }
+ Xtea xtea = new Xtea(keys);
+ return xtea.encrypt(data, length);
}
}
diff --git a/cache/src/main/java/net/runelite/cache/util/Xtea.java b/cache/src/main/java/net/runelite/cache/util/Xtea.java
index 3bfb244e29..c79dc5a511 100644
--- a/cache/src/main/java/net/runelite/cache/util/Xtea.java
+++ b/cache/src/main/java/net/runelite/cache/util/Xtea.java
@@ -22,81 +22,67 @@
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
-
package net.runelite.cache.util;
-import java.nio.ByteBuffer;
-import java.security.InvalidKeyException;
-import java.security.NoSuchAlgorithmException;
-import java.security.Security;
-import javax.crypto.BadPaddingException;
-import javax.crypto.Cipher;
-import javax.crypto.IllegalBlockSizeException;
-import javax.crypto.NoSuchPaddingException;
-import javax.crypto.spec.SecretKeySpec;
-import org.bouncycastle.jce.provider.BouncyCastleProvider;
-import org.bouncycastle.util.Arrays;
+import io.netty.buffer.ByteBuf;
+import io.netty.buffer.Unpooled;
public class Xtea
{
- static
- {
- Security.addProvider(new BouncyCastleProvider());
- }
-
- private final Cipher cipher;
- private final int[] keys;
+ private static final int GOLDEN_RATIO = 0x9E3779B9;
- public Xtea(int[] keys) throws NoSuchAlgorithmException, NoSuchPaddingException
+ private static final int ROUNDS = 32;
+
+ private final int[] key;
+
+ public Xtea(int[] key)
{
- this.cipher = Cipher.getInstance("XTEA/ECB/NoPadding");
- this.keys = keys;
+ this.key = key;
}
- private static byte[] packKey(int[] key)
+ public byte[] encrypt(byte[] data, int len)
{
- ByteBuffer buffer = ByteBuffer.allocate(4 * key.length);
- for (int i : key)
- buffer.putInt(i);
- return buffer.array();
- }
-
- public byte[] encrypt(byte[] data, int len) throws InvalidKeyException, IllegalBlockSizeException, BadPaddingException
- {
- cipher.init(Cipher.ENCRYPT_MODE, new SecretKeySpec(packKey(keys), cipher.getAlgorithm()));
- byte[] out = cipher.update(data, 0, len - (len % cipher.getBlockSize()));
- cipher.doFinal();
-
- // add remaining data, which is not encrypted
- if (out.length != len)
+ ByteBuf buf = Unpooled.wrappedBuffer(data, 0, len);
+ ByteBuf out = Unpooled.buffer(len);
+ int numBlocks = len / 8;
+ for (int block = 0; block < numBlocks; ++block)
{
- assert len > out.length;
-
- byte[] padded = Arrays.copyOf(out, len);
- System.arraycopy(data, out.length, padded, out.length, len - out.length);
-
- out = padded;
+ int v0 = buf.readInt();
+ int v1 = buf.readInt();
+ int sum = 0;
+ for (int i = 0; i < ROUNDS; ++i)
+ {
+ v0 += (((v1 << 4) ^ (v1 >>> 5)) + v1) ^ (sum + key[sum & 3]);
+ sum += GOLDEN_RATIO;
+ v1 += (((v0 << 4) ^ (v0 >>> 5)) + v0) ^ (sum + key[(sum >>> 11) & 3]);
+ }
+ out.writeInt(v0);
+ out.writeInt(v1);
}
-
- return out;
+ out.writeBytes(buf);
+ return out.array();
}
- public byte[] decrypt(byte[] data, int len) throws InvalidKeyException, IllegalBlockSizeException, BadPaddingException
+ public byte[] decrypt(byte[] data, int len)
{
- cipher.init(Cipher.DECRYPT_MODE, new SecretKeySpec(packKey(keys), cipher.getAlgorithm()));
- byte[] out = cipher.update(data, 0, len - (len % cipher.getBlockSize()));
- cipher.doFinal();
-
- if (out.length != len)
+ ByteBuf buf = Unpooled.wrappedBuffer(data, 0, len);
+ ByteBuf out = Unpooled.buffer(len);
+ int numBlocks = len / 8;
+ for (int block = 0; block < numBlocks; ++block)
{
- assert len > out.length;
-
- byte[] padded = Arrays.copyOf(out, len);
- System.arraycopy(data, out.length, padded, out.length, len - out.length);
-
- out = padded;
+ int v0 = buf.readInt();
+ int v1 = buf.readInt();
+ int sum = GOLDEN_RATIO * ROUNDS;
+ for (int i = 0; i < ROUNDS; ++i)
+ {
+ v1 -= (((v0 << 4) ^ (v0 >>> 5)) + v0) ^ (sum + key[(sum >>> 11) & 3]);
+ sum -= GOLDEN_RATIO;
+ v0 -= (((v1 << 4) ^ (v1 >>> 5)) + v1) ^ (sum + key[sum & 3]);
+ }
+ out.writeInt(v0);
+ out.writeInt(v1);
}
-
- return out;
+ out.writeBytes(buf);
+ return out.array();
}
}