Пример #1
0
        public void HandleClosePipeRequest()
        {
            ClosePipeRPC close     = new ClosePipeRPC(100);
            uint         requestId = close.RequestID;
            //create the connection
            ControlPipe     c      = new ControlPipe(tunnel);
            EncryptedPacket packet = new EncryptedPacket(tunnel.ID, 0);

            packet.RPCs.Add(new CreateAnonymousPipe(PipeType.Duplex.ToString(), 100));
            c.HandlePacket(packet);

            tunnel.PacketInterceptor(p =>
            {
                Assert.That(p.RPCs.Count > 0);
                Assert.That(p.RPCs.First.SerializationTag == (byte)RPCType.Ok);
                OkRPC ok = (OkRPC)p.RPCs.First;
                Assert.IsTrue(ok.RPCID == requestId);
            });

            tunnel.PipeInterceptor(connection =>
            {
                Assert.That(connection.ID == 100);
            });
            packet = new EncryptedPacket(tunnel.ID, 0);
            packet.RPCs.Add(close);
            c.HandlePacket(packet);
        }
Пример #2
0
        private void SendOk(UInt32 rpid)
        {
            OkRPC           ok = new OkRPC(rpid);
            EncryptedPacket p  = new EncryptedPacket(this.mTunnel.ID, this.ID);

            p.RPCs.Add(ok);
            this.mTunnel.EncryptAndSendPacket(p);
        }
Пример #3
0
        public void HandleRekey()
        {
            //A rekey cannot happen until a prepare rekey rpc has been sent (note that they can be send together)
            //todo: add a test to send a prepare rekey and rekey together
            bool trigger1, trigger2, trigger3;

            trigger1 = trigger2 = trigger3 = false;
            KeyPair      pair         = Sodium.PublicKeyBox.GenerateKeyPair();
            PrepareRekey prepareRekey = new PrepareRekey(pair.PublicKey);
            RekeyNow     rekey        = new RekeyNow();

            tunnel.PacketInterceptor(p =>
            {
                Assert.That(p.RPCs.Count > 0);
                Assert.That(p.RPCs.First.SerializationTag == (byte)RPCType.Refuse);
                Refuse rpc = (Refuse)p.RPCs.First;
                trigger1   = true;
            });
            ControlPipe     c      = new ControlPipe(tunnel);
            EncryptedPacket packet = new EncryptedPacket(tunnel.ID, 0);

            packet.RPCs.Add(rekey);
            c.HandlePacket(packet);
            Assert.IsTrue(trigger1, "Refuse block never called");

            tunnel.PacketInterceptor(p =>
            {
                Assert.That(p.RPCs.Count > 0);
                Assert.That(p.RPCs.First.SerializationTag == (byte)RPCType.RekeyResponse);
                RekeyResponse ok = (RekeyResponse)p.RPCs.First;
                Assert.IsTrue(ok.NextPublicKey.Length == 32);
                trigger2 = true;
            });


            packet = new EncryptedPacket(tunnel.ID, 0);
            packet.RPCs.Add(new PrepareRekey(new byte[] { 1, 2, 3 }));
            c.HandlePacket(packet);
            Assert.IsTrue(trigger2, "Rekey ack block never called");

            tunnel.PacketInterceptor(p =>
            {
                Assert.That(p.RPCs.Count > 0);
                Assert.That(p.RPCs.First.SerializationTag == (byte)RPCType.Ok);
                OkRPC ok = (OkRPC)p.RPCs.First;
                Assert.IsTrue(ok.RPCID == rekey.RequestID);
                trigger3 = true;
            });

            packet = new EncryptedPacket(tunnel.ID, 0);
            packet.RPCs.Add(rekey);
            c.HandlePacket(packet);



            Assert.IsTrue(trigger1, "Rekey now block never called");
            Assert.IsTrue(trigger3);
        }