diff --git a/bungee/src/main/java/com/alterdekim/xcraft/auth/bungee/EncryptionResponsePacket.java b/bungee/src/main/java/com/alterdekim/xcraft/auth/bungee/EncryptionResponsePacket.java index 39d0923..fc4080b 100644 --- a/bungee/src/main/java/com/alterdekim/xcraft/auth/bungee/EncryptionResponsePacket.java +++ b/bungee/src/main/java/com/alterdekim/xcraft/auth/bungee/EncryptionResponsePacket.java @@ -14,15 +14,18 @@ import net.md_5.bungee.netty.ChannelWrapper; import net.md_5.bungee.netty.cipher.CipherDecoder; import net.md_5.bungee.netty.cipher.CipherEncoder; import net.md_5.bungee.protocol.AbstractPacketHandler; +import net.md_5.bungee.protocol.DefinedPacket; import net.md_5.bungee.protocol.ProtocolConstants; import net.md_5.bungee.protocol.packet.EncryptionRequest; import net.md_5.bungee.protocol.packet.EncryptionResponse; import javax.crypto.SecretKey; +import java.beans.ConstructorProperties; import java.lang.reflect.Field; import java.lang.reflect.Method; import java.net.URLEncoder; import java.security.MessageDigest; +import java.util.Arrays; import java.util.logging.Level; import java.util.logging.Logger; @@ -31,7 +34,24 @@ import static net.md_5.bungee.BungeeCord.getInstance; import static com.alterdekim.xcraft.auth.bungee.XCraft.INTERNAL_PORT; -public class EncryptionResponsePacket extends EncryptionResponse { +public class EncryptionResponsePacket extends DefinedPacket { + + private byte[] sharedSecret; + private byte[] verifyToken; + + public void read(ByteBuf buf, ProtocolConstants.Direction direction, int protocolVersion) { + this.sharedSecret = readArray(buf, 128); + this.verifyToken = readArray(buf, 128); + } + + public void write(ByteBuf buf, ProtocolConstants.Direction direction, int protocolVersion) { + writeArray(this.sharedSecret, buf); + writeArray(this.verifyToken, buf); + } + + private EncryptionResponse getDummyResponse() { + return new EncryptionResponse(this.getSharedSecret(), this.getVerifyToken()); + } @Override public void handle(AbstractPacketHandler handler) throws Exception { @@ -61,7 +81,7 @@ public class EncryptionResponsePacket extends EncryptionResponse { Preconditions.checkState( thisState.get(handler).toString().equals("ENCRYPT"), "Not expecting ENCRYPT" ); - SecretKey sharedKey = EncryptionUtil.getSecret(this, (EncryptionRequest) request.get(initialHandler)); + SecretKey sharedKey = EncryptionUtil.getSecret(this.getDummyResponse(), (EncryptionRequest) request.get(initialHandler)); BungeeCipher decrypt = EncryptionUtil.getCipher(false, sharedKey); ((ChannelWrapper)ch.get(initialHandler)).addBefore("frame-decoder", "decrypt", new CipherDecoder(decrypt)); BungeeCipher encrypt = EncryptionUtil.getCipher(true, sharedKey); @@ -98,4 +118,61 @@ public class EncryptionResponsePacket extends EncryptionResponse { }; HttpClient.get(authURL, ((ChannelWrapper)ch.get(initialHandler)).getHandle().eventLoop(), callback_handler); } + + public byte[] getSharedSecret() { + return this.sharedSecret; + } + + public byte[] getVerifyToken() { + return this.verifyToken; + } + + public void setSharedSecret(byte[] sharedSecret) { + this.sharedSecret = sharedSecret; + } + + public void setVerifyToken(byte[] verifyToken) { + this.verifyToken = verifyToken; + } + + public String toString() { + return "EncryptionResponsePacket(sharedSecret=" + Arrays.toString(this.getSharedSecret()) + ", verifyToken=" + Arrays.toString(this.getVerifyToken()) + ")"; + } + + public EncryptionResponsePacket() { + } + + @ConstructorProperties({"sharedSecret", "verifyToken"}) + public EncryptionResponsePacket(byte[] sharedSecret, byte[] verifyToken) { + this.sharedSecret = sharedSecret; + this.verifyToken = verifyToken; + } + + public boolean equals(Object o) { + if (o == this) { + return true; + } else if (!(o instanceof EncryptionResponsePacket)) { + return false; + } else { + EncryptionResponsePacket other = (EncryptionResponsePacket)o; + if (!other.canEqual(this)) { + return false; + } else if (!Arrays.equals(this.getSharedSecret(), other.getSharedSecret())) { + return false; + } else { + return Arrays.equals(this.getVerifyToken(), other.getVerifyToken()); + } + } + } + + protected boolean canEqual(Object other) { + return other instanceof EncryptionResponsePacket; + } + + public int hashCode() { + int result = 1; + result = result * 59 + Arrays.hashCode(this.getSharedSecret()); + result = result * 59 + Arrays.hashCode(this.getVerifyToken()); + return result; + } }