Bug #80232 [Com]: openssl_decrypt() error with aes-128-ocb fail to set openssl_error_string()

From: Date: Wed, 14 Oct 2020 16:55:22 +0000
Subject: Bug #80232 [Com]: openssl_decrypt() error with aes-128-ocb fail to set openssl_error_string()
References: 1  Groups: php.bugs 
Request: Send a blank email to php-bugs+get-229623@lists.php.net to get a copy of this message
Edit report at https://bugs.php.net/bug.php?id=80232&edit=1

 ID:                 80232
 Comment by:         divinity76 at gmail dot com
 Reported by:        divinity76 at gmail dot com
 Summary:            openssl_decrypt() error with aes-128-ocb fail to set
                     openssl_error_string()
 Status:             Duplicate
 Type:               Bug
 Package:            OpenSSL related
 PHP Version:        7.2.34
 Block user comment: N
 Private report:     N

 New Comment:

@nikic

> providing error information for decryption operations may break the security of the cipher.

if the oracle provided detailed decryption error information to attackers, i would agree with you,
but the oracle itself should have access to that information,
unless openssl_error_string() is explicitly designed to not allow developers shoot themselves in the
foot?


Previous Comments:
------------------------------------------------------------------------
[2020-10-14 10:33:25] nikic@php.net

It's normal that openssl_decrypt() does not provide detailed error information -- providing
error information for decryption operations may break the security of the cipher.

However, something is clearly wrong with the handling of OCB here. It's an AEAD mode, but it
doesn't accept a tag, and thus decryption will also fail. Apparently this has been previously
reported in bug #79983.

------------------------------------------------------------------------
[2020-10-14 01:41:54] divinity76 at gmail dot com

(i don't know if the return from openssl_encrypt() is valid or bogus, but the return string
looks like ciphertext to me, and _encrypt() doesn't set openssl_error_string() either)

------------------------------------------------------------------------
[2020-10-14 01:27:18] divinity76 at gmail dot com

Description:
------------
it seems some openssl_decrypt() decryption error with aes-128-ocb fail to register on
openssl_error_string()

Test script:
---------------
<?php
declare(strict_types=1);
ini_set('display_errors','On');
error_reporting(E_ALL);
header("Content-Type: text/plain;charset=utf-8");
ini_set('html_errors','0');
$algo = 'aes-128-ocb';
$data_to_encrypt = $key = $iv = str_repeat("\x00", openssl_cipher_iv_length($algo));
$opts = OPENSSL_RAW_DATA | OPENSSL_ZERO_PADDING;
$encrypted = openssl_encrypt($data_to_encrypt, $algo, $key, $opts , $iv);
if(false===$encrypted || openssl_error_string() !== false){
    die("encryption error ".openssl_error_string());
}
$decrypted = openssl_decrypt($encrypted, $algo, $key, $opts, $iv);
if(($encrypted !== $data_to_encrypt) && ($data_to_encrypt === $decrypted)){
    echo "ok";
}else{
    echo "error: ";
    var_dump([
        "original"=>$data_to_encrypt,
        "encrypted"=>$encrypted,
        "decrypted"=>$decrypted,
        "openssl_error_string" => openssl_error_string()
    ]);
}


Expected result:
----------------
i either expected "ok", or expected openssl_error_string() to contain something other than
bool(false) 

Actual result:
--------------
error: array(4) {
  ["original"]=>
  string(12) "������������"
  ["encrypted"]=>
  string(12) "{��f�g]�WG�"
  ["decrypted"]=>
  bool(false)
  ["openssl_error_string"]=>
  bool(false)
}


------------------------------------------------------------------------



--
Edit this bug report at https://bugs.php.net/bug.php?id=80232&edit=1


Thread (4 messages)

« previous php.bugs (#229623) next »