Exemplo n.º 1
0
        public void ClientInitializationClientReinstantiation()
        {
            BouncyCastleServices clientServices = new BouncyCastleServices(KeyGeneration.GeneratePrivateKey());
            BouncyCastleServices serverServices = new BouncyCastleServices(KeyGeneration.GeneratePrivateKey());

            var client           = new MicroRatchetContext(clientServices, true);
            var clientInitPacket = client.InitiateInitialization();
            var cs             = client.SaveStateAsByteArray();
            var server         = new MicroRatchetContext(serverServices, false);
            var responsePacket = server.Receive(clientInitPacket).ToSendBack;
            var ss             = server.SaveStateAsByteArray();

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

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

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

            cs = client.SaveStateAsByteArray();

            Assert.Null(lastResult);
        }
Exemplo n.º 2
0
        public static (MicroRatchetContext client, MicroRatchetContext server) CreateAndInitialize(int mtu = 80, int maximumBufferedPartialMessageSize = 50 * 1024)
        {
            var clientServices = new BouncyCastleServices(KeyGeneration.GeneratePrivateKey());
            var serverServices = new BouncyCastleServices(KeyGeneration.GeneratePrivateKey());

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

            var packet = client.InitiateInitialization();

            while (!client.IsInitialized || !server.IsInitialized)
            {
                packet = server.Receive(packet).ToSendBack;
                if (packet != null)
                {
                    packet = client.Receive(packet).ToSendBack;
                }
            }

            var cs = client.SaveStateAsByteArray();
            var ss = server.SaveStateAsByteArray();

            return(new MicroRatchetContext(clientServices, true, mtu, stateBytes: cs),
                   new MicroRatchetContext(serverServices, false, mtu, stateBytes: ss));
        }
Exemplo n.º 3
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);
        }
Exemplo n.º 4
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);
        }
Exemplo n.º 5
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);
        }
Exemplo n.º 6
0
        public void ServerCanSendLargeMessageAfterInitialization()
        {
            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 firstPacket      = client.Receive(responsePacket).ToSendBack;
            var firstResponse    = server.Receive(firstPacket).ToSendBack;
            var lastResult       = client.Receive(firstResponse).ToSendBack;
            var cs = client.SaveStateAsByteArray();
            var ss = server.SaveStateAsByteArray();

            byte[] payload = new byte[server.Configuration.MaximumMessageSize - MicroRatchetContext.MinimumOverhead];
            clientServices.RandomNumberGenerator.Generate(payload);
            byte[] message  = server.Send(payload);
            byte[] received = client.Receive(message).Payload;
            Assert.Equal(payload, received);
        }
Exemplo n.º 7
0
        public void HotReinitialization()
        {
            BouncyCastleServices clientServices = new BouncyCastleServices(KeyGeneration.GeneratePrivateKey());
            BouncyCastleServices serverServices = new BouncyCastleServices(KeyGeneration.GeneratePrivateKey());

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

            byte[] cs, ss;

            // initialize
            {
                var clientInitPacket = client.InitiateInitialization();
                var responsePacket   = server.Receive(clientInitPacket).ToSendBack;
                var firstPacket      = client.Receive(responsePacket).ToSendBack;
                var firstResponse    = server.Receive(firstPacket).ToSendBack;
                var lastResult       = client.Receive(firstResponse).ToSendBack;
                cs = client.SaveStateAsByteArray();
                ss = server.SaveStateAsByteArray();
            }

            // now we're hot
            client = new MicroRatchetContext(clientServices, true, 80, stateBytes: cs);
            server = new MicroRatchetContext(serverServices, false, 80, stateBytes: ss);
            {
                RandomNumberGenerator rng = new RandomNumberGenerator();
                byte[] message1           = rng.Generate(32);
                byte[] message2           = rng.Generate(32);
                byte[] message3           = rng.Generate(32);

                var pl1 = client.Send(message1);
                var pl2 = client.Send(message2);
                var pl3 = client.Send(message3);

                var r1 = server.Receive(pl1).Payload;
                var r2 = server.Receive(pl2).Payload;
                var r3 = server.Receive(pl3).Payload;

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

                cs = client.SaveStateAsByteArray();
                ss = server.SaveStateAsByteArray();
            }

            // oh noes! Client fail! reinitialize
            client = new MicroRatchetContext(clientServices, true, 1000);
            server = new MicroRatchetContext(serverServices, false, 1000, stateBytes: ss);
            {
                var clientInitPacket = client.InitiateInitialization();
                var responsePacket   = server.Receive(clientInitPacket).ToSendBack;
                var firstPacket      = client.Receive(responsePacket).ToSendBack;
                var firstResponse    = server.Receive(firstPacket).ToSendBack;
                var lastResult       = client.Receive(firstResponse).ToSendBack;
                cs = client.SaveStateAsByteArray();
                ss = server.SaveStateAsByteArray();
            }

            // now we're hot AGAIN
            client = new MicroRatchetContext(clientServices, true, 80, stateBytes: cs);
            server = new MicroRatchetContext(serverServices, false, 80, stateBytes: ss);
            {
                RandomNumberGenerator rng = new RandomNumberGenerator();
                byte[] message1           = rng.Generate(32);
                byte[] message2           = rng.Generate(32);
                byte[] message3           = rng.Generate(32);

                var pl1 = client.Send(message1);
                var pl2 = client.Send(message2);
                var pl3 = client.Send(message3);

                var r1 = server.Receive(pl1).Payload;
                var r2 = server.Receive(pl2).Payload;
                var r3 = server.Receive(pl3).Payload;

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

                cs = client.SaveStateAsByteArray();
                ss = server.SaveStateAsByteArray();
            }
        }
Exemplo n.º 8
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);
        }
Exemplo n.º 9
0
        public void ClientMessagesReinstantiation()
        {
            var clientServices = new BouncyCastleServices(KeyGeneration.GeneratePrivateKey());
            var serverServices = new BouncyCastleServices(KeyGeneration.GeneratePrivateKey());

            RandomNumberGenerator rng = new RandomNumberGenerator();

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

            byte[] s, c;

            var client           = new MicroRatchetContext(clientServices, true);
            var clientInitPacket = client.InitiateInitialization();

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

            s      = server.SaveStateAsByteArray();
            client = new MicroRatchetContext(clientServices, true, stateBytes: c);
            var firstPacket = client.Receive(responsePacket).ToSendBack;

            c      = client.SaveStateAsByteArray();
            server = new MicroRatchetContext(serverServices, false, stateBytes: s);
            var firstResponse = server.Receive(firstPacket).ToSendBack;

            s      = server.SaveStateAsByteArray();
            client = new MicroRatchetContext(clientServices, true, stateBytes: c);
            var lastResult = client.Receive(firstResponse).ToSendBack;

            c = client.SaveStateAsByteArray();

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

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

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

            c = client.SaveStateAsByteArray();

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

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

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

            s = server.SaveStateAsByteArray();

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

            Assert.Null(lastResult);
        }