예제 #1
0
        /// <summary>
        /// Perform the initial read on an entry which may include 
        /// reading encryption headers and setting up inflation.
        /// </summary>
        /// <param name="destination">The destination to fill with data read.</param>
        /// <param name="offset">The offset to start reading at.</param>
        /// <param name="count">The maximum number of bytes to read.</param>
        /// <returns>The actual number of bytes read.</returns>
        private int InitialRead(byte[] destination, int offset, int count)
        {
            if (!CanDecompressEntry)
            {
                throw new ZipException("Library cannot extract this entry. Version required is (" + entry.Version + ")");
            }

            // Handle encryption if required.
            if (entry.IsCrypted)
            {
                if (password == null)
                {
                    throw new ZipException("No password set.");
                }

                // Generate and set crypto transform...
                var managed = new PkzipClassicManaged();
                var key = PkzipClassic.GenerateKeys(ZipConstants.ConvertToArray(password));

                inputBuffer.CryptoTransform = managed.CreateDecryptor(key, null);

                var cryptbuffer = new byte[ZipConstants.CryptoHeaderSize];
                inputBuffer.ReadClearTextBuffer(cryptbuffer, 0, ZipConstants.CryptoHeaderSize);

                if (cryptbuffer[ZipConstants.CryptoHeaderSize - 1] != entry.CryptoCheckValue)
                {
                    throw new ZipException("Invalid password");
                }

                if (csize >= ZipConstants.CryptoHeaderSize)
                {
                    csize -= ZipConstants.CryptoHeaderSize;
                }
                else if ((entry.Flags & (int) GeneralBitFlags.Descriptor) == 0)
                {
                    throw new ZipException(string.Format("Entry compressed size {0} too small for encryption", csize));
                }
            }
            else
            {
                inputBuffer.CryptoTransform = null;
            }

            if ((method == (int) CompressionMethod.Deflated) && (inputBuffer.Available > 0))
            {
                inputBuffer.SetInflaterInput(inf);
            }

            internalReader = BodyRead;
            return BodyRead(destination, offset, count);
        }
예제 #2
0
 /// <summary>
 /// Initializes encryption keys based on given password
 /// </summary>
 /// <param name="password">The password.</param>
 protected void InitializePassword(string password)
 {
     var pkManaged = new PkzipClassicManaged();
     var key = PkzipClassic.GenerateKeys(ZipConstants.ConvertToArray(password));
     cryptoTransform_ = pkManaged.CreateEncryptor(key, null);
 }