protected override void InitializeSecurity() { Dictionary <string, string> message; var dhg = new DiffieHellmanGenerator(); // Stage 1: Send key request Send(new Dictionary <string, string> { { "request", "keys" } }); // Stage 2: Process response message = WaitForKey("p"); if (message == null) { MessageOutput.Log("Invalid response from server; expected p"); return; } //int p = Convert.ToInt32(message["p"]); //int g = Convert.ToInt32(message["g"]); //var publicKeys = new DiffieHellmanPublicKeystore(p, g); var publicKeys = new DiffieHellmanPublicKeystore(message); var secretA = dhg.GenerateSecret(); var transportA = dhg.GenerateTransport(secretA, publicKeys); // Stage 3: Send a, await b Send(new Dictionary <string, string> { { "a", transportA.ToString() } }); message = WaitForKey("b"); if (message == null) { MessageOutput.Log("Invalid response from server; expected b"); return; } // Stage 4: Calculate shared secret var transportB = BigInteger.Parse(message["b"]); SharedSecret = dhg.GenerateSharedSecret(secretA, transportB, publicKeys); // Stage 5: Send encryption type Send(new Dictionary <string, string> { { "encryption", encryption } }); SetEncryption(encryption); MessageOutput.Log("Connection summary:\n " + $"\tp: {publicKeys.P}\n" + $"\tg: {publicKeys.G}\n" + $"\tsecret: {secretA}\n" + $"\ttransport: {transportA}\n" + $"\treceived transport: {transportB}\n" + $"\tshared secret: {SharedSecret}\n" + $"\tencryption: {encryption}"); }
public void Should_Generate_Transport_1() { // Arrange var dhg = new DiffieHellmanGenerator(); var publicKeys = new DiffieHellmanPublicKeystore(23, 5); var secret = 4; int expected = 4; // Act var transport = dhg.GenerateTransport(secret, publicKeys); // Assert Assert.True(transport == expected, $"Expected: {expected}; Actual: {transport}"); }
public void Should_Generate_Shared_Secret() { // Arrange var dhg = new DiffieHellmanGenerator(); var publicKeys = new DiffieHellmanPublicKeystore(23, 5); int secret = 4; int transport = 10; int expected = 18; // Act var sharedSecret = dhg.GenerateSharedSecret(secret, transport, publicKeys); // Assert Assert.True(sharedSecret == expected, $"Expected: {expected}; Actual: {sharedSecret}"); }
public void Should_Exchange_Keys_2() { // Arrange var dhg = new DiffieHellmanGenerator(); var publicKeys = new DiffieHellmanPublicKeystore(23, 5); int secretA = 5; int secretB = 3; var transportA = dhg.GenerateTransport(secretA, publicKeys); var transportB = dhg.GenerateTransport(secretB, publicKeys); // Act var sharedSecretA = dhg.GenerateSharedSecret(secretA, transportB, publicKeys); var sharedSecretB = dhg.GenerateSharedSecret(secretB, transportA, publicKeys); // Assert Assert.True(sharedSecretA == sharedSecretB, $"Shared secret numbers are not equal: a = {sharedSecretA}, b = {sharedSecretB}"); }
public void Should_Exchange_Keys_3() { // Arrange var dhg = new DiffieHellmanGenerator(); var primesReader = new DiffieHellmanJsonReader(@".\primes.json"); var publicKeys = primesReader.GetRandomKeystore(); int secretA = 5; int secretB = 3; var transportA = dhg.GenerateTransport(secretA, publicKeys); var transportB = dhg.GenerateTransport(secretB, publicKeys); // Act var sharedSecretA = dhg.GenerateSharedSecret(secretA, transportB, publicKeys); var sharedSecretB = dhg.GenerateSharedSecret(secretB, transportA, publicKeys); // Assert Assert.True(sharedSecretA == sharedSecretB, $"Shared secret numbers are not equal: a = {sharedSecretA}, b = {sharedSecretB}"); }
public void Should_Exchange_Keys_1() { // Arrange var dhg = new DiffieHellmanGenerator(); var publicKeys = new DiffieHellmanPublicKeystore(23, 5); var secretA = dhg.GenerateSecret(); var secretB = dhg.GenerateSecret(); var transportA = dhg.GenerateTransport(secretA, publicKeys); var transportB = dhg.GenerateTransport(secretB, publicKeys); // Act var sharedSecretA = dhg.GenerateSharedSecret(secretA, transportB, publicKeys); var sharedSecretB = dhg.GenerateSharedSecret(secretB, transportA, publicKeys); // Assert Assert.True(sharedSecretA > 0 && sharedSecretB > 0, "Shared secret numbers are lesser than 0, possible math exception"); Assert.True(sharedSecretA == sharedSecretB, $"Shared secret numbers are not equal: a = {sharedSecretA}, b = {sharedSecretB}"); }
protected override void InitializeSecurity() { Dictionary <string, string> message; var dhg = new DiffieHellmanGenerator(); // Stage 1: Await key request message = WaitForKey("request"); if (message == null) { MessageOutput.Log("Invalid request from client; expected keys"); return; } // Stage 2: Send keys var publicKeys = primesReader.GetRandomKeystore(); var secretB = dhg.GenerateSecret(); var transportB = dhg.GenerateTransport(secretB, publicKeys); Send(publicKeys.GetJson()); // Stage 3: Send b, await a message = WaitForKey("a"); Send(new Dictionary <string, string> { { "b", transportB.ToString() } }); if (message == null) { MessageOutput.Log("Invalid response from client; expected a"); return; } // Stage 4: Calculate shared secret var transportA = BigInteger.Parse(message["a"]); SharedSecret = dhg.GenerateSharedSecret(secretB, transportA, publicKeys); // Stage 5: Await encryption message = WaitForJson(); if (message == null) { return; } if (message.ContainsKey("encryption")) { SetEncryption(message["encryption"]); MessageOutput.Log("Connection summary:\n" + $"\tp: {publicKeys.P}\n" + $"\tg: {publicKeys.G}\n" + $"\tsecret: {secretB}\n" + $"\ttransport: {transportB}\n" + $"\treceived transport: {transportA}\n" + $"\tshared secret: {SharedSecret}\n" + $"\tencryption: {message["encryption"]}"); } else { // Client skipped encryption step; assume none and handle the message. SetEncryption("none"); MessageOutput.Log("Connection summary:\n" + $"\tp: {publicKeys.P}\n" + $"\tg: {publicKeys.G}\n" + $"\tsecret: {secretB}\n" + $"\ttransport: {transportB}\n" + $"\treceived transport: {transportA}\n" + $"\tshared secret: {SharedSecret}\n" + $"\tencryption: none"); message["msg"] = Encoding.UTF8.GetString(Convert.FromBase64String(message["msg"])); MessageOutput.HandleMessage(message); } }