示例#1
0
        public void Can_decrypt_auth_message()
        {
            Hex hex = "048ca79ad18e4b0659fab4853fe5bc58eb83992980f4c9cc147d2aa31532efd29a3d3dc6a3d89eaf" +
                      "913150cfc777ce0ce4af2758bf4810235f6e6ceccfee1acc6b22c005e9e3a49d6448610a58e98744" +
                      "ba3ac0399e82692d67c1f58849050b3024e21a52c9d3b01d871ff5f210817912773e610443a9ef14" +
                      "2e91cdba0bd77b5fdf0769b05671fc35f83d83e4d3b0b000c6b2a1b1bba89e0fc51bf4e460df3105" +
                      "c444f14be226458940d6061c296350937ffd5e3acaceeaaefd3c6f74be8e23e0f45163cc7ebd7622" +
                      "0f0128410fd05250273156d548a414444ae2f7dea4dfca2d43c057adb701a715bf59f6fb66b2d1d2" +
                      "0f2c703f851cbf5ac47396d9ca65b6260bd141ac4d53e2de585a73d1750780db4c9ee4cd4d225173" +
                      "a4592ee77e2bd94d0be3691f3b406f9bba9b591fc63facc016bfa8";

            byte[] deciphered = _eciesCipher.Decrypt(NetTestVectors.StaticKeyB, hex);

            AuthMessage authMessage = _messageSerializationService.Deserialize <AuthMessage>(deciphered);

            Assert.AreEqual(authMessage.PublicKey, NetTestVectors.StaticKeyA.PublicKey);
            Assert.AreEqual(authMessage.EphemeralPublicHash, Keccak.Compute(NetTestVectors.EphemeralKeyA.PublicKey.Bytes));
            Assert.AreEqual(authMessage.Nonce, NetTestVectors.NonceA);
            Assert.AreEqual(authMessage.IsTokenUsed, false);
            Assert.NotNull(authMessage.Signature);

            byte[] data = _messageSerializationService.Serialize(authMessage);
            Array.Resize(ref data, deciphered.Length);
            Assert.AreEqual(deciphered, data, "serialization");
        }
示例#2
0
        public void PingMessageTest()
        {
            var message = new PingMessage
            {
                FarAddress         = _farAddress,
                DestinationAddress = _nearAddress,
                SourceAddress      = _farAddress,
                FarPublicKey       = _privateKey.PublicKey,
                ExpirationTime     = 60 + (long)_timestamper.EpochMilliseconds
            };

            var data = _messageSerializationService.Serialize(message);
            var deserializedMessage = _messageSerializationService.Deserialize <PingMessage>(data);

            Assert.AreEqual(message.MessageType, deserializedMessage.MessageType);
            Assert.AreEqual(message.FarPublicKey, deserializedMessage.FarPublicKey);
            Assert.AreEqual(message.ExpirationTime, deserializedMessage.ExpirationTime);

            Assert.AreEqual(message.FarAddress, deserializedMessage.SourceAddress);
            Assert.AreEqual(message.DestinationAddress, deserializedMessage.DestinationAddress);
            Assert.AreEqual(message.SourceAddress, deserializedMessage.SourceAddress);
            Assert.AreEqual(message.Version, deserializedMessage.Version);

            byte[] expectedPingMdc = Bytes.FromHexString("0xf8c61953f3b94a91aefe611e61dd74fe26aa5c969d9f29b7e063e6169171a772");
            Assert.IsNotNull(expectedPingMdc);
        }
示例#3
0
        public void PingMessageTest()
        {
            var message = new PingMessage
            {
                FarAddress         = _farAddress,
                DestinationAddress = _nearAddress,
                SourceAddress      = _farAddress,
                Version            = _config.PingMessageVersion,
                FarPublicKey       = _privateKey.PublicKey,
                ExpirationTime     = 60 + (long)_timestamper.EpochMilliseconds
            };

            var data = _messageSerializationService.Serialize(message);
            var deserializedMessage = _messageSerializationService.Deserialize <PingMessage>(data);

            Assert.AreEqual(message.MessageType, deserializedMessage.MessageType);
            Assert.AreEqual(message.FarPublicKey, deserializedMessage.FarPublicKey);
            Assert.AreEqual(message.ExpirationTime, deserializedMessage.ExpirationTime);

            Assert.AreEqual(message.FarAddress, deserializedMessage.SourceAddress);
            Assert.AreEqual(message.DestinationAddress, deserializedMessage.DestinationAddress);
            Assert.AreEqual(message.SourceAddress, deserializedMessage.SourceAddress);
            Assert.AreEqual(message.Version, deserializedMessage.Version);
            Assert.IsNotNull(deserializedMessage.Mdc);
        }
