Commit 39d8aee27c0 for php.net

commit 39d8aee27c00bacfc5cfa1d63f1f3e826d8790b8
Author: Alexander Danilov <10532067+adapik@users.noreply.github.com>
Date:   Mon Sep 21 14:59:35 2026 +0300

    md5, sha1, openssl - using zend_bin2hex instead of local helper (#23819)

diff --git a/ext/openssl/openssl.c b/ext/openssl/openssl.c
index c8ca39ad0aa..5ea2a773743 100644
--- a/ext/openssl/openssl.c
+++ b/ext/openssl/openssl.c
@@ -32,7 +32,6 @@
 #include "ext/standard/file.h"
 #include "ext/standard/info.h"
 #include "ext/standard/php_fopen_wrappers.h"
-#include "ext/standard/md5.h" /* For make_digest_ex() */
 #include "ext/standard/base64.h"
 #ifdef PHP_WIN32
 # include "win32/winutil.h"
@@ -4973,7 +4972,7 @@ PHP_FUNCTION(openssl_digest)
 			int digest_str_len = siglen * 2;
 			zend_string *digest_str = zend_string_alloc(digest_str_len, 0);

-			make_digest_ex(ZSTR_VAL(digest_str), (unsigned char*)ZSTR_VAL(sigbuf), siglen);
+			zend_bin2hex(ZSTR_VAL(digest_str), (unsigned char*)ZSTR_VAL(sigbuf), siglen);
 			ZSTR_VAL(digest_str)[digest_str_len] = '\0';
 			zend_string_release_ex(sigbuf, 0);
 			RETVAL_NEW_STR(digest_str);
diff --git a/ext/openssl/openssl_backend_common.c b/ext/openssl/openssl_backend_common.c
index 2ebee973ff8..8ea132a1ab0 100644
--- a/ext/openssl/openssl_backend_common.c
+++ b/ext/openssl/openssl_backend_common.c
@@ -15,7 +15,6 @@
 #include "php_openssl_backend.h"

 #include "zend_exceptions.h"
-#include "ext/standard/md5.h" /* For make_digest_ex() */
 #include "ext/standard/base64.h"
 #ifdef PHP_WIN32
 # include "win32/winutil.h"
@@ -611,7 +610,7 @@ zend_string* php_openssl_x509_fingerprint(X509 *peer, const char *method, bool r
 		ret = zend_string_init((char*)md, n, 0);
 	} else {
 		ret = zend_string_alloc(n * 2, 0);
-		make_digest_ex(ZSTR_VAL(ret), md, n);
+		zend_bin2hex(ZSTR_VAL(ret), md, n);
 		ZSTR_VAL(ret)[n * 2] = '\0';
 	}

diff --git a/ext/standard/md5.c b/ext/standard/md5.c
index 204514053cf..c5badcd6b85 100644
--- a/ext/standard/md5.c
+++ b/ext/standard/md5.c
@@ -24,12 +24,10 @@ PHPAPI void make_digest(char *md5str, const unsigned char *digest)

 PHPAPI void make_digest_ex(char *md5str, const unsigned char *digest, size_t len)
 {
-	static const char hexits[17] = "0123456789abcdef";
-
-	for (size_t i = 0; i < len; i++) {
-		md5str[i * 2]       = hexits[digest[i] >> 4];
-		md5str[(i * 2) + 1] = hexits[digest[i] &  0x0F];
-	}
+	zend_bin2hex(md5str, digest, len);
+	/* Some callers (e.g. ext/soap's WSDL cache key) memcpy() the whole
+	   buffer including this terminator, so it must still be written here;
+	   zend_bin2hex() itself does not null-terminate. */
 	md5str[len * 2] = '\0';
 }