1 // ZipHeader.h
2 
3 #ifndef __ARCHIVE_ZIP_HEADER_H
4 #define __ARCHIVE_ZIP_HEADER_H
5 
6 #include "../../../Common/MyTypes.h"
7 
8 namespace NArchive {
9 namespace NZip {
10 
11 const unsigned kMarkerSize = 4;
12 
13 namespace NSignature
14 {
15   const UInt32 kLocalFileHeader   = 0x04034B50;
16   const UInt32 kDataDescriptor    = 0x08074B50;
17   const UInt32 kCentralFileHeader = 0x02014B50;
18   const UInt32 kEcd               = 0x06054B50;
19   const UInt32 kEcd64             = 0x06064B50;
20   const UInt32 kEcd64Locator      = 0x07064B50;
21   const UInt32 kSpan              = 0x08074B50;
22   const UInt32 kNoSpan            = 0x30304B50; // PK00, replaces kSpan, if there is only 1 segment
23 }
24 
25 const unsigned kLocalHeaderSize = 4 + 26; // including signature
26 const unsigned kDataDescriptorSize32 = 4 + 4 + 4 * 2;  // including signature
27 const unsigned kDataDescriptorSize64 = 4 + 4 + 8 * 2;  // including signature
28 const unsigned kCentralHeaderSize = 4 + 42; // including signature
29 
30 const unsigned kEcdSize = 22; // including signature
31 const unsigned kEcd64_MainSize = 44;
32 const unsigned kEcd64_FullSize = 12 + kEcd64_MainSize;
33 const unsigned kEcd64Locator_Size = 20;
34 
35 namespace NFileHeader
36 {
37   namespace NCompressionMethod
38   {
39     enum EType
40     {
41       kStore = 0,
42       kShrink = 1,
43       kReduce1 = 2,
44       kReduce2 = 3,
45       kReduce3 = 4,
46       kReduce4 = 5,
47       kImplode = 6,
48       kTokenize = 7,
49       kDeflate = 8,
50       kDeflate64 = 9,
51       kPKImploding = 10,
52 
53       kBZip2 = 12,
54 
55       kLZMA = 14,
56 
57       kTerse = 18,
58       kLz77 = 19,
59       kZstdPk = 20,
60 
61       kZstdWz = 93,
62       kMP3 = 94,
63       kXz = 95,
64       kJpeg = 96,
65       kWavPack = 97,
66       kPPMd = 98,
67       kWzAES = 99
68     };
69 
70     const Byte kMadeByProgramVersion = 63;
71 
72     const Byte kExtractVersion_Default = 10;
73     const Byte kExtractVersion_Dir = 20;
74     const Byte kExtractVersion_ZipCrypto = 20;
75     const Byte kExtractVersion_Deflate = 20;
76     const Byte kExtractVersion_Deflate64 = 21;
77     const Byte kExtractVersion_Zip64 = 45;
78     const Byte kExtractVersion_BZip2 = 46;
79     const Byte kExtractVersion_Aes = 51;
80     const Byte kExtractVersion_LZMA = 63;
81     const Byte kExtractVersion_PPMd = 63;
82     const Byte kExtractVersion_Xz = 20; // test it
83   }
84 
85   namespace NExtraID
86   {
87     enum
88     {
89       kZip64 = 0x01,
90       kNTFS = 0x0A,
91       kStrongEncrypt = 0x17,
92       kIzNtSecurityDescriptor = 0x4453,
93       kUnixTime = 0x5455,
94       kUnixExtra = 0x5855,
95       kIzUnicodeComment = 0x6375,
96       kIzUnicodeName = 0x7075,
97       kUnix2Extra = 0x7855,
98       kUnix3Extra = 0x7875,
99       kWzAES = 0x9901,
100       kApkAlign = 0xD935
101     };
102   }
103 
104   namespace NNtfsExtra
105   {
106     const UInt16 kTagTime = 1;
107     enum
108     {
109       kMTime = 0,
110       kATime,
111       kCTime
112     };
113   }
114 
115   namespace NUnixTime
116   {
117     enum
118     {
119       kMTime = 0,
120       kATime,
121       kCTime
122     };
123   }
124 
125   namespace NUnixExtra
126   {
127     enum
128     {
129       kATime = 0,
130       kMTime
131     };
132   }
133 
134   namespace NFlags
135   {
136     const unsigned kEncrypted = 1 << 0;
137     const unsigned kLzmaEOS = 1 << 1;
138     const unsigned kDescriptorUsedMask = 1 << 3;
139     const unsigned kStrongEncrypted = 1 << 6;
140     const unsigned kUtf8 = 1 << 11;
141     const unsigned kAltStream = 1 << 14;
142 
143     const unsigned kImplodeDictionarySizeMask = 1 << 1;
144     const unsigned kImplodeLiteralsOnMask     = 1 << 2;
145 
146     /*
147     const unsigned kDeflateTypeBitStart = 1;
148     const unsigned kNumDeflateTypeBits = 2;
149     const unsigned kNumDeflateTypes = (1 << kNumDeflateTypeBits);
150     const unsigned kDeflateTypeMask = (1 << kNumDeflateTypeBits) - 1;
151     */
152   }
153 
154   namespace NHostOS
155   {
156     enum EEnum
157     {
158       kFAT      =  0,
159       kAMIGA    =  1,
160       kVMS      =  2,  // VAX/VMS
161       kUnix     =  3,
162       kVM_CMS   =  4,
163       kAtari    =  5,  // what if it's a minix filesystem? [cjh]
164       kHPFS     =  6,  // filesystem used by OS/2 (and NT 3.x)
165       kMac      =  7,
166       kZ_System =  8,
167       kCPM      =  9,
168       kTOPS20   = 10,  // pkzip 2.50 NTFS
169       kNTFS     = 11,  // filesystem used by Windows NT
170       kQDOS     = 12,  // SMS/QDOS
171       kAcorn    = 13,  // Archimedes Acorn RISC OS
172       kVFAT     = 14,  // filesystem used by Windows 95, NT
173       kMVS      = 15,
174       kBeOS     = 16,  // hybrid POSIX/database filesystem
175       kTandem   = 17,
176       kOS400    = 18,
177       kOSX      = 19
178     };
179   }
180 
181 
182   namespace NAmigaAttrib
183   {
184     const UInt32 kIFMT     = 06000;    // Amiga file type mask
185     const UInt32 kIFDIR    = 04000;    // Amiga directory
186     const UInt32 kIFREG    = 02000;    // Amiga regular file
187     const UInt32 kIHIDDEN  = 00200;    // to be supported in AmigaDOS 3.x
188     const UInt32 kISCRIPT  = 00100;    // executable script (text command file)
189     const UInt32 kIPURE    = 00040;    // allow loading into resident memory
190     const UInt32 kIARCHIVE = 00020;    // not modified since bit was last set
191     const UInt32 kIREAD    = 00010;    // can be opened for reading
192     const UInt32 kIWRITE   = 00004;    // can be opened for writing
193     const UInt32 kIEXECUTE = 00002;    // executable image, a loadable runfile
194     const UInt32 kIDELETE  = 00001;    // can be deleted
195   }
196 }
197 
198 }}
199 
200 #endif
201