protected function _mcrypt_decrypt($data, $params)
{
if (!is_resource($params['handle'])) {
return FALSE;
}
// The greater-than-1 comparison is mostly a work-around for a bug,
// where 1 is returned for ARCFour instead of 0.
if (($iv_size = mcrypt_enc_get_iv_size($params['handle'])) > 1) {
if (mcrypt_enc_get_modes_name($params['handle']) !== 'ECB') {
$iv = self::substr($data, 0, $iv_size);
$data = self::substr($data, $iv_size);
} else {
// MCrypt is dumb and this is ignored, only size matters
$iv = str_repeat("", $iv_size);
}
} else {
$iv = NULL;
}
if (mcrypt_generic_init($params['handle'], $params['key'], $iv) < 0) {
if ($params['handle'] !== $this->_handle) {
mcrypt_module_close($params['handle']);
}
return FALSE;
}
$data = mdecrypt_generic($params['handle'], $data);
// Remove PKCS#7 padding, if necessary
if (in_array(strtolower(mcrypt_enc_get_modes_name($params['handle'])), array('cbc', 'ecb'), TRUE)) {
$data = self::substr($data, 0, -ord($data[self::strlen($data) - 1]));
}
mcrypt_generic_deinit($params['handle']);
if ($params['handle'] !== $this->_handle) {
mcrypt_module_close($params['handle']);
}
return $data;
}