示例#4
0
        public Packet Auth(PublicKey remoteNodeId, EncryptionHandshake handshake)
        {
            handshake.RemoteNodeId        = remoteNodeId;
            handshake.InitiatorNonce      = _cryptoRandom.GenerateRandomBytes(32);
            handshake.EphemeralPrivateKey = _ephemeralGenerator.Generate();

            byte[] staticSharedSecret = Proxy.EcdhSerialized(remoteNodeId.Bytes, _privateKey.KeyBytes);
            byte[] forSigning         = staticSharedSecret.Xor(handshake.InitiatorNonce);

            AuthEip8Message authMessage = new AuthEip8Message();

            authMessage.Nonce     = handshake.InitiatorNonce;
            authMessage.PublicKey = _privateKey.PublicKey;
            authMessage.Signature = _ecdsa.Sign(handshake.EphemeralPrivateKey, new Keccak(forSigning));

            byte[] authData = _messageSerializationService.Serialize(authMessage);
            int    size     = authData.Length + 32 + 16 + 65; // data + MAC + IV + pub

            byte[] sizeBytes  = size.ToBigEndianByteArray().Slice(2, 2);
            byte[] packetData = _eciesCipher.Encrypt(
                remoteNodeId,
                authData,
                sizeBytes);

            handshake.AuthPacket = new Packet(Bytes.Concat(sizeBytes, packetData));
            return(handshake.AuthPacket);
        }
示例#5
0
        public void PingMessageTest()
        {
            var message = new PingMessage
            {
                FarAddress         = _farAddress,
                DestinationAddress = _nearAddress,
                SourceAddress      = _farAddress,
                Version            = _config.PingMessageVersion,
                FarPublicKey       = _privateKey.PublicKey,
                ExpirationTime     = _config.DiscoveryMsgExpiryTime + Timestamp.UnixUtcUntilNowMilisecs
            };

            var data = _messageSerializationService.Serialize(message);
            var deserializedMessage = _messageSerializationService.Deserialize <PingMessage>(data);

            Assert.AreEqual(message.MessageType, deserializedMessage.MessageType);
            Assert.AreEqual(message.FarPublicKey, deserializedMessage.FarPublicKey);
            Assert.AreEqual(message.ExpirationTime, deserializedMessage.ExpirationTime);

            Assert.AreEqual(message.FarAddress, deserializedMessage.SourceAddress);
            Assert.AreEqual(message.DestinationAddress, deserializedMessage.DestinationAddress);
            Assert.AreEqual(message.SourceAddress, deserializedMessage.SourceAddress);
            Assert.AreEqual(message.Version, deserializedMessage.Version);
            Assert.IsNotNull(deserializedMessage.Mdc);
        }
示例#6
0
        public void handling_hi_message_should_succeed()
        {
            _verifySignature = true;
            InitSubprotocol();
            var hiMessage = new HiMessage(1, TestItem.AddressC, TestItem.AddressD, TestItem.PublicKeyA,
                                          new Signature(1, 1, 27));
            var hiPacket = new Packet(hiMessage.Protocol, hiMessage.PacketType,
                                      _messageSerializationService.Serialize(hiMessage));

            _messageSerializationService.Deserialize <HiMessage>(hiPacket.Data).Returns(hiMessage);
            var hash = Keccak.Compute(hiMessage.NodeId.Bytes);

            _ecdsa.RecoverPublicKey(hiMessage.Signature, hash).Returns(TestItem.PublicKeyA);
            _subprotocol.HandleMessage(hiPacket);
            _ecdsa.Received().RecoverPublicKey(hiMessage.Signature, hash);
            _subprotocol.ProviderAddress.Should().Be(hiMessage.ProviderAddress);
            _subprotocol.ConsumerAddress.Should().Be(hiMessage.ConsumerAddress);
            _consumerService.Received().AddProviderPeer(_subprotocol);
            var getDataAssetsMessage = new GetDataAssetsMessage();

            _messageSerializationService.Serialize(getDataAssetsMessage).Returns(Array.Empty <byte>());
            var getDataAssetsPacket = new Packet(getDataAssetsMessage.Protocol, getDataAssetsMessage.PacketType,
                                                 _messageSerializationService.Serialize(getDataAssetsMessage));

            _messageSerializationService.Deserialize <GetDataAssetsMessage>(getDataAssetsPacket.Data)
            .Returns(getDataAssetsMessage);

            Received.InOrder(() =>
            {
                _session.DeliverMessage(Arg.Any <GetDataAssetsMessage>());
                _session.DeliverMessage(Arg.Any <GetDepositApprovalsMessage>());
            });
        }
