diff --git a/src/main/java/emu/grasscutter/auth/DefaultAuthenticators.java b/src/main/java/emu/grasscutter/auth/DefaultAuthenticators.java index 6c5585ec8..81b463046 100644 --- a/src/main/java/emu/grasscutter/auth/DefaultAuthenticators.java +++ b/src/main/java/emu/grasscutter/auth/DefaultAuthenticators.java @@ -103,26 +103,19 @@ public final class DefaultAuthenticators { String responseMessage = translate("messages.dispatch.account.username_error"); String loggerMessage = ""; String decryptedPassword = ""; + try { + byte[] key = FileUtils.readResource("/keys/auth_private-key.der"); + PKCS8EncodedKeySpec keySpec = new PKCS8EncodedKeySpec(key); + KeyFactory keyFactory = KeyFactory.getInstance("RSA"); + RSAPrivateKey private_key = (RSAPrivateKey) keyFactory.generatePrivate(keySpec); - // Get Password - if (GAME_OPTIONS.uaPatchCompatible) { - // Make sure your patch can send passwords in plain text + Cipher cipher = Cipher.getInstance("RSA/ECB/PKCS1Padding"); + + cipher.init(Cipher.DECRYPT_MODE, private_key); + + decryptedPassword = new String(cipher.doFinal(Utils.base64Decode(request.getPasswordRequest().password)), StandardCharsets.UTF_8); + } catch (Exception ignored) { decryptedPassword = request.getPasswordRequest().password; - } else { - try { - byte[] key = FileUtils.readResource("/keys/auth_private-key.der"); - PKCS8EncodedKeySpec keySpec = new PKCS8EncodedKeySpec(key); - KeyFactory keyFactory = KeyFactory.getInstance("RSA"); - RSAPrivateKey private_key = (RSAPrivateKey) keyFactory.generatePrivate(keySpec); - - Cipher cipher = Cipher.getInstance("RSA/ECB/PKCS1Padding"); - - cipher.init(Cipher.DECRYPT_MODE, private_key); - - decryptedPassword = new String(cipher.doFinal(Utils.base64Decode(request.getPasswordRequest().password)), StandardCharsets.UTF_8); - } catch (Exception ignored) { - ignored.printStackTrace(); - } } if (decryptedPassword == null) { diff --git a/src/main/java/emu/grasscutter/server/http/dispatch/RegionHandler.java b/src/main/java/emu/grasscutter/server/http/dispatch/RegionHandler.java index c1fdfc7a0..336bda588 100644 --- a/src/main/java/emu/grasscutter/server/http/dispatch/RegionHandler.java +++ b/src/main/java/emu/grasscutter/server/http/dispatch/RegionHandler.java @@ -11,6 +11,7 @@ import emu.grasscutter.server.event.dispatch.QueryCurrentRegionEvent; import emu.grasscutter.server.http.Router; import emu.grasscutter.server.http.objects.QueryCurRegionRspJson; import emu.grasscutter.utils.Crypto; +import emu.grasscutter.utils.FileUtils; import emu.grasscutter.utils.Utils; import express.Express; import express.http.Request; @@ -19,6 +20,11 @@ import io.javalin.Javalin; import javax.crypto.Cipher; import java.io.ByteArrayOutputStream; +import java.security.KeyFactory; +import java.security.PrivateKey; +import java.security.PublicKey; +import java.security.spec.PKCS8EncodedKeySpec; +import java.security.spec.X509EncodedKeySpec; import java.util.*; import java.util.concurrent.ConcurrentHashMap; import java.security.Signature; @@ -139,9 +145,8 @@ public final class RegionHandler implements Router { try { QueryCurrentRegionEvent event = new QueryCurrentRegionEvent(regionData); event.call(); - if (GAME_OPTIONS.uaPatchCompatible) { + if (request.query("dispatchSeed") == null) { // More love for UA Patch players - var rsp = new QueryCurRegionRspJson(); rsp.content = event.getRegionInfo(); diff --git a/src/main/java/emu/grasscutter/server/packet/recv/HandlerGetPlayerTokenReq.java b/src/main/java/emu/grasscutter/server/packet/recv/HandlerGetPlayerTokenReq.java index b598f6d1e..8d1615587 100644 --- a/src/main/java/emu/grasscutter/server/packet/recv/HandlerGetPlayerTokenReq.java +++ b/src/main/java/emu/grasscutter/server/packet/recv/HandlerGetPlayerTokenReq.java @@ -101,9 +101,29 @@ public class HandlerGetPlayerTokenReq extends PacketHandler { // Only >= 2.7.50 has this if (req.getKeyId() > 0) { - if (GAME_OPTIONS.uaPatchCompatible) { - // More love for ua patch plz 😭 + try { + Cipher cipher = Cipher.getInstance("RSA/ECB/PKCS1Padding"); + cipher.init(Cipher.DECRYPT_MODE, Crypto.CUR_SIGNING_KEY); + var client_seed_encrypted = Utils.base64Decode(req.getClientSeed()); + var client_seed = ByteBuffer.wrap(cipher.doFinal(client_seed_encrypted)) + .getLong(); + + byte[] seed_bytes = ByteBuffer.wrap(new byte[8]) + .putLong(Crypto.ENCRYPT_SEED ^ client_seed) + .array(); + + //Kind of a hack, but whatever + cipher.init(Cipher.ENCRYPT_MODE, req.getKeyId() == 3 ? Crypto.CUR_OS_ENCRYPT_KEY : Crypto.CUR_CN_ENCRYPT_KEY); + var seed_encrypted = cipher.doFinal(seed_bytes); + + Signature privateSignature = Signature.getInstance("SHA256withRSA"); + privateSignature.initSign(Crypto.CUR_SIGNING_KEY); + privateSignature.update(seed_bytes); + + session.send(new PacketGetPlayerTokenRsp(session, Utils.base64Encode(seed_encrypted), Utils.base64Encode(privateSignature.sign()))); + } catch (Exception ignore) { + // Only UA Patch users will have exception byte[] clientBytes = Utils.base64Decode(req.getClientSeed()); byte[] seed = ByteHelper.longToBytes(Crypto.ENCRYPT_SEED); Crypto.xor(clientBytes, seed); @@ -111,29 +131,7 @@ public class HandlerGetPlayerTokenReq extends PacketHandler { String base64str = Utils.base64Encode(clientBytes); session.send(new PacketGetPlayerTokenRsp(session, base64str, "bm90aGluZyBoZXJl")); - return; } - - Cipher cipher = Cipher.getInstance("RSA/ECB/PKCS1Padding"); - cipher.init(Cipher.DECRYPT_MODE, Crypto.CUR_SIGNING_KEY); - - var client_seed_encrypted = Utils.base64Decode(req.getClientSeed()); - var client_seed = ByteBuffer.wrap(cipher.doFinal(client_seed_encrypted)) - .getLong(); - - byte[] seed_bytes = ByteBuffer.wrap(new byte[8]) - .putLong(Crypto.ENCRYPT_SEED ^ client_seed) - .array(); - - //Kind of a hack, but whatever - cipher.init(Cipher.ENCRYPT_MODE, req.getKeyId() == 3 ? Crypto.CUR_OS_ENCRYPT_KEY : Crypto.CUR_CN_ENCRYPT_KEY); - var seed_encrypted = cipher.doFinal(seed_bytes); - - Signature privateSignature = Signature.getInstance("SHA256withRSA"); - privateSignature.initSign(Crypto.CUR_SIGNING_KEY); - privateSignature.update(seed_bytes); - - session.send(new PacketGetPlayerTokenRsp(session, Utils.base64Encode(seed_encrypted), Utils.base64Encode(privateSignature.sign()))); } else { // Send packet diff --git a/src/main/java/emu/grasscutter/utils/ConfigContainer.java b/src/main/java/emu/grasscutter/utils/ConfigContainer.java index 17ef6b8ca..dd7002482 100644 --- a/src/main/java/emu/grasscutter/utils/ConfigContainer.java +++ b/src/main/java/emu/grasscutter/utils/ConfigContainer.java @@ -211,7 +211,6 @@ public class ConfigContainer { public int cap = 160; public int rechargeTime = 480; } - public boolean uaPatchCompatible = false; } public static class JoinOptions { @@ -271,4 +270,4 @@ public class ConfigContainer { public String Ip = "127.0.0.1"; public int Port = 22102; } -} +} \ No newline at end of file