protected static function decryptData(
        ReadOnlyFile $input,
        MutableFile $output,
        EncryptionKey $key
    ): bool {
        // Rewind
        $input->reset(0);

        // Make sure it's large enough to even read a version tag
        if ($input->getSize() < Halite::VERSION_TAG_LEN) {
            throw new InvalidMessage(
                "Input file is too small to have been encrypted by Halite."
            );
        }
        // Parse the header, ensuring we get 4 bytes
        /** @var string $header */
        $header = $input->readBytes(Halite::VERSION_TAG_LEN);

        // Load the config
        $config = self::getConfig($header, 'encrypt');

        // Is this shorter than an encrypted empty string?
        if ($input->getSize() < $config->SHORTEST_CIPHERTEXT_LENGTH) {
            throw new InvalidMessage(
                "Input file is too small to have been encrypted by Halite."
            );
        }

        // Let's grab the first nonce and salt
        /** @var string $firstNonce */
        $firstNonce = $input->readBytes((int) $config->NONCE_BYTES);
        /** @var string $hkdfSalt */
        $hkdfSalt = $input->readBytes((int) $config->HKDF_SALT_LEN);

        // Split our keys, begin the HMAC instance
        list ($encKey, $authKey) = self::splitKeys($key, $hkdfSalt, $config);

        // VERSION 2+ uses BMAC
        $mac = \sodium_crypto_generichash_init($authKey);
        \sodium_crypto_generichash_update($mac, $header);
        \sodium_crypto_generichash_update($mac, $firstNonce);
        \sodium_crypto_generichash_update($mac, $hkdfSalt);
        /** @var string $mac */

        $old_macs = self::streamVerify($input, Util::safeStrcpy($mac), $config);

        \sodium_memzero($authKey);
        \sodium_memzero($hkdfSalt);

        $ret = self::streamDecrypt(
            $input,
            $output,
            new EncryptionKey(
                new HiddenString($encKey)
            ),
            (string) $firstNonce,
            (string) $mac,
            $config,
            $old_macs
        );

        \sodium_memzero($encKey);
        unset($encKey);
        unset($authKey);
        unset($firstNonce);
        unset($mac);
        unset($config);
        unset($old_macs);

        return $ret;
    }
protected static function decryptData(
        ReadOnlyFile $input,
        MutableFile $output,
        EncryptionKey $key
    ): bool {
        // Rewind
        $input->reset(0);

        // Make sure it's large enough to even read a version tag
        if ($input->getSize() < Halite::VERSION_TAG_LEN) {
            throw new InvalidMessage(
                "Input file is too small to have been encrypted by Halite."
            );
        }
        // Parse the header, ensuring we get 4 bytes
        /** @var string $header */
        $header = $input->readBytes(Halite::VERSION_TAG_LEN);

        // Load the config
        $config = self::getConfig($header, 'encrypt');

        // Is this shorter than an encrypted empty string?
        if ($input->getSize() < $config->SHORTEST_CIPHERTEXT_LENGTH) {
            throw new InvalidMessage(
                "Input file is too small to have been encrypted by Halite."
            );
        }

        // Let's grab the first nonce and salt
        /** @var string $firstNonce */
        $firstNonce = $input->readBytes((int) $config->NONCE_BYTES);
        /** @var string $hkdfSalt */
        $hkdfSalt = $input->readBytes((int) $config->HKDF_SALT_LEN);

        // Split our keys, begin the HMAC instance
        list ($encKey, $authKey) = self::splitKeys($key, $hkdfSalt, $config);

        // VERSION 2+ uses BMAC
        $mac = \sodium_crypto_generichash_init($authKey);
        \sodium_crypto_generichash_update($mac, $header);
        \sodium_crypto_generichash_update($mac, $firstNonce);
        \sodium_crypto_generichash_update($mac, $hkdfSalt);
        /** @var string $mac */

        $old_macs = self::streamVerify($input, Util::safeStrcpy($mac), $config);

        \sodium_memzero($authKey);
        \sodium_memzero($hkdfSalt);

        $ret = self::streamDecrypt(
            $input,
            $output,
            new EncryptionKey(
                new HiddenString($encKey)
            ),
            (string) $firstNonce,
            (string) $mac,
            $config,
            $old_macs
        );

        \sodium_memzero($encKey);
        unset($encKey);
        unset($authKey);
        unset($firstNonce);
        unset($mac);
        unset($config);
        unset($old_macs);

        return $ret;
    }
protected static function decryptData ( ReadOnlyFile $ input , MutableFile $ output , EncryptionKey $ key ) : bool { // Rewind $ input -> reset ( 0 ) ; // Make sure it's large enough to even read a version tag if ( $ input -> getSize ( ) < Halite :: VERSION_TAG_LEN ) { throw new InvalidMessage ( "Input file is too small to have been encrypted by Halite." ) ; } // Parse the header, ensuring we get 4 bytes /** @var string $header */ $ header = $ input -> readBytes ( Halite :: VERSION_TAG_LEN ) ; // Load the config $ config = self :: getConfig ( $ header , 'encrypt' ) ; // Is this shorter than an encrypted empty string? if ( $ input -> getSize ( ) < $ config -> SHORTEST_CIPHERTEXT_LENGTH ) { throw new InvalidMessage ( "Input file is too small to have been encrypted by Halite." ) ; } // Let's grab the first nonce and salt /** @var string $firstNonce */ $ firstNonce = $ input -> readBytes ( ( int ) $ config -> NONCE_BYTES ) ; /** @var string $hkdfSalt */ $ hkdfSalt = $ input -> readBytes ( ( int ) $ config -> HKDF_SALT_LEN ) ; // Split our keys, begin the HMAC instance list ( $ encKey , $ authKey ) = self :: splitKeys ( $ key , $ hkdfSalt , $ config ) ; // VERSION 2+ uses BMAC $ mac = \ sodium_crypto_generichash_init ( $ authKey ) ; \ sodium_crypto_generichash_update ( $ mac , $ header ) ; \ sodium_crypto_generichash_update ( $ mac , $ firstNonce ) ; \ sodium_crypto_generichash_update ( $ mac , $ hkdfSalt ) ; /** @var string $mac */ $ old_macs = self :: streamVerify ( $ input , Util :: safeStrcpy ( $ mac ) , $ config ) ; \ sodium_memzero ( $ authKey ) ; \ sodium_memzero ( $ hkdfSalt ) ; $ ret = self :: streamDecrypt ( $ input , $ output , new EncryptionKey ( new HiddenString ( $ encKey ) ) , ( string ) $ firstNonce , ( string ) $ mac , $ config , $ old_macs ) ; \ sodium_memzero ( $ encKey ) ; unset ( $ encKey ) ; unset ( $ authKey ) ; unset ( $ firstNonce ) ; unset ( $ mac ) ; unset ( $ config ) ; unset ( $ old_macs ) ; return $ ret ; }
Decrypt the contents of a file.

@param ReadOnlyFile $input
@param MutableFile $output
@param EncryptionKey $key
@return bool

@throws CannotPerformOperation
@throws FileAccessDenied
@throws FileError
@throws FileModified
@throws InvalidDigestLength
@throws InvalidKey
@throws InvalidMessage
@throws InvalidType
@throws \SodiumException
Decrypt the contents of a file .