public void SendSomeMessagesBothDirectionsWithEcdhTest()
        {
            var(client, server) = Common.CreateAndInitialize();

            RandomNumberGenerator rng = new RandomNumberGenerator();

            byte[] cmessage1 = rng.Generate(32);
            byte[] cmessage2 = rng.Generate(32);
            byte[] cmessage3 = rng.Generate(32);
            byte[] smessage1 = rng.Generate(32);
            byte[] smessage2 = rng.Generate(32);
            byte[] smessage3 = rng.Generate(32);

            var cp1 = client.Send(cmessage1);
            var sr1 = server.Receive(cp1).Payload;

            Assert.Equal(cmessage1, sr1);

            var sp1 = server.Send(smessage1);
            var cr1 = client.Receive(sp1).Payload;

            Assert.Equal(smessage1, cr1);

            var cp2 = client.Send(cmessage2);
            var sr2 = server.Receive(cp2).Payload;

            Assert.Equal(cmessage2, sr2);

            var sp2 = server.Send(smessage2);
            var cr2 = client.Receive(sp2).Payload;

            Assert.Equal(smessage2, cr2);

            var cp3 = client.Send(cmessage3);
            var sr3 = server.Receive(cp3).Payload;

            Assert.Equal(cmessage3, sr3);

            var sp3 = server.Send(smessage3);
            var cr3 = client.Receive(sp3).Payload;

            Assert.Equal(smessage3, cr3);

            using var cms = new MemoryStream();
            using var sms = new MemoryStream();
            client.SaveState(cms); cms.Position = 0;
            server.SaveState(sms); sms.Position = 0;
            var cs = ClientState.Load(cms, DefaultKexFactory.Instance);
            var ss = ServerState.Load(sms, DefaultKexFactory.Instance);

            Assert.Equal(4, cs.Ratchets.Count);
            Assert.Equal(4, ss.Ratchets.Count);
        }
Beispiel #2
0
        public void ClientInitialization2ProcessTest()
        {
            BouncyCastleServices clientServices = new BouncyCastleServices(KeyGeneration.GeneratePrivateKey());
            BouncyCastleServices serverServices = new BouncyCastleServices(KeyGeneration.GeneratePrivateKey());

            var client = new MicroRatchetContext(clientServices, true);
            var server = new MicroRatchetContext(serverServices, false);

            var         clientInitPacket = client.InitiateInitialization();
            var         responsePacket   = server.Receive(clientInitPacket).ToSendBack;
            var         cs          = client.SaveStateAsByteArray();
            var         ss          = server.SaveStateAsByteArray();
            ClientState clientState = ClientState.Load(cs, DefaultKexFactory.Instance);
            ServerState serverState = ServerState.Load(ss, DefaultKexFactory.Instance);
        }
Beispiel #3
0
        public void ClientInitialization1MessageTest()
        {
            BouncyCastleServices clientServices = new BouncyCastleServices(KeyGeneration.GeneratePrivateKey());

            var client = new MicroRatchetContext(clientServices, true);

            var         clientInitPacket = client.InitiateInitialization();
            var         sb          = client.SaveStateAsByteArray();
            ClientState clientState = ClientState.Load(sb, DefaultKexFactory.Instance);

            Assert.NotNull(clientState.LocalEcdhForInit);
            Assert.NotNull(clientState.InitializationNonce);

            Assert.Equal(MicroRatchetContext.InitializationNonceSize, clientState.InitializationNonce.Length);
        }
