diff --git a/src/SharpCompress/Common/Zip/Headers/ZipFileEntry.cs b/src/SharpCompress/Common/Zip/Headers/ZipFileEntry.cs index 7b75c43d..c099dba0 100644 --- a/src/SharpCompress/Common/Zip/Headers/ZipFileEntry.cs +++ b/src/SharpCompress/Common/Zip/Headers/ZipFileEntry.cs @@ -64,26 +64,26 @@ namespace SharpCompress.Common.Zip.Headers internal uint UncompressedSize { get; set; } internal List Extra { get; set; } - - public string Password { get; set; } + + public string Password { get; set; } - internal PkwareTraditionalEncryptionData ComposeEncryptionData(Stream archiveStream) - { - if (archiveStream == null) - { - throw new ArgumentNullException(nameof(archiveStream)); - } + internal PkwareTraditionalEncryptionData ComposeEncryptionData(Stream archiveStream) + { + if (archiveStream == null) + { + throw new ArgumentNullException(nameof(archiveStream)); + } - var buffer = new byte[12]; - archiveStream.Read(buffer, 0, 12); + var buffer = new byte[12]; + archiveStream.Read(buffer, 0, 12); - PkwareTraditionalEncryptionData encryptionData = PkwareTraditionalEncryptionData.ForRead(Password, this, buffer); - - return encryptionData; - } + PkwareTraditionalEncryptionData encryptionData = PkwareTraditionalEncryptionData.ForRead(Password, this, buffer); + + return encryptionData; + } #if !NO_CRYPTO - internal WinzipAesEncryptionData WinzipAesEncryptionData { get; set; } + internal WinzipAesEncryptionData WinzipAesEncryptionData { get; set; } #endif internal ushort LastModifiedDate { get; set; } diff --git a/src/SharpCompress/Common/Zip/ZipFilePart.cs b/src/SharpCompress/Common/Zip/ZipFilePart.cs index 40b5f178..ed0cc568 100644 --- a/src/SharpCompress/Common/Zip/ZipFilePart.cs +++ b/src/SharpCompress/Common/Zip/ZipFilePart.cs @@ -124,50 +124,50 @@ namespace SharpCompress.Common.Zip } } - protected Stream GetCryptoStream(Stream plainStream) - { - if ((Header.CompressedSize == 0) && !string.IsNullOrEmpty(Header.Password)) - { - throw new NotSupportedException("Cannot encrypt file with unknown size at start."); - } + protected Stream GetCryptoStream(Stream plainStream) + { + if ((Header.CompressedSize == 0) && !string.IsNullOrEmpty(Header.Password)) + { + throw new NotSupportedException("Cannot encrypt file with unknown size at start."); + } - if ((Header.CompressedSize == 0) - && FlagUtility.HasFlag(Header.Flags, HeaderFlags.UsePostDataDescriptor)) - { - plainStream = new NonDisposingStream(plainStream); //make sure AES doesn't close - } - else - { - plainStream = new ReadOnlySubStream(plainStream, Header.CompressedSize); //make sure AES doesn't close - } + if ((Header.CompressedSize == 0) + && FlagUtility.HasFlag(Header.Flags, HeaderFlags.UsePostDataDescriptor)) + { + plainStream = new NonDisposingStream(plainStream); //make sure AES doesn't close + } + else + { + plainStream = new ReadOnlySubStream(plainStream, Header.CompressedSize); //make sure AES doesn't close + } - if (FlagUtility.HasFlag(Header.Flags, HeaderFlags.Encrypted)) - { - switch (Header.CompressionMethod) - { - case ZipCompressionMethod.None: - case ZipCompressionMethod.Deflate: - case ZipCompressionMethod.Deflate64: - case ZipCompressionMethod.BZip2: - case ZipCompressionMethod.LZMA: - case ZipCompressionMethod.PPMd: - return new PkwareTraditionalCryptoStream(plainStream, Header.ComposeEncryptionData(plainStream), CryptoMode.Decrypt); + if (FlagUtility.HasFlag(Header.Flags, HeaderFlags.Encrypted)) + { + switch (Header.CompressionMethod) + { + case ZipCompressionMethod.None: + case ZipCompressionMethod.Deflate: + case ZipCompressionMethod.Deflate64: + case ZipCompressionMethod.BZip2: + case ZipCompressionMethod.LZMA: + case ZipCompressionMethod.PPMd: + return new PkwareTraditionalCryptoStream(plainStream, Header.ComposeEncryptionData(plainStream), CryptoMode.Decrypt); - case ZipCompressionMethod.WinzipAes: + case ZipCompressionMethod.WinzipAes: #if !NO_FILE - if (Header.WinzipAesEncryptionData != null) - { - return new WinzipAesCryptoStream(plainStream, Header.WinzipAesEncryptionData, Header.CompressedSize - 10); - } + if (Header.WinzipAesEncryptionData != null) + { + return new WinzipAesCryptoStream(plainStream, Header.WinzipAesEncryptionData, Header.CompressedSize - 10); + } #endif - return plainStream; + return plainStream; - default: - throw new ArgumentOutOfRangeException(); - } - } + default: + throw new ArgumentOutOfRangeException(); + } + } - return plainStream; - } - } + return plainStream; + } + } } \ No newline at end of file diff --git a/src/SharpCompress/Common/Zip/ZipHeaderFactory.cs b/src/SharpCompress/Common/Zip/ZipHeaderFactory.cs index bc9d94a1..b1ecc403 100644 --- a/src/SharpCompress/Common/Zip/ZipHeaderFactory.cs +++ b/src/SharpCompress/Common/Zip/ZipHeaderFactory.cs @@ -107,74 +107,74 @@ namespace SharpCompress.Common.Zip } } - private void LoadHeader(ZipFileEntry entryHeader, Stream stream) - { - if (FlagUtility.HasFlag(entryHeader.Flags, HeaderFlags.Encrypted)) - { - if (!entryHeader.IsDirectory && entryHeader.CompressedSize == 0 && - FlagUtility.HasFlag(entryHeader.Flags, HeaderFlags.UsePostDataDescriptor)) - { - throw new NotSupportedException("SharpCompress cannot currently read non-seekable Zip Streams with encrypted data that has been written in a non-seekable manner."); - } + private void LoadHeader(ZipFileEntry entryHeader, Stream stream) + { + if (FlagUtility.HasFlag(entryHeader.Flags, HeaderFlags.Encrypted)) + { + if (!entryHeader.IsDirectory && entryHeader.CompressedSize == 0 && + FlagUtility.HasFlag(entryHeader.Flags, HeaderFlags.UsePostDataDescriptor)) + { + throw new NotSupportedException("SharpCompress cannot currently read non-seekable Zip Streams with encrypted data that has been written in a non-seekable manner."); + } - if (password == null) - { - throw new CryptographicException("No password supplied for encrypted zip."); - } + if (password == null) + { + throw new CryptographicException("No password supplied for encrypted zip."); + } - entryHeader.Password = password; + entryHeader.Password = password; - if (entryHeader.CompressionMethod == ZipCompressionMethod.WinzipAes) - { + if (entryHeader.CompressionMethod == ZipCompressionMethod.WinzipAes) + { #if NO_CRYPTO throw new NotSupportedException("Cannot decrypt Winzip AES with Silverlight or WP7."); #else - ExtraData data = entryHeader.Extra.SingleOrDefault(x => x.Type == ExtraDataType.WinZipAes); - if (data != null) - { - var keySize = (WinzipAesKeySize)data.DataBytes[4]; + ExtraData data = entryHeader.Extra.SingleOrDefault(x => x.Type == ExtraDataType.WinZipAes); + if (data != null) + { + var keySize = (WinzipAesKeySize)data.DataBytes[4]; - var salt = new byte[WinzipAesEncryptionData.KeyLengthInBytes(keySize) / 2]; - var passwordVerifyValue = new byte[2]; - stream.Read(salt, 0, salt.Length); - stream.Read(passwordVerifyValue, 0, 2); - entryHeader.WinzipAesEncryptionData = - new WinzipAesEncryptionData(keySize, salt, passwordVerifyValue, password); + var salt = new byte[WinzipAesEncryptionData.KeyLengthInBytes(keySize) / 2]; + var passwordVerifyValue = new byte[2]; + stream.Read(salt, 0, salt.Length); + stream.Read(passwordVerifyValue, 0, 2); + entryHeader.WinzipAesEncryptionData = + new WinzipAesEncryptionData(keySize, salt, passwordVerifyValue, password); - entryHeader.CompressedSize -= (uint)(salt.Length + 2); - } + entryHeader.CompressedSize -= (uint)(salt.Length + 2); + } #endif - } - } + } + } - if (entryHeader.IsDirectory) - { - return; - } + if (entryHeader.IsDirectory) + { + return; + } - //if (FlagUtility.HasFlag(entryHeader.Flags, HeaderFlags.UsePostDataDescriptor)) - //{ - // entryHeader.PackedStream = new ReadOnlySubStream(stream); - //} - //else - //{ - switch (mode) - { - case StreamingMode.Seekable: - entryHeader.DataStartPosition = stream.Position; - stream.Position += entryHeader.CompressedSize; - break; + //if (FlagUtility.HasFlag(entryHeader.Flags, HeaderFlags.UsePostDataDescriptor)) + //{ + // entryHeader.PackedStream = new ReadOnlySubStream(stream); + //} + //else + //{ + switch (mode) + { + case StreamingMode.Seekable: + entryHeader.DataStartPosition = stream.Position; + stream.Position += entryHeader.CompressedSize; + break; - case StreamingMode.Streaming: - entryHeader.PackedStream = stream; - break; + case StreamingMode.Streaming: + entryHeader.PackedStream = stream; + break; - default: - throw new InvalidFormatException("Invalid StreamingMode"); - } + default: + throw new InvalidFormatException("Invalid StreamingMode"); + } - //} - } - } + //} + } + } } \ No newline at end of file diff --git a/test/SharpCompress.Test/Zip/ZipArchiveTests.cs b/test/SharpCompress.Test/Zip/ZipArchiveTests.cs index 22292584..3f469241 100644 --- a/test/SharpCompress.Test/Zip/ZipArchiveTests.cs +++ b/test/SharpCompress.Test/Zip/ZipArchiveTests.cs @@ -374,31 +374,31 @@ namespace SharpCompress.Test Assert.Equal(count3, 3); } - [Fact] - public void Zip_Deflate_PKWear_Multipy_Entry_Access() - { - string zipFile = Path.Combine(TEST_ARCHIVES_PATH, "Zip.deflate.pkware.zip"); + [Fact] + public void Zip_Deflate_PKWear_Multipy_Entry_Access() + { + string zipFile = Path.Combine(TEST_ARCHIVES_PATH, "Zip.deflate.pkware.zip"); - using (FileStream fileStream = File.Open(zipFile, FileMode.Open)) - { - using (IArchive archive = ArchiveFactory.Open(fileStream, new ReaderOptions { Password = "12345678" })) - { - var entries = archive.Entries.Where(entry => !entry.IsDirectory); - foreach (IArchiveEntry entry in entries) - { - for (var i = 0; i < 100; i++) - { - using (var memoryStream = new MemoryStream()) - using (Stream entryStream = entry.OpenEntryStream()) - entryStream.CopyTo(memoryStream); - } - } - } - } + using (FileStream fileStream = File.Open(zipFile, FileMode.Open)) + { + using (IArchive archive = ArchiveFactory.Open(fileStream, new ReaderOptions { Password = "12345678" })) + { + var entries = archive.Entries.Where(entry => !entry.IsDirectory); + foreach (IArchiveEntry entry in entries) + { + for (var i = 0; i < 100; i++) + { + using (var memoryStream = new MemoryStream()) + using (Stream entryStream = entry.OpenEntryStream()) + entryStream.CopyTo(memoryStream); + } + } + } + } - } + } - class NonSeekableMemoryStream : MemoryStream + class NonSeekableMemoryStream : MemoryStream { public override bool CanSeek {