Vendor/phpspreadsheet/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Reader/Xls.php
private function readFilepass()
    {
        $length = self::getUInt2d($this->data, $this->pos + 2);

        if ($length != 54) {
            throw new Exception('Unexpected file pass record length');
        }

        $recordData = $this->readRecordData($this->data, $this->pos + 4, $length);

        // move stream pointer to next record
        $this->pos += 4 + $length;

        if (!$this->verifyPassword('VelvetSweatshop', substr($recordData, 6, 16), substr($recordData, 22, 16), substr($recordData, 38, 16), $this->md5Ctxt)) {
            throw new Exception('Decryption password incorrect');
        }

        $this->encryption = self::MS_BIFF_CRYPTO_RC4;

        // Decryption required from the record after next onwards
        $this->encryptionStartPos = $this->pos + self::getUInt2d($this->data, $this->pos + 2);
    }
private function readFilepass()
    {
        $length = self::getUInt2d($this->data, $this->pos + 2);

        if ($length != 54) {
            throw new Exception('Unexpected file pass record length');
        }

        $recordData = $this->readRecordData($this->data, $this->pos + 4, $length);

        // move stream pointer to next record
        $this->pos += 4 + $length;

        if (!$this->verifyPassword('VelvetSweatshop', substr($recordData, 6, 16), substr($recordData, 22, 16), substr($recordData, 38, 16), $this->md5Ctxt)) {
            throw new Exception('Decryption password incorrect');
        }

        $this->encryption = self::MS_BIFF_CRYPTO_RC4;

        // Decryption required from the record after next onwards
        $this->encryptionStartPos = $this->pos + self::getUInt2d($this->data, $this->pos + 2);
    }
private function readFilepass ( ) { $ length = self :: getUInt2d ( $ this -> data , $ this -> pos + 2 ) ; if ( $ length != 54 ) { throw new Exception ( 'Unexpected file pass record length' ) ; } $ recordData = $ this -> readRecordData ( $ this -> data , $ this -> pos + 4 , $ length ) ; // move stream pointer to next record $ this -> pos += 4 + $ length ; if ( ! $ this -> verifyPassword ( 'VelvetSweatshop' , substr ( $ recordData , 6 , 16 ) , substr ( $ recordData , 22 , 16 ) , substr ( $ recordData , 38 , 16 ) , $ this -> md5Ctxt ) ) { throw new Exception ( 'Decryption password incorrect' ) ; } $ this -> encryption = self :: MS_BIFF_CRYPTO_RC4 ; // Decryption required from the record after next onwards $ this -> encryptionStartPos = $ this -> pos + self :: getUInt2d ( $ this -> data , $ this -> pos + 2 ) ; }
FILEPASS.

This record is part of the File Protection Block. It
contains information about the read/write password of the
file. All record contents following this record will be
encrypted.

--    "OpenOffice.org's Documentation of the Microsoft
Excel File Format"

The decryption functions and objects used from here on in
are based on the source of Spreadsheet-ParseExcel:
http://search.cpan.org/~jmcnamara/Spreadsheet-ParseExcel/
FILEPASS .