コード例 #1
0
        public void Serialize()
        {
            var person  = new Person("first");
            var person2 = new Person("second");

            list.Add(person);
            server.DequeueAndAssertMessage <BuddyListMessage>();
            list.Add(person2);
            server.DequeueAndAssertMessage <BuddyListMessage>();

            var writer = new BufferValueWriter(new byte[1024]);

            list.Serialize(clientContext, writer);

            server.AssertNoMessage();

            var reader = new BufferValueReader(writer.Buffer);

            list.Deserialize(clientContext, reader);

            Assert.AreEqual(writer.Length, reader.Position);

            server.AssertNoMessage();

            CollectionAssert.Contains(list, person);
            CollectionAssert.Contains(list, person2);
        }
コード例 #2
0
        public void ISerializable()
        {
            byte[] buffer = new byte[20480];
            var    writer = new BufferValueWriter(buffer);

            SerializableTester tester = new SerializableTester
            {
                Name    = "MONKEY!",
                Numbers = new[] { 1, 2, 4, 8, 16, 32 }
            };

            var test = new AsyncTest();

            tester.SerializeCalled += test.PassHandler;

            writer.Write(context, tester);
            writer.Flush();

            var reader     = new BufferValueReader(buffer);
            var serialized = SerializerExtensions.Read <SerializableTester> (reader, context);

            Assert.IsNotNull(serialized);
            Assert.AreEqual(tester.Name, serialized.Name);
            Assert.IsTrue(tester.Numbers.SequenceEqual(serialized.Numbers), "Numbers does not match");

            test.Assert(1000);
        }
コード例 #3
0
        public void Serialization()
        {
            var dict = new Dictionary <Type, ushort> {
                { typeof(string), 0 }, { typeof(int), 1 }
            };
            TypeMap map = new TypeMap(dict);

            byte[] buffer = new byte[20480];
            var    writer = new BufferValueWriter(buffer);

            map.Serialize(null, writer);
            writer.Flush();

            var reader = new BufferValueReader(buffer);

            map = new TypeMap();
            map.Deserialize(null, reader);

            Type type;

            Assert.IsTrue(map.TryGetType(0, out type));
            Assert.AreEqual(typeof(string), type);
            Assert.IsTrue(map.TryGetType(1, out type));
            Assert.AreEqual(typeof(int), type);

            ushort id;

            Assert.IsFalse(map.GetTypeId(typeof(string), out id));
            Assert.AreEqual(0, id);
            Assert.IsFalse(map.GetTypeId(typeof(int), out id));
            Assert.AreEqual(1, id);
        }
コード例 #4
0
 protected override void SignMessage(Message message, string hashAlg, BufferValueWriter writer)
 {
     if (HMAC == null)
         writer.WriteBytes (this.connection.LocalCrypto.HashAndSign (hashAlg, writer.Buffer, 0, writer.Length));
     else
         base.SignMessage (message, hashAlg, writer);
 }
コード例 #5
0
        public void Serialize()
        {
            var crypto = new RSACryptoServiceProvider();

            var p = new RSAAsymmetricKey(crypto.ExportCspBlob(true));

            byte[] buffer = new byte[20480];
            var    writer = new BufferValueWriter(buffer);

            p.Serialize(null, writer);
            int len = writer.Length;

            writer.Flush();

            var reader = new BufferValueReader(buffer);
            var key    = new RSAAsymmetricKey(null, reader);

            Assert.AreEqual(len, reader.Position);

            Assert.IsNull(key.D);
            Assert.IsNull(key.DP);
            Assert.IsNull(key.DQ);
            AssertArrayMatches(p.Exponent, key.Exponent);
            Assert.IsNull(key.InverseQ);
            AssertArrayMatches(p.Modulus, key.Modulus);
            Assert.IsNull(key.P);
            Assert.IsNull(key.Q);

            Assert.IsNotNull(key.PublicSignature);
        }
コード例 #6
0
        protected virtual void SignMessage(Message message, string hashAlg, BufferValueWriter writer)
        {
            if (HMAC == null)
            {
                throw new InvalidOperationException();
            }

            string callCategory = null;

                        #if TRACE
            int c = GetNextCallId();
            callCategory = String.Format("{0} {1}:SignMessage ({2},{3})", this.connectionType, c, hashAlg, writer.Length);
                        #endif
            Trace.WriteLineIf(NTrace.TraceVerbose, "Entering", callCategory);

            byte[] hash;
            lock (HMAC)
                hash = HMAC.ComputeHash(writer.Buffer, 0, writer.Length);

            //Trace.WriteLineIf (NTrace.TraceVerbose, "Got hash:  " + GetHex (hash), callCategory);

            writer.WriteBytes(hash);

            Trace.WriteLineIf(NTrace.TraceVerbose, "Exiting", callCategory);
        }
