Exemplo n.º 1
0
        private static void ExchangeKeys(object state)
        {
            byte num = 0;
            KeyExchangeParameter     parameter = (KeyExchangeParameter)state;
            DiffieHellmanKeyExchange exchange  = null;

            try
            {
                exchange = new DiffieHellmanKeyExchange();
                num      = 1;
                exchange.DeriveSharedKey(parameter.ClientPublicKey);
                parameter.PublicKey = exchange.PublicKey;
                parameter.SharedKey = exchange.SharedKey;
            }
            catch (ThreadAbortException)
            {
                if (log.IsWarnEnabled)
                {
                    string message = string.Format("Key exchange was aborted\r\nstep={0}\r\nClientKey={1}", num, (parameter.ClientPublicKey == null) ? "{null}" : BitConverter.ToString(parameter.ClientPublicKey));
                    if (exchange != null)
                    {
                        message = message + string.Format("\r\nSecret={0}\r\nPrime={1}\r\nPublicKey={2}\r\nSharedKey={3}", new object[] { (exchange.Secret == null) ? "{null}" : exchange.Secret.ToString(), (exchange.Prime == null) ? "{null}" : exchange.Prime.ToString(), (exchange.PublicKey == null) ? "{null}" : BitConverter.ToString(exchange.PublicKey), (exchange.SharedKey == null) ? "{null}" : BitConverter.ToString(exchange.SharedKey) });
                    }
                    log.Warn(message);
                }
            }
        }
Exemplo n.º 2
0
        public byte[] InitializeEncryption(byte[] otherPartyPublicKey, EncryptionMethod mode)
        {
            KeyExchangeParameter parameter = new KeyExchangeParameter
            {
                ClientPublicKey = otherPartyPublicKey
            };
            Thread thread = new Thread(new ParameterizedThreadStart(PeerBase.ExchangeKeys));

            thread.Start(parameter);
            if (!thread.Join(0x7d0))
            {
                thread.Abort();
                return(null);
            }
            switch (mode)
            {
            case EncryptionMethod.Sha256Pkcs7:
                byte[] buffer;
                using (SHA256 sha = SHA256.Create())
                {
                    buffer = sha.ComputeHash(parameter.SharedKey);
                }
                if (log.IsDebugEnabled)
                {
                    log.DebugFormat("InitializeEncryption: conId={0}, HashMode=SHA256, Paddin=PKCS7", new object[] { this.UnmanagedPeer.GetConnectionID() });
                }
                this.CryptoProvider = new RijndaelCryptoProvider(buffer, PaddingMode.PKCS7);
                break;

            case EncryptionMethod.Md5Iso10126:
                byte[] buffer2;
                using (MD5 md = MD5.Create())
                {
                    buffer2 = md.ComputeHash(parameter.SharedKey);
                }
                if (log.IsDebugEnabled)
                {
                    log.DebugFormat("InitializeEncryption: conId={0}, HashMode=MD5, Paddin=ISO10126", new object[] { this.UnmanagedPeer.GetConnectionID() });
                }
                this.CryptoProvider = new RijndaelCryptoProvider(buffer2, PaddingMode.ISO10126);
                break;

            default:
                throw new ArgumentOutOfRangeException("mode", "Invalid mode specified. Mode must be between 0 and 1");
            }
            return(parameter.PublicKey);
        }