mirror of
https://github.com/ViaVersion/ViaProxy.git
synced 2024-10-02 04:57:35 +02:00
Fixed 1.19+ clients not being able to join 1.3+ servers when encryption is enabled
This commit is contained in:
parent
8d10f9956d
commit
e0aeb095f7
@ -5,7 +5,9 @@ import com.github.steveice10.mc.auth.util.UUIDSerializer;
|
|||||||
import io.netty.buffer.ByteBuf;
|
import io.netty.buffer.ByteBuf;
|
||||||
import io.netty.buffer.Unpooled;
|
import io.netty.buffer.Unpooled;
|
||||||
import net.raphimc.netminecraft.packet.PacketTypes;
|
import net.raphimc.netminecraft.packet.PacketTypes;
|
||||||
import net.raphimc.netminecraft.packet.impl.login.*;
|
import net.raphimc.netminecraft.packet.impl.login.C2SLoginHelloPacket1_19_3;
|
||||||
|
import net.raphimc.netminecraft.packet.impl.login.C2SLoginHelloPacket1_7;
|
||||||
|
import net.raphimc.netminecraft.packet.impl.login.C2SLoginKeyPacket1_19;
|
||||||
import net.raphimc.viaproxy.cli.options.Options;
|
import net.raphimc.viaproxy.cli.options.Options;
|
||||||
import net.raphimc.viaproxy.protocolhack.providers.ViaProxyGameProfileFetcher;
|
import net.raphimc.viaproxy.protocolhack.providers.ViaProxyGameProfileFetcher;
|
||||||
import net.raphimc.viaproxy.util.LocalSocketClient;
|
import net.raphimc.viaproxy.util.LocalSocketClient;
|
||||||
@ -13,13 +15,17 @@ import net.raphimc.viaproxy.util.logging.Logger;
|
|||||||
|
|
||||||
import java.math.BigInteger;
|
import java.math.BigInteger;
|
||||||
import java.nio.charset.StandardCharsets;
|
import java.nio.charset.StandardCharsets;
|
||||||
import java.security.*;
|
import java.security.KeyFactory;
|
||||||
|
import java.security.NoSuchAlgorithmException;
|
||||||
|
import java.security.PublicKey;
|
||||||
import java.security.spec.InvalidKeySpecException;
|
import java.security.spec.InvalidKeySpecException;
|
||||||
import java.security.spec.X509EncodedKeySpec;
|
import java.security.spec.X509EncodedKeySpec;
|
||||||
import java.time.Instant;
|
import java.time.Instant;
|
||||||
import java.util.Base64;
|
import java.util.Base64;
|
||||||
import java.util.UUID;
|
import java.util.UUID;
|
||||||
import java.util.concurrent.*;
|
import java.util.concurrent.ExecutionException;
|
||||||
|
import java.util.concurrent.TimeUnit;
|
||||||
|
import java.util.concurrent.TimeoutException;
|
||||||
|
|
||||||
public class ExternalInterface {
|
public class ExternalInterface {
|
||||||
|
|
||||||
@ -99,13 +105,12 @@ public class ExternalInterface {
|
|||||||
Logger.u_info("auth", proxyConnection.getC2P().remoteAddress(), proxyConnection.getGameProfile(), "Requesting nonce signature");
|
Logger.u_info("auth", proxyConnection.getC2P().remoteAddress(), proxyConnection.getGameProfile(), "Requesting nonce signature");
|
||||||
if (Options.OPENAUTHMOD_AUTH) {
|
if (Options.OPENAUTHMOD_AUTH) {
|
||||||
try {
|
try {
|
||||||
final ByteBuf response = proxyConnection.sendCustomPayload(OPENAUTHMOD_SIGN_NONCE_CHANNEL, PacketTypes.writeByteArray(Unpooled.buffer(), nonce)).get(4, TimeUnit.SECONDS);
|
final ByteBuf response = proxyConnection.sendCustomPayload(OPENAUTHMOD_SIGN_NONCE_CHANNEL, PacketTypes.writeByteArray(Unpooled.buffer(), nonce)).get(5, TimeUnit.SECONDS);
|
||||||
if (response == null) throw new TimeoutException();
|
if (response == null) throw new TimeoutException();
|
||||||
if (!response.readBoolean()) throw new TimeoutException();
|
if (!response.readBoolean()) throw new TimeoutException();
|
||||||
packet.salt = response.readLong();
|
packet.salt = response.readLong();
|
||||||
packet.signature = PacketTypes.readByteArray(response);
|
packet.signature = PacketTypes.readByteArray(response);
|
||||||
} catch (TimeoutException e) {
|
} catch (TimeoutException ignored) {
|
||||||
proxyConnection.kickClient("§cAuthentication cancelled! You need to install OpenAuthMod in order to join this server.");
|
|
||||||
}
|
}
|
||||||
} else if (Options.LOCAL_SOCKET_AUTH) {
|
} else if (Options.LOCAL_SOCKET_AUTH) {
|
||||||
final String[] response = new LocalSocketClient(48941).request("sign_nonce", Base64.getEncoder().encodeToString(nonce));
|
final String[] response = new LocalSocketClient(48941).request("sign_nonce", Base64.getEncoder().encodeToString(nonce));
|
||||||
@ -114,9 +119,6 @@ public class ExternalInterface {
|
|||||||
packet.signature = Base64.getDecoder().decode(response[2]);
|
packet.signature = Base64.getDecoder().decode(response[2]);
|
||||||
}
|
}
|
||||||
} else if (Options.MC_ACCOUNT != null) { // TODO: Key
|
} else if (Options.MC_ACCOUNT != null) { // TODO: Key
|
||||||
proxyConnection.kickClient("§cJoining servers which requires a signed nonce is not yet supported.");
|
|
||||||
} else {
|
|
||||||
proxyConnection.kickClient("§cThis server is in online mode and requires a valid authentication mode.");
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -85,7 +85,7 @@ public class Proxy2ServerHandler extends SimpleChannelInboundHandler<IPacket> {
|
|||||||
final byte[] encryptedNonce = CryptUtil.encryptData(publicKey, packet.nonce);
|
final byte[] encryptedNonce = CryptUtil.encryptData(publicKey, packet.nonce);
|
||||||
|
|
||||||
final C2SLoginKeyPacket1_19_3 loginKey = new C2SLoginKeyPacket1_19_3(encryptedSecretKey, encryptedNonce);
|
final C2SLoginKeyPacket1_19_3 loginKey = new C2SLoginKeyPacket1_19_3(encryptedSecretKey, encryptedNonce);
|
||||||
if (this.proxyConnection.getLoginHelloPacket() instanceof C2SLoginHelloPacket1_19 && ((C2SLoginHelloPacket1_19) this.proxyConnection.getLoginHelloPacket()).key != null) {
|
if (this.proxyConnection.getServerVersion().isNewerThanOrEqualTo(VersionEnum.r1_19) && this.proxyConnection.getLoginHelloPacket() instanceof C2SLoginHelloPacket1_19 && ((C2SLoginHelloPacket1_19) this.proxyConnection.getLoginHelloPacket()).key != null) {
|
||||||
ExternalInterface.signNonce(packet.nonce, loginKey, this.proxyConnection);
|
ExternalInterface.signNonce(packet.nonce, loginKey, this.proxyConnection);
|
||||||
}
|
}
|
||||||
this.proxyConnection.getChannel().writeAndFlush(loginKey).addListener(ChannelFutureListener.FIRE_EXCEPTION_ON_FAILURE);
|
this.proxyConnection.getChannel().writeAndFlush(loginKey).addListener(ChannelFutureListener.FIRE_EXCEPTION_ON_FAILURE);
|
||||||
|
Loading…
Reference in New Issue
Block a user