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_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}"); }