/// <summary>Determines whether a stream uses X3:TC file encryption.</summary> /// <param name="s">stream.</param> /// <returns></returns> bool EncryptedX3Stream::IsEncrypted(StreamPtr s) { // Verify length if (s->GetLength() < 3) return false; // Prepare DWORD origin = s->GetPosition(); WORD header, key; // Generate key: XOR first byte with 0xC8 s->Seek(0, SeekOrigin::Begin); s->Read(reinterpret_cast<byte*>(&key), 1); key ^= DECRYPT_SEED; // Generate WORD from first byte reinterpret_cast<byte*>(&key)[1] = reinterpret_cast<byte*>(&key)[0]; // Read encrypted 2-byte header. reset position s->Read(reinterpret_cast<BYTE*>(&header), 2); s->Seek(origin, SeekOrigin::Begin); // Check for encrypted GZip header return (header ^ key) == 0x8b1f; }