diff options
4 files changed, 21 insertions, 63 deletions
diff --git a/.github/assets/supportedVersion b/.github/assets/supportedVersion index f75a3dd..272db43 100644 --- a/.github/assets/supportedVersion +++ b/.github/assets/supportedVersion @@ -1 +1 @@ -1.20.1.02 +1.20.11.01 diff --git a/serverlist-server/src/main/com/pyratron/pugmatt/bedrockconnect/BedrockConnect.java b/serverlist-server/src/main/com/pyratron/pugmatt/bedrockconnect/BedrockConnect.java index c576687..d889ec3 100644 --- a/serverlist-server/src/main/com/pyratron/pugmatt/bedrockconnect/BedrockConnect.java +++ b/serverlist-server/src/main/com/pyratron/pugmatt/bedrockconnect/BedrockConnect.java @@ -38,7 +38,7 @@ public class BedrockConnect { public static boolean storeDisplayNames = true; public static File whitelistfile; - public static String release = "1.35"; + public static String release = "1.36"; public static HashMap<String, String> featuredServerIps; diff --git a/serverlist-server/src/main/com/pyratron/pugmatt/bedrockconnect/listeners/PacketHandler.java b/serverlist-server/src/main/com/pyratron/pugmatt/bedrockconnect/listeners/PacketHandler.java index 2629d6e..4bca055 100644 --- a/serverlist-server/src/main/com/pyratron/pugmatt/bedrockconnect/listeners/PacketHandler.java +++ b/serverlist-server/src/main/com/pyratron/pugmatt/bedrockconnect/listeners/PacketHandler.java @@ -21,12 +21,17 @@ import org.cloudburstmc.protocol.bedrock.codec.BedrockCodec; import org.cloudburstmc.protocol.bedrock.data.AttributeData; import org.cloudburstmc.protocol.bedrock.data.PacketCompressionAlgorithm; import org.cloudburstmc.protocol.bedrock.packet.*; +import org.cloudburstmc.protocol.bedrock.util.ChainValidationResult; import org.cloudburstmc.protocol.bedrock.util.EncryptionUtils; +import org.cloudburstmc.protocol.bedrock.util.JsonUtils; import org.cloudburstmc.protocol.common.PacketSignal; import org.cloudburstmc.protocol.common.util.Preconditions; +import org.jose4j.jws.JsonWebSignature; +import org.jose4j.lang.JoseException; import java.io.IOException; import java.net.URI; +import java.security.PublicKey; import java.security.interfaces.ECPublicKey; import java.util.*; import java.net.InetAddress; @@ -459,59 +464,12 @@ public class PacketHandler implements BedrockPacketHandler { } - private boolean validateChainData(List<SignedJWT> chain) throws Exception { - if (chain.size() != 3) { - return false; - } - - Payload identity = null; - ECPublicKey lastKey = null; - boolean mojangSigned = false; - Iterator<SignedJWT> iterator = chain.iterator(); - while (iterator.hasNext()) { - SignedJWT jwt = iterator.next(); - identity = jwt.getPayload(); - - // x509 cert is expected in every claim - URI x5u = jwt.getHeader().getX509CertURL(); - if (x5u == null) { - return false; - } - - ECPublicKey expectedKey = EncryptionUtils.generateKey(jwt.getHeader().getX509CertURL().toString()); - // First key is self-signed - if (lastKey == null) { - lastKey = expectedKey; - } else if (!lastKey.equals(expectedKey)) { - return false; - } + private boolean verifyJwt(String jwt, PublicKey key) throws JoseException { + JsonWebSignature jws = new JsonWebSignature(); + jws.setKey(key); + jws.setCompactSerialization(jwt); - if (!EncryptionUtils.verifyJwt(jwt, lastKey)) { - return false; - } - - if (mojangSigned) { - return !iterator.hasNext(); - } - - if (lastKey.equals(EncryptionUtils.getMojangPublicKey())) { - mojangSigned = true; - } - - Object payload = JSONValue.parse(jwt.getPayload().toString()); - Preconditions.checkArgument(payload instanceof JSONObject, "Payload is not an object"); - - Object identityPublicKey = ((JSONObject) payload).get("identityPublicKey"); - Preconditions.checkArgument(identityPublicKey instanceof String, "identityPublicKey node is missing in chain"); - lastKey = EncryptionUtils.generateKey((String) identityPublicKey); - } - - return mojangSigned; - } - - - private boolean verifyJwt(JWSObject jwt, ECPublicKey key) throws JOSEException { - return jwt.verify(new DefaultJWSVerifierFactory().createJWSVerifier(jwt.getHeader(), key)); + return jws.verifySignature(); } @Override @@ -544,25 +502,22 @@ public class PacketHandler implements BedrockPacketHandler { @Override public PacketSignal handle(LoginPacket packet) { - - List<SignedJWT> certChainData = packet.getChain(); - try { - JWSObject jwt = certChainData.get(certChainData.size() - 1); - JsonNode payload = Server.JSON_MAPPER.readTree(jwt.getPayload().toBytes()); + ChainValidationResult chain = EncryptionUtils.validateChain(packet.getChain()); + JsonNode payload = Server.JSON_MAPPER.valueToTree(chain.rawIdentityClaims()); if (payload.get("extraData").getNodeType() != JsonNodeType.OBJECT) { throw new RuntimeException("AuthData was not found!"); } - extraData = (JSONObject) jwt.getPayload().toJSONObject().get("extraData"); + extraData = new JSONObject(JsonUtils.childAsType(chain.rawIdentityClaims(), "extraData", Map.class)); if (payload.get("identityPublicKey").getNodeType() != JsonNodeType.STRING) { throw new RuntimeException("Identity Public Key was not found!"); } - ECPublicKey identityPublicKey = EncryptionUtils.generateKey(payload.get("identityPublicKey").textValue()); + ECPublicKey identityPublicKey = EncryptionUtils.parseKey(payload.get("identityPublicKey").textValue()); - JWSObject clientJwt = packet.getExtra(); + String clientJwt = packet.getExtra(); verifyJwt(clientJwt, identityPublicKey); System.out.println("Made it through login - " + "User: " + extraData.getAsString("displayName") + " (" + extraData.getAsString("identity") + ")"); diff --git a/serverlist-server/src/main/com/pyratron/pugmatt/bedrockconnect/utils/BedrockProtocol.java b/serverlist-server/src/main/com/pyratron/pugmatt/bedrockconnect/utils/BedrockProtocol.java index 008441a..ba0ed4a 100644 --- a/serverlist-server/src/main/com/pyratron/pugmatt/bedrockconnect/utils/BedrockProtocol.java +++ b/serverlist-server/src/main/com/pyratron/pugmatt/bedrockconnect/utils/BedrockProtocol.java @@ -11,6 +11,7 @@ import org.cloudburstmc.protocol.bedrock.codec.v568.Bedrock_v568; import org.cloudburstmc.protocol.bedrock.codec.v575.Bedrock_v575; import org.cloudburstmc.protocol.bedrock.codec.v582.Bedrock_v582; import org.cloudburstmc.protocol.bedrock.codec.v589.Bedrock_v589; +import org.cloudburstmc.protocol.bedrock.codec.v594.Bedrock_v594; import java.util.ArrayList; import java.util.List; @@ -21,7 +22,7 @@ public class BedrockProtocol { /** * Latest available version */ - public static final BedrockCodec DEFAULT_BEDROCK_CODEC = Bedrock_v589.CODEC; + public static final BedrockCodec DEFAULT_BEDROCK_CODEC = Bedrock_v594.CODEC; /** * A list of all supported Bedrock versions that can join BedrockConnect @@ -51,6 +52,8 @@ public class BedrockProtocol { .build()); SUPPORTED_BEDROCK_CODECS.add(Bedrock_v582.CODEC.toBuilder() .build()); + SUPPORTED_BEDROCK_CODECS.add(Bedrock_v589.CODEC.toBuilder() + .build()); SUPPORTED_BEDROCK_CODECS.add(DEFAULT_BEDROCK_CODEC); } |
