summaryrefslogtreecommitdiff
path: root/ext/openssl/openssl.c
diff options
context:
space:
mode:
Diffstat (limited to 'ext/openssl/openssl.c')
-rw-r--r--ext/openssl/openssl.c46
1 files changed, 46 insertions, 0 deletions
diff --git a/ext/openssl/openssl.c b/ext/openssl/openssl.c
index 89c84b42e4..7fcab17ed6 100644
--- a/ext/openssl/openssl.c
+++ b/ext/openssl/openssl.c
@@ -153,6 +153,11 @@ ZEND_BEGIN_ARG_INFO(arginfo_openssl_x509_check_private_key, 0)
ZEND_ARG_INFO(0, key)
ZEND_END_ARG_INFO()
+ZEND_BEGIN_ARG_INFO(arginfo_openssl_x509_verify, 0)
+ ZEND_ARG_INFO(0, cert)
+ ZEND_ARG_INFO(0, key)
+ZEND_END_ARG_INFO()
+
ZEND_BEGIN_ARG_INFO_EX(arginfo_openssl_x509_parse, 0, 0, 1)
ZEND_ARG_INFO(0, x509)
ZEND_ARG_INFO(0, shortname)
@@ -492,6 +497,7 @@ static const zend_function_entry openssl_functions[] = {
PHP_FE(openssl_x509_parse, arginfo_openssl_x509_parse)
PHP_FE(openssl_x509_checkpurpose, arginfo_openssl_x509_checkpurpose)
PHP_FE(openssl_x509_check_private_key, arginfo_openssl_x509_check_private_key)
+ PHP_FE(openssl_x509_verify, arginfo_openssl_x509_verify)
PHP_FE(openssl_x509_export, arginfo_openssl_x509_export)
PHP_FE(openssl_x509_fingerprint, arginfo_openssl_x509_fingerprint)
PHP_FE(openssl_x509_export_to_file, arginfo_openssl_x509_export_to_file)
@@ -2224,6 +2230,46 @@ PHP_FUNCTION(openssl_x509_check_private_key)
}
/* }}} */
+/* {{{ proto int openssl_x509_verify(mixed cert, mixed key)
+ Verifies the signature of certificate cert using public key key */
+PHP_FUNCTION(openssl_x509_verify)
+{
+ zval * zcert, *zkey;
+ X509 * cert = NULL;
+ EVP_PKEY * key = NULL;
+ zend_resource *keyresource = NULL;
+ int err = -1;
+
+ if (zend_parse_parameters(ZEND_NUM_ARGS(), "zz", &zcert, &zkey) == FAILURE) {
+ return;
+ }
+ cert = php_openssl_x509_from_zval(zcert, 0, NULL);
+ if (cert == NULL) {
+ RETURN_LONG(err);
+ }
+ key = php_openssl_evp_from_zval(zkey, 1, NULL, 0, 0, &keyresource);
+ if (key == NULL) {
+ X509_free(cert);
+ RETURN_LONG(err);
+ }
+
+ err = X509_verify(cert, key);
+
+ if (err < 0) {
+ php_openssl_store_errors();
+ }
+
+ if (keyresource == NULL && key) {
+ EVP_PKEY_free(key);
+ }
+ if (Z_TYPE_P(zcert) != IS_RESOURCE) {
+ X509_free(cert);
+ }
+
+ RETURN_LONG(err);
+}
+/* }}} */
+
/* Special handling of subjectAltName, see CVE-2013-4073
* Christian Heimes
*/