Moved specifications files to web page.
diff --git a/docs/aes_coding_tips.txt b/docs/aes_coding_tips.txt
deleted file mode 100644
index 052864a..0000000
--- a/docs/aes_coding_tips.txt
+++ /dev/null
@@ -1,253 +0,0 @@
-AES Coding Tips for Developers
-
-NOTE: WinZip^(R) users do not need to read or understand the information
-contained on this page. It is intended for developers of Zip file utilities.
-
-This document contains information that may be helpful to developers and other
-interested parties who wish to support the AE-1 and AE-2 AES encryption formats
-in their own Zip file utilities. WinZip Computing makes no warranties regarding
-the information provided in this document. In particular, WinZip Computing does
-not represent or warrant that the information provided here is free from errors
-or is suitable for any particular use, or that the file formats described here
-will be supported in future versions of WinZip. You should test and validate
-all code and techniques in accordance with good programming practice.
-
-This information supplements the basic encryption specification document found
-here.
-
-This document assumes that you are using Dr. Brian Gladman's AES encryption
-package. Dr. Gladman has generously made public a sample application that
-demonstrates the use of his encryption/decryption and other routines, and the
-code samples shown below are derived from this sample application. Dr.
-Gladman's AES library and the sample application are available from the AES
-project page on Dr. Gladman's web site.
-
-━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
-
-Generating a salt value
-
-Please read the discussion of salt values in the encryption specification.
-
-Dr. Gladman has provided a pseudo-random number generator in the files PRNG.C
-and PRNG.H. You may find this suitable for generating salt values. These files
-are included in the sample package available through the AES project page on
-Dr. Gladman's web site.
-
-Here are guidelines for using Dr. Gladman's generator. Note that the generator
-is used rather like an I/O stream: it is opened (initialized), used, and
-finally closed. To obtain the best results, it is recommended that you
-initialize the generator when your application starts and close it when your
-application closes. (If you are coding in C++, you may wish to wrap these
-actions in a C++ class that initializes the generator on construction and
-closes it on destruction.)
-
- 1. You will need to provide an entropy function in your code for
-    initialization of the generator. The entropy function need not be
-    particularly sophisticated for this use. Here is one possibility for such a
-    function, based primarily upon the Windows performance counter:
-
-    int entropy_fun(
-     unsigned char buf[],
-     unsigned int len)
-        {
-        unsigned __int64 pentium_tsc[1];
-        unsigned int     i;
-        static unsigned int num = 0;
-        // this sample code returns the following sequence of entropy information
-        // - the current 8-byte Windows performance counter value
-        // - an 8-byte representation of the current date/time
-        // - an 8-byte value built from the current process ID and thread ID
-        // - all subsequent calls return the then-current 8-byte performance
-        //      counter value
-        switch (num)
-            {
-        case 1:
-            ++num;
-            // use a value that is unlikely to repeat across system reboots
-            GetSystemTimeAsFileTime((FILETIME *)pentium_tsc);
-            break;
-        case 2:
-            ++num;
-            {
-            // use a value that distinguishes between different instances of this
-            // code that might be running on different processors at the same time
-            unsigned __int32 processtest = GetCurrentProcessId();
-            unsigned __int32 threadtest = GetCurrentThreadId();
-            pentium_tsc[0] = processtest;
-            pentium_tsc[0] = (pentium_tsc[0] << 32) + threadtest;
-            }
-            break;
-        case 0:
-            ++num;
-            // fall through to default case
-        default:
-            // use a rapidly-changing value
-            //  Note: check QueryPerformanceFrequency() first to
-            //  ensure that QueryPerformanceCounter() will work.
-            QueryPerformanceCounter((LARGE_INTEGER *)pentium_tsc);
-            break;
-            }
-        for(i = 0; i < 8 && i < len; ++i)
-            buf[i] = ((unsigned char*)pentium_tsc)[i];
-        return i;
-        }
-
-    Note: the required prototype for the entropy function is defined in PRNG.H.
-
- 2. Initialize the generator by calling prng_init(), providing the addresses of
-    your entropy function and of an instance of a prng_ctx structure (defined
-    in PRNG.H). The prng_ctx variable maintains a context for the generator and
-    is used as a parameter for the other generator functions. Therefore, the
-    variable's state must be maintained until the generator is closed.
-
-    prng_ctx ctx;
-    prng_init(entropy_fun, &ctx);
-
-    You only need to do this once per application session (as long as you keep
-    the "stream" open).
-
- 3. To obtain a sequence of random bytes of arbitrary size, use prng_rand().
-    This code obtains 16 random bytes, suitable for use as a salt value for
-    256-bit AES encryption:
-
-    unsigned char buffer[16];
-    prng_rand(buffer, sizeof(buffer), &ctx);
-
-    Note that the ctx parameter is the same prng_ctx variable that was used in
-    the initialization call.
-
- 4. When you are done with the generator (this would normally be when your
-    application closes), close it by calling prng_end:
-
-    prng_end(&ctx);
-
-    Again, the ctx parameter is the same prng_ctx variable that was used in the
-    initialization call.
-
-Encryption and decryption
-
-The actual encryption and decryption of data are handled quite similarly, and
-again are rather stream-like: a stream is "opened", data is passed to it for
-encryption or decryption, and then it is closed. The password verifier is
-returned when the stream is opened, and the authentication code is returned
-when the stream is closed.
-
-Here is the basic technique:
-
- 1. Initialize the "stream" for encryption or decryption and obtain the
-    password verification value.
-
-    There is no difference in the initialization, regardless of whether you are
-    encrypting or decrypting:
-
-    fcrypt_ctx zctx;     // the encryption context
-    int rc = fcrypt_init(
-      KeySize,       // extra data value indicating key size
-      pszPassword,     // the password
-      strlen(pszPassword), // number of bytes in password
-      achSALT,       // the salt
-      achPswdVerifier,   // on return contains password verifier
-      &zctx);       // encryption context
-
-    The return value is 0 if the initialization was successful; non-zero values
-    indicate errors. Note that passwords are null-terminated ANSI strings;
-    embedded nulls must not be used. (To avoid incompatibilities between the
-    various character sets in use, especially in different versions of Windows,
-    users should be encouraged to use passwords containing only the "standard"
-    characters in the range 32-127.)
-
-    The function returns the password verification value in achPswdVerifier,
-    which must be a 2-byte buffer. If you are encrypting, store this value in
-    the Zip file as indicated by the encryption specification. If you are
-    decrypting, compare this returned value to the value stored in the Zip
-    file. If they are different, then either the password provided by your user
-    was incorrect or the encrypted file has been altered in some way since it
-    was encrypted. (Note that if they match, there is still a 1 in 65,536
-    chance that an incorrect password was provided.)
-
-    The initialized encryption context (zctx) is used as a parameter to the
-    encryption/decryption functions. Therefore, its state must be maintained
-    until the "stream" is closed.
-
- 2. Encrypt or decrypt the data.
-
-    To encrypt:
-
-    fcrypt_encrypt(
-      pchData, // pointer to the data to encrypt
-      cb,   // how many bytes to encrypt
-      &zctx); // encryption context
-
-    To decrypt:
-
-    fcrypt_decrypt(
-      pchData, // pointer to the data to decrypt
-      cb,   // how many bytes to decrypt
-      &zctx); // decryption context
-
-    You may need to call the encrypt or decrypt function multiple times,
-    passing in successive chunks of data in the buffer. For AE-1 and AE-2
-    compatibility, the buffer size must be a multiple of 16 bytes except for
-    the last buffer, which may be smaller. For efficiency, a larger buffer size
-    such as 32,768 would generally be used.
-
-    Note: to encrypt zero-length files, simply skip this step. You will still
-    obtain and use the password verifier (step 1) and authentication code (step
-    3).
-
- 3. Close the "stream" and obtain the authentication code.
-
-    When encryption/decryption is complete, close the "stream" as follows:
-
-    int rc = fcrypt_end(
-      achMAC, // on return contains the authentication code
-      &zctx); // encryption context
-
-    The return value is the size of the authentication code, which will always
-    be 10 for AE-1 and AE-2. The authentication code itself is returned in your
-    buffer at achMAC, which is an array of char, sized to hold at least 10
-    characters. If you are encrypting, store this value in the Zip file as
-    indicated by the encryption specification; if you are decrypting, compare
-    this value to the value stored in the Zip file. If the values are
-    different, either the password is incorrect or the encrypted data has been
-    altered subsequent to storage.
-
-    Note that decryption can fail even if the encrypted data is unaltered and
-    the password verifier was correct in step 1. The password verifier is
-    useful as a quick way to detect most incorrect passwords, but it is not
-    perfect and on rare occasions (1 out of 65,536) it will fail to detect an
-    incorrect password. It is therefore important for you to check the
-    authentication code on completion even though the password verifier was
-    correct.
-
-Notes
-
-  • Dr. Gladman's AES code depends on the byte order (little-endian or
-    big-endian) used by the computing platform the code will run on. This is
-    determined by a C preprocessor constant called PLATFORM_BYTE_ORDER, which
-    is defined in the file AESOPT.H. You should be sure that
-    PLATFORM_BYTE_ORDER gets the proper value for your platform; if it does
-    not, you will need to define it yourself to the correct value. When using
-    the Microsoft compiler on Intel platforms it does get the proper value,
-    which on these platforms is AES_LITTLE_ENDIAN. We have, however, had a
-    report that it does not default properly when Borland C++ Builder is used,
-    and that manual assignment is necessary. For additional information on this
-    topic, refer to the comments within AESOPT.H.
-
-Change history
-
-Changes made in document version 1.04, July, 2008:
-
- A. Sample Entropy Function
-
-    The sample entropy function was changed to include information near the
-    very beginning of the entropy stream that's unique to the day and to the
-    process and thread.
-
-━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
-
-Document version: 1.04
-Last modified: July 21, 2008
-
-Copyright(C) 2003-2016 WinZip International LLC.
-All Rights Reserved
diff --git a/docs/aes_info.txt b/docs/aes_info.txt
deleted file mode 100644
index c7995d5..0000000
--- a/docs/aes_info.txt
+++ /dev/null
@@ -1,607 +0,0 @@
-AES Encryption Information:
-Encryption Specification AE-1 and AE-2
-
-Document version: 1.04
-Last modified: January 30, 2009
-
-NOTE: WinZip^(R) users do not need to read or understand the information
-contained on this page. It is intended for developers of Zip file utilities.
-
-Changes since the original version of this document are summarized in the
-Change History section below.
-
-This document describes the file format that WinZip uses to create
-AES-encrypted Zip files. The AE-1 encryption specification was introduced in
-WinZip 9.0 Beta 1, released in May 2003. The AE-2 encryption specification, a
-minor variant of the original AE-1 specification differing only in how the CRC
-is handled, was introduced in WinZip 9.0 Beta 3, released in January, 2004.
-Note that as of WinZip 11, WinZip itself encrypts most files using the AE-1
-format and encrypts others using the AE-2 format.
-
-From time to time we may update the information provided here, for example to
-document any changes to the file formats, or to add additional notes or
-implementation tips. If you would like to receive e-mail announcements of any
-substantive changes we make to this document, you can sign up below for our
-Developer Information mailing list.
-
-Without compromising the basic Zip file format, WinZip Computing has extended
-the format specification to support AES encryption, and this document fully
-describes the format extension. Additionally, we are providing information
-about a no-cost third-party source for the actual AES encryption code--the same
-code that is used by WinZip. We believe that use of the free encryption code
-and of this specification will make it easy for all developers to add
-compatible advanced encryption to their Zip file utilities.
-
-This document is not a tutorial on encryption or Zip file structure. While we
-have attempted to provide the necessary details of the current WinZip AES
-encryption format, developers and other interested third parties will need to
-have or obtain an understanding of basic encryption concepts, Zip file format,
-etc.
-
-Developers should also review AES Coding Tips page.
-
-WinZip Computing makes no warranties regarding the information provided in this
-document. In particular, WinZip Computing does not represent or warrant that
-the information provided here is free from errors or is suitable for any
-particular use, or that the file formats described here will be supported in
-future versions of WinZip. You should test and validate all code and techniques
-in accordance with good programming practice.
-
-━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
-
-Contents
-
- I. Encryption services
-II. Zip file format
-     A. Base format reference
-     B. Compression method and encryption flag
-     C. CRC value
-     D. AES extra data field
-III. Encrypted file storage format
-     A. File format
-     B. Salt value
-     C. Password verification value
-     D. Encrypted file data
-     E. Authentication code
-IV. Changes in WinZip 11
- V. Notes
-     A. Non-files and zero-length files
-     B. "Mixed" Zip files
-     C. Key generation
-VI. FAQs
-VII. Change history
-VIII. Mailing list signup
-
-
-I. Encryption services
-
-To perform AES encryption and decryption, WinZip uses AES functions written by
-Dr. Brian Gladman. The source code for these functions is available in C/C++
-and Pentium family assembler for anyone to use under an open source BSD or GPL
-license from the AES project page on Dr. Gladman's web site. The AES Coding
-Tips page also has some information on the use of these functions. WinZip
-Computing thanks Dr. Gladman for making his AES functions available to anyone
-under liberal license terms.
-
-Dr. Gladman's encryption functions are portable to a number of operating
-systems and can be static linked into your applications, so there are no
-operating system version or library dependencies. In particular, the functions
-do not require Microsoft's Cryptography API.
-
-General information on the AES standard and the encryption algorithm (also
-known as Rijndael) is readily available on the Internet. A good place to start
-is http://www.nist.gov/public_affairs/releases/g00-176.htm.
-
-II. Zip file format
-
- A. Base format reference
-
-    AES-encrypted files are stored within the guidelines of the standard Zip
-    file format using only a new "extra data" field, a new compression method
-    code, and a value in the CRC field dependant on the encryption version,
-    AE-1 or AE-2. The basic Zip file format is otherwise unchanged.
-
-    WinZip sets the version needed to extract and version made by fields in the
-    local and central headers to the same values it would use if the file were
-    not encrypted.
-
-    The basic Zip file format specification used by WinZip is available via FTP
-    from the Info-ZIP group at ftp://ftp.info-zip.org/pub/infozip/doc/
-    appnote-iz-latest.zip.
-
- B. Compression method and encryption flag
-
-    As for any encrypted file, bit 0 of the "general purpose bit flags" field
-    must be set to 1 in each AES-encrypted file's local header and central
-    directory entry.
-
-    Additionally, the presence of an AES-encrypted file in a Zip file is
-    indicated by a new compression method code (decimal 99) in the file's local
-    header and central directory entry, used along with the AES extra data
-    field described below. There is no change in either the version made by or
-    version needed to extract codes.
-
-    The code for the actual compression method is stored in the AES extra data
-    field (see below).
-
- C. CRC value
-
-    For files encrypted using the AE-2 method, the standard Zip CRC value is
-    not used, and a 0 must be stored in this field. Corruption of encrypted
-    data within a Zip file is instead detected via the authentication code
-    field.
-
-    Files encrypted using the AE-1 method do include the standard Zip CRC
-    value. This, along with the fact that the vendor version stored in the AES
-    extra data field is 0x0001 for AE-1 and 0x0002 for AE-2, is the only
-    difference between the AE-1 and AE-2 formats.
-
-    NOTE: Zip utilities that support the AE-2 format are required to be able to
-    read files that were created in the AE-1 format, and during decryption/
-    extraction of files in AE-1 format should verify that the file's CRC
-    matches the value stored in the CRC field.
-
- D. AES extra data field
-     1. A file encrypted with AES encryption will have a special "extra data"
-        field associated with it. This extra data field is stored in both the
-        local header and central directory entry for the file.
-
-        Note: see the Zip file format document referenced above for general
-        information on the format and use of extra data fields.
-
-     2. The extra data header ID for AES encryption is 0x9901. The fields are
-        all stored in Intel low-byte/high-byte order. The extra data field
-        currently has a length of 11: seven data bytes plus two bytes for the
-        header ID and two bytes for the data size. Therefore, the extra data
-        overhead for each file in the archive is 22 bytes (11 bytes in the
-        central header plus 11 bytes in the local header).
-     3. The format of the data in the AES extra data field is as follows. See
-        the notes below for additional information.
-
-        Offset Size(bytes) Content
-
-        0      2           Extra field header ID (0x9901)
-
-        2      2           Data size (currently 7, but subject
-                           to possible increase in the future)
-
-        4      2           Integer version number specific to
-                           the zip vendor
-
-        6      2           2-character vendor ID
-
-        8      1           Integer mode value indicating AES
-                           encryption strength
-
-        9      2           The actual compression method used to
-                           compress the file
-
-     4. Notes
-          ☆ Data size: this value is currently 7, but because it is possible
-            that this specification will be modified in the future to store
-            additional data in this extra field, vendors should not assume that
-            it will always remain 7.
-          ☆ Vendor ID: the vendor ID field should always be set to the two
-            ASCII characters "AE".
-          ☆ Vendor version: the vendor version for AE-1 is 0x0001. The vendor
-            version for AE-2 is 0x0002.
-
-            Zip utilities that support AE-2 must also be able to process files
-            that are encrypted in AE-1 format. The handling of the CRC value is
-            the only difference between the AE-1 and AE-2 formats.
-
-          ☆ Encryption strength: the mode values (encryption strength) for AE-1
-            and AE-2 are:
-
-            Value Strength
-
-            0x01  128-bit encryption key
-
-            0x02  192-bit encryption key
-
-            0x03  256-bit encryption key
-
-            The encryption specification supports only 128-, 192-, and 256-bit
-            encryption keys. No other key lengths are permitted.
-
-            (Note: the current version of WinZip does not support encrypting
-            files using 192-bit keys. This specification, however, does provide
-            for the use of 192-bit keys, and WinZip is able to decrypt such
-            files.)
-
-          ☆ Compression method: the compression method is the one that would
-            otherwise have been stored in the local and central headers for the
-            file. For example, if the file is imploded, this field will contain
-            the compression code 6. This is needed because a compression method
-            of 99 is used to indicate the presence of an AES-encrypted file
-            (see above).
-
-III. Encrypted file storage format
-
- A. File format
-
-    Additional overhead data required for decryption is stored with the
-    encrypted file itself (i.e., not in the headers). The actual format of the
-    stored file is as follows; additional information about these fields is
-    below. All fields are byte-aligned.
-
-    Size     Content
-    (bytes)
-
-    Variable Salt value
-
-    2        Password verification value
-
-    Variable Encrypted file data
-
-    10       Authentication code
-
-    Note that the value in the "compressed size" fields of the local file
-    header and the central directory entry is the total size of all the items
-    listed above. In other words, it is the total size of the salt value,
-    password verification value, encrypted data, and authentication code.
-
- B. Salt value
-
-    The "salt" or "salt value" is a random or pseudo-random sequence of bytes
-    that is combined with the encryption password to create encryption and
-    authentication keys. The salt is generated by the encrypting application
-    and is stored unencrypted with the file data. The addition of salt values
-    to passwords provides a number of security benefits and makes dictionary
-    attacks based on precomputed keys much more difficult.
-
-    Good cryptographic practice requires that a different salt value be used
-    for each of multiple files encrypted with the same password. If two files
-    are encrypted with the same password and salt, they can leak information
-    about each other. For example, it is possible to determine whether two
-    files encrypted with the same password and salt are identical, and an
-    attacker who somehow already knows the contents of one of two files
-    encrypted with the same password and salt can determine some or all of the
-    contents of the other file. Therefore, you should make every effort to use
-    a unique salt value for each file.
-
-    The size of the salt value depends on the length of the encryption key, as
-    follows:
-
-    Key size Salt size
-
-    128 bits 8 bytes
-
-    192 bits 12 bytes
-
-    256 bits 16 bytes
-
- C. Password verification value
-
-    This two-byte value is produced as part of the process that derives the
-    encryption and decryption keys from the password. When encrypting, a
-    verification value is derived from the encryption password and stored with
-    the encrypted file. Before decrypting, a verification value can be derived
-    from the decryption password and compared to the value stored with the
-    file, serving as a quick check that will detect most, but not all,
-    incorrect passwords. There is a 1 in 65,536 chance that an incorrect
-    password will yield a matching verification value; therefore, a matching
-    verification value cannot be absolutely relied on to indicate a correct
-    password.
-
-    Information on how to obtain the password verification value from Dr.
-    Gladman's encryption library can be found on the coding tips page.
-
-    This value is stored unencrypted.
-
- D. Encrypted file data
-
-    Encryption is applied only to the content of files. It is performed after
-    compression, and not to any other associated data. The file data is
-    encrypted byte-for-byte using the AES encryption algorithm operating in
-    "CTR" mode, which means that the lengths of the compressed data and the
-    compressed, encrypted data are the same.
-
-    It is important for implementors to note that, although the data is
-    encrypted byte-for-byte, it is presented to the encryption and decryption
-    functions in blocks. The block size used for encryption and decryption must
-    be the same. To be compatible with the encryption specification, this block
-    size must be 16 bytes (although the last block may be smaller).
-
- E. Authentication code
-
-    Authentication provides a high quality check that the contents of an
-    encrypted file have not been inadvertently changed or deliberately tampered
-    with since they were first encrypted. In effect, this is a super-CRC check
-    on the data in the file after compression and encryption. (Additionally,
-    authentication is essential when using CTR mode encryption because this
-    mode is vulnerable to several trivial attacks in its absence.)
-
-    The authentication code is derived from the output of the encryption
-    process. Dr. Gladman's AES code provides this service, and information
-    about how to obtain it is in the coding tips.
-
-    The authentication code is stored unencrypted. It is byte-aligned and
-    immediately follows the last byte of encrypted data.
-
-    For more discussion about authentication, see the authentication code FAQ
-    below.
-
-IV. Changes in WinZip 11
-
-Beginning with WinZip 11, WinZip makes a change in its use of the AE-1 and AE-2
-file formats. The file formats themselves have not changed, and AES-encrypted
-files created by WinZip 11 are completely compatible with version 1.02 the
-WinZip AES encryption specification, which was published in January 2004.
-
-WinZip 9.0 and WinZip 10.0 stored all AES-encrypted files using the AE-2 file
-format, which does not store the encrypted file's CRC. WinZip 11 instead uses
-the AE-1 file format, which does store the CRC, for most files. This provides
-an extra integrity check against the possibility of hardware or software errors
-that occur during the actual process of file compression/encryption or
-decryption/decompression. For more information on this point, see the
-discussion of the CRC below.
-
-Because for some very small files the CRC can be used to determine the exact
-contents of a file, regardless of the encryption method used, WinZip 11
-continues to use the AE-2 file format, with no CRC stored, for files with an
-uncompressed size of less than 20 bytes. WinZip 11 also uses the AE-2 file
-format for files compressed in BZIP2 format, because the BZIP2 format contains
-its own integrity checks equivalent to those provided by the Zip format's CRC.
-
-Other vendors who support WinZip's AES encryption specification may want to
-consider making a similar change to their own implementations of the
-specification, to get the benefit of the extra integrity check that it
-provides.
-
-Note that the January 2004 version of the WinZip AE-2 specification, version
-1.0.2, already required that all utilities that implemented the AE-2 format
-also be able to process files in AE-1 format, and should check on decryption/
-extraction of those files that the CRC was correct.
-
-V. Notes
-
- A. Non-files and zero-length files
-
-    To reduce Zip file size, it is recommended that non-file entries such as
-    folder/directory entries not be encrypted. This, however, is only a
-    recommendation; it is permissible to encrypt or not encrypt these entries,
-    as you prefer.
-
-    On the other hand, it is recommended that you do encrypt zero-length files.
-    The presence of both encrypted and unencrypted files in a Zip file may
-    trigger user warnings in some Zip file utilities, so the user experience
-    may be improved if all files (including zero-length files) are encrypted.
-
-    If zero-length files are encrypted, the encrypted data portion of the file
-    storage (see above) will be empty, but the remainder of the encryption
-    overhead data must be present, both in the file storage area and in the
-    local and central headers.
-
- B. "Mixed" Zip files
-
-    There is no requirement that all files in a Zip file be encrypted or that
-    all files that are encrypted use the same encryption method or the same
-    password.
-
-    A Zip file can contain any combination of unencrypted files and files
-    encrypted with any of the four currently defined encryption methods (Zip
-    2.0, AES-128, AES-192, AES-256). Encrypted files may use the same password
-    or different passwords.
-
- C. Key Generation
-
-    Key derivation, as used by AE-1 and AE-2 and as implemented in Dr.
-    Gladman's library, is done according to the PBKDF2 algorithm, which is
-    described in the RFC2898 guidelines. An iteration count of 1000 is used. An
-    appropriate number of bits from the resulting hash value are used to
-    compose three output values: an encryption key, an authentication key, and
-    a password verification value. The first n bits become the encryption key,
-    the next m bits become the authentication key, and the last 16 bits (two
-    bytes) become the password verification value.
-
-    As part of the process outlined in RFC 2898 a pseudo-random function must
-    be called; AE-2 uses the HMAC-SHA1 function, since it is a well-respected
-    algorithm that has been in wide use for this purpose for several years.
-
-    Note that, when used in connection with 192- or 256-bit AES encryption, the
-    fact that HMAC-SHA1 produces a 160-bit result means that, regardless of the
-    password that you specify, the search space for the encryption key is
-    unlikely to reach the theoretical 192- or 256-bit maximum, and cannot be
-    guaranteed to exceed 160 bits. This is discussed in section B.1.1 of the
-    RFC2898 specification.
-
-VI. FAQs
-
-  • Why is the compression method field used to indicate AES encryption?
-
-    As opposed to using new version made by and version needed to extract
-    values to signal AES encryption for a file, the new compression method is
-    more likely to be handled gracefully by older versions of existing Zip file
-    utilities. Zip file utilities typically do not attempt to extract files
-    compressed with unknown methods, presumably notifying the user with an
-    appropriate message.
-
-  • How can I guarantee that the salt value is unique?
-
-    In principle, the value of the salt should be different whenever the same
-    password is used more than once, for the reasons described above, but this
-    is difficult to guarantee.
-
-    In practice, the number of bytes in the salt (as specified by AE-1 and
-    AE-2) is such that using a pseudo-random value will ensure that the
-    probability of duplicated salt values is very low and can be safely
-    ignored.
-
-    There is one exception to this: With the 8-byte salt values used with
-    WinZip's 128-bit encryption it is likely that, if approximately 4 billion
-    files are encrypted with the same password, two of the files will have the
-    same salt, so it is advisable to stay well below this limit. Because of
-    this, when using the same password to encrypt very large numbers of files
-    in WinZip's AES encryption format (that is, files totalling in the
-    millions, for example 2000 Zip files, each containing 1000 encrypted
-    files), we recommend the use of 192-bit or 256-bit AES keys, with their 12-
-    and 16-byte salt values, rather than 128-bit AES keys, with their 8-byte
-    salt values.
-
-    Although salt values do not need to be truly random, it is important that
-    they be generated in a way that the probability of duplicated salt values
-    is not significantly higher than that which would be expected if truly
-    random values were being used.
-
-    One technique for generating salt values is presented in the coding tips
-    page.
-
-  • Why is there an authentication code?
-
-    The purpose of the authentication code is to insure that, once a file's
-    data has been compressed and encrypted, any accidental corruption of the
-    encrypted data, and any deliberate attempts to modify the encrypted data by
-    an attacker who does not know the password, can be detected.
-
-    The current consensus in the cryptographic community is that associating a
-    message authentication code (or MAC) with encrypted data has strong
-    security value because it makes a number of attacks more difficult to
-    engineer. For AES CTR mode encryption in particular, a MAC is especially
-    important because a number of trivial attacks are possible in its absence.
-    The MAC used with WinZip's AES encryption is based on HMAC-SHA1-80, a
-    mature and widely respected authentication algorithm.
-
-    The MAC is calculated after the file data has been compressed and
-    encrypted. This order of calculation is referred to as Encrypt-then-MAC,
-    and is preferred by many cryptographers to the alternative order of
-    MAC-then-Encrypt because Encrypt-then-MAC is immune to some known attacks
-    on MAC-then-Encrypt.
-
-  • What is the role of the CRC in WinZip 11?
-
-    Within the Zip format, the primary use of the CRC value is to detect
-    accidental corruption of data that has been stored in the Zip file. With
-    files encrypted according to the Zip 2.0 encryption specification, it also
-    functions to some extent as a method of detecting deliberate attempts to
-    modify the encrypted data, but not one that can be considered
-    cryptographically strong. The CRC is not needed for these purposes with the
-    WinZip AES encryption specification, where the HMAC-SHA1-based
-    authentication code instead serves these roles.
-
-    The CRC has a drawback in that for very small files, such as files with
-    four or fewer bytes, the CRC can be used, independent of the encryption
-    algorithm, to determine the unencrypted contents of the file. And, in
-    general, it is preferable to store as little information as possible about
-    the encrypted file in the unencrypted Zip headers.
-
-    The CRC does serve one purpose that the authentication code does not. The
-    CRC is computed based on the original uncompressed, unencrypted contents of
-    the file, and it is checked after the file has been decrypted and
-    decompressed. In contrast, the authentication code used with WinZip AES
-    encryption is computed after compression/encryption and it is checked
-    before decryption/decompression. In the very rare event of a hardware or
-    software error that corrupts data during compression and encryption, or
-    during decryption and decompression, the CRC will catch the error, but the
-    authentication code will not.
-
-    WinZip 9.0 and WinZip 10.0 used AE-2 for all files that they created, and
-    did not store the CRC. As of WinZip 11, WinZip instead uses AE-1 for most
-    files, storing the CRC as an additional integrity check against hardware or
-    software errors occurring during the actual compression/encryption or
-    decryption/decompression processes. WinZip 11 will continue to use AE-2,
-    with no CRC, for very small files of less than 20 bytes. It will also use
-    AE-2 for files compressed in BZIP2 format, because this format has internal
-    integrity checks equivalent to a CRC check built in.
-
-    Note that the AES-encrypted files created by WinZip 11 are fully compatible
-    with January 2004's version 1.0.2 of the WinZip AES encryption
-    specification, in which both the AE-1 and AE-2 variants of the file format
-    were already defined.
-
-VII. Change history
-
-Changes made in document version 1.04, January, 2009: Minor clarification
-regarding the algorithm used to generate the authentication code.
-
-Changes made in document version 1.03, November, 2006: Minor editorial and
-clarifying changes have been made throughout the document. The following
-substantive technical changes have been made:
-
- A. WinZip 11 Usage of AE-1 and AE-2
-
-    WinZip's AES encryption specification defines two formats, known as AE-1
-    and AE-2, which differ in whether the CRC of the encrypted file is stored
-    in the Zip headers. While the file formats themselves remain unchanged,
-    WinZip's usage of them is changing. Beginning with WinZip 11, WinZip uses
-    the AE-1 format, which includes the CRC of the encrypted file, for many
-    encrypted files, in order to provide an additional integrity check against
-    hardware or software errors occurring during the compression/encryption or
-    decryption/decompression processes. Note that AES-encrypted files created
-    by WinZip 11 are completely compatible with the previous version of the
-    WinZip encryption specification, January 2004's version 1.0.2.
-
- B. The discussion of salt values mentions a limitation that applies to the
-    uniqueness of salt values when very large numbers of files are encrypted
-    with 128-bit encryption.
- C. Older versions of this specification suggested that other vendors might
-    want to use their own vendor IDs to create their own unique encryption
-    formats. We no longer suggest that vendor-specific alternative encryption
-    methods be created in this way.
-
-Changes made in document version 1.02, January, 2004: The introductory text at
-the start of the document has been rewritten, and minor editorial and
-clarifying changes have been made throughout the document. Two substantive
-technical changes have been made:
-
- A. AE-2 Specification
-
-    Standard Zip files store the CRC of each file's unencrypted data. This
-    value is used to help detect damage or other alterations to Zip files.
-    However, storing the CRC value has a drawback in that, for a very small
-    file, such as a file of four or fewer bytes, the CRC value can be used,
-    independent of the encryption algorithm, to help determine the unencrypted
-    contents of the file.
-
-    Because of this, files encrypted with the new AE-2 method store a 0 in the
-    CRC field of the Zip header, and use the authentication code instead of the
-    CRC value to verify that encrypted data within the Zip file has not been
-    corrupted.
-
-    The only differences between the AE-1 and AE-2 methods are the storage in
-    AE-2 of 0 instead of the CRC in the Zip file header,and the use in the AES
-    extra data field of 0x0002 for AE-2 instead of 0x0001 for AE-1 as the
-    vendor version.
-
-    Zip utilities that support the AE-2 format are required to be able to read
-    files that were created in the AE-1 format, and during decryption/
-    extraction of files in AE-1 format should verify that the file's CRC
-    matches the value stored in the CRC field.
-
- B. Key Generation and HMAC-SHA1
-
-    The description of the key generation mechanism has been updated to point
-    out a limitation arising from its use of HMAC-SHA1 as the pseudo-random
-    function: When used in connection with 192- or 256-bit AES encryption, the
-    fact that HMAC-SHA1 produces a 160-bit result means that, regardless of the
-    password that you specify, the search space for the encryption key is
-    unlikely to reach the theoretical 192- or 256-bit maximum, and cannot be
-    guaranteed to exceed 160 bits. This is discussed in section B.1.1 of the
-    RFC2898 specification.
-
-VII. Developer Information Mailing List Signup
-
-We plan to use this mailing list to notify subscribers of any substantive
-changes made to the Developer Information pages on the WinZip web site.
-
-
-
-   If you enter your e-mail address above, you will receive a message
-   asking you to confirm your wish to be added to the mailing list. If you
-   don't reply to the confirmation message, you will not be added to the
-   list.
-
-   By subscribing to this complimentary mailing list service, you
-   acknowledge and agree that WinZip Computing makes no representations
-   regarding the completeness or accuracy of the information provided
-   through the service, and that this service may be discontinued, in whole
-   or in part, with respect to any or all subscribers at any time.
-   * E-mail Address:
-     [                    ]   [Submit to Support] [Clear Form]
-━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
-
-Document version: 1.04
-Last modified: January 30, 2009
-
-Copyright(C) 2003-2015 WinZip International LLC.
-All Rights Reserved
diff --git a/docs/appnote.iz b/docs/appnote.iz
deleted file mode 100644
index eed5663..0000000
--- a/docs/appnote.iz
+++ /dev/null
@@ -1,3686 +0,0 @@
-[Info-ZIP note, 20040528:  this file is based on PKWARE's appnote.txt of

- 15 February 1996, taking into account PKWARE's revised appnote.txt

- version 6.2.0 of 26 April 2004.  It has been unofficially corrected

- and extended by Info-ZIP without explicit permission by PKWARE.

- Although Info-ZIP believes the information to be accurate and complete,

- it is provided under a disclaimer similar to the PKWARE disclaimer below,

- differing only in the substitution of "Info-ZIP" for "PKWARE".  In other

- words, use this information at your own risk, but we think it's correct.

-

- Specification info from PKWARE that was obviously wrong has been corrected

- silently (e.g. missing structure fields, wrong numbers).

- As of PKZIPW 2.50, two new incompatibilities have been introduced by PKWARE;

- they are noted below.  Note that the "NTFS tag" conflict is currently not

- real; PKZIPW 2.50 actually tags NTFS files as having come from a FAT

- file system, too.]

-

-File:    APPNOTE.TXT - .ZIP File Format Specification

-Version: 6.2.0 - NOTIFICATION OF CHANGE

-Revised: 04/26/2004 [2004-05-28 Info-ZIP]

-Copyright (c) 1989 - 2004 PKWARE Inc., All Rights Reserved.

-

-I. Purpose

-----------

-

-This specification is intended to define a cross-platform,

-interoperable file format.  Since its first publication

-in 1989, PKWARE has remained committed to ensuring the

-interoperability of the .ZIP file format through this

-specification.  We trust that all .ZIP compatible vendors

-and application developers that have adopted this format

-will share and support this commitment.

-

-

-II. Disclaimer

---------------

-

-Although PKWARE will attempt to supply current and accurate

-information relating to its file formats, algorithms, and the

-subject programs, the possibility of error or omission can not

-be eliminated. PKWARE therefore expressly disclaims any warranty

-that the information contained in the associated materials relating

-to the subject programs and/or the format of the files created or

-accessed by the subject programs and/or the algorithms used by

-the subject programs, or any other matter, is current, correct or

-accurate as delivered.  Any risk of damage due to any possible

-inaccurate information is assumed by the user of the information.

-Furthermore, the information relating to the subject programs

-and/or the file formats created or accessed by the subject

-programs and/or the algorithms used by the subject programs is

-subject to change without notice.

-

-If the version of this file is marked as a NOTIFICATION OF CHANGE,

-the content defines an Early Feature Specification (EFS) change

-to the .ZIP file format that may be subject to modification prior

-to publication of the Final Feature Specification (FFS).  This

-document may also contain information on Planned Feature

-Specifications (PFS) defining recognized future extensions.

-

-

-III. Change Log

----------------

-

-Version       Change Description                      Date

--------       ------------------                     ----------

-5.2           -Single Password Symmetric Encryption  06/02/2003

-               storage

-

-6.1.0         -Smart Card compatibility              01/20/2004

-              -Documentation on certificate storage

-

-6.2.0         -Introduction of Central Directory     04/26/2004

-               Encryption for encrypting metadata

-              -Added OS/X to Version Made By values

-

-

-IV. General Format of a .ZIP file

----------------------------------

-

-  Files stored in arbitrary order.  Large .ZIP files can span multiple

-  diskette media or be split into user-defined segment sizes.  [The

-  minimum user-defined segment size for a split .ZIP file is 64K.

-  (removed by PKWare 2003-06-01)]

-

-  Overall .ZIP file format:

-

-    [local file header 1]

-    [file data 1]

-    [data descriptor 1]

-    .

-    .

-    .

-    [local file header n]

-    [file data n]

-    [data descriptor n]

-    [archive decryption header] (EFS)

-    [archive extra data record] (EFS)

-    [central directory]

-    [zip64 end of central directory record]

-    [zip64 end of central directory locator]

-    [end of central directory record]

-

-

-  A.  Local file header:

-

-        local file header signature     4 bytes  (0x04034b50)

-        version needed to extract       2 bytes

-        general purpose bit flag        2 bytes

-        compression method              2 bytes

-        last mod file time              2 bytes

-        last mod file date              2 bytes

-        crc-32                          4 bytes

-        compressed size                 4 bytes

-        uncompressed size               4 bytes

-        file name length                2 bytes

-        extra field length              2 bytes

-

-        file name (variable size)

-        extra field (variable size)

-

-

-  B.  File data

-

-      Immediately following the local header for a file

-      is the compressed or stored data for the file.

-      The series of [local file header][file data][data

-      descriptor] repeats for each file in the .ZIP archive.

-

-

-  C.  Data descriptor:

-

-      [Info-ZIP discrepancy:

-       The Info-ZIP zip program starts the data descriptor with a 4-byte

-       PK-style signature.  Despite the specification, none of the PKWARE

-       programs supports the data descriptor.  PKZIP 4.0 -fix function

-       (and PKZIPFIX 2.04) ignores the data descriptor info even when bit 3

-       of the general purpose bit flag is set.

-        data descriptor signature       4 bytes  (0x08074b50)

-      ]

-        crc-32                          4 bytes

-        compressed size                 4 bytes

-        uncompressed size               4 bytes

-

-      This descriptor exists only if bit 3 of the general

-      purpose bit flag is set (see below).  It is byte aligned

-      and immediately follows the last byte of compressed data.

-      This descriptor is used only when it was not possible to

-      seek in the output .ZIP file, e.g., when the output .ZIP file

-      was standard output or a non seekable device.  For Zip64 format

-      archives, the compressed and uncompressed sizes are 8 bytes each.

-

-

-  D.  Archive decryption header:  (EFS)

-

-      The Archive Decryption Header is introduced in version 6.2

-      of the ZIP format specification.  This record exists in support

-      of the Central Directory Encryption Feature implemented as part of

-      the Strong Encryption Specification as described in this document.

-      When the Central Directory Structure is encrypted, this decryption

-      header will precede the encrypted data segment.  The encrypted

-      data segment will consist of the Archive extra data record (if

-      present) and the encrypted Central Directory Structure data.

-      The format of this data record is identical to the Decryption

-      header record preceding compressed file data.  If the central

-      directory structure is encrypted, the location of the start of

-      this data record is determined using the Start of Central Directory

-      field in the Zip64 End of Central Directory record.  Refer to the

-      section on the Strong Encryption Specification for information

-      on the fields used in the Archive Decryption Header record.

-

-

-  E.  Archive extra data record: (EFS)

-

-        archive extra data signature    4 bytes  (0x08064b50)

-        extra field length              4 bytes

-        extra field data                (variable size)

-

-      The Archive Extra Data Record is introduced in version 6.2

-      of the ZIP format specification.  This record exists in support

-      of the Central Directory Encryption Feature implemented as part of

-      the Strong Encryption Specification as described in this document.

-      When present, this record immediately precedes the central

-      directory data structure.  The size of this data record will be

-      included in the Size of the Central Directory field in the

-      End of Central Directory record.  If the central directory structure

-      is compressed, but not encrypted, the location of the start of

-      this data record is determined using the Start of Central Directory

-      field in the Zip64 End of Central Directory record.

-

-

-  F.  Central directory structure:

-

-      [file header 1]

-      .

-      .

-      .

-      [file header n]

-      [digital signature]

-

-      File header:

-

-        central file header signature   4 bytes  (0x02014b50)

-        version made by                 2 bytes

-        version needed to extract       2 bytes

-        general purpose bit flag        2 bytes

-        compression method              2 bytes

-        last mod file time              2 bytes

-        last mod file date              2 bytes

-        crc-32                          4 bytes

-        compressed size                 4 bytes

-        uncompressed size               4 bytes

-        file name length                2 bytes

-        extra field length              2 bytes

-        file comment length             2 bytes

-        disk number start               2 bytes

-        internal file attributes        2 bytes

-        external file attributes        4 bytes

-        relative offset of local header 4 bytes

-

-        file name (variable size)

-        extra field (variable size)

-        file comment (variable size)

-

-      Digital signature:

-

-        header signature                4 bytes  (0x05054b50)

-        size of data                    2 bytes

-        signature data (variable size)

-

-      With the introduction of the Central Directory Encryption

-      feature in version 6.2 of this specification, the Central

-      Directory Structure may be stored both compressed and encrypted.

-      Although not required, it is assumed when encrypting the

-      Central Directory Structure, that it will be compressed

-      for greater storage efficiency.  Information on the

-      Central Directory Encryption feature can be found in the section

-      describing the Strong Encryption Specification. The Digital

-      Signature record will be neither compressed nor encrypted.

-

-

-  G.  Zip64 end of central directory record

-

-        zip64 end of central dir

-        signature                       4 bytes  (0x06064b50)

-        size of zip64 end of central

-        directory record                8 bytes

-        version made by                 2 bytes

-        version needed to extract       2 bytes

-        number of this disk             4 bytes

-        number of the disk with the

-        start of the central directory  4 bytes

-        total number of entries in the

-        central directory on this disk  8 bytes

-        total number of entries in the

-        central directory               8 bytes

-        size of the central directory   8 bytes

-        offset of start of central

-        directory with respect to

-        the starting disk number        8 bytes

-        zip64 extensible data sector    (variable size)

-

-        The above record structure defines Version 1 of the

-        Zip64 end of central directory record. Version 1 was

-        implemented in versions of this specification preceding

-        6.2 in support of the ZIP64(tm) large file feature. The

-        introduction of the Central Directory Encryption feature

-        implemented in version 6.2 as part of the Strong Encryption

-        Specification defines Version 2 of this record structure.

-        Refer to the section describing the Strong Encryption

-        Specification for details on the version 2 format for

-        this record.

-

-

-  H.  Zip64 end of central directory locator

-

-        zip64 end of central dir locator

-        signature                       4 bytes  (0x07064b50)

-        number of the disk with the

-        start of the zip64 end of

-        central directory               4 bytes

-        relative offset of the zip64

-        end of central directory record 8 bytes

-        total number of disks           4 bytes

-

-

-  I.  End of central directory record:

-

-        end of central dir signature    4 bytes  (0x06054b50)

-        number of this disk             2 bytes

-        number of the disk with the

-        start of the central directory  2 bytes

-        total number of entries in the

-        central directory on this disk  2 bytes

-        total number of entries in

-        the central directory           2 bytes

-        size of the central directory   4 bytes

-        offset of start of central

-        directory with respect to

-        the starting disk number        4 bytes

-        .ZIP file comment length        2 bytes

-        .ZIP file comment       (variable size)

-

-

-  J.  Explanation of fields:

-

-      version made by (2 bytes)

-

-          [PKWARE describes "OS made by" now (since 1998) as follows:

-          The upper byte indicates the compatibility of the file

-          attribute information.  If the external file attributes

-          are compatible with MS-DOS and can be read by PKZIP for

-          DOS version 2.04g then this value will be zero.  If these

-          attributes are not compatible, then this value will

-          identify the host system on which the attributes are

-          compatible.]

-          The upper byte indicates the host system (OS) for the

-          file.  Software can use this information to determine

-          the line record format for text files etc.  The current

-          mappings are:

-

-          0 - FAT file system (DOS, OS/2, NT)      + PKWARE 2.50+ VFAT, NTFS

-          1 - Amiga

-          2 - OpenVMS

-          3 - Unix

-          4 - VM/CMS

-          5 - Atari ST

-          6 - HPFS file system (OS/2, NT 3.x)

-          7 - Macintosh

-          8 - Z-System

-          9 - CP/M

-          ---------------------------------------------------------------------

-               PKWARE assignment             | Info-ZIP assignment

-          -----------------------------------|---------------------------------

-          10 - Windows NTFS                  | TOPS-20

-               (since PKZIPW 2.50, but       | (assigned Oct-1992,

-                not used by any PKWARE prog) |  no longer used)

-          11 - MVS                           | NTFS file system (WinNT)

-                                             | (actively used by Info-ZIP's

-                                             |  Zip for NT since Sep-1993)

-          12 - VSE                           | SMS/QDOS

-          ---------------------------------------------------------------------

-          13 - Acorn RISC OS

-          14 - VFAT file system (Win95, NT)     [Info-ZIP reservation, unused]

-          15 - MVS [PKWARE describes this assignment as "alternate MVS"]

-          16 - BeOS (BeBox or PowerMac)

-          17 - Tandem

-          18 - OS/400 (IBM)                  | THEOS

-          19 - OS/X (Darwin)

-          20 thru 29 - unused

-          30 - AtheOS/Syllable

-          31 thru 255 - unused

-

-          The lower byte indicates the ZIP specification version

-          (the version of this document) supported by the software

-          used to encode the file.  The value/10 indicates the major

-          version number, and the value mod 10 is the minor version

-          number.

-

-      version needed to extract (2 bytes)

-

-          The minimum supported ZIP specification version needed to

-          extract the file, mapped as above.  This value is based on

-          the specific format features a ZIP program must support to

-          be able to extract the file.  If multiple features are

-          applied to a file, the minimum version should be set to the

-          feature having the highest value. New features or feature

-          changes affecting the published format specification will be

-          implemented using higher version numbers than the last

-          published value to avoid conflict.

-

-          Current minimum feature versions are as defined below:

-

-          1.0 - Default value

-          1.1 - File is a volume label

-          2.0 - File is a folder (directory)

-          2.0 - File is compressed using Deflate compression

-          2.0 - File is encrypted using traditional PKWARE encryption

-          2.1 - File is compressed using Deflate64(tm)

-          2.5 - File is compressed using PKWARE DCL Implode

-          2.7 - File is a patch data set

-          4.5 - File uses ZIP64 format extensions

-          4.6 - File is compressed using BZIP2 compression*

-          5.0 - File is encrypted using DES

-          5.0 - File is encrypted using 3DES

-          5.0 - File is encrypted using original RC2 encryption

-          5.0 - File is encrypted using RC4 encryption

-          5.1 - File is encrypted using AES encryption

-          5.1 - File is encrypted using corrected RC2 encryption**

-          5.2 - File is encrypted using corrected RC2-64 encryption**

-          6.1 - File is encrypted using non-OAEP key wrapping***

-          6.2 - Central directory encryption

-

-

-          * Early 7.x (pre-7.2) versions of PKZIP incorrectly set the

-          version needed to extract for BZIP2 compression to be 50

-          when it should have been 46.

-

-          ** Refer to the section on Strong Encryption Specification

-          for additional information regarding RC2 corrections.

-

-          *** Certificate encryption using non-OAEP key wrapping is the

-          intended mode of operation for all versions beginning with 6.1.

-          Support for OAEP key wrapping should only be used for

-          backward compatibility when sending ZIP files to be opened by

-          versions of PKZIP older than 6.1 (5.0 or 6.0).

-

-          When using ZIP64 extensions, the corresponding value in the

-          Zip64 end of central directory record should also be set.

-          This field currently supports only the value 45 to indicate

-          ZIP64 extensions are present.

-

-      general purpose bit flag: (2 bytes)

-

-          Bit 0: If set, indicates that the file is encrypted.

-

-          (For Method 6 - Imploding)

-          Bit 1: If the compression method used was type 6,

-                 Imploding, then this bit, if set, indicates

-                 an 8K sliding dictionary was used.  If clear,

-                 then a 4K sliding dictionary was used.

-          Bit 2: If the compression method used was type 6,

-                 Imploding, then this bit, if set, indicates

-                 3 Shannon-Fano trees were used to encode the

-                 sliding dictionary output.  If clear, then 2

-                 Shannon-Fano trees were used.

-

-          (For Methods 8 and 9 - Deflating)

-          Bit 2  Bit 1

-            0      0    Normal (-en) compression option was used.

-            0      1    Maximum (-exx/-ex) compression option was used.

-            1      0    Fast (-ef) compression option was used.

-            1      1    Super Fast (-es) compression option was used.

-

-          Note:  Bits 1 and 2 are undefined if the compression

-                 method is any other.

-

-          Bit 3: If this bit is set, the fields crc-32, compressed

-                 size and uncompressed size are set to zero in the

-                 local header.  The correct values are put in the

-                 data descriptor immediately following the compressed

-                 data.  (Note: PKZIP version 2.04g for DOS only

-                 recognizes this bit for method 8 compression, newer

-                 versions of PKZIP recognize this bit for any

-                 compression method.)

-                [Info-ZIP note: This bit was introduced by PKZIP 2.04 for

-                 DOS. In general, this feature can only be reliably used

-                 together with compression methods that allow intrinsic

-                 detection of the "end-of-compressed-data" condition. From

-                 the set of compression methods described in this Zip archive

-                 specification, only "deflate" and "bzip2" fulfill this

-                 requirement.

-                 Especially, the method STORED does not work!

-                 The Info-ZIP tools recognize this bit regardless of the

-                 compression method; but, they rely on correctly set

-                 "compressed size" information in the central directory entry.]

-

-          Bit 4: Reserved for use with method 8, for enhanced

-                 deflating.

-

-          Bit 5: If this bit is set, this indicates that the file is

-                 compressed patched data.  (Note: Requires PKZIP

-                 version 2.70 or greater)

-

-          Bit 6: Strong encryption.  If this bit is set, you should

-                 set the version needed to extract value to at least

-                 50 and you must also set bit 0.  If AES encryption

-                 is used, the version needed to extract value must

-                 be at least 51.

-

-          Bit 7: Currently unused.

-

-          Bit 8: Currently unused.

-

-          Bit 9: Currently unused.

-

-          Bit 10: Currently unused.

-

-          Bit 11: Currently unused.

-

-          Bit 12: Reserved by PKWARE for enhanced compression.

-

-          Bit 13: Used when encrypting the Central Directory to indicate

-                  selected data values in the Local Header are masked to

-                  hide their actual values.  See the section describing

-                  the Strong Encryption Specification for details.

-

-          Bit 14: Reserved by PKWARE.

-

-          Bit 15: Reserved by PKWARE.

-

-      compression method: (2 bytes)

-

-          (see accompanying documentation for algorithm

-          descriptions)

-

-          0 - The file is stored (no compression)

-          1 - The file is Shrunk

-          2 - The file is Reduced with compression factor 1

-          3 - The file is Reduced with compression factor 2

-          4 - The file is Reduced with compression factor 3

-          5 - The file is Reduced with compression factor 4

-          6 - The file is Imploded

-          7 - Reserved for Tokenizing compression algorithm

-          8 - The file is Deflated

-          9 - Enhanced Deflating using Deflate64(tm)

-         10 - PKWARE Data Compression Library Imploding

-         11 - Reserved by PKWARE

-         12 - File is compressed using BZIP2 algorithm

-

-      date and time fields: (2 bytes each)

-

-          The date and time are encoded in standard MS-DOS format.

-          If input came from standard input, the date and time are

-          those at which compression was started for this data.

-          If encrypting the central directory and general purpose bit

-          flag 13 is set indicating masking, the value stored in the

-          Local Header will be zero.

-

-      CRC-32: (4 bytes)

-

-          The CRC-32 algorithm was generously contributed by

-          David Schwaderer and can be found in his excellent

-          book "C Programmers Guide to NetBIOS" published by

-          Howard W. Sams & Co. Inc.  The 'magic number' for

-          the CRC is 0xdebb20e3.  The proper CRC pre and post

-          conditioning is used, meaning that the CRC register

-          is pre-conditioned with all ones (a starting value

-          of 0xffffffff) and the value is post-conditioned by

-          taking the one's complement of the CRC residual.

-          If bit 3 of the general purpose flag is set, this

-          field is set to zero in the local header and the correct

-          value is put in the data descriptor and in the central

-          directory.  If encrypting the central directory and general

-          purpose bit flag 13 is set indicating masking, the value

-          stored in the Local Header will be zero.

-

-      compressed size: (4 bytes)

-      uncompressed size: (4 bytes)

-

-          The size of the file compressed and uncompressed,

-          respectively.  If bit 3 of the general purpose bit flag

-          is set, these fields are set to zero in the local header

-          and the correct values are put in the data descriptor and

-          in the central directory.  If an archive is in zip64 format

-          and the value in this field is 0xFFFFFFFF, the size will be

-          in the corresponding 8 byte zip64 extended information

-          extra field.  If encrypting the central directory and general

-          purpose bit flag 13 is set indicating masking, the value stored

-          for the uncompressed size in the Local Header will be zero.

-

-      file name length: (2 bytes)

-      extra field length: (2 bytes)

-      file comment length: (2 bytes)

-

-          The length of the file name, extra field, and comment

-          fields respectively.  The combined length of any

-          directory record and these three fields should not

-          generally exceed 65,535 bytes.  If input came from standard

-          input, the file name length is set to zero.

-

-         [Info-ZIP note:

-          This feature is not yet supported by any PKWARE version of ZIP

-          (at least not in PKZIP for DOS and PKZIP for Windows/WinNT).

-          The Info-ZIP programs handle standard input differently:

-          If input came from standard input, the filename is set to "-"

-          (length one).]

-

-

-      disk number start: (2 bytes)

-

-          The number of the disk on which this file begins.  If an

-          archive is in zip64 format and the value in this field is

-          0xFFFF, the size will be in the corresponding 4 byte zip64

-          extended information extra field.

-

-      internal file attributes: (2 bytes)

-

-          Bits 1 and 2 are reserved for use by PKWARE.

-

-          The lowest bit of this field indicates, if set, that

-          the file is apparently an ASCII or text file.  If not

-          set, that the file apparently contains binary data.

-          The remaining bits are unused in version 1.0.

-

-          The 0x0002 bit of this field indicates, if set, that a

-          4 byte variable record length control field precedes each

-          logical record indicating the length of the record. This

-          flag is independent of text control characters, and if used

-          in conjunction with text data, includes any control

-          characters in the total length of the record. This value is

-          provided for mainframe data transfer support.

-

-      external file attributes: (4 bytes)

-

-          The mapping of the external attributes is

-          host-system dependent (see 'version made by').  For

-          MS-DOS, the low order byte is the MS-DOS directory

-          attribute byte.  If input came from standard input, this

-          field is set to zero.

-

-      relative offset of local header: (4 bytes)

-

-          This is the offset from the start of the first disk on

-          which this file appears, to where the local header should

-          be found.  If an archive is in zip64 format and the value

-          in this field is 0xFFFFFFFF, the size will be in the

-          corresponding 8 byte zip64 extended information extra field.

-

-      file name: (Variable)

-

-          The name of the file, with optional relative path.

-          The path stored should not contain a drive or

-          device letter, or a leading slash.  All slashes

-          should be forward slashes '/' as opposed to

-          backwards slashes '\' for compatibility with Amiga

-          and Unix file systems etc.  If input came from standard

-          input, there is no file name field.  If encrypting

-          the central directory and general purpose bit flag 13 is set

-          indicating masking, the file name stored in the Local Header

-          will not be the actual file name.  A masking value consisting

-          of a unique hexadecimal value will be stored.  This value will

-          be sequentially incremented for each file in the archive.  See

-          the section on the Strong Encryption Specification for details

-          on retrieving the encrypted file name.

-         [Info-ZIP discrepancy:

-          If input came from standard input, the file name is set

-          to "-" (without the quotes).

-          As far as we know, the PKWARE specification for "input from

-          stdin" is not supported by PKZIP/PKUNZIP for DOS, OS/2, Windows

-          Windows NT.]

-

-      extra field: (Variable)

-

-          This is for expansion.  If additional information

-          needs to be stored for special needs or for specific

-          platforms, it should be stored here.  Earlier versions

-          of the software can then safely skip this file, and

-          find the next file or header.  This field will be 0

-          length in version 1.0.

-

-          In order to allow different programs and different types

-          of information to be stored in the 'extra' field in .ZIP

-          files, the following structure should be used for all

-          programs storing data in this field:

-

-          header1+data1 + header2+data2 . . .

-

-          Each header should consist of:

-

-            Header ID - 2 bytes

-            Data Size - 2 bytes

-

-          Note: all fields stored in Intel low-byte/high-byte order.

-

-          The Header ID field indicates the type of data that is in

-          the following data block.

-

-          Header ID's of 0 thru 31 are reserved for use by PKWARE.

-          The remaining ID's can be used by third party vendors for

-          proprietary usage.

-

-          The current Header ID mappings defined by PKWARE are:

-

-          0x0001        ZIP64 extended information extra field

-          0x0007        AV Info

-          0x0008        Reserved for future Unicode file name data (PFS)

-          0x0009        OS/2 extended attributes      (also Info-ZIP)

-          0x000a        NTFS (Win9x/WinNT FileTimes)

-          0x000c        OpenVMS                       (also Info-ZIP)

-          0x000d        Unix

-          0x000e        Reserved for file stream and fork descriptors

-          0x000f        Patch Descriptor

-          0x0014        PKCS#7 Store for X.509 Certificates

-          0x0015        X.509 Certificate ID and Signature for

-                        individual file

-          0x0016        X.509 Certificate ID for Central Directory

-          0x0017        Strong Encryption Header

-          0x0018        Record Management Controls

-          0x0019        PKCS#7 Encryption Recipient Certificate List

-          0x0065        IBM S/390 (Z390), AS/400 (I400) attributes

-                        - uncompressed

-          0x0066        Reserved for IBM S/390 (Z390), AS/400 (I400)

-                        attributes - compressed

-

-          The Header ID mappings defined by Info-ZIP and third parties are:

-

-          0x07c8        Info-ZIP Macintosh (old, J. Lee)

-          0x2605        ZipIt Macintosh (first version)

-          0x2705        ZipIt Macintosh v 1.3.5 and newer (w/o full filename)

-          0x2805        ZipIt Macintosh 1.3.5+

-          0x334d        Info-ZIP Macintosh (new, D. Haase's 'Mac3' field)

-          0x4154        Tandem NSK

-          0x4341        Acorn/SparkFS (David Pilling)

-          0x4453        Windows NT security descriptor (binary ACL)

-          0x4704        VM/CMS

-          0x470f        MVS

-          0x4854        Theos, old inofficial port

-          0x4b46        FWKCS MD5 (see below)

-          0x4c41        OS/2 access control list (text ACL)

-          0x4d49        Info-ZIP OpenVMS (obsolete)

-          0x4d63        Macintosh SmartZIP, by Macro Bambini

-          0x4f4c        Xceed original location extra field

-          0x5356        AOS/VS (binary ACL)

-          0x5455        extended timestamp

-          0x554e        Xceed unicode extra field

-          0x5855        Info-ZIP Unix (original; also OS/2, NT, etc.)

-          0x6542        BeOS (BeBox, PowerMac, etc.)

-          0x6854        Theos

-          0x7441        AtheOS (AtheOS/Syllable attributes)

-          0x756e        ASi Unix

-          0x7855        Info-ZIP Unix (new)

-          0xfb4a        SMS/QDOS

-

-          Detailed descriptions of Extra Fields defined by third

-          party mappings will be documented as information on

-          these data structures is made available to PKWARE.

-          PKWARE does not guarantee the accuracy of any published

-          third party data.

-

-          The Data Size field indicates the size of the following

-          data block. Programs can use this value to skip to the

-          next header block, passing over any data blocks that are

-          not of interest.

-

-          Note: As stated above, the size of the entire .ZIP file

-                header, including the file name, comment, and extra

-                field should not exceed 64K in size.

-

-          In case two different programs should appropriate the same

-          Header ID value, it is strongly recommended that each

-          program place a unique signature of at least two bytes in

-          size (and preferably 4 bytes or bigger) at the start of

-          each data area.  Every program should verify that its

-          unique signature is present, in addition to the Header ID

-          value being correct, before assuming that it is a block of

-          known type.

-

-          In the following descriptions, note that "Short" means two bytes,

-          "Long" means four bytes, and "Long-Long" means eight bytes,

-          regardless of their native sizes.  Unless specifically noted, all

-          integer fields should be interpreted as unsigned (non-negative)

-          numbers.

-

-

-         -ZIP64 Extended Information Extra Field (0x0001):

-          ===============================================

-

-          The following is the layout of the ZIP64 extended

-          information "extra" block. If one of the size or

-          offset fields in the Local or Central directory

-          record is too small to hold the required data,

-          a ZIP64 extended information record is created.

-          The order of the fields in the ZIP64 extended

-          information record is fixed, but the fields will

-          only appear if the corresponding Local or Central

-          directory record field is set to 0xFFFF or 0xFFFFFFFF.

-

-          Note: all fields stored in Intel low-byte/high-byte order.

-

-          Value      Size       Description

-          -----      ----       -----------

-  (ZIP64) 0x0001     2 bytes    Tag for this "extra" block type

-          Size       2 bytes    Size of this "extra" block

-          Original

-          Size       8 bytes    Original uncompressed file size

-          Compressed

-          Size       8 bytes    Size of compressed data

-          Relative Header

-          Offset     8 bytes    Offset of local header record

-          Disk Start

-          Number     4 bytes    Number of the disk on which

-                                this file starts

-

-          This entry in the Local header must include BOTH original

-          and compressed file sizes.

-

-

-         -OS/2 Extended Attributes Extra Field (0x0009):

-          =============================================

-

-          The following is the layout of the OS/2 extended attributes "extra"

-          block.  (Last Revision 19960922)

-

-          Note: all fields stored in Intel low-byte/high-byte order.

-

-          Local-header version:

-

-          Value         Size        Description

-          -----         ----        -----------

-  (OS/2)  0x0009        Short       tag for this extra block type

-          TSize         Short       total data size for this block

-          BSize         Long        uncompressed EA data size

-          CType         Short       compression type

-          EACRC         Long        CRC value for uncompressed EA data

-          (var.)        variable    compressed EA data

-

-          Central-header version:

-

-          Value         Size        Description

-          -----         ----        -----------

-  (OS/2)  0x0009        Short       tag for this extra block type

-          TSize         Short       total data size for this block (4)

-          BSize         Long        size of uncompressed local EA data

-

-          The value of CType is interpreted according to the "compression

-          method" section above; i.e., 0 for stored, 8 for deflated, etc.

-

-          The OS/2 extended attribute structure (FEA2LIST) is

-          compressed and then stored in its entirety within this

-          structure.  There will only ever be one "block" of data in

-          the variable-length field.

-

-

-         -OS/2 Access Control List Extra Field:

-          ====================================

-

-          The following is the layout of the OS/2 ACL extra block.

-          (Last Revision 19960922)

-

-          Local-header version:

-

-          Value         Size        Description

-          -----         ----        -----------

-  (ACL)   0x4c41        Short       tag for this extra block type ("AL")

-          TSize         Short       total data size for this block

-          BSize         Long        uncompressed ACL data size

-          CType         Short       compression type

-          EACRC         Long        CRC value for uncompressed ACL data

-          (var.)        variable    compressed ACL data

-

-          Central-header version:

-

-          Value         Size        Description

-          -----         ----        -----------

-  (ACL)   0x4c41        Short       tag for this extra block type ("AL")

-          TSize         Short       total data size for this block (4)

-          BSize         Long        size of uncompressed local ACL data

-

-          The value of CType is interpreted according to the "compression

-          method" section above; i.e., 0 for stored, 8 for deflated, etc.

-

-          The uncompressed ACL data consist of a text header of the form

-          "ACL1:%hX,%hd\n", where the first field is the OS/2 ACCINFO acc_attr

-          member and the second is acc_count, followed by acc_count strings

-          of the form "%s,%hx\n", where the first field is acl_ugname (user

-          group name) and the second acl_access.  This block type will be

-          extended for other operating systems as needed.

-

-

-         -Windows NT Security Descriptor Extra Field (0x4453):

-          ===================================================

-

-          The following is the layout of the NT Security Descriptor (another

-          type of ACL) extra block.  (Last Revision 19960922)

-

-          Local-header version:

-

-          Value         Size        Description

-          -----         ----        -----------

-  (SD)    0x4453        Short       tag for this extra block type ("SD")

-          TSize         Short       total data size for this block

-          BSize         Long        uncompressed SD data size

-          Version       Byte        version of uncompressed SD data format

-          CType         Short       compression type

-          EACRC         Long        CRC value for uncompressed SD data

-          (var.)        variable    compressed SD data

-

-          Central-header version:

-

-          Value         Size        Description

-          -----         ----        -----------

-  (SD)    0x4453        Short       tag for this extra block type ("SD")

-          TSize         Short       total data size for this block (4)

-          BSize         Long        size of uncompressed local SD data

-

-          The value of CType is interpreted according to the "compression

-          method" section above; i.e., 0 for stored, 8 for deflated, etc.

-          Version specifies how the compressed data are to be interpreted

-          and allows for future expansion of this extra field type.  Currently

-          only version 0 is defined.

-

-          For version 0, the compressed data are to be interpreted as a single

-          valid Windows NT SECURITY_DESCRIPTOR data structure, in self-relative

-          format.

-

-

-         -PKWARE Win95/WinNT Extra Field (0x000a):

-          =======================================

-

-          The following description covers PKWARE's "NTFS" attributes

-          "extra" block, introduced with the release of PKZIP 2.50 for

-          Windows. (Last Revision 20001118)

-

-          (Note: At this time the Mtime, Atime and Ctime values may

-          be used on any WIN32 system.)

-         [Info-ZIP note: In the current implementations, this field has

-          a fixed total data size of 32 bytes and is only stored as local

-          extra field.]

-

-          Value         Size        Description

-          -----         ----        -----------

-  (NTFS)  0x000a        Short       Tag for this "extra" block type

-          TSize         Short       Total Data Size for this block

-          Reserved      Long        for future use

-          Tag1          Short       NTFS attribute tag value #1

-          Size1         Short       Size of attribute #1, in bytes

-          (var.)        SubSize1    Attribute #1 data

-          .

-          .

-          .

-          TagN          Short       NTFS attribute tag value #N

-          SizeN         Short       Size of attribute #N, in bytes

-          (var.)        SubSizeN    Attribute #N data

-

-          For NTFS, values for Tag1 through TagN are as follows:

-          (currently only one set of attributes is defined for NTFS)

-

-          Tag        Size       Description

-          -----      ----       -----------

-          0x0001     2 bytes    Tag for attribute #1

-          Size1      2 bytes    Size of attribute #1, in bytes (24)

-          Mtime      8 bytes    64-bit NTFS file last modification time

-          Atime      8 bytes    64-bit NTFS file last access time

-          Ctime      8 bytes    64-bit NTFS file creation time

-

-          The total length for this block is 28 bytes, resulting in a

-          fixed size value of 32 for the TSize field of the NTFS block.

-

-          The NTFS filetimes are 64-bit unsigned integers, stored in Intel

-          (least significant byte first) byte order. They determine the

-          number of 1.0E-07 seconds (1/10th microseconds!) past WinNT "epoch",

-          which is "01-Jan-1601 00:00:00 UTC".

-

-

-         -PKWARE OpenVMS Extra Field (0x000c):

-          ===================================

-

-          The following is the layout of PKWARE's OpenVMS attributes

-          "extra" block.  (Last Revision 12/17/91)

-

-          Note: all fields stored in Intel low-byte/high-byte order.

-

-          Value         Size        Description

-          -----         ----        -----------

-  (VMS)   0x000c        Short       Tag for this "extra" block type

-          TSize         Short       Total Data Size for this block

-          CRC           Long        32-bit CRC for remainder of the block

-          Tag1          Short       OpenVMS attribute tag value #1

-          Size1         Short       Size of attribute #1, in bytes

-          (var.)        Size1       Attribute #1 data

-          .

-          .

-          .

-          TagN          Short       OpenVMS attribute tage value #N

-          SizeN         Short       Size of attribute #N, in bytes

-          (var.)        SizeN       Attribute #N data

-

-          Rules:

-

-          1. There will be one or more of attributes present, which

-             will each be preceded by the above TagX & SizeX values.

-             These values are identical to the ATR$C_XXXX and

-             ATR$S_XXXX constants which are defined in ATR.H under

-             OpenVMS C.  Neither of these values will ever be zero.

-

-          2. No word alignment or padding is performed.

-

-          3. A well-behaved PKZIP/OpenVMS program should never produce

-             more than one sub-block with the same TagX value.  Also,

-             there will never be more than one "extra" block of type

-             0x000c in a particular directory record.

-

-

-         -Info-ZIP VMS Extra Field:

-          ========================

-

-          The following is the layout of Info-ZIP's VMS attributes extra

-          block for VAX or Alpha AXP.  The local-header and central-header

-          versions are identical.  (Last Revision 19960922)

-

-          Value         Size        Description

-          -----         ----        -----------

-  (VMS2)  0x4d49        Short       tag for this extra block type ("JM")

-          TSize         Short       total data size for this block

-          ID            Long        block ID

-          Flags         Short       info bytes

-          BSize         Short       uncompressed block size

-          Reserved      Long        (reserved)

-          (var.)        variable    compressed VMS file-attributes block

-

-          The block ID is one of the following unterminated strings:

-

-                "VFAB"          struct FAB

-                "VALL"          struct XABALL

-                "VFHC"          struct XABFHC

-                "VDAT"          struct XABDAT

-                "VRDT"          struct XABRDT

-                "VPRO"          struct XABPRO

-                "VKEY"          struct XABKEY

-                "VMSV"          version (e.g., "V6.1"; truncated at hyphen)

-                "VNAM"          reserved

-

-          The lower three bits of Flags indicate the compression method.  The

-          currently defined methods are:

-

-                0       stored (not compressed)

-                1       simple "RLE"

-                2       deflated

-

-          The "RLE" method simply replaces zero-valued bytes with zero-valued

-          bits and non-zero-valued bytes with a "1" bit followed by the byte

-          value.

-

-          The variable-length compressed data contains only the data corre-

-          sponding to the indicated structure or string.  Typically multiple

-          VMS2 extra fields are present (each with a unique block type).

-

-

-         -Info-ZIP Macintosh Extra Field:

-          ==============================

-

-          The following is the layout of the (old) Info-ZIP resource-fork extra

-          block for Macintosh.  The local-header and central-header versions

-          are identical.  (Last Revision 19960922)

-

-          Value         Size        Description

-          -----         ----        -----------

-  (Mac)   0x07c8        Short       tag for this extra block type

-          TSize         Short       total data size for this block

-          "JLEE"        beLong      extra-field signature

-          FInfo         16 bytes    Macintosh FInfo structure

-          CrDat         beLong      HParamBlockRec fileParam.ioFlCrDat

-          MdDat         beLong      HParamBlockRec fileParam.ioFlMdDat

-          Flags         beLong      info bits

-          DirID         beLong      HParamBlockRec fileParam.ioDirID

-          VolName       28 bytes    volume name (optional)

-

-          All fields but the first two are in native Macintosh format

-          (big-endian Motorola order, not little-endian Intel).  The least

-          significant bit of Flags is 1 if the file is a data fork, 0 other-

-          wise.  In addition, if this extra field is present, the filename

-          has an extra 'd' or 'r' appended to indicate data fork or resource

-          fork.  The 28-byte VolName field may be omitted.

-

-

-         -ZipIt Macintosh Extra Field (long):

-          ==================================

-

-          The following is the layout of the ZipIt extra block for Macintosh.

-          The local-header and central-header versions are identical.

-          (Last Revision 19970130)

-

-          Value         Size        Description

-          -----         ----        -----------

-  (Mac2)  0x2605        Short       tag for this extra block type

-          TSize         Short       total data size for this block

-          "ZPIT"        beLong      extra-field signature

-          FnLen         Byte        length of FileName

-          FileName      variable    full Macintosh filename

-          FileType      Byte[4]     four-byte Mac file type string

-          Creator       Byte[4]     four-byte Mac creator string

-

-

-         -ZipIt Macintosh Extra Field (short, for files):

-          ==============================================

-

-          The following is the layout of a shortened variant of the

-          ZipIt extra block for Macintosh (without "full name" entry).

-          This variant is used by ZipIt 1.3.5 and newer for entries of

-          files (not directories) that do not have a MacBinary encoded

-          file.  The local-header and central-header versions are identical.

-          (Last Revision 20030602)

-

-          Value         Size        Description

-          -----         ----        -----------

-  (Mac2b) 0x2705        Short       tag for this extra block type

-          TSize         Short       total data size for this block (min. 12)

-          "ZPIT"        beLong      extra-field signature

-          FileType      Byte[4]     four-byte Mac file type string

-          Creator       Byte[4]     four-byte Mac creator string

-          fdFlags       beShort     attributes from FInfo.frFlags,

-                                    may be omitted

-          0x0000        beShort     reserved, may be omitted

-

-

-         -ZipIt Macintosh Extra Field (short, for directories):

-          ====================================================

-

-          The following is the layout of a shortened variant of the

-          ZipIt extra block for Macintosh used only for directory

-          entries. This variant is used by ZipIt 1.3.5 and newer to

-          save some optional Mac-specific information about directories.

-          The local-header and central-header versions are identical.

-

-          Value         Size        Description

-          -----         ----        -----------

-  (Mac2c) 0x2805        Short       tag for this extra block type

-          TSize         Short       total data size for this block (12)

-          "ZPIT"        beLong      extra-field signature

-          frFlags       beShort     attributes from DInfo.frFlags, may

-                                    be omitted

-          View          beShort     ZipIt view flag, may be omitted

-

-

-          The View field specifies ZipIt-internal settings as follows:

-

-          Bits of the Flags:

-              bit 0           if set, the folder is shown expanded (open)

-                              when the archive contents are viewed in ZipIt.

-              bits 1-15       reserved, zero;

-

-

-         -Info-ZIP Macintosh Extra Field (new):

-          ====================================

-

-          The following is the layout of the (new) Info-ZIP extra

-          block for Macintosh, designed by Dirk Haase.

-          All values are in little-endian.

-          (Last Revision 19981005)

-

-          Local-header version:

-

-          Value         Size        Description

-          -----         ----        -----------

-  (Mac3)  0x334d        Short       tag for this extra block type ("M3")

-          TSize         Short       total data size for this block

-          BSize         Long        uncompressed finder attribute data size

-          Flags         Short       info bits

-          fdType        Byte[4]     Type of the File (4-byte string)

-          fdCreator     Byte[4]     Creator of the File (4-byte string)

-          (CType)       Short       compression type

-          (CRC)         Long        CRC value for uncompressed MacOS data

-          Attribs       variable    finder attribute data (see below)

-

-

-          Central-header version:

-

-          Value         Size        Description

-          -----         ----        -----------

-  (Mac3)  0x334d        Short       tag for this extra block type ("M3")

-          TSize         Short       total data size for this block

-          BSize         Long        uncompressed finder attribute data size

-          Flags         Short       info bits

-          fdType        Byte[4]     Type of the File (4-byte string)

-          fdCreator     Byte[4]     Creator of the File (4-byte string)

-

-          The third bit of Flags in both headers indicates whether

-          the LOCAL extra field is uncompressed (and therefore whether CType

-          and CRC are omitted):

-

-          Bits of the Flags:

-              bit 0           if set, file is a data fork; otherwise unset

-              bit 1           if set, filename will be not changed

-              bit 2           if set, Attribs is uncompressed (no CType, CRC)

-              bit 3           if set, date and times are in 64 bit

-                              if zero date and times are in 32 bit.

-              bit 4           if set, timezone offsets fields for the native

-                              Mac times are omitted (UTC support deactivated)

-              bits 5-15       reserved;

-

-

-          Attributes:

-

-          Attribs is a Mac-specific block of data in little-endian format with

-          the following structure (if compressed, uncompress it first):

-

-          Value         Size        Description

-          -----         ----        -----------

-          fdFlags       Short       Finder Flags

-          fdLocation.v  Short       Finder Icon Location

-          fdLocation.h  Short       Finder Icon Location

-          fdFldr        Short       Folder containing file

-

-          FXInfo        16 bytes    Macintosh FXInfo structure

-            FXInfo-Structure:

-                fdIconID        Short

-                fdUnused[3]     Short       unused but reserved 6 bytes

-                fdScript        Byte        Script flag and number

-                fdXFlags        Byte        More flag bits

-                fdComment       Short       Comment ID

-                fdPutAway       Long        Home Dir ID

-

-          FVersNum      Byte        file version number

-                                    may be not used by MacOS

-          ACUser        Byte        directory access rights

-

-          FlCrDat       ULong       date and time of creation

-          FlMdDat       ULong       date and time of last modification

-          FlBkDat       ULong       date and time of last backup

-            These time numbers are original Mac FileTime values (local time!).

-            Currently, date-time width is 32-bit, but future version may

-            support be 64-bit times (see flags)

-

-          CrGMTOffs     Long(signed!)   difference "local Creat. time - UTC"

-          MdGMTOffs     Long(signed!)   difference "local Modif. time - UTC"

-          BkGMTOffs     Long(signed!)   difference "local Backup time - UTC"

-            These "local time - UTC" differences (stored in seconds) may be

-            used to support timestamp adjustment after inter-timezone transfer.

-            These fields are optional; bit 4 of the flags word controls their

-            presence.

-

-          Charset       Short       TextEncodingBase (Charset)

-                                    valid for the following two fields

-

-          FullPath      variable    Path of the current file.

-                                    Zero terminated string (C-String)

-                                    Currently coded in the native Charset.

-

-          Comment       variable    Finder Comment of the current file.

-                                    Zero terminated string (C-String)

-                                    Currently coded in the native Charset.

-

-

-         -SmartZIP Macintosh Extra Field:

-          ====================================

-

-          The following is the layout of the SmartZIP extra

-          block for Macintosh, designed by Marco Bambini.

-

-          Local-header version:

-

-          Value         Size        Description

-          -----         ----        -----------

-          0x4d63        Short       tag for this extra block type ("cM")

-          TSize         Short       total data size for this block (64)

-          "dZip"        beLong      extra-field signature

-          fdType        Byte[4]     Type of the File (4-byte string)

-          fdCreator     Byte[4]     Creator of the File (4-byte string)

-          fdFlags       beShort     Finder Flags

-          fdLocation.v  beShort     Finder Icon Location

-          fdLocation.h  beShort     Finder Icon Location

-          fdFldr        beShort     Folder containing file

-          CrDat         beLong      HParamBlockRec fileParam.ioFlCrDat

-          MdDat         beLong      HParamBlockRec fileParam.ioFlMdDat

-          frScroll.v    Byte        vertical pos. of folder's scroll bar

-          fdScript      Byte        Script flag and number

-          frScroll.h    Byte        horizontal pos. of folder's scroll bar

-          fdXFlags      Byte        More flag bits

-          FileName      Byte[32]    full Macintosh filename (pascal string)

-

-          All fields but the first two are in native Macintosh format

-          (big-endian Motorola order, not little-endian Intel).

-          The extra field size is fixed to 64 bytes.

-          The local-header and central-header versions are identical.

-

-

-         -Acorn SparkFS Extra Field:

-          =========================

-

-          The following is the layout of David Pilling's SparkFS extra block

-          for Acorn RISC OS.  The local-header and central-header versions are

-          identical.  (Last Revision 19960922)

-

-          Value         Size        Description

-          -----         ----        -----------

-  (Acorn) 0x4341        Short       tag for this extra block type ("AC")

-          TSize         Short       total data size for this block (20)

-          "ARC0"        Long        extra-field signature

-          LoadAddr      Long        load address or file type

-          ExecAddr      Long        exec address

-          Attr          Long        file permissions

-          Zero          Long        reserved; always zero

-

-          The following bits of Attr are associated with the given file

-          permissions:

-

-                bit 0           user-writable ('W')

-                bit 1           user-readable ('R')

-                bit 2           reserved

-                bit 3           locked ('L')

-                bit 4           publicly writable ('w')

-                bit 5           publicly readable ('r')

-                bit 6           reserved

-                bit 7           reserved

-

-

-         -VM/CMS Extra Field:

-          ==================

-

-          The following is the layout of the file-attributes extra block for

-          VM/CMS.  The local-header and central-header versions are

-          identical.  (Last Revision 19960922)

-

-          Value         Size        Description

-          -----         ----        -----------

- (VM/CMS) 0x4704        Short       tag for this extra block type

-          TSize         Short       total data size for this block

-          flData        variable    file attributes data

-

-          flData is an uncompressed fldata_t struct.

-

-

-         -MVS Extra Field:

-          ===============

-

-          The following is the layout of the file-attributes extra block for

-          MVS.  The local-header and central-header versions are identical.

-          (Last Revision 19960922)

-

-          Value         Size        Description

-          -----         ----        -----------

-  (MVS)   0x470f        Short       tag for this extra block type

-          TSize         Short       total data size for this block

-          flData        variable    file attributes data

-

-          flData is an uncompressed fldata_t struct.

-

-

-         -PKWARE Unix Extra Field (0x000d):

-          ================================

-

-          The following is the layout of PKWARE's Unix "extra" block.

-          It was introduced with the release of PKZIP for Unix 2.50.

-          Note: all fields are stored in Intel low-byte/high-byte order.

-          (Last Revision 19980901)

-

-          This field has a minimum data size of 12 bytes and is only stored

-          as local extra field.

-

-          Value         Size        Description

-          -----         ----        -----------

- (Unix0)  0x000d        Short       Tag for this "extra" block type

-          TSize         Short       Total Data Size for this block

-          AcTime        Long        time of last access (UTC/GMT)

-          ModTime       Long        time of last modification (UTC/GMT)

-          UID           Short       Unix user ID

-          GID           Short       Unix group ID

-          (var)         variable    Variable length data field

-

-          The variable length data field will contain file type

-          specific data.  Currently the only values allowed are

-          the original "linked to" file names for hard or symbolic

-          links, and the major and minor device node numbers for

-          character and block device nodes.  Since device nodes

-          cannot be either symbolic or hard links, only one set of

-          variable length data is stored.  Link files will have the

-          name of the original file stored.  This name is NOT NULL

-          terminated.  Its size can be determined by checking TSize -

-          12.  Device entries will have eight bytes stored as two 4

-          byte entries (in little-endian format).  The first entry

-          will be the major device number, and the second the minor

-          device number.

-

-         [Info-ZIP note: The fixed part of this field has the same layout as

-          Info-ZIP's abandoned "Unix1 timestamps & owner ID info" extra field;

-          only the two tag bytes are different.]

-

-

-         -PATCH Descriptor Extra Field (0x000f):

-          =====================================

-

-          The following is the layout of the Patch Descriptor "extra"

-          block.

-

-          Note: all fields stored in Intel low-byte/high-byte order.

-

-          Value         Size        Description

-          -----         ----        -----------

-  (Patch) 0x000f        Short       Tag for this "extra" block type

-          TSize         Short       Size of the total "extra" block

-          Version       Short       Version of the descriptor

-          Flags         Long        Actions and reactions (see below)

-          OldSize       Long        Size of the file about to be patched

-          OldCRC        Long        32-bit CRC of the file about to be patched

-          NewSize       Long        Size of the resulting file

-          NewCRC        Long        32-bit CRC of the resulting file

-

-

-          Actions and reactions

-

-          Bits          Description

-          ----          ----------------

-          0             Use for auto detection

-          1             Treat as a self-patch

-          2-3           RESERVED

-          4-5           Action (see below)

-          6-7           RESERVED

-          8-9           Reaction (see below) to absent file

-          10-11         Reaction (see below) to newer file

-          12-13         Reaction (see below) to unknown file

-          14-15         RESERVED

-          16-31         RESERVED

-

-          Actions

-

-          Action       Value

-          ------       -----

-          none         0

-          add          1

-          delete       2

-          patch        3

-

-          Reactions

-

-          Reaction     Value

-          --------     -----

-          ask          0

-          skip         1

-          ignore       2

-          fail         3

-

-          Patch support is provided by PKPatchMaker(tm) technology and is

-          covered under U.S. Patents and Patents Pending.

-

-

-         -PKCS#7 Store for X.509 Certificates (0x0014):

-          ============================================

-

-          This field contains information about each of the certificates

-          files may be signed with.  When the Central Directory Encryption

-          feature is enabled for a ZIP file, this record will appear in

-          the Archive Extra Data Record, otherwise it will appear in the

-          first central directory record and will be ignored in any

-          other record.

-

-          Note: all fields stored in Intel low-byte/high-byte order.

-

-          Value     Size     Description

-          -----     ----     -----------

-  (Store) 0x0014    2 bytes  Tag for this "extra" block type

-          TSize     2 bytes  Size of the store data

-          SData     TSize    Data about the store

-

-          SData

-          Value     Size        Description

-          -----     ----        -----------

-          Version   2 bytes     Version number, 0x0001 for now

-          StoreD    (variable)  Actual store data

-

-          The StoreD member is suitable for passing as the pbData

-          member of a CRYPT_DATA_BLOB to the CertOpenStore() function

-          in Microsoft's CryptoAPI.  The SSize member above will be

-          cbData + 6, where cbData is the cbData member of the same

-          CRYPT_DATA_BLOB.  The encoding type to pass to

-          CertOpenStore() should be

-          PKCS_7_ANS_ENCODING | X509_ASN_ENCODING.

-

-

-         -X.509 Certificate ID and Signature for individual file (0x0015):

-          ===============================================================

-

-          This field contains the information about which certificate in

-          the PKCS#7 store was used to sign a particular file.  It also

-          contains the signature data.  This field can appear multiple

-          times, but can only appear once per certificate.

-

-          Note: all fields stored in Intel low-byte/high-byte order.

-

-          Value         Size        Description

-          -----         ----        -----------

-  (CID)   0x0015        2 bytes     Tag for this "extra" block type

-          CSize         2 bytes     Size of Method

-          Method        (variable)

-

-          Method

-          Value         Size        Description

-          -----         ----        -----------

-          Version       2 bytes     Version number, for now 0x0001

-          AlgID         2 bytes     Algorithm ID used for signing

-          IDSize        2 bytes     Size of Certificate ID data

-          CertID        (variable)  Certificate ID data

-          SigSize       2 bytes     Size of Signature data

-          Sig           (variable)  Signature data

-

-          CertID

-          Value         Size        Description

-          -----         ----        -----------

-          Size1         4 bytes     Size of CertID, should be (IDSize - 4)

-          Size1         4 bytes     A bug in version one causes this value

-                                    to appear twice.

-          IssSize       4 bytes     Issuer data size

-          Issuer        (variable)  Issuer data

-          SerSize       4 bytes     Serial Number size

-          Serial        (variable)  Serial Number data

-

-          The Issuer and IssSize members are suitable for creating a

-          CRYPT_DATA_BLOB to be the Issuer member of a CERT_INFO

-          struct. The Serial and SerSize members would be the

-          SerialNumber member of the same CERT_INFO struct.  This

-          struct would be used to find the certificate in the store

-          the file was signed with.  Those structures are from the MS

-          CryptoAPI.

-

-          Sig and SigSize are the actual signature data and size

-          generated by signing the file with the MS CryptoAPI using a

-          hash created with the given AlgID.

-

-

-         -X.509 Certificate ID and Signature for central directory (0x0016):

-          =================================================================

-

-          This field contains the information about which certificate in

-          the PKCS#7 store was used to sign the central directory structure.

-          When the Central Directory Encryption feature is enabled for a

-          ZIP file, this record will appear in the Archive Extra Data Record,

-          otherwise it will appear in the first central directory record,

-          along with the store.  The data structure is the

-          same as the CID, except that SigSize will be 0, and there

-          will be no Sig member.

-

-          This field is also kept after the last central directory

-          record, as the signature data (ID 0x05054b50, it looks like

-          a central directory record of a different type).  This

-          second copy of the data is the Signature Data member of the

-          record, and will have a SigSize that is non-zero, and will

-          have Sig data.

-

-          Note: all fields stored in Intel low-byte/high-byte order.

-

-          Value     Size     Description

-          -----     ----     -----------

-  (CDID)  0x0016    2 bytes  Tag for this "extra" block type

-          TSize     2 bytes  Size of data that follows

-          TData     TSize    Data

-

-

-         -Strong Encryption Header (0x0017) (EFS):

-          ===============================

-

-          Value     Size     Description

-          -----     ----     -----------

-          0x0017    2 bytes  Tag for this "extra" block type

-          TSize     2 bytes  Size of data that follows

-          Format    2 bytes  Format definition for this record

-          AlgID     2 bytes  Encryption algorithm identifier

-          Bitlen    2 bytes  Bit length of encryption key

-          Flags     2 bytes  Processing flags

-          CertData  TSize-8  Certificate decryption extra field data

-                             (refer to the explanation for CertData

-                              in the section describing the

-                              Certificate Processing Method under

-                              the Strong Encryption Specification)

-

-

-         -Record Management Controls (0x0018):

-          ===================================

-

-          Value     Size     Description

-          -----     ----     -----------

-(Rec-CTL) 0x0018    2 bytes  Tag for this "extra" block type

-          CSize     2 bytes  Size of total extra block data

-          Tag1      2 bytes  Record control attribute 1

-          Size1     2 bytes  Size of attribute 1, in bytes

-          Data1     Size1    Attribute 1 data

-            .

-            .

-            .

-          TagN      2 bytes  Record control attribute N

-          SizeN     2 bytes  Size of attribute N, in bytes

-          DataN     SizeN    Attribute N data

-

-

-         -PKCS#7 Encryption Recipient Certificate List (0x0019): (EFS)

-          =====================================================

-

-          This field contains the information about each of the certificates

-          that files may be encrypted with. This field should only appear

-          in the archive extra data record. This field is not required and

-          serves only to aide archive modifications by preserving public

-          encryption data. Individual security requirements may dictate

-          that this data be omitted to deter information exposure.

-

-          Note: all fields stored in Intel low-byte/high-byte order.

-

-          Value     Size     Description

-          -----     ----     -----------

- (CStore) 0x0019    2 bytes  Tag for this "extra" block type

-          TSize     2 bytes  Size of the store data

-          TData     TSize    Data about the store

-

-          TData:

-

-          Value     Size     Description

-          -----     ----     -----------

-          Version   2 bytes  Format version number - must 0x0001 at this time

-          CStore    (var)    PKCS#7 data blob

-

-

-         -MVS Extra Field (PKWARE, 0x0065):

-          ================================

-

-          The following is the layout of the MVS "extra" block.

-          Note: Some fields are stored in Big Endian format.

-          All text is in EBCDIC format unless otherwise specified.

-

-          Value       Size          Description

-          -----       ----          -----------

-  (MVS)   0x0065      2 bytes       Tag for this "extra" block type

-          TSize       2 bytes       Size for the following data block

-          ID          4 bytes       EBCDIC "Z390" 0xE9F3F9F0 or

-                                    "T4MV" for TargetFour

-          (var)       TSize-4       Attribute data

-

-

-         -OS/400 Extra Field (0x0065):

-          ===========================

-

-          The following is the layout of the OS/400 "extra" block.

-          Note: Some fields are stored in Big Endian format.

-          All text is in EBCDIC format unless otherwise specified.

-

-          Value       Size          Description

-          -----       ----          -----------

-  (OS400) 0x0065      2 bytes       Tag for this "extra" block type

-          TSize       2 bytes       Size for the following data block

-          ID          4 bytes       EBCDIC "I400" 0xC9F4F0F0 or

-                                    "T4MV" for TargetFour

-          (var)       TSize-4       Attribute data

-

-

-         -Extended Timestamp Extra Field:

-          ==============================

-

-          The following is the layout of the extended-timestamp extra block.

-          (Last Revision 19970118)

-

-          Local-header version:

-

-          Value         Size        Description

-          -----         ----        -----------

-  (time)  0x5455        Short       tag for this extra block type ("UT")

-          TSize         Short       total data size for this block

-          Flags         Byte        info bits

-          (ModTime)     Long        time of last modification (UTC/GMT)

-          (AcTime)      Long        time of last access (UTC/GMT)

-          (CrTime)      Long        time of original creation (UTC/GMT)

-

-          Central-header version:

-

-          Value         Size        Description

-          -----         ----        -----------

-  (time)  0x5455        Short       tag for this extra block type ("UT")

-          TSize         Short       total data size for this block

-          Flags         Byte        info bits (refers to local header!)

-          (ModTime)     Long        time of last modification (UTC/GMT)

-

-          The central-header extra field contains the modification time only,

-          or no timestamp at all.  TSize is used to flag its presence or

-          absence.  But note:

-

-              If "Flags" indicates that Modtime is present in the local header

-              field, it MUST be present in the central header field, too!

-              This correspondence is required because the modification time

-              value may be used to support trans-timezone freshening and

-              updating operations with zip archives.

-

-          The time values are in standard Unix signed-long format, indicating

-          the number of seconds since 1 January 1970 00:00:00.  The times

-          are relative to Coordinated Universal Time (UTC), also sometimes

-          referred to as Greenwich Mean Time (GMT).  To convert to local time,

-          the software must know the local timezone offset from UTC/GMT.

-

-          The lower three bits of Flags in both headers indicate which time-

-          stamps are present in the LOCAL extra field:

-

-                bit 0           if set, modification time is present

-                bit 1           if set, access time is present

-                bit 2           if set, creation time is present

-                bits 3-7        reserved for additional timestamps; not set

-

-          Those times that are present will appear in the order indicated, but

-          any combination of times may be omitted.  (Creation time may be

-          present without access time, for example.)  TSize should equal

-          (1 + 4*(number of set bits in Flags)), as the block is currently

-          defined.  Other timestamps may be added in the future.

-

-

-         -Info-ZIP Unix Extra Field (type 1):

-          ==================================

-

-          The following is the layout of the old Info-ZIP extra block for

-          Unix.  It has been replaced by the extended-timestamp extra block

-          (0x5455) and the Unix type 2 extra block (0x7855).

-          (Last Revision 19970118)

-

-          Local-header version:

-

-          Value         Size        Description

-          -----         ----        -----------

-  (Unix1) 0x5855        Short       tag for this extra block type ("UX")

-          TSize         Short       total data size for this block

-          AcTime        Long        time of last access (UTC/GMT)

-          ModTime       Long        time of last modification (UTC/GMT)

-          UID           Short       Unix user ID (optional)

-          GID           Short       Unix group ID (optional)

-

-          Central-header version:

-

-          Value         Size        Description

-          -----         ----        -----------

-  (Unix1) 0x5855        Short       tag for this extra block type ("UX")

-          TSize         Short       total data size for this block

-          AcTime        Long        time of last access (GMT/UTC)

-          ModTime       Long        time of last modification (GMT/UTC)

-

-          The file access and modification times are in standard Unix signed-

-          long format, indicating the number of seconds since 1 January 1970

-          00:00:00.  The times are relative to Coordinated Universal Time

-          (UTC), also sometimes referred to as Greenwich Mean Time (GMT).  To

-          convert to local time, the software must know the local timezone

-          offset from UTC/GMT.  The modification time may be used by non-Unix

-          systems to support inter-timezone freshening and updating of zip

-          archives.

-

-          The local-header extra block may optionally contain UID and GID

-          info for the file.  The local-header TSize value is the only

-          indication of this.  Note that Unix UIDs and GIDs are usually

-          specific to a particular machine, and they generally require root

-          access to restore.

-

-          This extra field type is obsolete, but it has been in use since

-          mid-1994.  Therefore future archiving software should continue to

-          support it.  Some guidelines:

-

-              An archive member should either contain the old "Unix1"

-              extra field block or the new extra field types "time" and/or

-              "Unix2".

-

-              If both the old "Unix1" block type and one or both of the new

-              block types "time" and "Unix2" are found, the "Unix1" block

-              should be considered invalid and ignored.

-

-              Unarchiving software should recognize both old and new extra

-              field block types, but the info from new types overrides the

-              old "Unix1" field.

-

-              Archiving software should recognize "Unix1" extra fields for

-              timestamp comparison but never create it for updated, freshened

-              or new archive members.  When copying existing members to a new

-              archive, any "Unix1" extra field blocks should be converted to

-              the new "time" and/or "Unix2" types.

-

-

-         -Info-ZIP Unix Extra Field (type 2):

-          ==================================

-

-          The following is the layout of the new Info-ZIP extra block for

-          Unix.  (Last Revision 19960922)

-

-          Local-header version:

-

-          Value         Size        Description

-          -----         ----        -----------

-  (Unix2) 0x7855        Short       tag for this extra block type ("Ux")

-          TSize         Short       total data size for this block (4)

-          UID           Short       Unix user ID

-          GID           Short       Unix group ID

-

-          Central-header version:

-

-          Value         Size        Description

-          -----         ----        -----------

-  (Unix2) 0x7855        Short       tag for this extra block type ("Ux")

-          TSize         Short       total data size for this block (0)

-

-          The data size of the central-header version is zero; it is used

-          solely as a flag that UID/GID info is present in the local-header

-          extra field.  If additional fields are ever added to the local

-          version, the central version may be extended to indicate this.

-

-          Note that Unix UIDs and GIDs are usually specific to a particular

-          machine, and they generally require root access to restore.

-

-

-         -ASi Unix Extra Field:

-          ====================

-

-          The following is the layout of the ASi extra block for Unix.  The

-          local-header and central-header versions are identical.

-          (Last Revision 19960916)

-

-          Value         Size        Description

-          -----         ----        -----------

-  (Unix3) 0x756e        Short       tag for this extra block type ("nu")

-          TSize         Short       total data size for this block

-          CRC           Long        CRC-32 of the remaining data

-          Mode          Short       file permissions

-          SizDev        Long        symlink'd size OR major/minor dev num

-          UID           Short       user ID

-          GID           Short       group ID

-          (var.)        variable    symbolic link filename

-

-          Mode is the standard Unix st_mode field from struct stat, containing

-          user/group/other permissions, setuid/setgid and symlink info, etc.

-

-          If Mode indicates that this file is a symbolic link, SizDev is the

-          size of the file to which the link points.  Otherwise, if the file

-          is a device, SizDev contains the standard Unix st_rdev field from

-          struct stat (includes the major and minor numbers of the device).

-          SizDev is undefined in other cases.

-

-          If Mode indicates that the file is a symbolic link, the final field

-          will be the name of the file to which the link points.  The file-

-          name length can be inferred from TSize.

-

-          [Note that TSize may incorrectly refer to the data size not counting

-           the CRC; i.e., it may be four bytes too small.]

-

-

-         -BeOS Extra Field:

-          ================

-

-          The following is the layout of the file-attributes extra block for

-          BeOS.  (Last Revision 19970531)

-

-          Local-header version:

-

-          Value         Size        Description

-          -----         ----        -----------

-  (BeOS)  0x6542        Short       tag for this extra block type ("Be")

-          TSize         Short       total data size for this block

-          BSize         Long        uncompressed file attribute data size

-          Flags         Byte        info bits

-          (CType)       Short       compression type

-          (CRC)         Long        CRC value for uncompressed file attribs

-          Attribs       variable    file attribute data

-

-          Central-header version:

-

-          Value         Size        Description

-          -----         ----        -----------

-  (BeOS)  0x6542        Short       tag for this extra block type ("Be")

-          TSize         Short       total data size for this block (5)

-          BSize         Long        size of uncompr. local EF block data

-          Flags         Byte        info bits

-

-          The least significant bit of Flags in both headers indicates whether

-          the LOCAL extra field is uncompressed (and therefore whether CType

-          and CRC are omitted):

-

-                bit 0           if set, Attribs is uncompressed (no CType, CRC)

-                bits 1-7        reserved; if set, assume error or unknown data

-

-          Currently the only supported compression types are deflated (type 8)

-          and stored (type 0); the latter is not used by Info-ZIP's Zip but is

-          supported by UnZip.

-

-          Attribs is a BeOS-specific block of data in big-endian format with

-          the following structure (if compressed, uncompress it first):

-

-              Value     Size        Description

-              -----     ----        -----------

-              Name      variable    attribute name (null-terminated string)

-              Type      Long        attribute type (32-bit unsigned integer)

-              Size      Long Long   data size for this sub-block (64 bits)

-              Data      variable    attribute data

-

-          The attribute structure is repeated for every attribute.  The Data

-          field may contain anything--text, flags, bitmaps, etc.

-

-

-         -AtheOS Extra Field:

-          ==================

-

-          The following is the layout of the file-attributes extra block for

-          AtheOS.  This field is a very close spin-off from the BeOS e.f.

-          The only differences are:

-           - a new extra field signature

-           - numeric field in the attributes data are stored in little-endian

-             format ("i386" was initial hardware for AtheOS)

-          (Last Revision 20040908)

-

-          Local-header version:

-

-          Value         Size        Description

-          -----         ----        -----------

- (AtheOS) 0x7441        Short       tag for this extra block type ("At")

-          TSize         Short       total data size for this block

-          BSize         Long        uncompressed file attribute data size

-          Flags         Byte        info bits

-          (CType)       Short       compression type

-          (CRC)         Long        CRC value for uncompressed file attribs

-          Attribs       variable    file attribute data

-

-          Central-header version:

-

-          Value         Size        Description

-          -----         ----        -----------

- (AtheOS) 0x7441        Short       tag for this extra block type ("At")

-          TSize         Short       total data size for this block (5)

-          BSize         Long        size of uncompr. local EF block data

-          Flags         Byte        info bits

-

-          The least significant bit of Flags in both headers indicates whether

-          the LOCAL extra field is uncompressed (and therefore whether CType

-          and CRC are omitted):

-

-                bit 0           if set, Attribs is uncompressed (no CType, CRC)

-                bits 1-7        reserved; if set, assume error or unknown data

-

-          Currently the only supported compression types are deflated (type 8)

-          and stored (type 0); the latter is not used by Info-ZIP's Zip but is

-          supported by UnZip.

-

-          Attribs is a AtheOS-specific block of data in little-endian format

-          with the following structure (if compressed, uncompress it first):

-

-              Value     Size        Description

-              -----     ----        -----------

-              Name      variable    attribute name (null-terminated string)

-              Type      Long        attribute type (32-bit unsigned integer)

-              Size      Long Long   data size for this sub-block (64 bits)

-              Data      variable    attribute data

-

-          The attribute structure is repeated for every attribute.  The Data

-          field may contain anything--text, flags, bitmaps, etc.

-

-

-         -SMS/QDOS Extra Field:

-          ====================

-

-          The following is the layout of the file-attributes extra block for

-          SMS/QDOS.  The local-header and central-header versions are identical.

-          (Last Revision 19960929)

-

-          Value         Size        Description

-          -----         ----        -----------

-  (QDOS)  0xfb4a        Short       tag for this extra block type

-          TSize         Short       total data size for this block

-          LongID        Long        extra-field signature

-          (ExtraID)     Long        additional signature/flag bytes

-          QDirect       64 bytes    qdirect structure

-

-          LongID may be "QZHD" or "QDOS".  In the latter case, ExtraID will

-          be present.  Its first three bytes are "02\0"; the last byte is

-          currently undefined.

-

-          QDirect contains the file's uncompressed directory info (qdirect

-          struct).  Its elements are in native (big-endian) format:

-

-          d_length      beLong          file length

-          d_access      byte            file access type

-          d_type        byte            file type

-          d_datalen     beLong          data length

-          d_reserved    beLong          unused

-          d_szname      beShort         size of filename

-          d_name        36 bytes        filename

-          d_update      beLong          time of last update

-          d_refdate     beLong          file version number

-          d_backup      beLong          time of last backup (archive date)

-

-

-         -AOS/VS Extra Field:

-          ==================

-

-          The following is the layout of the extra block for Data General

-          AOS/VS.  The local-header and central-header versions are identical.

-          (Last Revision 19961125)

-

-          Value         Size        Description

-          -----         ----        -----------

-  (AOSVS) 0x5356        Short       tag for this extra block type ("VS")

-          TSize         Short       total data size for this block

-          "FCI\0"       Long        extra-field signature

-          Version       Byte        version of AOS/VS extra block (10 = 1.0)

-          Fstat         variable    fstat packet

-          AclBuf        variable    raw ACL data ($MXACL bytes)

-

-          Fstat contains the file's uncompressed fstat packet, which is one of

-          the following:

-

-                normal fstat packet             (P_FSTAT struct)

-                DIR/CPD fstat packet            (P_FSTAT_DIR struct)

-                unit (device) fstat packet      (P_FSTAT_UNIT struct)

-                IPC file fstat packet           (P_FSTAT_IPC struct)

-

-          AclBuf contains the raw ACL data; its length is $MXACL.

-

-

-         -Tandem NSK Extra Field:

-          ======================

-

-          The following is the layout of the file-attributes extra block for

-          Tandem NSK.  The local-header and central-header versions are

-          identical.  (Last Revision 19981221)

-

-          Value         Size        Description

-          -----         ----        -----------

-  (TA)    0x4154        Short       tag for this extra block type ("TA")

-          TSize         Short       total data size for this block (20)

-          NSKattrs      20 Bytes    NSK attributes

-

-

-         -THEOS Extra Field:

-          =================

-

-          The following is the layout of the file-attributes extra block for

-          Theos.  The local-header and central-header versions are identical.

-          (Last Revision 19990206)

-

-          Value         Size        Description

-          -----         ----        -----------

-  (Theos) 0x6854        Short       'Th' signature

-          size          Short       size of extra block

-          flags         Byte        reserved for future use

-          filesize      Long        file size

-          fileorg       Byte        type of file (see below)

-          keylen        Short       key length for indexed and keyed files,

-                                    data segment size for 16 bits programs

-          reclen        Short       record length for indexed,keyed and direct,

-                                    text segment size for 16 bits programs

-          filegrow      Byte        growing factor for indexed,keyed and direct

-          protect       Byte        protections (see below)

-          reserved      Short       reserved for future use

-

-            File types

-            ==========

-

-            0x80  library (keyed access list of files)

-            0x40  directory

-            0x10  stream file

-            0x08  direct file

-            0x04  keyed file

-            0x02  indexed file

-            0x0e  reserved

-            0x01  16 bits real mode program (obsolete)

-            0x21  16 bits protected mode program

-            0x41  32 bits protected mode program

-

-            Protection codes

-            ================

-

-            User protection

-            ---------------

-            0x01  non readable

-            0x02  non writable

-            0x04  non executable

-            0x08  non erasable

-

-            Other protection

-            ----------------

-            0x10  non readable

-            0x20  non writable

-            0x40  non executable Theos before 4.0

-            0x40  modified Theos 4.x

-            0x80  not hidden

-

-

-         -THEOS old inofficial Extra Field:

-          ================================

-

-          The following is the layout of an inoffical former version of a

-          Theos file-attributes extra blocks.  This layout was never published

-          and is no longer created. However, UnZip can optionally support it

-          when compiling with the option flag OLD_THEOS_EXTRA defined.

-          Both the local-header and central-header versions are identical.

-          (Last Revision 19990206)

-

-          Value         Size        Description

-          -----         ----        -----------

-  (THS0)  0x4854        Short       'TH' signature

-          size          Short       size of extra block

-          flags         Short       reserved for future use

-          filesize      Long        file size

-          reclen        Short       record length for indexed,keyed and direct,

-                                    text segment size for 16 bits programs

-          keylen        Short       key length for indexed and keyed files,

-                                    data segment size for 16 bits programs

-          filegrow      Byte        growing factor for indexed,keyed and direct

-          reserved      3 Bytes     reserved for future use

-

-

-         -FWKCS MD5 Extra Field (0x4b46):

-          ==============================

-

-          The FWKCS Contents_Signature System, used in automatically

-          identifying files independent of filename, optionally adds

-          and uses an extra field to support the rapid creation of

-          an enhanced contents_signature.

-          There is no local-header version; the following applies

-          only to the central header.  (Last Revision 19961207)

-

-          Central-header version:

-

-          Value         Size        Description

-          -----         ----        -----------

-  (MD5)   0x4b46        Short       tag for this extra block type ("FK")

-          TSize         Short       total data size for this block (19)

-          "MD5"         3 bytes     extra-field signature

-          MD5hash       16 bytes    128-bit MD5 hash of uncompressed data

-                                    (low byte first)

-

-          When FWKCS revises a .ZIP file central directory to add

-          this extra field for a file, it also replaces the

-          central directory entry for that file's uncompressed

-          file length with a measured value.

-

-          FWKCS provides an option to strip this extra field, if

-          present, from a .ZIP file central directory. In adding

-          this extra field, FWKCS preserves .ZIP file Authenticity

-          Verification; if stripping this extra field, FWKCS

-          preserves all versions of AV through PKZIP version 2.04g.

-

-          FWKCS, and FWKCS Contents_Signature System, are

-          trademarks of Frederick W. Kantor.

-

-          (1) R. Rivest, RFC1321.TXT, MIT Laboratory for Computer

-              Science and RSA Data Security, Inc., April 1992.

-              ll.76-77: "The MD5 algorithm is being placed in the

-              public domain for review and possible adoption as a

-              standard."

-

-

-      file comment: (Variable)

-

-          The comment for this file.

-

-      number of this disk: (2 bytes)

-

-          The number of this disk, which contains central

-          directory end record.  If an archive is in zip64 format

-          and the value in this field is 0xFFFF, the size will

-          be in the corresponding 4 byte zip64 end of central

-          directory field.

-

-      number of the disk with the start of the central directory: (2 bytes)

-

-          The number of the disk on which the central

-          directory starts.  If an archive is in zip64 format

-          and the value in this field is 0xFFFF, the size will

-          be in the corresponding 4 byte zip64 end of central

-          directory field.

-

-      total number of entries in the central dir on this disk: (2 bytes)

-

-          The number of central directory entries on this disk.

-          If an archive is in zip64 format and the value in

-          this field is 0xFFFF, the size will be in the

-          corresponding 8 byte zip64 end of central

-          directory field.

-

-      total number of entries in the central dir: (2 bytes)

-

-          The total number of files in the .ZIP file.  If an

-          archive is in zip64 format and the value in this field

-          is 0xFFFF, the size will be in the corresponding 8 byte

-          zip64 end of central directory field.

-

-      size of the central directory: (4 bytes)

-

-          The size (in bytes) of the entire central directory.

-          If an archive is in zip64 format and the value in

-          this field is 0xFFFFFFFF, the size will be in the

-          corresponding 8 byte zip64 end of central

-          directory field.

-

-      offset of start of central directory with respect to

-      the starting disk number:  (4 bytes)

-

-          Offset of the start of the central directory on the

-          disk on which the central directory starts.  If an

-          archive is in zip64 format and the value in this

-          field is 0xFFFFFFFF, the size will be in the

-          corresponding 8 byte zip64 end of central

-          directory field.

-

-      .ZIP file comment length: (2 bytes)

-

-          The length of the comment for this .ZIP file.

-

-      .ZIP file comment: (Variable)

-

-          The comment for this .ZIP file.  ZIP file comment data

-          is stored unsecured.  No encryption or data authentication

-          is applied to this area at this time.  Confidential information

-          should not be stored in this section.

-

-      zip64 extensible data sector    (variable size)

-

-          (currently reserved for use by PKWARE)

-

-

-  K.  General notes:

-

-      1)  All fields unless otherwise noted are unsigned and stored

-          in Intel low-byte:high-byte, low-word:high-word order.

-

-      2)  String fields are not null terminated, since the

-          length is given explicitly.

-

-      3)  Local headers should not span disk boundaries.  Also, even

-          though the central directory can span disk boundaries, no

-          single record in the central directory should be split

-          across disks.

-

-      4)  The entries in the central directory may not necessarily

-          be in the same order that files appear in the .ZIP file.

-

-      5)  Spanned/Split archives created using PKZIP for Windows

-          (V2.50 or greater), PKZIP Command Line (V2.50 or greater),

-          or PKZIP Explorer will include a special spanning

-          signature as the first 4 bytes of the first segment of

-          the archive.  This signature (0x08074b50) will be

-          followed immediately by the local header signature for

-          the first file in the archive.  A special spanning

-          marker may also appear in spanned/split archives if the

-          spanning or splitting process starts but only requires

-          one segment.  In this case the 0x08074b50 signature

-          will be replaced with the temporary spanning marker

-          signature of 0x30304b50.  Spanned/split archives

-          created with this special signature are compatible with

-          all versions of PKZIP from PKWARE.  Split archives can

-          only be uncompressed by other versions of PKZIP that

-          know how to create a split archive.

-

-      6)  If one of the fields in the end of central directory

-          record is too small to hold required data, the field

-          should be set to -1 (0xFFFF or 0xFFFFFFFF) and the

-          Zip64 format record should be created.

-

-      7)  The end of central directory record and the

-          Zip64 end of central directory locator record must

-          reside on the same disk when splitting or spanning

-          an archive.

-

-V. UnShrinking - Method 1

--------------------------

-

-Shrinking is a Dynamic Ziv-Lempel-Welch compression algorithm

-with partial clearing.  The initial code size is 9 bits, and

-the maximum code size is 13 bits.  Shrinking differs from

-conventional Dynamic Ziv-Lempel-Welch implementations in several

-respects:

-

-1)  The code size is controlled by the compressor, and is not

-    automatically increased when codes larger than the current

-    code size are created (but not necessarily used).  When

-    the decompressor encounters the code sequence 256

-    (decimal) followed by 1, it should increase the code size

-    read from the input stream to the next bit size.  No

-    blocking of the codes is performed, so the next code at

-    the increased size should be read from the input stream

-    immediately after where the previous code at the smaller

-    bit size was read.  Again, the decompressor should not

-    increase the code size used until the sequence 256,1 is

-    encountered.

-

-2)  When the table becomes full, total clearing is not

-    performed.  Rather, when the compressor emits the code

-    sequence 256,2 (decimal), the decompressor should clear

-    all leaf nodes from the Ziv-Lempel tree, and continue to

-    use the current code size.  The nodes that are cleared

-    from the Ziv-Lempel tree are then re-used, with the lowest

-    code value re-used first, and the highest code value

-    re-used last.  The compressor can emit the sequence 256,2

-    at any time.

-

-

-VI. Expanding - Methods 2-5

----------------------------

-

-The Reducing algorithm is actually a combination of two

-distinct algorithms.  The first algorithm compresses repeated

-byte sequences, and the second algorithm takes the compressed

-stream from the first algorithm and applies a probabilistic

-compression method.

-

-The probabilistic compression stores an array of 'follower

-sets' S(j), for j=0 to 255, corresponding to each possible

-ASCII character.  Each set contains between 0 and 32

-characters, to be denoted as S(j)[0],...,S(j)[m], where m<32.

-The sets are stored at the beginning of the data area for a

-Reduced file, in reverse order, with S(255) first, and S(0)

-last.

-

-The sets are encoded as { N(j), S(j)[0],...,S(j)[N(j)-1] },

-where N(j) is the size of set S(j).  N(j) can be 0, in which

-case the follower set for S(j) is empty.  Each N(j) value is

-encoded in 6 bits, followed by N(j) eight bit character values

-corresponding to S(j)[0] to S(j)[N(j)-1] respectively.  If

-N(j) is 0, then no values for S(j) are stored, and the value

-for N(j-1) immediately follows.

-

-Immediately after the follower sets, is the compressed data

-stream.  The compressed data stream can be interpreted for the

-probabilistic decompression as follows:

-

-

-let Last-Character <- 0.

-loop until done

-    if the follower set S(Last-Character) is empty then

-        read 8 bits from the input stream, and copy this

-        value to the output stream.

-    otherwise if the follower set S(Last-Character) is non-empty then

-        read 1 bit from the input stream.

-        if this bit is not zero then

-            read 8 bits from the input stream, and copy this

-            value to the output stream.

-        otherwise if this bit is zero then

-            read B(N(Last-Character)) bits from the input

-            stream, and assign this value to I.

-            Copy the value of S(Last-Character)[I] to the

-            output stream.

-

-    assign the last value placed on the output stream to

-    Last-Character.

-end loop

-

-

-B(N(j)) is defined as the minimal number of bits required to

-encode the value N(j)-1.

-

-

-The decompressed stream from above can then be expanded to

-re-create the original file as follows:

-

-

-let State <- 0.

-

-loop until done

-    read 8 bits from the input stream into C.

-    case State of

-        0:  if C is not equal to DLE (144 decimal) then

-                copy C to the output stream.

-            otherwise if C is equal to DLE then

-                let State <- 1.

-

-        1:  if C is non-zero then

-                let V <- C.

-                let Len <- L(V)

-                let State <- F(Len).

-            otherwise if C is zero then

-                copy the value 144 (decimal) to the output stream.

-                let State <- 0

-

-        2:  let Len <- Len + C

-            let State <- 3.

-

-        3:  move backwards D(V,C) bytes in the output stream

-            (if this position is before the start of the output

-            stream, then assume that all the data before the

-            start of the output stream is filled with zeros).

-            copy Len+3 bytes from this position to the output stream.

-            let State <- 0.

-    end case

-end loop

-

-

-The functions F,L, and D are dependent on the 'compression

-factor', 1 through 4, and are defined as follows:

-

-For compression factor 1:

-    L(X) equals the lower 7 bits of X.

-    F(X) equals 2 if X equals 127 otherwise F(X) equals 3.

-    D(X,Y) equals the (upper 1 bit of X) * 256 + Y + 1.

-For compression factor 2:

-    L(X) equals the lower 6 bits of X.

-    F(X) equals 2 if X equals 63 otherwise F(X) equals 3.

-    D(X,Y) equals the (upper 2 bits of X) * 256 + Y + 1.

-For compression factor 3:

-    L(X) equals the lower 5 bits of X.

-    F(X) equals 2 if X equals 31 otherwise F(X) equals 3.

-    D(X,Y) equals the (upper 3 bits of X) * 256 + Y + 1.

-For compression factor 4:

-    L(X) equals the lower 4 bits of X.

-    F(X) equals 2 if X equals 15 otherwise F(X) equals 3.

-    D(X,Y) equals the (upper 4 bits of X) * 256 + Y + 1.

-

-

-VII. Imploding - Method 6

--------------------------

-

-The Imploding algorithm is actually a combination of two distinct

-algorithms.  The first algorithm compresses repeated byte

-sequences using a sliding dictionary.  The second algorithm is

-used to compress the encoding of the sliding dictionary output,

-using multiple Shannon-Fano trees.

-

-The Imploding algorithm can use a 4K or 8K sliding dictionary

-size. The dictionary size used can be determined by bit 1 in the

-general purpose flag word; a 0 bit indicates a 4K dictionary

-while a 1 bit indicates an 8K dictionary.

-

-The Shannon-Fano trees are stored at the start of the compressed

-file. The number of trees stored is defined by bit 2 in the

-general purpose flag word; a 0 bit indicates two trees stored, a

-1 bit indicates three trees are stored.  If 3 trees are stored,

-the first Shannon-Fano tree represents the encoding of the

-Literal characters, the second tree represents the encoding of

-the Length information, the third represents the encoding of the

-Distance information.  When 2 Shannon-Fano trees are stored, the

-Length tree is stored first, followed by the Distance tree.

-

-The Literal Shannon-Fano tree, if present is used to represent

-the entire ASCII character set, and contains 256 values.  This

-tree is used to compress any data not compressed by the sliding

-dictionary algorithm.  When this tree is present, the Minimum

-Match Length for the sliding dictionary is 3.  If this tree is

-not present, the Minimum Match Length is 2.

-

-The Length Shannon-Fano tree is used to compress the Length part

-of the (length,distance) pairs from the sliding dictionary

-output.  The Length tree contains 64 values, ranging from the

-Minimum Match Length, to 63 plus the Minimum Match Length.

-

-The Distance Shannon-Fano tree is used to compress the Distance

-part of the (length,distance) pairs from the sliding dictionary

-output. The Distance tree contains 64 values, ranging from 0 to

-63, representing the upper 6 bits of the distance value.  The

-distance values themselves will be between 0 and the sliding

-dictionary size, either 4K or 8K.

-

-The Shannon-Fano trees themselves are stored in a compressed

-format. The first byte of the tree data represents the number of

-bytes of data representing the (compressed) Shannon-Fano tree

-minus 1.  The remaining bytes represent the Shannon-Fano tree

-data encoded as:

-

-    High 4 bits: Number of values at this bit length + 1. (1 - 16)

-    Low  4 bits: Bit Length needed to represent value + 1. (1 - 16)

-

-The Shannon-Fano codes can be constructed from the bit lengths

-using the following algorithm:

-

-1)  Sort the Bit Lengths in ascending order, while retaining the

-    order of the original lengths stored in the file.

-

-2)  Generate the Shannon-Fano trees:

-

-    Code <- 0

-    CodeIncrement <- 0

-    LastBitLength <- 0

-    i <- number of Shannon-Fano codes - 1   (either 255 or 63)

-

-    loop while i >= 0

-        Code = Code + CodeIncrement

-        if BitLength(i) <> LastBitLength then

-            LastBitLength=BitLength(i)

-            CodeIncrement = 1 shifted left (16 - LastBitLength)

-        ShannonCode(i) = Code

-        i <- i - 1

-    end loop

-

-

-3)  Reverse the order of all the bits in the above ShannonCode()

-    vector, so that the most significant bit becomes the least

-    significant bit.  For example, the value 0x1234 (hex) would

-    become 0x2C48 (hex).

-

-4)  Restore the order of Shannon-Fano codes as originally stored

-    within the file.

-

-Example:

-

-    This example will show the encoding of a Shannon-Fano tree

-    of size 8.  Notice that the actual Shannon-Fano trees used

-    for Imploding are either 64 or 256 entries in size.

-

-Example:   0x02, 0x42, 0x01, 0x13

-

-    The first byte indicates 3 values in this table.  Decoding the

-    bytes:

-            0x42 = 5 codes of 3 bits long

-            0x01 = 1 code  of 2 bits long

-            0x13 = 2 codes of 4 bits long

-

-    This would generate the original bit length array of:

-    (3, 3, 3, 3, 3, 2, 4, 4)

-

-    There are 8 codes in this table for the values 0 thru 7.  Using

-    the algorithm to obtain the Shannon-Fano codes produces:

-

-                                  Reversed     Order     Original

-Val  Sorted   Constructed Code      Value     Restored    Length

----  ------   -----------------   --------    --------    ------

-0:     2      1100000000000000        11       101          3

-1:     3      1010000000000000       101       001          3

-2:     3      1000000000000000       001       110          3

-3:     3      0110000000000000       110       010          3

-4:     3      0100000000000000       010       100          3

-5:     3      0010000000000000       100        11          2

-6:     4      0001000000000000      1000      1000          4

-7:     4      0000000000000000      0000      0000          4

-

-

-The values in the Val, Order Restored and Original Length columns

-now represent the Shannon-Fano encoding tree that can be used for

-decoding the Shannon-Fano encoded data.  How to parse the

-variable length Shannon-Fano values from the data stream is beyond

-the scope of this document.  (See the references listed at the end of

-this document for more information.)  However, traditional decoding

-schemes used for Huffman variable length decoding, such as the

-Greenlaw algorithm, can be successfully applied.

-

-The compressed data stream begins immediately after the

-compressed Shannon-Fano data.  The compressed data stream can be

-interpreted as follows:

-

-loop until done

-    read 1 bit from input stream.

-

-    if this bit is non-zero then       (encoded data is literal data)

-        if Literal Shannon-Fano tree is present

-            read and decode character using Literal Shannon-Fano tree.

-        otherwise

-            read 8 bits from input stream.

-        copy character to the output stream.

-    otherwise              (encoded data is sliding dictionary match)

-        if 8K dictionary size

-            read 7 bits for offset Distance (lower 7 bits of offset).

-        otherwise

-            read 6 bits for offset Distance (lower 6 bits of offset).

-

-        using the Distance Shannon-Fano tree, read and decode the

-          upper 6 bits of the Distance value.

-

-        using the Length Shannon-Fano tree, read and decode

-          the Length value.

-

-        Length <- Length + Minimum Match Length

-

-        if Length = 63 + Minimum Match Length

-            read 8 bits from the input stream,

-            add this value to Length.

-

-        move backwards Distance+1 bytes in the output stream, and

-        copy Length characters from this position to the output

-        stream.  (if this position is before the start of the output

-        stream, then assume that all the data before the start of

-        the output stream is filled with zeros).

-end loop

-

-VIII. Tokenizing - Method 7

----------------------------

-

-This method is not used by PKZIP.

-

-IX. Deflating - Method 8

-------------------------

-

-The Deflate algorithm is similar to the Implode algorithm using

-a sliding dictionary of up to 32K with secondary compression

-from Huffman/Shannon-Fano codes.

-

-The compressed data is stored in blocks with a header describing

-the block and the Huffman codes used in the data block.  The header

-format is as follows:

-

-   Bit 0: Last Block bit     This bit is set to 1 if this is the last

-                             compressed block in the data.

-   Bits 1-2: Block type

-      00 (0) - Block is stored - All stored data is byte aligned.

-               Skip bits until next byte, then next word = block

-               length, followed by the ones compliment of the block

-               length word. Remaining data in block is the stored

-               data.

-

-      01 (1) - Use fixed Huffman codes for literal and distance codes.

-               Lit Code    Bits             Dist Code   Bits

-               ---------   ----             ---------   ----

-                 0 - 143    8                 0 - 31      5

-               144 - 255    9

-               256 - 279    7

-               280 - 287    8

-

-               Literal codes 286-287 and distance codes 30-31 are

-               never used but participate in the huffman construction.

-

-      10 (2) - Dynamic Huffman codes.  (See expanding Huffman codes)

-

-      11 (3) - Reserved - Flag a "Error in compressed data" if seen.

-

-Expanding Huffman Codes

------------------------

-If the data block is stored with dynamic Huffman codes, the Huffman

-codes are sent in the following compressed format:

-

-   5 Bits: # of Literal codes sent - 257 (257 - 286)

-           All other codes are never sent.

-   5 Bits: # of Dist codes - 1           (1 - 32)

-   4 Bits: # of Bit Length codes - 4     (4 - 19)

-

-The Huffman codes are sent as bit lengths and the codes are built as

-described in the implode algorithm.  The bit lengths themselves are

-compressed with Huffman codes.  There are 19 bit length codes:

-

-   0 - 15: Represent bit lengths of 0 - 15

-       16: Copy the previous bit length 3 - 6 times.

-           The next 2 bits indicate repeat length (0 = 3, ... ,3 = 6)

-              Example:  Codes 8, 16 (+2 bits 11), 16 (+2 bits 10) will

-                        expand to 12 bit lengths of 8 (1 + 6 + 5)

-       17: Repeat a bit length of 0 for 3 - 10 times. (3 bits of length)

-       18: Repeat a bit length of 0 for 11 - 138 times (7 bits of length)

-

-The lengths of the bit length codes are sent packed 3 bits per value

-(0 - 7) in the following order:

-

-   16, 17, 18, 0, 8, 7, 9, 6, 10, 5, 11, 4, 12, 3, 13, 2, 14, 1, 15

-

-The Huffman codes should be built as described in the Implode algorithm

-except codes are assigned starting at the shortest bit length, i.e. the

-shortest code should be all 0's rather than all 1's.  Also, codes with

-a bit length of zero do not participate in the tree construction.  The

-codes are then used to decode the bit lengths for the literal and

-distance tables.

-

-The bit lengths for the literal tables are sent first with the number

-of entries sent described by the 5 bits sent earlier.  There are up

-to 286 literal characters; the first 256 represent the respective 8

-bit character, code 256 represents the End-Of-Block code, the remaining

-29 codes represent copy lengths of 3 thru 258.  There are up to 30

-distance codes representing distances from 1 thru 32k as described

-below.

-

-                             Length Codes

-                             ------------

-      Extra             Extra              Extra              Extra

- Code Bits Length  Code Bits Lengths  Code Bits Lengths  Code Bits Length(s)

- ---- ---- ------  ---- ---- -------  ---- ---- -------  ---- ---- ---------

-  257   0     3     265   1   11,12    273   3   35-42    281   5  131-162

-  258   0     4     266   1   13,14    274   3   43-50    282   5  163-194

-  259   0     5     267   1   15,16    275   3   51-58    283   5  195-226

-  260   0     6     268   1   17,18    276   3   59-66    284   5  227-258

-  261   0     7     269   2   19-22    277   4   67-82    285   0    258

-  262   0     8     270   2   23-26    278   4   83-98

-  263   0     9     271   2   27-30    279   4   99-114

-  264   0    10     272   2   31-34    280   4  115-130

-

-                            Distance Codes

-                            --------------

-      Extra           Extra             Extra               Extra

- Code Bits Dist  Code Bits  Dist   Code Bits Distance  Code Bits Distance

- ---- ---- ----  ---- ---- ------  ---- ---- --------  ---- ---- --------

-   0   0    1      8   3   17-24    16    7  257-384    24   11  4097-6144

-   1   0    2      9   3   25-32    17    7  385-512    25   11  6145-8192

-   2   0    3     10   4   33-48    18    8  513-768    26   12  8193-12288

-   3   0    4     11   4   49-64    19    8  769-1024   27   12 12289-16384

-   4   1   5,6    12   5   65-96    20    9 1025-1536   28   13 16385-24576

-   5   1   7,8    13   5   97-128   21    9 1537-2048   29   13 24577-32768

-   6   2   9-12   14   6  129-192   22   10 2049-3072

-   7   2  13-16   15   6  193-256   23   10 3073-4096

-

-The compressed data stream begins immediately after the

-compressed header data.  The compressed data stream can be

-interpreted as follows:

-

-do

-   read header from input stream.

-

-   if stored block

-      skip bits until byte aligned

-      read count and 1's compliment of count

-      copy count bytes data block

-   otherwise

-      loop until end of block code sent

-         decode literal character from input stream

-         if literal < 256

-            copy character to the output stream

-         otherwise

-            if literal = end of block

-               break from loop

-            otherwise

-               decode distance from input stream

-

-               move backwards distance bytes in the output stream, and

-               copy length characters from this position to the output

-               stream.

-      end loop

-while not last block

-

-if data descriptor exists

-   skip bits until byte aligned

-   check data descriptor signature

-   read crc and sizes

-endif

-

-X. Enhanced Deflating - Method 9

---------------------------------

-

-The Enhanced Deflating algorithm is similar to Deflate but

-uses a sliding dictionary of up to 64K. Deflate64(tm) is supported

-by the Deflate extractor.

-

-[This description is inofficial.  It has been deduced by Info-ZIP from

-close inspection of PKZIP 4.x Deflate64(tm) compressed output.]

-

-The Deflate64 algorithm is almost identical to the normal Deflate algorithm.

-Differences are:

-

-- The sliding window size is 64k.

-

-- The previously unused distance codes 30 and 31 are now used to describe

-  match distances from 32k-48k and 48k-64k.

-         Extra

-    Code Bits Distance

-    ---- ---- -----------

-     ..   ..      ...

-     29   13  24577-32768

-     30   14  32769-49152

-     31   14  49153-65536

-

-- The semantics of the "maximum match length" code #258 has been changed to

-  allow the specification of arbitrary large match lengths (up to 64k).

-         Extra

-    Code Bits Lengths

-    ---- ---- ------

-     ...  ..    ...

-     284   5  227-258

-     285  16  3-65538

-

-Whereas the first two modifications fit into the framework of Deflate,

-this last change breaks compatibility with Deflate method 8. Thus, a

-Deflate64 decompressor cannot decode normal deflated data.

-

-XI. BZIP2 - Method 12

----------------------

-

-BZIP2 is an open-source data compression algorithm developed by

-Julian Seward.  Information and source code for this algorithm

-can be found on the internet.

-

-

-XII. Traditional PKWARE Encryption

-----------------------------------

-

-The following information discusses the decryption steps

-required to support traditional PKWARE encryption.  This

-form of encryption is considered weak by today's standards

-and its use is recommended only for situations with

-low security needs or for compatibility with older .ZIP

-applications.

-

-XIII. Decryption

-----------------

-

-The encryption used in PKZIP was generously supplied by Roger

-Schlafly.  PKWARE is grateful to Mr. Schlafly for his expert

-help and advice in the field of data encryption.

-

-PKZIP encrypts the compressed data stream.  Encrypted files must

-be decrypted before they can be extracted.

-

-Each encrypted file has an extra 12 bytes stored at the start of

-the data area defining the encryption header for that file.  The

-encryption header is originally set to random values, and then

-itself encrypted, using three, 32-bit keys.  The key values are

-initialized using the supplied encryption password.  After each byte

-is encrypted, the keys are then updated using pseudo-random number

-generation techniques in combination with the same CRC-32 algorithm

-used in PKZIP and described elsewhere in this document.

-

-The following is the basic steps required to decrypt a file:

-

-1) Initialize the three 32-bit keys with the password.

-2) Read and decrypt the 12-byte encryption header, further

-   initializing the encryption keys.

-3) Read and decrypt the compressed data stream using the

-   encryption keys.

-

-

-Step 1 - Initializing the encryption keys

------------------------------------------

-

-Key(0) <- 305419896

-Key(1) <- 591751049

-Key(2) <- 878082192

-

-loop for i <- 0 to length(password)-1

-    update_keys(password(i))

-end loop

-

-

-Where update_keys() is defined as:

-

-

-update_keys(char):

-  Key(0) <- crc32(key(0),char)

-  Key(1) <- Key(1) + (Key(0) & 000000ffH)

-  Key(1) <- Key(1) * 134775813 + 1

-  Key(2) <- crc32(key(2),key(1) >> 24)

-end update_keys

-

-

-Where crc32(old_crc,char) is a routine that given a CRC value and a

-character, returns an updated CRC value after applying the CRC-32

-algorithm described elsewhere in this document.

-

-

-Step 2 - Decrypting the encryption header

------------------------------------------

-

-The purpose of this step is to further initialize the encryption

-keys, based on random data, to render a plaintext attack on the

-data ineffective.

-

-

-Read the 12-byte encryption header into Buffer, in locations

-Buffer(0) thru Buffer(11).

-

-loop for i <- 0 to 11

-    C <- buffer(i) ^ decrypt_byte()

-    update_keys(C)

-    buffer(i) <- C

-end loop

-

-

-Where decrypt_byte() is defined as:

-

-

-unsigned char decrypt_byte()

-    local unsigned short temp

-    temp <- Key(2) | 2

-    decrypt_byte <- (temp * (temp ^ 1)) >> 8

-end decrypt_byte

-

-

-After the header is decrypted,  the last 1 or 2 bytes in Buffer

-should be the high-order word/byte of the CRC for the file being

-decrypted, stored in Intel low-byte/high-byte order, or the high-order

-byte of the file time if bit 3 of the general purpose bit flag is set.

-Versions of PKZIP prior to 2.0 used a 2 byte CRC check; a 1 byte CRC check is

-used on versions after 2.0.  This can be used to test if the password

-supplied is correct or not.

-

-

-Step 3 - Decrypting the compressed data stream

-----------------------------------------------

-

-The compressed data stream can be decrypted as follows:

-

-

-loop until done

-    read a character into C

-    Temp <- C ^ decrypt_byte()

-    update_keys(temp)

-    output Temp

-end loop

-

-

-XIV. Strong Encryption Specification (EFS)

-------------------------------------------

-

-Version 5.x of this specification introduced support for strong

-encryption algorithms.  These algorithms can be used with either

-a password or an X.509v3 digital certificate to encrypt each file.

-This format specification supports either password or certificate

-based encryption to meet the security needs of today, to enable

-interoperability between users within both PKI and non-PKI

-environments, and to ensure interoperability between different

-computing platforms that are running a ZIP program.

-

-Password based encryption is the most common form of encryption

-people are familiar with.  However, inherent weaknesses with

-passwords (e.g. susceptibility to dictionary/brute force attack)

-as well as password management and support issues make certificate

-based encryption a more secure and scalable option.  Industry

-efforts and support are defining and moving towards more advanced

-security solutions built around X.509v3 digital certificates and

-Public Key Infrastructures(PKI) because of the greater scalability,

-administrative options, and more robust security over traditional

-password-based encryption.

-

-Most standard encryption algorithms are supported with this

-specification. Reference implementations for many of these

-algorithms are available from either commercial or open source

-distributors.  Readily available cryptographic toolkits make

-implementation of the encryption features straight-forward.

-This document is not intended to provide a treatise on data

-encryption principles or theory.  Its purpose is to document the

-data structures required for implementing interoperable data

-encryption within the .ZIP format.  It is strongly recommended that

-you have a good understanding of data encryption before reading

-further.

-

-The algorithms introduced in Version 5.0 of this specification

-include:

-

-    RC2 40 bit, 64 bit, and 128 bit

-    RC4 40 bit, 64 bit, and 128 bit

-    DES

-    3DES 112 bit and 168 bit

-

-Version 5.1 adds support for the following:

-

-    AES 128 bit, 192 bit, and 256 bit

-

-Version 6.1 introduces encryption data changes to support

-interoperability with SmartCard and USB Token certificate storage

-methods which do not support the OAEP strengthening standard.

-

-Version 6.2 introduces support for encrypting metadata by compressing

-and encrypting the central directory data structure to reduce information

-leakage.   Information leakage can occur in legacy ZIP applications

-through exposure of information about a file even though that file is

-stored encrypted.  The information exposed consists of file

-characteristics stored within the records and fields defined by this

-specification.  This includes data such as a files name, its original

-size, timestamp and CRC32 value.

-

-Central Directory Encryption provides greater protection against

-information leakage by encrypting the Central Directory structure and

-by masking key values that are replicated in the unencrypted Local

-Header.   ZIP compatible programs that cannot interpret an encrypted

-Central Directory structure cannot rely on the data in the corresponding

-Local Header for decompression information.

-

-Extra Field records that may contain information about a file that should

-not be exposed should not be stored in the Local Header and should only

-be written to the Central Directory where they can be encrypted.  This

-design currently does not support streaming.  Information in the End of

-Central Directory record, the ZIP64 End of Central Directory Locator,

-and the ZIP64 End of Central Directory record are not encrypted.  Access

-to view data on files within a ZIP file with an encrypted Central Directory

-requires the appropriate password or private key for decryption prior to

-viewing any files, or any information about the files, in the archive.

-

-Older ZIP compatible programs not familiar with the Central Directory

-Encryption feature will no longer be able to recognize the Central

-Directory and may assume the ZIP file is corrupt.  Programs that

-attempt streaming access using Local Headers will see invalid

-information for each file.  Central Directory Encryption need not be

-used for every ZIP file.  Its use is recommended for greater security.

-ZIP files not using Central Directory Encryption should operate as

-in the past.

-

-The details of the strong encryption specification for certificates

-remain under development as design and testing issues are worked out

-for the range of algorithms, encryption methods, certificate processing

-and cross-platform support necessary to meet the advanced security needs

-of .ZIP file users today and in the future.

-

-This feature specification is intended to support basic encryption needs

-of today, such as password support.  However this specification is also

-designed to lay the foundation for future advanced security needs.

-

-Encryption provides data confidentiality and privacy.  It is

-recommended that you combine X.509 digital signing with encryption

-to add authentication and non-repudiation.

-

-

-Single Password Symmetric Encryption Method:

--------------------------------------------

-

-The Single Password Symmetric Encryption Method using strong

-encryption algorithms operates similarly to the traditional

-PKWARE encryption defined in this format.  Additional data

-structures are added to support the processing needs of the

-strong algorithms.

-

-The Strong Encryption data structures are:

-

-1. General Purpose Bits - Bits 0 and 6 of the General Purpose bit

-flag in both local and central header records.  Both bits set

-indicates strong encryption.  Bit 13, when set indicates the Central

-Directory is encrypted and that selected fields in the Local Header

-are masked to hide their actual value.

-

-

-2. Extra Field 0x0017 in central header only.

-

-     Fields to consider in this record are:

-

-     Format - the data format identifier for this record.  The only

-     value allowed at this time is the integer value 2.

-

-     AlgId - integer identifier of the encryption algorithm from the

-     following range

-

-         0x6601 - DES

-         0x6602 - RC2 (version needed to extract < 5.2)

-         0x6603 - 3DES 168

-         0x6609 - 3DES 112

-         0x660E - AES 128

-         0x660F - AES 192

-         0x6610 - AES 256

-         0x6702 - RC2 (version needed to extract >= 5.2)

-         0x6801 - RC4

-         0xFFFF - Unknown algorithm

-

-     Bitlen - Explicit bit length of key

-

-          40

-          56

-          64

-         112

-         128

-         168

-         192

-         256

-

-     Flags - Processing flags needed for decryption

-

-         0x0001 - Password is required to decrypt

-         0x0002 - Certificates only

-         0x0003 - Password or certificate required to decrypt

-

-         Values > 0x0003 reserved for certificate processing

-

-

-3. Decryption header record preceeding compressed file data.

-

-         -Decryption Header:

-

-          Value     Size     Description

-          -----     ----     -----------

-          IVSize    2 bytes  Size of initialization vector (IV)

-          IVData    IVSize   Initialization vector for this file

-          Size      4 bytes  Size of remaining decryption header data

-          Format    2 bytes  Format definition for this record

-          AlgID     2 bytes  Encryption algorithm identifier

-          Bitlen    2 bytes  Bit length of encryption key

-          Flags     2 bytes  Processing flags

-          ErdSize   2 bytes  Size of Encrypted Random Data

-          ErdData   ErdSize  Encrypted Random Data

-          Reserved1 4 bytes  Reserved certificate processing data

-          Reserved2 (var)    Reserved for certificate processing data

-          VSize     2 bytes  Size of password validation data

-          VData     VSize-4  Password validation data

-          VCRC32    4 bytes  Standard ZIP CRC32 of password validation data

-

-     IVData - The size of the IV should match the algorithm block size.

-              The IVData can be completely random data.  If the size of

-              the randomly generated data does not match the block size

-              it should be complemented with zero's or truncated as

-              necessary.  If IVSize is 0, then IV = CRC32 + Uncompressed

-              File Size (as a 64 bit little-endian, unsigned integer value).

-

-     Format - the data format identifier for this record.  The only

-     value allowed at this time is the integer value 3.

-

-     AlgId - integer identifier of the encryption algorithm from the

-     following range

-

-         0x6601 - DES

-         0x6602 - RC2 (version needed to extract < 5.2)

-         0x6603 - 3DES 168

-         0x6609 - 3DES 112

-         0x660E - AES 128

-         0x660F - AES 192

-         0x6610 - AES 256

-         0x6702 - RC2 (version needed to extract >= 5.2)

-         0x6801 - RC4

-         0xFFFF - Unknown algorithm

-

-     Bitlen - Explicit bit length of key

-

-          40

-          56

-          64

-         112

-         128

-         168

-         192

-         256

-

-     Flags - Processing flags needed for decryption

-

-         0x0001 - Password is required to decrypt

-         0x0002 - Certificates only

-         0x0003 - Password or certificate required to decrypt

-

-         Values > 0x0003 reserved for certificate processing

-

-     ErdData - Encrypted random data is used to generate a file

-               session key for encrypting each file.  SHA1 is

-               used to calculate hash data used to derive keys.

-               File session keys are derived from a master session

-               key generated from the user-supplied password.

-               If the Flags field in the decryption header contains

-               the value 0x4000, then the ErdData field must be

-               decrypted using 3DES.

-

-     Reserved1 - Reserved for certificate processing, if value is

-               zero, then Reserved2 data is absent.  See the explanation

-               under the Certificate Processing Method for details on

-               this data structure.

-

-     Reserved2 - If present, the size of the Reserved2 data structure

-               is located by skipping the first 4 bytes of this field

-               and using the next 2 bytes as the remaining size.  See

-               the explanation under the Certificate Processing Method

-               for details on this data structure.

-

-     VSize - This size value will always include the 4 bytes of the

-             VCRC32 data and will be greater than 4 bytes.

-

-     VData - Random data for password validation.  This data is VSize

-             in length and VSize must be a multiple of the encryption

-             block size.  VCRC32 is a checksum value of VData.

-             VData and VCRC32 are stored encrypted and start the

-             stream of encrypted data for a file.

-

-4. Single Password Central Directory Encryption

-

-Central Directory Encryption is achieved within the .ZIP format by

-encrypting the Central Directory structure.  This encapsulates the metadata

-most often used for processing .ZIP files.  Additional metadata is stored for

-redundancy in the Local Header for each file.  The process of concealing

-metadata by encrypting the Central Directory does not protect the data within

-the Local Header.  To avoid information leakage from the exposed metadata

-in the Local Header, the fields containing information about a file are masked.

-

-Local Header:

-

-Masking replaces the true content of the fields for a file in the Local

-Header with false information.  When masked, the Local Header is not

-suitable for streaming access and the options for data recovery of damaged

-archives is reduced.  Extra Data fields that may contain confidential

-data should not be stored within the Local Header.  The value set into

-the Version needed to extract field should be the correct value needed to

-extract the file without regard to Central Directory Encryption. The fields

-within the Local Header targeted for masking when the Central Directory is

-encrypted are:

-

-        Field Name                     Mask Value

-        ------------------             ---------------------------

-        compression method              0

-        last mod file time              0

-        last mod file date              0

-        crc-32                          0

-        compressed size                 0

-        uncompressed size               0

-        file name (variable size)       Base 16 value from the

-                                        range 1 - FFFFFFFFFFFFFFFF

-                                        represented as a string whose

-                                        size will be set into the

-                                        file name length field

-

-The Base 16 value assigned as a masked file name is simply a sequentially

-incremented value for each file starting with 1 for the first file.

-Modifications to a ZIP file may cause different values to be stored for

-each file.  For compatibility, the file name field in the Local Header

-should never be left blank.  As of Version 6.2 of this specification,

-the Compression Method and Compressed Size fields are not yet masked.

-

-Encrypting the Central Directory:

-

-Encryption of the Central Directory does not include encryption of the

-Central Directory Signature data, the ZIP64 End of Central Directory

-record, the ZIP64 End of Central Directory Locator, or the End

-of Central Directory record.  The ZIP file comment data is never

-encrypted.

-

-Before encrypting the Central Directory, it may optionally be compressed.

-Compression is not required, but for storage efficiency it is assumed

-this structure will be compressed before encrypting.  Similarly, this

-specification supports compressing the Central Directory without

-requiring that it also be encrypted.  Early implementations of this

-feature will assume the encryption method applied to files matches the

-encryption applied to the Central Directory.

-

-Encryption of the Central Directory is done in a manner similar to

-that of file encryption.  The encrypted data is preceded by a

-decryption header.  The decryption header is known as the Archive

-Decryption Header.  The fields of this record are identical to

-the decryption header preceding each encrypted file.  The location

-of the Archive Decryption Header is determined by the value in the

-Start of the Central Directory field in the ZIP64 End of Central

-Directory record.  When the Central Directory is encrypted, the

-ZIP64 End of Central Directory record will always be present.

-

-The layout of the ZIP64 End of Central Directory record for all

-versions starting with 6.2 of this specification will follow the

-Version 2 format.  The Version 2 format is as follows:

-

-The first 48 bytes will remain identical to that of Version 1.

-The record signature for both Version 1 and Version 2 will be

-0x06064b50.  Immediately following the 48th byte, which identifies

-the end of the field known as the Offset of Start of Central

-Directory With Respect to the Starting Disk Number will begin the

-new fields defining Version 2 of this record.

-

-New fields for Version 2:

-

-Note: all fields stored in Intel low-byte/high-byte order.

-

-          Value                 Size       Description

-          -----                 ----       -----------

-          Compression Method    2 bytes    Method used to compress the

-                                           Central Directory

-          Compressed Size       8 bytes    Size of the compressed data

-          Original   Size       8 bytes    Original uncompressed size

-          AlgId                 2 bytes    Encryption algorithm ID

-          BitLen                2 bytes    Encryption key length

-          Flags                 2 bytes    Encryption flags

-          HashID                2 bytes    Hash algorithm identifier

-          Hash Length           2 bytes    Length of hash data

-          Hash Data             (variable) Hash data

-

-The Compression Method accepts the same range of values as the

-corresponding field in the Central Header.

-

-The Compressed Size and Original Size values will not include the

-data of the Central Directory Signature which is compressed or

-encrypted.

-

-The AlgId, BitLen, and Flags fields accept the same range of values

-the corresponding fields within the 0x0017 record.

-

-Hash ID identifies the algorithm used to hash the Central Directory

-data.  This data does not have to be hashed, in which case the

-values for both the HashID and Hash Length will be 0.  Possible

-values for HashID are:

-

-      Value         Algorithm

-     ------         ---------

-     0x0000          none

-     0x0001          CRC32

-     0x8003          MD5

-     0x8004          SHA1

-

-When the Central Directory data is signed, the same hash algorithm

-used to hash the Central Directory for signing should be used.

-This is recommended for processing efficiency, however, it is

-permissible for any of the above algorithms to be used independent

-of the signing process.

-

-The Hash Data will contain the hash data for the Central Directory.

-The length of this data will vary depending on the algorithm used.

-

-The Version Needed to Extract should be set to 62.

-

-The value for the Total Number of Entries on the Current Disk will

-be 0.  These records will no longer support random access when

-encrypting the Central Directory.

-

-When the Central Directory is compressed and/or encrypted, the

-End of Central Directory record will store the value 0xFFFFFFFF

-as the value for the Total Number of Entries in the Central

-Directory.  The value stored in the Total Number of Entries in

-the Central Directory on this Disk field will be 0.  The actual

-values will be stored in the equivalent fields of the ZIP64

-End of Central Directory record.

-

-Decrypting and decompressing the Central Directory is accomplished

-in the same manner as decrypting and decompressing a file.

-

-

-5. Useful Tips

-

-Strong Encryption is always applied to a file after compression. The

-block oriented algorithms all operate in Cypher Block Chaining (CBC)

-mode.  The block size used for AES encryption is 16.  All other block

-algorithms use a block size of 8.  Two ID's are defined for RC2 to

-account for a discrepancy found in the implementation of the RC2

-algorithm in the cryptographic library on Windows XP SP1 and all

-earlier versions of Windows.

-

-A pseudo-code representation of the encryption process is as follows:

-

-Password = GetUserPassword()

-RD  = Random()

-ERD = Encrypt(RD,DeriveKey(SHA1(Password)))

-For Each File

-    IV = Random()

-    VData = Random()

-    FileSessionKey = DeriveKey(SHA1(IV + RD))

-    Encrypt(VData + VCRC32 + FileData,FileSessionKey)

-Done

-

-The function names and parameter requirements will depend on

-the choice of the cryptographic toolkit selected.  Almost any

-toolkit supporting the reference implementations for each

-algorithm can be used.  The RSA BSAFE(r), OpenSSL, and Microsoft

-CryptoAPI libraries are all known to work well.

-

-

-Certificate Processing Method:

------------------------------

-

-The Certificate Processing Method for ZIP file encryption remains

-under development.  The information provided here serves as a guide

-to those interested in certificate-based data decryption.  This

-information may be subject to change in future versions of this

-specification and is subject to change without notice.

-

-OAEP Processing with Certificate-based Encryption:

-

-Versions of PKZIP available during this development phase of the

-certificate processing method may set a value of 61 into the

-version needed to extract field for a file.  This indicates that

-non-OAEP key wrapping is used.  This affects certificate encryption

-only, and password encryption functions should not be affected by

-this value.  This means values of 61 may be found on files encrypted

-with certificates only, or on files encrypted with both password

-encryption and certificate encryption.  Files encrypted with both

-methods can safely be decrypted using the password methods documented.

-

-OAEP stands for Optimal Asymmetric Encryption Padding.  It is a

-strengthening technique used for small encoded items such as decryption

-keys.  This is commonly applied in cryptographic key-wrapping techniques

-and is supported by PKCS #1.  Versions 5.0 and 6.0 of this specification

-were designed to support OAEP key-wrapping for certificate-based

-decryption keys for additional security.

-

-Support for private keys stored on Smart Cards or Tokens introduced

-a conflict with this OAEP logic.  Most card and token products do

-not support the additional strengthening applied to OAEP key-wrapped

-data.  In order to resolve this conflict, versions 6.1 and above of this

-specification will no longer support OAEP when encrypting using

-digital certificates.

-

-Certificate Processing Data Fields:

-

-The Certificate Processing Method of this specification defines the

-following additional data fields:

-

-

-1. Certificate Flag Values

-

-Additional processing flags that can be present in the Flags field of both

-the 0x0017 field of the central directory Extra Field and the Decryption

-header record preceding compressed file data are:

-

-         0x0007 - reserved for future use

-         0x000F - reserved for future use

-         0x0100 - Indicates non-OAEP key wrapping was used.  If this

-                  this field is set, the version needed to extract must

-                  be at least 61.  This means OAEP key wrapping is not

-                  used when generating a Master Session Key using

-                  ErdData.

-         0x4000 - ErdData must be decrypted using 3DES-168, otherwise use the

-                  same algorithm used for encrypting the file contents.

-         0x8000 - reserved for future use

-

-

-2. CertData - Extra Field 0x0017 record certificate data structure

-

-The data structure used to store certificate data within the section

-of the Extra Field defined by the CertData field of the 0x0017

-record are as shown:

-

-          Value     Size     Description

-          -----     ----     -----------

-          RCount    4 bytes  Number of recipients.

-          HashAlg   2 bytes  Hash algorithm identifier

-          HSize     2 bytes  Hash size

-          SRList    (var)    Simple list of recipients hashed public keys

-

-

-     RCount    This defines the number intended recipients whose

-               public keys were used for encryption.  This identifies

-               the number of elements in the SRList.

-

-     HashAlg   This defines the hash algorithm used to calculate

-               the public key hash of each public key used

-               for encryption. This field currently supports

-               only the following value for SHA-1

-

-               0x8004 - SHA1

-

-     HSize     This defines the size of a hashed public key.

-

-     SRList    This is a variable length list of the hashed

-               public keys for each intended recipient.  Each

-               element in this list is HSize.  The total size of

-               SRList is determined using RCount * HSize.

-

-

-3. Reserved1 - Certificate Decryption Header Reserved1 Data:

-

-          Value     Size     Description

-          -----     ----     -----------

-          RCount    4 bytes  Number of recipients.

-

-     RCount    This defines the number intended recipients whose

-               public keys were used for encryption.  This defines

-               the number of elements in the REList field defined below.

-

-

-4. Reserved2 - Certificate Decryption Header Reserved2 Data Structures:

-

-

-          Value     Size     Description

-          -----     ----     -----------

-          HashAlg   2 bytes  Hash algorithm identifier

-          HSize     2 bytes  Hash size

-          REList    (var)    List of recipient data elements

-

-

-     HashAlg   This defines the hash algorithm used to calculate

-               the public key hash of each public key used

-               for encryption. This field currently supports

-               only the following value for SHA-1

-

-               0x8004 - SHA1

-

-     HSize     This defines the size of a hashed public key

-               defined in REHData.

-

-     REList    This is a variable length of list of recipient data.

-               Each element in this list consists of a Recipient

-               Element data structure as follows:

-

-

-    Recipient Element (REList) Data Structure:

-

-          Value     Size     Description

-          -----     ----     -----------

-          RESize    2 bytes  Size of REHData + REKData

-          REHData   HSize    Hash of recipients public key

-          REKData   (var)    Simple key blob

-

-

-     RESize    This defines the size of an individual REList

-               element.  This value is the combined size of the

-               REHData field + REKData field.  REHData is defined by

-               HSize.  REKData is variable and can be calculated

-               for each REList element using RESize and HSize.

-

-     REHData   Hashed public key for this recipient.

-

-     REKData   Simple Key Blob.  The format of this data structure

-               is identical to that defined in the Microsoft

-               CryptoAPI and generated using the CryptExportKey()

-               function.  The version of the Simple Key Blob

-               supported at this time is 0x02 as defined by

-               Microsoft.

-

-5. Certificate Processing - Central Directory Encryption:

-

-Central Directory Encryption using Digital Certificates will

-operate in a manner similar to that of Single Password Central

-Directory Encryption.  This record will only be present when there

-is data to place into it.  Currently, data is placed into this

-record when digital certificates are used for either encrypting

-or signing the files within a ZIP file.  When only password

-encryption is used with no certificate encryption or digital

-signing, this record is not currently needed. When present, this

-record will appear before the start of the actual Central Directory

-data structure and will be located immediately after the Archive

-Decryption Header if the Central Directory is encrypted.

-

-The Archive Extra Data record will be used to store the following

-information.  Additional data may be added in future versions.

-

-Extra Data Fields:

-

-0x0014 - PKCS#7 Store for X.509 Certificates

-0x0016 - X.509 Certificate ID and Signature for central directory

-0x0019 - PKCS#7 Encryption Recipient Certificate List

-

-The 0x0014 and 0x0016 Extra Data records that otherwise would be

-located in the first record of the Central Directory for digital

-certificate processing. When encrypting or compressing the Central

-Directory, the 0x0014 and 0x0016 records must be located in the

-Archive Extra Data record and they should not remain in the first

-Central Directory record.  The Archive Extra Data record will also

-be used to store the 0x0019 data.

-

-When present, the size of the Archive Extra Data record will be

-included in the size of the Central Directory.  The data of the

-Archive Extra Data record will also be compressed and encrypted

-along with the Central Directory data structure.

-

-6. Certificate Processing Differences:

-

-The Certificate Processing Method of encryption differs from the

-Single Password Symmetric Encryption Method as follows.  Instead

-of using a user-defined password to generate a master session key,

-cryptographically random data is used.  The key material is then

-wrapped using standard key-wrapping techniques.  This key material

-is wrapped using the public key of each recipient that will need

-to decrypt the file using their corresponding private key.

-

-This specification currently assumes digital certificates will follow

-the X.509 V3 format for 1024 bit and higher RSA format digital

-certificates.  Implementation of this Certificate Processing Method

-requires supporting logic for key access and management.  This logic

-is outside the scope of this specification.

-

-

-License Agreement:

------------------

-

-The features set forth in this Section XIV (the "Strong Encryption

-Specification") are covered by a pending patent application. Portions of

-this Strong Encryption technology are available for use at no charge

-under the following terms and conditions.

-

-1. License Grant.

-

-   a. NOTICE TO USER. PLEASE READ THIS ENTIRE SECTION XIV OF THE

-   APPNOTE (THE "AGREEMENT") CAREFULLY. BY USING ALL OR ANY PORTION OF THE

-   LICENSED TECHNOLOGY, YOU ACCEPT ALL THE TERMS AND CONDITIONS OF THIS

-   AGREEMENT AND YOU AGREE THAT THIS AGREEMENT IS ENFORCEABLE LIKE ANY

-   WRITTEN NEGOTIATED AGREEMENT SIGNED BY YOU. IF YOU DO NOT AGREE, DO NOT

-   USE THE LICENSED TECHNOLOGY.

-

-   b. Definitions.

-

-      i. "Licensed Technology" shall mean that proprietary technology now or

-      hereafter owned or controlled by PKWare, Inc. ("PKWARE") or any

-      subsidiary or affiliate  that covers or is necessary to be used to give

-      software the ability to a) extract and decrypt data from zip files

-      encrypted using any methods of data encryption and key processing which

-      are published in this APPNOTE or any prior APPNOTE, as supplemented by

-      any Additional Compatibility Information; and b) encrypt file contents

-      as part of .ZIP file processing using only the Single Password Symmetric

-      Encryption Method as published in this APPNOTE or any prior APPNOTE, as

-      supplemented by any Additional Compatibility Information.  For purposes

-      of this AGREEMENT, "Additional Compatibility Information" means, with

-      regard to any method of data encryption and key processing published in

-      this or any prior APPNOTE, any corrections, additions, or clarifications

-      to the information in such APPNOTE that are required in order to give

-      software the ability to successfully extract and decrypt zip files (or,

-      but solely in the case of the Single Password Symmetric Encryption Method,

-      to successfully encrypt zip files) in a manner interoperable with the

-      actual implementation of such method in any PKWARE product that is

-      documented or publicly described by PKWARE as being able to create, or

-      to extract and decrypt, zip files using that method.

-

-      ii. "Licensed Products" shall mean any products you produce that

-      incorporate the Licensed Technology.

-

-   c. License to Licensed Technology.

-

-   PKWARE hereby grants to you a non-exclusive license to use the Licensed

-   Technology for the purpose of manufacturing, offering, selling and using

-   Licensed Products, which license shall extend to permit the practice of all

-   claims in any patent or patent application (collectively, "Patents") now or

-   hereafter owned or controlled by PKWARE in any jurisdiction in the world

-   that are infringed by implementation of the Licensed Technology.  You have

-   the right to sublicense rights you receive under the terms of this AGREEMENT

-   for the purpose of allowing sublicensee to manufacture, offer, sell and use

-   products that incorporate all or a portion of any of your Licensed Products,

-   but if you do, you agree to i) impose the same restrictions on any such

-   sublicensee as these terms impose on you and ii) notify the sublicensee,

-   by means chosen by you in your unfettered discretion, including a notice on

-   your web site, of the terms of this AGREEMENT and make available to each

-   sublicensee the full text of this APPNOTE.   Further, PKWARE hereby grants to

-   you a non-exclusive right to reproduce and distribute, in any form, copies of

-   this APPNOTE, without modification.  Notwithstanding anything to the contrary

-   in this AGREEMENT, you have the right to sublicense the rights, without any of

-   the restrictions described above or elsewhere in this AGREEMENT, to use, offer

-   to sell and sell Licensed Technology as incorporated in executable object code

-   or byte code forms of your Licensed Products.  Any sublicense to use the

-   Licensed Technology incorporated in a Licensed Product granted by you shall

-   survive the termination of this AGREEMENT for any reason.  PKWARE warrants that

-   this license shall continue to encumber the Licensed Technology regardless of

-   changes in ownership of the Licensed Technology.

-

-   d. Proprietary Notices.

-

-      i. With respect to any Licensed Product that is distributed by you either

-      in source code form or in the form of an object code library of externally

-      callable functions that has been designed by you for incorporation into third

-      party products, you agree to include, in the source code, or in the case of

-      an object code library, in accompanying documentation, a notice using the

-      words "patent pending" until a patent is issued to PKWARE covering any

-      portion of the Licensed Technology or PKWARE provides notice, by means

-      chosen by PKWARE in its unfettered discretion, that it no longer has any

-      patent pending covering any portion of the Licensed Technology.  With respect

-      to any Licensed Product, upon your becoming aware that at least one patent has

-      been granted covering the Licensed Technology, you agree to include in any

-      revisions made by you to the documentation (or any source code distributed

-      by you) the words "Pat. No.", or "Patent Number" and the patent number or

-      numbers of the applicable patent or patents.  PKWARE shall, from time to time,

-      inform you of the patent number or numbers of the patents covering the

-      Licensed Technology, by means chosen by PKWARE in its unfettered discretion,

-      including a notice on its web site.  It shall be a violation of the terms of

-      this AGREEMENT for you to sell Licensed Products without complying with the

-      foregoing marking provisions.

-

-      ii. You acknowledge that the terms of this AGREEMENT do not grant you any

-      license or other right to use any PKWARE trademark in connection with the sale,

-      offering for sale, distribution and delivery of the Licensed Products, or in

-      connection with the advertising, promotion and offering of the Licensed Products.

-      You acknowledge PKWARE's ownership of the PKZIP trademark and all other marks

-      owned by PKWARE.

-

-   e. Covenant of Compliance and Remedies.

-

-   To the extent that you have elected to implement portions of the Licensed

-   Technology, you agree to use reasonable diligence to comply with those portions

-   of this Section XIV, as modified or supplemented by Additional Compatibility

-   Information available to you, describing the portions of the Licensed Technology

-   that you have elected to implement.  Upon reasonable request by PKWARE, you will

-   provide written notice to PKWARE identifying which version of this APPNOTE you

-   have relied upon for your implementation of any specified Licensed Product.

-

-   If any substantial non-compliance with the terms of this AGREEMENT is determined

-   to exist, you will make such changes as necessary to bring your Licensed Products

-   into substantial compliance with the terms of this AGREEMENT.  If, within sixty

-   days of receipt of notice that a Licensed Product fails to comply with the terms

-   of this AGREEMENT, you fail to make such changes as necessary to bring your

-   Licensed Products into compliance with the terms of this AGREEMENT, PKWARE may

-   terminate your rights under this AGREEMENT.  PKWARE does not waive and expressly

-   reserves the right to pursue any and all additional remedies that are or may

-   become available to PKWARE.

-

-   f. Warranty and Indemnification Regarding Exportation.

-

-   You realize and acknowledge that, as between yourself and PKWARE, you are fully

-   responsible for compliance with the import and export laws and regulations of

-   any country in or to which you import or export any Licensed Products, and you

-   agree to hold PKWARE harmless from any claim of violation of any such import

-   or export laws.

-

-   g. Patent Infringement.

-

-   You agree that you will not bring or threaten to bring any action against PKWARE

-   for infringement of the claims of any patent owned or controlled by you solely

-   as a result of PKWARE's own implementation of the Licensed Technology.  As its

-   exclusive remedy for your breach of the foregoing agreement, PKWARE reserves

-   the right to suspend or terminate all rights granted under the terms of this

-   AGREEMENT if you bring or threaten to bring any such action against PKWARE,

-   effective immediately upon delivery of written notice of suspension or

-   termination to you.

-

-   h. Governing Law.

-

-   The license granted in this AGREEMENT shall be governed by and construed under

-   the laws of the State of Wisconsin and the United States.

-

-   i. Revisions and Notice.

-

-   The license granted in this APPNOTE is irrevocable, except as expressly set

-   forth above.  You agree and understand that any changes which PKWARE determines

-   to make to this APPNOTE shall be posted at the same location as the current

-   APPNOTE or at a location which will be identified by means chosen by PKWARE,

-   including a notice on its web site, and shall be available for adoption by you

-   immediately upon such posting, or at such other time as PKWARE shall determine.

-   Any changes to the terms of the license published in a subsequent version of

-   this AGREEMENT shall be binding upon you only with respect to your products

-   that (i) incorporate any Licensed Technology (as defined in the subsequent

-   AGREEMENT) that is not otherwise included in the definition of Licensed

-   Technology under this AGREEMENT, or (ii) that you expressly identify are to

-   be licensed under the subsequent AGREEMENT, which identification shall be by

-   written notice with reference to the APPNOTE (version and release date or other

-   unique identifier) in which the subsequent AGREEMENT is published.  PKWARE

-   agrees to identify each change to this APPNOTE by using a unique version and

-   release date identifier or other unique identifier.

-

-   j. Warranty by PKWARE

-

-   PKWare, Inc. warrants that it has the right to grant the license hereunder.

-

-XV. Change Process

-------------------

-

-In order for the .ZIP file format to remain a viable definition, this

-specification should be considered as open for periodic review and

-revision.  Although this format was originally designed with a

-certain level of extensibility, not all changes in technology

-(present or future) were or will be necessarily considered in its

-design.  If your application requires new definitions to the

-extensible sections in this format, or if you would like to

-submit new data structures, please forward your request to

-zipformat@pkware.com.  All submissions will be reviewed by the

-ZIP File Specification Committee for possible inclusion into

-future versions of this specification.  Periodic revisions

-to this specification will be published to ensure interoperability.

-We encourage comments and feedback that may help improve clarity

-or content.

-

-

-XVI. Acknowledgements

----------------------

-

-In addition to the above mentioned contributors to PKZIP and PKUNZIP,

-I would like to extend special thanks to Robert Mahoney for suggesting

-the extension .ZIP for this software.

-

-

-XVII. References

-----------------

-

-    Fiala, Edward R., and Greene, Daniel H., "Data compression with

-       finite windows",  Communications of the ACM, Volume 32, Number 4,

-       April 1989, pages 490-505.

-

-    Held, Gilbert, "Data Compression, Techniques and Applications,

-       Hardware and Software Considerations", John Wiley & Sons, 1987.

-

-    Huffman, D.A., "A method for the construction of minimum-redundancy

-       codes", Proceedings of the IRE, Volume 40, Number 9, September 1952,

-       pages 1098-1101.

-

-    Nelson, Mark, "LZW Data Compression", Dr. Dobbs Journal, Volume 14,

-       Number 10, October 1989, pages 29-37.

-

-    Nelson, Mark, "The Data Compression Book",  M&T Books, 1991.

-

-    Storer, James A., "Data Compression, Methods and Theory",

-       Computer Science Press, 1988

-

-    Welch, Terry, "A Technique for High-Performance Data Compression",

-       IEEE Computer, Volume 17, Number 6, June 1984, pages 8-19.

-

-    Ziv, J. and Lempel, A., "A universal algorithm for sequential data

-       compression", Communications of the ACM, Volume 30, Number 6,

-       June 1987, pages 520-540.

-

-    Ziv, J. and Lempel, A., "Compression of individual sequences via

-       variable-rate coding", IEEE Transactions on Information Theory,

-       Volume 24, Number 5, September 1978, pages 530-536.

diff --git a/docs/appnote.txt b/docs/appnote.txt
deleted file mode 100644
index 985f6f8..0000000
--- a/docs/appnote.txt
+++ /dev/null
@@ -1,3497 +0,0 @@
-File:    APPNOTE.TXT - .ZIP File Format Specification

-Version: 6.3.4 

-Status: Final - replaces version 6.3.3

-Revised: October 1, 2014

-Copyright (c) 1989 - 2014 PKWARE Inc., All Rights Reserved.

-

-1.0 Introduction

----------------

-

-1.1 Purpose

------------

-

-   1.1.1 This specification is intended to define a cross-platform,

-   interoperable file storage and transfer format.  Since its 

-   first publication in 1989, PKWARE, Inc. ("PKWARE") has remained 

-   committed to ensuring the interoperability of the .ZIP file 

-   format through periodic publication and maintenance of this 

-   specification.  We trust that all .ZIP compatible vendors and 

-   application developers that use and benefit from this format 

-   will share and support this commitment to interoperability.

-

-1.2 Scope

----------

-

-   1.2.1 ZIP is one of the most widely used compressed file formats. It is 

-   universally used to aggregate, compress, and encrypt files into a single

-   interoperable container. No specific use or application need is 

-   defined by this format and no specific implementation guidance is 

-   provided. This document provides details on the storage format for 

-   creating ZIP files.  Information is provided on the records and 

-   fields that describe what a ZIP file is. 

-

-1.3 Trademarks

---------------

-

-   1.3.1 PKWARE, PKZIP, SecureZIP, and PKSFX are registered trademarks of 

-   PKWARE, Inc. in the United States and elsewhere.  PKPatchMaker, 

-   Deflate64, and ZIP64 are trademarks of PKWARE, Inc.  Other marks 

-   referenced within this document appear for identification

-   purposes only and are the property of their respective owners.

-   

-

-1.4 Permitted Use

------------------ 

-

-   1.4.1 This document, "APPNOTE.TXT -  .ZIP File Format Specification" is the

-   exclusive property of PKWARE.  Use of the information contained in this 

-   document is permitted solely for the purpose of creating products, 

-   programs and processes that read and write files in the ZIP format

-   subject to the terms and conditions herein.

-

-   1.4.2 Use of the content of this document within other publications is 

-   permitted only through reference to this document.  Any reproduction

-   or distribution of this document in whole or in part without prior

-   written permission from PKWARE is strictly prohibited.

-

-   1.4.3 Certain technological components provided in this document are the 

-   patented proprietary technology of PKWARE and as such require a 

-   separate, executed license agreement from PKWARE.  Applicable 

-   components are marked with the following, or similar, statement: 

-   'Refer to the section in this document entitled  "Incorporating 

-   PKWARE Proprietary Technology into Your Product" for more information'.

-

-1.5 Contacting PKWARE

----------------------

-

-   1.5.1 If you have questions on this format, its use, or licensing, or if you 

-   wish to report defects, request changes or additions, please contact:

-

-     PKWARE, Inc.

-     201 E. Pittsburgh Avenue, Suite 400

-     Milwaukee, WI 53204

-     +1-414-289-9788

-     +1-414-289-9789 FAX

-     zipformat@pkware.com

-

-   1.5.2 Information about this format and copies of this document are publicly

-   available at:

-

-     http://www.pkware.com/appnote

-

-1.6 Disclaimer

---------------

-

-   1.6.1 Although PKWARE will attempt to supply current and accurate

-   information relating to its file formats, algorithms, and the

-   subject programs, the possibility of error or omission cannot 

-   be eliminated. PKWARE therefore expressly disclaims any warranty 

-   that the information contained in the associated materials relating 

-   to the subject programs and/or the format of the files created or

-   accessed by the subject programs and/or the algorithms used by

-   the subject programs, or any other matter, is current, correct or

-   accurate as delivered.  Any risk of damage due to any possible

-   inaccurate information is assumed by the user of the information.

-   Furthermore, the information relating to the subject programs

-   and/or the file formats created or accessed by the subject

-   programs and/or the algorithms used by the subject programs is

-   subject to change without notice.

-

-2.0 Revisions

---------------

-

-2.1 Document Status

---------------------

-

-   2.1.1 If the STATUS of this file is marked as DRAFT, the content 

-   defines proposed revisions to this specification which may consist 

-   of changes to the ZIP format itself, or that may consist of other 

-   content changes to this document.  Versions of this document and 

-   the format in DRAFT form may be subject to modification prior to 

-   publication STATUS of FINAL. DRAFT versions are published periodically 

-   to provide notification to the ZIP community of pending changes and to 

-   provide opportunity for review and comment.

-

-   2.1.2 Versions of this document having a STATUS of FINAL are 

-   considered to be in the final form for that version of the document 

-   and are not subject to further change until a new, higher version

-   numbered document is published.  Newer versions of this format 

-   specification are intended to remain interoperable with with all prior 

-   versions whenever technically possible.  

-

-2.2 Change Log

---------------

-

-   Version       Change Description                        Date

-   -------       ------------------                       ----------

-   5.2           -Single Password Symmetric Encryption    06/02/2003

-                  storage

-

-   6.1.0         -Smartcard compatibility                 01/20/2004

-                 -Documentation on certificate storage

-

-   6.2.0         -Introduction of Central Directory       04/26/2004

-                  Encryption for encrypting metadata

-                 -Added OS X to Version Made By values

-

-   6.2.1         -Added Extra Field placeholder for       04/01/2005

-                  POSZIP using ID 0x4690

-

-                 -Clarified size field on 

-                  "zip64 end of central directory record"

-

-   6.2.2         -Documented Final Feature Specification  01/06/2006

-                  for Strong Encryption

-

-                 -Clarifications and typographical 

-                  corrections

-

-   6.3.0         -Added tape positioning storage          09/29/2006

-                  parameters

-

-                 -Expanded list of supported hash algorithms

-

-                 -Expanded list of supported compression

-                  algorithms

-

-                 -Expanded list of supported encryption

-                  algorithms

-

-                 -Added option for Unicode filename 

-                  storage

-

-                 -Clarifications for consistent use

-                  of Data Descriptor records

-

-                 -Added additional "Extra Field" 

-                  definitions

-

-   6.3.1         -Corrected standard hash values for      04/11/2007

-                  SHA-256/384/512

-

-   6.3.2         -Added compression method 97             09/28/2007

-

-                 -Documented InfoZIP "Extra Field"

-                  values for UTF-8 file name and

-                  file comment storage

-

-   6.3.3         -Formatting changes to support           09/01/2012

-                  easier referencing of this APPNOTE

-                  from other documents and standards        

-

-   6.3.4         -Address change                          10/01/2014

-

-

-3.0 Notations

--------------

-

-   3.1 Use of the term MUST or SHALL indicates a required element. 

-

-   3.2 MAY NOT or SHALL NOT indicates an element is prohibited from use. 

-

-   3.3 SHOULD indicates a RECOMMENDED element.

-

-   3.4 SHOULD NOT indicates an element NOT RECOMMENDED for use.

-   

-   3.5 MAY indicates an OPTIONAL element.

-

-

-4.0 ZIP Files

--------------

-

-4.1 What is a ZIP file

-----------------------

-

-   4.1.1 ZIP files MAY be identified by the standard .ZIP file extension 

-   although use of a file extension is not required.  Use of the 

-   extension .ZIPX is also recognized and MAY be used for ZIP files.  

-   Other common file extensions using the ZIP format include .JAR, .WAR, 

-   .DOCX, .XLXS, .PPTX, .ODT, .ODS, .ODP and others. Programs reading or 

-   writing ZIP files SHOULD rely on internal record signatures described 

-   in this document to identify files in this format.

-

-   4.1.2 ZIP files SHOULD contain at least one file and MAY contain 

-   multiple files.  

-

-   4.1.3 Data compression MAY be used to reduce the size of files

-   placed into a ZIP file, but is not required.  This format supports the 

-   use of multiple data compression algorithms.  When compression is used, 

-   one of the documented compression algorithms MUST be used.  Implementors 

-   are advised to experiment with their data to determine which of the 

-   available algorithms provides the best compression for their needs.

-   Compression method 8 (Deflate) is the method used by default by most 

-   ZIP compatible application programs.  

-

-

-   4.1.4 Data encryption MAY be used to protect files within a ZIP file. 

-   Keying methods supported for encryption within this format include

-   passwords and public/private keys.  Either MAY be used individually

-   or in combination. Encryption MAY be applied to individual files.  

-   Additional security MAY be used through the encryption of ZIP file 

-   metadata stored within the Central Directory. See the section on the 

-   Strong Encryption Specification for information. Refer to the section 

-   in this document entitled "Incorporating PKWARE Proprietary Technology 

-   into Your Product" for more information.

-

-   4.1.5 Data integrity MUST be provided for each file using CRC32.  

-   

-   4.1.6 Additional data integrity MAY be included through the use of 

-   digital signatures.  Individual files MAY be signed with one or more 

-   digital signatures. The Central Directory, if signed, MUST use a 

-   single signature.  

-

-   4.1.7 Files MAY be placed within a ZIP file uncompressed or stored. 

-   The term "stored" as used in the context of this document means the file 

-   is copied into the ZIP file uncompressed.  

-

-   4.1.8 Each data file placed into a ZIP file MAY be compressed, stored, 

-   encrypted or digitally signed independent of how other data files in the 

-   same ZIP file are archived.

-

-   4.1.9 ZIP files MAY be streamed, split into segments (on fixed or on

-   removable media) or "self-extracting".  Self-extracting ZIP 

-   files MUST include extraction code for a target platform within 

-   the ZIP file.  

-

-   4.1.10 Extensibility is provided for platform or application specific

-   needs through extra data fields that MAY be defined for custom

-   purposes.  Extra data definitions MUST NOT conflict with existing

-   documented record definitions.  

-

-   4.1.11 Common uses for ZIP MAY also include the use of manifest files.  

-   Manifest files store application specific information within a file stored 

-   within the ZIP file.  This manifest file SHOULD be the first file in the 

-   ZIP file. This specification does not provide any information or guidance on 

-   the use of manifest files within ZIP files.  Refer to the application developer

-   for information on using manifest files and for any additional profile

-   information on using ZIP within an application.

-

-   4.1.12 ZIP files MAY be placed within other ZIP files.

-

-4.2 ZIP Metadata

-----------------

-

-   4.2.1 ZIP files are identified by metadata consisting of defined record types 

-   containing the storage information necessary for maintaining the files 

-   placed into a ZIP file.  Each record type MUST be identified using a header 

-   signature that identifies the record type.  Signature values begin with the 

-   two byte constant marker of 0x4b50, representing the characters "PK".

-

-

-4.3 General Format of a .ZIP file

----------------------------------

-

-   4.3.1 A ZIP file MUST contain an "end of central directory record". A ZIP 

-   file containing only an "end of central directory record" is considered an 

-   empty ZIP file.  Files may be added or replaced within a ZIP file, or deleted. 

-   A ZIP file MUST have only one "end of central directory record".  Other 

-   records defined in this specification MAY be used as needed to support 

-   storage requirements for individual ZIP files.

-

-   4.3.2 Each file placed into a ZIP file MUST be preceeded by  a "local 

-   file header" record for that file.  Each "local file header" MUST be 

-   accompanied by a corresponding "central directory header" record within 

-   the central directory section of the ZIP file.

-

-   4.3.3 Files MAY be stored in arbitrary order within a ZIP file.  A ZIP 

-   file MAY span multiple volumes or it MAY be split into user-defined 

-   segment sizes. All values MUST be stored in little-endian byte order unless 

-   otherwise specified in this document for a specific data element. 

-

-   4.3.4 Compression MUST NOT be applied to a "local file header", an "encryption

-   header", or an "end of central directory record".  Individual "central 

-   directory records" must not be compressed, but the aggregate of all central

-   directory records MAY be compressed.    

-

-   4.3.5 File data MAY be followed by a "data descriptor" for the file.  Data 

-   descriptors are used to facilitate ZIP file streaming.  

-

- 

-   4.3.6 Overall .ZIP file format:

-

-      [local file header 1]

-      [encryption header 1]

-      [file data 1]

-      [data descriptor 1]

-      . 

-      .

-      .

-      [local file header n]

-      [encryption header n]

-      [file data n]

-      [data descriptor n]

-      [archive decryption header] 

-      [archive extra data record] 

-      [central directory header 1]

-      .

-      .

-      .

-      [central directory header n]

-      [zip64 end of central directory record]

-      [zip64 end of central directory locator] 

-      [end of central directory record]

-

-

-   4.3.7  Local file header:

-

-      local file header signature     4 bytes  (0x04034b50)

-      version needed to extract       2 bytes

-      general purpose bit flag        2 bytes

-      compression method              2 bytes

-      last mod file time              2 bytes

-      last mod file date              2 bytes

-      crc-32                          4 bytes

-      compressed size                 4 bytes

-      uncompressed size               4 bytes

-      file name length                2 bytes

-      extra field length              2 bytes

-

-      file name (variable size)

-      extra field (variable size)

-

-   4.3.8  File data

-

-      Immediately following the local header for a file

-      SHOULD be placed the compressed or stored data for the file.

-      If the file is encrypted, the encryption header for the file 

-      SHOULD be placed after the local header and before the file 

-      data. The series of [local file header][encryption header]

-      [file data][data descriptor] repeats for each file in the 

-      .ZIP archive. 

-

-      Zero-byte files, directories, and other file types that 

-      contain no content MUST not include file data.

-

-   4.3.9  Data descriptor:

-

-        crc-32                          4 bytes

-        compressed size                 4 bytes

-        uncompressed size               4 bytes

-

-      4.3.9.1 This descriptor MUST exist if bit 3 of the general

-      purpose bit flag is set (see below).  It is byte aligned

-      and immediately follows the last byte of compressed data.

-      This descriptor SHOULD be used only when it was not possible to

-      seek in the output .ZIP file, e.g., when the output .ZIP file

-      was standard output or a non-seekable device.  For ZIP64(tm) format

-      archives, the compressed and uncompressed sizes are 8 bytes each.

-

-      4.3.9.2 When compressing files, compressed and uncompressed sizes 

-      should be stored in ZIP64 format (as 8 byte values) when a 

-      file's size exceeds 0xFFFFFFFF.   However ZIP64 format may be 

-      used regardless of the size of a file.  When extracting, if 

-      the zip64 extended information extra field is present for 

-      the file the compressed and uncompressed sizes will be 8

-      byte values.  

-

-      4.3.9.3 Although not originally assigned a signature, the value 

-      0x08074b50 has commonly been adopted as a signature value 

-      for the data descriptor record.  Implementers should be 

-      aware that ZIP files may be encountered with or without this 

-      signature marking data descriptors and SHOULD account for

-      either case when reading ZIP files to ensure compatibility.

-

-      4.3.9.4 When writing ZIP files, implementors SHOULD include the

-      signature value marking the data descriptor record.  When

-      the signature is used, the fields currently defined for

-      the data descriptor record will immediately follow the

-      signature.

-

-      4.3.9.5 An extensible data descriptor will be released in a 

-      future version of this APPNOTE.  This new record is intended to

-      resolve conflicts with the use of this record going forward,

-      and to provide better support for streamed file processing.

-

-      4.3.9.6 When the Central Directory Encryption method is used, 

-      the data descriptor record is not required, but MAY be used.  

-      If present, and bit 3 of the general purpose bit field is set to 

-      indicate its presence, the values in fields of the data descriptor

-      record MUST be set to binary zeros.  See the section on the Strong 

-      Encryption Specification for information. Refer to the section in 

-      this document entitled "Incorporating PKWARE Proprietary Technology 

-      into Your Product" for more information.

-

-

-   4.3.10  Archive decryption header:  

-

-      4.3.10.1 The Archive Decryption Header is introduced in version 6.2

-      of the ZIP format specification.  This record exists in support

-      of the Central Directory Encryption Feature implemented as part of 

-      the Strong Encryption Specification as described in this document.

-      When the Central Directory Structure is encrypted, this decryption

-      header MUST precede the encrypted data segment.  

-

-      4.3.10.2 The encrypted data segment SHALL consist of the Archive 

-      extra data record (if present) and the encrypted Central Directory 

-      Structure data.  The format of this data record is identical to the 

-      Decryption header record preceding compressed file data.  If the 

-      central directory structure is encrypted, the location of the start of

-      this data record is determined using the Start of Central Directory

-      field in the Zip64 End of Central Directory record.  See the 

-      section on the Strong Encryption Specification for information

-      on the fields used in the Archive Decryption Header record.

-      Refer to the section in this document entitled "Incorporating 

-      PKWARE Proprietary Technology into Your Product" for more information.

-

-

-   4.3.11  Archive extra data record: 

-

-        archive extra data signature    4 bytes  (0x08064b50)

-        extra field length              4 bytes

-        extra field data                (variable size)

-

-      4.3.11.1 The Archive Extra Data Record is introduced in version 6.2

-      of the ZIP format specification.  This record MAY be used in support

-      of the Central Directory Encryption Feature implemented as part of 

-      the Strong Encryption Specification as described in this document.

-      When present, this record MUST immediately precede the central 

-      directory data structure.  

-

-      4.3.11.2 The size of this data record SHALL be included in the 

-      Size of the Central Directory field in the End of Central 

-      Directory record.  If the central directory structure is compressed, 

-      but not encrypted, the location of the start of this data record is 

-      determined using the Start of Central Directory field in the Zip64 

-      End of Central Directory record. Refer to the section in this document 

-      entitled "Incorporating PKWARE Proprietary Technology into Your 

-      Product" for more information.

-

-   4.3.12  Central directory structure:

-

-      [central directory header 1]

-      .

-      .

-      . 

-      [central directory header n]

-      [digital signature] 

-

-      File header:

-

-        central file header signature   4 bytes  (0x02014b50)

-        version made by                 2 bytes

-        version needed to extract       2 bytes

-        general purpose bit flag        2 bytes

-        compression method              2 bytes

-        last mod file time              2 bytes

-        last mod file date              2 bytes

-        crc-32                          4 bytes

-        compressed size                 4 bytes

-        uncompressed size               4 bytes

-        file name length                2 bytes

-        extra field length              2 bytes

-        file comment length             2 bytes

-        disk number start               2 bytes

-        internal file attributes        2 bytes

-        external file attributes        4 bytes

-        relative offset of local header 4 bytes

-

-        file name (variable size)

-        extra field (variable size)

-        file comment (variable size)

-

-   4.3.13 Digital signature:

-

-        header signature                4 bytes  (0x05054b50)

-        size of data                    2 bytes

-        signature data (variable size)

-

-      With the introduction of the Central Directory Encryption 

-      feature in version 6.2 of this specification, the Central 

-      Directory Structure MAY be stored both compressed and encrypted. 

-      Although not required, it is assumed when encrypting the

-      Central Directory Structure, that it will be compressed

-      for greater storage efficiency.  Information on the

-      Central Directory Encryption feature can be found in the section

-      describing the Strong Encryption Specification. The Digital 

-      Signature record will be neither compressed nor encrypted.

-

-   4.3.14  Zip64 end of central directory record

-

-        zip64 end of central dir 

-        signature                       4 bytes  (0x06064b50)

-        size of zip64 end of central

-        directory record                8 bytes

-        version made by                 2 bytes

-        version needed to extract       2 bytes

-        number of this disk             4 bytes

-        number of the disk with the 

-        start of the central directory  4 bytes

-        total number of entries in the

-        central directory on this disk  8 bytes

-        total number of entries in the

-        central directory               8 bytes

-        size of the central directory   8 bytes

-        offset of start of central

-        directory with respect to

-        the starting disk number        8 bytes

-        zip64 extensible data sector    (variable size)

-

-      4.3.14.1 The value stored into the "size of zip64 end of central

-      directory record" should be the size of the remaining

-      record and should not include the leading 12 bytes.

-  

-      Size = SizeOfFixedFields + SizeOfVariableData - 12.

-

-      4.3.14.2 The above record structure defines Version 1 of the 

-      zip64 end of central directory record. Version 1 was 

-      implemented in versions of this specification preceding 

-      6.2 in support of the ZIP64 large file feature. The 

-      introduction of the Central Directory Encryption feature 

-      implemented in version 6.2 as part of the Strong Encryption 

-      Specification defines Version 2 of this record structure. 

-      Refer to the section describing the Strong Encryption 

-      Specification for details on the version 2 format for 

-      this record. Refer to the section in this document entitled 

-      "Incorporating PKWARE Proprietary Technology into Your Product"

-      for more information applicable to use of Version 2 of this

-      record.

-

-      4.3.14.3 Special purpose data MAY reside in the zip64 extensible 

-      data sector field following either a V1 or V2 version of this

-      record.  To ensure identification of this special purpose data

-      it must include an identifying header block consisting of the

-      following:

-

-         Header ID  -  2 bytes

-         Data Size  -  4 bytes

-

-      The Header ID field indicates the type of data that is in the 

-      data block that follows.

-

-      Data Size identifies the number of bytes that follow for this

-      data block type.

-

-      4.3.14.4 Multiple special purpose data blocks MAY be present. 

-      Each MUST be preceded by a Header ID and Data Size field.  Current

-      mappings of Header ID values supported in this field are as

-      defined in APPENDIX C.

-

-   4.3.15 Zip64 end of central directory locator

-

-      zip64 end of central dir locator 

-      signature                       4 bytes  (0x07064b50)

-      number of the disk with the

-      start of the zip64 end of 

-      central directory               4 bytes

-      relative offset of the zip64

-      end of central directory record 8 bytes

-      total number of disks           4 bytes

-        

-   4.3.16  End of central directory record:

-

-      end of central dir signature    4 bytes  (0x06054b50)

-      number of this disk             2 bytes

-      number of the disk with the

-      start of the central directory  2 bytes

-      total number of entries in the

-      central directory on this disk  2 bytes

-      total number of entries in

-      the central directory           2 bytes

-      size of the central directory   4 bytes

-      offset of start of central

-      directory with respect to

-      the starting disk number        4 bytes

-      .ZIP file comment length        2 bytes

-      .ZIP file comment       (variable size)

-                

-4.4  Explanation of fields

---------------------------

-      

-   4.4.1 General notes on fields

-

-      4.4.1.1  All fields unless otherwise noted are unsigned and stored

-      in Intel low-byte:high-byte, low-word:high-word order.

-

-      4.4.1.2  String fields are not null terminated, since the length 

-      is given explicitly.

-

-      4.4.1.3  The entries in the central directory may not necessarily

-      be in the same order that files appear in the .ZIP file.

-

-      4.4.1.4  If one of the fields in the end of central directory

-      record is too small to hold required data, the field should be 

-      set to -1 (0xFFFF or 0xFFFFFFFF) and the ZIP64 format record 

-      should be created.

-

-      4.4.1.5  The end of central directory record and the Zip64 end 

-      of central directory locator record MUST reside on the same 

-      disk when splitting or spanning an archive.

-

-   4.4.2 version made by (2 bytes)

-

-        4.4.2.1 The upper byte indicates the compatibility of the file

-        attribute information.  If the external file attributes 

-        are compatible with MS-DOS and can be read by PKZIP for 

-        DOS version 2.04g then this value will be zero.  If these 

-        attributes are not compatible, then this value will 

-        identify the host system on which the attributes are 

-        compatible.  Software can use this information to determine

-        the line record format for text files etc.  

-

-        4.4.2.2 The current mappings are:

-

-         0 - MS-DOS and OS/2 (FAT / VFAT / FAT32 file systems)

-         1 - Amiga                     2 - OpenVMS

-         3 - UNIX                      4 - VM/CMS

-         5 - Atari ST                  6 - OS/2 H.P.F.S.

-         7 - Macintosh                 8 - Z-System

-         9 - CP/M                     10 - Windows NTFS

-        11 - MVS (OS/390 - Z/OS)      12 - VSE

-        13 - Acorn Risc               14 - VFAT

-        15 - alternate MVS            16 - BeOS

-        17 - Tandem                   18 - OS/400

-        19 - OS X (Darwin)            20 thru 255 - unused

-

-        4.4.2.3 The lower byte indicates the ZIP specification version 

-        (the version of this document) supported by the software 

-        used to encode the file.  The value/10 indicates the major 

-        version number, and the value mod 10 is the minor version 

-        number.  

-

-   4.4.3 version needed to extract (2 bytes)

-

-        4.4.3.1 The minimum supported ZIP specification version needed 

-        to extract the file, mapped as above.  This value is based on 

-        the specific format features a ZIP program MUST support to 

-        be able to extract the file.  If multiple features are

-        applied to a file, the minimum version MUST be set to the 

-        feature having the highest value. New features or feature 

-        changes affecting the published format specification will be 

-        implemented using higher version numbers than the last 

-        published value to avoid conflict.

-

-        4.4.3.2 Current minimum feature versions are as defined below:

-

-         1.0 - Default value

-         1.1 - File is a volume label

-         2.0 - File is a folder (directory)

-         2.0 - File is compressed using Deflate compression

-         2.0 - File is encrypted using traditional PKWARE encryption

-         2.1 - File is compressed using Deflate64(tm)

-         2.5 - File is compressed using PKWARE DCL Implode 

-         2.7 - File is a patch data set 

-         4.5 - File uses ZIP64 format extensions

-         4.6 - File is compressed using BZIP2 compression*

-         5.0 - File is encrypted using DES

-         5.0 - File is encrypted using 3DES

-         5.0 - File is encrypted using original RC2 encryption

-         5.0 - File is encrypted using RC4 encryption

-         5.1 - File is encrypted using AES encryption

-         5.1 - File is encrypted using corrected RC2 encryption**

-         5.2 - File is encrypted using corrected RC2-64 encryption**

-         6.1 - File is encrypted using non-OAEP key wrapping***

-         6.2 - Central directory encryption

-         6.3 - File is compressed using LZMA

-         6.3 - File is compressed using PPMd+

-         6.3 - File is encrypted using Blowfish

-         6.3 - File is encrypted using Twofish

-

-        4.4.3.3 Notes on version needed to extract 

-

-        * Early 7.x (pre-7.2) versions of PKZIP incorrectly set the

-        version needed to extract for BZIP2 compression to be 50

-        when it should have been 46.

-

-        ** Refer to the section on Strong Encryption Specification

-        for additional information regarding RC2 corrections.

-

-        *** Certificate encryption using non-OAEP key wrapping is the

-        intended mode of operation for all versions beginning with 6.1.

-        Support for OAEP key wrapping MUST only be used for

-        backward compatibility when sending ZIP files to be opened by

-        versions of PKZIP older than 6.1 (5.0 or 6.0).

-

-        + Files compressed using PPMd MUST set the version

-        needed to extract field to 6.3, however, not all ZIP 

-        programs enforce this and may be unable to decompress 

-        data files compressed using PPMd if this value is set.

-

-        When using ZIP64 extensions, the corresponding value in the

-        zip64 end of central directory record MUST also be set.  

-        This field should be set appropriately to indicate whether 

-        Version 1 or Version 2 format is in use. 

-

-

-   4.4.4 general purpose bit flag: (2 bytes)

-

-        Bit 0: If set, indicates that the file is encrypted.

-

-        (For Method 6 - Imploding)

-        Bit 1: If the compression method used was type 6,

-               Imploding, then this bit, if set, indicates

-               an 8K sliding dictionary was used.  If clear,

-               then a 4K sliding dictionary was used.

-

-        Bit 2: If the compression method used was type 6,

-               Imploding, then this bit, if set, indicates

-               3 Shannon-Fano trees were used to encode the

-               sliding dictionary output.  If clear, then 2

-               Shannon-Fano trees were used.

-

-        (For Methods 8 and 9 - Deflating)

-        Bit 2  Bit 1

-          0      0    Normal (-en) compression option was used.

-          0      1    Maximum (-exx/-ex) compression option was used.

-          1      0    Fast (-ef) compression option was used.

-          1      1    Super Fast (-es) compression option was used.

-

-        (For Method 14 - LZMA)

-        Bit 1: If the compression method used was type 14,

-               LZMA, then this bit, if set, indicates

-               an end-of-stream (EOS) marker is used to

-               mark the end of the compressed data stream.

-               If clear, then an EOS marker is not present

-               and the compressed data size must be known

-               to extract.

-

-        Note:  Bits 1 and 2 are undefined if the compression

-               method is any other.

-

-        Bit 3: If this bit is set, the fields crc-32, compressed 

-               size and uncompressed size are set to zero in the 

-               local header.  The correct values are put in the 

-               data descriptor immediately following the compressed

-               data.  (Note: PKZIP version 2.04g for DOS only 

-               recognizes this bit for method 8 compression, newer 

-               versions of PKZIP recognize this bit for any 

-               compression method.)

-

-        Bit 4: Reserved for use with method 8, for enhanced

-               deflating. 

-

-        Bit 5: If this bit is set, this indicates that the file is 

-               compressed patched data.  (Note: Requires PKZIP 

-               version 2.70 or greater)

-

-        Bit 6: Strong encryption.  If this bit is set, you MUST

-               set the version needed to extract value to at least

-               50 and you MUST also set bit 0.  If AES encryption

-               is used, the version needed to extract value MUST 

-               be at least 51. See the section describing the Strong

-               Encryption Specification for details.  Refer to the 

-               section in this document entitled "Incorporating PKWARE 

-               Proprietary Technology into Your Product" for more 

-               information.

-

-        Bit 7: Currently unused.

-

-        Bit 8: Currently unused.

-

-        Bit 9: Currently unused.

-

-        Bit 10: Currently unused.

-

-        Bit 11: Language encoding flag (EFS).  If this bit is set,

-                the filename and comment fields for this file

-                MUST be encoded using UTF-8. (see APPENDIX D)

-

-        Bit 12: Reserved by PKWARE for enhanced compression.

-

-        Bit 13: Set when encrypting the Central Directory to indicate 

-                selected data values in the Local Header are masked to

-                hide their actual values.  See the section describing 

-                the Strong Encryption Specification for details.  Refer

-                to the section in this document entitled "Incorporating 

-                PKWARE Proprietary Technology into Your Product" for 

-                more information.

-

-        Bit 14: Reserved by PKWARE.

-

-        Bit 15: Reserved by PKWARE.

-

-   4.4.5 compression method: (2 bytes)

-

-        0 - The file is stored (no compression)

-        1 - The file is Shrunk

-        2 - The file is Reduced with compression factor 1

-        3 - The file is Reduced with compression factor 2

-        4 - The file is Reduced with compression factor 3

-        5 - The file is Reduced with compression factor 4

-        6 - The file is Imploded

-        7 - Reserved for Tokenizing compression algorithm

-        8 - The file is Deflated

-        9 - Enhanced Deflating using Deflate64(tm)

-       10 - PKWARE Data Compression Library Imploding (old IBM TERSE)

-       11 - Reserved by PKWARE

-       12 - File is compressed using BZIP2 algorithm

-       13 - Reserved by PKWARE

-       14 - LZMA (EFS)

-       15 - Reserved by PKWARE

-       16 - Reserved by PKWARE

-       17 - Reserved by PKWARE

-       18 - File is compressed using IBM TERSE (new)

-       19 - IBM LZ77 z Architecture (PFS)

-       97 - WavPack compressed data

-       98 - PPMd version I, Rev 1

-

-

-   4.4.6 date and time fields: (2 bytes each)

-

-       The date and time are encoded in standard MS-DOS format.

-       If input came from standard input, the date and time are

-       those at which compression was started for this data. 

-       If encrypting the central directory and general purpose bit 

-       flag 13 is set indicating masking, the value stored in the 

-       Local Header will be zero. 

-

-   4.4.7 CRC-32: (4 bytes)

-

-       The CRC-32 algorithm was generously contributed by

-       David Schwaderer and can be found in his excellent

-       book "C Programmers Guide to NetBIOS" published by

-       Howard W. Sams & Co. Inc.  The 'magic number' for

-       the CRC is 0xdebb20e3.  The proper CRC pre and post

-       conditioning is used, meaning that the CRC register

-       is pre-conditioned with all ones (a starting value

-       of 0xffffffff) and the value is post-conditioned by

-       taking the one's complement of the CRC residual.

-       If bit 3 of the general purpose flag is set, this

-       field is set to zero in the local header and the correct

-       value is put in the data descriptor and in the central

-       directory. When encrypting the central directory, if the

-       local header is not in ZIP64 format and general purpose 

-       bit flag 13 is set indicating masking, the value stored 

-       in the Local Header will be zero. 

-

-   4.4.8 compressed size: (4 bytes)

-   4.4.9 uncompressed size: (4 bytes)

-

-       The size of the file compressed (4.4.8) and uncompressed,

-       (4.4.9) respectively.  When a decryption header is present it 

-       will be placed in front of the file data and the value of the

-       compressed file size will include the bytes of the decryption

-       header.  If bit 3 of the general purpose bit flag is set, 

-       these fields are set to zero in the local header and the 

-       correct values are put in the data descriptor and

-       in the central directory.  If an archive is in ZIP64 format

-       and the value in this field is 0xFFFFFFFF, the size will be

-       in the corresponding 8 byte ZIP64 extended information 

-       extra field.  When encrypting the central directory, if the

-       local header is not in ZIP64 format and general purpose bit 

-       flag 13 is set indicating masking, the value stored for the 

-       uncompressed size in the Local Header will be zero. 

-

-   4.4.10 file name length: (2 bytes)

-   4.4.11 extra field length: (2 bytes)

-   4.4.12 file comment length: (2 bytes)

-

-       The length of the file name, extra field, and comment

-       fields respectively.  The combined length of any

-       directory record and these three fields should not

-       generally exceed 65,535 bytes.  If input came from standard

-       input, the file name length is set to zero.  

-

-

-   4.4.13 disk number start: (2 bytes)

-

-       The number of the disk on which this file begins.  If an 

-       archive is in ZIP64 format and the value in this field is 

-       0xFFFF, the size will be in the corresponding 4 byte zip64 

-       extended information extra field.

-

-   4.4.14 internal file attributes: (2 bytes)

-

-       Bits 1 and 2 are reserved for use by PKWARE.

-

-       4.4.14.1 The lowest bit of this field indicates, if set, 

-       that the file is apparently an ASCII or text file.  If not

-       set, that the file apparently contains binary data.

-       The remaining bits are unused in version 1.0.

-

-       4.4.14.2 The 0x0002 bit of this field indicates, if set, that 

-       a 4 byte variable record length control field precedes each 

-       logical record indicating the length of the record. The 

-       record length control field is stored in little-endian byte

-       order.  This flag is independent of text control characters, 

-       and if used in conjunction with text data, includes any 

-       control characters in the total length of the record. This 

-       value is provided for mainframe data transfer support.

-

-   4.4.15 external file attributes: (4 bytes)

-

-       The mapping of the external attributes is

-       host-system dependent (see 'version made by').  For

-       MS-DOS, the low order byte is the MS-DOS directory

-       attribute byte.  If input came from standard input, this

-       field is set to zero.

-

-   4.4.16 relative offset of local header: (4 bytes)

-

-       This is the offset from the start of the first disk on

-       which this file appears, to where the local header should

-       be found.  If an archive is in ZIP64 format and the value

-       in this field is 0xFFFFFFFF, the size will be in the 

-       corresponding 8 byte zip64 extended information extra field.

-

-   4.4.17 file name: (Variable)

-

-       4.4.17.1 The name of the file, with optional relative path.

-       The path stored MUST not contain a drive or

-       device letter, or a leading slash.  All slashes

-       MUST be forward slashes '/' as opposed to

-       backwards slashes '\' for compatibility with Amiga

-       and UNIX file systems etc.  If input came from standard

-       input, there is no file name field.  

-

-       4.4.17.2 If using the Central Directory Encryption Feature and 

-       general purpose bit flag 13 is set indicating masking, the file 

-       name stored in the Local Header will not be the actual file name.  

-       A masking value consisting of a unique hexadecimal value will 

-       be stored.  This value will be sequentially incremented for each 

-       file in the archive. See the section on the Strong Encryption 

-       Specification for details on retrieving the encrypted file name. 

-       Refer to the section in this document entitled "Incorporating PKWARE 

-       Proprietary Technology into Your Product" for more information.

-

-

-   4.4.18 file comment: (Variable)

-

-       The comment for this file.

-

-   4.4.19 number of this disk: (2 bytes)

-

-       The number of this disk, which contains central

-       directory end record. If an archive is in ZIP64 format

-       and the value in this field is 0xFFFF, the size will 

-       be in the corresponding 4 byte zip64 end of central 

-       directory field.

-

-

-   4.4.20 number of the disk with the start of the central

-            directory: (2 bytes)

-

-       The number of the disk on which the central

-       directory starts. If an archive is in ZIP64 format

-       and the value in this field is 0xFFFF, the size will 

-       be in the corresponding 4 byte zip64 end of central 

-       directory field.

-

-   4.4.21 total number of entries in the central dir on 

-          this disk: (2 bytes)

-

-      The number of central directory entries on this disk.

-      If an archive is in ZIP64 format and the value in 

-      this field is 0xFFFF, the size will be in the 

-      corresponding 8 byte zip64 end of central 

-      directory field.

-

-   4.4.22 total number of entries in the central dir: (2 bytes)

-

-      The total number of files in the .ZIP file. If an 

-      archive is in ZIP64 format and the value in this field

-      is 0xFFFF, the size will be in the corresponding 8 byte 

-      zip64 end of central directory field.

-

-   4.4.23 size of the central directory: (4 bytes)

-

-      The size (in bytes) of the entire central directory.

-      If an archive is in ZIP64 format and the value in 

-      this field is 0xFFFFFFFF, the size will be in the 

-      corresponding 8 byte zip64 end of central 

-      directory field.

-

-   4.4.24 offset of start of central directory with respect to

-          the starting disk number:  (4 bytes)

-

-      Offset of the start of the central directory on the

-      disk on which the central directory starts. If an 

-      archive is in ZIP64 format and the value in this 

-      field is 0xFFFFFFFF, the size will be in the 

-      corresponding 8 byte zip64 end of central 

-      directory field.

-

-   4.4.25 .ZIP file comment length: (2 bytes)

-

-      The length of the comment for this .ZIP file.

-

-   4.4.26 .ZIP file comment: (Variable)

-

-      The comment for this .ZIP file.  ZIP file comment data

-      is stored unsecured.  No encryption or data authentication

-      is applied to this area at this time.  Confidential information

-      should not be stored in this section.

-

-   4.4.27 zip64 extensible data sector    (variable size)

-

-      (currently reserved for use by PKWARE)

-

-

-   4.4.28 extra field: (Variable)

-

-     This SHOULD be used for storage expansion.  If additional 

-     information needs to be stored within a ZIP file for special 

-     application or platform needs, it SHOULD be stored here.  

-     Programs supporting earlier versions of this specification can 

-     then safely skip the file, and find the next file or header.  

-     This field will be 0 length in version 1.0.  

-

-     Existing extra fields are defined in the section

-     Extensible data fields that follows.

-

-4.5 Extensible data fields

---------------------------

-

-   4.5.1 In order to allow different programs and different types

-   of information to be stored in the 'extra' field in .ZIP

-   files, the following structure MUST be used for all

-   programs storing data in this field:

-

-       header1+data1 + header2+data2 . . .

-

-   Each header should consist of:

-

-       Header ID - 2 bytes

-       Data Size - 2 bytes

-

-   Note: all fields stored in Intel low-byte/high-byte order.

-

-   The Header ID field indicates the type of data that is in

-   the following data block.

-

-   Header IDs of 0 thru 31 are reserved for use by PKWARE.

-   The remaining IDs can be used by third party vendors for

-   proprietary usage.

-

-   4.5.2 The current Header ID mappings defined by PKWARE are:

-

-      0x0001        Zip64 extended information extra field

-      0x0007        AV Info

-      0x0008        Reserved for extended language encoding data (PFS)

-                    (see APPENDIX D)

-      0x0009        OS/2

-      0x000a        NTFS 

-      0x000c        OpenVMS

-      0x000d        UNIX

-      0x000e        Reserved for file stream and fork descriptors

-      0x000f        Patch Descriptor

-      0x0014        PKCS#7 Store for X.509 Certificates

-      0x0015        X.509 Certificate ID and Signature for 

-                    individual file

-      0x0016        X.509 Certificate ID for Central Directory

-      0x0017        Strong Encryption Header

-      0x0018        Record Management Controls

-      0x0019        PKCS#7 Encryption Recipient Certificate List

-      0x0065        IBM S/390 (Z390), AS/400 (I400) attributes 

-                    - uncompressed

-      0x0066        Reserved for IBM S/390 (Z390), AS/400 (I400) 

-                    attributes - compressed

-      0x4690        POSZIP 4690 (reserved) 

-

-

-   4.5.3 -Zip64 Extended Information Extra Field (0x0001):

-

-      The following is the layout of the zip64 extended 

-      information "extra" block. If one of the size or

-      offset fields in the Local or Central directory

-      record is too small to hold the required data,

-      a Zip64 extended information record is created.

-      The order of the fields in the zip64 extended 

-      information record is fixed, but the fields MUST

-      only appear if the corresponding Local or Central

-      directory record field is set to 0xFFFF or 0xFFFFFFFF.

-

-      Note: all fields stored in Intel low-byte/high-byte order.

-

-        Value      Size       Description

-        -----      ----       -----------

-(ZIP64) 0x0001     2 bytes    Tag for this "extra" block type

-        Size       2 bytes    Size of this "extra" block

-        Original 

-        Size       8 bytes    Original uncompressed file size

-        Compressed

-        Size       8 bytes    Size of compressed data

-        Relative Header

-        Offset     8 bytes    Offset of local header record

-        Disk Start

-        Number     4 bytes    Number of the disk on which

-                              this file starts 

-

-      This entry in the Local header MUST include BOTH original

-      and compressed file size fields. If encrypting the 

-      central directory and bit 13 of the general purpose bit

-      flag is set indicating masking, the value stored in the

-      Local Header for the original file size will be zero.

-

-

-   4.5.4 -OS/2 Extra Field (0x0009):

-

-      The following is the layout of the OS/2 attributes "extra" 

-      block.  (Last Revision  09/05/95)

-

-      Note: all fields stored in Intel low-byte/high-byte order.

-

-        Value       Size          Description

-        -----       ----          -----------

-(OS/2)  0x0009      2 bytes       Tag for this "extra" block type

-        TSize       2 bytes       Size for the following data block

-        BSize       4 bytes       Uncompressed Block Size

-        CType       2 bytes       Compression type

-        EACRC       4 bytes       CRC value for uncompress block

-        (var)       variable      Compressed block

-

-      The OS/2 extended attribute structure (FEA2LIST) is 

-      compressed and then stored in its entirety within this 

-      structure.  There will only ever be one "block" of data in 

-      VarFields[].

-

-   4.5.5 -NTFS Extra Field (0x000a):

-

-      The following is the layout of the NTFS attributes 

-      "extra" block. (Note: At this time the Mtime, Atime

-      and Ctime values MAY be used on any WIN32 system.)  

-

-      Note: all fields stored in Intel low-byte/high-byte order.

-

-        Value      Size       Description

-        -----      ----       -----------

-(NTFS)  0x000a     2 bytes    Tag for this "extra" block type

-        TSize      2 bytes    Size of the total "extra" block

-        Reserved   4 bytes    Reserved for future use

-        Tag1       2 bytes    NTFS attribute tag value #1

-        Size1      2 bytes    Size of attribute #1, in bytes

-        (var)      Size1      Attribute #1 data

-         .

-         .

-         .

-         TagN       2 bytes    NTFS attribute tag value #N

-         SizeN      2 bytes    Size of attribute #N, in bytes

-         (var)      SizeN      Attribute #N data

-

-       For NTFS, values for Tag1 through TagN are as follows:

-       (currently only one set of attributes is defined for NTFS)

-

-         Tag        Size       Description

-         -----      ----       -----------

-         0x0001     2 bytes    Tag for attribute #1 

-         Size1      2 bytes    Size of attribute #1, in bytes

-         Mtime      8 bytes    File last modification time

-         Atime      8 bytes    File last access time

-         Ctime      8 bytes    File creation time

-

-   4.5.6 -OpenVMS Extra Field (0x000c):

-

-       The following is the layout of the OpenVMS attributes 

-       "extra" block.

-

-       Note: all fields stored in Intel low-byte/high-byte order.

-

-         Value      Size       Description

-         -----      ----       -----------

- (VMS)   0x000c     2 bytes    Tag for this "extra" block type

-         TSize      2 bytes    Size of the total "extra" block

-         CRC        4 bytes    32-bit CRC for remainder of the block

-         Tag1       2 bytes    OpenVMS attribute tag value #1

-         Size1      2 bytes    Size of attribute #1, in bytes

-         (var)      Size1      Attribute #1 data

-         .

-         .

-         .

-         TagN       2 bytes    OpenVMS attribute tag value #N

-         SizeN      2 bytes    Size of attribute #N, in bytes

-         (var)      SizeN      Attribute #N data

-

-       OpenVMS Extra Field Rules:

-

-          4.5.6.1. There will be one or more attributes present, which 

-          will each be preceded by the above TagX & SizeX values.  

-          These values are identical to the ATR$C_XXXX and ATR$S_XXXX 

-          constants which are defined in ATR.H under OpenVMS C.  Neither 

-          of these values will ever be zero.

-

-          4.5.6.2. No word alignment or padding is performed.

-

-          4.5.6.3. A well-behaved PKZIP/OpenVMS program should never produce

-          more than one sub-block with the same TagX value.  Also, there will 

-          never be more than one "extra" block of type 0x000c in a particular 

-          directory record.

-

-   4.5.7 -UNIX Extra Field (0x000d):

-

-        The following is the layout of the UNIX "extra" block.

-        Note: all fields are stored in Intel low-byte/high-byte 

-        order.

-

-        Value       Size          Description

-        -----       ----          -----------

-(UNIX)  0x000d      2 bytes       Tag for this "extra" block type

-        TSize       2 bytes       Size for the following data block

-        Atime       4 bytes       File last access time

-        Mtime       4 bytes       File last modification time

-        Uid         2 bytes       File user ID

-        Gid         2 bytes       File group ID

-        (var)       variable      Variable length data field

-

-        The variable length data field will contain file type 

-        specific data.  Currently the only values allowed are

-        the original "linked to" file names for hard or symbolic 

-        links, and the major and minor device node numbers for

-        character and block device nodes.  Since device nodes

-        cannot be either symbolic or hard links, only one set of

-        variable length data is stored.  Link files will have the

-        name of the original file stored.  This name is NOT NULL

-        terminated.  Its size can be determined by checking TSize -

-        12.  Device entries will have eight bytes stored as two 4

-        byte entries (in little endian format).  The first entry

-        will be the major device number, and the second the minor

-        device number.

-                          

-   4.5.8 -PATCH Descriptor Extra Field (0x000f):

-

-        4.5.8.1 The following is the layout of the Patch Descriptor 

-        "extra" block.

-

-        Note: all fields stored in Intel low-byte/high-byte order.

-

-        Value     Size     Description

-        -----     ----     -----------

-(Patch) 0x000f    2 bytes  Tag for this "extra" block type

-        TSize     2 bytes  Size of the total "extra" block

-        Version   2 bytes  Version of the descriptor

-        Flags     4 bytes  Actions and reactions (see below) 

-        OldSize   4 bytes  Size of the file about to be patched 

-        OldCRC    4 bytes  32-bit CRC of the file to be patched 

-        NewSize   4 bytes  Size of the resulting file 

-        NewCRC    4 bytes  32-bit CRC of the resulting file 

-

-        4.5.8.2 Actions and reactions

-

-        Bits          Description

-        ----          ----------------

-        0             Use for auto detection

-        1             Treat as a self-patch

-        2-3           RESERVED

-        4-5           Action (see below)

-        6-7           RESERVED

-        8-9           Reaction (see below) to absent file 

-        10-11         Reaction (see below) to newer file

-        12-13         Reaction (see below) to unknown file

-        14-15         RESERVED

-        16-31         RESERVED

-

-           4.5.8.2.1 Actions

-

-           Action       Value

-           ------       ----- 

-           none         0

-           add          1

-           delete       2

-           patch        3

-

-           4.5.8.2.2 Reactions

-        

-           Reaction     Value

-           --------     -----

-           ask          0

-           skip         1

-           ignore       2

-           fail         3

-

-        4.5.8.3 Patch support is provided by PKPatchMaker(tm) technology 

-        and is covered under U.S. Patents and Patents Pending. The use or 

-        implementation in a product of certain technological aspects set

-        forth in the current APPNOTE, including those with regard to 

-        strong encryption or patching requires a license from PKWARE.  

-        Refer to the section in this document entitled "Incorporating 

-        PKWARE Proprietary Technology into Your Product" for more 

-        information. 

-

-   4.5.9 -PKCS#7 Store for X.509 Certificates (0x0014):

-

-        This field MUST contain information about each of the certificates 

-        files may be signed with. When the Central Directory Encryption 

-        feature is enabled for a ZIP file, this record will appear in 

-        the Archive Extra Data Record, otherwise it will appear in the 

-        first central directory record and will be ignored in any 

-        other record.  

-

-                          

-        Note: all fields stored in Intel low-byte/high-byte order.

-

-        Value     Size     Description

-        -----     ----     -----------

-(Store) 0x0014    2 bytes  Tag for this "extra" block type

-        TSize     2 bytes  Size of the store data

-        TData     TSize    Data about the store

-

-

-   4.5.10 -X.509 Certificate ID and Signature for individual file (0x0015):

-

-        This field contains the information about which certificate in 

-        the PKCS#7 store was used to sign a particular file. It also 

-        contains the signature data. This field can appear multiple 

-        times, but can only appear once per certificate.

-

-        Note: all fields stored in Intel low-byte/high-byte order.

-

-        Value     Size     Description

-        -----     ----     -----------

-(CID)   0x0015    2 bytes  Tag for this "extra" block type

-        TSize     2 bytes  Size of data that follows

-        TData     TSize    Signature Data

-

-   4.5.11 -X.509 Certificate ID and Signature for central directory (0x0016):

-

-        This field contains the information about which certificate in 

-        the PKCS#7 store was used to sign the central directory structure.

-        When the Central Directory Encryption feature is enabled for a 

-        ZIP file, this record will appear in the Archive Extra Data Record, 

-        otherwise it will appear in the first central directory record.

-

-        Note: all fields stored in Intel low-byte/high-byte order.

-

-        Value     Size     Description

-        -----     ----     -----------

-(CDID)  0x0016    2 bytes  Tag for this "extra" block type

-        TSize     2 bytes  Size of data that follows

-        TData     TSize    Data

-

-   4.5.12 -Strong Encryption Header (0x0017):

-

-        Value     Size     Description

-        -----     ----     -----------

-        0x0017    2 bytes  Tag for this "extra" block type

-        TSize     2 bytes  Size of data that follows

-        Format    2 bytes  Format definition for this record

-        AlgID     2 bytes  Encryption algorithm identifier

-        Bitlen    2 bytes  Bit length of encryption key

-        Flags     2 bytes  Processing flags

-        CertData  TSize-8  Certificate decryption extra field data

-                           (refer to the explanation for CertData

-                            in the section describing the 

-                            Certificate Processing Method under 

-                            the Strong Encryption Specification)

-

-        See the section describing the Strong Encryption Specification 

-        for details.  Refer to the section in this document entitled 

-        "Incorporating PKWARE Proprietary Technology into Your Product" 

-        for more information.

-

-   4.5.13 -Record Management Controls (0x0018):

-

-          Value     Size     Description

-          -----     ----     -----------

-(Rec-CTL) 0x0018    2 bytes  Tag for this "extra" block type

-          CSize     2 bytes  Size of total extra block data

-          Tag1      2 bytes  Record control attribute 1

-          Size1     2 bytes  Size of attribute 1, in bytes

-          Data1     Size1    Attribute 1 data

-          .

-          .

-          .

-          TagN      2 bytes  Record control attribute N

-          SizeN     2 bytes  Size of attribute N, in bytes

-          DataN     SizeN    Attribute N data

-

-

-   4.5.14 -PKCS#7 Encryption Recipient Certificate List (0x0019): 

-

-        This field MAY contain information about each of the certificates

-        used in encryption processing and it can be used to identify who is

-        allowed to decrypt encrypted files.  This field should only appear 

-        in the archive extra data record. This field is not required and 

-        serves only to aid archive modifications by preserving public 

-        encryption key data. Individual security requirements may dictate 

-        that this data be omitted to deter information exposure.

-

-        Note: all fields stored in Intel low-byte/high-byte order.

-

-         Value     Size     Description

-         -----     ----     -----------

-(CStore) 0x0019    2 bytes  Tag for this "extra" block type

-         TSize     2 bytes  Size of the store data

-         TData     TSize    Data about the store

-

-         TData:

-

-         Value     Size     Description

-         -----     ----     -----------

-         Version   2 bytes  Format version number - must 0x0001 at this time

-         CStore    (var)    PKCS#7 data blob

-

-         See the section describing the Strong Encryption Specification 

-         for details.  Refer to the section in this document entitled 

-         "Incorporating PKWARE Proprietary Technology into Your Product" 

-         for more information.

-

-   4.5.15 -MVS Extra Field (0x0065):

-

-        The following is the layout of the MVS "extra" block.

-        Note: Some fields are stored in Big Endian format.

-        All text is in EBCDIC format unless otherwise specified.

-

-        Value     Size      Description

-        -----     ----      -----------

-(MVS)   0x0065    2 bytes   Tag for this "extra" block type

-        TSize     2 bytes   Size for the following data block

-        ID        4 bytes   EBCDIC "Z390" 0xE9F3F9F0 or

-                            "T4MV" for TargetFour

-        (var)     TSize-4   Attribute data (see APPENDIX B)

-

-

-   4.5.16 -OS/400 Extra Field (0x0065):

-

-        The following is the layout of the OS/400 "extra" block.

-        Note: Some fields are stored in Big Endian format.

-        All text is in EBCDIC format unless otherwise specified.

-

-        Value     Size       Description

-        -----     ----       -----------

-(OS400) 0x0065    2 bytes    Tag for this "extra" block type

-        TSize     2 bytes    Size for the following data block

-        ID        4 bytes    EBCDIC "I400" 0xC9F4F0F0 or

-                             "T4MV" for TargetFour

-        (var)     TSize-4    Attribute data (see APPENDIX A)

-

-4.6 Third Party Mappings

-------------------------

-                 

-   4.6.1 Third party mappings commonly used are:

-

-          0x07c8        Macintosh

-          0x2605        ZipIt Macintosh

-          0x2705        ZipIt Macintosh 1.3.5+

-          0x2805        ZipIt Macintosh 1.3.5+

-          0x334d        Info-ZIP Macintosh

-          0x4341        Acorn/SparkFS 

-          0x4453        Windows NT security descriptor (binary ACL)

-          0x4704        VM/CMS

-          0x470f        MVS

-          0x4b46        FWKCS MD5 (see below)

-          0x4c41        OS/2 access control list (text ACL)

-          0x4d49        Info-ZIP OpenVMS

-          0x4f4c        Xceed original location extra field

-          0x5356        AOS/VS (ACL)

-          0x5455        extended timestamp

-          0x554e        Xceed unicode extra field

-          0x5855        Info-ZIP UNIX (original, also OS/2, NT, etc)

-          0x6375        Info-ZIP Unicode Comment Extra Field

-          0x6542        BeOS/BeBox

-          0x7075        Info-ZIP Unicode Path Extra Field

-          0x756e        ASi UNIX

-          0x7855        Info-ZIP UNIX (new)

-          0xa220        Microsoft Open Packaging Growth Hint

-          0xfd4a        SMS/QDOS

-

-   Detailed descriptions of Extra Fields defined by third 

-   party mappings will be documented as information on

-   these data structures is made available to PKWARE.  

-   PKWARE does not guarantee the accuracy of any published

-   third party data.

-

-   4.6.2 Third-party Extra Fields must include a Header ID using

-   the format defined in the section of this document 

-   titled Extensible Data Fields (section 4.5).

-

-   The Data Size field indicates the size of the following

-   data block. Programs can use this value to skip to the

-   next header block, passing over any data blocks that are

-   not of interest.

-

-   Note: As stated above, the size of the entire .ZIP file

-         header, including the file name, comment, and extra

-         field should not exceed 64K in size.

-

-   4.6.3 In case two different programs should appropriate the same

-   Header ID value, it is strongly recommended that each

-   program SHOULD place a unique signature of at least two bytes in

-   size (and preferably 4 bytes or bigger) at the start of

-   each data area.  Every program SHOULD verify that its

-   unique signature is present, in addition to the Header ID

-   value being correct, before assuming that it is a block of

-   known type.

-         

-   Third-party Mappings:

-          

-   4.6.4 -ZipIt Macintosh Extra Field (long) (0x2605):

-

-      The following is the layout of the ZipIt extra block 

-      for Macintosh. The local-header and central-header versions 

-      are identical. This block must be present if the file is 

-      stored MacBinary-encoded and it should not be used if the file 

-      is not stored MacBinary-encoded.

-

-          Value         Size        Description

-          -----         ----        -----------

-  (Mac2)  0x2605        Short       tag for this extra block type

-          TSize         Short       total data size for this block

-          "ZPIT"        beLong      extra-field signature

-          FnLen         Byte        length of FileName

-          FileName      variable    full Macintosh filename

-          FileType      Byte[4]     four-byte Mac file type string

-          Creator       Byte[4]     four-byte Mac creator string

-

-

-   4.6.5 -ZipIt Macintosh Extra Field (short, for files) (0x2705):

-

-      The following is the layout of a shortened variant of the

-      ZipIt extra block for Macintosh (without "full name" entry).

-      This variant is used by ZipIt 1.3.5 and newer for entries of

-      files (not directories) that do not have a MacBinary encoded

-      file. The local-header and central-header versions are identical.

-

-         Value         Size        Description

-         -----         ----        -----------

- (Mac2b) 0x2705        Short       tag for this extra block type

-         TSize         Short       total data size for this block (12)

-         "ZPIT"        beLong      extra-field signature

-         FileType      Byte[4]     four-byte Mac file type string

-         Creator       Byte[4]     four-byte Mac creator string

-         fdFlags       beShort     attributes from FInfo.frFlags,

-                                   may be omitted

-         0x0000        beShort     reserved, may be omitted

-

-

-   4.6.6 -ZipIt Macintosh Extra Field (short, for directories) (0x2805):

-

-      The following is the layout of a shortened variant of the

-      ZipIt extra block for Macintosh used only for directory

-      entries. This variant is used by ZipIt 1.3.5 and newer to 

-      save some optional Mac-specific information about directories.

-      The local-header and central-header versions are identical.

-

-         Value         Size        Description

-         -----         ----        -----------

- (Mac2c) 0x2805        Short       tag for this extra block type

-         TSize         Short       total data size for this block (12)

-         "ZPIT"        beLong      extra-field signature

-         frFlags       beShort     attributes from DInfo.frFlags, may

-                                   be omitted

-         View          beShort     ZipIt view flag, may be omitted

-

-

-     The View field specifies ZipIt-internal settings as follows:

-

-     Bits of the Flags:

-        bit 0           if set, the folder is shown expanded (open)

-                        when the archive contents are viewed in ZipIt.

-        bits 1-15       reserved, zero;

-

-

-   4.6.7 -FWKCS MD5 Extra Field (0x4b46):

-

-      The FWKCS Contents_Signature System, used in

-      automatically identifying files independent of file name,

-      optionally adds and uses an extra field to support the

-      rapid creation of an enhanced contents_signature:

-

-              Header ID = 0x4b46

-              Data Size = 0x0013

-              Preface   = 'M','D','5'

-              followed by 16 bytes containing the uncompressed file's

-              128_bit MD5 hash(1), low byte first.

-

-      When FWKCS revises a .ZIP file central directory to add

-      this extra field for a file, it also replaces the

-      central directory entry for that file's uncompressed

-      file length with a measured value.

-

-      FWKCS provides an option to strip this extra field, if

-      present, from a .ZIP file central directory. In adding

-      this extra field, FWKCS preserves .ZIP file Authenticity

-      Verification; if stripping this extra field, FWKCS

-      preserves all versions of AV through PKZIP version 2.04g.

-

-      FWKCS, and FWKCS Contents_Signature System, are

-      trademarks of Frederick W. Kantor.

-

-      (1) R. Rivest, RFC1321.TXT, MIT Laboratory for Computer

-          Science and RSA Data Security, Inc., April 1992.

-          ll.76-77: "The MD5 algorithm is being placed in the

-          public domain for review and possible adoption as a

-          standard."

-

-

-   4.6.8 -Info-ZIP Unicode Comment Extra Field (0x6375):

-

-      Stores the UTF-8 version of the file comment as stored in the

-      central directory header. (Last Revision 20070912)

-

-         Value         Size        Description

-         -----         ----        -----------

-  (UCom) 0x6375        Short       tag for this extra block type ("uc")

-         TSize         Short       total data size for this block

-         Version       1 byte      version of this extra field, currently 1

-         ComCRC32      4 bytes     Comment Field CRC32 Checksum

-         UnicodeCom    Variable    UTF-8 version of the entry comment

-

-       Currently Version is set to the number 1.  If there is a need

-       to change this field, the version will be incremented.  Changes

-       may not be backward compatible so this extra field should not be

-       used if the version is not recognized.

-

-       The ComCRC32 is the standard zip CRC32 checksum of the File Comment

-       field in the central directory header.  This is used to verify that

-       the comment field has not changed since the Unicode Comment extra field

-       was created.  This can happen if a utility changes the File Comment 

-       field but does not update the UTF-8 Comment extra field.  If the CRC 

-       check fails, this Unicode Comment extra field should be ignored and 

-       the File Comment field in the header should be used instead.

-

-       The UnicodeCom field is the UTF-8 version of the File Comment field

-       in the header.  As UnicodeCom is defined to be UTF-8, no UTF-8 byte

-       order mark (BOM) is used.  The length of this field is determined by

-       subtracting the size of the previous fields from TSize.  If both the

-       File Name and Comment fields are UTF-8, the new General Purpose Bit

-       Flag, bit 11 (Language encoding flag (EFS)), can be used to indicate

-       both the header File Name and Comment fields are UTF-8 and, in this

-       case, the Unicode Path and Unicode Comment extra fields are not

-       needed and should not be created.  Note that, for backward

-       compatibility, bit 11 should only be used if the native character set

-       of the paths and comments being zipped up are already in UTF-8. It is

-       expected that the same file comment storage method, either general

-       purpose bit 11 or extra fields, be used in both the Local and Central

-       Directory Header for a file.

-

-

-   4.6.9 -Info-ZIP Unicode Path Extra Field (0x7075):

-

-       Stores the UTF-8 version of the file name field as stored in the

-       local header and central directory header. (Last Revision 20070912)

-

-         Value         Size        Description

-         -----         ----        -----------

- (UPath) 0x7075        Short       tag for this extra block type ("up")

-         TSize         Short       total data size for this block

-         Version       1 byte      version of this extra field, currently 1

-         NameCRC32     4 bytes     File Name Field CRC32 Checksum

-         UnicodeName   Variable    UTF-8 version of the entry File Name

-

-      Currently Version is set to the number 1.  If there is a need

-      to change this field, the version will be incremented.  Changes

-      may not be backward compatible so this extra field should not be

-      used if the version is not recognized.

-

-      The NameCRC32 is the standard zip CRC32 checksum of the File Name

-      field in the header.  This is used to verify that the header

-      File Name field has not changed since the Unicode Path extra field

-      was created.  This can happen if a utility renames the File Name but

-      does not update the UTF-8 path extra field.  If the CRC check fails,

-      this UTF-8 Path Extra Field should be ignored and the File Name field

-      in the header should be used instead.

-

-      The UnicodeName is the UTF-8 version of the contents of the File Name

-      field in the header.  As UnicodeName is defined to be UTF-8, no UTF-8

-      byte order mark (BOM) is used.  The length of this field is determined

-      by subtracting the size of the previous fields from TSize.  If both

-      the File Name and Comment fields are UTF-8, the new General Purpose

-      Bit Flag, bit 11 (Language encoding flag (EFS)), can be used to

-      indicate that both the header File Name and Comment fields are UTF-8

-      and, in this case, the Unicode Path and Unicode Comment extra fields

-      are not needed and should not be created.  Note that, for backward

-      compatibility, bit 11 should only be used if the native character set

-      of the paths and comments being zipped up are already in UTF-8. It is

-      expected that the same file name storage method, either general

-      purpose bit 11 or extra fields, be used in both the Local and Central

-      Directory Header for a file.

- 

-

-   4.6.10 -Microsoft Open Packaging Growth Hint (0xa220):

-

-          Value         Size        Description

-          -----         ----        -----------

-          0xa220        Short       tag for this extra block type

-          TSize         Short       size of Sig + PadVal + Padding

-          Sig           Short       verification signature (A028)

-          PadVal        Short       Initial padding value

-          Padding       variable    filled with NULL characters

-

-4.7 Manifest Files

-------------------

-

-    4.7.1 Applications using ZIP files may have a need for additional 

-    information that must be included with the files placed into

-    a ZIP file. Application specific information that cannot be

-    stored using the defined ZIP storage records SHOULD be stored 

-    using the extensible Extra Field convention defined in this 

-    document.  However, some applications may use a manifest

-    file as a means for storing additional information.  One

-    example is the META-INF/MANIFEST.MF file used in ZIP formatted

-    files having the .JAR extension (JAR files).  

-

-    4.7.2 A manifest file is a file created for the application process

-    that requires this information.  A manifest file MAY be of any 

-    file type required by the defining application process.  It is 

-    placed within the same ZIP file as files to which this information 

-    applies. By convention, this file is typically the first file placed

-    into the ZIP file and it may include a defined directory path.

-

-    4.7.3 Manifest files may be compressed or encrypted as needed for

-    application processing of the files inside the ZIP files.

-

-    Manifest files are outside of the scope of this specification.

-

-

-5.0 Explanation of compression methods

---------------------------------------

-

-

-5.1 UnShrinking - Method 1

---------------------------

-

-    5.1.1 Shrinking is a Dynamic Ziv-Lempel-Welch compression algorithm

-    with partial clearing.  The initial code size is 9 bits, and the 

-    maximum code size is 13 bits.  Shrinking differs from conventional 

-    Dynamic Ziv-Lempel-Welch implementations in several respects:

-

-    5.1.2 The code size is controlled by the compressor, and is 

-    not automatically increased when codes larger than the current

-    code size are created (but not necessarily used).  When

-    the decompressor encounters the code sequence 256

-    (decimal) followed by 1, it should increase the code size

-    read from the input stream to the next bit size.  No

-    blocking of the codes is performed, so the next code at

-    the increased size should be read from the input stream

-    immediately after where the previous code at the smaller

-    bit size was read.  Again, the decompressor should not

-    increase the code size used until the sequence 256,1 is

-    encountered.

-

-    5.1.3 When the table becomes full, total clearing is not

-    performed.  Rather, when the compressor emits the code

-    sequence 256,2 (decimal), the decompressor should clear

-    all leaf nodes from the Ziv-Lempel tree, and continue to

-    use the current code size.  The nodes that are cleared

-    from the Ziv-Lempel tree are then re-used, with the lowest

-    code value re-used first, and the highest code value

-    re-used last.  The compressor can emit the sequence 256,2

-    at any time.

-

-5.2 Expanding - Methods 2-5

----------------------------

-

-    5.2.1 The Reducing algorithm is actually a combination of two

-    distinct algorithms.  The first algorithm compresses repeated

-    byte sequences, and the second algorithm takes the compressed

-    stream from the first algorithm and applies a probabilistic

-    compression method.

-

-    5.2.2 The probabilistic compression stores an array of 'follower

-    sets' S(j), for j=0 to 255, corresponding to each possible

-    ASCII character.  Each set contains between 0 and 32

-    characters, to be denoted as S(j)[0],...,S(j)[m], where m<32.

-    The sets are stored at the beginning of the data area for a

-    Reduced file, in reverse order, with S(255) first, and S(0)

-    last.

-

-    5.2.3 The sets are encoded as { N(j), S(j)[0],...,S(j)[N(j)-1] },

-    where N(j) is the size of set S(j).  N(j) can be 0, in which

-    case the follower set for S(j) is empty.  Each N(j) value is

-    encoded in 6 bits, followed by N(j) eight bit character values

-    corresponding to S(j)[0] to S(j)[N(j)-1] respectively.  If

-    N(j) is 0, then no values for S(j) are stored, and the value

-    for N(j-1) immediately follows.

-

-    5.2.4 Immediately after the follower sets, is the compressed data

-    stream.  The compressed data stream can be interpreted for the

-    probabilistic decompression as follows:

-

-    let Last-Character <- 0.

-    loop until done

-        if the follower set S(Last-Character) is empty then

-            read 8 bits from the input stream, and copy this

-            value to the output stream.

-        otherwise if the follower set S(Last-Character) is non-empty then

-            read 1 bit from the input stream.

-            if this bit is not zero then

-                read 8 bits from the input stream, and copy this

-                value to the output stream.

-            otherwise if this bit is zero then

-                read B(N(Last-Character)) bits from the input

-                stream, and assign this value to I.

-                Copy the value of S(Last-Character)[I] to the

-                output stream.

-

-        assign the last value placed on the output stream to

-        Last-Character.

-    end loop

-

-    B(N(j)) is defined as the minimal number of bits required to

-    encode the value N(j)-1.

-

-    5.2.5 The decompressed stream from above can then be expanded to

-    re-create the original file as follows:

-

-    let State <- 0.

-

-    loop until done

-        read 8 bits from the input stream into C.

-        case State of

-            0:  if C is not equal to DLE (144 decimal) then

-                   copy C to the output stream.

-                 otherwise if C is equal to DLE then

-                   let State <- 1.

-

-            1:  if C is non-zero then

-                   let V <- C.

-                   let Len <- L(V)

-                   let State <- F(Len).

-                 otherwise if C is zero then

-                   copy the value 144 (decimal) to the output stream.

-                   let State <- 0

-

-            2:  let Len <- Len + C

-                    let State <- 3.

-

-            3:  move backwards D(V,C) bytes in the output stream

-                    (if this position is before the start of the output

-                    stream, then assume that all the data before the

-                    start of the output stream is filled with zeros).

-                    copy Len+3 bytes from this position to the output stream.

-                    let State <- 0.

-          end case

-    end loop

-

-    The functions F,L, and D are dependent on the 'compression

-    factor', 1 through 4, and are defined as follows:

-

-    For compression factor 1:

-        L(X) equals the lower 7 bits of X.

-        F(X) equals 2 if X equals 127 otherwise F(X) equals 3.

-        D(X,Y) equals the (upper 1 bit of X) * 256 + Y + 1.

-    For compression factor 2:

-        L(X) equals the lower 6 bits of X.

-        F(X) equals 2 if X equals 63 otherwise F(X) equals 3.

-        D(X,Y) equals the (upper 2 bits of X) * 256 + Y + 1.

-    For compression factor 3:

-        L(X) equals the lower 5 bits of X.

-        F(X) equals 2 if X equals 31 otherwise F(X) equals 3.

-        D(X,Y) equals the (upper 3 bits of X) * 256 + Y + 1.

-    For compression factor 4:

-        L(X) equals the lower 4 bits of X.

-        F(X) equals 2 if X equals 15 otherwise F(X) equals 3.

-        D(X,Y) equals the (upper 4 bits of X) * 256 + Y + 1.

-

-5.3 Imploding - Method 6

-------------------------

-

-    5.3.1 The Imploding algorithm is actually a combination of two 

-    distinct algorithms.  The first algorithm compresses repeated byte

-    sequences using a sliding dictionary.  The second algorithm is

-    used to compress the encoding of the sliding dictionary output,

-    using multiple Shannon-Fano trees.

-

-    5.3.2 The Imploding algorithm can use a 4K or 8K sliding dictionary

-    size. The dictionary size used can be determined by bit 1 in the

-    general purpose flag word; a 0 bit indicates a 4K dictionary

-    while a 1 bit indicates an 8K dictionary.

-

-    5.3.3 The Shannon-Fano trees are stored at the start of the 

-    compressed file. The number of trees stored is defined by bit 2 in 

-    the general purpose flag word; a 0 bit indicates two trees stored, 

-    a 1 bit indicates three trees are stored.  If 3 trees are stored,

-    the first Shannon-Fano tree represents the encoding of the

-    Literal characters, the second tree represents the encoding of

-    the Length information, the third represents the encoding of the

-    Distance information.  When 2 Shannon-Fano trees are stored, the

-    Length tree is stored first, followed by the Distance tree.

-

-    5.3.4 The Literal Shannon-Fano tree, if present is used to represent

-    the entire ASCII character set, and contains 256 values.  This

-    tree is used to compress any data not compressed by the sliding

-    dictionary algorithm.  When this tree is present, the Minimum

-    Match Length for the sliding dictionary is 3.  If this tree is

-    not present, the Minimum Match Length is 2.

-

-    5.3.5 The Length Shannon-Fano tree is used to compress the Length 

-    part of the (length,distance) pairs from the sliding dictionary

-    output.  The Length tree contains 64 values, ranging from the

-    Minimum Match Length, to 63 plus the Minimum Match Length.

-

-    5.3.6 The Distance Shannon-Fano tree is used to compress the Distance

-    part of the (length,distance) pairs from the sliding dictionary

-    output. The Distance tree contains 64 values, ranging from 0 to

-    63, representing the upper 6 bits of the distance value.  The

-    distance values themselves will be between 0 and the sliding

-    dictionary size, either 4K or 8K.

-

-    5.3.7 The Shannon-Fano trees themselves are stored in a compressed

-    format. The first byte of the tree data represents the number of

-    bytes of data representing the (compressed) Shannon-Fano tree

-    minus 1.  The remaining bytes represent the Shannon-Fano tree

-    data encoded as:

-

-        High 4 bits: Number of values at this bit length + 1. (1 - 16)

-        Low  4 bits: Bit Length needed to represent value + 1. (1 - 16)

-

-    5.3.8 The Shannon-Fano codes can be constructed from the bit lengths

-    using the following algorithm:

-

-    1)  Sort the Bit Lengths in ascending order, while retaining the

-        order of the original lengths stored in the file.

-

-    2)  Generate the Shannon-Fano trees:

-

-        Code <- 0

-        CodeIncrement <- 0

-        LastBitLength <- 0

-        i <- number of Shannon-Fano codes - 1   (either 255 or 63)

-

-        loop while i >= 0

-            Code = Code + CodeIncrement

-            if BitLength(i) <> LastBitLength then

-                LastBitLength=BitLength(i)

-                CodeIncrement = 1 shifted left (16 - LastBitLength)

-            ShannonCode(i) = Code

-            i <- i - 1

-        end loop

-

-    3)  Reverse the order of all the bits in the above ShannonCode()

-        vector, so that the most significant bit becomes the least

-        significant bit.  For example, the value 0x1234 (hex) would

-        become 0x2C48 (hex).

-

-    4)  Restore the order of Shannon-Fano codes as originally stored

-        within the file.

-

-    Example:

-

-        This example will show the encoding of a Shannon-Fano tree

-        of size 8.  Notice that the actual Shannon-Fano trees used

-        for Imploding are either 64 or 256 entries in size.

-

-    Example:   0x02, 0x42, 0x01, 0x13

-

-        The first byte indicates 3 values in this table.  Decoding the

-        bytes:

-                0x42 = 5 codes of 3 bits long

-                0x01 = 1 code  of 2 bits long

-                0x13 = 2 codes of 4 bits long

-

-        This would generate the original bit length array of:

-        (3, 3, 3, 3, 3, 2, 4, 4)

-

-        There are 8 codes in this table for the values 0 thru 7.  Using 

-        the algorithm to obtain the Shannon-Fano codes produces:

-

-                                      Reversed     Order     Original

-    Val  Sorted   Constructed Code      Value     Restored    Length

-    ---  ------   -----------------   --------    --------    ------

-    0:     2      1100000000000000        11       101          3

-    1:     3      1010000000000000       101       001          3

-    2:     3      1000000000000000       001       110          3

-    3:     3      0110000000000000       110       010          3

-    4:     3      0100000000000000       010       100          3

-    5:     3      0010000000000000       100        11          2

-    6:     4      0001000000000000      1000      1000          4

-    7:     4      0000000000000000      0000      0000          4

-

-    The values in the Val, Order Restored and Original Length columns

-    now represent the Shannon-Fano encoding tree that can be used for

-    decoding the Shannon-Fano encoded data.  How to parse the

-    variable length Shannon-Fano values from the data stream is beyond

-    the scope of this document.  (See the references listed at the end of

-    this document for more information.)  However, traditional decoding

-    schemes used for Huffman variable length decoding, such as the

-    Greenlaw algorithm, can be successfully applied.

-

-    5.3.9 The compressed data stream begins immediately after the

-    compressed Shannon-Fano data.  The compressed data stream can be

-    interpreted as follows:

-

-    loop until done

-        read 1 bit from input stream.

-

-        if this bit is non-zero then       (encoded data is literal data)

-            if Literal Shannon-Fano tree is present

-                read and decode character using Literal Shannon-Fano tree.

-            otherwise

-                read 8 bits from input stream.

-            copy character to the output stream.

-        otherwise              (encoded data is sliding dictionary match)

-            if 8K dictionary size

-                read 7 bits for offset Distance (lower 7 bits of offset).

-            otherwise

-                read 6 bits for offset Distance (lower 6 bits of offset).

-

-            using the Distance Shannon-Fano tree, read and decode the

-              upper 6 bits of the Distance value.

-

-            using the Length Shannon-Fano tree, read and decode

-              the Length value.

-

-            Length <- Length + Minimum Match Length

-

-            if Length = 63 + Minimum Match Length

-                read 8 bits from the input stream,

-                add this value to Length.

-

-            move backwards Distance+1 bytes in the output stream, and

-            copy Length characters from this position to the output

-            stream.  (if this position is before the start of the output

-            stream, then assume that all the data before the start of

-            the output stream is filled with zeros).

-    end loop

-

-5.4 Tokenizing - Method 7

--------------------------

-

-    5.4.1 This method is not used by PKZIP.

-

-5.5 Deflating - Method 8

-------------------------

-

-    5.5.1 The Deflate algorithm is similar to the Implode algorithm using

-    a sliding dictionary of up to 32K with secondary compression

-    from Huffman/Shannon-Fano codes.

-

-    5.5.2 The compressed data is stored in blocks with a header describing

-    the block and the Huffman codes used in the data block.  The header

-    format is as follows:

-

-       Bit 0: Last Block bit     This bit is set to 1 if this is the last

-                                 compressed block in the data.

-       Bits 1-2: Block type

-          00 (0) - Block is stored - All stored data is byte aligned.

-                   Skip bits until next byte, then next word = block 

-                   length, followed by the ones compliment of the block

-                   length word. Remaining data in block is the stored 

-                   data.

-

-          01 (1) - Use fixed Huffman codes for literal and distance codes.

-                   Lit Code    Bits             Dist Code   Bits

-                   ---------   ----             ---------   ----

-                     0 - 143    8                 0 - 31      5

-                   144 - 255    9

-                   256 - 279    7

-                   280 - 287    8

-

-                   Literal codes 286-287 and distance codes 30-31 are 

-                   never used but participate in the huffman construction.

-

-          10 (2) - Dynamic Huffman codes.  (See expanding Huffman codes)

-

-          11 (3) - Reserved - Flag a "Error in compressed data" if seen.

-

-    5.5.3 Expanding Huffman Codes

-    

-    If the data block is stored with dynamic Huffman codes, the Huffman

-    codes are sent in the following compressed format:

-

-       5 Bits: # of Literal codes sent - 256 (256 - 286)

-               All other codes are never sent.

-       5 Bits: # of Dist codes - 1           (1 - 32)

-       4 Bits: # of Bit Length codes - 3     (3 - 19)

-

-    The Huffman codes are sent as bit lengths and the codes are built as

-    described in the implode algorithm.  The bit lengths themselves are

-    compressed with Huffman codes.  There are 19 bit length codes:

-

-       0 - 15: Represent bit lengths of 0 - 15

-           16: Copy the previous bit length 3 - 6 times.

-               The next 2 bits indicate repeat length (0 = 3, ... ,3 = 6)

-                  Example:  Codes 8, 16 (+2 bits 11), 16 (+2 bits 10) will

-                            expand to 12 bit lengths of 8 (1 + 6 + 5)

-           17: Repeat a bit length of 0 for 3 - 10 times. (3 bits of length)

-           18: Repeat a bit length of 0 for 11 - 138 times (7 bits of length)

-

-    The lengths of the bit length codes are sent packed 3 bits per value

-    (0 - 7) in the following order:

-

-       16, 17, 18, 0, 8, 7, 9, 6, 10, 5, 11, 4, 12, 3, 13, 2, 14, 1, 15

-

-    The Huffman codes should be built as described in the Implode algorithm

-    except codes are assigned starting at the shortest bit length, i.e. the

-    shortest code should be all 0's rather than all 1's.  Also, codes with

-    a bit length of zero do not participate in the tree construction.  The

-    codes are then used to decode the bit lengths for the literal and 

-    distance tables.

-

-    The bit lengths for the literal tables are sent first with the number

-    of entries sent described by the 5 bits sent earlier.  There are up

-    to 286 literal characters; the first 256 represent the respective 8

-    bit character, code 256 represents the End-Of-Block code, the remaining

-    29 codes represent copy lengths of 3 thru 258.  There are up to 30

-    distance codes representing distances from 1 thru 32k as described

-    below.

-

-                                 Length Codes

-                                 ------------

-          Extra             Extra              Extra              Extra

-     Code Bits Length  Code Bits Lengths  Code Bits Lengths  Code Bits Length(s)

-     ---- ---- ------  ---- ---- -------  ---- ---- -------  ---- ---- ---------

-      257   0     3     265   1   11,12    273   3   35-42    281   5  131-162

-      258   0     4     266   1   13,14    274   3   43-50    282   5  163-194

-      259   0     5     267   1   15,16    275   3   51-58    283   5  195-226

-      260   0     6     268   1   17,18    276   3   59-66    284   5  227-257

-      261   0     7     269   2   19-22    277   4   67-82    285   0    258

-      262   0     8     270   2   23-26    278   4   83-98

-      263   0     9     271   2   27-30    279   4   99-114

-      264   0    10     272   2   31-34    280   4  115-130

-

-                                Distance Codes

-                                --------------

-          Extra           Extra             Extra               Extra

-     Code Bits Dist  Code Bits  Dist   Code Bits Distance  Code Bits Distance

-     ---- ---- ----  ---- ---- ------  ---- ---- --------  ---- ---- --------

-       0   0    1      8   3   17-24    16    7  257-384    24   11  4097-6144

-       1   0    2      9   3   25-32    17    7  385-512    25   11  6145-8192

-       2   0    3     10   4   33-48    18    8  513-768    26   12  8193-12288

-       3   0    4     11   4   49-64    19    8  769-1024   27   12 12289-16384

-       4   1   5,6    12   5   65-96    20    9 1025-1536   28   13 16385-24576

-       5   1   7,8    13   5   97-128   21    9 1537-2048   29   13 24577-32768

-       6   2   9-12   14   6  129-192   22   10 2049-3072

-       7   2  13-16   15   6  193-256   23   10 3073-4096

-

-    5.5.4 The compressed data stream begins immediately after the

-    compressed header data.  The compressed data stream can be

-    interpreted as follows:

-

-    do

-       read header from input stream.

-

-       if stored block

-          skip bits until byte aligned

-          read count and 1's compliment of count

-          copy count bytes data block

-       otherwise

-          loop until end of block code sent

-             decode literal character from input stream

-             if literal < 256

-                copy character to the output stream

-             otherwise

-                if literal = end of block

-                   break from loop

-                otherwise

-                   decode distance from input stream

-

-                   move backwards distance bytes in the output stream, and

-                   copy length characters from this position to the output

-                   stream.

-          end loop

-    while not last block

-

-    if data descriptor exists

-       skip bits until byte aligned

-       read crc and sizes

-    endif

-

-5.6 Enhanced Deflating - Method 9

----------------------------------

-

-    5.6.1 The Enhanced Deflating algorithm is similar to Deflate but uses 

-    a sliding dictionary of up to 64K. Deflate64(tm) is supported

-    by the Deflate extractor. 

-

-5.7 BZIP2 - Method 12

----------------------

-

-    5.7.1 BZIP2 is an open-source data compression algorithm developed by 

-    Julian Seward.  Information and source code for this algorithm

-    can be found on the internet.

-

-5.8 LZMA - Method 14 

----------------------

-

-    5.8.1 LZMA is a block-oriented, general purpose data compression 

-    algorithm developed and maintained by Igor Pavlov.  It is a derivative 

-    of LZ77 that utilizes Markov chains and a range coder.  Information and 

-    source code for this algorithm can be found on the internet.  Consult 

-    with the author of this algorithm for information on terms or 

-    restrictions on use.

-

-    Support for LZMA within the ZIP format is defined as follows:   

-

-    5.8.2 The Compression method field within the ZIP Local and Central 

-    Header records will be set to the value 14 to indicate data was

-    compressed using LZMA. 

-

-    5.8.3 The Version needed to extract field within the ZIP Local and 

-    Central Header records will be set to 6.3 to indicate the minimum 

-    ZIP format version supporting this feature.

-

-    5.8.4 File data compressed using the LZMA algorithm must be placed 

-    immediately following the Local Header for the file.  If a standard 

-    ZIP encryption header is required, it will follow the Local Header 

-    and will precede the LZMA compressed file data segment.  The location 

-    of LZMA compressed data segment within the ZIP format will be as shown:

-

-        [local header file 1]

-        [encryption header file 1]

-        [LZMA compressed data segment for file 1]

-        [data descriptor 1]

-        [local header file 2]

-

-    5.8.5 The encryption header and data descriptor records may

-    be conditionally present.  The LZMA Compressed Data Segment 

-    will consist of an LZMA Properties Header followed by the 

-    LZMA Compressed Data as shown:

-

-        [LZMA properties header for file 1]

-        [LZMA compressed data for file 1]

-

-    5.8.6 The LZMA Compressed Data will be stored as provided by the 

-    LZMA compression library.  Compressed size, uncompressed size and 

-    other file characteristics about the file being compressed must be 

-    stored in standard ZIP storage format.

-

-    5.8.7 The LZMA Properties Header will store specific data required 

-    to decompress the LZMA compressed Data.  This data is set by the 

-    LZMA compression engine using the function WriteCoderProperties() 

-    as documented within the LZMA SDK. 

-         

-    5.8.8 Storage fields for the property information within the LZMA 

-    Properties Header are as follows:

-

-         LZMA Version Information 2 bytes

-         LZMA Properties Size 2 bytes

-         LZMA Properties Data variable, defined by "LZMA Properties Size"

-

-       5.8.8.1 LZMA Version Information - this field identifies which version 

-       of the LZMA SDK was used to compress a file.  The first byte will 

-       store the major version number of the LZMA SDK and the second 

-       byte will store the minor number.  

-

-       5.8.8.2 LZMA Properties Size - this field defines the size of the 

-       remaining property data.  Typically this size should be determined by 

-       the version of the SDK.  This size field is included as a convenience

-       and to help avoid any ambiguity should it arise in the future due

-       to changes in this compression algorithm. 

-

-       5.8.8.3 LZMA Property Data - this variable sized field records the 

-       required values for the decompressor as defined by the LZMA SDK.  

-       The data stored in this field should be obtained using the 

-       WriteCoderProperties() in the version of the SDK defined by 

-       the "LZMA Version Information" field.  

-

-       5.8.8.4 The layout of the "LZMA Properties Data" field is a function of 

-       the LZMA compression algorithm.  It is possible that this layout may be

-       changed by the author over time.  The data layout in version 4.3 of the 

-       LZMA SDK defines a 5 byte array that uses 4 bytes to store the dictionary 

-       size in little-endian order. This is preceded by a single packed byte as 

-       the first element of the array that contains the following fields:

-

-         PosStateBits

-         LiteralPosStateBits

-         LiteralContextBits

-

-       Refer to the LZMA documentation for a more detailed explanation of 

-       these fields.  

-

-    5.8.9 Data compressed with method 14, LZMA, may include an end-of-stream

-    (EOS) marker ending the compressed data stream.  This marker is not

-    required, but its use is highly recommended to facilitate processing

-    and implementers should include the EOS marker whenever possible.

-    When the EOS marker is used, general purpose bit 1 must be set.  If

-    general purpose bit 1 is not set, the EOS marker is not present.

-

-5.9 WavPack - Method 97

------------------------

-

-    5.9.1 Information describing the use of compression method 97 is 

-    provided by WinZIP International, LLC.  This method relies on the

-    open source WavPack audio compression utility developed by David Bryant.  

-    Information on WavPack is available at www.wavpack.com.  Please consult 

-    with the author of this algorithm for information on terms and 

-    restrictions on use.

-

-    5.9.2 WavPack data for a file begins immediately after the end of the

-    local header data.  This data is the output from WavPack compression

-    routines.  Within the ZIP file, the use of WavPack compression is

-    indicated by setting the compression method field to a value of 97 

-    in both the local header and the central directory header.  The Version 

-    needed to extract and version made by fields use the same values as are 

-    used for data compressed using the Deflate algorithm.

-

-    5.9.3 An implementation note for storing digital sample data when using 

-    WavPack compression within ZIP files is that all of the bytes of

-    the sample data should be compressed.  This includes any unused

-    bits up to the byte boundary.  An example is a 2 byte sample that

-    uses only 12 bits for the sample data with 4 unused bits.  If only

-    12 bits are passed as the sample size to the WavPack routines, the 4 

-    unused bits will be set to 0 on extraction regardless of their original 

-    state.  To avoid this, the full 16 bits of the sample data size

-    should be provided. 

-

-5.10 PPMd - Method 98

----------------------

-

-    5.10.1 PPMd is a data compression algorithm developed by Dmitry Shkarin

-    which includes a carryless rangecoder developed by Dmitry Subbotin.

-    This algorithm is based on predictive phrase matching on multiple

-    order contexts.  Information and source code for this algorithm

-    can be found on the internet. Consult with the author of this

-    algorithm for information on terms or restrictions on use.

-

-    5.10.2 Support for PPMd within the ZIP format currently is provided only 

-    for version I, revision 1 of the algorithm.  Storage requirements

-    for using this algorithm are as follows:

-

-    5.10.3 Parameters needed to control the algorithm are stored in the two

-    bytes immediately preceding the compressed data.  These bytes are

-    used to store the following fields:

-

-    Model order - sets the maximum model order, default is 8, possible

-                  values are from 2 to 16 inclusive

-

-    Sub-allocator size - sets the size of sub-allocator in MB, default is 50,

-                    possible values are from 1MB to 256MB inclusive

-

-    Model restoration method - sets the method used to restart context

-                    model at memory insufficiency, values are:

-

-                    0 - restarts model from scratch - default

-                    1 - cut off model - decreases performance by as much as 2x

-                    2 - freeze context tree - not recommended

-

-    5.10.4 An example for packing these fields into the 2 byte storage field is

-    illustrated below.  These values are stored in Intel low-byte/high-byte

-    order.

-

-    wPPMd = (Model order - 1) + 

-            ((Sub-allocator size - 1) << 4) + 

-            (Model restoration method << 12)

-

-

-6.0  Traditional PKWARE Encryption

-----------------------------------

-

-    6.0.1 The following information discusses the decryption steps

-    required to support traditional PKWARE encryption.  This

-    form of encryption is considered weak by today's standards

-    and its use is recommended only for situations with

-    low security needs or for compatibility with older .ZIP 

-    applications.

-

-6.1 Traditional PKWARE Decryption

----------------------------------

-

-    6.1.1 PKWARE is grateful to Mr. Roger Schlafly for his expert 

-    contribution towards the development of PKWARE's traditional 

-    encryption.

-

-    6.1.2 PKZIP encrypts the compressed data stream.  Encrypted files 

-    must be decrypted before they can be extracted to their original

-    form.

-

-    6.1.3 Each encrypted file has an extra 12 bytes stored at the start 

-    of the data area defining the encryption header for that file.  The

-    encryption header is originally set to random values, and then

-    itself encrypted, using three, 32-bit keys.  The key values are

-    initialized using the supplied encryption password.  After each byte

-    is encrypted, the keys are then updated using pseudo-random number

-    generation techniques in combination with the same CRC-32 algorithm

-    used in PKZIP and described elsewhere in this document.

-

-    6.1.4 The following are the basic steps required to decrypt a file:

-

-    1) Initialize the three 32-bit keys with the password.

-    2) Read and decrypt the 12-byte encryption header, further

-       initializing the encryption keys.

-    3) Read and decrypt the compressed data stream using the

-       encryption keys.

-

-    6.1.5 Initializing the encryption keys

-        

-    Key(0) <- 305419896

-    Key(1) <- 591751049

-    Key(2) <- 878082192

-

-    loop for i <- 0 to length(password)-1

-        update_keys(password(i))

-    end loop

-

-    Where update_keys() is defined as:

-

-    update_keys(char):

-      Key(0) <- crc32(key(0),char)

-      Key(1) <- Key(1) + (Key(0) & 000000ffH)

-      Key(1) <- Key(1) * 134775813 + 1

-      Key(2) <- crc32(key(2),key(1) >> 24)

-    end update_keys

-

-    Where crc32(old_crc,char) is a routine that given a CRC value and a

-    character, returns an updated CRC value after applying the CRC-32

-    algorithm described elsewhere in this document.

-

-    6.1.6 Decrypting the encryption header

-        

-    The purpose of this step is to further initialize the encryption

-    keys, based on random data, to render a plaintext attack on the

-    data ineffective.

-

-    Read the 12-byte encryption header into Buffer, in locations

-    Buffer(0) thru Buffer(11).

-

-    loop for i <- 0 to 11

-        C <- buffer(i) ^ decrypt_byte()

-        update_keys(C)

-        buffer(i) <- C

-    end loop

-

-    Where decrypt_byte() is defined as:

-

-    unsigned char decrypt_byte()

-        local unsigned short temp

-        temp <- Key(2) | 2

-        decrypt_byte <- (temp * (temp ^ 1)) >> 8

-    end decrypt_byte

-

-    After the header is decrypted,  the last 1 or 2 bytes in Buffer

-    should be the high-order word/byte of the CRC for the file being

-    decrypted, stored in Intel low-byte/high-byte order.  Versions of

-    PKZIP prior to 2.0 used a 2 byte CRC check; a 1 byte CRC check is

-    used on versions after 2.0.  This can be used to test if the password

-    supplied is correct or not.

-

-    6.1.7 Decrypting the compressed data stream

-    

-    The compressed data stream can be decrypted as follows:

-

-    loop until done

-        read a character into C

-        Temp <- C ^ decrypt_byte()

-        update_keys(temp)

-        output Temp

-    end loop

-

-

-7.0 Strong Encryption Specification

------------------------------------

-

-   7.0.1 Portions of the Strong Encryption technology defined in this 

-   specification are covered under patents and pending patent applications.

-   Refer to the section in this document entitled "Incorporating 

-   PKWARE Proprietary Technology into Your Product" for more information.

-

-7.1 Strong Encryption Overview

-------------------------------

-

-   7.1.1 Version 5.x of this specification introduced support for strong 

-   encryption algorithms.  These algorithms can be used with either 

-   a password or an X.509v3 digital certificate to encrypt each file. 

-   This format specification supports either password or certificate 

-   based encryption to meet the security needs of today, to enable 

-   interoperability between users within both PKI and non-PKI 

-   environments, and to ensure interoperability between different 

-   computing platforms that are running a ZIP program.  

-

-   7.1.2 Password based encryption is the most common form of encryption 

-   people are familiar with.  However, inherent weaknesses with 

-   passwords (e.g. susceptibility to dictionary/brute force attack) 

-   as well as password management and support issues make certificate 

-   based encryption a more secure and scalable option.  Industry 

-   efforts and support are defining and moving towards more advanced 

-   security solutions built around X.509v3 digital certificates and 

-   Public Key Infrastructures(PKI) because of the greater scalability, 

-   administrative options, and more robust security over traditional 

-   password based encryption. 

-

-   7.1.3 Most standard encryption algorithms are supported with this

-   specification. Reference implementations for many of these 

-   algorithms are available from either commercial or open source 

-   distributors.  Readily available cryptographic toolkits make

-   implementation of the encryption features straight-forward.  

-   This document is not intended to provide a treatise on data 

-   encryption principles or theory.  Its purpose is to document the 

-   data structures required for implementing interoperable data 

-   encryption within the .ZIP format.  It is strongly recommended that 

-   you have a good understanding of data encryption before reading 

-   further.

-

-   7.1.4 The algorithms introduced in Version 5.0 of this specification 

-   include:

-

-      RC2 40 bit, 64 bit, and 128 bit

-      RC4 40 bit, 64 bit, and 128 bit

-      DES

-      3DES 112 bit and 168 bit

-  

-   Version 5.1 adds support for the following:

-

-      AES 128 bit, 192 bit, and 256 bit

-

-

-   7.1.5 Version 6.1 introduces encryption data changes to support 

-   interoperability with Smartcard and USB Token certificate storage 

-   methods which do not support the OAEP strengthening standard.

-

-   7.1.6 Version 6.2 introduces support for encrypting metadata by compressing 

-   and encrypting the central directory data structure to reduce information 

-   leakage.   Information leakage can occur in legacy ZIP applications 

-   through exposure of information about a file even though that file is 

-   stored encrypted.  The information exposed consists of file 

-   characteristics stored within the records and fields defined by this 

-   specification.  This includes data such as a file's name, its original 

-   size, timestamp and CRC32 value. 

-

-   7.1.7 Version 6.3 introduces support for encrypting data using the Blowfish

-   and Twofish algorithms.  These are symmetric block ciphers developed 

-   by Bruce Schneier.  Blowfish supports using a variable length key from 

-   32 to 448 bits.  Block size is 64 bits.  Implementations should use 16

-   rounds and the only mode supported within ZIP files is CBC. Twofish 

-   supports key sizes 128, 192 and 256 bits.  Block size is 128 bits.  

-   Implementations should use 16 rounds and the only mode supported within

-   ZIP files is CBC.  Information and source code for both Blowfish and 

-   Twofish algorithms can be found on the internet.  Consult with the author

-   of these algorithms for information on terms or restrictions on use.

-

-   7.1.8 Central Directory Encryption provides greater protection against 

-   information leakage by encrypting the Central Directory structure and 

-   by masking key values that are replicated in the unencrypted Local 

-   Header.   ZIP compatible programs that cannot interpret an encrypted 

-   Central Directory structure cannot rely on the data in the corresponding 

-   Local Header for decompression information.  

-

-   7.1.9 Extra Field records that may contain information about a file that should 

-   not be exposed should not be stored in the Local Header and should only 

-   be written to the Central Directory where they can be encrypted.  This 

-   design currently does not support streaming.  Information in the End of 

-   Central Directory record, the Zip64 End of Central Directory Locator, 

-   and the Zip64 End of Central Directory records are not encrypted.  Access 

-   to view data on files within a ZIP file with an encrypted Central Directory

-   requires the appropriate password or private key for decryption prior to 

-   viewing any files, or any information about the files, in the archive.  

-

-   7.1.10 Older ZIP compatible programs not familiar with the Central Directory 

-   Encryption feature will no longer be able to recognize the Central 

-   Directory and may assume the ZIP file is corrupt.  Programs that 

-   attempt streaming access using Local Headers will see invalid 

-   information for each file.  Central Directory Encryption need not be 

-   used for every ZIP file.  Its use is recommended for greater security.  

-   ZIP files not using Central Directory Encryption should operate as 

-   in the past. 

-

-   7.1.11 This strong encryption feature specification is intended to provide for 

-   scalable, cross-platform encryption needs ranging from simple password

-   encryption to authenticated public/private key encryption.  

-

-   7.1.12 Encryption provides data confidentiality and privacy.  It is 

-   recommended that you combine X.509 digital signing with encryption 

-   to add authentication and non-repudiation.

-

-

-7.2 Single Password Symmetric Encryption Method

------------------------------------------------

-

-   7.2.1 The Single Password Symmetric Encryption Method using strong    

-   encryption algorithms operates similarly to the traditional 

-   PKWARE encryption defined in this format.  Additional data 

-   structures are added to support the processing needs of the 

-   strong algorithms.

-

-   The Strong Encryption data structures are:

-

-   7.2.2 General Purpose Bits - Bits 0 and 6 of the General Purpose bit 

-   flag in both local and central header records.  Both bits set 

-   indicates strong encryption.  Bit 13, when set indicates the Central

-   Directory is encrypted and that selected fields in the Local Header

-   are masked to hide their actual value.

-

-

-    7.2.3 Extra Field 0x0017 in central header only.

-

-    Fields to consider in this record are:

-

-       7.2.3.1 Format - the data format identifier for this record.  The only

-       value allowed at this time is the integer value 2.

-

-       7.2.3.2 AlgId - integer identifier of the encryption algorithm from the

-       following range

-

-                 0x6601 - DES

-                 0x6602 - RC2 (version needed to extract < 5.2)

-                 0x6603 - 3DES 168

-                 0x6609 - 3DES 112

-                 0x660E - AES 128 

-                 0x660F - AES 192 

-                 0x6610 - AES 256 

-                 0x6702 - RC2 (version needed to extract >= 5.2)

-                 0x6720 - Blowfish

-                 0x6721 - Twofish

-                 0x6801 - RC4

-                 0xFFFF - Unknown algorithm

-

-       7.2.3.3 Bitlen - Explicit bit length of key

-

-                 32 - 448 bits

-           

-       7.2.3.4 Flags - Processing flags needed for decryption

-

-                 0x0001 - Password is required to decrypt

-                 0x0002 - Certificates only

-                 0x0003 - Password or certificate required to decrypt

-

-                 Values > 0x0003 reserved for certificate processing

-

-

-   7.2.4 Decryption header record preceding compressed file data.

-

-                 -Decryption Header:

-

-                  Value     Size     Description

-                  -----     ----     -----------

-                  IVSize    2 bytes  Size of initialization vector (IV)

-                  IVData    IVSize   Initialization vector for this file

-                  Size      4 bytes  Size of remaining decryption header data

-                  Format    2 bytes  Format definition for this record

-                  AlgID     2 bytes  Encryption algorithm identifier

-                  Bitlen    2 bytes  Bit length of encryption key

-                  Flags     2 bytes  Processing flags

-                  ErdSize   2 bytes  Size of Encrypted Random Data

-                  ErdData   ErdSize  Encrypted Random Data

-                  Reserved1 4 bytes  Reserved certificate processing data

-                  Reserved2 (var)    Reserved for certificate processing data

-                  VSize     2 bytes  Size of password validation data

-                  VData     VSize-4  Password validation data

-                  VCRC32    4 bytes  Standard ZIP CRC32 of password validation data

-

-       7.2.4.1 IVData - The size of the IV should match the algorithm block size.

-       The IVData can be completely random data.  If the size of

-       the randomly generated data does not match the block size

-       it should be complemented with zero's or truncated as

-       necessary.  If IVSize is 0,then IV = CRC32 + Uncompressed

-       File Size (as a 64 bit little-endian, unsigned integer value).

-

-       7.2.4.2 Format - the data format identifier for this record.  The only

-       value allowed at this time is the integer value 3.

-

-       7.2.4.3 AlgId - integer identifier of the encryption algorithm from the

-       following range

-

-                     0x6601 - DES

-                     0x6602 - RC2 (version needed to extract < 5.2)

-                     0x6603 - 3DES 168

-                     0x6609 - 3DES 112

-                     0x660E - AES 128 

-                     0x660F - AES 192 

-                     0x6610 - AES 256 

-                     0x6702 - RC2 (version needed to extract >= 5.2)

-                     0x6720 - Blowfish

-                     0x6721 - Twofish

-                     0x6801 - RC4

-                     0xFFFF - Unknown algorithm

-

-        7.2.4.4 Bitlen - Explicit bit length of key

-

-                     32 - 448 bits

-               

-        7.2.4.5 Flags - Processing flags needed for decryption

-

-                     0x0001 - Password is required to decrypt

-                     0x0002 - Certificates only

-                     0x0003 - Password or certificate required to decrypt

-

-                     Values > 0x0003 reserved for certificate processing

-

-        7.2.4.6 ErdData - Encrypted random data is used to store random data that

-        is used to generate a file session key for encrypting 

-        each file.  SHA1 is used to calculate hash data used to 

-        derive keys.  File session keys are derived from a master 

-        session key generated from the user-supplied password.

-        If the Flags field in the decryption header contains 

-        the value 0x4000, then the ErdData field must be 

-        decrypted using 3DES. If the value 0x4000 is not set,

-        then the ErdData field must be decrypted using AlgId.

-

-

-        7.2.4.7 Reserved1 - Reserved for certificate processing, if value is

-        zero, then Reserved2 data is absent.  See the explanation

-        under the Certificate Processing Method for details on

-        this data structure.

-

-        7.2.4.8 Reserved2 - If present, the size of the Reserved2 data structure 

-        is located by skipping the first 4 bytes of this field 

-        and using the next 2 bytes as the remaining size.  See

-        the explanation under the Certificate Processing Method

-        for details on this data structure.

-

-        7.2.4.9 VSize - This size value will always include the 4 bytes of the

-        VCRC32 data and will be greater than 4 bytes.

-

-        7.2.4.10 VData - Random data for password validation.  This data is VSize

-        in length and VSize must be a multiple of the encryption

-        block size.  VCRC32 is a checksum value of VData.  

-        VData and VCRC32 are stored encrypted and start the

-        stream of encrypted data for a file.

-

-

-    7.2.5 Useful Tips

-

-        7.2.5.1 Strong Encryption is always applied to a file after compression. The

-        block oriented algorithms all operate in Cypher Block Chaining (CBC) 

-        mode.  The block size used for AES encryption is 16.  All other block

-        algorithms use a block size of 8.  Two IDs are defined for RC2 to 

-        account for a discrepancy found in the implementation of the RC2

-        algorithm in the cryptographic library on Windows XP SP1 and all 

-        earlier versions of Windows.  It is recommended that zero length files

-        not be encrypted, however programs should be prepared to extract them

-        if they are found within a ZIP file.

-

-        7.2.5.2 A pseudo-code representation of the encryption process is as follows:

-

-            Password = GetUserPassword()

-            MasterSessionKey = DeriveKey(SHA1(Password)) 

-            RD = CryptographicStrengthRandomData() 

-            For Each File

-               IV = CryptographicStrengthRandomData() 

-               VData = CryptographicStrengthRandomData()

-               VCRC32 = CRC32(VData)

-               FileSessionKey = DeriveKey(SHA1(IV + RD) 

-               ErdData = Encrypt(RD,MasterSessionKey,IV) 

-               Encrypt(VData + VCRC32 + FileData, FileSessionKey,IV)

-            Done

-

-        7.2.5.3 The function names and parameter requirements will depend on

-        the choice of the cryptographic toolkit selected.  Almost any

-        toolkit supporting the reference implementations for each

-        algorithm can be used.  The RSA BSAFE(r), OpenSSL, and Microsoft

-        CryptoAPI libraries are all known to work well.  

-

-

- 7.3 Single Password - Central Directory Encryption

- --------------------------------------------------

-        

-    7.3.1 Central Directory Encryption is achieved within the .ZIP format by 

-    encrypting the Central Directory structure.  This encapsulates the metadata 

-    most often used for processing .ZIP files.  Additional metadata is stored for 

-    redundancy in the Local Header for each file.  The process of concealing 

-    metadata by encrypting the Central Directory does not protect the data within 

-    the Local Header.  To avoid information leakage from the exposed metadata 

-    in the Local Header, the fields containing information about a file are masked.  

-

-    7.3.2 Local Header

-

-    Masking replaces the true content of the fields for a file in the Local 

-    Header with false information.  When masked, the Local Header is not 

-    suitable for streaming access and the options for data recovery of damaged

-    archives is reduced.  Extra Data fields that may contain confidential

-    data should not be stored within the Local Header.  The value set into

-    the Version needed to extract field should be the correct value needed to

-    extract the file without regard to Central Directory Encryption. The fields 

-    within the Local Header targeted for masking when the Central Directory is 

-    encrypted are:

-

-            Field Name                     Mask Value

-            ------------------             ---------------------------

-            compression method              0

-            last mod file time              0

-            last mod file date              0

-            crc-32                          0

-            compressed size                 0

-            uncompressed size               0

-            file name (variable size)       Base 16 value from the

-                                            range 1 - 0xFFFFFFFFFFFFFFFF

-                                            represented as a string whose

-                                            size will be set into the

-                                            file name length field

-

-    The Base 16 value assigned as a masked file name is simply a sequentially

-    incremented value for each file starting with 1 for the first file.  

-    Modifications to a ZIP file may cause different values to be stored for 

-    each file.  For compatibility, the file name field in the Local Header 

-    should never be left blank.  As of Version 6.2 of this specification, 

-    the Compression Method and Compressed Size fields are not yet masked.

-    Fields having a value of 0xFFFF or 0xFFFFFFFF for the ZIP64 format

-    should not be masked.  

-

-    7.3.3 Encrypting the Central Directory

-

-    Encryption of the Central Directory does not include encryption of the 

-    Central Directory Signature data, the Zip64 End of Central Directory

-    record, the Zip64 End of Central Directory Locator, or the End

-    of Central Directory record.  The ZIP file comment data is never

-    encrypted.

-

-    Before encrypting the Central Directory, it may optionally be compressed.

-    Compression is not required, but for storage efficiency it is assumed

-    this structure will be compressed before encrypting.  Similarly, this 

-    specification supports compressing the Central Directory without

-    requiring that it also be encrypted.  Early implementations of this

-    feature will assume the encryption method applied to files matches the 

-    encryption applied to the Central Directory.

-

-    Encryption of the Central Directory is done in a manner similar to

-    that of file encryption.  The encrypted data is preceded by a 

-    decryption header.  The decryption header is known as the Archive

-    Decryption Header.  The fields of this record are identical to

-    the decryption header preceding each encrypted file.  The location

-    of the Archive Decryption Header is determined by the value in the

-    Start of the Central Directory field in the Zip64 End of Central

-    Directory record.  When the Central Directory is encrypted, the

-    Zip64 End of Central Directory record will always be present.

-

-    The layout of the Zip64 End of Central Directory record for all

-    versions starting with 6.2 of this specification will follow the

-    Version 2 format.  The Version 2 format is as follows:

-

-    The leading fixed size fields within the Version 1 format for this

-    record remain unchanged.  The record signature for both Version 1 

-    and Version 2 will be 0x06064b50.  Immediately following the last

-    byte of the field known as the Offset of Start of Central 

-    Directory With Respect to the Starting Disk Number will begin the 

-    new fields defining Version 2 of this record.  

-

-    7.3.4 New fields for Version 2

-

-    Note: all fields stored in Intel low-byte/high-byte order.

-

-              Value                 Size       Description

-              -----                 ----       -----------

-              Compression Method    2 bytes    Method used to compress the

-                                               Central Directory

-              Compressed Size       8 bytes    Size of the compressed data

-              Original   Size       8 bytes    Original uncompressed size

-              AlgId                 2 bytes    Encryption algorithm ID

-              BitLen                2 bytes    Encryption key length

-              Flags                 2 bytes    Encryption flags

-              HashID                2 bytes    Hash algorithm identifier

-              Hash Length           2 bytes    Length of hash data

-              Hash Data             (variable) Hash data

-

-     The Compression Method accepts the same range of values as the 

-     corresponding field in the Central Header.

-

-     The Compressed Size and Original Size values will not include the

-     data of the Central Directory Signature which is compressed or

-     encrypted.

-

-     The AlgId, BitLen, and Flags fields accept the same range of values

-     the corresponding fields within the 0x0017 record. 

-

-     Hash ID identifies the algorithm used to hash the Central Directory 

-     data.  This data does not have to be hashed, in which case the

-     values for both the HashID and Hash Length will be 0.  Possible 

-     values for HashID are:

-

-              Value         Algorithm

-             ------         ---------

-             0x0000          none

-             0x0001          CRC32

-             0x8003          MD5

-             0x8004          SHA1

-             0x8007          RIPEMD160

-             0x800C          SHA256

-             0x800D          SHA384

-             0x800E          SHA512

-

-     7.3.5 When the Central Directory data is signed, the same hash algorithm

-     used to hash the Central Directory for signing should be used.

-     This is recommended for processing efficiency, however, it is 

-     permissible for any of the above algorithms to be used independent 

-     of the signing process.

-

-     The Hash Data will contain the hash data for the Central Directory.

-     The length of this data will vary depending on the algorithm used.

-

-     The Version Needed to Extract should be set to 62.

-

-     The value for the Total Number of Entries on the Current Disk will

-     be 0.  These records will no longer support random access when

-     encrypting the Central Directory.

-

-     7.3.6 When the Central Directory is compressed and/or encrypted, the

-     End of Central Directory record will store the value 0xFFFFFFFF

-     as the value for the Total Number of Entries in the Central

-     Directory.  The value stored in the Total Number of Entries in

-     the Central Directory on this Disk field will be 0.  The actual

-     values will be stored in the equivalent fields of the Zip64

-     End of Central Directory record.

-

-     7.3.7 Decrypting and decompressing the Central Directory is accomplished

-     in the same manner as decrypting and decompressing a file.

-

- 7.4 Certificate Processing Method

- ---------------------------------

-

-    The Certificate Processing Method for ZIP file encryption 

-    defines the following additional data fields:

-

-    7.4.1 Certificate Flag Values

-

-    Additional processing flags that can be present in the Flags field of both 

-    the 0x0017 field of the central directory Extra Field and the Decryption 

-    header record preceding compressed file data are:

-

-         0x0007 - reserved for future use

-         0x000F - reserved for future use

-         0x0100 - Indicates non-OAEP key wrapping was used.  If this

-                  this field is set, the version needed to extract must

-                  be at least 61.  This means OAEP key wrapping is not

-                  used when generating a Master Session Key using

-                  ErdData.

-         0x4000 - ErdData must be decrypted using 3DES-168, otherwise use the

-                  same algorithm used for encrypting the file contents.

-         0x8000 - reserved for future use

-

-

-    7.4.2 CertData - Extra Field 0x0017 record certificate data structure

-

-    The data structure used to store certificate data within the section

-    of the Extra Field defined by the CertData field of the 0x0017

-    record are as shown:

-

-          Value     Size     Description

-          -----     ----     -----------

-          RCount    4 bytes  Number of recipients.  

-          HashAlg   2 bytes  Hash algorithm identifier

-          HSize     2 bytes  Hash size

-          SRList    (var)    Simple list of recipients hashed public keys

-

-                          

-         RCount    This defines the number intended recipients whose 

-                   public keys were used for encryption.  This identifies

-                   the number of elements in the SRList.

-

-         HashAlg   This defines the hash algorithm used to calculate

-                   the public key hash of each public key used

-                   for encryption. This field currently supports

-                   only the following value for SHA-1

-

-                   0x8004 - SHA1

-

-         HSize     This defines the size of a hashed public key.

-

-         SRList    This is a variable length list of the hashed 

-                   public keys for each intended recipient.  Each 

-                   element in this list is HSize.  The total size of 

-                   SRList is determined using RCount * HSize.

-

-

-    7.4.3 Reserved1 - Certificate Decryption Header Reserved1 Data

-

-          Value     Size     Description

-          -----     ----     -----------

-          RCount    4 bytes  Number of recipients.  

-                      

-          RCount   This defines the number intended recipients whose 

-                   public keys were used for encryption.  This defines

-                   the number of elements in the REList field defined below.

-

-

-    7.4.4 Reserved2 - Certificate Decryption Header Reserved2 Data Structures

-

-

-          Value     Size     Description

-          -----     ----     -----------

-          HashAlg   2 bytes  Hash algorithm identifier

-          HSize     2 bytes  Hash size

-          REList    (var)    List of recipient data elements

-

-

-         HashAlg   This defines the hash algorithm used to calculate

-                   the public key hash of each public key used

-                   for encryption. This field currently supports

-                   only the following value for SHA-1

-

-                       0x8004 - SHA1

-

-         HSize     This defines the size of a hashed public key

-                   defined in REHData.

-

-         REList    This is a variable length of list of recipient data.  

-                   Each element in this list consists of a Recipient

-                   Element data structure as follows:

-

-

-        Recipient Element (REList) Data Structure:

-

-              Value     Size     Description

-              -----     ----     -----------

-              RESize    2 bytes  Size of REHData + REKData

-              REHData   HSize    Hash of recipients public key

-              REKData   (var)    Simple key blob

-

-

-             RESize    This defines the size of an individual REList 

-                       element.  This value is the combined size of the

-                       REHData field + REKData field.  REHData is defined by

-                       HSize.  REKData is variable and can be calculated

-                       for each REList element using RESize and HSize.

-

-             REHData   Hashed public key for this recipient.

-

-             REKData   Simple Key Blob.  The format of this data structure

-                       is identical to that defined in the Microsoft

-                       CryptoAPI and generated using the CryptExportKey()

-                       function.  The version of the Simple Key Blob

-                       supported at this time is 0x02 as defined by

-                       Microsoft.

-

-7.5 Certificate Processing - Central Directory Encryption

----------------------------------------------------------

-        

-    7.5.1 Central Directory Encryption using Digital Certificates will 

-    operate in a manner similar to that of Single Password Central

-    Directory Encryption.  This record will only be present when there 

-    is data to place into it.  Currently, data is placed into this

-    record when digital certificates are used for either encrypting 

-    or signing the files within a ZIP file.  When only password 

-    encryption is used with no certificate encryption or digital 

-    signing, this record is not currently needed. When present, this 

-    record will appear before the start of the actual Central Directory 

-    data structure and will be located immediately after the Archive 

-    Decryption Header if the Central Directory is encrypted.

-

-    7.5.2 The Archive Extra Data record will be used to store the following

-    information.  Additional data may be added in future versions.

-

-    Extra Data Fields:

-

-    0x0014 - PKCS#7 Store for X.509 Certificates

-    0x0016 - X.509 Certificate ID and Signature for central directory

-    0x0019 - PKCS#7 Encryption Recipient Certificate List

-

-    The 0x0014 and 0x0016 Extra Data records that otherwise would be 

-    located in the first record of the Central Directory for digital 

-    certificate processing. When encrypting or compressing the Central 

-    Directory, the 0x0014 and 0x0016 records must be located in the 

-    Archive Extra Data record and they should not remain in the first 

-    Central Directory record.  The Archive Extra Data record will also 

-    be used to store the 0x0019 data. 

-

-    7.5.3 When present, the size of the Archive Extra Data record will be

-    included in the size of the Central Directory.  The data of the

-    Archive Extra Data record will also be compressed and encrypted

-    along with the Central Directory data structure.

-

-7.6 Certificate Processing Differences

---------------------------------------

-

-    7.6.1 The Certificate Processing Method of encryption differs from the

-    Single Password Symmetric Encryption Method as follows.  Instead

-    of using a user-defined password to generate a master session key,

-    cryptographically random data is used.  The key material is then

-    wrapped using standard key-wrapping techniques.  This key material

-    is wrapped using the public key of each recipient that will need

-    to decrypt the file using their corresponding private key.

-

-    7.6.2 This specification currently assumes digital certificates will follow

-    the X.509 V3 format for 1024 bit and higher RSA format digital

-    certificates.  Implementation of this Certificate Processing Method

-    requires supporting logic for key access and management.  This logic

-    is outside the scope of this specification.

-

-7.7 OAEP Processing with Certificate-based Encryption

------------------------------------------------------

-

-    7.7.1 OAEP stands for Optimal Asymmetric Encryption Padding.  It is a

-    strengthening technique used for small encoded items such as decryption

-    keys.  This is commonly applied in cryptographic key-wrapping techniques

-    and is supported by PKCS #1.  Versions 5.0 and 6.0 of this specification 

-    were designed to support OAEP key-wrapping for certificate-based 

-    decryption keys for additional security.  

-

-    7.7.2 Support for private keys stored on Smartcards or Tokens introduced

-    a conflict with this OAEP logic.  Most card and token products do 

-    not support the additional strengthening applied to OAEP key-wrapped 

-    data.  In order to resolve this conflict, versions 6.1 and above of this 

-    specification will no longer support OAEP when encrypting using 

-    digital certificates. 

-

-    7.7.3 Versions of PKZIP available during initial development of the 

-    certificate processing method set a value of 61 into the 

-    version needed to extract field for a file.  This indicates that 

-    non-OAEP key wrapping is used.  This affects certificate encryption 

-    only, and password encryption functions should not be affected by 

-    this value.  This means values of 61 may be found on files encrypted

-    with certificates only, or on files encrypted with both password

-    encryption and certificate encryption.  Files encrypted with both

-    methods can safely be decrypted using the password methods documented.

-

-8.0  Splitting and Spanning ZIP files

--------------------------------------

-

-    8.1 Spanned ZIP files

-

-      8.1.1 Spanning is the process of segmenting a ZIP file across 

-      multiple removable media. This support has typically only 

-      been provided for DOS formatted floppy diskettes. 

-

-    8.2 Split ZIP files

-

-      8.2.1 File splitting is a newer derivation of spanning.  

-      Splitting follows the same segmentation process as

-      spanning, however, it does not require writing each

-      segment to a unique removable medium and instead supports

-      placing all pieces onto local or non-removable locations

-      such as file systems, local drives, folders, etc.

-

-    8.3  File Naming Differences

-

-      8.3.1 A key difference between spanned and split ZIP files is

-      that all pieces of a spanned ZIP file have the same name.  

-      Since each piece is written to a separate volume, no name 

-      collisions occur and each segment can reuse the original 

-      .ZIP file name given to the archive.

-

-      8.3.2 Sequence ordering for DOS spanned archives uses the DOS 

-      volume label to determine segment numbers.  Volume labels

-      for each segment are written using the form PKBACK#xxx, 

-      where xxx is the segment number written as a decimal 

-      value from 001 - nnn.

-

-      8.3.3 Split ZIP files are typically written to the same location

-      and are subject to name collisions if the spanned name

-      format is used since each segment will reside on the same 

-      drive. To avoid name collisions, split archives are named 

-      as follows.

-

-      Segment 1   = filename.z01

-      Segment n-1 = filename.z(n-1)

-      Segment n   = filename.zip

-

-      8.3.4 The .ZIP extension is used on the last segment to support

-      quickly reading the central directory.  The segment number

-      n should be a decimal value.

-        

-    8.4  Spanned Self-extracting ZIP Files

-        

-      8.4.1 Spanned ZIP files may be PKSFX Self-extracting ZIP files.

-      PKSFX files may also be split, however, in this case

-      the first segment must be named filename.exe.  The first

-      segment of a split PKSFX archive must be large enough to

-      include the entire executable program.

-

-    8.5  Capacities and Markers

-        

-      8.5.1 Capacities for split archives are as follows:

-

-      Maximum number of segments = 4,294,967,295 - 1

-      Maximum .ZIP segment size = 4,294,967,295 bytes

-      Minimum segment size = 64K

-      Maximum PKSFX segment size = 2,147,483,647 bytes

-          

-      8.5.2 Segment sizes may be different however by convention, all 

-      segment sizes should be the same with the exception of the 

-      last, which may be smaller.  Local and central directory 

-      header records must never be split across a segment boundary. 

-      When writing a header record, if the number of bytes remaining 

-      within a segment is less than the size of the header record,

-      end the current segment and write the header at the start

-      of the next segment.  The central directory may span segment

-      boundaries, but no single record in the central directory

-      should be split across segments.

-

-      8.5.3 Spanned/Split archives created using PKZIP for Windows

-      (V2.50 or greater), PKZIP Command Line (V2.50 or greater),

-      or PKZIP Explorer will include a special spanning 

-      signature as the first 4 bytes of the first segment of

-      the archive.  This signature (0x08074b50) will be 

-      followed immediately by the local header signature for

-      the first file in the archive.  

-

-      8.5.4 A special spanning marker may also appear in spanned/split 

-      archives if the spanning or splitting process starts but 

-      only requires one segment.  In this case the 0x08074b50 

-      signature will be replaced with the temporary spanning 

-      marker signature of 0x30304b50.  Split archives can

-      only be uncompressed by other versions of PKZIP that

-      know how to create a split archive.

-

-      8.5.5 The signature value 0x08074b50 is also used by some

-      ZIP implementations as a marker for the Data Descriptor 

-      record.  Conflict in this alternate assignment can be

-      avoided by ensuring the position of the signature

-      within the ZIP file to determine the use for which it

-      is intended.  

-

-9.0 Change Process

-------------------

-

-   9.1 In order for the .ZIP file format to remain a viable technology, this

-   specification should be considered as open for periodic review and

-   revision.  Although this format was originally designed with a 

-   certain level of extensibility, not all changes in technology

-   (present or future) were or will be necessarily considered in its

-   design.  

-

-   9.2 If your application requires new definitions to the

-   extensible sections in this format, or if you would like to 

-   submit new data structures or new capabilities, please forward 

-   your request to zipformat@pkware.com.  All submissions will be 

-   reviewed by the ZIP File Specification Committee for possible 

-   inclusion into future versions of this specification.  

-

-   9.3 Periodic revisions to this specification will be published as

-   DRAFT or as FINAL status to ensure interoperability. We encourage 

-   comments and feedback that may help improve clarity or content.

-

-

-10.0 Incorporating PKWARE Proprietary Technology into Your Product

-------------------------------------------------------------------

-

-   10.1 The Use or Implementation in a product of APPNOTE technological 

-   components pertaining to either strong encryption or patching requires 

-   a separate, executed license agreement from PKWARE. Please contact 

-   PKWARE at zipformat@pkware.com or +1-414-289-9788 with regard to 

-   acquiring such a license.

-

-   10.2 Additional information regarding PKWARE proprietray technology is 

-   available at http://www.pkware.com/appnote.

-

-11.0 Acknowledgements

----------------------

-

-   In addition to the above mentioned contributors to PKZIP and PKUNZIP,

-   PKWARE would like to extend special thanks to Robert Mahoney for 

-   suggesting the extension .ZIP for this software.

-

-12.0 References

----------------

-

-   Fiala, Edward R., and Greene, Daniel H., "Data compression with

-      finite windows",  Communications of the ACM, Volume 32, Number 4,

-      April 1989, pages 490-505.

-

-   Held, Gilbert, "Data Compression, Techniques and Applications,

-      Hardware and Software Considerations", John Wiley & Sons, 1987.

-

-   Huffman, D.A., "A method for the construction of minimum-redundancy

-      codes", Proceedings of the IRE, Volume 40, Number 9, September 1952,

-      pages 1098-1101.

-

-   Nelson, Mark, "LZW Data Compression", Dr. Dobbs Journal, Volume 14,

-      Number 10, October 1989, pages 29-37.

-

-   Nelson, Mark, "The Data Compression Book",  M&T Books, 1991.

-

-   Storer, James A., "Data Compression, Methods and Theory",

-      Computer Science Press, 1988

-

-   Welch, Terry, "A Technique for High-Performance Data Compression",

-      IEEE Computer, Volume 17, Number 6, June 1984, pages 8-19.

-

-   Ziv, J. and Lempel, A., "A universal algorithm for sequential data

-      compression", Communications of the ACM, Volume 30, Number 6,

-       June 1987, pages 520-540.

-

-   Ziv, J. and Lempel, A., "Compression of individual sequences via

-      variable-rate coding", IEEE Transactions on Information Theory,

-      Volume 24, Number 5, September 1978, pages 530-536.

-

-

-APPENDIX A - AS/400 Extra Field (0x0065) Attribute Definitions

---------------------------------------------------------------

-

-A.1 Field Definition Structure:

-

-   a. field length including length             2 bytes

-   b. field code                                2 bytes

-   c. data                                      x bytes

-

-A.2 Field Code  Description

-

-   4001     Source type i.e. CLP etc

-   4002     The text description of the library 

-   4003     The text description of the file

-   4004     The text description of the member

-   4005     x'F0' or 0 is PF-DTA,  x'F1' or 1 is PF_SRC

-   4007     Database Type Code                  1 byte

-   4008     Database file and fields definition

-   4009     GZIP file type                      2 bytes

-   400B     IFS code page                       2 bytes

-   400C     IFS Creation Time                   4 bytes

-   400D     IFS Access Time                     4 bytes

-   400E     IFS Modification time               4 bytes

-   005C     Length of the records in the file   2 bytes

-   0068     GZIP two words                      8 bytes

-

-APPENDIX B - z/OS Extra Field (0x0065) Attribute Definitions

-------------------------------------------------------------

-

-B.1 Field Definition Structure:

-

-   a. field length including length             2 bytes

-   b. field code                                2 bytes

-   c. data                                      x bytes

-

-B.2 Field Code  Description

-

-   0001     File Type                           2 bytes 

-   0002     NonVSAM Record Format               1 byte

-   0003     Reserved                

-   0004     NonVSAM Block Size                  2 bytes Big Endian

-   0005     Primary Space Allocation            3 bytes Big Endian

-   0006     Secondary Space Allocation          3 bytes Big Endian

-   0007     Space Allocation Type1 byte flag                

-   0008     Modification Date                   Retired with PKZIP 5.0 +

-   0009     Expiration Date                     Retired with PKZIP 5.0 +

-   000A     PDS Directory Block Allocation      3 bytes Big Endian binary value

-   000B     NonVSAM Volume List                 variable                

-   000C     UNIT Reference                      Retired with PKZIP 5.0 +

-   000D     DF/SMS Management Class             8 bytes EBCDIC Text Value

-   000E     DF/SMS Storage Class                8 bytes EBCDIC Text Value

-   000F     DF/SMS Data Class                   8 bytes EBCDIC Text Value

-   0010     PDS/PDSE Member Info.               30 bytes        

-   0011     VSAM sub-filetype                   2 bytes                

-   0012     VSAM LRECL                          13 bytes EBCDIC "(num_avg num_max)"

-   0013     VSAM Cluster Name                   Retired with PKZIP 5.0 +

-   0014     VSAM KSDS Key Information           13 bytes EBCDIC "(num_length num_position)"

-   0015     VSAM Average LRECL                  5 bytes EBCDIC num_value padded with blanks

-   0016     VSAM Maximum LRECL                  5 bytes EBCDIC num_value padded with blanks

-   0017     VSAM KSDS Key Length                5 bytes EBCDIC num_value padded with blanks

-   0018     VSAM KSDS Key Position              5 bytes EBCDIC num_value padded with blanks

-   0019     VSAM Data Name                      1-44 bytes EBCDIC text string

-   001A     VSAM KSDS Index Name                1-44 bytes EBCDIC text string

-   001B     VSAM Catalog Name                   1-44 bytes EBCDIC text string

-   001C     VSAM Data Space Type                9 bytes EBCDIC text string

-   001D     VSAM Data Space Primary             9 bytes EBCDIC num_value left-justified

-   001E     VSAM Data Space Secondary           9 bytes EBCDIC num_value left-justified

-   001F     VSAM Data Volume List               variable EBCDIC text list of 6-character Volume IDs

-   0020     VSAM Data Buffer Space              8 bytes EBCDIC num_value left-justified

-   0021     VSAM Data CISIZE                    5 bytes EBCDIC num_value left-justified

-   0022     VSAM Erase Flag                     1 byte flag                

-   0023     VSAM Free CI %                      3 bytes EBCDIC num_value left-justified

-   0024     VSAM Free CA %                      3 bytes EBCDIC num_value left-justified

-   0025     VSAM Index Volume List              variable EBCDIC text list of 6-character Volume IDs

-   0026     VSAM Ordered Flag                   1 byte flag                

-   0027     VSAM REUSE Flag                     1 byte flag                

-   0028     VSAM SPANNED Flag                   1 byte flag                

-   0029     VSAM Recovery Flag                  1 byte flag                

-   002A     VSAM  WRITECHK  Flag                1 byte flag                

-   002B     VSAM Cluster/Data SHROPTS           3 bytes EBCDIC "n,y"        

-   002C     VSAM Index SHROPTS                  3 bytes EBCDIC "n,y"        

-   002D     VSAM Index Space Type               9 bytes EBCDIC text string

-   002E     VSAM Index Space Primary            9 bytes EBCDIC num_value left-justified

-   002F     VSAM Index Space Secondary          9 bytes EBCDIC num_value left-justified

-   0030     VSAM Index CISIZE                   5 bytes EBCDIC num_value left-justified

-   0031     VSAM Index IMBED                    1 byte flag                

-   0032     VSAM Index Ordered Flag             1 byte flag                

-   0033     VSAM REPLICATE Flag                 1 byte flag                

-   0034     VSAM Index REUSE Flag               1 byte flag                

-   0035     VSAM Index WRITECHK Flag            1 byte flag Retired with PKZIP 5.0 +

-   0036     VSAM Owner                          8 bytes EBCDIC text string

-   0037     VSAM Index Owner                    8 bytes EBCDIC text string

-   0038     Reserved

-   0039     Reserved

-   003A     Reserved

-   003B     Reserved

-   003C     Reserved

-   003D     Reserved

-   003E     Reserved

-   003F     Reserved

-   0040     Reserved

-   0041     Reserved

-   0042     Reserved

-   0043     Reserved

-   0044     Reserved

-   0045     Reserved

-   0046     Reserved

-   0047     Reserved

-   0048     Reserved

-   0049     Reserved

-   004A     Reserved

-   004B     Reserved

-   004C     Reserved

-   004D     Reserved

-   004E     Reserved

-   004F     Reserved

-   0050     Reserved

-   0051     Reserved

-   0052     Reserved

-   0053     Reserved

-   0054     Reserved

-   0055     Reserved

-   0056     Reserved

-   0057     Reserved

-   0058     PDS/PDSE Member TTR Info.           6 bytes  Big Endian

-   0059     PDS 1st LMOD Text TTR               3 bytes  Big Endian

-   005A     PDS LMOD EP Rec #                   4 bytes  Big Endian

-   005B     Reserved

-   005C     Max Length of records               2 bytes  Big Endian

-   005D     PDSE Flag                           1 byte flag

-   005E     Reserved

-   005F     Reserved

-   0060     Reserved

-   0061     Reserved

-   0062     Reserved

-   0063     Reserved

-   0064     Reserved

-   0065     Last Date Referenced                4 bytes  Packed Hex "yyyymmdd"

-   0066     Date Created                        4 bytes  Packed Hex "yyyymmdd"

-   0068     GZIP two words                      8 bytes

-   0071     Extended NOTE Location              12 bytes Big Endian

-   0072     Archive device UNIT                 6 bytes  EBCDIC

-   0073     Archive 1st Volume                  6 bytes  EBCDIC

-   0074     Archive 1st VOL File Seq#           2 bytes  Binary

-

-APPENDIX C - Zip64 Extensible Data Sector Mappings 

----------------------------------------------------

-

-         -Z390   Extra Field:

-

-          The following is the general layout of the attributes for the 

-          ZIP 64 "extra" block for extended tape operations.  

-

-          Note: some fields stored in Big Endian format.  All text is 

-          in EBCDIC format unless otherwise specified.

-

-          Value       Size          Description

-          -----       ----          -----------

-  (Z390)  0x0065      2 bytes       Tag for this "extra" block type

-          Size        4 bytes       Size for the following data block

-          Tag         4 bytes       EBCDIC "Z390"

-          Length71    2 bytes       Big Endian

-          Subcode71   2 bytes       Enote type code

-          FMEPos      1 byte

-          Length72    2 bytes       Big Endian

-          Subcode72   2 bytes       Unit type code

-          Unit        1 byte        Unit

-          Length73    2 bytes       Big Endian

-          Subcode73   2 bytes       Volume1 type code

-          FirstVol    1 byte        Volume

-          Length74    2 bytes       Big Endian

-          Subcode74   2 bytes       FirstVol file sequence

-          FileSeq     2 bytes       Sequence 

-

-APPENDIX D - Language Encoding (EFS)

-------------------------------------

-

-D.1 The ZIP format has historically supported only the original IBM PC character 

-encoding set, commonly referred to as IBM Code Page 437.  This limits storing 

-file name characters to only those within the original MS-DOS range of values 

-and does not properly support file names in other character encodings, or 

-languages. To address this limitation, this specification will support the 

-following change. 

-

-D.2 If general purpose bit 11 is unset, the file name and comment should conform 

-to the original ZIP character encoding.  If general purpose bit 11 is set, the 

-filename and comment must support The Unicode Standard, Version 4.1.0 or 

-greater using the character encoding form defined by the UTF-8 storage 

-specification.  The Unicode Standard is published by the The Unicode

-Consortium (www.unicode.org).  UTF-8 encoded data stored within ZIP files 

-is expected to not include a byte order mark (BOM). 

-

-D.3 Applications may choose to supplement this file name storage through the use 

-of the 0x0008 Extra Field.  Storage for this optional field is currently 

-undefined, however it will be used to allow storing extended information 

-on source or target encoding that may further assist applications with file 

-name, or file content encoding tasks.  Please contact PKWARE with any

-requirements on how this field should be used.

-

-D.4 The 0x0008 Extra Field storage may be used with either setting for general 

-purpose bit 11.  Examples of the intended usage for this field is to store 

-whether "modified-UTF-8" (JAVA) is used, or UTF-8-MAC.  Similarly, other 

-commonly used character encoding (code page) designations can be indicated 

-through this field.  Formalized values for use of the 0x0008 record remain 

-undefined at this time.  The definition for the layout of the 0x0008 field

-will be published when available.  Use of the 0x0008 Extra Field provides

-for storing data within a ZIP file in an encoding other than IBM Code

-Page 437 or UTF-8.

-

-D.5 General purpose bit 11 will not imply any encoding of file content or

-password.  Values defining character encoding for file content or 

-password must be stored within the 0x0008 Extended Language Encoding 

-Extra Field.

-

-D.6 Ed Gordon of the Info-ZIP group has defined a pair of "extra field" records 

-that can be used to store UTF-8 file name and file comment fields.  These

-records can be used for cases when the general purpose bit 11 method

-for storing UTF-8 data in the standard file name and comment fields is

-not desirable.  A common case for this alternate method is if backward

-compatibility with older programs is required.

-

-D.7 Definitions for the record structure of these fields are included above 

-in the section on 3rd party mappings for "extra field" records.  These

-records are identified by Header ID's 0x6375 (Info-ZIP Unicode Comment 

-Extra Field) and 0x7075 (Info-ZIP Unicode Path Extra Field).

-

-D.8 The choice of which storage method to use when writing a ZIP file is left

-to the implementation.  Developers should expect that a ZIP file may 

-contain either method and should provide support for reading data in 

-either format. Use of general purpose bit 11 reduces storage requirements 

-for file name data by not requiring additional "extra field" data for

-each file, but can result in older ZIP programs not being able to extract 

-files.  Use of the 0x6375 and 0x7075 records will result in a ZIP file 

-that should always be readable by older ZIP programs, but requires more 

-storage per file to write file name and/or file comment fields.

diff --git a/docs/extrafld.txt b/docs/extrafld.txt
deleted file mode 100644
index 624e05c..0000000
--- a/docs/extrafld.txt
+++ /dev/null
@@ -1,1372 +0,0 @@
-The following are the known types of zipfile extra fields as of this
-writing.  Extra fields are documented in PKWARE's appnote.txt and are
-intended to allow for backward- and forward-compatible extensions to
-the zipfile format.  Multiple extra-field types may be chained together,
-provided that the total length of all extra-field data is less than 64KB.
-(In fact, PKWARE requires that the total length of the entire file header,
-including timestamp, file attributes, filename, comment, extra field, etc.,
-be no more than 64KB.)
-
-Each extra-field type (or subblock) must contain a four-byte header con-
-sisting of a two-byte header ID and a two-byte length (little-endian) for
-the remaining data in the subblock.  If there are additional subblocks
-within the extra field, the header for each one will appear immediately
-following the data for the previous subblock (i.e., with no padding for
-alignment).
-
-All integer fields in the descriptions below are in little-endian (Intel)
-format unless otherwise specified.  Note that "Short" means two bytes,
-"Long" means four bytes, and "Long-Long" means eight bytes, regardless
-of their native sizes.  Unless specifically noted, all integer fields should
-be interpreted as unsigned (non-negative) numbers.
-
-Christian Spieler, 20010517
-
-Updated to include the Unicode extra fields.  Added new Unix extra field.
-
-Ed Gordon, 20060819, 20070607, 20070909, 20080426, 20080509
-
-                        -------------------------
-
-          Header ID's of 0 thru 31 are reserved for use by PKWARE.
-          The remaining ID's can be used by third party vendors for
-          proprietary usage.
-
-          The current Header ID mappings defined by PKWARE are:
-
-          0x0001        ZIP64 extended information extra field
-          0x0007        AV Info
-          0x0009        OS/2 extended attributes      (also Info-ZIP)
-          0x000a        NTFS (Win9x/WinNT FileTimes)
-          0x000c        OpenVMS                       (also Info-ZIP)
-          0x000d        Unix
-          0x000f        Patch Descriptor
-          0x0014        PKCS#7 Store for X.509 Certificates
-          0x0015        X.509 Certificate ID and Signature for
-                        individual file
-          0x0016        X.509 Certificate ID for Central Directory
-
-          The Header ID mappings defined by Info-ZIP and third parties are:
-
-          0x0065        IBM S/390 attributes - uncompressed
-          0x0066        IBM S/390 attributes - compressed
-          0x07c8        Info-ZIP Macintosh (old, J. Lee)
-          0x2605        ZipIt Macintosh (first version)
-          0x2705        ZipIt Macintosh v 1.3.5 and newer (w/o full filename)
-          0x334d        Info-ZIP Macintosh (new, D. Haase's 'Mac3' field )
-          0x4154        Tandem NSK
-          0x4341        Acorn/SparkFS (David Pilling)
-          0x4453        Windows NT security descriptor (binary ACL)
-          0x4704        VM/CMS
-          0x470f        MVS
-          0x4854        Theos, old inofficial port
-          0x4b46        FWKCS MD5 (see below)
-          0x4c41        OS/2 access control list (text ACL)
-          0x4d49        Info-ZIP OpenVMS (obsolete)
-          0x4d63        Macintosh SmartZIP, by Macro Bambini
-          0x4f4c        Xceed original location extra field
-          0x5356        AOS/VS (binary ACL)
-          0x5455        extended timestamp
-          0x5855        Info-ZIP Unix (original; also OS/2, NT, etc.)
-          0x554e        Xceed unicode extra field
-          0x6375        Info-ZIP Unicode Comment
-          0x6542        BeOS (BeBox, PowerMac, etc.)
-          0x6854        Theos
-          0x7075        Info-ZIP Unicode Path
-          0x756e        ASi Unix
-          0x7855        Info-ZIP Unix (previous new)
-          0x7875        Info-ZIP Unix (new)
-          0xfb4a        SMS/QDOS
-
-The following are detailed descriptions of the known extra-field block types:
-
-         -OS/2 Extended Attributes Extra Field:
-          ====================================
-
-          The following is the layout of the OS/2 extended attributes "extra"
-          block.  (Last Revision 19960922)
-
-          Note: all fields stored in Intel low-byte/high-byte order.
-
-          Local-header version:
-
-          Value         Size        Description
-          -----         ----        -----------
-  (OS/2)  0x0009        Short       tag for this extra block type
-          TSize         Short       total data size for this block
-          BSize         Long        uncompressed EA data size
-          CType         Short       compression type
-          EACRC         Long        CRC value for uncompressed EA data
-          (var.)        variable    compressed EA data
-
-          Central-header version:
-
-          Value         Size        Description
-          -----         ----        -----------
-  (OS/2)  0x0009        Short       tag for this extra block type
-          TSize         Short       total data size for this block (4)
-          BSize         Long        size of uncompressed local EA data
-
-          The value of CType is interpreted according to the "compression
-          method" section above; i.e., 0 for stored, 8 for deflated, etc.
-
-          The OS/2 extended attribute structure (FEA2LIST) is compressed and
-          then stored in its entirety within this structure.  There will only
-          ever be one block of data in the variable-length field.
-
-
-         -OS/2 Access Control List Extra Field:
-          ====================================
-
-          The following is the layout of the OS/2 ACL extra block.
-          (Last Revision 19960922)
-
-          Local-header version:
-
-          Value         Size        Description
-          -----         ----        -----------
-  (ACL)   0x4c41        Short       tag for this extra block type ("AL")
-          TSize         Short       total data size for this block
-          BSize         Long        uncompressed ACL data size
-          CType         Short       compression type
-          EACRC         Long        CRC value for uncompressed ACL data
-          (var.)        variable    compressed ACL data
-
-          Central-header version:
-
-          Value         Size        Description
-          -----         ----        -----------
-  (ACL)   0x4c41        Short       tag for this extra block type ("AL")
-          TSize         Short       total data size for this block (4)
-          BSize         Long        size of uncompressed local ACL data
-
-          The value of CType is interpreted according to the "compression
-          method" section above; i.e., 0 for stored, 8 for deflated, etc.
-
-          The uncompressed ACL data consist of a text header of the form
-          "ACL1:%hX,%hd\n", where the first field is the OS/2 ACCINFO acc_attr
-          member and the second is acc_count, followed by acc_count strings
-          of the form "%s,%hx\n", where the first field is acl_ugname (user
-          group name) and the second acl_access.  This block type will be
-          extended for other operating systems as needed.
-
-
-         -Windows NT Security Descriptor Extra Field:
-          ==========================================
-
-          The following is the layout of the NT Security Descriptor (another
-          type of ACL) extra block.  (Last Revision 19960922)
-
-          Local-header version:
-
-          Value         Size        Description
-          -----         ----        -----------
-  (SD)    0x4453        Short       tag for this extra block type ("SD")
-          TSize         Short       total data size for this block
-          BSize         Long        uncompressed SD data size
-          Version       Byte        version of uncompressed SD data format
-          CType         Short       compression type
-          EACRC         Long        CRC value for uncompressed SD data
-          (var.)        variable    compressed SD data
-
-          Central-header version:
-
-          Value         Size        Description
-          -----         ----        -----------
-  (SD)    0x4453        Short       tag for this extra block type ("SD")
-          TSize         Short       total data size for this block (4)
-          BSize         Long        size of uncompressed local SD data
-
-          The value of CType is interpreted according to the "compression
-          method" section above; i.e., 0 for stored, 8 for deflated, etc.
-          Version specifies how the compressed data are to be interpreted
-          and allows for future expansion of this extra field type.  Currently
-          only version 0 is defined.
-
-          For version 0, the compressed data are to be interpreted as a single
-          valid Windows NT SECURITY_DESCRIPTOR data structure, in self-relative
-          format.
-
-
-         -PKWARE Win95/WinNT Extra Field:
-          ==============================
-
-          The following description covers PKWARE's "NTFS" attributes
-          "extra" block, introduced with the release of PKZIP 2.50 for
-          Windows. (Last Revision 20001118)
-
-          (Note: At this time the Mtime, Atime and Ctime values may
-          be used on any WIN32 system.)
-         [Info-ZIP note: In the current implementations, this field has
-          a fixed total data size of 32 bytes and is only stored as local
-          extra field.]
-
-          Value         Size        Description
-          -----         ----        -----------
-  (NTFS)  0x000a        Short       Tag for this "extra" block type
-          TSize         Short       Total Data Size for this block
-          Reserved      Long        for future use
-          Tag1          Short       NTFS attribute tag value #1
-          Size1         Short       Size of attribute #1, in bytes
-          (var.)        SubSize1    Attribute #1 data
-          .
-          .
-          .
-          TagN          Short       NTFS attribute tag value #N
-          SizeN         Short       Size of attribute #N, in bytes
-          (var.)        SubSize1    Attribute #N data
-
-          For NTFS, values for Tag1 through TagN are as follows:
-          (currently only one set of attributes is defined for NTFS)
-
-          Tag        Size       Description
-          -----      ----       -----------
-          0x0001     2 bytes    Tag for attribute #1
-          Size1      2 bytes    Size of attribute #1, in bytes (24)
-          Mtime      8 bytes    64-bit NTFS file last modification time
-          Atime      8 bytes    64-bit NTFS file last access time
-          Ctime      8 bytes    64-bit NTFS file creation time
-
-          The total length for this block is 28 bytes, resulting in a
-          fixed size value of 32 for the TSize field of the NTFS block.
-
-          The NTFS filetimes are 64-bit unsigned integers, stored in Intel
-          (least significant byte first) byte order. They determine the
-          number of 1.0E-07 seconds (1/10th microseconds!) past WinNT "epoch",
-          which is "01-Jan-1601 00:00:00 UTC".
-
-
-         -PKWARE OpenVMS Extra Field:
-          ==========================
-
-          The following is the layout of PKWARE's OpenVMS attributes "extra"
-          block.  (Last Revision 12/17/91)
-
-          Note: all fields stored in Intel low-byte/high-byte order.
-
-          Value         Size        Description
-          -----         ----        -----------
-  (VMS)   0x000c        Short       Tag for this "extra" block type
-          TSize         Short       Total Data Size for this block
-          CRC           Long        32-bit CRC for remainder of the block
-          Tag1          Short       OpenVMS attribute tag value #1
-          Size1         Short       Size of attribute #1, in bytes
-          (var.)        Size1       Attribute #1 data
-          .
-          .
-          .
-          TagN          Short       OpenVMS attribute tage value #N
-          SizeN         Short       Size of attribute #N, in bytes
-          (var.)        SizeN       Attribute #N data
-
-          Rules:
-
-          1. There will be one or more of attributes present, which
-             will each be preceded by the above TagX & SizeX values.
-             These values are identical to the ATR$C_XXXX and
-             ATR$S_XXXX constants which are defined in ATR.H under
-             OpenVMS C.  Neither of these values will ever be zero.
-
-          2. No word alignment or padding is performed.
-
-          3. A well-behaved PKZIP/OpenVMS program should never produce
-             more than one sub-block with the same TagX value.  Also,
-             there will never be more than one "extra" block of type
-             0x000c in a particular directory record.
-
-
-         -Info-ZIP VMS Extra Field:
-          ========================
-
-          The following is the layout of Info-ZIP's VMS attributes extra
-          block for VAX or Alpha AXP.  The local-header and central-header
-          versions are identical.  (Last Revision 19960922)
-
-          Value         Size        Description
-          -----         ----        -----------
-  (VMS2)  0x4d49        Short       tag for this extra block type ("JM")
-          TSize         Short       total data size for this block
-          ID            Long        block ID
-          Flags         Short       info bytes
-          BSize         Short       uncompressed block size
-          Reserved      Long        (reserved)
-          (var.)        variable    compressed VMS file-attributes block
-
-          The block ID is one of the following unterminated strings:
-
-                "VFAB"          struct FAB
-                "VALL"          struct XABALL
-                "VFHC"          struct XABFHC
-                "VDAT"          struct XABDAT
-                "VRDT"          struct XABRDT
-                "VPRO"          struct XABPRO
-                "VKEY"          struct XABKEY
-                "VMSV"          version (e.g., "V6.1"; truncated at hyphen)
-                "VNAM"          reserved
-
-          The lower three bits of Flags indicate the compression method.  The
-          currently defined methods are:
-
-                0       stored (not compressed)
-                1       simple "RLE"
-                2       deflated
-
-          The "RLE" method simply replaces zero-valued bytes with zero-valued
-          bits and non-zero-valued bytes with a "1" bit followed by the byte
-          value.
-
-          The variable-length compressed data contains only the data corre-
-          sponding to the indicated structure or string.  Typically multiple
-          VMS2 extra fields are present (each with a unique block type).
-
-
-         -Info-ZIP Macintosh Extra Field:
-          ==============================
-
-          The following is the layout of the (old) Info-ZIP resource-fork extra
-          block for Macintosh.  The local-header and central-header versions
-          are identical.  (Last Revision 19960922)
-
-          Value         Size        Description
-          -----         ----        -----------
-  (Mac)   0x07c8        Short       tag for this extra block type
-          TSize         Short       total data size for this block
-          "JLEE"        beLong      extra-field signature
-          FInfo         16 bytes    Macintosh FInfo structure
-          CrDat         beLong      HParamBlockRec fileParam.ioFlCrDat
-          MdDat         beLong      HParamBlockRec fileParam.ioFlMdDat
-          Flags         beLong      info bits
-          DirID         beLong      HParamBlockRec fileParam.ioDirID
-          VolName       28 bytes    volume name (optional)
-
-          All fields but the first two are in native Macintosh format
-          (big-endian Motorola order, not little-endian Intel).  The least
-          significant bit of Flags is 1 if the file is a data fork, 0 other-
-          wise.  In addition, if this extra field is present, the filename
-          has an extra 'd' or 'r' appended to indicate data fork or resource
-          fork.  The 28-byte VolName field may be omitted.
-
-
-         -ZipIt Macintosh Extra Field (long):
-          ==================================
-
-          The following is the layout of the ZipIt extra block for Macintosh.
-          The local-header and central-header versions are identical.
-          (Last Revision 19970130)
-
-          Value         Size        Description
-          -----         ----        -----------
-  (Mac2)  0x2605        Short       tag for this extra block type
-          TSize         Short       total data size for this block
-          "ZPIT"        beLong      extra-field signature
-          FnLen         Byte        length of FileName
-          FileName      variable    full Macintosh filename
-          FileType      Byte[4]     four-byte Mac file type string
-          Creator       Byte[4]     four-byte Mac creator string
-
-
-         -ZipIt Macintosh Extra Field (short):
-          ===================================
-
-          The following is the layout of a shortened variant of the
-          ZipIt extra block for Macintosh (without "full name" entry).
-          This variant is used by ZipIt 1.3.5 and newer for entries that
-          do not need a "full Mac filename" record.
-          The local-header and central-header versions are identical.
-          (Last Revision 19980903)
-
-          Value         Size        Description
-          -----         ----        -----------
-  (Mac2b) 0x2705        Short       tag for this extra block type
-          TSize         Short       total data size for this block (12)
-          "ZPIT"        beLong      extra-field signature
-          FileType      Byte[4]     four-byte Mac file type string
-          Creator       Byte[4]     four-byte Mac creator string
-
-
-         -Info-ZIP Macintosh Extra Field (new):
-          ====================================
-
-          The following is the layout of the (new) Info-ZIP extra
-          block for Macintosh, designed by Dirk Haase.
-          All values are in little-endian.
-          (Last Revision 19981005)
-
-          Local-header version:
-
-          Value         Size        Description
-          -----         ----        -----------
-  (Mac3)  0x334d        Short       tag for this extra block type ("M3")
-          TSize         Short       total data size for this block
-          BSize         Long        uncompressed finder attribute data size
-          Flags         Short       info bits
-          fdType        Byte[4]     Type of the File (4-byte string)
-          fdCreator     Byte[4]     Creator of the File (4-byte string)
-          (CType)       Short       compression type
-          (CRC)         Long        CRC value for uncompressed MacOS data
-          Attribs       variable    finder attribute data (see below)
-
-
-          Central-header version:
-
-          Value         Size        Description
-          -----         ----        -----------
-  (Mac3)  0x334d        Short       tag for this extra block type ("M3")
-          TSize         Short       total data size for this block
-          BSize         Long        uncompressed finder attribute data size
-          Flags         Short       info bits
-          fdType        Byte[4]     Type of the File (4-byte string)
-          fdCreator     Byte[4]     Creator of the File (4-byte string)
-
-          The third bit of Flags in both headers indicates whether
-          the LOCAL extra field is uncompressed (and therefore whether CType
-          and CRC are omitted):
-
-          Bits of the Flags:
-              bit 0           if set, file is a data fork; otherwise unset
-              bit 1           if set, filename will be not changed
-              bit 2           if set, Attribs is uncompressed (no CType, CRC)
-              bit 3           if set, date and times are in 64 bit
-                              if zero date and times are in 32 bit.
-              bit 4           if set, timezone offsets fields for the native
-                              Mac times are omitted (UTC support deactivated)
-              bits 5-15       reserved;
-
-
-          Attributes:
-
-          Attribs is a Mac-specific block of data in little-endian format with
-          the following structure (if compressed, uncompress it first):
-
-          Value         Size        Description
-          -----         ----        -----------
-          fdFlags       Short       Finder Flags
-          fdLocation.v  Short       Finder Icon Location
-          fdLocation.h  Short       Finder Icon Location
-          fdFldr        Short       Folder containing file
-
-          FXInfo        16 bytes    Macintosh FXInfo structure
-            FXInfo-Structure:
-                fdIconID        Short
-                fdUnused[3]     Short       unused but reserved 6 bytes
-                fdScript        Byte        Script flag and number
-                fdXFlags        Byte        More flag bits
-                fdComment       Short       Comment ID
-                fdPutAway       Long        Home Dir ID
-
-          FVersNum      Byte        file version number
-                                    may be not used by MacOS
-          ACUser        Byte        directory access rights
-
-          FlCrDat       ULong       date and time of creation
-          FlMdDat       ULong       date and time of last modification
-          FlBkDat       ULong       date and time of last backup
-            These time numbers are original Mac FileTime values (local time!).
-            Currently, date-time width is 32-bit, but future version may
-            support be 64-bit times (see flags)
-
-          CrGMTOffs     Long(signed!)   difference "local Creat. time - UTC"
-          MdGMTOffs     Long(signed!)   difference "local Modif. time - UTC"
-          BkGMTOffs     Long(signed!)   difference "local Backup time - UTC"
-            These "local time - UTC" differences (stored in seconds) may be
-            used to support timestamp adjustment after inter-timezone transfer.
-            These fields are optional; bit 4 of the flags word controls their
-            presence.
-
-          Charset       Short       TextEncodingBase (Charset)
-                                    valid for the following two fields
-
-          FullPath      variable    Path of the current file.
-                                    Zero terminated string (C-String)
-                                    Currently coded in the native Charset.
-
-          Comment       variable    Finder Comment of the current file.
-                                    Zero terminated string (C-String)
-                                    Currently coded in the native Charset.
-
-
-         -SmartZIP Macintosh Extra Field:
-          ====================================
-
-          The following is the layout of the SmartZIP extra
-          block for Macintosh, designed by Marco Bambini.
-
-          Local-header version:
-
-          Value         Size        Description
-          -----         ----        -----------
-          0x4d63        Short       tag for this extra block type ("cM")
-          TSize         Short       total data size for this block (64)
-          "dZip"        beLong      extra-field signature
-          fdType        Byte[4]     Type of the File (4-byte string)
-          fdCreator     Byte[4]     Creator of the File (4-byte string)
-          fdFlags       beShort     Finder Flags
-          fdLocation.v  beShort     Finder Icon Location
-          fdLocation.h  beShort     Finder Icon Location
-          fdFldr        beShort     Folder containing file
-          CrDat         beLong      HParamBlockRec fileParam.ioFlCrDat
-          MdDat         beLong      HParamBlockRec fileParam.ioFlMdDat
-          frScroll.v    Byte        vertical pos. of folder's scroll bar
-          fdScript      Byte        Script flag and number
-          frScroll.h    Byte        horizontal pos. of folder's scroll bar
-          fdXFlags      Byte        More flag bits
-          FileName      Byte[32]    full Macintosh filename (pascal string)
-
-          All fields but the first two are in native Macintosh format
-          (big-endian Motorola order, not little-endian Intel).
-          The extra field size is fixed to 64 bytes.
-          The local-header and central-header versions are identical.
-
-
-         -Acorn SparkFS Extra Field:
-          =========================
-
-          The following is the layout of David Pilling's SparkFS extra block
-          for Acorn RISC OS.  The local-header and central-header versions are
-          identical.  (Last Revision 19960922)
-
-          Value         Size        Description
-          -----         ----        -----------
-  (Acorn) 0x4341        Short       tag for this extra block type ("AC")
-          TSize         Short       total data size for this block (20)
-          "ARC0"        Long        extra-field signature
-          LoadAddr      Long        load address or file type
-          ExecAddr      Long        exec address
-          Attr          Long        file permissions
-          Zero          Long        reserved; always zero
-
-          The following bits of Attr are associated with the given file
-          permissions:
-
-                bit 0           user-writable ('W')
-                bit 1           user-readable ('R')
-                bit 2           reserved
-                bit 3           locked ('L')
-                bit 4           publicly writable ('w')
-                bit 5           publicly readable ('r')
-                bit 6           reserved
-                bit 7           reserved
-
-
-         -VM/CMS Extra Field:
-          ==================
-
-          The following is the layout of the file-attributes extra block for
-          VM/CMS.  The local-header and central-header versions are
-          identical.  (Last Revision 19960922)
-
-          Value         Size        Description
-          -----         ----        -----------
- (VM/CMS) 0x4704        Short       tag for this extra block type
-          TSize         Short       total data size for this block
-          flData        variable    file attributes data
-
-          flData is an uncompressed fldata_t struct.
-
-
-         -MVS Extra Field:
-          ===============
-
-          The following is the layout of the file-attributes extra block for
-          MVS.  The local-header and central-header versions are identical.
-          (Last Revision 19960922)
-
-          Value         Size        Description
-          -----         ----        -----------
-  (MVS)   0x470f        Short       tag for this extra block type
-          TSize         Short       total data size for this block
-          flData        variable    file attributes data
-
-          flData is an uncompressed fldata_t struct.
-
-
-         -PKWARE Unix Extra Field:
-          ========================
-
-          The following is the layout of PKWARE's Unix "extra" block.
-          It was introduced with the release of PKZIP for Unix 2.50.
-          Note: all fields are stored in Intel low-byte/high-byte order.
-          (Last Revision 19980901)
-
-          This field has a minimum data size of 12 bytes and is only stored
-          as local extra field.
-
-          Value         Size        Description
-          -----         ----        -----------
- (Unix0)  0x000d        Short       Tag for this "extra" block type
-          TSize         Short       Total Data Size for this block
-          AcTime        Long        time of last access (UTC/GMT)
-          ModTime       Long        time of last modification (UTC/GMT)
-          UID           Short       Unix user ID
-          GID           Short       Unix group ID
-          (var)         variable    Variable length data field
-
-          The variable length data field will contain file type
-          specific data.  Currently the only values allowed are
-          the original "linked to" file names for hard or symbolic
-          links, and the major and minor device node numbers for
-          character and block device nodes.  Since device nodes
-          cannot be either symbolic or hard links, only one set of
-          variable length data is stored.  Link files will have the
-          name of the original file stored.  This name is NOT NULL
-          terminated.  Its size can be determined by checking TSize -
-          12.  Device entries will have eight bytes stored as two 4
-          byte entries (in little-endian format).  The first entry
-          will be the major device number, and the second the minor
-          device number.
-
-         [Info-ZIP note: The fixed part of this field has the same layout as
-          Info-ZIP's abandoned "Unix1 timestamps & owner ID info" extra field;
-          only the two tag bytes are different.]
-
-
-         -PATCH Descriptor Extra Field:
-          ============================
-
-          The following is the layout of the Patch Descriptor "extra"
-          block.
-
-          Note: all fields stored in Intel low-byte/high-byte order.
-
-          Value         Size        Description
-          -----         ----        -----------
-  (Patch) 0x000f        Short       Tag for this "extra" block type
-          TSize         Short       Size of the total "extra" block
-          Version       Short       Version of the descriptor
-          Flags         Long        Actions and reactions (see below)
-          OldSize       Long        Size of the file about to be patched
-          OldCRC        Long        32-bit CRC of the file about to be patched
-          NewSize       Long        Size of the resulting file
-          NewCRC        Long        32-bit CRC of the resulting file
-
-
-          Actions and reactions
-
-          Bits          Description
-          ----          ----------------
-          0             Use for autodetection
-          1             Treat as selfpatch
-          2-3           RESERVED
-          4-5           Action (see below)
-          6-7           RESERVED
-          8-9           Reaction (see below) to absent file
-          10-11         Reaction (see below) to newer file
-          12-13         Reaction (see below) to unknown file
-          14-15         RESERVED
-          16-31         RESERVED
-
-          Actions
-
-          Action       Value
-          ------       -----
-          none         0
-          add          1
-          delete       2
-          patch        3
-
-          Reactions
-
-          Reaction     Value
-          --------     -----
-          ask          0
-          skip         1
-          ignore       2
-          fail         3
-
-
-         -PKCS#7 Store for X.509 Certificates:
-          ===================================
-
-          This field is contains the information about each
-          certificate a file is signed with.  This field should only
-          appear in the first central directory record, and will be
-          ignored in any other record.
-
-          Note: all fields stored in Intel low-byte/high-byte order.
-
-          Value         Size        Description
-          -----         ----        -----------
-  (Store) 0x0014        2 bytes     Tag for this "extra" block type
-          SSize         2 bytes     Size of the store data
-          SData         (variable)  Data about the store
-
-          SData
-          Value         Size        Description
-          -----         ----        -----------
-          Version       2 bytes     Version number, 0x0001 for now
-          StoreD        (variable)  Actual store data
-
-          The StoreD member is suitable for passing as the pbData
-          member of a CRYPT_DATA_BLOB to the CertOpenStore() function
-          in Microsoft's CryptoAPI.  The SSize member above will be
-          cbData + 6, where cbData is the cbData member of the same
-          CRYPT_DATA_BLOB.  The encoding type to pass to
-          CertOpenStore() should be
-          PKCS_7_ANS_ENCODING | X509_ASN_ENCODING.
-
-
-         -X.509 Certificate ID and Signature for individual file:
-          ======================================================
-
-          This field contains the information about which certificate
-          in the PKCS#7 Store was used to sign the particular file.
-          It also contains the signature data.  This field can appear
-          multiple times, but can only appear once per certificate.
-
-          Note: all fields stored in Intel low-byte/high-byte order.
-
-          Value         Size        Description
-          -----         ----        -----------
-  (CID)   0x0015        2 bytes     Tag for this "extra" block type
-          CSize         2 bytes     Size of Method
-          Method        (variable)
-
-          Method
-          Value         Size        Description
-          -----         ----        -----------
-          Version       2 bytes     Version number, for now 0x0001
-          AlgID         2 bytes     Algorithm ID used for signing
-          IDSize        2 bytes     Size of Certificate ID data
-          CertID        (variable)  Certificate ID data
-          SigSize       2 bytes     Size of Signature data
-          Sig           (variable)  Signature data
-
-          CertID
-          Value         Size        Description
-          -----         ----        -----------
-          Size1         4 bytes     Size of CertID, should be (IDSize - 4)
-          Size1         4 bytes     A bug in version one causes this value
-                                    to appear twice.
-          IssSize       4 bytes     Issuer data size
-          Issuer        (variable)  Issuer data
-          SerSize       4 bytes     Serial Number size
-          Serial        (variable)  Serial Number data
-
-          The Issuer and IssSize members are suitable for creating a
-          CRYPT_DATA_BLOB to be the Issuer member of a CERT_INFO
-          struct. The Serial and SerSize members would be the
-          SerialNumber member of the same CERT_INFO struct.  This
-          struct would be used to find the certificate in the store
-          the file was signed with.  Those structures are from the MS
-          CryptoAPI.
-
-          Sig and SigSize are the actual signature data and size
-          generated by signing the file with the MS CryptoAPI using a
-          hash created with the given AlgID.
-
-
-         -X.509 Certificate ID and Signature for central directory:
-          ========================================================
-
-          This field contains the information about which certificate
-          in the PKCS#7 Store was used to sign the central directory.
-          It should only appear with the first central directory
-          record, along with the store.  The data structure is the
-          same as the CID, except that SigSize will be 0, and there
-          will be no Sig member.
-
-          This field is also kept after the last central directory
-          record, as the signature data (ID 0x05054b50, it looks like
-          a central directory record of a different type).  This
-          second copy of the data is the Signature Data member of the
-          record, and will have a SigSize that is non-zero, and will
-          have Sig data.
-
-          Note: all fields stored in Intel low-byte/high-byte order.
-
-          Value         Size        Description
-          -----         ----        -----------
-  (CDID)  0x0016        2 bytes     Tag for this "extra" block type
-          CSize         2 bytes     Size of Method
-          Method       (variable)
-
-
-         -ZIP64 Extended Information Extra Field:
-          ======================================
-
-          The following is the layout of the ZIP64 extended
-          information "extra" block. If one of the size or
-          offset fields in the Local or Central directory
-          record is too small to hold the required data,
-          a ZIP64 extended information record is created.
-          The order of the fields in the ZIP64 extended
-          information record is fixed, but the fields will
-          only appear if the corresponding Local or Central
-          directory record field is set to 0xFFFF or 0xFFFFFFFF.
-
-          Note: all fields stored in Intel low-byte/high-byte order.
-
-          Value      Size       Description
-          -----      ----       -----------
-  (ZIP64) 0x0001     2 bytes    Tag for this "extra" block type
-          Size       2 bytes    Size of this "extra" block
-          Original
-          Size       8 bytes    Original uncompresseed file size
-          Compressed
-          Size       8 bytes    Size of compressed data
-          Relative Header
-          Offset     8 bytes    Offset of local header record
-          Disk Start
-          Number     4 bytes    Number of the disk on which
-                                this file starts
-
-          This entry in the Local header must include BOTH original
-          and compressed file sizes.
-
-
-         -Extended Timestamp Extra Field:
-          ==============================
-
-          The following is the layout of the extended-timestamp extra block.
-          (Last Revision 19970118)
-
-          Local-header version:
-
-          Value         Size        Description
-          -----         ----        -----------
-  (time)  0x5455        Short       tag for this extra block type ("UT")
-          TSize         Short       total data size for this block
-          Flags         Byte        info bits
-          (ModTime)     Long        time of last modification (UTC/GMT)
-          (AcTime)      Long        time of last access (UTC/GMT)
-          (CrTime)      Long        time of original creation (UTC/GMT)
-
-          Central-header version:
-
-          Value         Size        Description
-          -----         ----        -----------
-  (time)  0x5455        Short       tag for this extra block type ("UT")
-          TSize         Short       total data size for this block
-          Flags         Byte        info bits (refers to local header!)
-          (ModTime)     Long        time of last modification (UTC/GMT)
-
-          The central-header extra field contains the modification time only,
-          or no timestamp at all.  TSize is used to flag its presence or
-          absence.  But note:
-
-              If "Flags" indicates that Modtime is present in the local header
-              field, it MUST be present in the central header field, too!
-              This correspondence is required because the modification time
-              value may be used to support trans-timezone freshening and
-              updating operations with zip archives.
-
-          The time values are in standard Unix signed-long format, indicating
-          the number of seconds since 1 January 1970 00:00:00.  The times
-          are relative to Coordinated Universal Time (UTC), also sometimes
-          referred to as Greenwich Mean Time (GMT).  To convert to local time,
-          the software must know the local timezone offset from UTC/GMT.
-
-          The lower three bits of Flags in both headers indicate which time-
-          stamps are present in the LOCAL extra field:
-
-                bit 0           if set, modification time is present
-                bit 1           if set, access time is present
-                bit 2           if set, creation time is present
-                bits 3-7        reserved for additional timestamps; not set
-
-          Those times that are present will appear in the order indicated, but
-          any combination of times may be omitted.  (Creation time may be
-          present without access time, for example.)  TSize should equal
-          (1 + 4*(number of set bits in Flags)), as the block is currently
-          defined.  Other timestamps may be added in the future.
-
-
-         -Info-ZIP Unix Extra Field (type 1):
-          ==================================
-
-          The following is the layout of the old Info-ZIP extra block for
-          Unix.  It has been replaced by the extended-timestamp extra block
-          (0x5455) and the Unix type 2 extra block (0x7855).
-          (Last Revision 19970118)
-
-          Local-header version:
-
-          Value         Size        Description
-          -----         ----        -----------
-  (Unix1) 0x5855        Short       tag for this extra block type ("UX")
-          TSize         Short       total data size for this block
-          AcTime        Long        time of last access (UTC/GMT)
-          ModTime       Long        time of last modification (UTC/GMT)
-          UID           Short       Unix user ID (optional)
-          GID           Short       Unix group ID (optional)
-
-          Central-header version:
-
-          Value         Size        Description
-          -----         ----        -----------
-  (Unix1) 0x5855        Short       tag for this extra block type ("UX")
-          TSize         Short       total data size for this block
-          AcTime        Long        time of last access (GMT/UTC)
-          ModTime       Long        time of last modification (GMT/UTC)
-
-          The file access and modification times are in standard Unix signed-
-          long format, indicating the number of seconds since 1 January 1970
-          00:00:00.  The times are relative to Coordinated Universal Time
-          (UTC), also sometimes referred to as Greenwich Mean Time (GMT).  To
-          convert to local time, the software must know the local timezone
-          offset from UTC/GMT.  The modification time may be used by non-Unix
-          systems to support inter-timezone freshening and updating of zip
-          archives.
-
-          The local-header extra block may optionally contain UID and GID
-          info for the file.  The local-header TSize value is the only
-          indication of this.  Note that Unix UIDs and GIDs are usually
-          specific to a particular machine, and they generally require root
-          access to restore.
-
-          This extra field type is obsolete, but it has been in use since
-          mid-1994.  Therefore future archiving software should continue to
-          support it.  Some guidelines:
-
-              An archive member should either contain the old "Unix1"
-              extra field block or the new extra field types "time" and/or
-              "Unix2".
-
-              If both the old "Unix1" block type and one or both of the new
-              block types "time" and "Unix2" are found, the "Unix1" block
-              should be considered invalid and ignored.
-
-              Unarchiving software should recognize both old and new extra
-              field block types, but the info from new types overrides the
-              old "Unix1" field.
-
-              Archiving software should recognize "Unix1" extra fields for
-              timestamp comparison but never create it for updated, freshened
-              or new archive members.  When copying existing members to a new
-              archive, any "Unix1" extra field blocks should be converted to
-              the new "time" and/or "Unix2" types.
-
-
-         -Info-ZIP Unix Extra Field (type 2):
-          ==================================
-
-          The following is the layout of the new Info-ZIP extra block for
-          Unix.  (Last Revision 19960922)
-
-          Local-header version:
-
-          Value         Size        Description
-          -----         ----        -----------
-  (Unix2) 0x7855        Short       tag for this extra block type ("Ux")
-          TSize         Short       total data size for this block (4)
-          UID           Short       Unix user ID
-          GID           Short       Unix group ID
-
-          Central-header version:
-
-          Value         Size        Description
-          -----         ----        -----------
-  (Unix2) 0x7855        Short       tag for this extra block type ("Ux")
-          TSize         Short       total data size for this block (0)
-
-          The data size of the central-header version is zero; it is used
-          solely as a flag that UID/GID info is present in the local-header
-          extra field.  If additional fields are ever added to the local
-          version, the central version may be extended to indicate this.
-
-          Note that Unix UIDs and GIDs are usually specific to a particular
-          machine, and they generally require root access to restore.
-
-
-         -ASi Unix Extra Field:
-          ====================
-
-          The following is the layout of the ASi extra block for Unix.  The
-          local-header and central-header versions are identical.
-          (Last Revision 19960916)
-
-          Value         Size        Description
-          -----         ----        -----------
-  (Unix3) 0x756e        Short       tag for this extra block type ("nu")
-          TSize         Short       total data size for this block
-          CRC           Long        CRC-32 of the remaining data
-          Mode          Short       file permissions
-          SizDev        Long        symlink'd size OR major/minor dev num
-          UID           Short       user ID
-          GID           Short       group ID
-          (var.)        variable    symbolic link filename
-
-          Mode is the standard Unix st_mode field from struct stat, containing
-          user/group/other permissions, setuid/setgid and symlink info, etc.
-
-          If Mode indicates that this file is a symbolic link, SizDev is the
-          size of the file to which the link points.  Otherwise, if the file
-          is a device, SizDev contains the standard Unix st_rdev field from
-          struct stat (includes the major and minor numbers of the device).
-          SizDev is undefined in other cases.
-
-          If Mode indicates that the file is a symbolic link, the final field
-          will be the name of the file to which the link points.  The file-
-          name length can be inferred from TSize.
-
-          [Note that TSize may incorrectly refer to the data size not counting
-           the CRC; i.e., it may be four bytes too small.]
-
-
-         -BeOS Extra Field:
-          ================
-
-          The following is the layout of the file-attributes extra block for
-          BeOS.  (Last Revision 19970531)
-
-          Local-header version:
-
-          Value         Size        Description
-          -----         ----        -----------
-  (BeOS)  0x6542        Short       tag for this extra block type ("Be")
-          TSize         Short       total data size for this block
-          BSize         Long        uncompressed file attribute data size
-          Flags         Byte        info bits
-          (CType)       Short       compression type
-          (CRC)         Long        CRC value for uncompressed file attribs
-          Attribs       variable    file attribute data
-
-          Central-header version:
-
-          Value         Size        Description
-          -----         ----        -----------
-  (BeOS)  0x6542        Short       tag for this extra block type ("Be")
-          TSize         Short       total data size for this block (5)
-          BSize         Long        size of uncompr. local EF block data
-          Flags         Byte        info bits
-
-          The least significant bit of Flags in both headers indicates whether
-          the LOCAL extra field is uncompressed (and therefore whether CType
-          and CRC are omitted):
-
-                bit 0           if set, Attribs is uncompressed (no CType, CRC)
-                bits 1-7        reserved; if set, assume error or unknown data
-
-          Currently the only supported compression types are deflated (type 8)
-          and stored (type 0); the latter is not used by Info-ZIP's Zip but is
-          supported by UnZip.
-
-          Attribs is a BeOS-specific block of data in big-endian format with
-          the following structure (if compressed, uncompress it first):
-
-              Value     Size        Description
-              -----     ----        -----------
-              Name      variable    attribute name (null-terminated string)
-              Type      Long        attribute type (32-bit unsigned integer)
-              Size      Long Long   data size for this sub-block (64 bits)
-              Data      variable    attribute data
-
-          The attribute structure is repeated for every attribute.  The Data
-          field may contain anything--text, flags, bitmaps, etc.
-
-
-         -SMS/QDOS Extra Field:
-          ====================
-
-          The following is the layout of the file-attributes extra block for
-          SMS/QDOS.  The local-header and central-header versions are identical.
-          (Last Revision 19960929)
-
-          Value         Size        Description
-          -----         ----        -----------
-  (QDOS)  0xfb4a        Short       tag for this extra block type
-          TSize         Short       total data size for this block
-          LongID        Long        extra-field signature
-          (ExtraID)     Long        additional signature/flag bytes
-          QDirect       64 bytes    qdirect structure
-
-          LongID may be "QZHD" or "QDOS".  In the latter case, ExtraID will
-          be present.  Its first three bytes are "02\0"; the last byte is
-          currently undefined.
-
-          QDirect contains the file's uncompressed directory info (qdirect
-          struct).  Its elements are in native (big-endian) format:
-
-          d_length      beLong          file length
-          d_access      byte            file access type
-          d_type        byte            file type
-          d_datalen     beLong          data length
-          d_reserved    beLong          unused
-          d_szname      beShort         size of filename
-          d_name        36 bytes        filename
-          d_update      beLong          time of last update
-          d_refdate     beLong          file version number
-          d_backup      beLong          time of last backup (archive date)
-
-
-         -AOS/VS Extra Field:
-          ==================
-
-          The following is the layout of the extra block for Data General
-          AOS/VS.  The local-header and central-header versions are identical.
-          (Last Revision 19961125)
-
-          Value         Size        Description
-          -----         ----        -----------
-  (AOSVS) 0x5356        Short       tag for this extra block type ("VS")
-          TSize         Short       total data size for this block
-          "FCI\0"       Long        extra-field signature
-          Version       Byte        version of AOS/VS extra block (10 = 1.0)
-          Fstat         variable    fstat packet
-          AclBuf        variable    raw ACL data ($MXACL bytes)
-
-          Fstat contains the file's uncompressed fstat packet, which is one of
-          the following:
-
-                normal fstat packet             (P_FSTAT struct)
-                DIR/CPD fstat packet            (P_FSTAT_DIR struct)
-                unit (device) fstat packet      (P_FSTAT_UNIT struct)
-                IPC file fstat packet           (P_FSTAT_IPC struct)
-
-          AclBuf contains the raw ACL data; its length is $MXACL.
-
-
-         -Tandem NSK Extra Field:
-          ======================
-
-          The following is the layout of the file-attributes extra block for
-          Tandem NSK.  The local-header and central-header versions are
-          identical.  (Last Revision 19981221)
-
-          Value         Size        Description
-          -----         ----        -----------
-  (TA)    0x4154        Short       tag for this extra block type ("TA")
-          TSize         Short       total data size for this block (20)
-          NSKattrs      20 Bytes    NSK attributes
-
-
-         -THEOS Extra Field:
-          =================
-
-          The following is the layout of the file-attributes extra block for
-          Theos.  The local-header and central-header versions are identical.
-          (Last Revision 19990206)
-
-          Value         Size        Description
-          -----         ----        -----------
-  (Theos) 0x6854        Short       'Th' signature
-          size          Short       size of extra block
-          flags         Byte        reserved for future use
-          filesize      Long        file size
-          fileorg       Byte        type of file (see below)
-          keylen        Short       key length for indexed and keyed files,
-                                    data segment size for 16 bits programs
-          reclen        Short       record length for indexed,keyed and direct,
-                                    text segment size for 16 bits programs
-          filegrow      Byte        growing factor for indexed,keyed and direct
-          protect       Byte        protections (see below)
-          reserved      Short       reserved for future use
-
-            File types
-            ==========
-
-            0x80  library (keyed access list of files)
-            0x40  directory
-            0x10  stream file
-            0x08  direct file
-            0x04  keyed file
-            0x02  indexed file
-            0x0e  reserved
-            0x01  16 bits real mode program (obsolete)
-            0x21  16 bits protected mode program
-            0x41  32 bits protected mode program
-
-            Protection codes
-            ================
-
-            User protection
-            ---------------
-            0x01  non readable
-            0x02  non writable
-            0x04  non executable
-            0x08  non erasable
-
-            Other protection
-            ----------------
-            0x10  non readable
-            0x20  non writable
-            0x40  non executable Theos before 4.0
-            0x40  modified Theos 4.x
-            0x80  not hidden
-
-
-         -THEOS old inofficial Extra Field:
-          ================================
-
-          The following is the layout of an inoffical former version of a
-          Theos file-attributes extra blocks.  This layout was never published
-          and is no longer created. However, UnZip can optionally support it
-          when compiling with the option flag OLD_THEOS_EXTRA defined.
-          Both the local-header and central-header versions are identical.
-          (Last Revision 19990206)
-
-          Value         Size        Description
-          -----         ----        -----------
-  (THS0)  0x4854        Short       'TH' signature
-          size          Short       size of extra block
-          flags         Short       reserved for future use
-          filesize      Long        file size
-          reclen        Short       record length for indexed,keyed and direct,
-                                    text segment size for 16 bits programs
-          keylen        Short       key length for indexed and keyed files,
-                                    data segment size for 16 bits programs
-          filegrow      Byte        growing factor for indexed,keyed and direct
-          reserved      3 Bytes     reserved for future use
-
-
-         -FWKCS MD5 Extra Field:
-          =====================
-
-          The FWKCS Contents_Signature System, used in automatically
-          identifying files independent of filename, optionally adds
-          and uses an extra field to support the rapid creation of
-          an enhanced contents_signature.
-          There is no local-header version; the following applies
-          only to the central header.  (Last Revision 19961207)
-
-          Central-header version:
-
-          Value         Size        Description
-          -----         ----        -----------
-  (MD5)   0x4b46        Short       tag for this extra block type ("FK")
-          TSize         Short       total data size for this block (19)
-          "MD5"         3 bytes     extra-field signature
-          MD5hash       16 bytes    128-bit MD5 hash of uncompressed data
-                                    (low byte first)
-
-          When FWKCS revises a .ZIP file central directory to add
-          this extra field for a file, it also replaces the
-          central directory entry for that file's uncompressed
-          file length with a measured value.
-
-          FWKCS provides an option to strip this extra field, if
-          present, from a .ZIP file central directory. In adding
-          this extra field, FWKCS preserves .ZIP file Authenticity
-          Verification; if stripping this extra field, FWKCS
-          preserves all versions of AV through PKZIP version 2.04g.
-
-          FWKCS, and FWKCS Contents_Signature System, are
-          trademarks of Frederick W. Kantor.
-
-          (1) R. Rivest, RFC1321.TXT, MIT Laboratory for Computer
-              Science and RSA Data Security, Inc., April 1992.
-              ll.76-77: "The MD5 algorithm is being placed in the
-              public domain for review and possible adoption as a
-              standard."
-
-
-         -Info-ZIP Unicode Path Extra Field:
-          =================================
-
-          Stores the UTF-8 version of the entry path as stored in the
-          local header and central directory header.
-          (Last Revision 20070912)
-
-          Value         Size        Description
-          -----         ----        -----------
-  (UPath) 0x7075        Short       tag for this extra block type ("up")
-          TSize         Short       total data size for this block
-          Version       1 byte      version of this extra field, currently 1
-          NameCRC32     4 bytes     File Name Field CRC32 Checksum
-          UnicodeName   Variable    UTF-8 version of the entry File Name
-
-          Currently Version is set to the number 1.  If there is a need
-          to change this field, the version will be incremented.  Changes
-          may not be backward compatible so this extra field should not be
-          used if the version is not recognized.
-
-          The NameCRC32 is the standard zip CRC32 checksum of the File Name
-          field in the header.  This is used to verify that the header
-          File Name field has not changed since the Unicode Path extra field
-          was created.  This can happen if a utility renames the entry but
-          does not update the UTF-8 path extra field.  If the CRC check fails,
-          this UTF-8 Path Extra Field should be ignored and the File Name field
-          in the header used instead.
-
-          The UnicodeName is the UTF-8 version of the contents of the File Name
-          field in the header.  As UnicodeName is defined to be UTF-8, no UTF-8
-          byte order mark (BOM) is used.  The length of this field is determined
-          by subtracting the size of the previous fields from TSize.  If both
-          the File Name and Comment fields are UTF-8, the new General Purpose
-          Bit Flag, bit 11 (Language encoding flag (EFS)), can be used to
-          indicate that both the header File Name and Comment fields are UTF-8
-          and, in this case, the Unicode Path and Unicode Comment extra fields
-          are not needed and should not be created.  Note that, for backward
-          compatibility, bit 11 should only be used if the native character set
-          of the paths and comments being zipped up are already in UTF-8.  The
-          same method, either bit 11 or extra fields, should be used in both
-          the local and central directory headers.
-
-
-         -Info-ZIP Unicode Comment Extra Field:
-          ====================================
-
-          Stores the UTF-8 version of the entry comment as stored in the
-          central directory header.
-          (Last Revision 20070912)
-
-          Value         Size        Description
-          -----         ----        -----------
-   (UCom) 0x6375        Short       tag for this extra block type ("uc")
-          TSize         Short       total data size for this block
-          Version       1 byte      version of this extra field, currently 1
-          ComCRC32      4 bytes     Comment Field CRC32 Checksum
-          UnicodeCom    Variable    UTF-8 version of the entry comment
-
-          Currently Version is set to the number 1.  If there is a need
-          to change this field, the version will be incremented.  Changes
-          may not be backward compatible so this extra field should not be
-          used if the version is not recognized.
-
-          The ComCRC32 is the standard zip CRC32 checksum of the Comment
-          field in the central directory header.  This is used to verify that
-          the comment field has not changed since the Unicode Comment extra field
-          was created.  This can happen if a utility changes the Comment field
-          but does not update the UTF-8 Comment extra field.  If the CRC check
-          fails, this Unicode Comment extra field should be ignored and the
-          Comment field in the header used.
-
-          The UnicodeCom field is the UTF-8 version of the entry comment field
-          in the header.  As UnicodeCom is defined to be UTF-8, no UTF-8 byte
-          order mark (BOM) is used.  The length of this field is determined by
-          subtracting the size of the previous fields from TSize.  If both the
-          File Name and Comment fields are UTF-8, the new General Purpose Bit
-          Flag, bit 11 (Language encoding flag (EFS)), can be used to indicate
-          both the header File Name and Comment fields are UTF-8 and, in this
-          case, the Unicode Path and Unicode Comment extra fields are not
-          needed and should not be created.  Note that, for backward
-          compatibility, bit 11 should only be used if the native character set
-          of the paths and comments being zipped up are already in UTF-8.  The
-          same method, either bit 11 or extra fields, should be used in both
-          the local and central directory headers.
-
-
-         -Info-ZIP New Unix Extra Field:
-          ====================================
-
-          Currently stores Unix UIDs/GIDs up to 32 bits.
-          (Last Revision 20080509)
-
-          Value         Size        Description
-          -----         ----        -----------
-  (UnixN) 0x7875        Short       tag for this extra block type ("ux")
-          TSize         Short       total data size for this block
-          Version       1 byte      version of this extra field, currently 1
-          UIDSize       1 byte      Size of UID field
-          UID           Variable    UID for this entry
-          GIDSize       1 byte      Size of GID field
-          GID           Variable    GID for this entry
-
-          Currently Version is set to the number 1.  If there is a need
-          to change this field, the version will be incremented.  Changes
-          may not be backward compatible so this extra field should not be
-          used if the version is not recognized.
-
-          UIDSize is the size of the UID field in bytes.  This size should
-          match the size of the UID field on the target OS.
-
-          UID is the UID for this entry in standard little endian format.
-
-          GIDSize is the size of the GID field in bytes.  This size should
-          match the size of the GID field on the target OS.
-
-          GID is the GID for this entry in standard little endian format.
-
-          If both the old 16-bit Unix extra field (tag 0x7855, Info-ZIP Unix)
-          and this extra field are present, the values in this extra field
-          supercede the values in that extra field.