コード例 #7
0
        public void ISerializable()
        {
            byte[] buffer = new byte[20480];
            var writer = new BufferValueWriter (buffer);

            SerializableTester tester = new SerializableTester
            {
                Name = "MONKEY!",
                Numbers = new[] { 1, 2, 4, 8, 16, 32 }
            };

            var test = new AsyncTest();
            tester.SerializeCalled += test.PassHandler;

            writer.Write (context, tester);
            writer.Flush();

            var reader = new BufferValueReader (buffer);
            var serialized = SerializerExtensions.Read<SerializableTester> (reader, context);

            Assert.IsNotNull (serialized);
            Assert.AreEqual (tester.Name, serialized.Name);
            Assert.IsTrue (tester.Numbers.SequenceEqual (serialized.Numbers), "Numbers does not match");

            test.Assert (1000);
        }
コード例 #8
0
        public void BufferOverflowResize()
        {
            byte[] buffer = new byte[4];
            var writer = new BufferValueWriter (buffer);
            writer.WriteInt64 (1);

            Assert.That (writer.Length, Is.EqualTo (8));
            Assert.That (writer.Buffer.Length, Is.AtLeast (8));
        }
コード例 #9
0
        public static byte[] GetBytes (this MessageBase messageBase)
		{
            var writer = new BufferValueWriter(new byte[1024]);
			messageBase.WritePayload(writer);

            var resizedBuffer = new byte[writer.Length];
            Buffer.BlockCopy(writer.Buffer, 0, resizedBuffer, 0, resizedBuffer.Length);

            return resizedBuffer;
		}
コード例 #10
0
        public void BufferOverflowResize()
        {
            byte[] buffer = new byte[4];
            var    writer = new BufferValueWriter(buffer);

            writer.WriteInt64(1);

            Assert.That(writer.Length, Is.EqualTo(8));
            Assert.That(writer.Buffer.Length, Is.AtLeast(8));
        }
コード例 #11
0
 protected override void SignMessage(Message message, string hashAlg, BufferValueWriter writer)
 {
     if (message is FinalConnectMessage)
     {
         writer.WriteBytes(this.connection.LocalCrypto.HashAndSign(hashAlg, writer.Buffer, 0, writer.Length));
     }
     else
     {
         base.SignMessage(message, hashAlg, writer);
     }
 }
コード例 #12
0
        public static byte[] GetBytes(this MessageBase messageBase)
        {
            var writer = new BufferValueWriter(new byte[1024]);

            messageBase.WritePayload(writer);

            var resizedBuffer = new byte[writer.Length];

            Buffer.BlockCopy(writer.Buffer, 0, resizedBuffer, 0, resizedBuffer.Length);

            return(resizedBuffer);
        }
コード例 #13
0
        public void Enum()
        {
            byte[] buffer = new byte[1024];
            var writer = new BufferValueWriter (buffer);
            writer.Write (context, TestEnum.High);
            int len = writer.Length;
            writer.Flush();

            var reader = new BufferValueReader (buffer);

            Assert.AreEqual (TestEnum.High, reader.Read<TestEnum> (context));
            Assert.AreEqual (len, reader.Position);
        }
コード例 #14
0
        public void ReadWriteLongSet()
        {
            var writer = new BufferValueWriter (new byte[1]);

            for (int i = 0; i < 20480; ++i)
                writer.WriteInt32(i);

            writer.Flush();

            var reader = new BufferValueReader (writer.Buffer);
            for (int i = 0; i < 20480; ++i)
                Assert.AreEqual(i, reader.ReadInt32());
        }
コード例 #15
0
ファイル: ExtensionsTests.cs プロジェクト: ermau/Tempest
        public void ReadWriteUniversalDate()
        {
            byte[] buffer = new byte[20480];
            var writer = new BufferValueWriter (buffer);

            DateTime d = DateTime.Now;

            writer.WriteUniversalDate (d);
            writer.Flush();

            var reader = new BufferValueReader (buffer);

            Assert.AreEqual (d.ToUniversalTime(), reader.ReadUniversalDate());
        }
