/// <summary> /// Switch network reading/writing to an encrypted stream /// </summary> /// <param name="secretKey">AES secret key</param> public void SwitchToEncrypted(byte[] secretKey) { if (encrypted) { throw new InvalidOperationException("Stream is already encrypted!?"); } this.s = CryptoHandler.getAesStream(c.GetStream(), secretKey); this.encrypted = true; }
public void InitializeEncryption(byte[] key) { _aesStream = new BouncyCastleAesStream(_stream, key); }
/// <summary> /// Start network encryption. Automatically called by Login() if the server requests encryption. /// </summary> /// <returns>True if encryption was successful</returns> private bool StartEncryption(string uuid, string sessionID, byte[] token, string serverIDhash, byte[] serverKey) { System.Security.Cryptography.RSACryptoServiceProvider RSAService = CryptoHandler.DecodeRSAPublicKey(serverKey); byte[] secretKey = CryptoHandler.GenerateAESPrivateKey(); if (Settings.DebugMessages) ConsoleIO.WriteLineFormatted("§8Crypto keys & hash generated."); if (serverIDhash != "-") { Console.WriteLine("Checking Session..."); if (!ProtocolHandler.SessionCheck(uuid, sessionID, CryptoHandler.getServerHash(serverIDhash, serverKey, secretKey))) { handler.OnConnectionLost(ChatBot.DisconnectReason.LoginRejected, "Failed to check session."); return false; } } //Encrypt the data byte[] key_enc = getArray(RSAService.Encrypt(secretKey, false)); byte[] token_enc = getArray(RSAService.Encrypt(token, false)); //Encryption Response packet SendPacket(0x01, concatBytes(key_enc, token_enc)); //Start client-side encryption s = CryptoHandler.getAesStream(c.GetStream(), secretKey); encrypted = true; //Process the next packet int packetID = -1; List<byte> packetData = new List<byte>(); while (true) { readNextPacket(ref packetID, packetData); if (packetID == 0x00) //Login rejected { handler.OnConnectionLost(ChatBot.DisconnectReason.LoginRejected, ChatParser.ParseText(readNextString(packetData))); return false; } else if (packetID == 0x02) //Login successful { login_phase = false; if (forgeInfo != null) { // Do the forge handshake. if (!CompleteForgeHandshake()) { return false; } } StartUpdating(); return true; } else handlePacket(packetID, packetData); } }
public void InitializeEncryption(byte[] key) { _aesStream = new BouncyCastleAesStream(_stream, key); }