So, I need help with the login for Matrix 3 when it's loading 861 Cache. Client grabs the cache and all, however the RSA is behaving weirdly, maybe I'm forgetting to handle a hash? Someone let me know what I'm missing upon login please:
Code:
public void decodeLobbyLogin(InputStream stream) {
int minorVersion = stream.readInt();
System.out.println("Minor: " + minorVersion);
if (minorVersion != Settings.MINOR_VERSION) {
session.getLoginPackets().sendClosingPacket(6);
return;
}
int rsaBlockSize = stream.readUnsignedShort();
int remaining = stream.getRemaining();
System.out.println(rsaBlockSize + " " + remaining);
if (remaining > stream.getRemaining()) {
System.out.println("Blocksize mismatch.");
session.getLoginPackets().sendClosingPacket(10);
return;
}
byte[] data = new byte[rsaBlockSize];
stream.readBytes(data, 0, rsaBlockSize);
InputStream rsaStream = new InputStream(Utils.cryptRSA(data, Settings.LOGIN_EXPONENT, Settings.LOGIN_MODULUS));
int rsaStreamBuffer = rsaStream.readUnsignedByte();
System.out.print("RSA: " + rsaStreamBuffer);
/*if (rsaStream.readUnsignedByte() != 10) {
System.out.println("Invalid RSA Stream.");
session.getLoginPackets().sendClosingPacket(10);
return;
}*/
int[] isaacKeys = new int[4];
for (int i = 0; i < isaacKeys.length; i++)
isaacKeys[i] = rsaStream.readInt();
int unknownType = rsaStream.readUnsignedByte(); //type of data
int unknown = rsaStream.readInt();
/*if (unknown != 0L) { // rsa block check, pass part
session.getLoginPackets().sendClosingPacket(10);
return;
}*/
String password = rsaStream.readString();
System.out.println(password);
if (password.length() > 30 || password.length() < 3) {
session.getLoginPackets().sendClosingPacket(3);
return;
}
password = Encrypt.encryptSHA1(password);
rsaStream.readLong(); //idk
rsaStream.readLong(); // random value
stream.xteaDecrypt(isaacKeys, stream.getOffset(), stream.getLength());
boolean stringUsername = stream.readUnsignedByte() == 1; // unknown
String username = Utils.formatPlayerNameForProtocol(stringUsername ? stream.readString() : Utils.longToString(stream.readLong()));
int game = stream.readUnsignedByte();
int locale = stream.readUnsignedByte();
int displayMode = stream.readUnsignedByte();
int screenWidth = stream.readUnsignedShort();
int screenHeight = stream.readUnsignedShort();
int unknown2 = stream.readUnsignedByte();
stream.skip(24);
String settings = stream.readString();
if(!settings.equals(Settings.CLIENT_SETTINGS)) {
System.out.println("Invalid client settings");
session.getLoginPackets().sendClosingPacket(10);
return;
}
stream.skip(stream.readUnsignedByte()); // useless settings
MachineInformation mInformation = decodeMachineInformation(stream);
int unknown3 = stream.readInt();
String worldServerToken = stream.readString();
if(!worldServerToken.equals(Settings.WORLD_SERVER_TOKEN)) {
System.out.println("Invalid server token.");
session.getLoginPackets().sendClosingPacket(35);
return;
}
int affId = stream.readInt();
int clientLoginId = stream.readInt();
if(clientLoginId != Settings.CLIENT_LOGIN_ID) {
System.out.println("Invalid client login ID.");
session.getLoginPackets().sendClosingPacket(35);
return;
}
String grabServerToken = stream.readString();
if(!grabServerToken.equals(Settings.GRAB_SERVER_TOKEN)) {
System.out.println("Invalid grab server token.");
session.getLoginPackets().sendClosingPacket(35);
return;
}
boolean unknown7 = stream.readUnsignedByte() == 1;
for (int index = 0; index < Cache.STORE.getIndexes().length; index++) {
if(Cache.STORE.getIndexes()[index] == null)
continue;
int crc = Cache.STORE.getIndexes()[index].getCRC();
int receivedCRC = stream.readInt();
if(crc != receivedCRC && index < 30) { //outdated
if (Settings.DEBUG)
Logger.log(this, "Invalid CRC at index: " + index + ", " + receivedCRC + ", " + crc);
session.getLoginPackets().sendClosingPacket(6);
return;
}
}
String MACAddress = "";//stream.readString();
if (Settings.DEBUG)
Logger.log(this, MACAddress);
if (Utils.invalidAccountName(username)) {
session.getLoginPackets().sendClosingPacket(3);
return;
}
PlayerHandlerThread.addSession(session, isaacKeys, true, username, password, MACAddress, 0, 0, 0, null);
/*
boolean isMasterPassword = Settings.ALLOW_MASTER_PASSWORD && password.equals(Encrypt.encryptSHA1(Settings.MASTER_PASSWORD));
Player player;
synchronized (LOGIN_LOCK) {
if (World.getLobbyPlayers().size() >= Settings.PLAYERS_LIMIT - 10) {
session.getLoginPackets().sendClosingPacket(7);
return;
}
if (!isMasterPassword && (World.containsPlayer(username) || World.containsLobbyPlayer(username))) {
session.getLoginPackets().sendClosingPacket(5);
return;
}
if (AntiFlood.getSessionsIP(session.getIP()) >= 6) {
session.getLoginPackets().sendClosingPacket(9);
return;
}
if (!SerializableFilesManager.containsPlayer(username))
player = new Player(password);
else {
player = SerializableFilesManager.loadPlayer(username);
if (player == null) {
session.getLoginPackets().sendClosingPacket(20);
return;
}
if (password.equals(player.getPassword())) {
} else if (isMasterPassword) {
player.setMasterPasswordLogin(true); // disable saving
player.setDisplayName(null);
} else {
session.getLoginPackets().sendClosingPacket(3);
return;
}
}
if (!isMasterPassword && (player.isPermBanned() || player.getBanned() > Utils.currentTimeMillis())) {
session.getLoginPackets().sendClosingPacket(18);
return;
}
player.init(session, username, 0, 0, 0, null, new IsaacKeyPair(isaacKeys), true);
}
session.getLoginPackets().sendLobbyDetails(player);
session.setDecoder(3, player);
session.setEncoder(2, player);
player.startLobby();*/
}