示例#1
0
        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}");
        }
示例#2
0
        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}");
        }
示例#3
0
        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}");
        }
示例#4
0
        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}");
        }
示例#5
0
        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}");
        }
示例#6
0
        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}");
        }
示例#7
0
        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);
            }
        }