コード例 #1
0
        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);
        }
コード例 #2
0
        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));
        }