private static void RunAsClient() { GonzoNet.PacketHandlers.Register(0x02, false, 0, new OnPacketReceive(PacketHandlers.HandleServerChallenge)); //GonzoNet requires a log output stream to function correctly. This is built in behavior. GonzoNet.Logger.OnMessageLogged += new MessageLoggedDelegate(Logger_OnMessageLogged); NetworkFacade.Client = new NetworkClient("127.0.0.1", 12345); NetworkFacade.Client.OnConnected += new OnConnectedDelegate(m_Client_OnConnected); LoginArgsContainer LoginArgs = new LoginArgsContainer(); LoginArgs.Enc = new AESEncryptor("test"); LoginArgs.Username = "******"; LoginArgs.Password = "******"; LoginArgs.Client = NetworkFacade.Client; SaltedHash Hash = new SaltedHash(new SHA512Managed(), LoginArgs.Username.Length); PacketHandlers.PasswordHash = Hash.ComputePasswordHash(LoginArgs.Username, LoginArgs.Password); NetworkFacade.Client.Connect(LoginArgs); while (true) { Thread.Sleep(1000); } }
/// <summary> /// User clicked button to log in. /// </summary> private void BtnLogin_Click(object sender, EventArgs e) { LoginArgsContainer Args = new LoginArgsContainer(); if (TxtPassword.Text != "" && TxtUsername.Text != "") { NetworkFacade.Client = new NetworkClient(GlobalSettings.Default.LoginServerIP, 2106, GonzoNet.Encryption.EncryptionMode.AESCrypto); NetworkFacade.Client.OnConnected += new OnConnectedDelegate(NetworkController.Client_OnConnected); Args.Username = TxtUsername.Text.ToUpper(); Args.Password = TxtPassword.Text.ToUpper(); SaltedHash Hash = new SaltedHash(new SHA512Managed(), Args.Username.Length); byte[] HashBuf = Hash.ComputePasswordHash(Args.Username.ToUpper(), Args.Password.ToUpper()); Args.Enc = new AESEncryptor(Convert.ToBase64String(HashBuf)); Args.Client = NetworkFacade.Client; PlayerAccount.Username = TxtUsername.Text; LblStatus.Invoke(new MethodInvoker(delegate { LblStatus.Visible = true; })); LblStatus.Invoke(new MethodInvoker(delegate { LblStatus.Text = "Connecting..."; })); NetworkController.OnReceivedCharacters += new OnReceivedCharactersDelegate(NetworkController_OnReceivedCharacters); NetworkFacade.Client.Connect(Args); } else { MessageBox.Show("Please enter a username and password!"); } }
public static void SendLoginRequest(LoginArgsContainer Args) { //Variable length... PacketStream Packet = new PacketStream((byte)PacketType.LOGIN_REQUEST, 0); Packet.WriteByte(0x00); SaltedHash Hash = new SaltedHash(new SHA512Managed(), Args.Username.Length); MemoryStream MemStream = new MemoryStream(); DecryptionArgsContainer DecryptionArgs = Args.Enc.GetDecryptionArgsContainer(); MemStream.WriteByte((byte)Args.Username.Length); MemStream.Write(Encoding.ASCII.GetBytes(Args.Username), 0, Encoding.ASCII.GetBytes(Args.Username).Length); byte[] HashBuf = Hash.ComputePasswordHash(Args.Username, Args.Password); PlayerAccount.Hash = HashBuf; MemStream.WriteByte((byte)HashBuf.Length); MemStream.Write(HashBuf, 0, HashBuf.Length); Packet.WriteUInt16((ushort)(PacketHeaders.UNENCRYPTED + MemStream.ToArray().Length + 4)); Packet.WriteBytes(MemStream.ToArray()); string[] Version = GlobalSettings.Default.ClientVersion.Split('.'); Packet.WriteByte((byte)int.Parse(Version[0])); //Version 1 Packet.WriteByte((byte)int.Parse(Version[1])); //Version 2 Packet.WriteByte((byte)int.Parse(Version[2])); //Version 3 Packet.WriteByte((byte)int.Parse(Version[3])); //Version 4 Args.Client.Send(Packet.ToArray()); }
/// <summary> /// Authenticate with the service client to get a token, /// Then get info about avatars & cities /// </summary> /// <param name="username"></param> /// <param name="password"></param> public void InitialConnect(string username, string password) { var client = NetworkFacade.Client; LoginArgsContainer Args = new LoginArgsContainer(); Args.Username = username; Args.Password = password; //Doing the encryption this way eliminates the need to send key across the wire! :D SaltedHash Hash = new SaltedHash(new SHA512Managed(), Args.Username.Length); byte[] HashBuf = Hash.ComputePasswordHash(Args.Username, Args.Password); Args.Enc = new GonzoNet.Encryption.ARC4Encryptor(Convert.ToBase64String(HashBuf)); Args.Client = client; client.Connect(Args); }
public static void SendLoginRequest(NetworkClient Client, string Username, string Password) { //Variable length... PacketStream Packet = new PacketStream(0x00, 0); Packet.WriteByte(0x00); SaltedHash Hash = new SaltedHash(new SHA512Managed(), Username.Length); byte[] HashBuf = new byte[Encoding.ASCII.GetBytes(Password).Length + Encoding.ASCII.GetBytes(Username).Length]; MemoryStream MemStream = new MemoryStream(); PasswordDeriveBytes Pwd = new PasswordDeriveBytes(Encoding.ASCII.GetBytes(Password), Encoding.ASCII.GetBytes("SALT"), "SHA1", 10); byte[] EncKey = Pwd.GetBytes(8); PlayerAccount.EncKey = EncKey; MemStream.WriteByte((byte)Username.Length); MemStream.Write(Encoding.ASCII.GetBytes(Username), 0, Encoding.ASCII.GetBytes(Username).Length); HashBuf = Hash.ComputePasswordHash(Username, Password); PlayerAccount.Hash = HashBuf; MemStream.WriteByte((byte)HashBuf.Length); MemStream.Write(HashBuf, 0, HashBuf.Length); MemStream.WriteByte((byte)EncKey.Length); MemStream.Write(EncKey, 0, EncKey.Length); Packet.WriteByte((byte)(2 + MemStream.ToArray().Length + 4)); Packet.WriteBytes(MemStream.ToArray()); //TODO: Change this to write a global client version. Packet.WriteByte(0x00); //Version 1 Packet.WriteByte(0x00); //Version 2 Packet.WriteByte(0x00); //Version 3 Packet.WriteByte(0x01); //Version 4 Client.Send(Packet.ToArray()); }
public static void SendLoginRequest(LoginArgsContainer Args) { PacketStream InitialPacket = new PacketStream((byte)PacketType.LOGIN_REQUEST, 0); InitialPacket.WriteHeader(); ECDiffieHellmanCng PrivateKey = Args.Client.ClientEncryptor.GetDecryptionArgsContainer() .AESDecryptArgs.PrivateKey; //IMPORTANT: Public key must derive from the private key! byte[] ClientPublicKey = PrivateKey.PublicKey.ToByteArray(); byte[] NOnce = Args.Client.ClientEncryptor.GetDecryptionArgsContainer().AESDecryptArgs.NOnce; InitialPacket.WriteInt32(((byte)PacketHeaders.UNENCRYPTED + /*4 is for version*/ 4 + (ClientPublicKey.Length + 1) + (NOnce.Length + 1))); SaltedHash Hash = new SaltedHash(new SHA512Managed(), Args.Username.Length); byte[] HashBuf = Hash.ComputePasswordHash(Args.Username, Args.Password); PlayerAccount.Hash = HashBuf; string[] Version = GlobalSettings.Default.ClientVersion.Split('.'); InitialPacket.WriteByte((byte)int.Parse(Version[0])); //Version 1 InitialPacket.WriteByte((byte)int.Parse(Version[1])); //Version 2 InitialPacket.WriteByte((byte)int.Parse(Version[2])); //Version 3 InitialPacket.WriteByte((byte)int.Parse(Version[3])); //Version 4 InitialPacket.WriteByte((byte)ClientPublicKey.Length); InitialPacket.WriteBytes(ClientPublicKey); InitialPacket.WriteByte((byte)NOnce.Length); InitialPacket.WriteBytes(NOnce); Args.Client.Send(InitialPacket.ToArray()); }
public static string GetPasswordHash(string password, string salt) { SaltedHash SHash = new SaltedHash(new SHA512Managed(), salt.Length); return(Convert.ToBase64String(SHash.ComputePasswordHash(salt.ToUpper(), password.ToUpper()))); }