Improve session encryption handling

This commit is contained in:
Melledy
2025-10-30 01:01:21 -07:00
parent ebc48ab955
commit 89ecd29761
4 changed files with 26 additions and 3 deletions

View File

@@ -12,6 +12,7 @@ import emu.nebula.game.account.Account;
import emu.nebula.game.account.AccountHelper;
import emu.nebula.game.player.Player;
import emu.nebula.util.AeadHelper;
import emu.nebula.util.Utils;
import lombok.Getter;
import us.hebi.quickbuf.RepeatedByte;
@@ -22,6 +23,7 @@ public class GameSession {
private Player player;
// Crypto
private int encryptMethod; // 0 = gcm, 1 = chacha20
private byte[] clientPublicKey;
private byte[] serverPublicKey;
private byte[] serverPrivateKey;
@@ -75,6 +77,7 @@ public class GameSession {
public void calculateKey() {
this.key = AeadHelper.generateKey(clientPublicKey, serverPublicKey, serverPrivateKey);
this.encryptMethod = Utils.randomRange(0, 1);
}
public String generateToken() {

View File

@@ -44,7 +44,7 @@ public class HandlerIkeReq extends NetHandler {
// Create response
var rsp = IKEResp.newInstance()
.setToken(session.getToken())
.setCipher(1) // 0 = gcm, 1 = chacha20
.setCipher(session.getEncryptMethod())
.setServerTs(Nebula.getCurrentTime())
.setPubKey(session.getServerPublicKey());

View File

@@ -38,6 +38,7 @@ public class AgentZoneHandler implements Handler {
byte[] sessionKey = AeadHelper.serverGarbleKey;
boolean hasKey3 = false;
int encryptMethod = 0;
// Get token
String token = ctx.header("X-Token");
@@ -59,6 +60,7 @@ public class AgentZoneHandler implements Handler {
// Set key
sessionKey = session.getKey();
encryptMethod = session.getEncryptMethod();
hasKey3 = true;
}
@@ -80,7 +82,7 @@ public class AgentZoneHandler implements Handler {
// Decrypt message
if (hasKey3) {
message = AeadHelper.decryptChaCha(message, sessionKey);
message = AeadHelper.decrypt(message, sessionKey, encryptMethod);
offset = 10;
} else {
message = AeadHelper.decryptBasic(message, sessionKey);
@@ -150,7 +152,7 @@ public class AgentZoneHandler implements Handler {
// Encrypt
if (hasKey3) {
result = AeadHelper.encryptChaCha(result, sessionKey);
result = AeadHelper.encrypt(result, sessionKey, encryptMethod);
} else {
result = AeadHelper.encryptGCM(result, sessionKey);
result = AeadHelper.encryptBasic(result, sessionKey);

View File

@@ -36,6 +36,24 @@ public class AeadHelper {
return iv;
}
//
public static byte[] encrypt(byte[] data, byte[] sessionKey, int method) throws Exception {
if (method == 1) {
return encryptChaCha(data, sessionKey);
} else {
return encryptGCM(data, sessionKey);
}
}
public static byte[] decrypt(byte[] data, byte[] sessionKey, int method) throws Exception {
if (method == 1) {
return decryptChaCha(data, sessionKey);
} else {
return decryptGCM(data, sessionKey);
}
}
// AES CBC
public static byte[] encryptCBC(byte[] messageData) throws Exception {