/// <summary> /// Occurs when the client has been sucessfully authenticated by the loginserver. /// Called by UILoginDialog.cs. /// </summary> /// <param name="Client">The client that received the packet.</param> /// <param name="Packet">The packet that was received.</param> public static void OnLoginNotify(NetworkClient Client, ProcessedPacket Packet) { //Should this be stored for permanent access? byte[] ServerPublicKey = Packet.ReadBytes(Packet.ReadByte()); byte[] EncryptedData = Packet.ReadBytes(Packet.ReadByte()); AESEncryptor Enc = (AESEncryptor)Client.ClientEncryptor; Enc.PublicKey = ServerPublicKey; Client.ClientEncryptor = Enc; lock (NetworkFacade.Client) NetworkFacade.Client.ClientEncryptor = Enc; ECDiffieHellmanCng PrivateKey = Client.ClientEncryptor.GetDecryptionArgsContainer().AESDecryptArgs.PrivateKey; byte[] NOnce = Client.ClientEncryptor.GetDecryptionArgsContainer().AESDecryptArgs.NOnce; byte[] ChallengeResponse = StaticStaticDiffieHellman.Decrypt(PrivateKey, ECDiffieHellmanCngPublicKey.FromByteArray(ServerPublicKey, CngKeyBlobFormat.EccPublicBlob), NOnce, EncryptedData); MemoryStream StreamToEncrypt = new MemoryStream(); BinaryWriter Writer = new BinaryWriter(StreamToEncrypt); Writer.Write((byte)ChallengeResponse.Length); Writer.Write(ChallengeResponse, 0, ChallengeResponse.Length); Writer.Write(Client.ClientEncryptor.Username); Writer.Write((byte)PlayerAccount.Hash.Length); Writer.Write(PlayerAccount.Hash); Writer.Flush(); //Encrypt data using key and IV from server, hoping that it'll be decrypted correctly at the other end... Client.SendEncrypted((byte)PacketType.CHALLENGE_RESPONSE, StreamToEncrypt.ToArray()); }
public static void InitialClientConnect(NetworkClient Client, ProcessedPacket P) { Logger.LogInfo("Received InitialClientConnect!"); PacketStream EncryptedPacket = new PacketStream((byte)PacketType.LOGIN_NOTIFY_CITY, 0); EncryptedPacket.WriteHeader(); AESEncryptor Enc = (AESEncryptor)Client.ClientEncryptor; Enc.PublicKey = P.ReadBytes((P.ReadByte())); Enc.NOnce = P.ReadBytes((P.ReadByte())); Enc.PrivateKey = NetworkFacade.ServerPrivateKey; Client.ClientEncryptor = Enc; MemoryStream StreamToEncrypt = new MemoryStream(); BinaryWriter Writer = new BinaryWriter(StreamToEncrypt); Writer.Write(Enc.Challenge, 0, Enc.Challenge.Length); Writer.Flush(); byte[] EncryptedData = StaticStaticDiffieHellman.Encrypt(NetworkFacade.ServerPrivateKey, System.Security.Cryptography.ECDiffieHellmanCngPublicKey.FromByteArray(Enc.PublicKey, System.Security.Cryptography.CngKeyBlobFormat.EccPublicBlob), Enc.NOnce, StreamToEncrypt.ToArray()); EncryptedPacket.WriteUInt16((ushort)(PacketHeaders.UNENCRYPTED + (1 + NetworkFacade.ServerPublicKey.Length) + (1 + EncryptedData.Length))); EncryptedPacket.WriteByte((byte)NetworkFacade.ServerPublicKey.Length); EncryptedPacket.WriteBytes(NetworkFacade.ServerPublicKey); EncryptedPacket.WriteByte((byte)EncryptedData.Length); EncryptedPacket.WriteBytes(EncryptedData); Client.Send(EncryptedPacket.ToArray()); }
/// <summary> /// Client wanted to log in! /// </summary> public static void HandleLoginRequest(NetworkClient Client, ProcessedPacket P) { try { Logger.LogInfo("Received LoginRequest!\r\n"); byte Version1 = (byte)P.ReadByte(); byte Version2 = (byte)P.ReadByte(); byte Version3 = (byte)P.ReadByte(); byte Version4 = (byte)P.ReadByte(); string ClientVersion = Version1.ToString() + "." + Version2.ToString() + "." + Version3.ToString() + "." + Version4.ToString(); if (ClientVersion != GlobalSettings.Default.ClientVersion) { PacketStream OutPacket = new PacketStream((byte)PacketType.INVALID_VERSION, 2); OutPacket.WriteHeader(); OutPacket.WriteByte(0x01); Client.Send(OutPacket.ToArray()); Logger.LogInfo("Bad version - sent SInvalidVersion!\r\n"); Client.Disconnect(); return; } PacketStream EncryptedPacket = new PacketStream((byte)PacketType.LOGIN_NOTIFY, 0); EncryptedPacket.WriteHeader(); AESEncryptor Enc = (AESEncryptor)Client.ClientEncryptor; if (Enc == null) { Enc = new AESEncryptor(""); } Enc.PublicKey = P.ReadBytes((P.ReadByte())); Enc.NOnce = P.ReadBytes((P.ReadByte())); Enc.PrivateKey = NetworkFacade.ServerKey; Client.ClientEncryptor = Enc; MemoryStream StreamToEncrypt = new MemoryStream(); BinaryWriter Writer = new BinaryWriter(StreamToEncrypt); Writer.Write(Enc.Challenge, 0, Enc.Challenge.Length); Writer.Flush(); byte[] EncryptedData = StaticStaticDiffieHellman.Encrypt(NetworkFacade.ServerKey, System.Security.Cryptography.ECDiffieHellmanCngPublicKey.FromByteArray(Enc.PublicKey, System.Security.Cryptography.CngKeyBlobFormat.EccPublicBlob), Enc.NOnce, StreamToEncrypt.ToArray()); EncryptedPacket.WriteUInt16((ushort)(PacketHeaders.UNENCRYPTED + (1 + NetworkFacade.ServerPublicKey.Length) + (1 + EncryptedData.Length))); EncryptedPacket.WriteByte((byte)NetworkFacade.ServerPublicKey.Length); EncryptedPacket.WriteBytes(NetworkFacade.ServerPublicKey); EncryptedPacket.WriteByte((byte)EncryptedData.Length); EncryptedPacket.WriteBytes(EncryptedData); Client.Send(EncryptedPacket.ToArray()); } //This should HOPEFULLY wade off clients sending unreadable (I.E old protocol) packets... catch (Exception E) { Logger.LogDebug("Error while handling login request, disconnecting client: " + E.ToString()); Client.Disconnect(); return; } }