public ZipAESStream(Stream stream, ZipAESTransform transform, CryptoStreamMode mode) : base(stream, transform, mode) { this._stream = stream; this._transform = transform; this._slideBuffer = new byte[0x400]; this._blockAndAuth = 0x1a; if (mode != CryptoStreamMode.Read) { throw new Exception("ZipAESStream only for read"); } }
/// <summary> /// Constructor /// </summary> /// <param name="stream">The stream on which to perform the cryptographic transformation.</param> /// <param name="transform">Instance of ZipAESTransform</param> /// <param name="mode">Read or Write</param> public ZipAESStream(Stream stream, ZipAESTransform transform, CryptoStreamMode mode) : base(stream, transform, mode) { _stream = stream; _transform = transform; _slideBuffer = new byte[1024]; _blockAndAuth = CRYPTO_BLOCK_SIZE + AUTH_CODE_LENGTH; // mode: // CryptoStreamMode.Read means we read from "stream" and pass decrypted to our Read() method. // Write bypasses this stream and uses the Transform directly. if (mode != CryptoStreamMode.Read) throw new Exception("ZipAESStream only for read"); }
/// <summary> /// Constructor /// </summary> /// <param name="stream">The stream on which to perform the cryptographic transformation.</param> /// <param name="transform">Instance of ZipAESTransform</param> /// <param name="mode">Read or Write</param> public ZipAESStream(Stream stream, ZipAESTransform transform, CryptoStreamMode mode) : base(stream, transform, mode) { _stream = stream; _transform = transform; _slideBuffer = new byte[1024]; _blockAndAuth = CRYPTO_BLOCK_SIZE + AUTH_CODE_LENGTH; // mode: // CryptoStreamMode.Read means we read from "stream" and pass decrypted to our Read() method. // Write bypasses this stream and uses the Transform directly. if (mode != CryptoStreamMode.Read) { throw new Exception("ZipAESStream only for read"); } }
Stream CreateAndInitDecryptionStream(Stream baseStream, ZipEntry entry) { CryptoStream result = null; if ( (entry.Version < ZipConstants.VersionStrongEncryption) || (entry.Flags & (int)GeneralBitFlags.StrongEncryption) == 0) { PkzipClassicManaged classicManaged = new PkzipClassicManaged(); OnKeysRequired(entry.Name); if (HaveKeys == false) { throw new ZipException("No password available for encrypted stream"); } result = new CryptoStream(baseStream, classicManaged.CreateDecryptor(key, null), CryptoStreamMode.Read); CheckClassicPassword(result, entry); } else { #if !NET_1_1 && !NETCF_2_0 if (entry.Version == ZipConstants.VERSION_AES) { // OnKeysRequired(entry.Name); if (HaveKeys == false) { throw new ZipException("No password available for AES encrypted stream"); } int saltLen = entry.AESSaltLen; byte[] saltBytes = new byte[saltLen]; int saltIn = baseStream.Read(saltBytes, 0, saltLen); if (saltIn != saltLen) throw new ZipException("AES Salt expected " + saltLen + " got " + saltIn); // byte[] pwdVerifyRead = new byte[2]; baseStream.Read(pwdVerifyRead, 0, 2); int blockSize = entry.AESKeySize / 8; // bits to bytes ZipAESTransform decryptor = new ZipAESTransform(rawPassword_, saltBytes, blockSize, false); byte[] pwdVerifyCalc = decryptor.PwdVerifier; if (pwdVerifyCalc[0] != pwdVerifyRead[0] || pwdVerifyCalc[1] != pwdVerifyRead[1]) throw new ZipException("Invalid password for AES"); result = new ZipAESStream(baseStream, decryptor, CryptoStreamMode.Read); } else #endif { throw new ZipException("Decryption method not supported"); } } return result; }
private Stream CreateAndInitDecryptionStream(Stream baseStream, ZipEntry entry) { CryptoStream classicCryptoStream = null; if ((entry.Version < 50) || ((entry.Flags & 0x40) == 0)) { PkzipClassicManaged managed = new PkzipClassicManaged(); this.OnKeysRequired(entry.Name); if (!this.HaveKeys) { throw new ZipException("No password available for encrypted stream"); } classicCryptoStream = new CryptoStream(baseStream, managed.CreateDecryptor(this.key, null), CryptoStreamMode.Read); CheckClassicPassword(classicCryptoStream, entry); return classicCryptoStream; } if (entry.Version != 0x33) { throw new ZipException("Decryption method not supported"); } this.OnKeysRequired(entry.Name); if (!this.HaveKeys) { throw new ZipException("No password available for AES encrypted stream"); } int aESSaltLen = entry.AESSaltLen; byte[] buffer = new byte[aESSaltLen]; int num2 = baseStream.Read(buffer, 0, aESSaltLen); if (num2 != aESSaltLen) { throw new ZipException(string.Concat(new object[] { "AES Salt expected ", aESSaltLen, " got ", num2 })); } byte[] buffer2 = new byte[2]; baseStream.Read(buffer2, 0, 2); int blockSize = entry.AESKeySize / 8; ZipAESTransform transform = new ZipAESTransform(this.rawPassword_, buffer, blockSize, false); byte[] pwdVerifier = transform.PwdVerifier; if ((pwdVerifier[0] != buffer2[0]) || (pwdVerifier[1] != buffer2[1])) { throw new Exception("Invalid password for AES"); } return new ZipAESStream(baseStream, transform, CryptoStreamMode.Read); }