Exemplo n.º 1
0
        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);
            }
        }