Skip to main content

zip/format/
extra_fields.rs

1//! Extra fields
2
3/// Known Extra Field Id from PKWARE specifications
4#[repr(u16)]
5#[derive(Debug, Clone, Copy, PartialEq, Eq)]
6#[allow(unused)]
7#[non_exhaustive]
8pub enum ExtraFieldId {
9    /// Zip64 Extended information
10    Zip64ExtendedInfo = 0x0001,
11    /// AV Info
12    AvInfo = 0x0007,
13    /// Reserved for extended language encoding data (PFS)
14    ReservedExtendedLanguageEncoding = 0x0008,
15    /// OS/2
16    Os2 = 0x0009,
17    /// Ntfs
18    Ntfs = 0x000a,
19    /// OpenVMS
20    OpenVms = 0x000c,
21    /// UNIX
22    Unix = 0x000d,
23    /// Reserved for file stream and fork descriptors
24    ReservedFileStreamAndForkDescriptors = 0x000e,
25    /// Patch Descriptor
26    PatchDescriptor = 0x000f,
27    /// PKCS#7 Store for X.509 Certificates
28    Pkcs7StoreForX509Certificates = 0x0014,
29    /// X.509 Certificate ID and Signature for individual file
30    X509CertificateIdAndSignature = 0x0015,
31    /// X.509 Certificate ID for Central Directory
32    X509CertificateIdCentralDirectory = 0x0016,
33    /// Strong Encryption Header
34    StrongEncryptionHeader = 0x0017,
35    /// Record Management Controls
36    RecordManagementControls = 0x0018,
37    /// PKCS#7 Encryption Recipient Certificate List
38    Pkcs7EncryptionRecipientCertificateList = 0x0019,
39    /// Reserved for Timestamp record
40    ReservedTimestampRecord = 0x0020,
41    /// Policy Decryption Key Record
42    PolicyDecryptionKeyRecord = 0x0021,
43    /// Smartcrypt Key Provider Record
44    SmartcryptKeyProviderRecord = 0x0022,
45    /// Smartcrypt Policy Key Data Record
46    SmartcryptPolicyKeyDataRecord = 0x0023,
47    /// IBM S/390 (Z390), AS/400 (I400) attributes - uncompressed
48    IbmS390As400Attributes = 0x0065,
49    /// Reserved for IBM S/390 (Z390), AS/400 (I400) attributes - compressed
50    ReservedIbmS390As400AttributesCompressed = 0x0066,
51    // Third party mappings commonly used
52    /// Macintosh
53    Macintosh = 0x07c8,
54    /// Pixar USD header ID
55    PixarUsdHeader = 0x1986,
56    /// ZipIt Macintosh
57    ZipItMacintosh = 0x2605,
58    /// ZipIt Macintosh 1.3.5+
59    ZipItMacintosh135Plus = 0x2705,
60    /// ZipIt Macintosh 1.3.5+
61    ZipItMacintosh135PlusAlt = 0x2805,
62    /// Info-ZIP Macintosh
63    InfoZipMacintosh = 0x334d,
64    /// Tandem
65    Tandem = 0x4154,
66    /// Acorn/SparkFS
67    AcornSparkFs = 0x4341,
68    /// Windows NT security descriptor (binary ACL)
69    WindowsNtSecurityDescriptor = 0x4453,
70    /// POSZIP 4690 (reserved)
71    Poszip4690 = 0x4690,
72    /// VM/CMS
73    VmCms = 0x4704,
74    /// MVS
75    Mvs = 0x470f,
76    /// THEOS (old?)
77    TheosOld = 0x4854,
78    /// FWKCS MD5
79    FwkcsMd5 = 0x4b46,
80    /// OS/2 access control list (text ACL)
81    Os2AccessControlList = 0x4c41,
82    /// Info-ZIP OpenVMS
83    InfoZipOpenVms = 0x4d49,
84    /// Macintosh Smartzip (??)
85    MacintoshSmartzip = 0x4d63,
86    /// Xceed original location extra field
87    XceedOriginalLocation = 0x4f4c,
88    /// AOS/VS (ACL)
89    AosVsAcl = 0x5356,
90    /// Extended Timestamp
91    ExtendedTimestamp = 0x5455,
92    /// Xceed unicode extra field
93    XceedUnicode = 0x554e,
94    /// Info-ZIP UNIX (original, also OS/2, NT, etc)
95    InfoZipUnixOriginal = 0x5855,
96    /// Unicode comment
97    UnicodeComment = 0x6375,
98    /// BeOS/BeBox
99    BeOsBeBox = 0x6542,
100    /// THEOS
101    Theos = 0x6854,
102    /// Unicode Path
103    UnicodePath = 0x7075,
104    /// AtheOS/Syllable
105    AtheosSyllable = 0x7441,
106    /// ASi UNIX
107    AsiUnix = 0x756e,
108    /// Info-ZIP UNIX (new)
109    InfoZipUnixNew = 0x7855,
110    /// Info-ZIP UNIX (newer UID/GID)
111    InfoZipUnixNewerUidGid = 0x7875,
112    /// AE-X Encryption
113    AeXEncryption = 0x9901,
114    /// unknown
115    Unknown9902 = 0x9902,
116    /// DataStream Alignment
117    DataStreamAlignment = 0xa11e,
118    /// Microsoft Open Packaging Growth Hint
119    MicrosoftOpenPackagingGrowthHint = 0xa220,
120    /// Java JAR file Extra Field Header ID
121    JavaJar = 0xcafe,
122    /// Android ZIP Alignment Extra Field
123    AndroidZipAlignment = 0xd935,
124    /// Korean ZIP code page info
125    KoreanZipCodePageInfo = 0xe57a,
126    /// SMS/QDOS
127    SmsQdos = 0xfd4a,
128}
129
130impl ExtraFieldId {
131    /// Get value as u16
132    #[must_use]
133    pub const fn as_u16(self) -> u16 {
134        self as u16
135    }
136}
137
138/// Known Extra fields (PKWARE and Third party) mappings, sorted
139pub const EXTRA_FIELD_MAPPING: [u16; 59] = [
140    ExtraFieldId::Zip64ExtendedInfo.as_u16(),
141    ExtraFieldId::AvInfo.as_u16(),
142    ExtraFieldId::ReservedExtendedLanguageEncoding.as_u16(),
143    ExtraFieldId::Os2.as_u16(),
144    ExtraFieldId::Ntfs.as_u16(),
145    ExtraFieldId::OpenVms.as_u16(),
146    ExtraFieldId::Unix.as_u16(),
147    ExtraFieldId::ReservedFileStreamAndForkDescriptors.as_u16(),
148    ExtraFieldId::PatchDescriptor.as_u16(),
149    ExtraFieldId::Pkcs7StoreForX509Certificates.as_u16(),
150    ExtraFieldId::X509CertificateIdAndSignature.as_u16(),
151    ExtraFieldId::X509CertificateIdCentralDirectory.as_u16(),
152    ExtraFieldId::StrongEncryptionHeader.as_u16(),
153    ExtraFieldId::RecordManagementControls.as_u16(),
154    ExtraFieldId::Pkcs7EncryptionRecipientCertificateList.as_u16(),
155    ExtraFieldId::ReservedTimestampRecord.as_u16(),
156    ExtraFieldId::PolicyDecryptionKeyRecord.as_u16(),
157    ExtraFieldId::SmartcryptKeyProviderRecord.as_u16(),
158    ExtraFieldId::SmartcryptPolicyKeyDataRecord.as_u16(),
159    ExtraFieldId::IbmS390As400Attributes.as_u16(),
160    ExtraFieldId::ReservedIbmS390As400AttributesCompressed.as_u16(),
161    // Third party mappings commonly used
162    ExtraFieldId::Macintosh.as_u16(),
163    ExtraFieldId::PixarUsdHeader.as_u16(),
164    ExtraFieldId::ZipItMacintosh.as_u16(),
165    ExtraFieldId::ZipItMacintosh135Plus.as_u16(),
166    ExtraFieldId::ZipItMacintosh135PlusAlt.as_u16(),
167    ExtraFieldId::InfoZipMacintosh.as_u16(),
168    ExtraFieldId::Tandem.as_u16(),
169    ExtraFieldId::AcornSparkFs.as_u16(),
170    ExtraFieldId::WindowsNtSecurityDescriptor.as_u16(),
171    ExtraFieldId::Poszip4690.as_u16(),
172    ExtraFieldId::VmCms.as_u16(),
173    ExtraFieldId::Mvs.as_u16(),
174    ExtraFieldId::TheosOld.as_u16(),
175    ExtraFieldId::FwkcsMd5.as_u16(),
176    ExtraFieldId::Os2AccessControlList.as_u16(),
177    ExtraFieldId::InfoZipOpenVms.as_u16(),
178    ExtraFieldId::MacintoshSmartzip.as_u16(),
179    ExtraFieldId::XceedOriginalLocation.as_u16(),
180    ExtraFieldId::AosVsAcl.as_u16(),
181    ExtraFieldId::ExtendedTimestamp.as_u16(),
182    ExtraFieldId::XceedUnicode.as_u16(),
183    ExtraFieldId::InfoZipUnixOriginal.as_u16(),
184    ExtraFieldId::UnicodeComment.as_u16(),
185    ExtraFieldId::BeOsBeBox.as_u16(),
186    ExtraFieldId::Theos.as_u16(),
187    ExtraFieldId::UnicodePath.as_u16(),
188    ExtraFieldId::AtheosSyllable.as_u16(),
189    ExtraFieldId::AsiUnix.as_u16(),
190    ExtraFieldId::InfoZipUnixNew.as_u16(),
191    ExtraFieldId::InfoZipUnixNewerUidGid.as_u16(),
192    ExtraFieldId::AeXEncryption.as_u16(),
193    ExtraFieldId::Unknown9902.as_u16(),
194    ExtraFieldId::DataStreamAlignment.as_u16(),
195    ExtraFieldId::MicrosoftOpenPackagingGrowthHint.as_u16(),
196    ExtraFieldId::JavaJar.as_u16(),
197    ExtraFieldId::AndroidZipAlignment.as_u16(),
198    ExtraFieldId::KoreanZipCodePageInfo.as_u16(),
199    ExtraFieldId::SmsQdos.as_u16(),
200];