コード例 #16
0
ファイル: ExtensionsTests.cs プロジェクト: terite/Tempest
        public void ReadWriteUniversalDate()
        {
            byte[] buffer = new byte[20480];
            var    writer = new BufferValueWriter(buffer);

            DateTime d = DateTime.Now;

            writer.WriteUniversalDate(d);
            writer.Flush();

            var reader = new BufferValueReader(buffer);

            Assert.AreEqual(d.ToUniversalTime(), reader.ReadUniversalDate());
        }
コード例 #17
0
        public void Enum()
        {
            byte[] buffer = new byte[1024];
            var    writer = new BufferValueWriter(buffer);

            writer.Write(context, TestEnum.High);
            int len = writer.Length;

            writer.Flush();

            var reader = new BufferValueReader(buffer);

            Assert.AreEqual(TestEnum.High, reader.Read <TestEnum> (context));
            Assert.AreEqual(len, reader.Position);
        }
コード例 #18
0
ファイル: ExtensionsTests.cs プロジェクト: terite/Tempest
        public void ReadWrite7BitInt()
        {
            var writer = new BufferValueWriter(new byte[20480]);

            writer.Write7BitEncodedInt(Int32.MinValue);
            writer.Write7BitEncodedInt(0);
            writer.Write7BitEncodedInt(Int32.MaxValue);
            writer.Flush();

            var reader = new BufferValueReader(writer.Buffer);

            Assert.AreEqual(Int32.MinValue, reader.Read7BitEncodedInt());
            Assert.AreEqual(0, reader.Read7BitEncodedInt());
            Assert.AreEqual(Int32.MaxValue, reader.Read7BitEncodedInt());
        }
コード例 #19
0
ファイル: ExtensionsTests.cs プロジェクト: ermau/Tempest
        public void ReadWrite7BitInt()
        {
            var writer = new BufferValueWriter (new byte[20480]);

            writer.Write7BitEncodedInt (Int32.MinValue);
            writer.Write7BitEncodedInt (0);
            writer.Write7BitEncodedInt (Int32.MaxValue);
            writer.Flush();

            var reader = new BufferValueReader (writer.Buffer);

            Assert.AreEqual (Int32.MinValue, reader.Read7BitEncodedInt());
            Assert.AreEqual (0, reader.Read7BitEncodedInt());
            Assert.AreEqual (Int32.MaxValue, reader.Read7BitEncodedInt());
        }
コード例 #20
0
        public void Serializer()
        {
            byte[] buffer = new byte[1024];
            var    writer = new BufferValueWriter(buffer);

            var c = SerializationContextTests.GetContext(MockProtocol.Instance);
            var p = new Protocol(42, 248);

            p.Serialize(c, writer);
            writer.Flush();

            var reader = new BufferValueReader(buffer);
            var p2     = new Protocol(c, reader);

            Assert.AreEqual(p.id, p2.id);
            Assert.AreEqual(p.Version, p2.Version);
        }
コード例 #21
0
        public void ReadWriteLongSet()
        {
            var writer = new BufferValueWriter(new byte[1]);

            for (int i = 0; i < 20480; ++i)
            {
                writer.WriteInt32(i);
            }

            writer.Flush();

            var reader = new BufferValueReader(writer.Buffer);

            for (int i = 0; i < 20480; ++i)
            {
                Assert.AreEqual(i, reader.ReadInt32());
            }
        }
コード例 #22
0
ファイル: PersonTests.cs プロジェクト: ermau/Tempest.Social
		public void Serialize()
		{
			var person = new Person ("foobar") {
				Nickname = "MyNickname",
				Avatar = "MyAvatar",
				Status = Status.Away
			};

			byte[] buffer = new byte[2048];
			var bufferWriter = new BufferValueWriter (buffer);

			person.Serialize (null, bufferWriter);

			var bufferReader = new BufferValueReader (buffer);
			var person2 = new Person (null, bufferReader);

			Assert.AreEqual (person.Identity, person2.Identity);
			Assert.AreEqual (person.Nickname, person2.Nickname);
			Assert.AreEqual (person.Avatar, person2.Avatar);
			Assert.AreEqual (person.Status, person2.Status);
		}
