internal byte[] ProcessInit1(byte[] data) { const int versionLen = 4; const int initTypeLen = 1; if (data == null) { var sendData = new byte[versionLen + initTypeLen + 4 + 4 + 8]; Array.Copy(Initversion, 0, sendData, 0, versionLen); // initVersion sendData[versionLen] = 0x00; // initType NetUtil.H2N(Util.UnixNow, sendData, versionLen + initTypeLen); // 4byte timestamp for (int i = 0; i < 4; i++) { sendData[i + versionLen + initTypeLen + 4] = (byte)Util.Random.Next(0, 256); // 4byte random } return(sendData); } if (data.Length < initTypeLen) { return(null); } int type = data[0]; if (type == 1) { var sendData = new byte[versionLen + initTypeLen + 16 + 4]; Array.Copy(Initversion, 0, sendData, 0, versionLen); // initVersion sendData[versionLen] = 0x02; // initType Array.Copy(data, 1, sendData, versionLen + initTypeLen, 20); return(sendData); } else if (type == 3) { byte[] alphaBytes = new byte[10]; Util.Random.NextBytes(alphaBytes); var alpha = Convert.ToBase64String(alphaBytes); string initAdd = Ts3Command.BuildToString("clientinitiv", new ICommandPart[] { new CommandParameter("alpha", alpha), new CommandParameter("omega", Identity.PublicKeyString), new CommandParameter("ip", string.Empty) }); var textBytes = Util.Encoder.GetBytes(initAdd); // Prepare solution int level = NetUtil.N2Hint(data, initTypeLen + 128); byte[] y = SolveRsaChallange(data, initTypeLen, level); // Copy bytes for this result: [Version..., InitType..., data..., y..., text...] var sendData = new byte[versionLen + initTypeLen + 232 + 64 + textBytes.Length]; // Copy this.Version Array.Copy(Initversion, 0, sendData, 0, versionLen); // Write InitType sendData[versionLen] = 0x04; // Copy data Array.Copy(data, initTypeLen, sendData, versionLen + initTypeLen, 232); // Copy y Array.Copy(y, 0, sendData, versionLen + initTypeLen + 232 + (64 - y.Length), y.Length); // Copy text Array.Copy(textBytes, 0, sendData, versionLen + initTypeLen + 232 + 64, textBytes.Length); return(sendData); } else { return(null); } }