using System; using System.IO; using System.Security.Cryptography; using ICSharpCode.SharpZipLib.Encryption; namespace ICSharpCode.SharpZipLib.Zip.Compression.Streams { // Token: 0x0200002B RID: 43 public class DeflaterOutputStream : Stream { // Token: 0x06000130 RID: 304 RVA: 0x00008B1C File Offset: 0x00007B1C public DeflaterOutputStream(Stream baseOutputStream) : this(baseOutputStream, new Deflater(), 512) { } // Token: 0x06000131 RID: 305 RVA: 0x00008B2F File Offset: 0x00007B2F public DeflaterOutputStream(Stream baseOutputStream, Deflater deflater) : this(baseOutputStream, deflater, 512) { } // Token: 0x06000132 RID: 306 RVA: 0x00008B40 File Offset: 0x00007B40 public DeflaterOutputStream(Stream baseOutputStream, Deflater deflater, int bufferSize) { if (baseOutputStream == null) { throw new ArgumentNullException("baseOutputStream"); } if (!baseOutputStream.CanWrite) { throw new ArgumentException("Must support writing", "baseOutputStream"); } if (deflater == null) { throw new ArgumentNullException("deflater"); } if (bufferSize < 512) { throw new ArgumentOutOfRangeException("bufferSize"); } this.baseOutputStream_ = baseOutputStream; this.buffer_ = new byte[bufferSize]; this.deflater_ = deflater; } // Token: 0x06000133 RID: 307 RVA: 0x00008BBC File Offset: 0x00007BBC public virtual void Finish() { this.deflater_.Finish(); while (!this.deflater_.IsFinished) { int num = this.deflater_.Deflate(this.buffer_, 0, this.buffer_.Length); if (num <= 0) { break; } if (this.cryptoTransform_ != null) { this.EncryptBlock(this.buffer_, 0, num); } this.baseOutputStream_.Write(this.buffer_, 0, num); } if (!this.deflater_.IsFinished) { throw new SharpZipBaseException("Can't deflate all input?"); } this.baseOutputStream_.Flush(); if (this.cryptoTransform_ != null) { if (this.cryptoTransform_ is ZipAESTransform) { this.AESAuthCode = ((ZipAESTransform)this.cryptoTransform_).GetAuthCode(); } this.cryptoTransform_.Dispose(); this.cryptoTransform_ = null; } } // Token: 0x1700003B RID: 59 // (get) Token: 0x06000134 RID: 308 RVA: 0x00008C8B File Offset: 0x00007C8B // (set) Token: 0x06000135 RID: 309 RVA: 0x00008C93 File Offset: 0x00007C93 public bool IsStreamOwner { get { return this.isStreamOwner_; } set { this.isStreamOwner_ = value; } } // Token: 0x1700003C RID: 60 // (get) Token: 0x06000136 RID: 310 RVA: 0x00008C9C File Offset: 0x00007C9C public bool CanPatchEntries { get { return this.baseOutputStream_.CanSeek; } } // Token: 0x1700003D RID: 61 // (get) Token: 0x06000137 RID: 311 RVA: 0x00008CA9 File Offset: 0x00007CA9 // (set) Token: 0x06000138 RID: 312 RVA: 0x00008CB1 File Offset: 0x00007CB1 public string Password { get { return this.password; } set { if (value != null && value.Length == 0) { this.password = null; return; } this.password = value; } } // Token: 0x06000139 RID: 313 RVA: 0x00008CCD File Offset: 0x00007CCD protected void EncryptBlock(byte[] buffer, int offset, int length) { this.cryptoTransform_.TransformBlock(buffer, 0, length, buffer, 0); } // Token: 0x0600013A RID: 314 RVA: 0x00008CE0 File Offset: 0x00007CE0 protected void InitializePassword(string password) { PkzipClassicManaged pkzipClassicManaged = new PkzipClassicManaged(); byte[] array = PkzipClassic.GenerateKeys(ZipConstants.ConvertToArray(password)); this.cryptoTransform_ = pkzipClassicManaged.CreateEncryptor(array, null); } // Token: 0x0600013B RID: 315 RVA: 0x00008D10 File Offset: 0x00007D10 protected void InitializeAESPassword(ZipEntry entry, string rawPassword, out byte[] salt, out byte[] pwdVerifier) { salt = new byte[entry.AESSaltLen]; if (DeflaterOutputStream._aesRnd == null) { DeflaterOutputStream._aesRnd = new RNGCryptoServiceProvider(); } DeflaterOutputStream._aesRnd.GetBytes(salt); int num = entry.AESKeySize / 8; this.cryptoTransform_ = new ZipAESTransform(rawPassword, salt, num, true); pwdVerifier = ((ZipAESTransform)this.cryptoTransform_).PwdVerifier; } // Token: 0x0600013C RID: 316 RVA: 0x00008D74 File Offset: 0x00007D74 protected void Deflate() { while (!this.deflater_.IsNeedingInput) { int num = this.deflater_.Deflate(this.buffer_, 0, this.buffer_.Length); if (num <= 0) { break; } if (this.cryptoTransform_ != null) { this.EncryptBlock(this.buffer_, 0, num); } this.baseOutputStream_.Write(this.buffer_, 0, num); } if (!this.deflater_.IsNeedingInput) { throw new SharpZipBaseException("DeflaterOutputStream can't deflate all input?"); } } // Token: 0x1700003E RID: 62 // (get) Token: 0x0600013D RID: 317 RVA: 0x00008DF0 File Offset: 0x00007DF0 public override bool CanRead { get { return false; } } // Token: 0x1700003F RID: 63 // (get) Token: 0x0600013E RID: 318 RVA: 0x00008DF3 File Offset: 0x00007DF3 public override bool CanSeek { get { return false; } } // Token: 0x17000040 RID: 64 // (get) Token: 0x0600013F RID: 319 RVA: 0x00008DF6 File Offset: 0x00007DF6 public override bool CanWrite { get { return this.baseOutputStream_.CanWrite; } } // Token: 0x17000041 RID: 65 // (get) Token: 0x06000140 RID: 320 RVA: 0x00008E03 File Offset: 0x00007E03 public override long Length { get { return this.baseOutputStream_.Length; } } // Token: 0x17000042 RID: 66 // (get) Token: 0x06000141 RID: 321 RVA: 0x00008E10 File Offset: 0x00007E10 // (set) Token: 0x06000142 RID: 322 RVA: 0x00008E1D File Offset: 0x00007E1D public override long Position { get { return this.baseOutputStream_.Position; } set { throw new NotSupportedException("Position property not supported"); } } // Token: 0x06000143 RID: 323 RVA: 0x00008E29 File Offset: 0x00007E29 public override long Seek(long offset, SeekOrigin origin) { throw new NotSupportedException("DeflaterOutputStream Seek not supported"); } // Token: 0x06000144 RID: 324 RVA: 0x00008E35 File Offset: 0x00007E35 public override void SetLength(long value) { throw new NotSupportedException("DeflaterOutputStream SetLength not supported"); } // Token: 0x06000145 RID: 325 RVA: 0x00008E41 File Offset: 0x00007E41 public override int ReadByte() { throw new NotSupportedException("DeflaterOutputStream ReadByte not supported"); } // Token: 0x06000146 RID: 326 RVA: 0x00008E4D File Offset: 0x00007E4D public override int Read(byte[] buffer, int offset, int count) { throw new NotSupportedException("DeflaterOutputStream Read not supported"); } // Token: 0x06000147 RID: 327 RVA: 0x00008E59 File Offset: 0x00007E59 public override IAsyncResult BeginRead(byte[] buffer, int offset, int count, AsyncCallback callback, object state) { throw new NotSupportedException("DeflaterOutputStream BeginRead not currently supported"); } // Token: 0x06000148 RID: 328 RVA: 0x00008E65 File Offset: 0x00007E65 public override IAsyncResult BeginWrite(byte[] buffer, int offset, int count, AsyncCallback callback, object state) { throw new NotSupportedException("BeginWrite is not supported"); } // Token: 0x06000149 RID: 329 RVA: 0x00008E71 File Offset: 0x00007E71 public override void Flush() { this.deflater_.Flush(); this.Deflate(); this.baseOutputStream_.Flush(); } // Token: 0x0600014A RID: 330 RVA: 0x00008E90 File Offset: 0x00007E90 public override void Close() { if (!this.isClosed_) { this.isClosed_ = true; try { this.Finish(); if (this.cryptoTransform_ != null) { this.GetAuthCodeIfAES(); this.cryptoTransform_.Dispose(); this.cryptoTransform_ = null; } } finally { if (this.isStreamOwner_) { this.baseOutputStream_.Close(); } } } } // Token: 0x0600014B RID: 331 RVA: 0x00008EF8 File Offset: 0x00007EF8 private void GetAuthCodeIfAES() { if (this.cryptoTransform_ is ZipAESTransform) { this.AESAuthCode = ((ZipAESTransform)this.cryptoTransform_).GetAuthCode(); } } // Token: 0x0600014C RID: 332 RVA: 0x00008F20 File Offset: 0x00007F20 public override void WriteByte(byte value) { this.Write(new byte[] { value }, 0, 1); } // Token: 0x0600014D RID: 333 RVA: 0x00008F41 File Offset: 0x00007F41 public override void Write(byte[] buffer, int offset, int count) { this.deflater_.SetInput(buffer, offset, count); this.Deflate(); } // Token: 0x040000AD RID: 173 private string password; // Token: 0x040000AE RID: 174 private ICryptoTransform cryptoTransform_; // Token: 0x040000AF RID: 175 protected byte[] AESAuthCode; // Token: 0x040000B0 RID: 176 private byte[] buffer_; // Token: 0x040000B1 RID: 177 protected Deflater deflater_; // Token: 0x040000B2 RID: 178 protected Stream baseOutputStream_; // Token: 0x040000B3 RID: 179 private bool isClosed_; // Token: 0x040000B4 RID: 180 private bool isStreamOwner_ = true; // Token: 0x040000B5 RID: 181 private static RNGCryptoServiceProvider _aesRnd; } }