コード例 #23
0
        public void Serialize()
        {
            var person = new Person("foobar")
            {
                Nickname = "MyNickname",
                Avatar   = "MyAvatar",
                Status   = Status.Away
            };

            byte[] buffer       = new byte[2048];
            var    bufferWriter = new BufferValueWriter(buffer);

            person.Serialize(null, bufferWriter);

            var bufferReader = new BufferValueReader(buffer);
            var person2      = new Person(null, bufferReader);

            Assert.AreEqual(person.Identity, person2.Identity);
            Assert.AreEqual(person.Nickname, person2.Nickname);
            Assert.AreEqual(person.Avatar, person2.Avatar);
            Assert.AreEqual(person.Status, person2.Status);
        }
コード例 #24
0
        protected void EncryptMessage(BufferValueWriter writer, ref int headerLength)
        {
            AesManaged am = AES;

            if (am == null)
            {
                return;
            }

            ICryptoTransform encryptor = null;

            byte[] iv = null;
            lock (am)
            {
                am.GenerateIV();
                iv        = am.IV;
                encryptor = am.CreateEncryptor();
            }

            const int workingHeaderLength = LengthOffset + sizeof(int);             // right after length

            int r = ((writer.Length - workingHeaderLength) % encryptor.OutputBlockSize);

            if (r != 0)
            {
                writer.Pad(encryptor.OutputBlockSize - r);
            }

            byte[] payload = encryptor.TransformFinalBlock(writer.Buffer, workingHeaderLength, writer.Length - workingHeaderLength);

            writer.Length = workingHeaderLength;
            writer.InsertBytes(workingHeaderLength, BitConverter.GetBytes(iv.Length), 0, sizeof(int));
            writer.InsertBytes(workingHeaderLength + sizeof(int), iv, 0, iv.Length);
            writer.WriteInt32(payload.Length);
            writer.InsertBytes(writer.Length, payload, 0, payload.Length);

            headerLength += iv.Length + sizeof(int);
        }
コード例 #25
0
        // [Test] Testing core APIs that now have NETFX_CORE turned on everywhere
        public void Serializable()
        {
            var inner = new Exception("Inner exception");
            var ex    = new InvalidOperationException("Don't do this, fool.", inner);

            byte[] buffer = new byte[20480];
            var    writer = new BufferValueWriter(buffer);

            writer.Write(context, ex);
            writer.Flush();

            var reader = new BufferValueReader(buffer);

            InvalidOperationException ioex = SerializerExtensions.Read <InvalidOperationException> (reader, context);

            Assert.IsNotNull(ioex);
            Assert.AreEqual(ex.Message, ioex.Message);
            Assert.AreEqual(ex.StackTrace, ioex.StackTrace);

            Assert.IsNotNull(ioex.InnerException);
            Assert.AreEqual(inner.Message, ioex.InnerException.Message);
            Assert.AreEqual(inner.StackTrace, ioex.InnerException.StackTrace);
        }
コード例 #26
0
        internal void Receive(MessageEventArgs e)
        {
            var context = new SerializationContext();
            var writer  = new BufferValueWriter(new byte[1024]);

            e.Message.WritePayload(context, writer);

            var reader  = new BufferValueReader(writer.Buffer);
            var message = e.Message.Protocol.Create(e.Message.MessageType);

            message.ReadPayload(context, reader);
            message.Header = e.Message.Header;

            var tmessage = (e.Message as TempestMessage);

            if (tmessage == null)
            {
                OnMessageReceived(new MessageEventArgs(e.Connection, message));
            }
            else
            {
                OnTempestMessageReceived(new MessageEventArgs(e.Connection, message));
            }
        }
