public void TestSendEncryptedPacket()
        {
            SecureTunnel t         = new SecureTunnel(this.tunnelSocket);
            bool         triggered = false;

            byte[] server_epk = new byte[0];
            this.tunnelSocket.InterceptOutgoingPacket(p =>
            {
                Assert.IsNotNull(p.EuphemeralPublicKey);
                Assert.IsTrue(p.EuphemeralPublicKey.Length == 32);
                Assert.IsTrue(p.HasEPK);
                triggered  = true;
                server_epk = p.EuphemeralPublicKey;
            });
            String messageText = "The quick brown fox jumps over the lazy dog";
            //create an encryption key
            KeyPair         keyPair = Sodium.PublicKeyBox.GenerateKeyPair();
            EncryptedPacket hello   = new EncryptedPacket(1000, 0);

            hello.EuphemeralPublicKey = keyPair.PublicKey;
            t.HandleHelloPacket(hello);
            Assert.IsTrue(triggered);
            //these are just to ensure that the keys have been exchanged correctly.
            //We may want the response to a hello to be an encrypted rpc just for added protection -- there is no
            //need for the EPK to be transferred in the clear at this point.
            Assert.That(keyPair.PublicKey.SequenceEqual(t.recipentEPK));
            Assert.That(!keyPair.PublicKey.SequenceEqual(server_epk));
            Assert.That(t.mKeyPair.PublicKey.SequenceEqual(server_epk));
            triggered = false;

            this.tunnelSocket.InterceptOutgoingPacket(p =>
            {
                EncryptedPacket packet = (EncryptedPacket)p;
                Assert.IsNotNull(packet.ToBytes());
                if (packet.DecryptPacket(keyPair.PrivateKey, server_epk))
                {
                    String msg = System.Text.ASCIIEncoding.ASCII.GetString(packet.Payload);
                    System.Console.WriteLine(msg);
                    //Assert.IsTrue(msg.Equals (messageText));
                    triggered = true;
                }
                else
                {
                    Assert.Fail("Decryption failed");
                }
            });

            EncryptedPacket sentPacket = new EncryptedPacket(1000, 0);

            sentPacket.SetPayload(messageText);
            t.EncryptAndSendPacket(sentPacket);
            Assert.IsTrue(triggered);
        }
        private void SetupTunnelComms(SecureTunnel tunnel, out byte[] privateKey, out byte[] publicKey)
        {
            byte[] server_epk = new byte[0];
            this.tunnelSocket.InterceptOutgoingPacket(p =>
            {
                Assert.IsNotNull(p.EuphemeralPublicKey);
                Assert.IsTrue(p.EuphemeralPublicKey.Length == 32);
                Assert.IsTrue(p.HasEPK);
                server_epk = p.EuphemeralPublicKey;
            });
            String messageText = "The quick brown fox jumps over the lazy dog";
            //create an encryption key
            KeyPair         keyPair = Sodium.PublicKeyBox.GenerateKeyPair();
            EncryptedPacket hello   = new EncryptedPacket(1000, 0);

            hello.EuphemeralPublicKey = keyPair.PublicKey;
            tunnel.HandleHelloPacket(hello);
            privateKey = keyPair.PrivateKey;
            publicKey  = tunnel.mKeyPair.PublicKey;
        }