From 114ff7afde675af3937995ae865d77a8eb28becf Mon Sep 17 00:00:00 2001 From: Cameron Porter Date: Thu, 24 Jun 2021 22:13:46 -0500 Subject: [PATCH 1/2] curl: Add version 7.71.0 blob options. --- ext/curl/interface.c | 36 ++++++++++++++++++++++++++++++++++++ 1 file changed, 36 insertions(+) diff --git a/ext/curl/interface.c b/ext/curl/interface.c index 26f74d9220a52..b0e2b6170c068 100644 --- a/ext/curl/interface.c +++ b/ext/curl/interface.c @@ -1153,6 +1153,16 @@ PHP_MINIT_FUNCTION(curl) REGISTER_CURL_CONSTANT(CURL_VERSION_ALTSVC); #endif +#if LIBCURL_VERSION_NUM >= 0x074700 /* Available since 7.71.0 */ + REGISTER_CURL_CONSTANT(CURLOPT_ISSUERCERT_BLOB); + REGISTER_CURL_CONSTANT(CURLOPT_PROXY_ISSUERCERT); + REGISTER_CURL_CONSTANT(CURLOPT_PROXY_ISSUERCERT_BLOB); + REGISTER_CURL_CONSTANT(CURLOPT_PROXY_SSLCERT_BLOB); + REGISTER_CURL_CONSTANT(CURLOPT_PROXY_SSLKEY_BLOB); + REGISTER_CURL_CONSTANT(CURLOPT_SSLCERT_BLOB); + REGISTER_CURL_CONSTANT(CURLOPT_SSLKEY_BLOB); +#endif + REGISTER_CURL_CONSTANT(CURLOPT_SAFE_UPLOAD); #ifdef PHP_CURL_NEED_OPENSSL_TSL @@ -2520,6 +2530,9 @@ static int _php_curl_setopt(php_curl *ch, zend_long option, zval *zvalue, bool i #if LIBCURL_VERSION_NUM >= 0x073d00 /* Available since 7.61.0 */ case CURLOPT_PROXY_TLS13_CIPHERS: case CURLOPT_TLS13_CIPHERS: +#endif +#if LIBCURL_VERSION_NUM >= 0x074700 /* Available since 7.71.0 */ + case CURLOPT_PROXY_ISSUERCERT: #endif { zend_string *tmp_str; @@ -2923,6 +2936,29 @@ static int _php_curl_setopt(php_curl *ch, zend_long option, zval *zvalue, bool i ZVAL_COPY(&ch->handlers.fnmatch->func_name, zvalue); break; + /* Curl blob options */ +#if LIBCURL_VERSION_NUM >= 0x074700 /* Available since 7.71.0 */ + case CURLOPT_ISSUERCERT_BLOB: + case CURLOPT_PROXY_ISSUERCERT_BLOB: + case CURLOPT_PROXY_SSLCERT_BLOB: + case CURLOPT_PROXY_SSLKEY_BLOB: + case CURLOPT_SSLCERT_BLOB: + case CURLOPT_SSLKEY_BLOB: + { + zend_string *tmp_str; + zend_string *str = zval_get_tmp_string(zvalue, &tmp_str); + + struct curl_blob stblob; + stblob.data = ZSTR_VAL(str); + stblob.len = ZSTR_LEN(str); + stblob.flags = CURL_BLOB_COPY; + error = curl_easy_setopt(ch->cp, option, &stblob); + + zend_tmp_string_release(tmp_str); + } + break; +#endif + default: if (is_array_config) { zend_argument_value_error(2, "must contain only valid cURL options"); From 56c0b3a23b992ab3087f4d3a349032fab6c377c9 Mon Sep 17 00:00:00 2001 From: Cameron Porter Date: Sat, 26 Jun 2021 14:17:13 -0500 Subject: [PATCH 2/2] curl: add 7.71.0 blob option tests --- ext/curl/tests/curl_setopt_ssl.phpt | 239 ++++++++++++++++++ ext/curl/tests/curl_setopt_ssl_clientcert.pem | 32 +++ ext/curl/tests/curl_setopt_ssl_clientkey.pem | 51 ++++ ext/curl/tests/curl_setopt_ssl_servercert.pem | 30 +++ ext/curl/tests/curl_setopt_ssl_serverkey.pem | 51 ++++ 5 files changed, 403 insertions(+) create mode 100644 ext/curl/tests/curl_setopt_ssl.phpt create mode 100644 ext/curl/tests/curl_setopt_ssl_clientcert.pem create mode 100644 ext/curl/tests/curl_setopt_ssl_clientkey.pem create mode 100644 ext/curl/tests/curl_setopt_ssl_servercert.pem create mode 100644 ext/curl/tests/curl_setopt_ssl_serverkey.pem diff --git a/ext/curl/tests/curl_setopt_ssl.phpt b/ext/curl/tests/curl_setopt_ssl.phpt new file mode 100644 index 0000000000000..52ff95ab34bcf --- /dev/null +++ b/ext/curl/tests/curl_setopt_ssl.phpt @@ -0,0 +1,239 @@ +--TEST-- +CURLOPT_SSL* basic client auth tests +--EXTENSIONS-- +curl +--SKIPIF-- + 0) die("skip couldn't locate openssl binary"); +if (PHP_OS_FAMILY === 'Windows') die('skip not for Windows'); +$curl_version = curl_version(); +if ($curl_version['version_number'] < 0x074700) { + die("skip: blob options not supported for curl < 7.71.0"); +} +?> +--FILE-- + +--EXPECT-- +case 1: client cert and key from string +bool(true) +bool(true) +bool(true) +bool(true) +client cert subject in response + +case 2: empty client cert and key from string +bool(true) +bool(true) +bool(true) +bool(true) +client cert subject not in response +CURL ERROR: 58 + +case 3: client cert and empty key from string +bool(true) +bool(true) +bool(true) +bool(true) +client cert subject not in response +CURL ERROR: 58 + +case 4: client cert and key from file +bool(true) +bool(true) +bool(true) +bool(true) +client cert subject in response + +case 5: issuer cert from file +bool(true) +bool(true) +bool(true) +bool(true) +bool(true) +bool(true) +client cert subject in response + +case 6: issuer cert from string +bool(true) +bool(true) +bool(true) +bool(true) +bool(true) +bool(true) +client cert subject in response + +case 7: empty issuer cert from string +bool(true) +bool(true) +bool(true) +bool(true) +bool(true) +bool(true) +client cert subject not in response +CURL ERROR: 83 \ No newline at end of file diff --git a/ext/curl/tests/curl_setopt_ssl_clientcert.pem b/ext/curl/tests/curl_setopt_ssl_clientcert.pem new file mode 100644 index 0000000000000..73d53a246fa69 --- /dev/null +++ b/ext/curl/tests/curl_setopt_ssl_clientcert.pem @@ -0,0 +1,32 @@ +-----BEGIN CERTIFICATE----- +MIIFgDCCA2gCCQCpI/KBeVlPsjANBgkqhkiG9w0BAQsFADCBgTELMAkGA1UEBhMC +VVMxCzAJBgNVBAgMAlRYMRcwFQYDVQQHDA5DbGllbnRsb2NhdGlvbjEWMBQGA1UE +CgwNQ2xpZW50Y29tcGFueTETMBEGA1UEAwwKY2xpZW50bmFtZTEfMB0GCSqGSIb3 +DQEJARYQdGVzdEBleGFtcGxlLmNvbTAeFw0yMTA2MjYxOTAyMTlaFw00ODExMTAx +OTAyMTlaMIGBMQswCQYDVQQGEwJVUzELMAkGA1UECAwCVFgxFzAVBgNVBAcMDkNs +aWVudGxvY2F0aW9uMRYwFAYDVQQKDA1DbGllbnRjb21wYW55MRMwEQYDVQQDDApj +bGllbnRuYW1lMR8wHQYJKoZIhvcNAQkBFhB0ZXN0QGV4YW1wbGUuY29tMIICIjAN +BgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEA2TlNc7TMAjjjgERln914ScxiMcwH +5TVOjUxhBX9XuSNP8tnO03r4w6bQFCaq7ire63ssCx1aua4tCIMeKG++ueiMeqLc +fmc5lIs3GuMEYrcopf9FQvvDuRM8EpkIKNNp5e82TBQkEAtSFc1e8rPnjAxi68gm +g/yTrm74tG4sqyHtzpiNUwwP4sE3yfV6sENF+Sth8grfsTBShXmq1eQ+PWYBHT13 +e4J0YBkOXduNIFuXs/mKUgFlEhzhthdznsN2dLzWzVmZZGX1nTsZ+yQYDdGVq0ay +F20unovhZNh2J9kfdgKDZFPgtRHgFYZZTeacZCGWg9KMkwVXqdufjk4M/khkpwTh +agZHhf1lLq3pmGzm8hZto5OKWXOk+hoopSEU0+V+PJtl5Cl7MIa6gJVsk6rT3abp +X5e3bmlABreZIlFjk2kO68gNbbSdZiZfjqtqLeTY2KwYsUZ358zAJlDT8Zc0T00u +pQEBQxFBNWQqfXwlnWtvcKpvwonbBZLcUGoWMiuFIgsnsTvxLWayX20Njy2m7K7d +002cn3KBVpu3EXO9NkYKg+q6z79FvAlf9Xq/nV9ubvGQ/wEpJOr4egvWHoC0qt3/ +uW+nzhmqhBv6cGWnKDUVWknAsothJlunP55Dtq2fmxmXH4TjYqofhfvMN88XdxFb +0ZUYojirWTOSIn8CAwEAATANBgkqhkiG9w0BAQsFAAOCAgEAa+rI3YH3HT+KiyBE +8Mv7/gH1jlQ2zPzTu0EccgnDcuXQSlAtvz+0evoUYOpREQ/lfeNeICllJgK0R0Go +QReqsnC6Tbq/pCDMmo6g6vm7H0j1b1RNNnhNuh0el/O/cnAT6KBcrmojBBkJMHRT +vHJeE0W+rr3Qvg1GM3KfHlyxQeZLQrTeuNjE5f+9LUy1d11UV2xLuiGax5zYQQM3 +iwqHFvfe3EYzmRECmMY4qLZgN/c1Cd4RK8wEPKKsvOjxpNLAAR8+VeLUj32UmtWd +ZFnTFEiJI0RWtRdLt1J3r9+ybg3c0e/BJWxK6Dw00NV6A5UNd5lVbv5v9ZMGI7tu +fTaZE4AR50yd+VMZXMMZj282eZOIIoi1IeT1uofyDcYvxWjNn+gW/Di8niKunwYA +tdXANcGtzlB3slBSX0gZ9sItdFkb7gDG86L7Gg90GJEG0ZtU8WzQ5BUArMfYWZbv +l8A0kOQi6dR+/RjcswRDXWSYx3U0j0db5Ibg7D3WMRcHQasck2YHZrlku5ILC5Gd +F0N4bIps2V6kN/OWFdSyWTwvIS2m62ovg3o9hR2aODqkL36CjS/rHPu3vovveIJH +mDlauv5b5SdRRF4kk8zHZFIlFJMlT2KcOB3A6doukOVCx+2ikr1v1SbOaDZj1mre +JMf5QKxVEqCR8jT+ak7yx84JB5M= +-----END CERTIFICATE----- diff --git a/ext/curl/tests/curl_setopt_ssl_clientkey.pem b/ext/curl/tests/curl_setopt_ssl_clientkey.pem new file mode 100644 index 0000000000000..014b2ce4b9b7b --- /dev/null +++ b/ext/curl/tests/curl_setopt_ssl_clientkey.pem @@ -0,0 +1,51 @@ +-----BEGIN RSA PRIVATE KEY----- +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 +-----END RSA PRIVATE KEY----- diff --git a/ext/curl/tests/curl_setopt_ssl_servercert.pem b/ext/curl/tests/curl_setopt_ssl_servercert.pem new file mode 100644 index 0000000000000..ee1dbe890dda8 --- /dev/null +++ b/ext/curl/tests/curl_setopt_ssl_servercert.pem @@ -0,0 +1,30 @@ +-----BEGIN CERTIFICATE----- +MIIFPDCCAyQCCQCU0tZADd9eXTANBgkqhkiG9w0BAQsFADBgMQswCQYDVQQGEwJV +UzELMAkGA1UECAwCVFgxFzAVBgNVBAcMDlNlcnZlcmxvY2F0aW9uMRYwFAYDVQQK +DA1TZXJ2ZXJjb21wYW55MRMwEQYDVQQDDApzZXJ2ZXJuYW1lMB4XDTIxMDYyNjE4 +NTExOFoXDTQ4MTExMDE4NTExOFowYDELMAkGA1UEBhMCVVMxCzAJBgNVBAgMAlRY +MRcwFQYDVQQHDA5TZXJ2ZXJsb2NhdGlvbjEWMBQGA1UECgwNU2VydmVyY29tcGFu +eTETMBEGA1UEAwwKc2VydmVybmFtZTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCC +AgoCggIBAJTRgAL3FYb0DwybV2vuumO+Mibm/W5CQoF9cSzHGpSdMlsjNY0KP3Gy +8lQ1MnDLv0h5dq05TIGeBGgwhZESvT64elW7gWtD+NzApxArCemq0xwKD/CR7a7B +W9s+SdV1aXilWuBzpqd/ryZVQf8sitZlqhkiVfQpk7ZrGLZh78Zn1P3qeSi9fiUA +cP2MfFajHmZypii9v42vT8uYlNHU0Ri6JVpK4aEEwqgi9fGhDCZhMVF82vIxhFkG +3rG6DWXFErJGt6MRLyhXVy3IOJhwnr3I5CwcpreePw+itnWCqAFbWqNReb0Yuk62 +HC1vdb7VjOsyuUNbZnOcq4iNqrlQ1C2gxASsipP/ne3guH8McQU+Id5V7C33QPWi +KV2A1upCG8bKPtYDESUwfK2LZAmYWN6DnoV+rIafTfOvXr+3ci75W8zO8POBCJ9X +uAXjw93QIW2C3iGSU8DAAl8dCxOAsKFzYPDgB0Zpgfi1ssduThHYYGS8Vo0HacAV +/Nx10IOJw5d9wngVnqyYfDglL0L3toWCHOQ4PTDbcRJjcdNUls7hpGrkmwZv4gx3 +zkqGZNq6qgO+KDdBBY9FybxCrCAfLTsUwdWqxdGhfap/7A416VPHcjoUFVI5GBlS +QoeIPf1sS7BhmjTmc82uCBVEe9gmp5LngtzS5G0lF/OnBOr+Oq5TAgMBAAEwDQYJ +KoZIhvcNAQELBQADggIBACSX0EXcHuxbmqCGZKZb2szQV/oORHNqcDcny+8NZ0fw +TOwWK7txmXraoSMjdOI4xM6k+kOgQ31KWjmIEbq/8zOF2zWNvVOPSmxXVqJyqjqG +rOLVDMPNFTxjlBocVaFKs8iDWbblBA1EdDDWthMoacrzgLsnc6konHvZ59dsKsEF +tUSqk8X086SQVRiFP7nzfWfeaGesbBGZ3xKaB4bDwSv+2PlzIDsxJsNZAGKqtBuQ +5cF/KOEQSNT7VfNtnynD9wCT3kcMLELUeG7qwd17HSzOPelPwp6hQhG+lRED/pQk +5bO09Uy2gqXF/ewIRYXOhP4MbW4JxzI3NBN2JTPJN4f8rGXp4K9VTrGjDwebQPLv +J/7sQxTGeUIanDiFM1b7BB7NuTGymKsiUGCkr7oy9V6LOW5OQFIN44poFjN5dacy +pWWubj2V6nSO8axJ+kzahodDmEcSPIC4rXxk5oHUcJyacRdoqDoyWKHDlBftwtyb +STNIfUfz8ipVbirjg6TKBWKPje+Ft+1D8HzTdWpi5+LYJYP1MD2TyvkzzZpdvCzI +m40j/x7RTaSlYinjthKkIjfnu/qjtWPCsmn8xonhgt4rL0VI+3lGITnVGup8gdi6 +MvH9bVZ/PIBjZv6ly3V0fy5eKC8VtjB9Ar93+PkXWAtRamIhUgx6MR3GWF0OzMP9 +-----END CERTIFICATE----- diff --git a/ext/curl/tests/curl_setopt_ssl_serverkey.pem b/ext/curl/tests/curl_setopt_ssl_serverkey.pem new file mode 100644 index 0000000000000..cef4f45843ff7 --- /dev/null +++ b/ext/curl/tests/curl_setopt_ssl_serverkey.pem @@ -0,0 +1,51 @@ +-----BEGIN RSA PRIVATE KEY----- +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 +-----END RSA PRIVATE KEY-----