Exemplo n.º 1
0
		public void TestCase()
		{
			OpenSSL.Core.Random.Seed(rnd_seed);

			BigNumber.GeneratorHandler cb = new BigNumber.GeneratorHandler(this.OnStatus);
			DH a = new DH(64, DH.Generator5, cb, Console.Out);

			DH.CheckCode check = a.Check();
			if ((check & DH.CheckCode.CheckP_NotPrime) != 0)
				Console.WriteLine("p value is not prime");
			if ((check & DH.CheckCode.CheckP_NotSafePrime) != 0)
				Console.WriteLine("p value is not safe prime");
			if ((check & DH.CheckCode.UnableToCheckGenerator) != 0)
				Console.WriteLine("unable to check the generator value");
			if ((check & DH.CheckCode.NotSuitableGenerator) != 0)
				Console.WriteLine("the g value is not a generator");

			Console.WriteLine();
			Console.WriteLine("p    ={0}", a.P);
			Console.WriteLine("g    ={0}", a.G);

			DH b = new DH(a.P, a.G);

			a.NoExpConstantTime = false;
			b.NoExpConstantTime = true;

			a.GenerateKeys();
			Console.WriteLine("pri 1={0}", a.PrivateKey);
			Console.WriteLine("pub 1={0}", a.PublicKey);

			b.GenerateKeys();
			Console.WriteLine("pri 2={0}", b.PrivateKey);
			Console.WriteLine("pub 2={0}", b.PublicKey);

			byte[] aout = a.ComputeKey(b.PublicKey);
			string astr = BitConverter.ToString(aout);
			Console.WriteLine("key1 ={0}", astr);

			byte[] bout = b.ComputeKey(a.PublicKey);
			string bstr = BitConverter.ToString(bout);
			Console.WriteLine("key2 ={0}", bstr);

			if (aout.Length < 4 || astr != bstr)
				throw new Exception("Error in DH routines");

			a.Dispose();
			b.Dispose();
		}
Exemplo n.º 2
0
        private void ProcessTCPPacket(TCPPacket pTCPPacket, ref uint pSequence, SortedDictionary<uint, byte[]> pBuffer, RiftStream pStream)
        {
            if (pTCPPacket.SequenceNumber > pSequence) pBuffer[(uint)pTCPPacket.SequenceNumber] = pTCPPacket.TCPData;
            if (pTCPPacket.SequenceNumber < pSequence)
            {
                int difference = (int)(pSequence - pTCPPacket.SequenceNumber);
                byte[] data = pTCPPacket.TCPData;
                if (data.Length > difference)
                {
                    pStream.Append(data, difference, data.Length - difference);
                    pSequence += (uint)(data.Length - difference);
                }
            }
            else if (pTCPPacket.SequenceNumber == pSequence)
            {
                byte[] data = pTCPPacket.TCPData;
                pStream.Append(data);
                pSequence += (uint)data.Length;

                bool found;
                do
                {
                    SortedDictionary<uint, byte[]>.Enumerator enumerator = pBuffer.GetEnumerator();
                    if ((found = (enumerator.MoveNext() && enumerator.Current.Key <= pSequence)))
                    {
                        int difference = (int)(pSequence - enumerator.Current.Key);
                        if (enumerator.Current.Value.Length > difference)
                        {
                            pStream.Append(enumerator.Current.Value, difference, enumerator.Current.Value.Length - difference);
                            pSequence += (uint)(enumerator.Current.Value.Length - difference);
                        }
                        pBuffer.Remove(enumerator.Current.Key);
                    }
                }
                while (found);
            }

            RiftPacket packet;
            while ((packet = pStream.Read(pTCPPacket.Timeval.Date)) != null)
            {
                AddPacket(packet);
                if (packet.Opcode == 0x01B7) mIsCharacterSession = true;
                else if (packet.Opcode == 0x040B)
                {
                    RiftPacketField fieldServerPublicKey;
                    if (packet.GetFieldByIndex(out fieldServerPublicKey, 1) &&
                        fieldServerPublicKey.Type == ERiftPacketFieldType.ByteArray &&
                        fieldServerPublicKey.Value.Bytes.Length == 128)
                    {
                        if (mClientPrivateKeys != null && mClientPrivateKeys.ContainsKey(mIsCharacterSession)) mClientPrivateKey = BigNumber.FromArray(mClientPrivateKeys[mIsCharacterSession]);
                        if (mClientPrivateKey == null)
                        {
                            // Scan for rift.exe, read memory to pointers, get client private key
                        }
                        mServerPublicKey = BigNumber.FromArray(fieldServerPublicKey.Value.Bytes);
                        DH dh = new DH(mModulus, mGenerator, BigNumber.One, mClientPrivateKey);
                        mSharedSecretKey = dh.ComputeKey(mServerPublicKey);
                    }
                }
                else if (packet.Opcode == 0x19)
                {
                    pStream.EnableInflater();
                    if (packet.Outbound)
                    {
                        mInboundStream.EnableEncryption(mSharedSecretKey);
                        mOutboundStream.EnableEncryption(mSharedSecretKey);
                    }
                }
            }
        }
