internal WinzipAesEncryptionData(WinzipAesKeySize keySize, byte[] salt, byte[] passwordVerifyValue, string password)
 {
     this.keySize = keySize;
     this.salt = salt;
     this.passwordVerifyValue = passwordVerifyValue;
     this.password = password;
     Initialize();
 }
Beispiel #2
0
 internal WinzipAesEncryptionData(WinzipAesKeySize keySize, byte[] salt, byte[] passwordVerifyValue, string password)
 {
     this.keySize             = keySize;
     this.salt                = salt;
     this.passwordVerifyValue = passwordVerifyValue;
     this.password            = password;
     Initialize();
 }
 internal static int KeyLengthInBytes(WinzipAesKeySize keySize)
 {
     return(keySize switch
     {
         WinzipAesKeySize.KeySize128 => 16,
         WinzipAesKeySize.KeySize192 => 24,
         WinzipAesKeySize.KeySize256 => 32,
         _ => throw new InvalidOperationException(),
     });
 internal static int KeyLengthInBytes(WinzipAesKeySize keySize)
 {
     switch (keySize)
     {
         case WinzipAesKeySize.KeySize128:
             return 16;
         case WinzipAesKeySize.KeySize192:
             return 24;
         case WinzipAesKeySize.KeySize256:
             return 32;
     }
     throw new InvalidOperationException();
 }
        internal static int KeyLengthInBytes(WinzipAesKeySize keySize)
        {
            switch (keySize)
            {
            case WinzipAesKeySize.KeySize128: return(16);

            case WinzipAesKeySize.KeySize192: return(24);

            case WinzipAesKeySize.KeySize256: return(32);

            default: throw new InvalidOperationException();
            }
            ;
        }
        internal static int KeyLengthInBytes(WinzipAesKeySize keySize)
        {
            switch (keySize)
            {
            case WinzipAesKeySize.KeySize128:
                return(0x10);

            case WinzipAesKeySize.KeySize192:
                return(0x18);

            case WinzipAesKeySize.KeySize256:
                return(0x20);
            }
            throw new InvalidOperationException();
        }
        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 (entryHeader.CompressionMethod != ZipCompressionMethod.WinzipAes)
                {
                    byte[] buffer = new byte[12];
                    stream.Read(buffer, 0, 12);
                    entryHeader.PkwareTraditionalEncryptionData = PkwareTraditionalEncryptionData.ForRead(password,
                                                                                                          entryHeader,
                                                                                                          buffer);
                    entryHeader.CompressedSize -= 12;
                }
                else
                {
#if NO_CRYPTO
                    throw new NotSupportedException("Cannot decrypt Winzip AES with Silverlight or WP7.");
#else
                    var data = entryHeader.Extra.SingleOrDefault(x => x.Type == ExtraDataType.WinZipAes);
                    WinzipAesKeySize keySize = (WinzipAesKeySize)data.DataBytes[4];

                    byte[] salt = new byte[WinzipAesEncryptionData.KeyLengthInBytes(keySize) / 2];
                    byte[] 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);
#endif
                }
            }
            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;

            case StreamingMode.Streaming:
            {
                entryHeader.PackedStream = stream;
            }
            break;

            default:
            {
                throw new InvalidFormatException("Invalid StreamingMode");
            }
            }
            //}
        }