mirror of
https://github.com/php/php-src.git
synced 2026-03-24 00:02:20 +01:00
Merge branch 'PHP-8.4' into PHP-8.5
* PHP-8.4: Fix GH-21083: Skip private_key_bits validation for EC/curve-based keys
This commit is contained in:
4
NEWS
4
NEWS
@@ -13,6 +13,10 @@ PHP NEWS
|
||||
. Fixed bug GH-21052 (Preloaded constant erroneously propagated to file-cached
|
||||
script). (ilutov)
|
||||
|
||||
- OpenSSL:
|
||||
. Fixed bug GH-21083 (Skip private_key_bits validation for EC/curve-based
|
||||
keys). (iliaal)
|
||||
|
||||
- PCNTL:
|
||||
. Fixed signal handler installation on AIX by bumping the storage size of the
|
||||
num_signals global. (Calvin Buckley)
|
||||
|
||||
@@ -1444,7 +1444,10 @@ static const char *php_openssl_get_evp_pkey_name(int key_type) {
|
||||
|
||||
EVP_PKEY *php_openssl_generate_private_key(struct php_x509_request * req)
|
||||
{
|
||||
if (req->priv_key_bits < MIN_KEY_LENGTH) {
|
||||
if ((req->priv_key_type == OPENSSL_KEYTYPE_RSA ||
|
||||
req->priv_key_type == OPENSSL_KEYTYPE_DH ||
|
||||
req->priv_key_type == OPENSSL_KEYTYPE_DSA) &&
|
||||
req->priv_key_bits < MIN_KEY_LENGTH) {
|
||||
php_error_docref(NULL, E_WARNING, "Private key length must be at least %d bits, configured to %d",
|
||||
MIN_KEY_LENGTH, req->priv_key_bits);
|
||||
return NULL;
|
||||
|
||||
61
ext/openssl/tests/gh21083.phpt
Normal file
61
ext/openssl/tests/gh21083.phpt
Normal file
@@ -0,0 +1,61 @@
|
||||
--TEST--
|
||||
GH-21083 (openssl_pkey_new() fails for EC keys when private_key_bits is not set)
|
||||
--EXTENSIONS--
|
||||
openssl
|
||||
--SKIPIF--
|
||||
<?php if (!defined("OPENSSL_KEYTYPE_EC")) die("skip EC disabled"); ?>
|
||||
--ENV--
|
||||
OPENSSL_CONF=
|
||||
--FILE--
|
||||
<?php
|
||||
// Create a minimal openssl.cnf without default_bits (simulates OpenSSL 3.6 default config)
|
||||
$conf = tempnam(sys_get_temp_dir(), 'ossl');
|
||||
file_put_contents($conf, "[req]\ndistinguished_name = req_dn\n[req_dn]\n");
|
||||
|
||||
// EC key - size is determined by the curve, private_key_bits should not be required
|
||||
$key = openssl_pkey_new([
|
||||
'config' => $conf,
|
||||
'private_key_type' => OPENSSL_KEYTYPE_EC,
|
||||
'curve_name' => 'prime256v1',
|
||||
]);
|
||||
var_dump($key !== false);
|
||||
$details = openssl_pkey_get_details($key);
|
||||
var_dump($details['bits']);
|
||||
var_dump($details['type'] === OPENSSL_KEYTYPE_EC);
|
||||
echo "EC OK\n";
|
||||
|
||||
// X25519 - fixed size key, private_key_bits should not be required
|
||||
if (defined('OPENSSL_KEYTYPE_X25519')) {
|
||||
$key = openssl_pkey_new([
|
||||
'config' => $conf,
|
||||
'private_key_type' => OPENSSL_KEYTYPE_X25519,
|
||||
]);
|
||||
var_dump($key !== false);
|
||||
echo "X25519 OK\n";
|
||||
} else {
|
||||
echo "bool(true)\nX25519 OK\n";
|
||||
}
|
||||
|
||||
// Ed25519 - fixed size key, private_key_bits should not be required
|
||||
if (defined('OPENSSL_KEYTYPE_ED25519')) {
|
||||
$key = openssl_pkey_new([
|
||||
'config' => $conf,
|
||||
'private_key_type' => OPENSSL_KEYTYPE_ED25519,
|
||||
]);
|
||||
var_dump($key !== false);
|
||||
echo "Ed25519 OK\n";
|
||||
} else {
|
||||
echo "bool(true)\nEd25519 OK\n";
|
||||
}
|
||||
|
||||
unlink($conf);
|
||||
?>
|
||||
--EXPECT--
|
||||
bool(true)
|
||||
int(256)
|
||||
bool(true)
|
||||
EC OK
|
||||
bool(true)
|
||||
X25519 OK
|
||||
bool(true)
|
||||
Ed25519 OK
|
||||
Reference in New Issue
Block a user