Beispiel #4
0
        public void ClientInitializationRetransmitThrowsTest()
        {
            // this test makes sure that during the initialization process
            // any retransmitted packet will cause an exception. However,
            // the initialization process will not be affected and a client
            // and server can still process non-repeated messages.

            BouncyCastleServices clientServices = new BouncyCastleServices(KeyGeneration.GeneratePrivateKey());
            BouncyCastleServices serverServices = new BouncyCastleServices(KeyGeneration.GeneratePrivateKey());

            var client = new MicroRatchetContext(clientServices, true);
            var server = new MicroRatchetContext(serverServices, false);

            var clientInitPacket = client.InitiateInitialization();
            var responsePacket   = server.Receive(clientInitPacket.ToArray()).ToSendBack;

            Assert.Throws <InvalidOperationException>(() => server.Receive(clientInitPacket.ToArray()));
            var firstPacket = client.Receive(responsePacket.ToArray()).ToSendBack;

            Assert.Throws <InvalidOperationException>(() => client.Receive(responsePacket.ToArray()));
            var firstResponse = server.Receive(firstPacket.ToArray()).ToSendBack;

            Assert.Throws <InvalidOperationException>(() => server.Receive(firstPacket.ToArray()));
            var lastResult = client.Receive(firstResponse.ToArray()).ToSendBack;

            Assert.Throws <InvalidOperationException>(() => client.Receive(firstResponse.ToArray()));
            var         cs          = client.SaveStateAsByteArray();
            var         ss          = server.SaveStateAsByteArray();
            ClientState clientState = ClientState.Load(cs, DefaultKexFactory.Instance);
            ServerState serverState = ServerState.Load(ss, DefaultKexFactory.Instance);

            var rng = new RandomNumberGenerator();

            byte[] message1 = rng.Generate(32);
            byte[] message2 = rng.Generate(32);
            var    m1       = client.Send(message1);
            var    p1       = server.Receive(m1).Payload;
            var    m2       = server.Send(message2);
            var    p2       = client.Receive(m2).Payload;

            Assert.Equal(message1, p1);
            Assert.Equal(message2, p2);
        }
        public void SendSomeMessagesBothDirectionsWithEcdhMultiTest()
        {
            var(client, server) = Common.CreateAndInitialize();

            RandomNumberGenerator rng = new RandomNumberGenerator();

            byte[] cmessage1 = rng.Generate(32);
            byte[] cmessage2 = rng.Generate(32);
            byte[] cmessage3 = rng.Generate(32);
            byte[] cmessage4 = rng.Generate(32);
            byte[] cmessage5 = rng.Generate(32);
            byte[] cmessage6 = rng.Generate(32);
            byte[] smessage1 = rng.Generate(32);
            byte[] smessage2 = rng.Generate(32);
            byte[] smessage3 = rng.Generate(32);
            byte[] smessage4 = rng.Generate(32);
            byte[] smessage5 = rng.Generate(32);
            byte[] smessage6 = rng.Generate(32);

            var cp1 = client.Send(cmessage1);
            var cp2 = client.Send(cmessage2);
            var sr1 = server.Receive(cp1).Payload;
            var sr2 = server.Receive(cp2).Payload;

            Assert.Equal(cmessage1, sr1);
            Assert.Equal(cmessage2, sr2);

            var sp1 = server.Send(smessage1);
            var sp2 = server.Send(smessage2);
            var cr1 = client.Receive(sp1).Payload;
            var cr2 = client.Receive(sp2).Payload;

            Assert.Equal(smessage1, cr1);
            Assert.Equal(smessage2, cr2);

            var cp3 = client.Send(cmessage3);
            var cp4 = client.Send(cmessage4);
            var sr3 = server.Receive(cp3).Payload;
            var sr4 = server.Receive(cp4).Payload;

            Assert.Equal(cmessage3, sr3);
            Assert.Equal(cmessage4, sr4);

            var sp3 = server.Send(smessage3);
            var sp4 = server.Send(smessage4);
            var cr3 = client.Receive(sp3).Payload;
            var cr4 = client.Receive(sp4).Payload;

            Assert.Equal(smessage3, cr3);
            Assert.Equal(smessage4, cr4);

            var cp5 = client.Send(cmessage5);
            var cp6 = client.Send(cmessage6);
            var sr5 = server.Receive(cp5).Payload;
            var sr6 = server.Receive(cp6).Payload;

            Assert.Equal(cmessage5, sr5);
            Assert.Equal(cmessage6, sr6);

            var sp5 = server.Send(smessage5);
            var sp6 = server.Send(smessage6);
            var cr5 = client.Receive(sp5).Payload;
            var cr6 = client.Receive(sp6).Payload;

            Assert.Equal(smessage5, cr5);
            Assert.Equal(smessage6, cr6);

            var css = client.SaveStateAsByteArray();
            var sss = server.SaveStateAsByteArray();
            var cs  = ClientState.Load(css, DefaultKexFactory.Instance);
            var ss  = ServerState.Load(sss, DefaultKexFactory.Instance);

            Assert.Equal(4, cs.Ratchets.Count);
            Assert.Equal(4, ss.Ratchets.Count);
        }
