mirror of
https://github.com/Melledy/Nebula.git
synced 2026-09-19 17:19:58 +02: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.account.AccountHelper;
|
||||||
import emu.nebula.game.player.Player;
|
import emu.nebula.game.player.Player;
|
||||||
import emu.nebula.util.AeadHelper;
|
import emu.nebula.util.AeadHelper;
|
||||||
|
import emu.nebula.util.Utils;
|
||||||
import lombok.Getter;
|
import lombok.Getter;
|
||||||
import us.hebi.quickbuf.RepeatedByte;
|
import us.hebi.quickbuf.RepeatedByte;
|
||||||
|
|
||||||
@@ -22,6 +23,7 @@ public class GameSession {
|
|||||||
private Player player;
|
private Player player;
|
||||||
|
|
||||||
// Crypto
|
// Crypto
|
||||||
|
private int encryptMethod; // 0 = gcm, 1 = chacha20
|
||||||
private byte[] clientPublicKey;
|
private byte[] clientPublicKey;
|
||||||
private byte[] serverPublicKey;
|
private byte[] serverPublicKey;
|
||||||
private byte[] serverPrivateKey;
|
private byte[] serverPrivateKey;
|
||||||
@@ -75,6 +77,7 @@ public class GameSession {
|
|||||||
|
|
||||||
public void calculateKey() {
|
public void calculateKey() {
|
||||||
this.key = AeadHelper.generateKey(clientPublicKey, serverPublicKey, serverPrivateKey);
|
this.key = AeadHelper.generateKey(clientPublicKey, serverPublicKey, serverPrivateKey);
|
||||||
|
this.encryptMethod = Utils.randomRange(0, 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
public String generateToken() {
|
public String generateToken() {
|
||||||
|
|||||||
@@ -44,7 +44,7 @@ public class HandlerIkeReq extends NetHandler {
|
|||||||
// Create response
|
// Create response
|
||||||
var rsp = IKEResp.newInstance()
|
var rsp = IKEResp.newInstance()
|
||||||
.setToken(session.getToken())
|
.setToken(session.getToken())
|
||||||
.setCipher(1) // 0 = gcm, 1 = chacha20
|
.setCipher(session.getEncryptMethod())
|
||||||
.setServerTs(Nebula.getCurrentTime())
|
.setServerTs(Nebula.getCurrentTime())
|
||||||
.setPubKey(session.getServerPublicKey());
|
.setPubKey(session.getServerPublicKey());
|
||||||
|
|
||||||
|
|||||||
@@ -38,6 +38,7 @@ public class AgentZoneHandler implements Handler {
|
|||||||
|
|
||||||
byte[] sessionKey = AeadHelper.serverGarbleKey;
|
byte[] sessionKey = AeadHelper.serverGarbleKey;
|
||||||
boolean hasKey3 = false;
|
boolean hasKey3 = false;
|
||||||
|
int encryptMethod = 0;
|
||||||
|
|
||||||
// Get token
|
// Get token
|
||||||
String token = ctx.header("X-Token");
|
String token = ctx.header("X-Token");
|
||||||
@@ -59,6 +60,7 @@ public class AgentZoneHandler implements Handler {
|
|||||||
|
|
||||||
// Set key
|
// Set key
|
||||||
sessionKey = session.getKey();
|
sessionKey = session.getKey();
|
||||||
|
encryptMethod = session.getEncryptMethod();
|
||||||
hasKey3 = true;
|
hasKey3 = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -80,7 +82,7 @@ public class AgentZoneHandler implements Handler {
|
|||||||
|
|
||||||
// Decrypt message
|
// Decrypt message
|
||||||
if (hasKey3) {
|
if (hasKey3) {
|
||||||
message = AeadHelper.decryptChaCha(message, sessionKey);
|
message = AeadHelper.decrypt(message, sessionKey, encryptMethod);
|
||||||
offset = 10;
|
offset = 10;
|
||||||
} else {
|
} else {
|
||||||
message = AeadHelper.decryptBasic(message, sessionKey);
|
message = AeadHelper.decryptBasic(message, sessionKey);
|
||||||
@@ -150,7 +152,7 @@ public class AgentZoneHandler implements Handler {
|
|||||||
|
|
||||||
// Encrypt
|
// Encrypt
|
||||||
if (hasKey3) {
|
if (hasKey3) {
|
||||||
result = AeadHelper.encryptChaCha(result, sessionKey);
|
result = AeadHelper.encrypt(result, sessionKey, encryptMethod);
|
||||||
} else {
|
} else {
|
||||||
result = AeadHelper.encryptGCM(result, sessionKey);
|
result = AeadHelper.encryptGCM(result, sessionKey);
|
||||||
result = AeadHelper.encryptBasic(result, sessionKey);
|
result = AeadHelper.encryptBasic(result, sessionKey);
|
||||||
|
|||||||
@@ -36,6 +36,24 @@ public class AeadHelper {
|
|||||||
return iv;
|
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
|
// AES CBC
|
||||||
|
|
||||||
public static byte[] encryptCBC(byte[] messageData) throws Exception {
|
public static byte[] encryptCBC(byte[] messageData) throws Exception {
|
||||||
|
|||||||
Reference in New Issue
Block a user