コード例 #27
0
        public unsafe byte[] GetBytes(Message message, out int length, byte[] buffer)
                #endif
        {
            string callCategory = null;

                        #if TRACE
            int c = GetNextCallId();
            callCategory = String.Format("{0} {1}:GetBytes({2},{3})", this.connectionType, c, message, buffer.Length);
                        #endif

            Trace.WriteLineIf(NTrace.TraceVerbose, "Entering", callCategory);

            int messageId = message.Header.MessageId;
            if (message.Header.IsResponse)
            {
                messageId |= ResponseFlag;
            }

            BufferValueWriter writer = new BufferValueWriter(buffer);
            writer.EnsureAdditionalCapacity(15);

            int cid          = (connection != null) ? connection.ConnectionId : 0;
            int headerLength = BaseHeaderLength;

                        #if SAFE
            writer.WriteByte(message.Protocol.id);

            writer.WriteInt32(cid);              // TODO: Change to variable length later

            writer.WriteUInt16(message.MessageType);
            writer.Length += sizeof(int);              // length placeholder

            writer.WriteInt32(messageId);

            if (message.Header.IsResponse)
            {
                writer.WriteInt32(message.Header.ResponseMessageId);
                headerLength += sizeof(int);
            }
                        #else
            fixed(byte *bptr = writer.Buffer)
            {
                *bptr = message.Protocol.id;
                *((int *)(bptr + 1))    = cid;
                *((ushort *)(bptr + 5)) = message.MessageType;
                *((int *)(bptr + 11))   = messageId;

                if (message.Header.IsResponse)
                {
                    *((int *)(bptr + 15)) = message.Header.ResponseMessageId;
                    headerLength         += sizeof(int);
                }
            }

            writer.Extend(headerLength);
                        #endif

            if (this.serializationContext == null)
            {
                if (this.connection != null)
                {
                    this.serializationContext = new SerializationContext(this.connection, this.protocols);
                }
                else
                {
                    this.serializationContext = new SerializationContext(this.protocols);
                }
            }

            message.WritePayload(this.serializationContext, writer);

            if (message.Encrypted)
            {
                EncryptMessage(writer, ref headerLength);
            }
            else if (message.Authenticated)
            {
                                #if SAFE
                for (int i = LengthOffset; i < LengthOffset + sizeof(int); ++i)
                {
                    writer.Buffer[i] = 0;
                }
                                #else
                fixed(byte *mptr = writer.Buffer)
                * ((int *)(mptr + LengthOffset)) = 0;
                                #endif

                SignMessage(message, this.signingHashAlgorithm, writer);
            }

            byte[] rawMessage = writer.Buffer;
            length = writer.Length;

                        #if SAFE
            Buffer.BlockCopy(BitConverter.GetBytes(length), 0, rawMessage, LengthOffset, sizeof(int));
                        #else
            fixed(byte *mptr = rawMessage)
            * ((int *)(mptr + LengthOffset)) = length;
                        #endif

            Trace.WriteLineIf(NTrace.TraceVerbose, String.Format("Exiting. Length: {0}", length), callCategory);

            return(rawMessage);
        }
コード例 #28
0
		protected override void OnTempestMessage (MessageEventArgs e)
		{
			switch (e.Message.MessageType)
			{
				case (ushort)TempestMessageType.AcknowledgeConnect:
				{
					var msg = (AcknowledgeConnectMessage)e.Message;

					this.serializer.Protocols = this.serializer.Protocols.Intersect (msg.EnabledProtocols);
					ConnectionId = msg.ConnectionId;

					this.remoteEncryption = new RSACrypto();
					this.remoteEncryption.ImportKey (msg.PublicEncryptionKey);

					var encryption = new AesManaged { KeySize = 256 };
					encryption.GenerateKey();

					BufferValueWriter authKeyWriter = new BufferValueWriter (new byte[1600]);
					LocalKey.Serialize (authKeyWriter, this.remoteEncryption);

					SendAsync (new FinalConnectMessage
					{
						AESKey = this.remoteEncryption.Encrypt (encryption.Key),
						PublicAuthenticationKeyType = LocalKey.GetType(),
						PublicAuthenticationKey = authKeyWriter.ToArray()
					});

					this.serializer.AES = encryption;
					this.serializer.HMAC = new HMACSHA256 (encryption.Key);

					break;
				}

				case (ushort)TempestMessageType.Connected:
				{
					var msg = (ConnectedMessage)e.Message;
					
					ConnectionId = msg.ConnectionId;

					this.formallyConnected = true;

					Timer t = Interlocked.Exchange (ref this.connectTimer, null);
					if (t != null)
						t.Dispose();

					var tcs = Interlocked.Exchange (ref this.connectTcs, null);
					if (tcs != null)
					{
						if (tcs.TrySetResult (new ClientConnectionResult (ConnectionResult.Success, RemoteKey)))
							OnConnected();
					}

					break;
				}

				default:
					base.OnTempestMessage (e);
					break;
			}
		}
コード例 #29
0
        protected override IValueReader GetReader(IValueWriter writer)
        {
            BufferValueWriter bufferWriter = (BufferValueWriter)writer;

            return(new BufferValueReader(bufferWriter.Buffer));
        }
