Пример #1
0
        public static NetOutgoingMessage Compress(NetOutgoingMessage msg)
        {
            msg.WritePadBits();
            byte[] input     = msg.PeekDataBuffer();
            byte[] output    = new byte[input.Length * 2];
            int    outlength = ZipCompressor.Instance.Compress(input, msg.LengthBytes, output);

            msg.EnsureBufferSize(outlength * 8);
            input = msg.PeekDataBuffer();
            Array.Copy(output, input, outlength);
            msg.LengthBytes = outlength;
            msg.LengthBits  = outlength * 8;
            return(msg);
        }
Пример #2
0
        public NetOutgoingMessage Write(MessageTypeMap messageTypeMap, NetPeer peer)
        {
            NetOutgoingMessage outgoingMessage;

            lock (MessageBufferLock)
            {
                if (_messageBuffer == null)
                {
                    _messageBuffer = peer.CreateMessage(128);
                }
                else
                {
                    _messageBuffer.LengthBytes = 0;
                    var buffer = _messageBuffer.PeekDataBuffer();
                    Array.Clear(buffer, 0, buffer.Length);
                }

                var messageTypeId = messageTypeMap.GetMessageTypeId(this);
                _messageBuffer.Write(messageTypeId);

                WriteTo(_messageBuffer);

                outgoingMessage = peer.CreateMessage(_messageBuffer.LengthBytes);
                outgoingMessage.Write(_messageBuffer);
            }

            return(outgoingMessage);
        }
Пример #3
0
        public virtual void SendNot(NetOutgoingMessage m, IPEndPoint ep)
        {
            if (server.ConnectionsCount == 0 && Root.Instance.Recorder == null)
            {
                return;
            }
            if (ep == null)
            {
                throw new Exception("ep==null");
            }

            if (Root.Instance.Recorder != null)
            {
                byte[] buf = m.PeekDataBuffer();
                Root.Instance.Recorder.WritePacket((int)(Root.Instance.Time * 1000), buf, buf.Length);
            }

            List <NetConnection> list = new List <NetConnection>();

            foreach (NetConnection s in Clients)
            {
                if (s != null)
                {
                    if (ep.ToString() != s.RemoteEndpoint.ToString())
                    {
                        list.Add(s);
                    }
                }
            }
            server.SendMessage(compress?NetCompressor.Compress(m):m, list, NetDeliveryMethod.Unreliable, 0);
        }
Пример #4
0
        public static void Run(NetPeer peer)
        {
            //
            // Test encryption
            //
            List <INetEncryption> algos = new List <INetEncryption>();

            algos.Add(new NetXorEncryption("TopSecret"));
            algos.Add(new NetXtea("TopSecret"));
            algos.Add(new NetAESEncryption("TopSecret"));
            algos.Add(new NetRC2Encryption("TopSecret"));
            algos.Add(new NetDESEncryption("TopSecret"));
            algos.Add(new NetTripleDESEncryption("TopSecret"));

            foreach (var algo in algos)
            {
                NetOutgoingMessage om = peer.CreateMessage();
                om.Write("Hallon");
                om.Write(42);
                om.Write(5, 5);
                om.Write(true);
                om.Write("kokos");
                int trueLen = om.LengthBits;
                om.Encrypt(algo);

                // convert to incoming message
                NetIncomingMessage im = Program.CreateIncomingMessage(om.PeekDataBuffer(), om.LengthBits);
                im.Decrypt(algo);

                if (im.LengthBits != trueLen)
                {
                    throw new NetException("Length fail");
                }

                if (im.ReadString() != "Hallon")
                {
                    throw new NetException("fail");
                }
                if (im.ReadInt32() != 42)
                {
                    throw new NetException("fail");
                }
                if (im.ReadInt32(5) != 5)
                {
                    throw new NetException("fail");
                }
                if (im.ReadBoolean() != true)
                {
                    throw new NetException("fail");
                }
                if (im.ReadString() != "kokos")
                {
                    throw new NetException("fail");
                }

                Console.WriteLine(algo.GetType().Name + " encryption verified");
            }

            for (int i = 0; i < 100; i++)
            {
                byte[] salt = NetSRP.CreateRandomSalt();
                byte[] x    = NetSRP.ComputePrivateKey("user", "password", salt);

                byte[] v = NetSRP.ComputeServerVerifier(x);
                //Console.WriteLine("v = " + NetUtility.ToHexString(v));

                byte[] a = NetSRP.CreateRandomEphemeral();                 //  NetUtility.ToByteArray("393ed364924a71ba7258633cc4854d655ca4ec4e8ba833eceaad2511e80db2b5");
                byte[] A = NetSRP.ComputeClientEphemeral(a);
                //Console.WriteLine("A = " + NetUtility.ToHexString(A));

                byte[] b = NetSRP.CreateRandomEphemeral();                 // NetUtility.ToByteArray("cc4d87a90db91067d52e2778b802ca6f7d362490c4be294b21b4a57c71cf55a9");
                byte[] B = NetSRP.ComputeServerEphemeral(b, v);
                //Console.WriteLine("B = " + NetUtility.ToHexString(B));

                byte[] u = NetSRP.ComputeU(A, B);
                //Console.WriteLine("u = " + NetUtility.ToHexString(u));

                byte[] Ss = NetSRP.ComputeServerSessionValue(A, v, u, b);
                //Console.WriteLine("Ss = " + NetUtility.ToHexString(Ss));

                byte[] Sc = NetSRP.ComputeClientSessionValue(B, x, u, a);
                //Console.WriteLine("Sc = " + NetUtility.ToHexString(Sc));

                if (Ss.Length != Sc.Length)
                {
                    throw new NetException("SRP non matching lengths!");
                }

                for (int j = 0; j < Ss.Length; j++)
                {
                    if (Ss[j] != Sc[j])
                    {
                        throw new NetException("SRP non matching session values!");
                    }
                }

                var test = NetSRP.CreateEncryption(Ss);
            }

            Console.WriteLine("Message encryption OK");
        }
