[php-src] Issue #22195: `chacha20-poly1305`: authentication tag not returned via `$tag` parameter in PHP 8.1

[email protected] (olegbaturin) Sun, 31 May 2026 11:13:52 +0000
Newsgroups php.bugs
Message-ID <[email protected]>
Issue: https://github.com/php/php-src/issues/22195
Author: olegbaturin

### Description

The following code:

```php
<?php
$algo = 'chacha20-poly1305';
$data = 'plain text'; // 10 bytes
$pass = random_bytes(32);
$iv = str_repeat("\0", 12);
$enc = openssl_encrypt($data, $algo, $pass, OPENSSL_RAW_DATA | OPENSSL_DONT_ZERO_PAD_KEY, $iv, $tag);
var_dump(bin2hex($enc), $tag);
```

Resulted in this output:
```
string(20) "cyphertext hex"
NULL
```

But I expected this output instead:
```
`$tag` must be 16 bytes
```

According to the AEAD contract, when the `$tag` parameter is provided, the ciphertext should contain only the encrypted data (same length as the plaintext), and the 16‑byte authentication tag should be written to `$tag`.

Fixed in PHP 8.2.0 and later.

### PHP Version

```plain
PHP 8.1.34 (cli) (built: Dec 29 2025 23:35:21) (NTS)
Copyright (c) The PHP Group
Zend Engine v4.1.34, Copyright (c) Zend Technologies
    with Zend OPcache v8.1.34, Copyright (c), by Zend Technologies

OpenSSL 3.5.4 30 Sep 2025
```

### Operating System

_No response_