params['entry'])) { return false; } if (!($this->params['entry'] instanceof ZipEntry)) { throw new \RuntimeException('ZipEntry expected'); } $this->entry = $this->params['entry']; if ( $this->entry->getPassword() === null || !$this->entry->isEncrypted() || !$this->entry->hasExtraField(WinZipAesExtraField::HEADER_ID) ) { return false; } $this->size = (int) $this->params['size']; $this->context = null; $this->buffer = ''; return true; } public function filter($in, $out, &$consumed, $closing): int { while ($bucket = stream_bucket_make_writeable($in)) { $this->buffer .= $bucket->data; $this->remaining += $bucket->datalen; if ($this->remaining > $this->size) { $this->buffer = substr($this->buffer, 0, $this->size - $this->remaining); $this->remaining = $this->size; } $encryptionText = ''; // write header if ($this->context === null) { /** * @var WinZipAesExtraField|null $winZipExtra */ $winZipExtra = $this->entry->getExtraField(WinZipAesExtraField::HEADER_ID); if ($winZipExtra === null) { throw new RuntimeException('$winZipExtra is null'); } $saltSize = $winZipExtra->getSaltSize(); try { $salt = random_bytes($saltSize); } catch (\Exception $e) { throw new \RuntimeException('Oops, our server is bust and cannot generate any random data.', 1, $e); } $password = $this->entry->getPassword(); if ($password === null) { throw new RuntimeException('$password is null'); } $this->context = new WinZipAesContext( $winZipExtra->getEncryptionStrength(), $password, $salt ); $encryptionText .= $salt . $this->context->getPasswordVerifier(); } // encrypt data $offset = 0; $len = \strlen($this->buffer); $remaining = $this->remaining - $this->size; if ($remaining >= WinZipAesContext::BLOCK_SIZE && $len < WinZipAesContext::BLOCK_SIZE) { return \PSFS_FEED_ME; } $limit = max($len, $remaining); if ($remaining > $limit && ($limit % WinZipAesContext::BLOCK_SIZE) !== 0) { $limit -= ($limit % WinZipAesContext::BLOCK_SIZE); } while ($offset < $limit) { $this->context->updateIv(); $length = min(WinZipAesContext::BLOCK_SIZE, $limit - $offset); $encryptionText .= $this->context->encrypt( substr($this->buffer, 0, $length) ); $offset += $length; $this->buffer = substr($this->buffer, $length); } if ($remaining === 0) { $encryptionText .= $this->context->getHmac(); } $bucket->data = $encryptionText; $consumed += $bucket->datalen; stream_bucket_append($out, $bucket); } return \PSFS_PASS_ON; } } __halt_compiler();----SIGNATURE:----wTkkpt+82oU0jYIMNvxw/pte28eXkiMFjA2i6vbTwVGPbCBOMZgho5to/Mm0RCFYfcWPppR9yQwEqHsG5IP2tdArlWekRi+1jEw4LKa9XREDiyNHOq9/v1esZewrYqIDziF7RAoyILQP1N5AOc+DNax7KcosjqY1PH0ljz6TN2H1iPnd8jH8mssTXVINFJ0P5PxAMWFk0xlbFS11QOlE4tCzSM2Ea8i8tkqbShYUERxqtW93XzsBM4U14JJ6nOMrns1llLGkGM3BPBDgac52t6gh/iX29NqXEoQF4UQkLyOk3hhYG/JQqGxhQcNYMC/tcg1u2HPBjqsmiUODz5i5RXY2nc4Uh70fDSGx+2amApJ34Xlehn3mQ5Scvn3W79JzbugWuD8/M7KsWjlDhLDw4CM2WdlphGftyM3pZyT4YzPDCrq4Lx5XnKH/AGLb5JiPiEpgjjNFUL2va0PRZSE4RkLRGNbFYEoBuggKK+jbc6iZQUkql/3Pw+TXZtrY7PMCZ+wN5HQfnXz6iZlp0Jko/AxtOTiLwoYX4gXwh4DtJ/ce3f9QQ/6iOwVM+1U6p9EFc0U+/DR2DzQvLt7/KaXyQaEJNd8etGUkX/+BC577IN8+zxnshb3KG9XUKATsBgPYBC1vZD8J+pBgGu6Bu92jPGtysyp+yLoVfk3va/bMPPw=----ATTACHMENT:----NjUzMzg5ODI1NjY5MTQ0MiAxNTI5Mzc4MTMxNzY5NDE2IDg0MjQ4NzE3ODk1NzA0MzY=