From 4ac26961308c45967dea33a0026e8480f6730959 Mon Sep 17 00:00:00 2001 From: Adam Date: Fri, 29 Dec 2017 18:06:10 -0500 Subject: [PATCH] runelite-proxy: subtree split into separate repository --- pom.xml | 1 - runelite-proxy/pom.xml | 68 ----- .../main/java/net/runelite/proxy/IOCopy.java | 64 ----- .../java/net/runelite/proxy/PacketCopy.java | 112 --------- .../main/java/net/runelite/proxy/Proxy.java | 63 ----- .../java/net/runelite/proxy/ProxyRunner.java | 234 ------------------ .../net/runelite/proxy/RLISAACCipher.java | 174 ------------- .../src/main/java/net/runelite/proxy/RSA.java | 99 -------- .../test/java/net/runelite/proxy/RSATest.java | 45 ---- 9 files changed, 860 deletions(-) delete mode 100644 runelite-proxy/pom.xml delete mode 100644 runelite-proxy/src/main/java/net/runelite/proxy/IOCopy.java delete mode 100644 runelite-proxy/src/main/java/net/runelite/proxy/PacketCopy.java delete mode 100644 runelite-proxy/src/main/java/net/runelite/proxy/Proxy.java delete mode 100644 runelite-proxy/src/main/java/net/runelite/proxy/ProxyRunner.java delete mode 100644 runelite-proxy/src/main/java/net/runelite/proxy/RLISAACCipher.java delete mode 100644 runelite-proxy/src/main/java/net/runelite/proxy/RSA.java delete mode 100644 runelite-proxy/src/test/java/net/runelite/proxy/RSATest.java diff --git a/pom.xml b/pom.xml index 2d7fbb0970..2afa34908e 100644 --- a/pom.xml +++ b/pom.xml @@ -118,7 +118,6 @@ runelite-plugin-archetype http-api http-service - runelite-proxy protocol-api protocol diff --git a/runelite-proxy/pom.xml b/runelite-proxy/pom.xml deleted file mode 100644 index 37e05c8be9..0000000000 --- a/runelite-proxy/pom.xml +++ /dev/null @@ -1,68 +0,0 @@ - - - - 4.0.0 - - - net.runelite - runelite-parent - 1.2.11-SNAPSHOT - - - net.runelite - proxy - Runelite Proxy - - - - org.slf4j - slf4j-api - 1.7.12 - - - org.slf4j - slf4j-simple - 1.7.12 - - - - io.netty - netty-all - 4.1.0.Final - - - com.google.guava - guava - - - - junit - junit - 4.12 - test - - - diff --git a/runelite-proxy/src/main/java/net/runelite/proxy/IOCopy.java b/runelite-proxy/src/main/java/net/runelite/proxy/IOCopy.java deleted file mode 100644 index d741b46d62..0000000000 --- a/runelite-proxy/src/main/java/net/runelite/proxy/IOCopy.java +++ /dev/null @@ -1,64 +0,0 @@ -/* - * Copyright (c) 2017, Adam - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (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.proxy; - -import java.io.DataInputStream; -import java.io.DataOutputStream; -import java.io.IOException; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -public class IOCopy extends Thread -{ - private static final Logger logger = LoggerFactory.getLogger(IOCopy.class); - - private final DataInputStream in; - private final DataOutputStream out; - - public IOCopy(String name, DataInputStream in, DataOutputStream out) - { - super(name); - this.in = in; - this.out = out; - } - - @Override - public void run() - { - try - { - int i; - while ((i = in.read()) != -1) - { - out.write(i); - } - } - catch (IOException ex) - { - logger.error(null, ex); - } - } - -} diff --git a/runelite-proxy/src/main/java/net/runelite/proxy/PacketCopy.java b/runelite-proxy/src/main/java/net/runelite/proxy/PacketCopy.java deleted file mode 100644 index 679565ce5b..0000000000 --- a/runelite-proxy/src/main/java/net/runelite/proxy/PacketCopy.java +++ /dev/null @@ -1,112 +0,0 @@ -/* - * Copyright (c) 2017, Adam - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (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.proxy; - -import io.netty.buffer.ByteBufUtil; -import io.netty.buffer.Unpooled; -import java.io.DataInputStream; -import java.io.DataOutputStream; -import java.io.IOException; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -public class PacketCopy extends Thread -{ - private static final Logger logger = LoggerFactory.getLogger(PacketCopy.class); - - private final DataInputStream in; - private final DataOutputStream out; - private final RLISAACCipher inCipher; - private final RLISAACCipher outCipher; - - public PacketCopy(String name, DataInputStream in, DataOutputStream out, RLISAACCipher inCipher, RLISAACCipher outCipher) - { - super(name); - this.in = in; - this.out = out; - this.inCipher = inCipher; - this.outCipher = outCipher; - } - - @Override - public void run() - { - try - { - for (;;) - { - int packetOpcode = ProxyRunner.readOpcode(inCipher, in); - int packetLength = Proxy.PACKET_LENGHTS[packetOpcode]; - - if (packetLength == -1) - { - packetLength = in.read() & 0xff; - } - - if (packetLength == -2) - { - packetLength = in.readShort() & 0xffff; - } - - byte[] b = new byte[packetLength]; - int read = 0; - - while (read < packetLength) - { - int r = in.read(b, read, packetLength - read); - if (r <= 0) - { - throw new IOException(); - } - read += r; - } - - String hexdump = ByteBufUtil.prettyHexDump(Unpooled.wrappedBuffer(b)); - logger.info("Read packet opcode {} length {}\n{}", packetOpcode, packetLength, hexdump); - - // Write out - ProxyRunner.writeOpcode(outCipher, out, packetOpcode); - - switch (Proxy.PACKET_LENGHTS[packetOpcode]) - { - case -1: - assert packetLength >= 0 && packetLength < 256; - out.write(packetLength); - break; - case -2: - out.writeShort(packetLength); - break; - } - - out.write(b); - - } - } - catch (IOException ex) - { - logger.error(null, ex); - } - } -} diff --git a/runelite-proxy/src/main/java/net/runelite/proxy/Proxy.java b/runelite-proxy/src/main/java/net/runelite/proxy/Proxy.java deleted file mode 100644 index f8f601703d..0000000000 --- a/runelite-proxy/src/main/java/net/runelite/proxy/Proxy.java +++ /dev/null @@ -1,63 +0,0 @@ -/* - * Copyright (c) 2017, Adam - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (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.proxy; - -import java.io.IOException; -import java.math.BigInteger; -import java.net.ServerSocket; -import java.net.Socket; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -public class Proxy -{ - private static final Logger logger = LoggerFactory.getLogger(Proxy.class); - - public static final int REVISION = 140; - - // For revision 140 - public static final BigInteger SERVER_RSA_KEY_MODULUS = new BigInteger("9cb954af0865fabe3fcee77d0a91524f62b18e71b550fa614215edb36424cc57718697e30a7f074ed8bf30c15bb2fca615790d6b322606e48445c2b3393680f56874e5ae8a9f89cd7bbab8c2dd8d2b233b3731f5bb00e9ddb3eddc7a46db157ba848e3ba5fe1e71edde7e36d0976b7ba8dd2ad6c9712ccc9c788212347c3a517", 16); - public static final BigInteger SERVER_RSA_KEY_EXPONENT = new BigInteger("10001", 16); - public static final int[] PACKET_LENGHTS = new int[] - { - 4, 0, -1, 0, 6, 0, 0, 0, 0, 0, 0, 6, 0, 0, 0, 6, 4, 28, 0, 0, 0, -2, 7, 0, 0, 0, 0, 0, 0, 0, 0, -1, 0, 0, -1, 0, 0, 0, 0, 0, 6, 0, 0, 0, 5, 0, 0, 4, -2, 0, 0, 2, 1, 2, 5, 0, 0, 0, 0, 6, -1, 0, 0, 0, 0, -2, -2, 0, 0, 4, 0, -2, 0, -2, 0, -2, -2, 4, 6, 0, -2, 0, 0, 0, 0, 4, 5, 7, 0, 0, 0, 0, 0, 0, 0, 1, 0, 3, 8, 5, 0, 0, 15, 0, 0, 0, 0, 0, 2, 0, 2, 0, 0, 0, 0, 0, -2, 0, 0, 4, 0, 3, 0, 0, 2, 0, 0, -2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, -2, 0, 0, 0, 20, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 6, 6, -1, 1, 0, 0, -2, 0, 0, 0, 2, 0, 0, 0, 0, 2, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 0, -2, 0, 0, 12, 0, 6, 8, -2, 0, 5, 0, 0, -2, 0, 6, 10, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, -2, 0, 0, 0, 0, 0, 0, -2, 0, 0, 0, 0, 10, 14, 0, 0, 0, 0, 0, 0, -1, 0, 0, 0, 0, 6, -2, 0, 0, 0, 6, 0, 0, 0, 0, 0, 0 - }; - - public static final RSA myRsa = new RSA(); - public static final RSA rsRsa = new RSA(SERVER_RSA_KEY_MODULUS, null); - - public static void main(String[] args) throws IOException - { - ServerSocket socket = new ServerSocket(43594); - - logger.info("Running with RSA modulus {}", myRsa.getN().toString(16)); - - Socket s; - while ((s = socket.accept()) != null) - { - new ProxyRunner(s).start(); - } - } -} diff --git a/runelite-proxy/src/main/java/net/runelite/proxy/ProxyRunner.java b/runelite-proxy/src/main/java/net/runelite/proxy/ProxyRunner.java deleted file mode 100644 index cf4a7e15ba..0000000000 --- a/runelite-proxy/src/main/java/net/runelite/proxy/ProxyRunner.java +++ /dev/null @@ -1,234 +0,0 @@ -/* - * Copyright (c) 2017, Adam - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (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.proxy; - -import com.google.common.primitives.Ints; -import com.google.common.primitives.Longs; -import java.io.DataInputStream; -import java.io.DataOutputStream; -import java.io.IOException; -import java.io.InputStream; -import java.io.OutputStream; -import java.net.Socket; -import java.nio.ByteBuffer; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -public class ProxyRunner extends Thread -{ - private static final Logger logger = LoggerFactory.getLogger(ProxyRunner.class); - - private final Socket client; - private final Socket server; - - private RLISAACCipher clientInCipher; - private RLISAACCipher clientOutCipher; - - private RLISAACCipher serverInCipher; - private RLISAACCipher serverOutCipher; - - public ProxyRunner(Socket client) throws IOException - { - this.client = client; - this.server = new Socket("oldschool84.runescape.com", 43594); - } - - @Override - public void run() - { - try - { - go(); - } - catch (IOException ex) - { - logger.error(null, ex); - } - } - - private void go() throws IOException - { - DataInputStream in = new DataInputStream(client.getInputStream()); - DataOutputStream out = new DataOutputStream(client.getOutputStream()); - - DataInputStream serverIn = new DataInputStream(server.getInputStream()); - DataOutputStream serverOut = new DataOutputStream(server.getOutputStream()); - - int handshakeType = in.read(); - logger.info("Handshake from client: {}", handshakeType); - - // Forward to server - serverOut.write(handshakeType); - - if (handshakeType != 14) // 14 = login, 15 = ondemand - { - new IOCopy("OnDemand C2S", in, serverOut).start(); - new IOCopy("OnDemand S2C", serverIn, out).start(); - return; - } - - int handshakeResponse = serverIn.read(); - logger.info("Handshake response from server: {}", handshakeResponse); - - // Forward to client - out.write(handshakeResponse); - - byte[] b = new byte[8]; - int len = serverIn.read(b); - assert len == 8; - - logger.info("Nonce from server: {}", Longs.fromByteArray(b)); - - // Forward to client - out.write(b); - - // Now the client sends the login packet, some of it is rsa encrypted with a rsa key - // that is hardcoded into the client. In this data is the xtea key which is used later - // for the isaac cipher seeding and for encrypting the rest of the packet. - int gameState = in.read(); // 18 or 16 depending on some game state - int length = in.readShort(); // length of remaining packet - int revision = in.readInt(); // client revision - - logger.info("Client game state: {}, revision: {}", gameState, revision); - - if (revision != Proxy.REVISION) - { - client.close(); - server.close(); - return; - } - - int encrypedDataLength = in.readShort(); - byte[] rsaData = new byte[encrypedDataLength]; - len = in.read(rsaData); - assert len == encrypedDataLength; - - rsaData = Proxy.myRsa.decrypt(rsaData); - - // Reencrypt data - byte[] reencrypted = Proxy.rsRsa.encrypt(rsaData); - - // Extract xtea key - b = rsaData; - assert b[0] == 1; - int key1 = Ints.fromBytes(b[2], b[3], b[4], b[5]); - int key2 = Ints.fromBytes(b[6], b[7], b[8], b[9]); - int key3 = Ints.fromBytes(b[10], b[11], b[12], b[13]); - int key4 = Ints.fromBytes(b[14], b[15], b[16], b[17]); - int[] keys = new int[] - { - key1, key2, key3, key4 - }; - - logger.info("Xtea key is {} {} {} {}", key1, key2, key3, key4); - - clientInCipher = new RLISAACCipher(keys); - serverOutCipher = new RLISAACCipher(keys); - - for (int i = 0; i < 4; i++) - { - keys[i] += 50; - } - - clientOutCipher = new RLISAACCipher(keys); - serverInCipher = new RLISAACCipher(keys); - - // Following this is xtea encrypted data - int xteaDataLength = length - 4 - encrypedDataLength - 2; // total length - revision - rsa encrypted data - rsa encrypted data length - byte[] xteaData = new byte[xteaDataLength]; - len = in.read(xteaData); - assert len == xteaDataLength; - - ByteBuffer buffer = ByteBuffer.allocate(4096); - buffer.put((byte) gameState); - buffer.putShort((short) 0); // length - buffer.putInt(revision); - - buffer.putShort((short) reencrypted.length); - buffer.put(reencrypted); - buffer.put(xteaData); - - len = buffer.position(); - buffer.putShort(1, (short) (len - 3)); - serverOut.write(buffer.array(), 0, len); - - handshakeResponse = serverIn.read(); - logger.info("Handshake response: {}", handshakeResponse); - out.write(handshakeResponse); - - if (handshakeResponse != 2) - { - client.close(); - server.close(); - return; - } - - int isTrusted = serverIn.read(); - int trustedValue = serverIn.readInt(); - logger.info("is trusted value: {}", isTrusted); - assert isTrusted != 1; // if == 1 trustedValue is decrypted using the cipher - out.write(isTrusted); - out.writeInt(trustedValue); - - int permission = serverIn.read();//0 = player, 1 = player_mod, 2 = jagex_mod - int byte2 = serverIn.read();//some boolean, pushed onto intStack in script opcode 3323 - int interactingIndex = serverIn.readShort() & 0xffff;//index of player in server array - int worldType = serverIn.read();//0 = f2p, 1 = p2p, only used for checking friends/ignores list size - - logger.info("permission/B2/interactingIndex/worldType: {}/{}/{}/{}", permission, byte2, interactingIndex, worldType); - - out.write(permission); - out.write(byte2); - out.writeShort(interactingIndex); - out.write(worldType); - - int staticMapOpcode = readOpcode(serverInCipher, serverIn); - int packetLength = serverIn.readShort() & 0xffff; - - logger.info("staticMap opcode: {}", staticMapOpcode); - - writeOpcode(clientOutCipher, out, staticMapOpcode); - out.writeShort(packetLength); - - byte[] packetData = new byte[packetLength]; - len = serverIn.read(packetData); - assert len == packetData.length; - out.write(packetData); - - new IOCopy("Game C2S", in, serverOut).start(); - new PacketCopy("Game S2C", serverIn, out, serverInCipher, clientOutCipher).start(); - } - - public static int readOpcode(RLISAACCipher cipher, InputStream in) throws IOException - { - return (in.read() - cipher.nextInt()) & 0xff; - } - - public static void writeOpcode(RLISAACCipher cipher, OutputStream out, int opcode) throws IOException - { - byte encrytpedOpcode = (byte) (opcode + cipher.nextInt()); - out.write(encrytpedOpcode & 0xff); - } -} diff --git a/runelite-proxy/src/main/java/net/runelite/proxy/RLISAACCipher.java b/runelite-proxy/src/main/java/net/runelite/proxy/RLISAACCipher.java deleted file mode 100644 index 3750e85562..0000000000 --- a/runelite-proxy/src/main/java/net/runelite/proxy/RLISAACCipher.java +++ /dev/null @@ -1,174 +0,0 @@ -/* - * Copyright (c) 2017, Adam - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (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.proxy; - -import java.util.Arrays; - -/** - * Based off of the implementation from - * https://rosettacode.org/wiki/The_ISAAC_Cipher#Java Modified to not extend - * java.util.Random, and return results in reverse order - * - * @author Adam - */ -public class RLISAACCipher -{ - private final int[] randResult = new int[256]; // output of last generation - private int valuesLeft; // the number of values already left in randResult - - // internal generator state - private final int[] mm = new int[256]; - private int aa, bb, cc; - - public RLISAACCipher(int[] key) - { - init(key); - } - - private void generateMoreResults() - { - cc++; - bb += cc; - - for (int i = 0; i < 256; i++) - { - int x = mm[i]; - switch (i & 3) - { - case 0: - aa = aa ^ (aa << 13); - break; - case 1: - aa = aa ^ (aa >>> 6); - break; - case 2: - aa = aa ^ (aa << 2); - break; - case 3: - aa = aa ^ (aa >>> 16); - break; - } - aa = mm[i ^ 128] + aa; - int y = mm[i] = mm[(x >>> 2) & 0xFF] + aa + bb; - randResult[i] = bb = mm[(y >>> 10) & 0xFF] + x; - } - - valuesLeft = 256; - } - - private static void mix(int[] s) - { - s[0] ^= s[1] << 11; - s[3] += s[0]; - s[1] += s[2]; - s[1] ^= s[2] >>> 2; - s[4] += s[1]; - s[2] += s[3]; - s[2] ^= s[3] << 8; - s[5] += s[2]; - s[3] += s[4]; - s[3] ^= s[4] >>> 16; - s[6] += s[3]; - s[4] += s[5]; - s[4] ^= s[5] << 10; - s[7] += s[4]; - s[5] += s[6]; - s[5] ^= s[6] >>> 4; - s[0] += s[5]; - s[6] += s[7]; - s[6] ^= s[7] << 8; - s[1] += s[6]; - s[7] += s[0]; - s[7] ^= s[0] >>> 9; - s[2] += s[7]; - s[0] += s[1]; - } - - private void init(int[] seed) - { - if (seed != null && seed.length != 256) - { - seed = Arrays.copyOf(seed, 256); - } - aa = bb = cc = 0; - int[] initState = new int[8]; - Arrays.fill(initState, 0x9e3779b9); // the golden ratio - - for (int i = 0; i < 4; i++) - { - mix(initState); - } - - for (int i = 0; i < 256; i += 8) - { - if (seed != null) - { - for (int j = 0; j < 8; j++) - { - initState[j] += seed[i + j]; - } - } - - mix(initState); - for (int j = 0; j < 8; j++) - { - mm[i + j] = initState[j]; - } - } - - if (seed != null) - { - for (int i = 0; i < 256; i += 8) - { - for (int j = 0; j < 8; j++) - { - initState[j] += mm[i + j]; - } - - mix(initState); - - for (int j = 0; j < 8; j++) - { - mm[i + j] = initState[j]; - } - } - } - - valuesLeft = 0; // Make sure generateMoreResults() will be called by the next nextInt() call. - } - - public int nextInt() - { - if (valuesLeft == 0) - { - generateMoreResults(); - assert valuesLeft == 256; - } - - int value = randResult[--valuesLeft]; - - return value; - } -} diff --git a/runelite-proxy/src/main/java/net/runelite/proxy/RSA.java b/runelite-proxy/src/main/java/net/runelite/proxy/RSA.java deleted file mode 100644 index d284f8c181..0000000000 --- a/runelite-proxy/src/main/java/net/runelite/proxy/RSA.java +++ /dev/null @@ -1,99 +0,0 @@ -/* - * Copyright (c) 2017, Adam - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (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.proxy; - -import java.math.BigInteger; -import java.util.Random; - -public class RSA -{ - private final BigInteger e = Proxy.SERVER_RSA_KEY_EXPONENT; // Use same exponent as server - private final BigInteger n; - private final BigInteger d; - - public RSA() - { - // This taken from http://stackoverflow.com/a/24547249 - int keySize = Proxy.SERVER_RSA_KEY_MODULUS.bitLength(); // pick same key size as server - - //SecureRandom random = new SecureRandom(); - Random random = new Random(42); // Hack to make the modulus always the same - - // Choose two distinct prime numbers p and q. - BigInteger p = BigInteger.probablePrime(keySize / 2, random); - BigInteger q = BigInteger.probablePrime(keySize / 2, random); - // Compute n = pq (modulus) - n = p.multiply(q); - // Compute φ(n) = φ(p)φ(q) = (p − 1)(q − 1) = n - (p + q -1), where φ is Euler's totient function. - // and choose an integer e such that 1 < e < φ(n) and gcd(e, φ(n)) = 1; i.e., e and φ(n) are coprime. - BigInteger m = (p.subtract(BigInteger.ONE)).multiply(q.subtract(BigInteger.ONE)); - assert m.gcd(e).equals(BigInteger.ONE); // We always pick SERVER_RSA_KEY_EXPONENT instead - // Determine d as d ≡ e−1 (mod φ(n)); i.e., d is the multiplicative inverse of e (modulo φ(n)). - d = e.modInverse(m); - } - - public RSA(BigInteger n, BigInteger d) - { - this.n = n; - this.d = d; - } - - public BigInteger encrypt(BigInteger value) - { - // C = P**e % n - return value.modPow(e, n); - } - - public BigInteger decrypt(BigInteger value) - { - // P = C**d % n - return value.modPow(d, n); - } - - public byte[] encrypt(byte[] value) - { - return encrypt(new BigInteger(value)).toByteArray(); - } - - public byte[] decrypt(byte[] value) - { - return decrypt(new BigInteger(value)).toByteArray(); - } - - public BigInteger getE() - { - return e; - } - - public BigInteger getN() - { - return n; - } - - public BigInteger getD() - { - return d; - } -} diff --git a/runelite-proxy/src/test/java/net/runelite/proxy/RSATest.java b/runelite-proxy/src/test/java/net/runelite/proxy/RSATest.java deleted file mode 100644 index e58877ff08..0000000000 --- a/runelite-proxy/src/test/java/net/runelite/proxy/RSATest.java +++ /dev/null @@ -1,45 +0,0 @@ -/* - * Copyright (c) 2017, Adam - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (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.proxy; - -import java.math.BigInteger; -import org.junit.Assert; -import org.junit.Test; - -public class RSATest -{ - - @Test - public void testSomeMethod() - { - RSA rsa = new RSA(); - - BigInteger C = rsa.encrypt(BigInteger.valueOf(42)); - int value = rsa.decrypt(C).intValue(); - - Assert.assertEquals(42, value); - } - -}