protected virtual void ParseHeader(IAsyncResult ar) { if (!EndRead(ar)) { return; } uint recvChecksum = InMessage.GetUInt32(); //Adler Checksum uint checksum = Tools.AdlerChecksum(InMessage.Buffer, InMessage.Position, InMessage.Length - 6); if (checksum != recvChecksum) { InMessage.SkipBytes(-4); } if (!IsFirstMessageReceived) { IsFirstMessageReceived = true; ProcessFirstMessage(checksum == recvChecksum); } else { if (IsEncryptionEnabled && !InMessage.XteaDecrypt(XteaKey)) { return; } ProcessMessage(); } }
protected override void ProcessFirstMessage(bool isChecksummed) { if (!isChecksummed) { ProcessStatusMessage(); return; } InMessage.GetByte(); //Protocol Id InMessage.GetUInt16(); //Client OS Version = InMessage.GetUInt16(); //Client Version if (Version < Constants.ClientVersionMin || Version > Constants.ClientVersionMax) { Disconnect("Only clients with protocol " + Constants.ClientVersionStr + " allowed!", Version); return; } //This is 10.76 server, only handling 10.76 client bytes InMessage.SkipBytes(17); /* * Skipped bytes: * 4 bytes: protocolVersion * 12 bytes: dat, spr, pic signatures (4 bytes each) * 1 byte: 0 * */ if (!InMessage.RsaDecrypt()) { Logger.Log(LogLevels.Information, "LoginConnection: Message could not be decrypted"); Disconnect(); return; } XteaKey[0] = InMessage.GetUInt32(); XteaKey[1] = InMessage.GetUInt32(); XteaKey[2] = InMessage.GetUInt32(); XteaKey[3] = InMessage.GetUInt32(); IsEncryptionEnabled = true; string accountName = InMessage.GetString(); byte[] password = InMessage.GetBytes(InMessage.GetUInt16()); DispatcherManager.DatabaseDispatcher.AddTask(() => HandleLoginPacket(accountName, password)); }