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