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; }