using System; using System.IO; namespace ICSharpCode.SharpZipLib.Zip { // Token: 0x02000056 RID: 86 public class ZipEntry : ICloneable { // Token: 0x0600032E RID: 814 RVA: 0x000115C0 File Offset: 0x000105C0 public ZipEntry(string name) : this(name, 0, 51, CompressionMethod.Deflated) { } // Token: 0x0600032F RID: 815 RVA: 0x000115CD File Offset: 0x000105CD internal ZipEntry(string name, int versionRequiredToExtract) : this(name, versionRequiredToExtract, 51, CompressionMethod.Deflated) { } // Token: 0x06000330 RID: 816 RVA: 0x000115DC File Offset: 0x000105DC internal ZipEntry(string name, int versionRequiredToExtract, int madeByInfo, CompressionMethod method) { this.externalFileAttributes = -1; this.method = CompressionMethod.Deflated; this.zipFileIndex = -1L; base..ctor(); if (name == null) { throw new ArgumentNullException("name"); } if (name.Length > 65535) { throw new ArgumentException("Name is too long", "name"); } if (versionRequiredToExtract != 0 && versionRequiredToExtract < 10) { throw new ArgumentOutOfRangeException("versionRequiredToExtract"); } this.DateTime = DateTime.Now; this.name = name; this.versionMadeBy = (ushort)madeByInfo; this.versionToExtract = (ushort)versionRequiredToExtract; this.method = method; } // Token: 0x06000331 RID: 817 RVA: 0x00011670 File Offset: 0x00010670 [Obsolete("Use Clone instead")] public ZipEntry(ZipEntry entry) { this.externalFileAttributes = -1; this.method = CompressionMethod.Deflated; this.zipFileIndex = -1L; base..ctor(); if (entry == null) { throw new ArgumentNullException("entry"); } this.known = entry.known; this.name = entry.name; this.size = entry.size; this.compressedSize = entry.compressedSize; this.crc = entry.crc; this.dosTime = entry.dosTime; this.method = entry.method; this.comment = entry.comment; this.versionToExtract = entry.versionToExtract; this.versionMadeBy = entry.versionMadeBy; this.externalFileAttributes = entry.externalFileAttributes; this.flags = entry.flags; this.zipFileIndex = entry.zipFileIndex; this.offset = entry.offset; this.forceZip64_ = entry.forceZip64_; if (entry.extra != null) { this.extra = new byte[entry.extra.Length]; Array.Copy(entry.extra, 0, this.extra, 0, entry.extra.Length); } } // Token: 0x170000AA RID: 170 // (get) Token: 0x06000332 RID: 818 RVA: 0x00011791 File Offset: 0x00010791 public bool HasCrc { get { return (byte)(this.known & ZipEntry.Known.Crc) != 0; } } // Token: 0x170000AB RID: 171 // (get) Token: 0x06000333 RID: 819 RVA: 0x000117A2 File Offset: 0x000107A2 // (set) Token: 0x06000334 RID: 820 RVA: 0x000117B2 File Offset: 0x000107B2 public bool IsCrypted { get { return (this.flags & 1) != 0; } set { if (value) { this.flags |= 1; return; } this.flags &= -2; } } // Token: 0x170000AC RID: 172 // (get) Token: 0x06000335 RID: 821 RVA: 0x000117D5 File Offset: 0x000107D5 // (set) Token: 0x06000336 RID: 822 RVA: 0x000117E9 File Offset: 0x000107E9 public bool IsUnicodeText { get { return (this.flags & 2048) != 0; } set { if (value) { this.flags |= 2048; return; } this.flags &= -2049; } } // Token: 0x170000AD RID: 173 // (get) Token: 0x06000337 RID: 823 RVA: 0x00011813 File Offset: 0x00010813 // (set) Token: 0x06000338 RID: 824 RVA: 0x0001181B File Offset: 0x0001081B internal byte CryptoCheckValue { get { return this.cryptoCheckValue_; } set { this.cryptoCheckValue_ = value; } } // Token: 0x170000AE RID: 174 // (get) Token: 0x06000339 RID: 825 RVA: 0x00011824 File Offset: 0x00010824 // (set) Token: 0x0600033A RID: 826 RVA: 0x0001182C File Offset: 0x0001082C public int Flags { get { return this.flags; } set { this.flags = value; } } // Token: 0x170000AF RID: 175 // (get) Token: 0x0600033B RID: 827 RVA: 0x00011835 File Offset: 0x00010835 // (set) Token: 0x0600033C RID: 828 RVA: 0x0001183D File Offset: 0x0001083D public long ZipFileIndex { get { return this.zipFileIndex; } set { this.zipFileIndex = value; } } // Token: 0x170000B0 RID: 176 // (get) Token: 0x0600033D RID: 829 RVA: 0x00011846 File Offset: 0x00010846 // (set) Token: 0x0600033E RID: 830 RVA: 0x0001184E File Offset: 0x0001084E public long Offset { get { return this.offset; } set { this.offset = value; } } // Token: 0x170000B1 RID: 177 // (get) Token: 0x0600033F RID: 831 RVA: 0x00011857 File Offset: 0x00010857 // (set) Token: 0x06000340 RID: 832 RVA: 0x0001186D File Offset: 0x0001086D public int ExternalFileAttributes { get { if ((byte)(this.known & ZipEntry.Known.ExternalAttributes) == 0) { return -1; } return this.externalFileAttributes; } set { this.externalFileAttributes = value; this.known |= ZipEntry.Known.ExternalAttributes; } } // Token: 0x170000B2 RID: 178 // (get) Token: 0x06000341 RID: 833 RVA: 0x00011886 File Offset: 0x00010886 public int VersionMadeBy { get { return (int)(this.versionMadeBy & 255); } } // Token: 0x170000B3 RID: 179 // (get) Token: 0x06000342 RID: 834 RVA: 0x00011894 File Offset: 0x00010894 public bool IsDOSEntry { get { return this.HostSystem == 0 || this.HostSystem == 10; } } // Token: 0x06000343 RID: 835 RVA: 0x000118AC File Offset: 0x000108AC private bool HasDosAttributes(int attributes) { bool flag = false; if ((byte)(this.known & ZipEntry.Known.ExternalAttributes) != 0 && (this.HostSystem == 0 || this.HostSystem == 10) && (this.ExternalFileAttributes & attributes) == attributes) { flag = true; } return flag; } // Token: 0x170000B4 RID: 180 // (get) Token: 0x06000344 RID: 836 RVA: 0x000118E7 File Offset: 0x000108E7 // (set) Token: 0x06000345 RID: 837 RVA: 0x000118F7 File Offset: 0x000108F7 public int HostSystem { get { return (this.versionMadeBy >> 8) & 255; } set { this.versionMadeBy &= 255; this.versionMadeBy |= (ushort)((value & 255) << 8); } } // Token: 0x170000B5 RID: 181 // (get) Token: 0x06000346 RID: 838 RVA: 0x00011924 File Offset: 0x00010924 public int Version { get { if (this.versionToExtract != 0) { return (int)this.versionToExtract; } int num = 10; if (this.AESKeySize > 0) { num = 51; } else if (this.CentralHeaderRequiresZip64) { num = 45; } else if (CompressionMethod.Deflated == this.method) { num = 20; } else if (this.IsDirectory) { num = 20; } else if (this.IsCrypted) { num = 20; } else if (this.HasDosAttributes(8)) { num = 11; } return num; } } // Token: 0x170000B6 RID: 182 // (get) Token: 0x06000347 RID: 839 RVA: 0x00011994 File Offset: 0x00010994 public bool CanDecompress { get { return this.Version <= 51 && (this.Version == 10 || this.Version == 11 || this.Version == 20 || this.Version == 45 || this.Version == 51) && this.IsCompressionMethodSupported(); } } // Token: 0x06000348 RID: 840 RVA: 0x000119E5 File Offset: 0x000109E5 public void ForceZip64() { this.forceZip64_ = true; } // Token: 0x06000349 RID: 841 RVA: 0x000119EE File Offset: 0x000109EE public bool IsZip64Forced() { return this.forceZip64_; } // Token: 0x170000B7 RID: 183 // (get) Token: 0x0600034A RID: 842 RVA: 0x000119F8 File Offset: 0x000109F8 public bool LocalHeaderRequiresZip64 { get { bool flag = this.forceZip64_; if (!flag) { ulong num = this.compressedSize; if (this.versionToExtract == 0 && this.IsCrypted) { num += 12UL; } flag = (this.size >= (ulong)(-1) || num >= (ulong)(-1)) && (this.versionToExtract == 0 || this.versionToExtract >= 45); } return flag; } } // Token: 0x170000B8 RID: 184 // (get) Token: 0x0600034B RID: 843 RVA: 0x00011A58 File Offset: 0x00010A58 public bool CentralHeaderRequiresZip64 { get { return this.LocalHeaderRequiresZip64 || this.offset >= (long)((ulong)(-1)); } } // Token: 0x170000B9 RID: 185 // (get) Token: 0x0600034C RID: 844 RVA: 0x00011A71 File Offset: 0x00010A71 // (set) Token: 0x0600034D RID: 845 RVA: 0x00011A88 File Offset: 0x00010A88 public long DosTime { get { if ((byte)(this.known & ZipEntry.Known.Time) == 0) { return 0L; } return (long)((ulong)this.dosTime); } set { this.dosTime = (uint)value; this.known |= ZipEntry.Known.Time; } } // Token: 0x170000BA RID: 186 // (get) Token: 0x0600034E RID: 846 RVA: 0x00011AA4 File Offset: 0x00010AA4 // (set) Token: 0x0600034F RID: 847 RVA: 0x00011B48 File Offset: 0x00010B48 public DateTime DateTime { get { uint num = Math.Min(59U, 2U * (this.dosTime & 31U)); uint num2 = Math.Min(59U, (this.dosTime >> 5) & 63U); uint num3 = Math.Min(23U, (this.dosTime >> 11) & 31U); uint num4 = Math.Max(1U, Math.Min(12U, (this.dosTime >> 21) & 15U)); uint num5 = ((this.dosTime >> 25) & 127U) + 1980U; int num6 = Math.Max(1, Math.Min(DateTime.DaysInMonth((int)num5, (int)num4), (int)((this.dosTime >> 16) & 31U))); return new DateTime((int)num5, (int)num4, num6, (int)num3, (int)num2, (int)num); } set { uint num = (uint)value.Year; uint num2 = (uint)value.Month; uint num3 = (uint)value.Day; uint num4 = (uint)value.Hour; uint num5 = (uint)value.Minute; uint num6 = (uint)value.Second; if (num < 1980U) { num = 1980U; num2 = 1U; num3 = 1U; num4 = 0U; num5 = 0U; num6 = 0U; } else if (num > 2107U) { num = 2107U; num2 = 12U; num3 = 31U; num4 = 23U; num5 = 59U; num6 = 59U; } this.DosTime = (long)((ulong)((((num - 1980U) & 127U) << 25) | (num2 << 21) | (num3 << 16) | (num4 << 11) | (num5 << 5) | (num6 >> 1))); } } // Token: 0x170000BB RID: 187 // (get) Token: 0x06000350 RID: 848 RVA: 0x00011BEF File Offset: 0x00010BEF public string Name { get { return this.name; } } // Token: 0x170000BC RID: 188 // (get) Token: 0x06000351 RID: 849 RVA: 0x00011BF7 File Offset: 0x00010BF7 // (set) Token: 0x06000352 RID: 850 RVA: 0x00011C0D File Offset: 0x00010C0D public long Size { get { if ((byte)(this.known & ZipEntry.Known.Size) == 0) { return -1L; } return (long)this.size; } set { this.size = (ulong)value; this.known |= ZipEntry.Known.Size; } } // Token: 0x170000BD RID: 189 // (get) Token: 0x06000353 RID: 851 RVA: 0x00011C25 File Offset: 0x00010C25 // (set) Token: 0x06000354 RID: 852 RVA: 0x00011C3B File Offset: 0x00010C3B public long CompressedSize { get { if ((byte)(this.known & ZipEntry.Known.CompressedSize) == 0) { return -1L; } return (long)this.compressedSize; } set { this.compressedSize = (ulong)value; this.known |= ZipEntry.Known.CompressedSize; } } // Token: 0x170000BE RID: 190 // (get) Token: 0x06000355 RID: 853 RVA: 0x00011C53 File Offset: 0x00010C53 // (set) Token: 0x06000356 RID: 854 RVA: 0x00011C6D File Offset: 0x00010C6D public long Crc { get { if ((byte)(this.known & ZipEntry.Known.Crc) == 0) { return -1L; } return (long)((ulong)this.crc & (ulong)(-1)); } set { if (((ulong)this.crc & 18446744069414584320UL) != 0UL) { throw new ArgumentOutOfRangeException("value"); } this.crc = (uint)value; this.known |= ZipEntry.Known.Crc; } } // Token: 0x170000BF RID: 191 // (get) Token: 0x06000357 RID: 855 RVA: 0x00011CA6 File Offset: 0x00010CA6 // (set) Token: 0x06000358 RID: 856 RVA: 0x00011CAE File Offset: 0x00010CAE public CompressionMethod CompressionMethod { get { return this.method; } set { if (!ZipEntry.IsCompressionMethodSupported(value)) { throw new NotSupportedException("Compression method not supported"); } this.method = value; } } // Token: 0x170000C0 RID: 192 // (get) Token: 0x06000359 RID: 857 RVA: 0x00011CCA File Offset: 0x00010CCA internal CompressionMethod CompressionMethodForHeader { get { if (this.AESKeySize <= 0) { return this.method; } return CompressionMethod.WinZipAES; } } // Token: 0x170000C1 RID: 193 // (get) Token: 0x0600035A RID: 858 RVA: 0x00011CDE File Offset: 0x00010CDE // (set) Token: 0x0600035B RID: 859 RVA: 0x00011CE8 File Offset: 0x00010CE8 public byte[] ExtraData { get { return this.extra; } set { if (value == null) { this.extra = null; return; } if (value.Length > 65535) { throw new ArgumentOutOfRangeException("value"); } this.extra = new byte[value.Length]; Array.Copy(value, 0, this.extra, 0, value.Length); } } // Token: 0x170000C2 RID: 194 // (get) Token: 0x0600035C RID: 860 RVA: 0x00011D34 File Offset: 0x00010D34 // (set) Token: 0x0600035D RID: 861 RVA: 0x00011D90 File Offset: 0x00010D90 public int AESKeySize { get { switch (this._aesEncryptionStrength) { case 0: return 0; case 1: return 128; case 2: return 192; case 3: return 256; default: throw new ZipException("Invalid AESEncryptionStrength " + this._aesEncryptionStrength); } } set { if (value == 0) { this._aesEncryptionStrength = 0; return; } if (value == 128) { this._aesEncryptionStrength = 1; return; } if (value != 256) { throw new ZipException("AESKeySize must be 0, 128 or 256: " + value); } this._aesEncryptionStrength = 3; } } // Token: 0x170000C3 RID: 195 // (get) Token: 0x0600035E RID: 862 RVA: 0x00011DE2 File Offset: 0x00010DE2 internal byte AESEncryptionStrength { get { return (byte)this._aesEncryptionStrength; } } // Token: 0x170000C4 RID: 196 // (get) Token: 0x0600035F RID: 863 RVA: 0x00011DEB File Offset: 0x00010DEB internal int AESSaltLen { get { return this.AESKeySize / 16; } } // Token: 0x170000C5 RID: 197 // (get) Token: 0x06000360 RID: 864 RVA: 0x00011DF6 File Offset: 0x00010DF6 internal int AESOverheadSize { get { return 12 + this.AESSaltLen; } } // Token: 0x06000361 RID: 865 RVA: 0x00011E04 File Offset: 0x00010E04 internal void ProcessExtraData(bool localHeader) { ZipExtraData zipExtraData = new ZipExtraData(this.extra); if (zipExtraData.Find(1)) { this.forceZip64_ = true; if (zipExtraData.ValueLength < 4) { throw new ZipException("Extra data extended Zip64 information length is invalid"); } if (localHeader || this.size == (ulong)(-1)) { this.size = (ulong)zipExtraData.ReadLong(); } if (localHeader || this.compressedSize == (ulong)(-1)) { this.compressedSize = (ulong)zipExtraData.ReadLong(); } if (!localHeader && this.offset == (long)((ulong)(-1))) { this.offset = zipExtraData.ReadLong(); } } else if ((this.versionToExtract & 255) >= 45 && (this.size == (ulong)(-1) || this.compressedSize == (ulong)(-1))) { throw new ZipException("Zip64 Extended information required but is missing."); } if (zipExtraData.Find(10)) { if (zipExtraData.ValueLength < 4) { throw new ZipException("NTFS Extra data invalid"); } zipExtraData.ReadInt(); while (zipExtraData.UnreadCount >= 4) { int num = zipExtraData.ReadShort(); int num2 = zipExtraData.ReadShort(); if (num == 1) { if (num2 >= 24) { long num3 = zipExtraData.ReadLong(); zipExtraData.ReadLong(); zipExtraData.ReadLong(); this.DateTime = DateTime.FromFileTime(num3); break; } break; } else { zipExtraData.Skip(num2); } } } else if (zipExtraData.Find(21589)) { int valueLength = zipExtraData.ValueLength; int num4 = zipExtraData.ReadByte(); if ((num4 & 1) != 0 && valueLength >= 5) { int num5 = zipExtraData.ReadInt(); this.DateTime = (new DateTime(1970, 1, 1, 0, 0, 0).ToUniversalTime() + new TimeSpan(0, 0, 0, num5, 0)).ToLocalTime(); } } if (this.method == CompressionMethod.WinZipAES) { this.ProcessAESExtraData(zipExtraData); } } // Token: 0x06000362 RID: 866 RVA: 0x00011FAC File Offset: 0x00010FAC private void ProcessAESExtraData(ZipExtraData extraData) { if (!extraData.Find(39169)) { throw new ZipException("AES Extra Data missing"); } this.versionToExtract = 51; this.Flags |= 64; int valueLength = extraData.ValueLength; if (valueLength < 7) { throw new ZipException("AES Extra Data Length " + valueLength + " invalid."); } int num = extraData.ReadShort(); extraData.ReadShort(); int num2 = extraData.ReadByte(); int num3 = extraData.ReadShort(); this._aesVer = num; this._aesEncryptionStrength = num2; this.method = (CompressionMethod)num3; } // Token: 0x170000C6 RID: 198 // (get) Token: 0x06000363 RID: 867 RVA: 0x0001203F File Offset: 0x0001103F // (set) Token: 0x06000364 RID: 868 RVA: 0x00012047 File Offset: 0x00011047 public string Comment { get { return this.comment; } set { if (value != null && value.Length > 65535) { throw new ArgumentOutOfRangeException("value", "cannot exceed 65535"); } this.comment = value; } } // Token: 0x170000C7 RID: 199 // (get) Token: 0x06000365 RID: 869 RVA: 0x00012070 File Offset: 0x00011070 public bool IsDirectory { get { int length = this.name.Length; return (length > 0 && (this.name[length - 1] == '/' || this.name[length - 1] == '\\')) || this.HasDosAttributes(16); } } // Token: 0x170000C8 RID: 200 // (get) Token: 0x06000366 RID: 870 RVA: 0x000120BE File Offset: 0x000110BE public bool IsFile { get { return !this.IsDirectory && !this.HasDosAttributes(8); } } // Token: 0x06000367 RID: 871 RVA: 0x000120D4 File Offset: 0x000110D4 public bool IsCompressionMethodSupported() { return ZipEntry.IsCompressionMethodSupported(this.CompressionMethod); } // Token: 0x06000368 RID: 872 RVA: 0x000120E4 File Offset: 0x000110E4 public object Clone() { ZipEntry zipEntry = (ZipEntry)base.MemberwiseClone(); if (this.extra != null) { zipEntry.extra = new byte[this.extra.Length]; Array.Copy(this.extra, 0, zipEntry.extra, 0, this.extra.Length); } return zipEntry; } // Token: 0x06000369 RID: 873 RVA: 0x00012134 File Offset: 0x00011134 public override string ToString() { return this.name; } // Token: 0x0600036A RID: 874 RVA: 0x0001213C File Offset: 0x0001113C public static bool IsCompressionMethodSupported(CompressionMethod method) { return method == CompressionMethod.Deflated || method == CompressionMethod.Stored; } // Token: 0x0600036B RID: 875 RVA: 0x00012148 File Offset: 0x00011148 public static string CleanName(string name) { if (name == null) { return string.Empty; } if (Path.IsPathRooted(name)) { name = name.Substring(Path.GetPathRoot(name).Length); } name = name.Replace("\\", "/"); while (name.Length > 0 && name[0] == '/') { name = name.Remove(0, 1); } return name; } // Token: 0x04000286 RID: 646 private ZipEntry.Known known; // Token: 0x04000287 RID: 647 private int externalFileAttributes; // Token: 0x04000288 RID: 648 private ushort versionMadeBy; // Token: 0x04000289 RID: 649 private string name; // Token: 0x0400028A RID: 650 private ulong size; // Token: 0x0400028B RID: 651 private ulong compressedSize; // Token: 0x0400028C RID: 652 private ushort versionToExtract; // Token: 0x0400028D RID: 653 private uint crc; // Token: 0x0400028E RID: 654 private uint dosTime; // Token: 0x0400028F RID: 655 private CompressionMethod method; // Token: 0x04000290 RID: 656 private byte[] extra; // Token: 0x04000291 RID: 657 private string comment; // Token: 0x04000292 RID: 658 private int flags; // Token: 0x04000293 RID: 659 private long zipFileIndex; // Token: 0x04000294 RID: 660 private long offset; // Token: 0x04000295 RID: 661 private bool forceZip64_; // Token: 0x04000296 RID: 662 private byte cryptoCheckValue_; // Token: 0x04000297 RID: 663 private int _aesVer; // Token: 0x04000298 RID: 664 private int _aesEncryptionStrength; // Token: 0x02000057 RID: 87 [Flags] private enum Known : byte { // Token: 0x0400029A RID: 666 None = 0, // Token: 0x0400029B RID: 667 Size = 1, // Token: 0x0400029C RID: 668 CompressedSize = 2, // Token: 0x0400029D RID: 669 Crc = 4, // Token: 0x0400029E RID: 670 Time = 8, // Token: 0x0400029F RID: 671 ExternalAttributes = 16 } } }