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 8c4d98748..294decdac 100644 --- a/src/main/java/emu/grasscutter/server/http/dispatch/RegionHandler.java +++ b/src/main/java/emu/grasscutter/server/http/dispatch/RegionHandler.java @@ -154,8 +154,12 @@ public final class RegionHandler implements Router { } String key_id = ctx.queryParam("key_id"); + + if(key_id == null) + throw new Exception("Key ID was not set"); + Cipher cipher = Cipher.getInstance("RSA/ECB/PKCS1Padding"); - cipher.init(Cipher.ENCRYPT_MODE, key_id.equals("3") ? Crypto.CUR_OS_ENCRYPT_KEY : Crypto.CUR_CN_ENCRYPT_KEY); + cipher.init(Cipher.ENCRYPT_MODE, Crypto.EncryptionKeys.get(Integer.valueOf(key_id))); var regionInfo = Utils.base64Decode(event.getRegionInfo()); //Encrypt regionInfo in chunks 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 5c26eb452..89ed855fc 100644 --- a/src/main/java/emu/grasscutter/server/packet/recv/HandlerGetPlayerTokenReq.java +++ b/src/main/java/emu/grasscutter/server/packet/recv/HandlerGetPlayerTokenReq.java @@ -114,8 +114,7 @@ public class HandlerGetPlayerTokenReq extends PacketHandler { .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); + cipher.init(Cipher.ENCRYPT_MODE, Crypto.EncryptionKeys.get(req.getKeyId())); var seed_encrypted = cipher.doFinal(seed_bytes); Signature privateSignature = Signature.getInstance("SHA256withRSA"); diff --git a/src/main/java/emu/grasscutter/utils/Crypto.java b/src/main/java/emu/grasscutter/utils/Crypto.java index 1ed4fd1bf..2ef25e5a9 100644 --- a/src/main/java/emu/grasscutter/utils/Crypto.java +++ b/src/main/java/emu/grasscutter/utils/Crypto.java @@ -6,6 +6,8 @@ import java.security.PublicKey; import java.security.SecureRandom; import java.security.spec.PKCS8EncodedKeySpec; import java.security.spec.X509EncodedKeySpec; +import java.util.Map; +import java.util.HashMap; import emu.grasscutter.Grasscutter; @@ -19,10 +21,10 @@ public final class Crypto { public static long ENCRYPT_SEED = Long.parseUnsignedLong("11468049314633205968"); public static byte[] ENCRYPT_SEED_BUFFER = new byte[0]; - public static PublicKey CUR_OS_ENCRYPT_KEY; - public static PublicKey CUR_CN_ENCRYPT_KEY; public static PrivateKey CUR_SIGNING_KEY; + public static Map EncryptionKeys = new HashMap<>(); + public static void loadKeys() { DISPATCH_KEY = FileUtils.readResource("/keys/dispatchKey.bin"); DISPATCH_SEED = FileUtils.readResource("/keys/dispatchSeed.bin"); @@ -31,15 +33,17 @@ public final class Crypto { ENCRYPT_SEED_BUFFER = FileUtils.readResource("/keys/secretKeyBuffer.bin"); try { - //These should be loaded from ChannelConfig_whatever.json CUR_SIGNING_KEY = KeyFactory.getInstance("RSA") .generatePrivate(new PKCS8EncodedKeySpec(FileUtils.readResource("/keys/SigningKey.der"))); - CUR_OS_ENCRYPT_KEY = KeyFactory.getInstance("RSA") - .generatePublic(new X509EncodedKeySpec(FileUtils.readResource("/keys/OSCB_Pub.der"))); + var CNRelSign = KeyFactory.getInstance("RSA") + .generatePublic(new X509EncodedKeySpec(FileUtils.readResource("/keys/CNRel_Pub.der"))); - CUR_CN_ENCRYPT_KEY = KeyFactory.getInstance("RSA") - .generatePublic(new X509EncodedKeySpec(FileUtils.readResource("/keys/OSCN_Pub.der"))); + var OSRelSign = KeyFactory.getInstance("RSA") + .generatePublic(new X509EncodedKeySpec(FileUtils.readResource("/keys/OSRel_Pub.der"))); + + EncryptionKeys.put(2, CNRelSign); + EncryptionKeys.put(3, OSRelSign); } catch (Exception e) { Grasscutter.getLogger().error("An error occurred while loading keys.", e); diff --git a/src/main/resources/keys/OSCN.pem b/src/main/resources/keys/CNRel.pem similarity index 100% rename from src/main/resources/keys/OSCN.pem rename to src/main/resources/keys/CNRel.pem diff --git a/src/main/resources/keys/OSCN_Pub.der b/src/main/resources/keys/CNRel_Pub.der similarity index 100% rename from src/main/resources/keys/OSCN_Pub.der rename to src/main/resources/keys/CNRel_Pub.der diff --git a/src/main/resources/keys/OSCB.pem b/src/main/resources/keys/OSRel.pem similarity index 100% rename from src/main/resources/keys/OSCB.pem rename to src/main/resources/keys/OSRel.pem diff --git a/src/main/resources/keys/OSCB_Pub.der b/src/main/resources/keys/OSRel_Pub.der similarity index 100% rename from src/main/resources/keys/OSCB_Pub.der rename to src/main/resources/keys/OSRel_Pub.der