Пример #5
0
        public static void Run(NetPeer peer)
        {
            NetOutgoingMessage msg = peer.CreateMessage();

            msg.Write(false);
            msg.Write(-3, 6);
            msg.Write(42);
            msg.Write("duke of earl");
            msg.Write((byte)43);
            msg.Write((ushort)44);
            msg.Write(true);

            msg.WritePadBits();

            int bcnt = 0;

            msg.Write(45.0f);
            msg.Write(46.0);
            bcnt += msg.WriteVariableInt32(-47);
            msg.WriteVariableInt32(470000);
            msg.WriteVariableUInt32(48);
            bcnt += msg.WriteVariableInt64(-49);

            if (bcnt != 2)
            {
                throw new NetException("WriteVariable* wrote too many bytes!");
            }

            byte[] data = msg.PeekDataBuffer();

            NetIncomingMessage inc = Program.CreateIncomingMessage(data, msg.LengthBits);

            StringBuilder bdr = new StringBuilder();

            bdr.Append(inc.ReadBoolean());
            bdr.Append(inc.ReadInt32(6));
            bdr.Append(inc.ReadInt32());
            bdr.Append(inc.ReadString());
            bdr.Append(inc.ReadByte());

            if (inc.PeekUInt16() != (ushort)44)
            {
                throw new NetException("Read/write failure");
            }

            bdr.Append(inc.ReadUInt16());
            bdr.Append(inc.ReadBoolean());

            inc.SkipPadBits();

            bdr.Append(inc.ReadSingle());
            bdr.Append(inc.ReadDouble());
            bdr.Append(inc.ReadVariableInt32());
            bdr.Append(inc.ReadVariableInt32());
            bdr.Append(inc.ReadVariableUInt32());
            bdr.Append(inc.ReadVariableInt64());

            if (bdr.ToString().Equals("False-342duke of earl4344True4546-4747000048-49"))
            {
                Console.WriteLine("Read/write tests OK");
            }
            else
            {
                throw new NetException("Read/write tests FAILED!");
            }

            msg = peer.CreateMessage();

            NetOutgoingMessage tmp = peer.CreateMessage();

            tmp.Write((int)42, 14);

            msg.Write(tmp);
            msg.Write(tmp);

            if (msg.LengthBits != tmp.LengthBits * 2)
            {
                throw new NetException("NetOutgoingMessage.Write(NetOutgoingMessage) failed!");
            }

            tmp = peer.CreateMessage();

            Test test = new Test();

            test.Number = 42;
            test.Name   = "Hallon";
            test.Age    = 8.2f;

            tmp.WriteAllFields(test, BindingFlags.Public | BindingFlags.Instance);

            data = tmp.PeekDataBuffer();

            inc = Program.CreateIncomingMessage(data, tmp.LengthBits);

            Test readTest = new Test();

            inc.ReadAllFields(readTest, BindingFlags.Public | BindingFlags.Instance);

            NetException.Assert(readTest.Number == 42);
            NetException.Assert(readTest.Name == "Hallon");
            NetException.Assert(readTest.Age == 8.2f);

            // test aligned WriteBytes/ReadBytes
            msg = peer.CreateMessage();
            byte[] tmparr = new byte[] { 5, 6, 7, 8, 9 };
            msg.Write(tmparr);

            inc = Program.CreateIncomingMessage(msg.PeekDataBuffer(), msg.LengthBits);
            byte[] result = inc.ReadBytes(tmparr.Length);

            for (int i = 0; i < tmparr.Length; i++)
            {
                if (tmparr[i] != result[i])
                {
                    throw new Exception("readbytes fail");
                }
            }
        }
