Esempio n. 1
0
        public void TestExchange()
        {
            var a    = new KeyExchanger();
            var b    = new KeyExchanger();
            var aKey = a.KeyFromToken(b.Token);
            var bKey = b.KeyFromToken(a.Token);

            CollectionAssert.AreEqual(aKey, bKey);
        }
Esempio n. 2
0
        /// <summary>
        /// Protects an insecure connection.
        /// </summary>
        /// <param name="initiator">Set to <see langword="true"/> if a client,
        /// <see langword="false"/> if a server.</param>
        public static async Task <ProtectedMessenger> Protect(SocketMessenger socketMessenger, bool initiator)
        {
            // Perform a key exchange.
            var exchanger = new KeyExchanger();
            var sent      = socketMessenger.Send(exchanger.Token);
            var token     = await socketMessenger.Receive().ConfigureAwait(false);

            if (token.IsError)
            {
                throw new Exception(token.Error.GetType().ToString());
            }
            var key = exchanger.KeyFromToken(token.Value);

            var result = await sent;

            if (result.IsError)
            {
                throw new Exception(result.Error.GetType().ToString());
            }

            // Send test data.
            var protectedMessenger = new ProtectedMessenger(socketMessenger, key, initiator);

            byte[] myValues = SecureRandomGenerator.GetBytes(32);
            var    a        = protectedMessenger.Send(myValues);

            // Echo bytes back.
            var integrityChallenge = await protectedMessenger.Receive().ConfigureAwait(false);

            var b = protectedMessenger.Send(integrityChallenge);
            await Task.WhenAll(a, b).ConfigureAwait(false);

            // Check integrity of test data.
            var integrityCheck = await protectedMessenger.Receive();

            if (!Enumerable.SequenceEqual <byte>(myValues, integrityCheck))
            {
                throw new Exception("Could not verify connection!");
            }

            // Return protected messenger, as the connection has been validated.
            return(protectedMessenger);
        }