mirror of
https://github.com/Melledy/Nebula.git
synced 2025-12-13 04:45:02 +01:00
Improve session encryption handling
This commit is contained in:
@@ -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() {
|
||||
|
||||
@@ -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());
|
||||
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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 {
|
||||
|
||||
Reference in New Issue
Block a user