internal void HandleS01EncryptionRequest(S01EncryptionRequest s01EncryptionRequest) { waitingForEncryption = true; Console.WriteLine("Server is in online mode!"); RSACryptoServiceProvider rsaProvider = CryptoHandler.DecodeRSAPublicKey(s01EncryptionRequest.serverKey); byte[] secretKey = CryptoHandler.GenerateAESPrivateKey(); Console.WriteLine("Keys generated"); if (s01EncryptionRequest.serverId != "-") { Console.WriteLine("Logging in to Mojang"); if (!Yggdrasil.SessionCheck(manager.loginParams.UUID, manager.loginParams.SessionId, CryptoHandler.getServerHash(s01EncryptionRequest.serverId, s01EncryptionRequest.serverKey, secretKey))) { Console.WriteLine("Mojang authentication failed"); return; } else { Console.WriteLine("Mojang authentication succesful"); } } manager.SendPacket(new C01EncryptionResponse(rsaProvider.Encrypt(secretKey, false), rsaProvider.Encrypt(s01EncryptionRequest.token, false))); manager.aesStream = CryptoHandler.getAesStream(manager.tcpClient.GetStream(), secretKey); manager.encrypted = true; }
private bool StartEncrypt() { CryptoHandler crypto = new CryptoHandler(); List <byte> encryptionRequest = new List <byte>(); string serverID = ""; if (protocol.protocolVersion < MCVersion.MC172Version) { serverID = "lilium-pre"; } encryptionRequest.AddRange(getString(serverID)); encryptionRequest.AddRange(getArray(crypto.getPublic())); byte[] token = new byte[4]; var rng = new System.Security.Cryptography.RNGCryptoServiceProvider(); rng.GetBytes(token); encryptionRequest.AddRange(getArray(token)); SendPacket(0x01, encryptionRequest); List <byte> encryptResponse = new List <byte>(readDataRAW(readNextVarIntRAW())); if (readNextVarInt(encryptResponse) == 0x01) { List <byte> dec = new List <byte>(); dec.AddRange(crypto.Decrypt(readNextByteArray(encryptResponse))); dec.RemoveRange(0, dec.Count - 16); byte[] key_dec = dec.ToArray(); byte[] token_dec = token; EncStream = CryptoHandler.getAesStream(Client.GetStream(), key_dec); this.encrypted = true; return(true); } return(false); }
/// <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; }
private bool StartEncryption(string uuid, string username, 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 = RSAService.Encrypt(secretKey, false); byte[] token_enc = RSAService.Encrypt(token, false); byte[] keylen = BitConverter.GetBytes((short)key_enc.Length); byte[] tokenlen = BitConverter.GetBytes((short)token_enc.Length); Array.Reverse(keylen); Array.Reverse(tokenlen); //Building the packet byte[] data = new byte[5 + (short)key_enc.Length + (short)token_enc.Length]; data[0] = 0xFC; keylen.CopyTo(data, 1); key_enc.CopyTo(data, 3); tokenlen.CopyTo(data, 3 + (short)key_enc.Length); token_enc.CopyTo(data, 5 + (short)key_enc.Length); //Send it back Send(data); //Getting the next packet byte[] pid = new byte[1]; Receive(pid, 0, 1, SocketFlags.None); if (pid[0] == 0xFC) { readData(4); s = CryptoHandler.getAesStream(c.GetStream(), secretKey); encrypted = true; return(true); } else { ConsoleIO.WriteLineFormatted("§8Invalid response to StartEncryption packet"); return(false); } }
/// <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(); 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 = RSAService.Encrypt(secretKey, false); byte[] token_enc = RSAService.Encrypt(token, false); byte[] key_len = getVarInt(key_enc.Length); byte[] token_len = getVarInt(token_enc.Length); //Encryption Response packet SendPacket(0x01, concatBytes(key_len, key_enc, token_len, token_enc)); //Start client-side encryption s = CryptoHandler.getAesStream(c.GetStream(), secretKey, this); encrypted = true; //Process the next packet int packetID = -1; byte[] packetData = new byte[] { }; while (true) { readNextPacket(ref packetID, ref packetData); if (packetID == 0x00) //Login rejected { handler.OnConnectionLost(ChatBot.DisconnectReason.LoginRejected, ChatParser.ParseText(readNextString(ref packetData))); return(false); } else if (packetID == 0x02) //Login successful { login_phase = false; StartUpdating(); return(true); } else { handlePacket(packetID, packetData); } } }
/// <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(); 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 = RSAService.Encrypt(secretKey, false); byte[] token_enc = RSAService.Encrypt(token, false); byte[] key_len = BitConverter.GetBytes((short)key_enc.Length); Array.Reverse(key_len); byte[] token_len = BitConverter.GetBytes((short)token_enc.Length); Array.Reverse(token_len); //Encryption Response packet byte[] packet_id = getVarInt(0x01); byte[] encryption_response = concatBytes(packet_id, key_len, key_enc, token_len, token_enc); byte[] encryption_response_tosend = concatBytes(getVarInt(encryption_response.Length), encryption_response); Send(encryption_response_tosend); //Start client-side encryption s = CryptoHandler.getAesStream(c.GetStream(), secretKey, this); encrypted = true; //Read and skip the next packet int received_packet_size = readNextVarInt(); int received_packet_id = readNextVarInt(); bool encryption_success = (received_packet_id == 0x02); if (received_packet_id == 0) { handler.OnConnectionLost(ChatBot.DisconnectReason.LoginRejected, ChatParser.ParseText(readNextString())); } else { readData(received_packet_size - getVarInt(received_packet_id).Length); } if (encryption_success) { StartUpdating(); } return(encryption_success); }
public bool SwitchToEncrypted(string serverID, byte[] Serverkey, byte[] token) { if (ServerData.OnlineMode) { var crypto = CryptoHandler.DecodeRSAPublicKey(Serverkey); byte[] secretKey = CryptoHandler.GenerateAESPrivateKey(); byte[] key_enc = crypto.Encrypt(secretKey, false); byte[] token_enc = crypto.Encrypt(token, false); //Console.WriteLine(key_enc.Length + " " + token_enc.Length); SendPacket(0x01, concatBytes(getArray(key_enc), getArray(token_enc))); this.s = CryptoHandler.getAesStream(c.GetStream(), secretKey); encrypted = true; int packetID = -1; List <byte> packetData = new List <byte>(); while (true) { readNextPacket(ref packetID, packetData); if (packetID == 0x00) { handler.OnConnectionLost(Conn.DisconnectReason.LoginRejected, readNextString(packetData)); return(false); } else if (packetID == 0x02)//Logined { Debug.Log("Login Success"); login_phase = false; handler.OnLogin(packetData); StartUpdating(); return(true); } else { if (packetID == 0x03 && login_phase) { if (protocolversion >= MCVersion.MC18Version) { compression_treshold = readNextVarInt(packetData); } } handler.receivePacket(packetID, packetData); } } } else { handler.OnConnectionLost(Conn.DisconnectReason.LoginRejected, ServerData.MsgEncryptReject); } return(false); }