コード例 #30
0
        protected override void OnTempestMessageReceived(MessageEventArgs e)
        {
            switch (e.Message.MessageType)
            {
            case (ushort)TempestMessageType.Ping:
                var ping = (PingMessage)e.Message;
                if (PingFrequency == 0 || this.activityTimer == null)
                {
                    if (this.activityTimer != null)
                    {
                        this.activityTimer.Dispose();
                    }

                    if (ping.Interval != 0)
                    {
                        this.activityTimer          = new Tempest.Timer(100);
                        this.activityTimer.TimesUp += OnActivityTimer;
                        this.activityTimer.Start();
                    }
                }
                else if (ping.Interval != PingFrequency)
                {
                    this.activityTimer.Interval = ping.Interval;
                }

                base.OnTempestMessageReceived(e);
                break;

            case (ushort)TempestMessageType.AcknowledgeConnect:
                var msg = (AcknowledgeConnectMessage)e.Message;

                this.protocols = this.protocols.Values.Intersect(msg.EnabledProtocols).ToDictionary(pr => pr.id);
                ConnectionId   = msg.ConnectionId;

                this.serverEncryption = new RSACrypto();
                this.serverEncryption.ImportKey((RSAAsymmetricKey)msg.PublicEncryptionKey);
                this.serverEncryptionKey = (RSAAsymmetricKey)msg.PublicEncryptionKey;

                var encryption = new AesManaged {
                    KeySize = 256
                };
                encryption.GenerateKey();

                BufferValueWriter authKeyWriter = new BufferValueWriter(new byte[1600]);
                this.publicAuthenticationKey.Serialize(this.serializer.SerializationContext, authKeyWriter, this.serverEncryption);

                this.serializer.AES  = encryption;
                this.serializer.HMAC = new HMACSHA256(encryption.Key);

                SendAsync(new FinalConnectMessage
                {
                    AESKey = this.serverEncryption.Encrypt(encryption.Key),
                    PublicAuthenticationKeyType = this.publicAuthenticationKey.GetType(),
                    PublicAuthenticationKey     = authKeyWriter.ToArray()
                });

                break;

            case (ushort)TempestMessageType.Connected:
                var connected = (ConnectedMessage)e.Message;
                ConnectionId = connected.ConnectionId;

                OnConnected(new ClientConnectionEventArgs(this));

                var tcs = Interlocked.Exchange(ref this.connectCompletion, null);
                if (tcs != null)
                {
                    tcs.SetResult(new ClientConnectionResult(ConnectionResult.Success, this.serverAuthenticationKey));
                }

                break;

            default:
                base.OnTempestMessageReceived(e);
                break;
            }
        }
コード例 #31
0
ファイル: TypeMapTests.cs プロジェクト: strager/Tempest
        public void Serialization()
        {
            var dict = new Dictionary<Type, ushort> { { typeof (string), 0 }, { typeof (int), 1 } };
            TypeMap map = new TypeMap (dict);

            byte[] buffer = new byte[20480];
            var writer = new BufferValueWriter (buffer);
            map.Serialize (null, writer);
            writer.Flush();

            var reader = new BufferValueReader (buffer);
            map = new TypeMap();
            map.Deserialize (null, reader);

            Type type;
            Assert.IsTrue (map.TryGetType (0, out type));
            Assert.AreEqual (typeof (string), type);
            Assert.IsTrue (map.TryGetType (1, out type));
            Assert.AreEqual (typeof (int), type);

            ushort id;
            Assert.IsFalse (map.GetTypeId (typeof (string), out id));
            Assert.AreEqual (0, id);
            Assert.IsFalse (map.GetTypeId (typeof (int), out id));
            Assert.AreEqual (1, id);
        }
コード例 #32
0
 public void BufferWriterOverflow()
 {
     byte[] buffer = new byte[4];
     var writer = new BufferValueWriter (buffer, false);
     Assert.Throws<InternalBufferOverflowException> (() => writer.WriteInt64 (1));
 }
コード例 #33
0
 protected override void SignMessage(string hashAlg, BufferValueWriter writer)
 {
     if (this.hmac == null)
         writer.WriteBytes (this.provider.authentication.HashAndSign (hashAlg, writer.Buffer, 0, writer.Length));
     else
         base.SignMessage (hashAlg, writer);
 }