Пример #6
0
        public static void Run(NetPeer peer)
        {
            //
            // Test XTEA
            //
            NetXtea xtea = new NetXtea("TopSecret");

            byte[] original = new byte[16];
            NetRandom.Instance.NextBytes(original);

            byte[] encrypted = new byte[original.Length];
            xtea.EncryptBlock(original, 0, encrypted, 0);
            xtea.EncryptBlock(original, 8, encrypted, 8);

            byte[] decrypted = new byte[original.Length];
            xtea.DecryptBlock(encrypted, 0, decrypted, 0);
            xtea.DecryptBlock(encrypted, 8, decrypted, 8);

            // compare!
            for (int i = 0; i < original.Length; i++)
            {
                if (original[i] != decrypted[i])
                {
                    throw new NetException("XTEA fail!");
                }
            }

            Console.WriteLine("XTEA OK");

            NetOutgoingMessage om = peer.CreateMessage();

            om.Write("Hallon");
            om.Write(42);
            om.Write(5, 5);
            om.Write(true);
            om.Write("kokos");
            om.Encrypt(xtea);

            // convert to incoming message
            NetIncomingMessage im = Program.CreateIncomingMessage(om.PeekDataBuffer(), om.LengthBits);

            im.Decrypt(xtea);

            if (im.ReadString() != "Hallon")
            {
                throw new NetException("fail");
            }
            if (im.ReadInt32() != 42)
            {
                throw new NetException("fail");
            }
            if (im.ReadInt32(5) != 5)
            {
                throw new NetException("fail");
            }
            if (im.ReadBoolean() != true)
            {
                throw new NetException("fail");
            }
            if (im.ReadString() != "kokos")
            {
                throw new NetException("fail");
            }

            for (int i = 0; i < 100; i++)
            {
                byte[] salt = NetSRP.CreateRandomSalt();
                byte[] x    = NetSRP.ComputePrivateKey("user", "password", salt);

                byte[] v = NetSRP.ComputeServerVerifier(x);
                //Console.WriteLine("v = " + NetUtility.ToHexString(v));

                byte[] a = NetSRP.CreateRandomEphemeral();                 //  NetUtility.ToByteArray("393ed364924a71ba7258633cc4854d655ca4ec4e8ba833eceaad2511e80db2b5");
                byte[] A = NetSRP.ComputeClientEphemeral(a);
                //Console.WriteLine("A = " + NetUtility.ToHexString(A));

                byte[] b = NetSRP.CreateRandomEphemeral();                 // NetUtility.ToByteArray("cc4d87a90db91067d52e2778b802ca6f7d362490c4be294b21b4a57c71cf55a9");
                byte[] B = NetSRP.ComputeServerEphemeral(b, v);
                //Console.WriteLine("B = " + NetUtility.ToHexString(B));

                byte[] u = NetSRP.ComputeU(A, B);
                //Console.WriteLine("u = " + NetUtility.ToHexString(u));

                byte[] Ss = NetSRP.ComputeServerSessionValue(A, v, u, b);
                //Console.WriteLine("Ss = " + NetUtility.ToHexString(Ss));

                byte[] Sc = NetSRP.ComputeClientSessionValue(B, x, u, a);
                //Console.WriteLine("Sc = " + NetUtility.ToHexString(Sc));

                if (Ss.Length != Sc.Length)
                {
                    throw new NetException("SRP non matching lengths!");
                }

                for (int j = 0; j < Ss.Length; j++)
                {
                    if (Ss[j] != Sc[j])
                    {
                        throw new NetException("SRP non matching session values!");
                    }
                }

                var test = NetSRP.CreateEncryption(Ss);
            }

            Console.WriteLine("Message encryption OK");
        }