From a0009693e246774619f55c55d6f80ff5a4ee020b Mon Sep 17 00:00:00 2001 From: Manevolent Date: Thu, 26 Jul 2018 00:02:36 -0400 Subject: [PATCH] License hash is failing. Need to fix that --- .../manevolent/ts3j/license/License.java | 33 ++++++++++++++----- .../local/LocalClientHandlerConnecting.java | 24 +++++++++++++- .../local/LocalClientHandlerNegotiating.java | 26 --------------- .../client/AbstractTeamspeakClientSocket.java | 2 +- .../github/manevolent/ts3j/util/Ts3Crypt.java | 10 +++--- 5 files changed, 55 insertions(+), 40 deletions(-) diff --git a/src/main/java/com/github/manevolent/ts3j/license/License.java b/src/main/java/com/github/manevolent/ts3j/license/License.java index 633f754..c9fd389 100644 --- a/src/main/java/com/github/manevolent/ts3j/license/License.java +++ b/src/main/java/com/github/manevolent/ts3j/license/License.java @@ -1,6 +1,7 @@ package com.github.manevolent.ts3j.license; import Punisher.NaCl.Internal.Ed25519Ref10.*; +import com.github.manevolent.ts3j.util.Ts3Logging; import java.nio.ByteBuffer; import java.nio.charset.Charset; @@ -132,21 +133,28 @@ public class License { } public static String readNullTerminatedLicenseString(ByteBuffer buffer) { - StringBuilder builder = new StringBuilder(); + int len = 0; while (buffer.remaining() > 0) { - char c = (char) buffer.get(); + int c = buffer.get(); switch (c) { - case '\0': + case 0: break; default: - builder.append(c); + len++; + break; } } - return builder.toString(); + + byte[] stringBytes = new byte[len]; + buffer.position(buffer.position() - len); + buffer.get(stringBytes); + + return new String(stringBytes, Charset.forName("UTF8")); } public static void writeNullTerminatedLicenseString(ByteBuffer buffer, String s) { - buffer.put((s + "\0").getBytes(Charset.forName("ASCII"))); + byte[] b = (s + (char) 0).getBytes(); + buffer.put(b); } public static List readLicenses(ByteBuffer buffer) { @@ -178,8 +186,14 @@ public class License { throw new RuntimeException(e); } - digest.update(buffer.array(), 1, buffer.array().length - 1); - return digest.digest(); + digest.update(buffer.array(), 2, buffer.array().length - 2); + + byte[] sliced = new byte[32]; + System.arraycopy(digest.digest(), 0, sliced, 0, 32); + + Ts3Logging.debug(Ts3Logging.getHex(buffer.array())); + + return sliced; } return computedHash; @@ -187,10 +201,13 @@ public class License { public byte[] deriveKey(byte[] parent) { // ScalarOperations.sc_clamp(Hash); + Ts3Logging.debug("ScalarOperations.sc_clamp: " + Ts3Logging.getHex(getHash())); ScalarOperations.sc_clamp(getHash(), 0); + Ts3Logging.debug("ScalarOperations.sc_clamp: " + Ts3Logging.getHex(getHash())); // GroupOperations.ge_frombytes_negate_vartime(out var pubkey, Key); GroupElementP3 pubkey = new GroupElementP3(); + Ts3Logging.debug("ScalarOperations.ge_frombytes_negate_vartime: " + Ts3Logging.getHex(getPublicKey())); GroupOperations.ge_frombytes_negate_vartime(pubkey, getPublicKey(), 0); // GroupOperations.ge_frombytes_negate_vartime(out var parkey, parent); diff --git a/src/main/java/com/github/manevolent/ts3j/protocol/packet/handler/local/LocalClientHandlerConnecting.java b/src/main/java/com/github/manevolent/ts3j/protocol/packet/handler/local/LocalClientHandlerConnecting.java index 244fdec..c7403d7 100644 --- a/src/main/java/com/github/manevolent/ts3j/protocol/packet/handler/local/LocalClientHandlerConnecting.java +++ b/src/main/java/com/github/manevolent/ts3j/protocol/packet/handler/local/LocalClientHandlerConnecting.java @@ -203,7 +203,29 @@ public class LocalClientHandlerConnecting extends LocalClientHandler { Ts3Crypt.cryptoInit2(license, alphaBytes, omega, proof, beta, keyPair.getValue()) ); - getClient().setState(ClientConnectionState.NEGOTIATING); + PacketBody2Command clientinit = new PacketBody2Command(ProtocolRole.CLIENT); + + clientinit.setText( + new SimpleCommand( + "clientinit", ProtocolRole.CLIENT, + new CommandSingleParameter("client_nickname", "test"), + new CommandSingleParameter("client_version", "3.0.19.3"), + new CommandSingleParameter("client_platform", "Windows"), + new CommandSingleParameter("client_version_sign", "a1OYzvM18mrmfUQBUgxYBxYz2DUU6y5k3/mEL6FurzU0y97Bd1FL7+PRpcHyPkg4R+kKAFZ1nhyzbgkGphDWDg=="), + new CommandSingleParameter("client_input_hardware", "true"), + new CommandSingleParameter("client_output_hardware", "false"), + new CommandSingleParameter("client_default_channel", ""), + new CommandSingleParameter("client_default_channel_password", ""), + new CommandSingleParameter("client_server_password", ""), + new CommandSingleParameter("client_nickname_phonetic", "test"), + new CommandSingleParameter("client_meta_data", ""), + new CommandSingleParameter("client_default_token", ""), + new CommandSingleParameter("client_key_offset", Long.toString(getClient().getIdentity().getKeyOffset())), + new CommandSingleParameter("hwid", "87056c6e1268aaf5055abf8256415e0e,408978b6d98810cc03f0aa16a4c75600") + ).build() + ); + + getClient().writePacket(clientinit); } } } diff --git a/src/main/java/com/github/manevolent/ts3j/protocol/packet/handler/local/LocalClientHandlerNegotiating.java b/src/main/java/com/github/manevolent/ts3j/protocol/packet/handler/local/LocalClientHandlerNegotiating.java index 6f9af65..57bd4bf 100644 --- a/src/main/java/com/github/manevolent/ts3j/protocol/packet/handler/local/LocalClientHandlerNegotiating.java +++ b/src/main/java/com/github/manevolent/ts3j/protocol/packet/handler/local/LocalClientHandlerNegotiating.java @@ -1,9 +1,5 @@ package com.github.manevolent.ts3j.protocol.packet.handler.local; -import com.github.manevolent.ts3j.command.SimpleCommand; -import com.github.manevolent.ts3j.command.part.CommandSingleParameter; -import com.github.manevolent.ts3j.protocol.ProtocolRole; -import com.github.manevolent.ts3j.protocol.packet.PacketBody2Command; import com.github.manevolent.ts3j.protocol.socket.client.LocalTeamspeakClientSocket; import java.io.IOException; @@ -16,28 +12,6 @@ public class LocalClientHandlerNegotiating extends LocalClientHandler { @Override public void onAssigned() throws IOException, TimeoutException { - PacketBody2Command clientinit = new PacketBody2Command(ProtocolRole.CLIENT); - clientinit.setText( - new SimpleCommand( - "clientinit", ProtocolRole.CLIENT, - new CommandSingleParameter("client_nickname", "test"), - new CommandSingleParameter("client_version", "3.0.19.3"), - new CommandSingleParameter("client_platform", "Windows"), - new CommandSingleParameter("client_version_sign", "a1OYzvM18mrmfUQBUgxYBxYz2DUU6y5k3/mEL6FurzU0y97Bd1FL7+PRpcHyPkg4R+kKAFZ1nhyzbgkGphDWDg=="), - new CommandSingleParameter("client_input_hardware", "true"), - new CommandSingleParameter("client_output_hardware", "false"), - new CommandSingleParameter("client_default_channel", ""), - new CommandSingleParameter("client_default_channel_password", ""), - new CommandSingleParameter("client_server_password", ""), - new CommandSingleParameter("client_nickname_phonetic", "test"), - new CommandSingleParameter("client_meta_data", ""), - new CommandSingleParameter("client_default_token", ""), - new CommandSingleParameter("client_key_offset", Long.toString(getClient().getIdentity().getKeyOffset())), - new CommandSingleParameter("hwid", "87056c6e1268aaf5055abf8256415e0e,408978b6d98810cc03f0aa16a4c75600") - ).build() - ); - - getClient().writePacket(clientinit); } } diff --git a/src/main/java/com/github/manevolent/ts3j/protocol/socket/client/AbstractTeamspeakClientSocket.java b/src/main/java/com/github/manevolent/ts3j/protocol/socket/client/AbstractTeamspeakClientSocket.java index 8385e93..b15b343 100644 --- a/src/main/java/com/github/manevolent/ts3j/protocol/socket/client/AbstractTeamspeakClientSocket.java +++ b/src/main/java/com/github/manevolent/ts3j/protocol/socket/client/AbstractTeamspeakClientSocket.java @@ -213,7 +213,7 @@ public abstract class AbstractTeamspeakClientSocket // Set header values packet.getBody().setHeaderValues(packet.getHeader()); - if (!packet.getHeader().getPacketFlag(HeaderFlag.NEW_PROTOCOL)) { + if (packet.getHeader().getType() != PacketBodyType.INIT1) { packetId++; packetId = packetId & 0x0000FFFF; diff --git a/src/main/java/com/github/manevolent/ts3j/util/Ts3Crypt.java b/src/main/java/com/github/manevolent/ts3j/util/Ts3Crypt.java index e75b41b..0857246 100644 --- a/src/main/java/com/github/manevolent/ts3j/util/Ts3Crypt.java +++ b/src/main/java/com/github/manevolent/ts3j/util/Ts3Crypt.java @@ -34,14 +34,16 @@ public final class Ts3Crypt { // 3.2.2.2 Parsing the license List licenses = License.readLicenses(ByteBuffer.wrap(license)); + Ts3Logging.debug("License.deriveKey: " + Ts3Logging.getHex(license)); byte[] key = License.deriveKey(licenses); + Ts3Logging.debug("License.deriveKey: " + Ts3Logging.getHex(key)); - Ts3Logging.debug("Computed license key: " + Ts3Logging.getHex(key)); - + Ts3Logging.debug("Ts3Crypt.generateSharedSecret2: " + Ts3Logging.getHex(key) + " " + Ts3Logging.getHex(privateKey)); byte[] sharedSecret = Ts3Crypt.generateSharedSecret2(key, privateKey); + Ts3Logging.debug("Ts3Crypt.generateSharedSecret2: " + Ts3Logging.getHex(sharedSecret)); - Ts3Logging.debug("Computed shared secret: " + Ts3Logging.getHex(sharedSecret)); - + Ts3Logging.debug("Ts3Crypt.SecureChannelParameters: " + Ts3Logging.getHex(alpha) + " " + Ts3Logging.getHex(beta) + + " " + Ts3Logging.getHex(sharedSecret)); Ts3Crypt.SecureChannelParameters parameters = Ts3Crypt.getSecureParameters(alpha, beta, sharedSecret);