コード例 #34
0
        protected override void OnTempestMessage(MessageEventArgs e)
        {
            switch (e.Message.MessageType)
            {
            case (ushort)TempestMessageType.AcknowledgeConnect:
            {
                var msg = (AcknowledgeConnectMessage)e.Message;

                this.serializer.Protocols = this.serializer.Protocols.Intersect(msg.EnabledProtocols);
                ConnectionId = msg.ConnectionId;

                this.remoteEncryption = new RSACrypto();
                this.remoteEncryption.ImportKey((RSAAsymmetricKey)msg.PublicEncryptionKey);

                var encryption = new AesManaged {
                    KeySize = 256
                };
                encryption.GenerateKey();

                BufferValueWriter authKeyWriter = new BufferValueWriter(new byte[1600]);
                LocalKey.Serialize(this.serializer.SerializationContext, authKeyWriter, this.remoteEncryption);

                SendAsync(new FinalConnectMessage
                    {
                        AESKey = this.remoteEncryption.Encrypt(encryption.Key),
                        PublicAuthenticationKeyType = LocalKey.GetType(),
                        PublicAuthenticationKey     = authKeyWriter.ToArray()
                    });

                this.serializer.AES  = encryption;
                this.serializer.HMAC = new HMACSHA256(encryption.Key);

                break;
            }

            case (ushort)TempestMessageType.Connected:
            {
                var msg = (ConnectedMessage)e.Message;

                ConnectionId = msg.ConnectionId;

                this.formallyConnected = true;

                Timer t = Interlocked.Exchange(ref this.connectTimer, null);
                if (t != null)
                {
                    t.Dispose();
                }

                var tcs = Interlocked.Exchange(ref this.connectTcs, null);
                if (tcs != null)
                {
                    if (tcs.TrySetResult(new ClientConnectionResult(ConnectionResult.Success, RemoteKey)))
                    {
                        OnConnected();
                    }
                }

                break;
            }

            default:
                base.OnTempestMessage(e);
                break;
            }
        }
コード例 #35
0
        public void Contracted()
        {
            byte[] buffer = new byte[20480];
            var writer = new BufferValueWriter (buffer);

            ISerializableTester test = new SerializableTester
            {
                Name = "MONKEY!",
                Numbers = new[] { 1, 2, 4, 8, 16, 32 }
            };

            writer.Write (context, test);
            writer.Flush();

            var reader = new BufferValueReader (buffer);
            var serialized = SerializerExtensions.Read<ISerializableTester> (reader, context);

            Assert.IsNotNull (serialized);
            Assert.AreEqual (test.Name, serialized.Name);
            Assert.IsTrue (test.Numbers.SequenceEqual (serialized.Numbers), "Numbers does not match");
        }
コード例 #36
0
ファイル: ProtocolTests.cs プロジェクト: strager/Tempest
        public void Serializer()
        {
            byte[] buffer = new byte[1024];
            var writer = new BufferValueWriter (buffer);

            var c = SerializationContextTests.GetContext (MockProtocol.Instance);
            var p = new Protocol (42, 248);
            p.Serialize (c, writer);
            writer.Flush();

            var reader = new BufferValueReader (buffer);
            var p2 = new Protocol (c, reader);

            Assert.AreEqual (p.id, p2.id);
            Assert.AreEqual (p.Version, p2.Version);
        }
コード例 #37
0
        protected override void OnTempestMessageReceived(MessageEventArgs e)
        {
            switch (e.Message.MessageType)
            {
                case (ushort)TempestMessageType.Ping:
                    var ping = (PingMessage)e.Message;
                    if (PingFrequency == 0 || this.activityTimer == null)
                    {
                        if (this.activityTimer != null)
                            this.activityTimer.Dispose();

                        if (ping.Interval != 0)
                        {
                            this.activityTimer = new Tempest.Timer (100);
                            this.activityTimer.TimesUp += OnActivityTimer;
                            this.activityTimer.Start();
                        }
                    }
                    else if (ping.Interval != PingFrequency)
                        this.activityTimer.Interval = ping.Interval;

                    base.OnTempestMessageReceived (e);
                    break;

                case (ushort)TempestMessageType.AcknowledgeConnect:
                    var msg = (AcknowledgeConnectMessage)e.Message;

                    this.protocols = this.protocols.Values.Intersect (msg.EnabledProtocols).ToDictionary (pr => pr.id);
                    ConnectionId = msg.ConnectionId;

                    this.serverEncryption = new RSACrypto();
                    this.serverEncryption.ImportKey (msg.PublicEncryptionKey);
                    this.serverEncryptionKey = msg.PublicEncryptionKey;

                    var encryption = new AesManaged { KeySize = 256 };
                    encryption.GenerateKey();

                    BufferValueWriter authKeyWriter = new BufferValueWriter (new byte[1600]);
                    this.publicAuthenticationKey.Serialize (authKeyWriter, this.serverEncryption);

                    this.serializer.AES = encryption;
                    this.serializer.HMAC = new HMACSHA256 (encryption.Key);

                    SendAsync (new FinalConnectMessage
                    {
                        AESKey = this.serverEncryption.Encrypt (encryption.Key),
                        PublicAuthenticationKeyType = this.publicAuthenticationKey.GetType(),
                        PublicAuthenticationKey = authKeyWriter.ToArray()
                    });

                    break;

                case (ushort)TempestMessageType.Connected:
                    var connected = (ConnectedMessage) e.Message;
                    ConnectionId = connected.ConnectionId;

                    OnConnected (new ClientConnectionEventArgs (this));

                    var tcs = Interlocked.Exchange (ref this.connectCompletion, null);
                    if (tcs != null)
                        tcs.TrySetResult (new ClientConnectionResult (ConnectionResult.Success, this.serverAuthenticationKey));

                    break;

                default:
                    base.OnTempestMessageReceived(e);
                    break;
            }
        }
