Subversion Repositories Kolibri OS

Rev

Blame | Last modification | View Log | Download | RSS feed

  1. The following are the known types of zipfile extra fields as of this
  2. writing.  Extra fields are documented in PKWARE's appnote.txt and are
  3. intended to allow for backward- and forward-compatible extensions to
  4. the zipfile format.  Multiple extra-field types may be chained together,
  5. provided that the total length of all extra-field data is less than 64KB.
  6. (In fact, PKWARE requires that the total length of the entire file header,
  7. including timestamp, file attributes, filename, comment, extra field, etc.,
  8. be no more than 64KB.)
  9.  
  10. Each extra-field type (or subblock) must contain a four-byte header con-
  11. sisting of a two-byte header ID and a two-byte length (little-endian) for
  12. the remaining data in the subblock.  If there are additional subblocks
  13. within the extra field, the header for each one will appear immediately
  14. following the data for the previous subblock (i.e., with no padding for
  15. alignment).
  16.  
  17. All integer fields in the descriptions below are in little-endian (Intel)
  18. format unless otherwise specified.  Note that "Short" means two bytes,
  19. "Long" means four bytes, and "Long-Long" means eight bytes, regardless
  20. of their native sizes.  Unless specifically noted, all integer fields should
  21. be interpreted as unsigned (non-negative) numbers.
  22.  
  23. Christian Spieler, Ed Gordon, 20080717
  24.  
  25.                         -------------------------
  26.  
  27.           Header ID's of 0 thru 31 are reserved for use by PKWARE.
  28.           The remaining ID's can be used by third party vendors for
  29.           proprietary usage.
  30.  
  31.           The current Header ID mappings defined by PKWARE are:
  32.  
  33.           0x0001        Zip64 extended information extra field
  34.           0x0007        AV Info
  35.           0x0008        Reserved for extended language encoding data (PFS)
  36.           0x0009        OS/2 extended attributes      (also Info-ZIP)
  37.           0x000a        NTFS (Win9x/WinNT FileTimes)
  38.           0x000c        OpenVMS                       (also Info-ZIP)
  39.           0x000d        UNIX
  40.           0x000e        Reserved for file stream and fork descriptors
  41.           0x000f        Patch Descriptor
  42.           0x0014        PKCS#7 Store for X.509 Certificates
  43.           0x0015        X.509 Certificate ID and Signature for
  44.                         individual file
  45.           0x0016        X.509 Certificate ID for Central Directory
  46.           0x0017        Strong Encryption Header
  47.           0x0018        Record Management Controls
  48.           0x0019        PKCS#7 Encryption Recipient Certificate List
  49.           0x0065        IBM S/390 (Z390), AS/400 (I400) attributes
  50.                         - uncompressed
  51.           0x0066        Reserved for IBM S/390 (Z390), AS/400 (I400)
  52.                         attributes - compressed
  53.           0x4690        POSZIP 4690 (reserved)
  54.  
  55.           The Header ID mappings defined by Info-ZIP and third parties are:
  56.  
  57.           0x07c8        Info-ZIP Macintosh (old, J. Lee)
  58.           0x2605        ZipIt Macintosh (first version)
  59.           0x2705        ZipIt Macintosh v 1.3.5 and newer (w/o full filename)
  60.           0x2805        ZipIt Macintosh 1.3.5+
  61.           0x334d        Info-ZIP Macintosh (new, D. Haase's 'Mac3' field)
  62.           0x4154        Tandem NSK
  63.           0x4341        Acorn/SparkFS (David Pilling)
  64.           0x4453        Windows NT security descriptor (binary ACL)
  65.           0x4704        VM/CMS
  66.           0x470f        MVS
  67.           0x4854        Theos, old inofficial port
  68.           0x4b46        FWKCS MD5 (see below)
  69.           0x4c41        OS/2 access control list (text ACL)
  70.           0x4d49        Info-ZIP OpenVMS (obsolete)
  71.           0x4d63        Macintosh SmartZIP, by Macro Bambini
  72.           0x4f4c        Xceed original location extra field
  73.           0x5356        AOS/VS (binary ACL)
  74.           0x5455        extended timestamp
  75.           0x554e        Xceed unicode extra field
  76.           0x5855        Info-ZIP UNIX (original; also OS/2, NT, etc.)
  77.           0x6375        Info-ZIP UTF-8 comment field
  78.           0x6542        BeOS (BeBox, PowerMac, etc.)
  79.           0x6854        Theos
  80.           0x7075        Info-ZIP UTF-8 name field
  81.           0x7441        AtheOS (AtheOS/Syllable attributes)
  82.           0x756e        ASi UNIX
  83.           0x7855        Info-ZIP UNIX (16-bit UID/GID info)
  84.           0x7875        Info-ZIP UNIX 3rd generation (generic UID/GID, ...)
  85.           0xa220        Microsoft Open Packaging Growth Hint
  86.           0xfb4a        SMS/QDOS
  87.  
  88. The following are detailed descriptions of the known extra-field block types:
  89.  
  90.          -Zip64 Extended Information Extra Field (0x0001):
  91.           ===============================================
  92.  
  93.           The following is the layout of the zip64 extended
  94.           information "extra" block. If one of the size or
  95.           offset fields in the Local or Central directory
  96.           record is too small to hold the required data,
  97.           a zip64 extended information record is created.
  98.           The order of the fields in the zip64 extended
  99.           information record is fixed, but the fields will
  100.           only appear if the corresponding Local or Central
  101.           directory record field is set to 0xFFFF or 0xFFFFFFFF.
  102.  
  103.           Note: all fields stored in Intel low-byte/high-byte order.
  104.  
  105.           Value      Size       Description
  106.           -----      ----       -----------
  107.   (ZIP64) 0x0001     2 bytes    Tag for this "extra" block type
  108.           Size       2 bytes    Size of this "extra" block
  109.           Original
  110.           Size       8 bytes    Original uncompressed file size
  111.           Compressed
  112.           Size       8 bytes    Size of compressed data
  113.           Relative Header
  114.           Offset     8 bytes    Offset of local header record
  115.           Disk Start
  116.           Number     4 bytes    Number of the disk on which
  117.                                 this file starts
  118.  
  119.           This entry in the Local header must include BOTH original
  120.           and compressed file size fields.  If encrypting the
  121.           central directory and bit 13 of the general purpose bit
  122.           flag is set indicating masking, the value stored in the
  123.           Local Header for the original file size will be zero.
  124.  
  125.  
  126.          -OS/2 Extended Attributes Extra Field (0x0009):
  127.           =============================================
  128.  
  129.           The following is the layout of the OS/2 extended attributes "extra"
  130.           block.  (Last Revision 19960922)
  131.  
  132.           Note: all fields stored in Intel low-byte/high-byte order.
  133.  
  134.           Local-header version:
  135.  
  136.           Value         Size        Description
  137.           -----         ----        -----------
  138.   (OS/2)  0x0009        Short       tag for this extra block type
  139.           TSize         Short       total data size for this block
  140.           BSize         Long        uncompressed EA data size
  141.           CType         Short       compression type
  142.           EACRC         Long        CRC value for uncompressed EA data
  143.           (var.)        variable    compressed EA data
  144.  
  145.           Central-header version:
  146.  
  147.           Value         Size        Description
  148.           -----         ----        -----------
  149.   (OS/2)  0x0009        Short       tag for this extra block type
  150.           TSize         Short       total data size for this block (4)
  151.           BSize         Long        size of uncompressed local EA data
  152.  
  153.           The value of CType is interpreted according to the "compression
  154.           method" section above; i.e., 0 for stored, 8 for deflated, etc.
  155.  
  156.           The OS/2 extended attribute structure (FEA2LIST) is
  157.           compressed and then stored in its entirety within this
  158.           structure.  There will only ever be one "block" of data in
  159.           the variable-length field.
  160.  
  161.  
  162.          -OS/2 Access Control List Extra Field:
  163.           ====================================
  164.  
  165.           The following is the layout of the OS/2 ACL extra block.
  166.           (Last Revision 19960922)
  167.  
  168.           Local-header version:
  169.  
  170.           Value         Size        Description
  171.           -----         ----        -----------
  172.   (ACL)   0x4c41        Short       tag for this extra block type ("AL")
  173.           TSize         Short       total data size for this block
  174.           BSize         Long        uncompressed ACL data size
  175.           CType         Short       compression type
  176.           EACRC         Long        CRC value for uncompressed ACL data
  177.           (var.)        variable    compressed ACL data
  178.  
  179.           Central-header version:
  180.  
  181.           Value         Size        Description
  182.           -----         ----        -----------
  183.   (ACL)   0x4c41        Short       tag for this extra block type ("AL")
  184.           TSize         Short       total data size for this block (4)
  185.           BSize         Long        size of uncompressed local ACL data
  186.  
  187.           The value of CType is interpreted according to the "compression
  188.           method" section above; i.e., 0 for stored, 8 for deflated, etc.
  189.  
  190.           The uncompressed ACL data consist of a text header of the form
  191.           "ACL1:%hX,%hd\n", where the first field is the OS/2 ACCINFO acc_attr
  192.           member and the second is acc_count, followed by acc_count strings
  193.           of the form "%s,%hx\n", where the first field is acl_ugname (user
  194.           group name) and the second acl_access.  This block type will be
  195.           extended for other operating systems as needed.
  196.  
  197.  
  198.          -Windows NT Security Descriptor Extra Field (0x4453):
  199.           ===================================================
  200.  
  201.           The following is the layout of the NT Security Descriptor (another
  202.           type of ACL) extra block.  (Last Revision 19960922)
  203.  
  204.           Local-header version:
  205.  
  206.           Value         Size        Description
  207.           -----         ----        -----------
  208.   (SD)    0x4453        Short       tag for this extra block type ("SD")
  209.           TSize         Short       total data size for this block
  210.           BSize         Long        uncompressed SD data size
  211.           Version       Byte        version of uncompressed SD data format
  212.           CType         Short       compression type
  213.           EACRC         Long        CRC value for uncompressed SD data
  214.           (var.)        variable    compressed SD data
  215.  
  216.           Central-header version:
  217.  
  218.           Value         Size        Description
  219.           -----         ----        -----------
  220.   (SD)    0x4453        Short       tag for this extra block type ("SD")
  221.           TSize         Short       total data size for this block (4)
  222.           BSize         Long        size of uncompressed local SD data
  223.  
  224.           The value of CType is interpreted according to the "compression
  225.           method" section above; i.e., 0 for stored, 8 for deflated, etc.
  226.           Version specifies how the compressed data are to be interpreted
  227.           and allows for future expansion of this extra field type.  Currently
  228.           only version 0 is defined.
  229.  
  230.           For version 0, the compressed data are to be interpreted as a single
  231.           valid Windows NT SECURITY_DESCRIPTOR data structure, in self-relative
  232.           format.
  233.  
  234.  
  235.          -PKWARE Win95/WinNT Extra Field (0x000a):
  236.           =======================================
  237.  
  238.           The following description covers PKWARE's "NTFS" attributes
  239.           "extra" block, introduced with the release of PKZIP 2.50 for
  240.           Windows. (Last Revision 20001118)
  241.  
  242.           (Note: At this time the Mtime, Atime and Ctime values may
  243.           be used on any WIN32 system.)
  244.          [Info-ZIP note: In the current implementations, this field has
  245.           a fixed total data size of 32 bytes and is only stored as local
  246.           extra field.]
  247.  
  248.           Value         Size        Description
  249.           -----         ----        -----------
  250.   (NTFS)  0x000a        Short       Tag for this "extra" block type
  251.           TSize         Short       Total Data Size for this block
  252.           Reserved      Long        for future use
  253.           Tag1          Short       NTFS attribute tag value #1
  254.           Size1         Short       Size of attribute #1, in bytes
  255.           (var.)        SubSize1    Attribute #1 data
  256.           .
  257.           .
  258.           .
  259.           TagN          Short       NTFS attribute tag value #N
  260.           SizeN         Short       Size of attribute #N, in bytes
  261.           (var.)        SubSizeN    Attribute #N data
  262.  
  263.           For NTFS, values for Tag1 through TagN are as follows:
  264.           (currently only one set of attributes is defined for NTFS)
  265.  
  266.           Tag        Size       Description
  267.           -----      ----       -----------
  268.           0x0001     2 bytes    Tag for attribute #1
  269.           Size1      2 bytes    Size of attribute #1, in bytes (24)
  270.           Mtime      8 bytes    64-bit NTFS file last modification time
  271.           Atime      8 bytes    64-bit NTFS file last access time
  272.           Ctime      8 bytes    64-bit NTFS file creation time
  273.  
  274.           The total length for this block is 28 bytes, resulting in a
  275.           fixed size value of 32 for the TSize field of the NTFS block.
  276.  
  277.           The NTFS filetimes are 64-bit unsigned integers, stored in Intel
  278.           (least significant byte first) byte order. They determine the
  279.           number of 1.0E-07 seconds (1/10th microseconds!) past WinNT "epoch",
  280.           which is "01-Jan-1601 00:00:00 UTC".
  281.  
  282.  
  283.          -PKWARE OpenVMS Extra Field (0x000c):
  284.           ===================================
  285.  
  286.           The following is the layout of PKWARE's OpenVMS attributes
  287.           "extra" block.  (Last Revision 12/17/91)
  288.  
  289.           Note: all fields stored in Intel low-byte/high-byte order.
  290.  
  291.           Value         Size        Description
  292.           -----         ----        -----------
  293.   (VMS)   0x000c        Short       Tag for this "extra" block type
  294.           TSize         Short       Total Data Size for this block
  295.           CRC           Long        32-bit CRC for remainder of the block
  296.           Tag1          Short       OpenVMS attribute tag value #1
  297.           Size1         Short       Size of attribute #1, in bytes
  298.           (var.)        Size1       Attribute #1 data
  299.           .
  300.           .
  301.           .
  302.           TagN          Short       OpenVMS attribute tag value #N
  303.           SizeN         Short       Size of attribute #N, in bytes
  304.           (var.)        SizeN       Attribute #N data
  305.  
  306.           Rules:
  307.  
  308.           1. There will be one or more of attributes present, which
  309.              will each be preceded by the above TagX & SizeX values.
  310.              These values are identical to the ATR$C_XXXX and
  311.              ATR$S_XXXX constants which are defined in ATR.H under
  312.              OpenVMS C.  Neither of these values will ever be zero.
  313.  
  314.           2. No word alignment or padding is performed.
  315.  
  316.           3. A well-behaved PKZIP/OpenVMS program should never produce
  317.              more than one sub-block with the same TagX value.  Also,
  318.              there will never be more than one "extra" block of type
  319.              0x000c in a particular directory record.
  320.  
  321.  
  322.          -Info-ZIP VMS Extra Field:
  323.           ========================
  324.  
  325.           The following is the layout of Info-ZIP's VMS attributes extra
  326.           block for VAX or Alpha AXP.  The local-header and central-header
  327.           versions are identical.  (Last Revision 19960922)
  328.  
  329.           Value         Size        Description
  330.           -----         ----        -----------
  331.   (VMS2)  0x4d49        Short       tag for this extra block type ("JM")
  332.           TSize         Short       total data size for this block
  333.           ID            Long        block ID
  334.           Flags         Short       info bytes
  335.           BSize         Short       uncompressed block size
  336.           Reserved      Long        (reserved)
  337.           (var.)        variable    compressed VMS file-attributes block
  338.  
  339.           The block ID is one of the following unterminated strings:
  340.  
  341.                 "VFAB"          struct FAB
  342.                 "VALL"          struct XABALL
  343.                 "VFHC"          struct XABFHC
  344.                 "VDAT"          struct XABDAT
  345.                 "VRDT"          struct XABRDT
  346.                 "VPRO"          struct XABPRO
  347.                 "VKEY"          struct XABKEY
  348.                 "VMSV"          version (e.g., "V6.1"; truncated at hyphen)
  349.                 "VNAM"          reserved
  350.  
  351.           The lower three bits of Flags indicate the compression method.  The
  352.           currently defined methods are:
  353.  
  354.                 0       stored (not compressed)
  355.                 1       simple "RLE"
  356.                 2       deflated
  357.  
  358.           The "RLE" method simply replaces zero-valued bytes with zero-valued
  359.           bits and non-zero-valued bytes with a "1" bit followed by the byte
  360.           value.
  361.  
  362.           The variable-length compressed data contains only the data corre-
  363.           sponding to the indicated structure or string.  Typically multiple
  364.           VMS2 extra fields are present (each with a unique block type).
  365.  
  366.  
  367.          -Info-ZIP Macintosh Extra Field:
  368.           ==============================
  369.  
  370.           The following is the layout of the (old) Info-ZIP resource-fork extra
  371.           block for Macintosh.  The local-header and central-header versions
  372.           are identical.  (Last Revision 19960922)
  373.  
  374.           Value         Size        Description
  375.           -----         ----        -----------
  376.   (Mac)   0x07c8        Short       tag for this extra block type
  377.           TSize         Short       total data size for this block
  378.           "JLEE"        beLong      extra-field signature
  379.           FInfo         16 bytes    Macintosh FInfo structure
  380.           CrDat         beLong      HParamBlockRec fileParam.ioFlCrDat
  381.           MdDat         beLong      HParamBlockRec fileParam.ioFlMdDat
  382.           Flags         beLong      info bits
  383.           DirID         beLong      HParamBlockRec fileParam.ioDirID
  384.           VolName       28 bytes    volume name (optional)
  385.  
  386.           All fields but the first two are in native Macintosh format
  387.           (big-endian Motorola order, not little-endian Intel).  The least
  388.           significant bit of Flags is 1 if the file is a data fork, 0 other-
  389.           wise.  In addition, if this extra field is present, the filename
  390.           has an extra 'd' or 'r' appended to indicate data fork or resource
  391.           fork.  The 28-byte VolName field may be omitted.
  392.  
  393.  
  394.          -ZipIt Macintosh Extra Field (long):
  395.           ==================================
  396.  
  397.           The following is the layout of the ZipIt extra block for Macintosh.
  398.           The local-header and central-header versions are identical.
  399.           (Last Revision 19970130)
  400.  
  401.           Value         Size        Description
  402.           -----         ----        -----------
  403.   (Mac2)  0x2605        Short       tag for this extra block type
  404.           TSize         Short       total data size for this block
  405.           "ZPIT"        beLong      extra-field signature
  406.           FnLen         Byte        length of FileName
  407.           FileName      variable    full Macintosh filename
  408.           FileType      Byte[4]     four-byte Mac file type string
  409.           Creator       Byte[4]     four-byte Mac creator string
  410.  
  411.  
  412.          -ZipIt Macintosh Extra Field (short, for files):
  413.           ==============================================
  414.  
  415.           The following is the layout of a shortened variant of the
  416.           ZipIt extra block for Macintosh (without "full name" entry).
  417.           This variant is used by ZipIt 1.3.5 and newer for entries of
  418.           files (not directories) that do not have a MacBinary encoded
  419.           file.  The local-header and central-header versions are identical.
  420.           (Last Revision 20030602)
  421.  
  422.           Value         Size        Description
  423.           -----         ----        -----------
  424.   (Mac2b) 0x2705        Short       tag for this extra block type
  425.           TSize         Short       total data size for this block (min. 12)
  426.           "ZPIT"        beLong      extra-field signature
  427.           FileType      Byte[4]     four-byte Mac file type string
  428.           Creator       Byte[4]     four-byte Mac creator string
  429.           fdFlags       beShort     attributes from FInfo.frFlags,
  430.                                     may be omitted
  431.           0x0000        beShort     reserved, may be omitted
  432.  
  433.  
  434.          -ZipIt Macintosh Extra Field (short, for directories):
  435.           ====================================================
  436.  
  437.           The following is the layout of a shortened variant of the
  438.           ZipIt extra block for Macintosh used only for directory
  439.           entries. This variant is used by ZipIt 1.3.5 and newer to
  440.           save some optional Mac-specific information about directories.
  441.           The local-header and central-header versions are identical.
  442.  
  443.           Value         Size        Description
  444.           -----         ----        -----------
  445.   (Mac2c) 0x2805        Short       tag for this extra block type
  446.           TSize         Short       total data size for this block (12)
  447.           "ZPIT"        beLong      extra-field signature
  448.           frFlags       beShort     attributes from DInfo.frFlags, may
  449.                                     be omitted
  450.           View          beShort     ZipIt view flag, may be omitted
  451.  
  452.  
  453.           The View field specifies ZipIt-internal settings as follows:
  454.  
  455.           Bits of the Flags:
  456.               bit 0           if set, the folder is shown expanded (open)
  457.                               when the archive contents are viewed in ZipIt.
  458.               bits 1-15       reserved, zero;
  459.  
  460.  
  461.          -Info-ZIP Macintosh Extra Field (new):
  462.           ====================================
  463.  
  464.           The following is the layout of the (new) Info-ZIP extra
  465.           block for Macintosh, designed by Dirk Haase.
  466.           All values are in little-endian.
  467.           (Last Revision 19981005)
  468.  
  469.           Local-header version:
  470.  
  471.           Value         Size        Description
  472.           -----         ----        -----------
  473.   (Mac3)  0x334d        Short       tag for this extra block type ("M3")
  474.           TSize         Short       total data size for this block
  475.           BSize         Long        uncompressed finder attribute data size
  476.           Flags         Short       info bits
  477.           fdType        Byte[4]     Type of the File (4-byte string)
  478.           fdCreator     Byte[4]     Creator of the File (4-byte string)
  479.           (CType)       Short       compression type
  480.           (CRC)         Long        CRC value for uncompressed MacOS data
  481.           Attribs       variable    finder attribute data (see below)
  482.  
  483.  
  484.           Central-header version:
  485.  
  486.           Value         Size        Description
  487.           -----         ----        -----------
  488.   (Mac3)  0x334d        Short       tag for this extra block type ("M3")
  489.           TSize         Short       total data size for this block
  490.           BSize         Long        uncompressed finder attribute data size
  491.           Flags         Short       info bits
  492.           fdType        Byte[4]     Type of the File (4-byte string)
  493.           fdCreator     Byte[4]     Creator of the File (4-byte string)
  494.  
  495.           The third bit of Flags in both headers indicates whether
  496.           the LOCAL extra field is uncompressed (and therefore whether CType
  497.           and CRC are omitted):
  498.  
  499.           Bits of the Flags:
  500.               bit 0           if set, file is a data fork; otherwise unset
  501.               bit 1           if set, filename will be not changed
  502.               bit 2           if set, Attribs is uncompressed (no CType, CRC)
  503.               bit 3           if set, date and times are in 64 bit
  504.                               if zero date and times are in 32 bit.
  505.               bit 4           if set, timezone offsets fields for the native
  506.                               Mac times are omitted (UTC support deactivated)
  507.               bits 5-15       reserved;
  508.  
  509.  
  510.           Attributes:
  511.  
  512.           Attribs is a Mac-specific block of data in little-endian format with
  513.           the following structure (if compressed, uncompress it first):
  514.  
  515.           Value         Size        Description
  516.           -----         ----        -----------
  517.           fdFlags       Short       Finder Flags
  518.           fdLocation.v  Short       Finder Icon Location
  519.           fdLocation.h  Short       Finder Icon Location
  520.           fdFldr        Short       Folder containing file
  521.  
  522.           FXInfo        16 bytes    Macintosh FXInfo structure
  523.             FXInfo-Structure:
  524.                 fdIconID        Short
  525.                 fdUnused[3]     Short       unused but reserved 6 bytes
  526.                 fdScript        Byte        Script flag and number
  527.                 fdXFlags        Byte        More flag bits
  528.                 fdComment       Short       Comment ID
  529.                 fdPutAway       Long        Home Dir ID
  530.  
  531.           FVersNum      Byte        file version number
  532.                                     may be not used by MacOS
  533.           ACUser        Byte        directory access rights
  534.  
  535.           FlCrDat       ULong       date and time of creation
  536.           FlMdDat       ULong       date and time of last modification
  537.           FlBkDat       ULong       date and time of last backup
  538.             These time numbers are original Mac FileTime values (local time!).
  539.             Currently, date-time width is 32-bit, but future version may
  540.             support be 64-bit times (see flags)
  541.  
  542.           CrGMTOffs     Long(signed!)   difference "local Creat. time - UTC"
  543.           MdGMTOffs     Long(signed!)   difference "local Modif. time - UTC"
  544.           BkGMTOffs     Long(signed!)   difference "local Backup time - UTC"
  545.             These "local time - UTC" differences (stored in seconds) may be
  546.             used to support timestamp adjustment after inter-timezone transfer.
  547.             These fields are optional; bit 4 of the flags word controls their
  548.             presence.
  549.  
  550.           Charset       Short       TextEncodingBase (Charset)
  551.                                     valid for the following two fields
  552.  
  553.           FullPath      variable    Path of the current file.
  554.                                     Zero terminated string (C-String)
  555.                                     Currently coded in the native Charset.
  556.  
  557.           Comment       variable    Finder Comment of the current file.
  558.                                     Zero terminated string (C-String)
  559.                                     Currently coded in the native Charset.
  560.  
  561.  
  562.          -SmartZIP Macintosh Extra Field:
  563.           ====================================
  564.  
  565.           The following is the layout of the SmartZIP extra
  566.           block for Macintosh, designed by Marco Bambini.
  567.  
  568.           Local-header version:
  569.  
  570.           Value         Size        Description
  571.           -----         ----        -----------
  572.           0x4d63        Short       tag for this extra block type ("cM")
  573.           TSize         Short       total data size for this block (64)
  574.           "dZip"        beLong      extra-field signature
  575.           fdType        Byte[4]     Type of the File (4-byte string)
  576.           fdCreator     Byte[4]     Creator of the File (4-byte string)
  577.           fdFlags       beShort     Finder Flags
  578.           fdLocation.v  beShort     Finder Icon Location
  579.           fdLocation.h  beShort     Finder Icon Location
  580.           fdFldr        beShort     Folder containing file
  581.           CrDat         beLong      HParamBlockRec fileParam.ioFlCrDat
  582.           MdDat         beLong      HParamBlockRec fileParam.ioFlMdDat
  583.           frScroll.v    Byte        vertical pos. of folder's scroll bar
  584.           fdScript      Byte        Script flag and number
  585.           frScroll.h    Byte        horizontal pos. of folder's scroll bar
  586.           fdXFlags      Byte        More flag bits
  587.           FileName      Byte[32]    full Macintosh filename (pascal string)
  588.  
  589.           All fields but the first two are in native Macintosh format
  590.           (big-endian Motorola order, not little-endian Intel).
  591.           The extra field size is fixed to 64 bytes.
  592.           The local-header and central-header versions are identical.
  593.  
  594.  
  595.          -Acorn SparkFS Extra Field:
  596.           =========================
  597.  
  598.           The following is the layout of David Pilling's SparkFS extra block
  599.           for Acorn RISC OS.  The local-header and central-header versions are
  600.           identical.  (Last Revision 19960922)
  601.  
  602.           Value         Size        Description
  603.           -----         ----        -----------
  604.   (Acorn) 0x4341        Short       tag for this extra block type ("AC")
  605.           TSize         Short       total data size for this block (20)
  606.           "ARC0"        Long        extra-field signature
  607.           LoadAddr      Long        load address or file type
  608.           ExecAddr      Long        exec address
  609.           Attr          Long        file permissions
  610.           Zero          Long        reserved; always zero
  611.  
  612.           The following bits of Attr are associated with the given file
  613.           permissions:
  614.  
  615.                 bit 0           user-writable ('W')
  616.                 bit 1           user-readable ('R')
  617.                 bit 2           reserved
  618.                 bit 3           locked ('L')
  619.                 bit 4           publicly writable ('w')
  620.                 bit 5           publicly readable ('r')
  621.                 bit 6           reserved
  622.                 bit 7           reserved
  623.  
  624.  
  625.          -VM/CMS Extra Field:
  626.           ==================
  627.  
  628.           The following is the layout of the file-attributes extra block for
  629.           VM/CMS.  The local-header and central-header versions are
  630.           identical.  (Last Revision 19960922)
  631.  
  632.           Value         Size        Description
  633.           -----         ----        -----------
  634.  (VM/CMS) 0x4704        Short       tag for this extra block type
  635.           TSize         Short       total data size for this block
  636.           flData        variable    file attributes data
  637.  
  638.           flData is an uncompressed fldata_t struct.
  639.  
  640.  
  641.          -MVS Extra Field:
  642.           ===============
  643.  
  644.           The following is the layout of the file-attributes extra block for
  645.           MVS.  The local-header and central-header versions are identical.
  646.           (Last Revision 19960922)
  647.  
  648.           Value         Size        Description
  649.           -----         ----        -----------
  650.   (MVS)   0x470f        Short       tag for this extra block type
  651.           TSize         Short       total data size for this block
  652.           flData        variable    file attributes data
  653.  
  654.           flData is an uncompressed fldata_t struct.
  655.  
  656.  
  657.          -PKWARE Unix Extra Field (0x000d):
  658.           ================================
  659.  
  660.           The following is the layout of PKWARE's Unix "extra" block.
  661.           It was introduced with the release of PKZIP for Unix 2.50.
  662.           Note: all fields are stored in Intel low-byte/high-byte order.
  663.           (Last Revision 19980901)
  664.  
  665.           This field has a minimum data size of 12 bytes and is only stored
  666.           as local extra field.
  667.  
  668.           Value         Size        Description
  669.           -----         ----        -----------
  670.  (Unix0)  0x000d        Short       Tag for this "extra" block type
  671.           TSize         Short       Total Data Size for this block
  672.           AcTime        Long        time of last access (UTC/GMT)
  673.           ModTime       Long        time of last modification (UTC/GMT)
  674.           UID           Short       Unix user ID
  675.           GID           Short       Unix group ID
  676.           (var)         variable    Variable length data field
  677.  
  678.           The variable length data field will contain file type
  679.           specific data.  Currently the only values allowed are
  680.           the original "linked to" file names for hard or symbolic
  681.           links, and the major and minor device node numbers for
  682.           character and block device nodes.  Since device nodes
  683.           cannot be either symbolic or hard links, only one set of
  684.           variable length data is stored.  Link files will have the
  685.           name of the original file stored.  This name is NOT NULL
  686.           terminated.  Its size can be determined by checking TSize -
  687.           12.  Device entries will have eight bytes stored as two 4
  688.           byte entries (in little-endian format).  The first entry
  689.           will be the major device number, and the second the minor
  690.           device number.
  691.  
  692.          [Info-ZIP note: The fixed part of this field has the same layout as
  693.           Info-ZIP's abandoned "Unix1 timestamps & owner ID info" extra field;
  694.           only the two tag bytes are different.]
  695.  
  696.  
  697.          -PATCH Descriptor Extra Field (0x000f):
  698.           =====================================
  699.  
  700.           The following is the layout of the Patch Descriptor "extra"
  701.           block.
  702.  
  703.           Note: all fields stored in Intel low-byte/high-byte order.
  704.  
  705.           Value         Size        Description
  706.           -----         ----        -----------
  707.   (Patch) 0x000f        Short       Tag for this "extra" block type
  708.           TSize         Short       Size of the total "extra" block
  709.           Version       Short       Version of the descriptor
  710.           Flags         Long        Actions and reactions (see below)
  711.           OldSize       Long        Size of the file about to be patched
  712.           OldCRC        Long        32-bit CRC of the file about to be patched
  713.           NewSize       Long        Size of the resulting file
  714.           NewCRC        Long        32-bit CRC of the resulting file
  715.  
  716.  
  717.           Actions and reactions
  718.  
  719.           Bits          Description
  720.           ----          ----------------
  721.           0             Use for auto detection
  722.           1             Treat as a self-patch
  723.           2-3           RESERVED
  724.           4-5           Action (see below)
  725.           6-7           RESERVED
  726.           8-9           Reaction (see below) to absent file
  727.           10-11         Reaction (see below) to newer file
  728.           12-13         Reaction (see below) to unknown file
  729.           14-15         RESERVED
  730.           16-31         RESERVED
  731.  
  732.           Actions
  733.  
  734.           Action       Value
  735.           ------       -----
  736.           none         0
  737.           add          1
  738.           delete       2
  739.           patch        3
  740.  
  741.           Reactions
  742.  
  743.           Reaction     Value
  744.           --------     -----
  745.           ask          0
  746.           skip         1
  747.           ignore       2
  748.           fail         3
  749.  
  750.           Patch support is provided by PKPatchMaker(tm) technology and is
  751.           covered under U.S. Patents and Patents Pending. The use or
  752.           implementation in a product of certain technological aspects set
  753.           forth in the current APPNOTE, including those with regard to
  754.           strong encryption, patching, or extended tape operations requires
  755.           a license from PKWARE.  Please contact PKWARE with regard to
  756.           acquiring a license.
  757.  
  758.  
  759.          -PKCS#7 Store for X.509 Certificates (0x0014):
  760.           ============================================
  761.  
  762.           This field contains information about each of the certificates
  763.           files may be signed with.  When the Central Directory Encryption
  764.           feature is enabled for a ZIP file, this record will appear in
  765.           the Archive Extra Data Record, otherwise it will appear in the
  766.           first central directory record and will be ignored in any
  767.           other record.
  768.  
  769.           Note: all fields stored in Intel low-byte/high-byte order.
  770.  
  771.           Value     Size     Description
  772.           -----     ----     -----------
  773.   (Store) 0x0014    2 bytes  Tag for this "extra" block type
  774.           TSize     2 bytes  Size of the store data
  775.           SData     TSize    Data about the store
  776.  
  777.           SData
  778.           Value     Size        Description
  779.           -----     ----        -----------
  780.           Version   2 bytes     Version number, 0x0001 for now
  781.           StoreD    (variable)  Actual store data
  782.  
  783.           The StoreD member is suitable for passing as the pbData
  784.           member of a CRYPT_DATA_BLOB to the CertOpenStore() function
  785.           in Microsoft's CryptoAPI.  The SSize member above will be
  786.           cbData + 6, where cbData is the cbData member of the same
  787.           CRYPT_DATA_BLOB.  The encoding type to pass to
  788.           CertOpenStore() should be
  789.           PKCS_7_ANS_ENCODING | X509_ASN_ENCODING.
  790.  
  791.  
  792.          -X.509 Certificate ID and Signature for individual file (0x0015):
  793.           ===============================================================
  794.  
  795.           This field contains the information about which certificate in
  796.           the PKCS#7 store was used to sign a particular file.  It also
  797.           contains the signature data.  This field can appear multiple
  798.           times, but can only appear once per certificate.
  799.  
  800.           Note: all fields stored in Intel low-byte/high-byte order.
  801.  
  802.           Value         Size        Description
  803.           -----         ----        -----------
  804.   (CID)   0x0015        2 bytes     Tag for this "extra" block type
  805.           CSize         2 bytes     Size of Method
  806.           Method        (variable)
  807.  
  808.           Method
  809.           Value         Size        Description
  810.           -----         ----        -----------
  811.           Version       2 bytes     Version number, for now 0x0001
  812.           AlgID         2 bytes     Algorithm ID used for signing
  813.           IDSize        2 bytes     Size of Certificate ID data
  814.           CertID        (variable)  Certificate ID data
  815.           SigSize       2 bytes     Size of Signature data
  816.           Sig           (variable)  Signature data
  817.  
  818.           CertID
  819.           Value         Size        Description
  820.           -----         ----        -----------
  821.           Size1         4 bytes     Size of CertID, should be (IDSize - 4)
  822.           Size1         4 bytes     A bug in version one causes this value
  823.                                     to appear twice.
  824.           IssSize       4 bytes     Issuer data size
  825.           Issuer        (variable)  Issuer data
  826.           SerSize       4 bytes     Serial Number size
  827.           Serial        (variable)  Serial Number data
  828.  
  829.           The Issuer and IssSize members are suitable for creating a
  830.           CRYPT_DATA_BLOB to be the Issuer member of a CERT_INFO
  831.           struct. The Serial and SerSize members would be the
  832.           SerialNumber member of the same CERT_INFO struct.  This
  833.           struct would be used to find the certificate in the store
  834.           the file was signed with.  Those structures are from the MS
  835.           CryptoAPI.
  836.  
  837.           Sig and SigSize are the actual signature data and size
  838.           generated by signing the file with the MS CryptoAPI using a
  839.           hash created with the given AlgID.
  840.  
  841.  
  842.          -X.509 Certificate ID and Signature for central directory (0x0016):
  843.           =================================================================
  844.  
  845.           This field contains the information about which certificate in
  846.           the PKCS#7 store was used to sign the central directory structure.
  847.           When the Central Directory Encryption feature is enabled for a
  848.           ZIP file, this record will appear in the Archive Extra Data Record,
  849.           otherwise it will appear in the first central directory record,
  850.           along with the store.  The data structure is the
  851.           same as the CID, except that SigSize will be 0, and there
  852.           will be no Sig member.
  853.  
  854.           This field is also kept after the last central directory
  855.           record, as the signature data (ID 0x05054b50, it looks like
  856.           a central directory record of a different type).  This
  857.           second copy of the data is the Signature Data member of the
  858.           record, and will have a SigSize that is non-zero, and will
  859.           have Sig data.
  860.  
  861.           Note: all fields stored in Intel low-byte/high-byte order.
  862.  
  863.           Value     Size     Description
  864.           -----     ----     -----------
  865.   (CDID)  0x0016    2 bytes  Tag for this "extra" block type
  866.           TSize     2 bytes  Size of data that follows
  867.           TData     TSize    Data
  868.  
  869.  
  870.          -Strong Encryption Header (0x0017):
  871.           =================================
  872.  
  873.           Value     Size     Description
  874.           -----     ----     -----------
  875.           0x0017    2 bytes  Tag for this "extra" block type
  876.           TSize     2 bytes  Size of data that follows
  877.           Format    2 bytes  Format definition for this record
  878.           AlgID     2 bytes  Encryption algorithm identifier
  879.           Bitlen    2 bytes  Bit length of encryption key
  880.           Flags     2 bytes  Processing flags
  881.           CertData  TSize-8  Certificate decryption extra field data
  882.                              (refer to the explanation for CertData
  883.                               in the section describing the
  884.                               Certificate Processing Method under
  885.                               the Strong Encryption Specification)
  886.  
  887.  
  888.          -Record Management Controls (0x0018):
  889.           ===================================
  890.  
  891.           Value     Size     Description
  892.           -----     ----     -----------
  893. (Rec-CTL) 0x0018    2 bytes  Tag for this "extra" block type
  894.           CSize     2 bytes  Size of total extra block data
  895.           Tag1      2 bytes  Record control attribute 1
  896.           Size1     2 bytes  Size of attribute 1, in bytes
  897.           Data1     Size1    Attribute 1 data
  898.             .
  899.             .
  900.             .
  901.           TagN      2 bytes  Record control attribute N
  902.           SizeN     2 bytes  Size of attribute N, in bytes
  903.           DataN     SizeN    Attribute N data
  904.  
  905.  
  906.          -PKCS#7 Encryption Recipient Certificate List (0x0019):
  907.           =====================================================
  908.  
  909.           This field contains information about each of the certificates
  910.           used in encryption processing and it can be used to identify who is
  911.           allowed to decrypt encrypted files.  This field should only appear
  912.           in the archive extra data record. This field is not required and
  913.           serves only to aide archive modifications by preserving public
  914.           encryption key data. Individual security requirements may dictate
  915.           that this data be omitted to deter information exposure.
  916.  
  917.           Note: all fields stored in Intel low-byte/high-byte order.
  918.  
  919.           Value     Size     Description
  920.           -----     ----     -----------
  921.  (CStore) 0x0019    2 bytes  Tag for this "extra" block type
  922.           TSize     2 bytes  Size of the store data
  923.           TData     TSize    Data about the store
  924.  
  925.           TData:
  926.  
  927.           Value     Size     Description
  928.           -----     ----     -----------
  929.           Version   2 bytes  Format version number - must 0x0001 at this time
  930.           CStore    (var)    PKCS#7 data blob
  931.  
  932.  
  933.          -MVS Extra Field (PKWARE, 0x0065):
  934.           ================================
  935.  
  936.           The following is the layout of the MVS "extra" block.
  937.           Note: Some fields are stored in Big Endian format.
  938.           All text is in EBCDIC format unless otherwise specified.
  939.  
  940.           Value       Size          Description
  941.           -----       ----          -----------
  942.   (MVS)   0x0065      2 bytes       Tag for this "extra" block type
  943.           TSize       2 bytes       Size for the following data block
  944.           ID          4 bytes       EBCDIC "Z390" 0xE9F3F9F0 or
  945.                                     "T4MV" for TargetFour
  946.           (var)       TSize-4       Attribute data
  947.  
  948.  
  949.          -OS/400 Extra Field (0x0065):
  950.           ===========================
  951.  
  952.           The following is the layout of the OS/400 "extra" block.
  953.           Note: Some fields are stored in Big Endian format.
  954.           All text is in EBCDIC format unless otherwise specified.
  955.  
  956.           Value       Size          Description
  957.           -----       ----          -----------
  958.   (OS400) 0x0065      2 bytes       Tag for this "extra" block type
  959.           TSize       2 bytes       Size for the following data block
  960.           ID          4 bytes       EBCDIC "I400" 0xC9F4F0F0 or
  961.                                     "T4MV" for TargetFour
  962.           (var)       TSize-4       Attribute data
  963.  
  964.  
  965.          -Info-ZIP Unicode Path Extra Field:
  966.           =================================
  967.  
  968.           Stores the UTF-8 version of the entry path as stored in the
  969.           local header and central directory header.
  970.           (Last Revision 20070912)
  971.  
  972.           Value         Size        Description
  973.           -----         ----        -----------
  974.   (UPath) 0x7075        Short       tag for this extra block type ("up")
  975.           TSize         Short       total data size for this block
  976.           Version       Byte        version of this extra field, currently 1
  977.           NameCRC32     Long        CRC-32 checksum of standard name field
  978.           UnicodeName   variable    UTF-8 version of the entry file name
  979.  
  980.           Currently Version is set to the number 1.  If there is a need
  981.           to change this field, the version will be incremented.  Changes
  982.           may not be backward compatible so this extra field should not be
  983.           used if the version is not recognized.
  984.  
  985.           The NameCRC32 is the standard zip CRC32 checksum of the File Name
  986.           field in the header.  This is used to verify that the header
  987.           File Name field has not changed since the Unicode Path extra field
  988.           was created.  This can happen if a utility renames the entry but
  989.           does not update the UTF-8 path extra field.  If the CRC check fails,
  990.           this UTF-8 Path Extra Field should be ignored and the File Name field
  991.           in the header should be used instead.
  992.  
  993.           The UnicodeName is the UTF-8 version of the contents of the File
  994.           Name field in the header, without any trailing NUL.  The standard
  995.           name field in the Zip entry header remains filled with the entry
  996.           name coded in the local machine's extended ASCII system charset.
  997.           As UnicodeName is defined to be UTF-8, no UTF-8 byte order mark
  998.           (BOM) is used.  The length of this field is determined by
  999.           subtracting the size of the previous fields from TSize.
  1000.           If both the File Name and Comment fields are UTF-8, the new General
  1001.           Purpose Bit Flag, bit 11 (Language encoding flag (EFS)), should be
  1002.           used to indicate that both the header File Name and Comment fields
  1003.           are UTF-8 and, in this case, the Unicode Path and Unicode Comment
  1004.           extra fields are not needed and should not be created.  Note that,
  1005.           for backward compatibility, bit 11 should only be used if the native
  1006.           character set of the paths and comments being zipped up are already
  1007.           in UTF-8.  The same method, either general purpose bit 11 or extra
  1008.           fields, should be used in both the Local and Central Directory Header
  1009.           for a file.
  1010.  
  1011.           Utilisation rules:
  1012.           1. This field shall never be created for names consisting solely of
  1013.              7-bit ASCII characters.
  1014.           2. On a system that already uses UTF-8 as system charset, this field
  1015.              shall not repeat the string pattern already stored in the Zip
  1016.              entry's standard name field. Instead, a field of exactly 9 bytes
  1017.              (70 75 05 00 01 and 4 bytes CRC) should be created.
  1018.              In this form with 5 data bytes, the field serves as indicator
  1019.              for the UTF-8 encoding of the standard Zip header's name field.
  1020.           3. This field shall not be used whenever the calculated CRC-32 of
  1021.              the entry's standard name field does not match the provided
  1022.              CRC checksum value.  A mismatch of the CRC check indicates that
  1023.              the standard name field was changed by some non-"up"-aware
  1024.              utility without synchronizing this UTF-8 name e.f. block.
  1025.  
  1026.  
  1027.          -Info-ZIP Unicode Comment Extra Field:
  1028.           ====================================
  1029.  
  1030.           Stores the UTF-8 version of the entry comment as stored in the
  1031.           central directory header.
  1032.           (Last Revision 20070912)
  1033.  
  1034.           Value         Size        Description
  1035.           -----         ----        -----------
  1036.    (UCom) 0x6375        Short       tag for this extra block type ("uc")
  1037.           TSize         Short       total data size for this block
  1038.           Version       1 byte      version of this extra field, currently 1
  1039.           ComCRC32      4 bytes     Comment Field CRC32 Checksum
  1040.           UnicodeCom    Variable    UTF-8 version of the entry comment
  1041.  
  1042.           Currently Version is set to the number 1.  If there is a need
  1043.           to change this field, the version will be incremented.  Changes
  1044.           may not be backward compatible so this extra field should not be
  1045.           used if the version is not recognized.
  1046.  
  1047.           The ComCRC32 is the standard zip CRC32 checksum of the Comment
  1048.           field in the central directory header.  This is used to verify that
  1049.           the comment field has not changed since the Unicode Comment extra
  1050.           field was created.  This can happen if a utility changes the Comment
  1051.           field but does not update the UTF-8 Comment extra field.  If the CRC
  1052.           check fails, this Unicode Comment extra field should be ignored and
  1053.           the Comment field in the header used.
  1054.  
  1055.           The UnicodeCom field is the UTF-8 version of the entry comment field
  1056.           in the header.  As UnicodeCom is defined to be UTF-8, no UTF-8 byte
  1057.           order mark (BOM) is used.  The length of this field is determined by
  1058.           subtracting the size of the previous fields from TSize.  If both the
  1059.           File Name and Comment fields are UTF-8, the new General Purpose Bit
  1060.           Flag, bit 11 (Language encoding flag (EFS)), can be used to indicate
  1061.           both the header File Name and Comment fields are UTF-8 and, in this
  1062.           case, the Unicode Path and Unicode Comment extra fields are not
  1063.           needed and should not be created.  Note that, for backward
  1064.           compatibility, bit 11 should only be used if the native character set
  1065.           of the paths and comments being zipped up are already in UTF-8.  The
  1066.           same method, either bit 11 or extra fields, should be used in both
  1067.           the local and central directory headers.
  1068.  
  1069.  
  1070.          -Extended Timestamp Extra Field:
  1071.           ==============================
  1072.  
  1073.           The following is the layout of the extended-timestamp extra block.
  1074.           (Last Revision 19970118)
  1075.  
  1076.           Local-header version:
  1077.  
  1078.           Value         Size        Description
  1079.           -----         ----        -----------
  1080.   (time)  0x5455        Short       tag for this extra block type ("UT")
  1081.           TSize         Short       total data size for this block
  1082.           Flags         Byte        info bits
  1083.           (ModTime)     Long        time of last modification (UTC/GMT)
  1084.           (AcTime)      Long        time of last access (UTC/GMT)
  1085.           (CrTime)      Long        time of original creation (UTC/GMT)
  1086.  
  1087.           Central-header version:
  1088.  
  1089.           Value         Size        Description
  1090.           -----         ----        -----------
  1091.   (time)  0x5455        Short       tag for this extra block type ("UT")
  1092.           TSize         Short       total data size for this block
  1093.           Flags         Byte        info bits (refers to local header!)
  1094.           (ModTime)     Long        time of last modification (UTC/GMT)
  1095.  
  1096.           The central-header extra field contains the modification time only,
  1097.           or no timestamp at all.  TSize is used to flag its presence or
  1098.           absence.  But note:
  1099.  
  1100.               If "Flags" indicates that Modtime is present in the local header
  1101.               field, it MUST be present in the central header field, too!
  1102.               This correspondence is required because the modification time
  1103.               value may be used to support trans-timezone freshening and
  1104.               updating operations with zip archives.
  1105.  
  1106.           The time values are in standard Unix signed-long format, indicating
  1107.           the number of seconds since 1 January 1970 00:00:00.  The times
  1108.           are relative to Coordinated Universal Time (UTC), also sometimes
  1109.           referred to as Greenwich Mean Time (GMT).  To convert to local time,
  1110.           the software must know the local timezone offset from UTC/GMT.
  1111.  
  1112.           The lower three bits of Flags in both headers indicate which time-
  1113.           stamps are present in the LOCAL extra field:
  1114.  
  1115.                 bit 0           if set, modification time is present
  1116.                 bit 1           if set, access time is present
  1117.                 bit 2           if set, creation time is present
  1118.                 bits 3-7        reserved for additional timestamps; not set
  1119.  
  1120.           Those times that are present will appear in the order indicated, but
  1121.           any combination of times may be omitted.  (Creation time may be
  1122.           present without access time, for example.)  TSize should equal
  1123.           (1 + 4*(number of set bits in Flags)), as the block is currently
  1124.           defined.  Other timestamps may be added in the future.
  1125.  
  1126.  
  1127.          -Info-ZIP Unix Extra Field (type 1):
  1128.           ==================================
  1129.  
  1130.           The following is the layout of the old Info-ZIP extra block for
  1131.           Unix.  It has been replaced by the extended-timestamp extra block
  1132.           (0x5455) and the Unix type 2 extra block (0x7855).
  1133.           (Last Revision 19970118)
  1134.  
  1135.           Local-header version:
  1136.  
  1137.           Value         Size        Description
  1138.           -----         ----        -----------
  1139.   (Unix1) 0x5855        Short       tag for this extra block type ("UX")
  1140.           TSize         Short       total data size for this block
  1141.           AcTime        Long        time of last access (UTC/GMT)
  1142.           ModTime       Long        time of last modification (UTC/GMT)
  1143.           UID           Short       Unix user ID (optional)
  1144.           GID           Short       Unix group ID (optional)
  1145.  
  1146.           Central-header version:
  1147.  
  1148.           Value         Size        Description
  1149.           -----         ----        -----------
  1150.   (Unix1) 0x5855        Short       tag for this extra block type ("UX")
  1151.           TSize         Short       total data size for this block
  1152.           AcTime        Long        time of last access (GMT/UTC)
  1153.           ModTime       Long        time of last modification (GMT/UTC)
  1154.  
  1155.           The file access and modification times are in standard Unix signed-
  1156.           long format, indicating the number of seconds since 1 January 1970
  1157.           00:00:00.  The times are relative to Coordinated Universal Time
  1158.           (UTC), also sometimes referred to as Greenwich Mean Time (GMT).  To
  1159.           convert to local time, the software must know the local timezone
  1160.           offset from UTC/GMT.  The modification time may be used by non-Unix
  1161.           systems to support inter-timezone freshening and updating of zip
  1162.           archives.
  1163.  
  1164.           The local-header extra block may optionally contain UID and GID
  1165.           info for the file.  The local-header TSize value is the only
  1166.           indication of this.  Note that Unix UIDs and GIDs are usually
  1167.           specific to a particular machine, and they generally require root
  1168.           access to restore.
  1169.  
  1170.           This extra field type is obsolete, but it has been in use since
  1171.           mid-1994.  Therefore future archiving software should continue to
  1172.           support it.  Some guidelines:
  1173.  
  1174.               An archive member should either contain the old "Unix1"
  1175.               extra field block or the new extra field types "time" and/or
  1176.               "Unix2".
  1177.  
  1178.               If both the old "Unix1" block type and one or both of the new
  1179.               block types "time" and "Unix2" are found, the "Unix1" block
  1180.               should be considered invalid and ignored.
  1181.  
  1182.               Unarchiving software should recognize both old and new extra
  1183.               field block types, but the info from new types overrides the
  1184.               old "Unix1" field.
  1185.  
  1186.               Archiving software should recognize "Unix1" extra fields for
  1187.               timestamp comparison but never create it for updated, freshened
  1188.               or new archive members.  When copying existing members to a new
  1189.               archive, any "Unix1" extra field blocks should be converted to
  1190.               the new "time" and/or "Unix2" types.
  1191.  
  1192.  
  1193.          -Info-ZIP UNIX Extra Field (type 2):
  1194.           ==================================
  1195.  
  1196.           The following is the layout of the new Info-ZIP extra block for
  1197.           Unix.  (Last Revision 19960922)
  1198.  
  1199.           Local-header version:
  1200.  
  1201.           Value         Size        Description
  1202.           -----         ----        -----------
  1203.   (Unix2) 0x7855        Short       tag for this extra block type ("Ux")
  1204.           TSize         Short       total data size for this block (4)
  1205.           UID           Short       Unix user ID
  1206.           GID           Short       Unix group ID
  1207.  
  1208.           Central-header version:
  1209.  
  1210.           Value         Size        Description
  1211.           -----         ----        -----------
  1212.   (Unix2) 0x7855        Short       tag for this extra block type ("Ux")
  1213.           TSize         Short       total data size for this block (0)
  1214.  
  1215.           The data size of the central-header version is zero; it is used
  1216.           solely as a flag that UID/GID info is present in the local-header
  1217.           extra field.  If additional fields are ever added to the local
  1218.           version, the central version may be extended to indicate this.
  1219.  
  1220.           Note that Unix UIDs and GIDs are usually specific to a particular
  1221.           machine, and they generally require root access to restore.
  1222.  
  1223.  
  1224.          -Info-ZIP New Unix Extra Field:
  1225.           ====================================
  1226.  
  1227.           Currently stores Unix UIDs/GIDs up to 32 bits.
  1228.           (Last Revision 20080509)
  1229.  
  1230.           Value         Size        Description
  1231.           -----         ----        -----------
  1232.   (UnixN) 0x7875        Short       tag for this extra block type ("ux")
  1233.           TSize         Short       total data size for this block
  1234.           Version       1 byte      version of this extra field, currently 1
  1235.           UIDSize       1 byte      Size of UID field
  1236.           UID           Variable    UID for this entry
  1237.           GIDSize       1 byte      Size of GID field
  1238.           GID           Variable    GID for this entry
  1239.  
  1240.           Currently Version is set to the number 1.  If there is a need
  1241.           to change this field, the version will be incremented.  Changes
  1242.           may not be backward compatible so this extra field should not be
  1243.           used if the version is not recognized.
  1244.  
  1245.           UIDSize is the size of the UID field in bytes.  This size should
  1246.           match the size of the UID field on the target OS.
  1247.  
  1248.           UID is the UID for this entry in standard little endian format.
  1249.  
  1250.           GIDSize is the size of the GID field in bytes.  This size should
  1251.           match the size of the GID field on the target OS.
  1252.  
  1253.           GID is the GID for this entry in standard little endian format.
  1254.  
  1255.           If both the old 16-bit Unix extra field (tag 0x7855, Info-ZIP Unix2)
  1256.           and this extra field are present, the values in this extra field
  1257.           supercede the values in that extra field.
  1258.  
  1259.  
  1260.          -ASi UNIX Extra Field:
  1261.           ====================
  1262.  
  1263.           The following is the layout of the ASi extra block for Unix.  The
  1264.           local-header and central-header versions are identical.
  1265.           (Last Revision 19960916)
  1266.  
  1267.           Value         Size        Description
  1268.           -----         ----        -----------
  1269.   (Unix3) 0x756e        Short       tag for this extra block type ("nu")
  1270.           TSize         Short       total data size for this block
  1271.           CRC           Long        CRC-32 of the remaining data
  1272.           Mode          Short       file permissions
  1273.           SizDev        Long        symlink'd size OR major/minor dev num
  1274.           UID           Short       user ID
  1275.           GID           Short       group ID
  1276.           (var.)        variable    symbolic link filename
  1277.  
  1278.           Mode is the standard Unix st_mode field from struct stat, containing
  1279.           user/group/other permissions, setuid/setgid and symlink info, etc.
  1280.  
  1281.           If Mode indicates that this file is a symbolic link, SizDev is the
  1282.           size of the file to which the link points.  Otherwise, if the file
  1283.           is a device, SizDev contains the standard Unix st_rdev field from
  1284.           struct stat (includes the major and minor numbers of the device).
  1285.           SizDev is undefined in other cases.
  1286.  
  1287.           If Mode indicates that the file is a symbolic link, the final field
  1288.           will be the name of the file to which the link points.  The file-
  1289.           name length can be inferred from TSize.
  1290.  
  1291.           [Note that TSize may incorrectly refer to the data size not counting
  1292.            the CRC; i.e., it may be four bytes too small.]
  1293.  
  1294.  
  1295.          -BeOS Extra Field:
  1296.           ================
  1297.  
  1298.           The following is the layout of the file-attributes extra block for
  1299.           BeOS.  (Last Revision 19970531)
  1300.  
  1301.           Local-header version:
  1302.  
  1303.           Value         Size        Description
  1304.           -----         ----        -----------
  1305.   (BeOS)  0x6542        Short       tag for this extra block type ("Be")
  1306.           TSize         Short       total data size for this block
  1307.           BSize         Long        uncompressed file attribute data size
  1308.           Flags         Byte        info bits
  1309.           (CType)       Short       compression type
  1310.           (CRC)         Long        CRC value for uncompressed file attribs
  1311.           Attribs       variable    file attribute data
  1312.  
  1313.           Central-header version:
  1314.  
  1315.           Value         Size        Description
  1316.           -----         ----        -----------
  1317.   (BeOS)  0x6542        Short       tag for this extra block type ("Be")
  1318.           TSize         Short       total data size for this block (5)
  1319.           BSize         Long        size of uncompr. local EF block data
  1320.           Flags         Byte        info bits
  1321.  
  1322.           The least significant bit of Flags in both headers indicates whether
  1323.           the LOCAL extra field is uncompressed (and therefore whether CType
  1324.           and CRC are omitted):
  1325.  
  1326.                 bit 0           if set, Attribs is uncompressed (no CType, CRC)
  1327.                 bits 1-7        reserved; if set, assume error or unknown data
  1328.  
  1329.           Currently the only supported compression types are deflated (type 8)
  1330.           and stored (type 0); the latter is not used by Info-ZIP's Zip but is
  1331.           supported by UnZip.
  1332.  
  1333.           Attribs is a BeOS-specific block of data in big-endian format with
  1334.           the following structure (if compressed, uncompress it first):
  1335.  
  1336.               Value     Size        Description
  1337.               -----     ----        -----------
  1338.               Name      variable    attribute name (null-terminated string)
  1339.               Type      Long        attribute type (32-bit unsigned integer)
  1340.               Size      Long Long   data size for this sub-block (64 bits)
  1341.               Data      variable    attribute data
  1342.  
  1343.           The attribute structure is repeated for every attribute.  The Data
  1344.           field may contain anything--text, flags, bitmaps, etc.
  1345.  
  1346.  
  1347.          -AtheOS Extra Field:
  1348.           ==================
  1349.  
  1350.           The following is the layout of the file-attributes extra block for
  1351.           AtheOS.  This field is a very close spin-off from the BeOS e.f.
  1352.           The only differences are:
  1353.            - a new extra field signature
  1354.            - numeric field in the attributes data are stored in little-endian
  1355.              format ("i386" was initial hardware for AtheOS)
  1356.           (Last Revision 20040908)
  1357.  
  1358.           Local-header version:
  1359.  
  1360.           Value         Size        Description
  1361.           -----         ----        -----------
  1362.  (AtheOS) 0x7441        Short       tag for this extra block type ("At")
  1363.           TSize         Short       total data size for this block
  1364.           BSize         Long        uncompressed file attribute data size
  1365.           Flags         Byte        info bits
  1366.           (CType)       Short       compression type
  1367.           (CRC)         Long        CRC value for uncompressed file attribs
  1368.           Attribs       variable    file attribute data
  1369.  
  1370.           Central-header version:
  1371.  
  1372.           Value         Size        Description
  1373.           -----         ----        -----------
  1374.  (AtheOS) 0x7441        Short       tag for this extra block type ("At")
  1375.           TSize         Short       total data size for this block (5)
  1376.           BSize         Long        size of uncompr. local EF block data
  1377.           Flags         Byte        info bits
  1378.  
  1379.           The least significant bit of Flags in both headers indicates whether
  1380.           the LOCAL extra field is uncompressed (and therefore whether CType
  1381.           and CRC are omitted):
  1382.  
  1383.                 bit 0           if set, Attribs is uncompressed (no CType, CRC)
  1384.                 bits 1-7        reserved; if set, assume error or unknown data
  1385.  
  1386.           Currently the only supported compression types are deflated (type 8)
  1387.           and stored (type 0); the latter is not used by Info-ZIP's Zip but is
  1388.           supported by UnZip.
  1389.  
  1390.           Attribs is a AtheOS-specific block of data in little-endian format
  1391.           with the following structure (if compressed, uncompress it first):
  1392.  
  1393.               Value     Size        Description
  1394.               -----     ----        -----------
  1395.               Name      variable    attribute name (null-terminated string)
  1396.               Type      Long        attribute type (32-bit unsigned integer)
  1397.               Size      Long Long   data size for this sub-block (64 bits)
  1398.               Data      variable    attribute data
  1399.  
  1400.           The attribute structure is repeated for every attribute.  The Data
  1401.           field may contain anything--text, flags, bitmaps, etc.
  1402.  
  1403.  
  1404.          -SMS/QDOS Extra Field:
  1405.           ====================
  1406.  
  1407.           The following is the layout of the file-attributes extra block for
  1408.           SMS/QDOS.  The local-header and central-header versions are identical.
  1409.           (Last Revision 19960929)
  1410.  
  1411.           Value         Size        Description
  1412.           -----         ----        -----------
  1413.   (QDOS)  0xfb4a        Short       tag for this extra block type
  1414.           TSize         Short       total data size for this block
  1415.           LongID        Long        extra-field signature
  1416.           (ExtraID)     Long        additional signature/flag bytes
  1417.           QDirect       64 bytes    qdirect structure
  1418.  
  1419.           LongID may be "QZHD" or "QDOS".  In the latter case, ExtraID will
  1420.           be present.  Its first three bytes are "02\0"; the last byte is
  1421.           currently undefined.
  1422.  
  1423.           QDirect contains the file's uncompressed directory info (qdirect
  1424.           struct).  Its elements are in native (big-endian) format:
  1425.  
  1426.           d_length      beLong          file length
  1427.           d_access      byte            file access type
  1428.           d_type        byte            file type
  1429.           d_datalen     beLong          data length
  1430.           d_reserved    beLong          unused
  1431.           d_szname      beShort         size of filename
  1432.           d_name        36 bytes        filename
  1433.           d_update      beLong          time of last update
  1434.           d_refdate     beLong          file version number
  1435.           d_backup      beLong          time of last backup (archive date)
  1436.  
  1437.  
  1438.          -AOS/VS Extra Field:
  1439.           ==================
  1440.  
  1441.           The following is the layout of the extra block for Data General
  1442.           AOS/VS.  The local-header and central-header versions are identical.
  1443.           (Last Revision 19961125)
  1444.  
  1445.           Value         Size        Description
  1446.           -----         ----        -----------
  1447.   (AOSVS) 0x5356        Short       tag for this extra block type ("VS")
  1448.           TSize         Short       total data size for this block
  1449.           "FCI\0"       Long        extra-field signature
  1450.           Version       Byte        version of AOS/VS extra block (10 = 1.0)
  1451.           Fstat         variable    fstat packet
  1452.           AclBuf        variable    raw ACL data ($MXACL bytes)
  1453.  
  1454.           Fstat contains the file's uncompressed fstat packet, which is one of
  1455.           the following:
  1456.  
  1457.                 normal fstat packet             (P_FSTAT struct)
  1458.                 DIR/CPD fstat packet            (P_FSTAT_DIR struct)
  1459.                 unit (device) fstat packet      (P_FSTAT_UNIT struct)
  1460.                 IPC file fstat packet           (P_FSTAT_IPC struct)
  1461.  
  1462.           AclBuf contains the raw ACL data; its length is $MXACL.
  1463.  
  1464.  
  1465.          -Tandem NSK Extra Field:
  1466.           ======================
  1467.  
  1468.           The following is the layout of the file-attributes extra block for
  1469.           Tandem NSK.  The local-header and central-header versions are
  1470.           identical.  (Last Revision 19981221)
  1471.  
  1472.           Value         Size        Description
  1473.           -----         ----        -----------
  1474.   (TA)    0x4154        Short       tag for this extra block type ("TA")
  1475.           TSize         Short       total data size for this block (20)
  1476.           NSKattrs      20 Bytes    NSK attributes
  1477.  
  1478.  
  1479.          -THEOS Extra Field:
  1480.           =================
  1481.  
  1482.           The following is the layout of the file-attributes extra block for
  1483.           Theos.  The local-header and central-header versions are identical.
  1484.           (Last Revision 19990206)
  1485.  
  1486.           Value         Size        Description
  1487.           -----         ----        -----------
  1488.   (Theos) 0x6854        Short       'Th' signature
  1489.           size          Short       size of extra block
  1490.           flags         Byte        reserved for future use
  1491.           filesize      Long        file size
  1492.           fileorg       Byte        type of file (see below)
  1493.           keylen        Short       key length for indexed and keyed files,
  1494.                                     data segment size for 16 bits programs
  1495.           reclen        Short       record length for indexed,keyed and direct,
  1496.                                     text segment size for 16 bits programs
  1497.           filegrow      Byte        growing factor for indexed,keyed and direct
  1498.           protect       Byte        protections (see below)
  1499.           reserved      Short       reserved for future use
  1500.  
  1501.             File types
  1502.             ==========
  1503.  
  1504.             0x80  library (keyed access list of files)
  1505.             0x40  directory
  1506.             0x10  stream file
  1507.             0x08  direct file
  1508.             0x04  keyed file
  1509.             0x02  indexed file
  1510.             0x0e  reserved
  1511.             0x01  16 bits real mode program (obsolete)
  1512.             0x21  16 bits protected mode program
  1513.             0x41  32 bits protected mode program
  1514.  
  1515.             Protection codes
  1516.             ================
  1517.  
  1518.             User protection
  1519.             ---------------
  1520.             0x01  non readable
  1521.             0x02  non writable
  1522.             0x04  non executable
  1523.             0x08  non erasable
  1524.  
  1525.             Other protection
  1526.             ----------------
  1527.             0x10  non readable
  1528.             0x20  non writable
  1529.             0x40  non executable Theos before 4.0
  1530.             0x40  modified Theos 4.x
  1531.             0x80  not hidden
  1532.  
  1533.  
  1534.          -THEOS old inofficial Extra Field:
  1535.           ================================
  1536.  
  1537.           The following is the layout of an inoffical former version of a
  1538.           Theos file-attributes extra blocks.  This layout was never published
  1539.           and is no longer created. However, UnZip can optionally support it
  1540.           when compiling with the option flag OLD_THEOS_EXTRA defined.
  1541.           Both the local-header and central-header versions are identical.
  1542.           (Last Revision 19990206)
  1543.  
  1544.           Value         Size        Description
  1545.           -----         ----        -----------
  1546.   (THS0)  0x4854        Short       'TH' signature
  1547.           size          Short       size of extra block
  1548.           flags         Short       reserved for future use
  1549.           filesize      Long        file size
  1550.           reclen        Short       record length for indexed,keyed and direct,
  1551.                                     text segment size for 16 bits programs
  1552.           keylen        Short       key length for indexed and keyed files,
  1553.                                     data segment size for 16 bits programs
  1554.           filegrow      Byte        growing factor for indexed,keyed and direct
  1555.           reserved      3 Bytes     reserved for future use
  1556.  
  1557.  
  1558.          -FWKCS MD5 Extra Field (0x4b46):
  1559.           ==============================
  1560.  
  1561.           The FWKCS Contents_Signature System, used in automatically
  1562.           identifying files independent of filename, optionally adds
  1563.           and uses an extra field to support the rapid creation of
  1564.           an enhanced contents_signature.
  1565.           There is no local-header version; the following applies
  1566.           only to the central header.  (Last Revision 19961207)
  1567.  
  1568.           Central-header version:
  1569.  
  1570.           Value         Size        Description
  1571.           -----         ----        -----------
  1572.   (MD5)   0x4b46        Short       tag for this extra block type ("FK")
  1573.           TSize         Short       total data size for this block (19)
  1574.           "MD5"         3 bytes     extra-field signature
  1575.           MD5hash       16 bytes    128-bit MD5 hash of uncompressed data
  1576.                                     (low byte first)
  1577.  
  1578.           When FWKCS revises a .ZIP file central directory to add
  1579.           this extra field for a file, it also replaces the
  1580.           central directory entry for that file's uncompressed
  1581.           file length with a measured value.
  1582.  
  1583.           FWKCS provides an option to strip this extra field, if
  1584.           present, from a .ZIP file central directory. In adding
  1585.           this extra field, FWKCS preserves .ZIP file Authenticity
  1586.           Verification; if stripping this extra field, FWKCS
  1587.           preserves all versions of AV through PKZIP version 2.04g.
  1588.  
  1589.           FWKCS, and FWKCS Contents_Signature System, are
  1590.           trademarks of Frederick W. Kantor.
  1591.  
  1592.           (1) R. Rivest, RFC1321.TXT, MIT Laboratory for Computer
  1593.               Science and RSA Data Security, Inc., April 1992.
  1594.               ll.76-77: "The MD5 algorithm is being placed in the
  1595.               public domain for review and possible adoption as a
  1596.               standard."
  1597.  
  1598.  
  1599.          -Microsoft Open Packaging Growth Hint (0xa220):
  1600.           =============================================
  1601.  
  1602.           Value         Size        Description
  1603.           -----         ----        -----------
  1604.           0xa220        Short       tag for this extra block type
  1605.           TSize         Short       size of Sig + PadVal + Padding
  1606.           Sig           Short       verification signature (A028)
  1607.           PadVal        Short       Initial padding value
  1608.           Padding       variable    filled with NULL characters
  1609.