Exemplo n.º 3
0
        private void ProcessTCPPacket(TCPPacket pTCPPacket, ref uint pSequence, SortedDictionary<uint, byte[]> pBuffer, RiftStream pStream)
        {
            if (pTCPPacket.SequenceNumber > pSequence) pBuffer[(uint)pTCPPacket.SequenceNumber] = pTCPPacket.TCPData;
            if (pTCPPacket.SequenceNumber < pSequence)
            {
                int difference = (int)(pSequence - pTCPPacket.SequenceNumber);
                byte[] data = pTCPPacket.TCPData;
                if (data.Length > difference)
                {
                    pStream.Append(data, difference, data.Length - difference);
                    pSequence += (uint)(data.Length - difference);
                }
            }
            else if (pTCPPacket.SequenceNumber == pSequence)
            {
                byte[] data = pTCPPacket.TCPData;
                pStream.Append(data);
                pSequence += (uint)data.Length;

                bool found;
                do
                {
                    SortedDictionary<uint, byte[]>.Enumerator enumerator = pBuffer.GetEnumerator();
                    if ((found = (enumerator.MoveNext() && enumerator.Current.Key <= pSequence)))
                    {
                        int difference = (int)(pSequence - enumerator.Current.Key);
                        if (enumerator.Current.Value.Length > difference)
                        {
                            pStream.Append(enumerator.Current.Value, difference, enumerator.Current.Value.Length - difference);
                            pSequence += (uint)(enumerator.Current.Value.Length - difference);
                        }
                        pBuffer.Remove(enumerator.Current.Key);
                    }
                }
                while (found);
            }

            RiftPacket packet;
            while ((packet = pStream.Read(pTCPPacket.Timeval.Date)) != null)
            {
                AddPacket(packet);
                if (packet.Opcode == 0x01B7)
                {
                    mIsCharacterSession = true;
                }
                else if (packet.Opcode == 0x040B)
                {
                    RiftPacketField fieldServerPublicKey;
                    if (packet.GetFieldByIndex(out fieldServerPublicKey, 1) &&
                        fieldServerPublicKey.Type == ERiftPacketFieldType.ByteArray &&
                        fieldServerPublicKey.Value.Bytes.Length == 128)
                    {
                        if (mClientPrivateKeys == null)
                        {
                            DateTime started = DateTime.Now;
                            while (!Program.LiveKeys.ContainsKey(mIsCharacterSession) && DateTime.Now.Subtract(started).TotalSeconds < 10) Thread.Sleep(1);
                            if (Program.LiveKeys.ContainsKey(mIsCharacterSession)) mClientPrivateKeys = Program.LiveKeys;
                            else
                            {
                                MessageBox.Show(this, "The required key was unable to be found for some reason, let the developers know this happened.", "Key Grab Failed", MessageBoxButtons.OK, MessageBoxIcon.Error);
                                mTerminated = true;
                                return;
                            }
                        }
                        mClientPrivateKey = BigNumber.FromArray(mClientPrivateKeys[mIsCharacterSession]);
                        mServerPublicKey = BigNumber.FromArray(fieldServerPublicKey.Value.Bytes);
                        DH dh = new DH(mModulus, mGenerator, BigNumber.One, mClientPrivateKey);
                        mSharedSecretKey = dh.ComputeKey(mServerPublicKey);
                    }
                }
                else if (packet.Opcode == 0x19)
                {
                    pStream.EnableInflater();
                    if (packet.Outbound)
                    {
                        mInboundStream.EnableEncryption(mSharedSecretKey);
                        mOutboundStream.EnableEncryption(mSharedSecretKey);
                    }
                }
            }
        }