Beispiel #6
0
        public void ClientInitStateTest()
        {
            var clientServices = new BouncyCastleServices(KeyGeneration.GeneratePrivateKey());
            var serverServices = new BouncyCastleServices(KeyGeneration.GeneratePrivateKey());

            byte[] cs, ss;

            RandomNumberGenerator rng = new RandomNumberGenerator();

            byte[] message1 = rng.Generate(64);
            byte[] message2 = rng.Generate(64);
            byte[] message3 = rng.Generate(64);

            var client = new MicroRatchetContext(clientServices, true);
            var kex    = clientServices.KeyAgreementFactory;

            var clientInitPacket = client.InitiateInitialization();

            cs = client.SaveStateAsByteArray();
            {
                var ts = ClientState.Load(cs, kex, ks).StoreAsByteArray(5);
                Assert.Equal(ts, cs);
            }

            var server         = new MicroRatchetContext(serverServices, false);
            var responsePacket = server.Receive(clientInitPacket).ToSendBack;

            ss = server.SaveStateAsByteArray();
            {
                var ts = ServerState.Load(ss, kex, ks).StoreAsByteArray(5);
                Assert.Equal(ts, ss);
            }


            client = new MicroRatchetContext(clientServices, true, stateBytes: cs);
            var firstPacket = client.Receive(responsePacket).ToSendBack;

            cs = client.SaveStateAsByteArray();
            {
                var ts = ClientState.Load(cs, kex, ks).StoreAsByteArray(5);
                Assert.Equal(ts, cs);
            }

            server = new MicroRatchetContext(serverServices, false, stateBytes: ss);
            var firstResponse = server.Receive(firstPacket).ToSendBack;

            ss = server.SaveStateAsByteArray();
            {
                var ts = ServerState.Load(ss, kex, ks).StoreAsByteArray(5);
                Assert.Equal(ts, ss);
            }

            client = new MicroRatchetContext(clientServices, true, stateBytes: cs);
            var lastResult = client.Receive(firstResponse).ToSendBack;

            cs = client.SaveStateAsByteArray();
            {
                var ts = ClientState.Load(cs, kex, ks).StoreAsByteArray(5);
                Assert.Equal(ts, cs);
            }


            client = new MicroRatchetContext(clientServices, true, 80, stateBytes: cs);
            var pl1 = client.Send(message1);

            cs = client.SaveStateAsByteArray();
            {
                var ts = ClientState.Load(cs, kex, ks).StoreAsByteArray(5);
                Assert.Equal(ts, cs);
            }

            client = new MicroRatchetContext(clientServices, true, 80, stateBytes: cs);
            var pl2 = client.Send(message2);

            cs = client.SaveStateAsByteArray();
            {
                var ts = ClientState.Load(cs, kex, ks).StoreAsByteArray(5);
                Assert.Equal(ts, cs);
            }

            client = new MicroRatchetContext(clientServices, true, 80, stateBytes: cs);
            var pl3 = client.Send(message3);

            cs = client.SaveStateAsByteArray();
            {
                var ts = ClientState.Load(cs, kex, ks).StoreAsByteArray(5);
                Assert.Equal(ts, cs);
            }


            server = new MicroRatchetContext(serverServices, false, 80, stateBytes: ss);
            var r1 = server.Receive(pl1).Payload;

            ss = server.SaveStateAsByteArray();
            {
                var ts = ServerState.Load(ss, kex, ks).StoreAsByteArray(5);
                Assert.Equal(ts, ss);
            }

            server = new MicroRatchetContext(serverServices, false, 80, stateBytes: ss);
            var r2 = server.Receive(pl2).Payload;

            ss = server.SaveStateAsByteArray();
            {
                var ts = ServerState.Load(ss, kex, ks).StoreAsByteArray(5);
                Assert.Equal(ts, ss);
            }

            server = new MicroRatchetContext(serverServices, false, 80, stateBytes: ss);
            var r3 = server.Receive(pl3).Payload;

            ss = server.SaveStateAsByteArray();
            {
                var ts = ServerState.Load(ss, kex, ks).StoreAsByteArray(5);
                Assert.Equal(ts, ss);
            }


            Assert.Equal(message1, r1);
            Assert.Equal(message2, r2);
            Assert.Equal(message3, r3);

            Assert.Null(lastResult);
        }