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