public Stream Open(Stream sourceStream) { if (Stream != null) { return(Stream); } Stream stream = sourceStream.CreateSubView(Position, Length); if (Length == 0) { return(stream); } if (IsEncrypted) { AesManaged aesManaged; if (IsFutureTone) { // The IV for the entry is right // before the data. byte[] iv = new byte[16]; stream.Read(iv, 0, 16); aesManaged = FarcArchive.CreateAesManagedForFT(iv); } else { aesManaged = FarcArchive.CreateAesManaged(); } var decryptor = aesManaged.CreateDecryptor(); stream = new CryptoStream(stream, decryptor, CryptoStreamMode.Read); } if (IsCompressed) { stream = new GZipStream(stream, CompressionMode.Decompress); } return(stream); }
internal CryptoStream GetDecryptingStream(Stream stream, bool leaveOpen = false) { AesManaged aesManaged; if (IsFutureTone) { byte[] iv = new byte[16]; stream.Read(iv, 0, 16); aesManaged = FarcArchive.CreateAesManagedForFT(iv); } else { aesManaged = FarcArchive.CreateAesManaged(); } var decryptor = aesManaged.CreateDecryptor(); return(new NonClosingCryptoStream(stream, decryptor, CryptoStreamMode.Read, leaveOpen)); }