Crypt/Base: don't always treat CTR as being continuous w/ OpenSSL

This commit is contained in:
terrafrost 2014-12-31 22:24:56 -06:00
parent 805c99458b
commit b831724e1a

View File

@ -1327,19 +1327,26 @@ class Crypt_Base
if ($overflow) { if ($overflow) {
$plaintext2 = $this->_string_pop($plaintext, $overflow); // ie. trim $plaintext to a multiple of $block_size and put rest of $plaintext in $plaintext2 $plaintext2 = $this->_string_pop($plaintext, $overflow); // ie. trim $plaintext to a multiple of $block_size and put rest of $plaintext in $plaintext2
$encrypted = openssl_encrypt($plaintext . str_repeat("\0", $block_size), $this->cipher_name_openssl, $key, $this->openssl_options, $encryptIV); $encrypted = openssl_encrypt($plaintext . str_repeat("\0", $block_size), $this->cipher_name_openssl, $key, $this->openssl_options, $encryptIV);
$encryptIV = $this->_string_pop($encrypted, $block_size); $temp = $this->_string_pop($encrypted, $block_size);
$ciphertext.= $encrypted . ($plaintext2 ^ $encryptIV); $ciphertext.= $encrypted . ($plaintext2 ^ $temp);
$buffer['ciphertext'] = substr($encryptIV, $overflow); if ($this->continuousBuffer) {
$buffer['ciphertext'] = substr($temp, $overflow);
$encryptIV = $temp;
}
} else if (!strlen($buffer['ciphertext'])) { } else if (!strlen($buffer['ciphertext'])) {
$ciphertext.= openssl_encrypt($plaintext . str_repeat("\0", $block_size), $this->cipher_name_openssl, $key, $this->openssl_options, $encryptIV); $ciphertext.= openssl_encrypt($plaintext . str_repeat("\0", $block_size), $this->cipher_name_openssl, $key, $this->openssl_options, $encryptIV);
$encryptIV = $this->_string_pop($ciphertext, $block_size); if ($this->continuousBuffer) {
$encryptIV = $this->_string_pop($ciphertext, $block_size);
}
} }
if (!defined('OPENSSL_RAW_DATA')) { if ($this->continuousBuffer) {
$encryptIV.= openssl_encrypt('', $this->cipher_name_openssl_ecb, $key, $this->openssl_options); if (!defined('OPENSSL_RAW_DATA')) {
} $encryptIV.= openssl_encrypt('', $this->cipher_name_openssl_ecb, $key, $this->openssl_options);
$encryptIV = openssl_decrypt($encryptIV, $this->cipher_name_openssl_ecb, $key, $this->openssl_options); }
if ($overflow) { $encryptIV = openssl_decrypt($encryptIV, $this->cipher_name_openssl_ecb, $key, $this->openssl_options);
$this->_increment_str($encryptIV); if ($overflow) {
$this->_increment_str($encryptIV);
}
} }
return $ciphertext; return $ciphertext;