示例#7
0
        public void TestBeforeHi <T>(T message) where T : P2PMessage
        {
            BuildSubprotocol();
            byte[] bytes  = _service.Serialize(message);
            Packet packet = new Packet(bytes);

            packet.PacketType = message.PacketType;
            Assert.Throws <SubprotocolException>(() => _subprotocol.HandleMessage(packet));
        }
示例#8
0
        private void Test <T>(T message) where T : P2PMessage
        {
            message.Protocol.Should().Be("ndm");

            FieldInfo fieldInfo = typeof(NdmMessageCode).GetField(message.GetType().Name.Replace("Message", string.Empty), BindingFlags.Static | BindingFlags.Public);

            message.PacketType.Should().Be((int)fieldInfo.GetValue(null));

            byte[] firstSer  = _service.Serialize(message);
            byte[] secondSer = _service.Serialize(_service.Deserialize <T>(firstSer));

            firstSer.Should().BeEquivalentTo(secondSer, typeof(T).Name + " -> " + firstSer.ToHexString());
        }
示例#9
0
        public void Enqueue <T>(T message) where T : P2PMessage
        {
            if (!_context.Channel.Active)
            {
                return;
            }

            IByteBuffer buffer = PooledByteBufferAllocator.Default.Buffer(512);

            buffer.WriteByte(message.AdaptivePacketType);
            _messageSerializationService.Serialize(message, buffer);
            _context.WriteAndFlushAsync(buffer).ContinueWith(t =>
            {
                if (t.IsFaulted)
                {
                    if (_context.Channel != null && !_context.Channel.Active)
                    {
                        if (_logger.IsTrace)
                        {
                            _logger.Trace($"Channel is not active - {t.Exception.Message}");
                        }
                    }
                    else if (_logger.IsError)
                    {
                        _logger.Error("Channel is active", t.Exception);
                    }
                }
                else if (t.IsCompleted)
                {
//                    if (_logger.IsTrace) _logger.Trace($"Packet ({packet.Protocol}.{packet.PacketType}) pushed");
                }
            });
        }
示例#10
0
        protected void Send <T>(T message) where T : P2PMessage
        {
            if (Logger.IsTrace)
            {
                Logger.Trace($"Sending {typeof(T).Name}");
            }
            Packet packet = new Packet(message.Protocol, message.PacketType, _serializer.Serialize(message));

            P2PSession.DeliverMessage(packet);
        }
        private byte[] Seserialize(DiscoveryMessage message)
        {
            switch (message.MessageType)
            {
            case MessageType.Ping:
                return(_messageSerializationService.Serialize((PingMessage)message));

            case MessageType.Pong:
                return(_messageSerializationService.Serialize((PongMessage)message));

            case MessageType.FindNode:
                return(_messageSerializationService.Serialize((FindNodeMessage)message));

            case MessageType.Neighbors:
                return(_messageSerializationService.Serialize((NeighborsMessage)message));

            default:
                throw new Exception($"Unsupported messageType: {message.MessageType}");
            }
        }
示例#12
0
        public void SendNewCapability(Capability capability)
        {
            var message = new AddCapabilityMessage(capability);
            var packet  = new Packet(Protocol.P2P, P2PMessageCode.AddCapability, _serializer.Serialize(message));

            foreach (var(_, session) in _sessions)
            {
                if (session.HasAgreedCapability(capability))
                {
                    continue;
                }
                if (!session.HasAvailableCapability(capability))
                {
                    continue;
                }

                session.DeliverMessage(packet);
            }
        }
示例#13
0
            public Context ReceiveDisconnect()
            {
                DisconnectMessage message = new DisconnectMessage(DisconnectReason.Other);

                _currentSession.ReceiveMessage(new Packet("p2p", P2PMessageCode.Disconnect, _serializer.Serialize(message)));
                return(this);
            }
示例#14
0
 private Packet CreatePacket(P2PMessage message)
 {
     return(new Packet(message.Protocol, message.PacketType, _serializer.Serialize(message)));
 }