コード例 #38
0
        public void PrimitiveAsObject()
        {
            byte[] buffer = new byte[1024];
            var writer = new BufferValueWriter (buffer);

            writer.Write (context, (object)20f);
            writer.Flush();

            var reader = new BufferValueReader (buffer);
            object value = SerializerExtensions.Read<object> (reader, context);

            Assert.IsNotNull (value);
            Assert.AreEqual (20f, value);
        }
コード例 #39
0
        // [Test] Testing core APIs that now have NETFX_CORE turned on everywhere
        public void Serializable()
        {
            var inner = new Exception ("Inner exception");
            var ex = new InvalidOperationException ("Don't do this, fool.", inner);

            byte[] buffer = new byte[20480];
            var writer = new BufferValueWriter (buffer);

            writer.Write (context, ex);
            writer.Flush();

            var reader = new BufferValueReader (buffer);

            InvalidOperationException ioex = SerializerExtensions.Read<InvalidOperationException> (reader, context);

            Assert.IsNotNull (ioex);
            Assert.AreEqual (ex.Message, ioex.Message);
            Assert.AreEqual (ex.StackTrace, ioex.StackTrace);

            Assert.IsNotNull (ioex.InnerException);
            Assert.AreEqual (inner.Message, ioex.InnerException.Message);
            Assert.AreEqual (inner.StackTrace, ioex.InnerException.StackTrace);
        }
コード例 #40
0
        public void SerializableTypeContainingNonSerializableField()
        {
            byte[] buffer = new byte[20480];
            var writer = new BufferValueWriter (buffer);

            ObjectSerializer serializer = ObjectSerializer.GetSerializer (typeof (SerializableWithNonSerializableField));

            var test = new SerializableWithNonSerializableField (2, 3, "hi");

            serializer.Serialize (context, writer, test);
            writer.Flush();

            var reader = new BufferValueReader (buffer);
            var serialized = (SerializableWithNonSerializableField)serializer.Deserialize (context, reader);

            Assert.AreEqual (2, serialized.X);
            Assert.AreEqual (3, serialized.Y);
            Assert.AreEqual ("hi", serialized.Content);
        }
コード例 #41
0
        public void ValueReaderCtor()
        {
            byte[] buffer = new byte[20480];
            var writer = new BufferValueWriter (buffer);

            ValueReaderTester test = new ValueReaderTester ("TheName");

            writer.Write (context, test);
            writer.Flush();

            var reader = new BufferValueReader (buffer);
            var serialized = SerializerExtensions.Read<ValueReaderTester> (reader, context);

            Assert.AreEqual (test.Name, serialized.Name);
        }
コード例 #42
0
		public void Serialize()
		{
			var person = new Person ("first");
			var person2 = new Person ("second");
			list.Add (person);
			server.DequeueAndAssertMessage<BuddyListMessage>();
			list.Add (person2);
			server.DequeueAndAssertMessage<BuddyListMessage>();

			var writer = new BufferValueWriter (new byte[1024]);
			list.Serialize (clientContext, writer);

			server.AssertNoMessage();

			var reader = new BufferValueReader (writer.Buffer);
			list.Deserialize (clientContext, reader);

			Assert.AreEqual (writer.Length, reader.Position);

			server.AssertNoMessage();

			CollectionAssert.Contains (list, person);
			CollectionAssert.Contains (list, person2);
		}