public LoginCrypt(uint seed, LoginEncryptionKey loginKey) { key = new uint[2]; key[0] = ((~seed ^ 0x00001357) << 16) | ((seed ^ 0xffffaaaa) & 0x0000ffff); key[1] = ((seed ^ 0x43210000) >> 16) | ((~seed ^ 0xabcdffff) & 0xffff0000); key1 = loginKey.Key1; key2 = loginKey.Key2; key3 = loginKey.Key3; }
public LoginEncryptionDetectionResult Detect(uint seed, IPullStream inputStream, Version defaultVersion) { var reader = new StreamPacketReader(new PullStreamToStreamAdapter(inputStream), rawBuffer); var length = 0; while (inputStream.DataAvailable && length < 62) { rawBuffer[length++] = reader.ReadByte(); } rawBuffer.CopyTo(decryptedBuffer, 0); var versionsToTest = GetVersionsToTest(defaultVersion).GetEnumerator(); LoginEncryptionKey?currentKey = null; LoginCrypt loginCrypt = null; while (!IsGameServerPacket(decryptedBuffer)) { if (!versionsToTest.MoveNext()) { break; } var version = versionsToTest.Current; currentKey = LoginEncryptionKey.FromVersion(version); loginCrypt = new LoginCrypt(seed, currentKey.Value); loginCrypt.Decrypt(rawBuffer, decryptedBuffer, 62); } if (currentKey.HasValue) { return(new LoginEncryptionDetectionResult(decryptedBuffer, loginCrypt, currentKey.Value)); } else { return(new LoginEncryptionDetectionResult(decryptedBuffer)); } }