]> granicus.if.org Git - php/commitdiff
Update openssl tests with new server/client test harness
authorChris Wright <daverandom@php.net>
Mon, 24 Feb 2014 14:55:17 +0000 (14:55 +0000)
committerChris Wright <daverandom@php.net>
Tue, 25 Feb 2014 16:51:50 +0000 (16:51 +0000)
26 files changed:
ext/openssl/tests/ServerClientTestCase.inc [new file with mode: 0644]
ext/openssl/tests/bug46127.phpt
ext/openssl/tests/bug48182.phpt
ext/openssl/tests/bug54992.phpt
ext/openssl/tests/bug65538_001.phpt
ext/openssl/tests/bug65538_002.phpt
ext/openssl/tests/bug65538_003.phpt
ext/openssl/tests/bug65729.phpt
ext/openssl/tests/openssl_peer_fingerprint.phpt
ext/openssl/tests/peer_verification.phpt
ext/openssl/tests/san_peer_matching.phpt
ext/openssl/tests/session_meta_capture.phpt
ext/openssl/tests/stream_crypto_flags_001.phpt
ext/openssl/tests/stream_crypto_flags_002.phpt
ext/openssl/tests/stream_crypto_flags_003.phpt
ext/openssl/tests/stream_crypto_flags_004.phpt [new file with mode: 0644]
ext/openssl/tests/stream_crypto_flags_005.phpt [deleted file]
ext/openssl/tests/stream_server_reneg_limit.phpt
ext/openssl/tests/stream_verify_host_001.phpt
ext/openssl/tests/stream_verify_host_002.phpt
ext/openssl/tests/stream_verify_host_003.phpt
ext/openssl/tests/streams_crypto_method.phpt
ext/openssl/tests/tlsv1.0_wrapper.phpt
ext/openssl/tests/tlsv1.1_wrapper.phpt
ext/openssl/tests/tlsv1.2_wrapper.phpt
ext/openssl/tests/tlsv1.2_wrapper_002.phpt

diff --git a/ext/openssl/tests/ServerClientTestCase.inc b/ext/openssl/tests/ServerClientTestCase.inc
new file mode 100644 (file)
index 0000000..03e0c2d
--- /dev/null
@@ -0,0 +1,109 @@
+<?php
+
+const WORKER_ARGV_VALUE = 'RUN_WORKER';
+
+function phpt_notify()
+{
+    ServerClientTestCase::getInstance()->notify();
+}
+
+function phpt_wait()
+{
+    ServerClientTestCase::getInstance()->wait();
+}
+
+/**
+ * This is a singleton to let the wait/notify functions work
+ * I know it's horrible, but it's a means to an end
+ */
+class ServerClientTestCase
+{
+    private $isWorker = false;
+
+    private $workerHandle;
+
+    private $workerStdIn;
+
+    private $workerStdOut;
+
+    private static $instance;
+
+    public static function getInstance($isWorker = false)
+    {
+        if (!isset(self::$instance)) {
+            self::$instance = new self($isWorker);
+        }
+
+        return self::$instance;
+    }
+
+    public function __construct($isWorker = false)
+    {
+        if (!isset(self::$instance)) {
+            self::$instance = $this;
+        }
+
+        $this->isWorker = $isWorker;
+    }
+
+    private function spawnWorkerProcess($code)
+    {
+        $cmd = sprintf('%s "%s" %s', PHP_BINARY, __FILE__, WORKER_ARGV_VALUE);
+
+        $this->workerHandle = proc_open($cmd, [['pipe', 'r'], ['pipe', 'w'], STDERR], $pipes);
+        $this->workerStdIn = $pipes[0];
+        $this->workerStdOut = $pipes[1];
+
+        fwrite($this->workerStdIn, $code . "\n---\n");
+    }
+
+    private function cleanupWorkerProcess()
+    {
+        fclose($this->workerStdIn);
+        fclose($this->workerStdOut);
+        proc_close($this->workerHandle);
+    }
+
+    private function stripPhpTagsFromCode($code)
+    {
+        return preg_replace('/^\s*<\?(?:php)?|\?>\s*$/i', '', $code);
+    }
+
+    public function runWorker()
+    {
+        $code = '';
+
+        while (1) {
+            $line = fgets(STDIN);
+
+            if (trim($line) === "---") {
+                break;
+            }
+
+            $code .= $line;
+        }
+
+        eval($code);
+    }
+
+    public function run($proc1Code, $proc2Code)
+    {
+        $this->spawnWorkerProcess($this->stripPhpTagsFromCode($proc2Code));
+        eval($this->stripPhpTagsFromCode($proc1Code));
+        $this->cleanupWorkerProcess();
+    }
+    
+    public function wait()
+    {
+        fgets($this->isWorker ? STDIN : $this->workerStdOut);
+    }
+
+    public function notify()
+    {
+        fwrite($this->isWorker ? STDOUT : $this->workerStdIn, "\n");
+    }
+}
+
+if (isset($argv[1]) && $argv[1] === WORKER_ARGV_VALUE) {
+    ServerClientTestCase::getInstance(true)->runWorker();
+}
index ef4a9be03157417bcb58816e489a99b758a38083..6a3d1a0d6c9220d569289093da524f4e3b1c67bc 100644 (file)
@@ -2,62 +2,41 @@
 #46127, openssl_sign/verify: accept different algos 
 --SKIPIF--
 <?php 
-if (!extension_loaded("openssl")) die("skip, openssl required");
-if (!extension_loaded("pcntl")) die("skip, pcntl required");
-if (OPENSSL_VERSION_NUMBER < 0x009070af) die("skip");
-?>
+if (!extension_loaded("openssl")) die("skip openssl not loaded");
+if (!function_exists("proc_open")) die("skip no proc_open");
+if (OPENSSL_VERSION_NUMBER < 0x009070af) die("skip openssl version too low");
 --FILE--
 <?php
-
-function ssl_server($port) {
-       $pem = dirname(__FILE__) . '/bug46127.pem';
-       $ssl = array(
-                       'verify_peer' => false,
-                       'verify_host' => false,
-                       'allow_self_signed' => true,
-                       'local_cert' => $pem,
-                       //              'passphrase' => '',
-                   );
-       $context = stream_context_create(array('ssl' => $ssl));
-       $sock = stream_socket_server('ssl://127.0.0.1:'.$port, $errno, $errstr, STREAM_SERVER_BIND | STREAM_SERVER_LISTEN, $context);
-       if (!$sock) return false;
-
-       $link = stream_socket_accept($sock);
-       if (!$link) return false; // bad link?
-
-       fputs($link, "Sending bug 46127\n");
-
-       // close stuff
-       fclose($link);
-       fclose($sock);
-
-       exit;
-}
-
-echo "Running bug46127\n";
-
-$port = rand(15000, 32000);
-
-$pid = pcntl_fork();
-if ($pid == 0) { // child
-       ssl_server($port);
-       exit;
-}
-
-// client or failed
-sleep(1);
-$ctx = stream_context_create(['ssl' => [
-       'verify_peer' => false,
-       'verify_host' => false
-]]);
-$sock = stream_socket_client("ssl://127.0.0.1:{$port}", $errno, $errstr, 30, STREAM_CLIENT_CONNECT, $ctx);
-if (!$sock) exit;
-
-echo fgets($sock);
-
-pcntl_waitpid($pid, $status);
-
-?>
---EXPECTF--
-Running bug46127
+$serverCode = <<<'CODE'
+    $serverUri = "ssl://127.0.0.1:64321";
+    $serverFlags = STREAM_SERVER_BIND | STREAM_SERVER_LISTEN;
+    $serverCtx = stream_context_create(['ssl' => [
+        'local_cert' => __DIR__ . '/bug46127.pem',
+    ]]);
+
+    $sock = stream_socket_server($serverUri, $errno, $errstr, $serverFlags, $serverCtx);
+    phpt_notify();
+
+    $link = stream_socket_accept($sock);
+    fwrite($link, "Sending bug 46127\n");
+CODE;
+
+$clientCode = <<<'CODE'
+    $serverUri = "ssl://127.0.0.1:64321";
+    $clientFlags = STREAM_CLIENT_CONNECT;
+
+    $clientCtx = stream_context_create(['ssl' => [
+        'verify_peer' => false,
+        'verify_host' => false
+    ]]);
+
+    phpt_wait();
+    $sock = stream_socket_client($serverUri, $errno, $errstr, 1, $clientFlags, $clientCtx);
+
+    echo fgets($sock);
+CODE;
+
+include 'ServerClientTestCase.inc';
+ServerClientTestCase::getInstance()->run($clientCode, $serverCode);
+--EXPECT--
 Sending bug 46127
index b78ce57074ff34ac7de0f4d5ad2bd0d769dd85ba..8d3f9eef4354206f67dcba18653637b87143e59a 100644 (file)
@@ -1,93 +1,49 @@
 --TEST--
-#48182,ssl handshake fails during asynchronous socket connection
+Bug #48182: ssl handshake fails during asynchronous socket connection
 --SKIPIF--
 <?php 
-if (!extension_loaded("openssl")) die("skip, openssl required");
-if (!extension_loaded("pcntl")) die("skip, pcntl required");
-if (OPENSSL_VERSION_NUMBER < 0x009070af) die("skip");
-?>
+if (!extension_loaded("openssl")) die("skip openssl not loaded");
+if (!function_exists("proc_open")) die("skip no proc_open");
+if (OPENSSL_VERSION_NUMBER < 0x009070af) die("skip openssl version too low");
 --FILE--
 <?php
+$serverCode = <<<'CODE'
+    $serverUri = "ssl://127.0.0.1:64321";
+    $serverFlags = STREAM_SERVER_BIND | STREAM_SERVER_LISTEN;
+    $serverCtx = stream_context_create(['ssl' => [
+        'local_cert' => __DIR__ . '/bug54992.pem'
+    ]]);
 
-function ssl_server($port) {
-       $host = 'ssl://127.0.0.1'.':'.$port;
-       $flags = STREAM_SERVER_BIND | STREAM_SERVER_LISTEN;
-       $data = "Sending bug48182\n";
-       $pem = dirname(__FILE__) . '/bug54992.pem';
-       $ssl_params = array( 'verify_peer' => false, 'allow_self_signed' => true, 'local_cert' => $pem);
-       $ssl = array('ssl' => $ssl_params);
+    $server = stream_socket_server($serverUri, $errno, $errstr, $serverFlags, $serverCtx);
+    phpt_notify();
 
-       $context = stream_context_create($ssl);
-       $sock = stream_socket_server($host, $errno, $errstr, $flags, $context);
-       if (!$sock) return false;
+    $client = @stream_socket_accept($server, 1);
 
-       $link = stream_socket_accept($sock);
-       if (!$link) return false; // bad link?
+    $data = "Sending bug48182\n" . fread($client, 8192);
+    fwrite($client, $data);
+CODE;
 
-       $r = array($link);
-       $w = array();
-       $e = array();
-       if (stream_select($r, $w, $e, 1, 0) != 0)
-               $data .= fread($link, 8192);
+$clientCode = <<<'CODE'
+    $serverUri = "ssl://127.0.0.1:64321";
+    $clientFlags = STREAM_CLIENT_CONNECT | STREAM_CLIENT_ASYNC_CONNECT;
+    $clientCtx = stream_context_create(['ssl' => [
+        'cafile' => __DIR__ . '/bug54992-ca.pem',
+        'CN_match' => 'bug54992.local'
+    ]]);
 
-       $r = array();
-       $w = array($link);
-       if (stream_select($r, $w, $e, 1, 0) != 0)
-               $wrote = fwrite($link, $data, strlen($data));
+    phpt_wait();
+    $client = stream_socket_client($serverUri, $errno, $errstr, 10, $clientFlags, $clientCtx);
 
-       // close stuff
-       fclose($link);
-       fclose($sock);
+    $data = "Sending data over to SSL server in async mode with contents like Hello World\n";
 
-       exit;
-}
-
-function ssl_async_client($port) {
-       $host = 'ssl://127.0.0.1'.':'.$port;
-       $flags = STREAM_CLIENT_CONNECT | STREAM_CLIENT_ASYNC_CONNECT;
-       $data = "Sending data over to SSL server in async mode with contents like Hello World\n";
-       $context = stream_context_create(array('ssl' => array(
-               'cafile' => dirname(__FILE__) . '/bug54992-ca.pem',
-               'CN_match' => 'bug54992.local'
-       )));
-       $socket = stream_socket_client($host, $errno, $errstr, 10, $flags, $context);
-       stream_set_blocking($socket, 0);
-
-       while ($socket && $data) {
-               $wrote = fwrite($socket, $data, strlen($data));
-               $data = substr($data, $wrote);
-       }
-
-       $r = array($socket);
-       $w = array();
-       $e = array();
-       if (stream_select($r, $w, $e, 1, 0) != 0) 
-       {
-               $data .= fread($socket, 1024);
-       }
-
-       echo "$data";
-
-       fclose($socket);
-}
+    fwrite($client, $data);
+    echo fread($client, 1024);
+CODE;
 
 echo "Running bug48182\n";
 
-$port = rand(15000, 32000);
-
-$pid = pcntl_fork();
-if ($pid == 0) { // child
-       ssl_server($port);
-       exit;
-}
-
-// client or failed
-sleep(1);
-ssl_async_client($port);
-
-pcntl_waitpid($pid, $status);
-
-?>
+include 'ServerClientTestCase.inc';
+ServerClientTestCase::getInstance()->run($clientCode, $serverCode);
 --EXPECTF--
 Running bug48182
 Sending bug48182
index 768b07378e3d5973633fb5dbd59672ee8ff897cc..2937faa16995fb5ad1cff0f2009f06ceea52b1ff 100644 (file)
@@ -2,37 +2,40 @@
 Bug #54992: Stream not closed and error not returned when SSL CN_match fails
 --SKIPIF--
 <?php 
-if (!extension_loaded("openssl")) die("skip");
-if (!function_exists('pcntl_fork')) die("skip no fork");
+if (!extension_loaded("openssl")) die("skip openssl not loaded");
+if (!function_exists("proc_open")) die("skip no proc_open");
 --FILE--
 <?php
-$context = stream_context_create();
-
-stream_context_set_option($context, 'ssl', 'local_cert', __DIR__ . "/bug54992.pem");
-stream_context_set_option($context, 'ssl', 'allow_self_signed', true);
-$server = stream_socket_server('ssl://127.0.0.1:64321', $errno, $errstr,
-       STREAM_SERVER_BIND|STREAM_SERVER_LISTEN, $context);
-
-
-$pid = pcntl_fork();
-if ($pid == -1) {
-       die('could not fork');
-} else if ($pid) {
-       $contextC = stream_context_create(
-               array(
-                       'ssl' => array(
-                               'verify_peer'           => true,
-                               'cafile'                => __DIR__ . '/bug54992-ca.pem',
-                               'CN_match'              => 'buga_buga',
-                       )
-               )
-       );
-       var_dump(stream_socket_client("ssl://127.0.0.1:64321", $errno, $errstr, 1,
-               STREAM_CLIENT_CONNECT, $contextC));
-} else {       
-       @pcntl_wait($status);
-       @stream_socket_accept($server, 1);
-}
+$serverCode = <<<'CODE'
+    $serverUri = "ssl://127.0.0.1:64321";
+    $serverFlags = STREAM_SERVER_BIND | STREAM_SERVER_LISTEN;
+    $serverCtx = stream_context_create(['ssl' => [
+        'local_cert' => __DIR__ . '/bug54992.pem',
+    ]]);
+
+    $server = stream_socket_server($serverUri, $errno, $errstr, $serverFlags, $serverCtx);
+    phpt_notify();
+
+    @stream_socket_accept($server, 1);
+CODE;
+
+$clientCode = <<<'CODE'
+    $serverUri = "ssl://127.0.0.1:64321";
+    $clientFlags = STREAM_CLIENT_CONNECT;
+    $clientCtx = stream_context_create(['ssl' => [
+        'verify_peer' => true,
+        'cafile' => __DIR__ . '/bug54992-ca.pem',
+        'CN_match' => 'buga_buga',
+    ]]);
+
+    phpt_wait();
+    $client = stream_socket_client($serverUri, $errno, $errstr, 1, $clientFlags, $clientCtx);
+
+    var_dump($client);
+CODE;
+
+include 'ServerClientTestCase.inc';
+ServerClientTestCase::getInstance()->run($clientCode, $serverCode);
 --EXPECTF--
 Warning: stream_socket_client(): Peer certificate CN=`bug54992.local' did not match expected CN=`buga_buga' in %s on line %d
 
index 45a020373116ea3149aa7c243a4336a99109b554..ea7d6f4d8d35b649d9a1e2a690161288e1c9817b 100644 (file)
@@ -1,51 +1,52 @@
 --TEST--
-Bug #65538 SSL context "cafile" supports stream wrappers
+Bug #65538: SSL context "cafile" supports stream wrappers
 --SKIPIF--
 <?php
-if (!extension_loaded('openssl')) die('skip, openssl required');
-if (!extension_loaded('pcntl')) die('skip, pcntl required');
-?>
+if (!extension_loaded("openssl")) die("skip openssl not loaded");
+if (!function_exists("proc_open")) die("skip no proc_open");
 --FILE--
 <?php
-$serverCtx = stream_context_create(['ssl' => [
-       'local_cert' => __DIR__ . '/bug54992.pem'
-]]);
-$serverFlags = STREAM_SERVER_BIND | STREAM_SERVER_LISTEN;
-$server = stream_socket_server('ssl://127.0.0.1:64321', $errno, $errstr, $serverFlags, $serverCtx);
+$serverCode = <<<'CODE'
+    $serverUri = "ssl://127.0.0.1:64321";
+    $serverFlags = STREAM_SERVER_BIND | STREAM_SERVER_LISTEN;
+    $serverCtx = stream_context_create(['ssl' => [
+        'local_cert' => __DIR__ . '/bug54992.pem',
+    ]]);
 
-$pid = pcntl_fork();
+    $server = stream_socket_server($serverUri, $errno, $errstr, $serverFlags, $serverCtx);
+    phpt_notify();
 
-if ($pid == -1) {
-       die('could not fork');
-} else if ($pid) {
-       $clientCtx = stream_context_create(['ssl' => [
-                       'cafile' => 'file://' . __DIR__ . '/bug54992-ca.pem',
-                       'CN_match' => 'bug54992.local'
-       ]]);
-       $html = file_get_contents('https://127.0.0.1:64321', false, $clientCtx);
-       var_dump($html);
-} else {
-       @pcntl_wait($status);
+    $client = @stream_socket_accept($server);
+    if ($client) {
+        $in = '';
+        while (!preg_match('/\r?\n\r?\n/', $in)) {
+            $in .= fread($client, 2048);
+        }
+        $response = "HTTP/1.0 200 OK\r\n"
+                  . "Content-Type: text/plain\r\n"
+                  . "Content-Length: 12\r\n"
+                  . "Connection: close\r\n"
+                  . "\r\n"
+                  . "Hello World!";
+        fwrite($client, $response);
+        fclose($client);
+    }
+CODE;
 
-       $client = @stream_socket_accept($server);
-       if ($client) {
-               $in = '';
-               while (!preg_match('/\r?\n\r?\n/', $in)) {
-                       $in .= fread($client, 2048);
-               }
-               $response = <<<EOS
-HTTP/1.0 200 OK
-Content-Type: text/plain
-Content-Length: 12
-Connection: close
+$clientCode = <<<'CODE'
+    $serverUri = "https://127.0.0.1:64321/";
+    $clientCtx = stream_context_create(['ssl' => [
+        'cafile' => 'file://' . __DIR__ . '/bug54992-ca.pem',
+        'CN_match' => 'bug54992.local',
+    ]]);
 
-Hello World!
-EOS;
+    phpt_wait();
+    $html = file_get_contents($serverUri, false, $clientCtx);
 
-               fwrite($client, $response);
-               fclose($client);
-       }
-}
-?>
---EXPECTF--
+    var_dump($html);
+CODE;
+
+include 'ServerClientTestCase.inc';
+ServerClientTestCase::getInstance()->run($clientCode, $serverCode);
+--EXPECT--
 string(12) "Hello World!"
index 05c2f0a26a628099a0334941c6031e62262965a6..760b720e73f96d81426bbce10f528b3be4b3e054 100644 (file)
@@ -1,17 +1,14 @@
 --TEST--
-Bug #65538 SSL context "cafile" disallows URL stream wrappers
+Bug #65538: SSL context "cafile" disallows URL stream wrappers
 --SKIPIF--
 <?php
 if (!extension_loaded('openssl')) die('skip, openssl required');
-if (!extension_loaded('pcntl')) die('skip, pcntl required');
-?>
 --FILE--
 <?php
 $clientCtx = stream_context_create(['ssl' => [
-       'cafile' => 'http://curl.haxx.se/ca/cacert.pem'
+    'cafile' => 'http://curl.haxx.se/ca/cacert.pem'
 ]]);
 file_get_contents('https://github.com', false, $clientCtx);
-?>
 --EXPECTF--
 Warning: remote cafile streams are disabled for security purposes in %s on line %d
 
index c522d029b5728b0c0647631d4d29e908f0904245..b927e4ed854c406e2c17b2dbe6a27507fce950bd 100644 (file)
@@ -1,52 +1,53 @@
 --TEST--
-Bug #65538 SSL context "cafile" supports phar wrapper
+Bug #65538: SSL context "cafile" supports phar wrapper
 --SKIPIF--
 <?php
-if (!extension_loaded('openssl')) die('skip, openssl required');
-if (!extension_loaded('pcntl')) die('skip, pcntl required');
-if (!extension_loaded('phar')) die('skip, phar required');
-?>
+if (!extension_loaded("openssl")) die("skip openssl not loaded");
+if (!extension_loaded("phar")) die("skip phar not loaded");
+if (!function_exists("proc_open")) die("skip no proc_open");
 --FILE--
 <?php
-$serverCtx = stream_context_create(['ssl' => [
-       'local_cert' => __DIR__ . '/bug54992.pem'
-]]);
-$serverFlags = STREAM_SERVER_BIND | STREAM_SERVER_LISTEN;
-$server = stream_socket_server('ssl://127.0.0.1:64321', $errno, $errstr, $serverFlags, $serverCtx);
+$serverCode = <<<'CODE'
+    $serverUri = "ssl://127.0.0.1:64321";
+    $serverFlags = STREAM_SERVER_BIND | STREAM_SERVER_LISTEN;
+    $serverCtx = stream_context_create(['ssl' => [
+        'local_cert' => __DIR__ . '/bug54992.pem',
+    ]]);
 
-$pid = pcntl_fork();
+    $server = stream_socket_server($serverUri, $errno, $errstr, $serverFlags, $serverCtx);
+    phpt_notify();
 
-if ($pid == -1) {
-       die('could not fork');
-} else if ($pid) {
-       $clientCtx = stream_context_create(['ssl' => [
-                       'cafile' => 'phar://' . __DIR__ . '/bug65538.phar/bug54992-ca.pem',
-                       'CN_match' => 'bug54992.local'
-       ]]);
-       $html = file_get_contents('https://127.0.0.1:64321', false, $clientCtx);
-       var_dump($html);
-} else {
-       @pcntl_wait($status);
+    $client = @stream_socket_accept($server);
+    if ($client) {
+        $in = '';
+        while (!preg_match('/\r?\n\r?\n/', $in)) {
+            $in .= fread($client, 2048);
+        }
+        $response = "HTTP/1.0 200 OK\r\n"
+                  . "Content-Type: text/plain\r\n"
+                  . "Content-Length: 12\r\n"
+                  . "Connection: close\r\n"
+                  . "\r\n"
+                  . "Hello World!";
+        fwrite($client, $response);
+        fclose($client);
+    }
+CODE;
 
-       $client = @stream_socket_accept($server);
-       if ($client) {
-               $in = '';
-               while (!preg_match('/\r?\n\r?\n/', $in)) {
-                       $in .= fread($client, 2048);
-               }
-               $response = <<<EOS
-HTTP/1.0 200 OK
-Content-Type: text/plain
-Content-Length: 12
-Connection: close
+$clientCode = <<<'CODE'
+    $serverUri = "https://127.0.0.1:64321/";
+    $clientCtx = stream_context_create(['ssl' => [
+        'cafile' => 'phar://' . __DIR__ . '/bug65538.phar/bug54992-ca.pem',
+        'CN_match' => 'bug54992.local',
+    ]]);
 
-Hello World!
-EOS;
+    phpt_wait();
+    $html = file_get_contents($serverUri, false, $clientCtx);
 
-               fwrite($client, $response);
-               fclose($client);
-       }
-}
-?>
+    var_dump($html);
+CODE;
+
+include 'ServerClientTestCase.inc';
+ServerClientTestCase::getInstance()->run($clientCode, $serverCode);
 --EXPECTF--
 string(12) "Hello World!"
index c0ee4443ebee587e6e8bc72bad6d20dd04564f44..e27dbb9c93d3c795b819c02b672266e996232baa 100644 (file)
@@ -2,40 +2,46 @@
 Bug #65729: CN_match gives false positive when wildcard is used
 --SKIPIF--
 <?php 
-if (!extension_loaded("openssl")) die("skip");
-if (!function_exists('pcntl_fork')) die("skip no fork");
+if (!extension_loaded("openssl")) die("skip openssl not loaded");
+if (!function_exists("proc_open")) die("skip no proc_open");
 --FILE--
 <?php
-$context = stream_context_create();
-
-stream_context_set_option($context, 'ssl', 'local_cert', __DIR__ . "/bug65729.pem");
-stream_context_set_option($context, 'ssl', 'allow_self_signed', true);
-$server = stream_socket_server('ssl://127.0.0.1:64321', $errno, $errstr,
-       STREAM_SERVER_BIND|STREAM_SERVER_LISTEN, $context);
-
-$expected_names = array('foo.test.com.sg', 'foo.test.com', 'FOO.TEST.COM', 'foo.bar.test.com');
-
-$pid = pcntl_fork();
-if ($pid == -1) {
-       die('could not fork');
-} else if ($pid) {
-       foreach ($expected_names as $expected_name) {
-               $contextC = stream_context_create(array(
-                       'ssl' => array(
-                               'verify_peer'           => true,
-                               'allow_self_signed'     => true,
-                               'CN_match'              => $expected_name,
-                       )
-               ));
-               var_dump(stream_socket_client("ssl://127.0.0.1:64321", $errno, $errstr, 1,
-               STREAM_CLIENT_CONNECT, $contextC));
-       }
-} else {       
-       @pcntl_wait($status);
-       foreach ($expected_names as $name) {
-               @stream_socket_accept($server, 1);
-       }
-}
+$serverCode = <<<'CODE'
+    $serverUri = "ssl://127.0.0.1:64321";
+    $serverFlags = STREAM_SERVER_BIND | STREAM_SERVER_LISTEN;
+    $serverCtx = stream_context_create(['ssl' => [
+        'local_cert' => __DIR__ . '/bug65729.pem'
+    ]]);
+
+    $server = stream_socket_server($serverUri, $errno, $errstr, $serverFlags, $serverCtx);
+    phpt_notify();
+
+    $expected_names = ['foo.test.com.sg', 'foo.test.com', 'FOO.TEST.COM', 'foo.bar.test.com'];
+    foreach ($expected_names as $name) {
+        @stream_socket_accept($server, 1);
+    }
+CODE;
+
+$clientCode = <<<'CODE'
+    $serverUri = "ssl://127.0.0.1:64321";
+    $clientFlags = STREAM_CLIENT_CONNECT;
+
+    phpt_wait();
+
+    $expected_names = ['foo.test.com.sg', 'foo.test.com', 'FOO.TEST.COM', 'foo.bar.test.com'];
+    foreach ($expected_names as $expected_name) {
+        $clientCtx = stream_context_create(['ssl' => [
+            'verify_peer'       => true,
+            'allow_self_signed'    => true,
+            'CN_match'          => $expected_name,
+        ]]);
+
+        var_dump(stream_socket_client($serverUri, $errno, $errstr, 1, $clientFlags, $clientCtx));
+    }
+CODE;
+
+include 'ServerClientTestCase.inc';
+ServerClientTestCase::getInstance()->run($clientCode, $serverCode);
 --EXPECTF--
 Warning: stream_socket_client(): Peer certificate CN=`*.test.com' did not match expected CN=`foo.test.com.sg' in %s on line %d
 
index 2e4c192c03b825d422869093ab7dd8ed317fe3f8..5390c492eeff5e784304eacf303fb87335483e92 100644 (file)
@@ -2,58 +2,48 @@
 Testing peer fingerprint on connection
 --SKIPIF--
 <?php 
-if (!extension_loaded("openssl")) die("skip");
-if (!function_exists('pcntl_fork')) die("skip no fork");
+if (!extension_loaded("openssl")) die("skip openssl not loaded");
+if (!function_exists("proc_open")) die("skip no proc_open");
 --FILE--
 <?php
-$context = stream_context_create();
+$serverCode = <<<'CODE'
+    $serverUri = "ssl://127.0.0.1:64321";
+    $serverFlags = STREAM_SERVER_BIND | STREAM_SERVER_LISTEN;
+    $serverCtx = stream_context_create(['ssl' => [
+        'local_cert' => __DIR__ . '/bug54992.pem'
+    ]]);
 
-stream_context_set_option($context, 'ssl', 'local_cert', __DIR__ . "/bug54992.pem");
-stream_context_set_option($context, 'ssl', 'allow_self_signed', true);
-$server = stream_socket_server('ssl://127.0.0.1:64321', $errno, $errstr,
-       STREAM_SERVER_BIND|STREAM_SERVER_LISTEN, $context);
+    $server = stream_socket_server($serverUri, $errno, $errstr, $serverFlags, $serverCtx);
+    phpt_notify();
 
+    @stream_socket_accept($server, 1);
+    @stream_socket_accept($server, 1);
+CODE;
 
-$pid = pcntl_fork();
-if ($pid == -1) {
-       die('could not fork');
-} else if ($pid) {
-       $contextC = stream_context_create(
-               array(
-                       'ssl' => array(
-                               'verify_peer'           => true,
-                               'cafile'                => __DIR__ . '/bug54992-ca.pem',
-                               'capture_peer_cert'     => true,
-                               'CN_match'              => 'bug54992.local',
-                               'peer_fingerprint'      => '81cafc260aa8d82956ebc6212a362ece',
-                       )
-               )
-       );
-       // should be: 81cafc260aa8d82956ebc6212a362ecc
-       var_dump(stream_socket_client("ssl://127.0.0.1:64321", $errno, $errstr, 1,
-               STREAM_CLIENT_CONNECT, $contextC));
+$clientCode = <<<'CODE'
+    $serverUri = "ssl://127.0.0.1:64321";
+    $clientFlags = STREAM_CLIENT_CONNECT;
+    $clientCtx = stream_context_create(['ssl' => [
+        'verify_peer'       => true,
+        'cafile'            => __DIR__ . '/bug54992-ca.pem',
+        'capture_peer_cert'    => true,
+        'CN_match'          => 'bug54992.local',
+    ]]);
 
-       $contextC = stream_context_create(
-               array(
-                       'ssl' => array(
-                               'verify_peer'           => true,
-                               'cafile'                => __DIR__ . '/bug54992-ca.pem',
-                               'capture_peer_cert'     => true,
-                               'CN_match'              => 'bug54992.local',
-                               'peer_fingerprint'      => array(
-                                       'sha256' => '78ea579f2c3b439359dec5dac9d445108772927427c4780037e87df3799a0aa0',
-                               ),
-                       )
-               )
-       );
+    phpt_wait();
 
-       var_dump(stream_socket_client("ssl://127.0.0.1:64321", $errno, $errstr, 1,
-               STREAM_CLIENT_CONNECT, $contextC));
-} else {
-       @pcntl_wait($status);
-       @stream_socket_accept($server, 1);
-       @stream_socket_accept($server, 1);
-}
+    // should be: 81cafc260aa8d82956ebc6212a362ecc
+    stream_context_set_option($clientCtx, 'ssl', 'peer_fingerprint', '81cafc260aa8d82956ebc6212a362ece');
+    var_dump(stream_socket_client($serverUri, $errno, $errstr, 1, $clientFlags, $clientCtx));
+
+    stream_context_set_option($clientCtx, 'ssl', 'peer_fingerprint', [
+        'sha256' => '78ea579f2c3b439359dec5dac9d445108772927427c4780037e87df3799a0aa0',
+    ]);
+    var_dump(stream_socket_client($serverUri, $errno, $errstr, 1, $clientFlags, $clientCtx));
+CODE;
+
+include 'ServerClientTestCase.inc';
+ServerClientTestCase::getInstance()->run($clientCode, $serverCode);
 --EXPECTF--
 Warning: stream_socket_client(): Peer fingerprint doesn't match in %s on line %d
 
index b19012a9b8b0f7366cb245b9efbf5a2b8a36ecd1..3eff6289b4b44565494f45a23838fc0ea8111e32 100644 (file)
@@ -2,55 +2,65 @@
 Peer verification enabled for client streams
 --SKIPIF--
 <?php 
-if (!extension_loaded("openssl")) die("skip");
-if (!function_exists('pcntl_fork')) die("skip no fork");
+if (!extension_loaded("openssl")) die("skip openssl not loaded");
+if (!function_exists("proc_open")) die("skip no proc_open");
 --FILE--
 <?php
-$flags = STREAM_SERVER_BIND | STREAM_SERVER_LISTEN;
-$ctx = stream_context_create(['ssl' => [
-       'local_cert' => __DIR__ . '/bug54992.pem',
-       'allow_self_signed' => true
-]]);
-$server = stream_socket_server('ssl://127.0.0.1:64321', $errno, $errstr, $flags, $ctx);
-
-$pid = pcntl_fork();
-if ($pid == -1) {
-       die('could not fork');
-} else if ($pid) {
-       // Expected to fail -- no CA File present
-       var_dump(@stream_socket_client("ssl://127.0.0.1:64321", $errno, $errstr, 1, STREAM_CLIENT_CONNECT));
-       
-       // Expected to fail -- no CA File present
-       $ctx = stream_context_create(['ssl' => ['verify_peer' => true]]);
-       var_dump(@stream_socket_client("ssl://127.0.0.1:64321", $errno, $errstr, 1, STREAM_CLIENT_CONNECT, $ctx));
-       
-       // Should succeed with peer verification disabled in context
-       $ctx = stream_context_create(['ssl' => [
-               'verify_peer' => false,
-               'verify_host' => false
-       ]]);
-       var_dump(stream_socket_client("ssl://127.0.0.1:64321", $errno, $errstr, 1, STREAM_CLIENT_CONNECT, $ctx));
-
-       // Should succeed with CA file specified in context
-       $ctx = stream_context_create(['ssl' => [
-               'cafile' => __DIR__ . '/bug54992-ca.pem',
-               'CN_match' => 'bug54992.local',
-       ]]);
-       var_dump(stream_socket_client("ssl://127.0.0.1:64321", $errno, $errstr, 1, STREAM_CLIENT_CONNECT, $ctx));
-
-       // Should succeed with globally available CA file specified via php.ini
-       $cafile = __DIR__ . '/bug54992-ca.pem';
-       ini_set('openssl.cafile', $cafile);
-       var_dump(stream_socket_client("ssl://127.0.0.1:64321", $errno, $errstr, 1, STREAM_CLIENT_CONNECT, $ctx));
-
-} else {       
-       @pcntl_wait($status);
-       @stream_socket_accept($server, 3);
-       @stream_socket_accept($server, 3);
-       @stream_socket_accept($server, 3);
-       @stream_socket_accept($server, 3);
-       @stream_socket_accept($server, 3);
-}
+$serverCode = <<<'CODE'
+    $serverUri = "ssl://127.0.0.1:64321";
+    $serverFlags = STREAM_SERVER_BIND | STREAM_SERVER_LISTEN;
+    $serverCtx = stream_context_create(['ssl' => [
+        'local_cert' => __DIR__ . '/bug54992.pem'
+    ]]);
+
+    $server = stream_socket_server($serverUri, $errno, $errstr, $serverFlags, $serverCtx);
+    phpt_notify();
+
+    for ($i = 0; $i < 5; $i++) {
+        @stream_socket_accept($server, 1);
+    }
+CODE;
+
+$clientCode = <<<'CODE'
+    $serverUri = "ssl://127.0.0.1:64321";
+    $clientFlags = STREAM_CLIENT_CONNECT;
+    $caFile = __DIR__ . '/bug54992-ca.pem';
+
+    phpt_wait();
+
+    // Expected to fail -- untrusted server cert and no CA File present
+    var_dump(@stream_socket_client($serverUri, $errno, $errstr, 1, $clientFlags));
+
+    // Expected to fail -- untrusted server cert and no CA File present
+    $clientCtx = stream_context_create(['ssl' => [
+        'verify_peer' => true,
+    ]]);
+    var_dump(@stream_socket_client($serverUri, $errno, $errstr, 1, $clientFlags, $clientCtx));
+
+    // Should succeed with peer verification disabled in context
+    $clientCtx = stream_context_create(['ssl' => [
+        'verify_peer' => false,
+        'verify_host' => false,
+    ]]);
+    var_dump(stream_socket_client($serverUri, $errno, $errstr, 1, $clientFlags, $clientCtx));
+
+    // Should succeed with CA file specified in context
+    $clientCtx = stream_context_create(['ssl' => [
+        'cafile'   => $caFile,
+        'CN_match' => 'bug54992.local',
+    ]]);
+    var_dump(stream_socket_client($serverUri, $errno, $errstr, 1, $clientFlags, $clientCtx));
+
+    // Should succeed with globally available CA file specified via php.ini
+    ini_set('openssl.cafile', $caFile);
+    $clientCtx = stream_context_create(['ssl' => [
+        'CN_match' => 'bug54992.local',
+    ]]);
+    var_dump(stream_socket_client($serverUri, $errno, $errstr, 1, $clientFlags, $clientCtx));
+CODE;
+
+include 'ServerClientTestCase.inc';
+ServerClientTestCase::getInstance()->run($clientCode, $serverCode);
 --EXPECTF--
 bool(false)
 bool(false)
index 4e6531d6cc6b6b44bc22fb92f0eb997aa127c161..3fa479ea13450c35272499e288dc9ab2b35e5bcc 100644 (file)
@@ -2,53 +2,43 @@
 Peer verification matches SAN names
 --SKIPIF--
 <?php 
-if (!extension_loaded("openssl")) die("skip");
-if (!function_exists('pcntl_fork')) die("skip no fork");
+if (!extension_loaded("openssl")) die("skip openssl not loaded");
+if (!function_exists("proc_open")) die("skip no proc_open");
 --FILE--
 <?php
-$context = stream_context_create(array(
-       'ssl' => array(
-               'local_cert' => __DIR__ . '/san-cert.pem',
-               'allow_self_signed' => true,
-       ),
-));
-
-$server = stream_socket_server('ssl://127.0.0.1:64321', $errno, $errstr,
-       STREAM_SERVER_BIND|STREAM_SERVER_LISTEN, $context);
-
-
-$pid = pcntl_fork();
-if ($pid == -1) {
-       die('could not fork');
-} else if ($pid) {
-       $contextC = stream_context_create(
-               array(
-                       'ssl' => array(
-                               'verify_peer' => true,
-                               'cafile' => __DIR__ . '/san-ca.pem',
-                               'CN_match' => 'example.org',
-                       )
-               )
-       );
-       var_dump(stream_socket_client("ssl://127.0.0.1:64321", $errno, $errstr, 1,
-               STREAM_CLIENT_CONNECT, $contextC));
-
-       $contextC = stream_context_create(array(
-               'ssl' => array(
-                       'verify_peer' => true,
-                       'cafile' => __DIR__ . '/san-ca.pem',
-                       'CN_match' => 'moar.example.org',
-               )
-       ));
-
-       var_dump(stream_socket_client("ssl://127.0.0.1:64321", $errno, $errstr, 1,
-                STREAM_CLIENT_CONNECT, $contextC));
-
-} else {       
-       @pcntl_wait($status);
-       @stream_socket_accept($server, 1);
-       @stream_socket_accept($server, 1);
-}
+$serverCode = <<<'CODE'
+    $serverUri = "ssl://127.0.0.1:64321";
+    $serverFlags = STREAM_SERVER_BIND | STREAM_SERVER_LISTEN;
+    $serverCtx = stream_context_create(['ssl' => [
+        'local_cert' => __DIR__ . '/san-cert.pem',
+    ]]);
+
+    $server = stream_socket_server($serverUri, $errno, $errstr, $serverFlags, $serverCtx);
+    phpt_notify();
+
+    @stream_socket_accept($server, 1);
+    @stream_socket_accept($server, 1);
+CODE;
+
+$clientCode = <<<'CODE'
+    $serverUri = "ssl://127.0.0.1:64321";
+    $clientFlags = STREAM_CLIENT_CONNECT;
+    $clientCtx = stream_context_create(['ssl' => [
+        'verify_peer' => false,
+        'cafile' => __DIR__ . '/san-ca.pem',
+    ]]);
+
+    phpt_wait();
+
+    stream_context_set_option($clientCtx, 'ssl', 'CN_match', 'example.org');
+    var_dump(stream_socket_client($serverUri, $errno, $errstr, 1, $clientFlags, $clientCtx));
+
+    stream_context_set_option($clientCtx, 'ssl', 'CN_match', 'moar.example.org');
+    var_dump(stream_socket_client($serverUri, $errno, $errstr, 1, $clientFlags, $clientCtx));
+CODE;
+
+include 'ServerClientTestCase.inc';
+ServerClientTestCase::getInstance()->run($clientCode, $serverCode);
 --EXPECTF--
 resource(%d) of type (stream)
 
index 8ef0f873c9a300afcca3610d3c502683481bf997..3b2a80446fd8794dccc88cdf8b182adac0f5daaf 100644 (file)
@@ -2,70 +2,62 @@
 Capture SSL session meta array in stream context
 --SKIPIF--
 <?php
-if (!extension_loaded("openssl")) die("skip");
-if (!function_exists('pcntl_fork')) die("skip no fork");
+if (!extension_loaded("openssl")) die("skip openssl not loaded");
+if (!function_exists("proc_open")) die("skip no proc_open");
 if (OPENSSL_VERSION_NUMBER < 0x10001001) die("skip OpenSSLv1.0.1 required");
 --FILE--
 <?php
-$flags = STREAM_SERVER_BIND | STREAM_SERVER_LISTEN;
-$ctx = stream_context_create(['ssl' => [
-    'local_cert' => __DIR__ . '/bug54992.pem',
-    'allow_self_signed' => true
-]]);
-$server = stream_socket_server('ssl://127.0.0.1:64321', $errno, $errstr, $flags, $ctx);
+$serverCode = <<<'CODE'
+    $serverUri = "ssl://127.0.0.1:64321";
+    $serverFlags = STREAM_SERVER_BIND | STREAM_SERVER_LISTEN;
+    $serverCtx = stream_context_create(['ssl' => [
+        'local_cert' => __DIR__ . '/bug54992.pem'
+    ]]);
 
-$pid = pcntl_fork();
-if ($pid == -1) {
-    die('could not fork');
-} else if ($pid) {
+    $server = stream_socket_server($serverUri, $errno, $errstr, $serverFlags, $serverCtx);
+    phpt_notify();
 
-    // Base SSL context values
-    $sslCtxVars = array(
-        'verify_peer' => TRUE,
+    @stream_socket_accept($server, 1);
+    @stream_socket_accept($server, 1);
+    @stream_socket_accept($server, 1);
+    @stream_socket_accept($server, 1);
+CODE;
+
+$clientCode = <<<'CODE'
+    $serverUri = "ssl://127.0.0.1:64321";
+    $clientFlags = STREAM_CLIENT_CONNECT;
+    $clientCtx = stream_context_create(['ssl' => [
+        'verify_peer' => true,
         'cafile' => __DIR__ . '/bug54992-ca.pem',
-        'CN_match' => 'bug54992.local', // common name from the server's "local_cert" PEM file
-        'capture_session_meta' => TRUE
-    );
+        'CN_match' => 'bug54992.local',
+        'capture_session_meta' => true,
+    ]]);
 
-    // SSLv3
-    $ctxCopy = $sslCtxVars;
-    $ctxCopy['crypto_method'] = STREAM_CRYPTO_METHOD_SSLv3_CLIENT;
-    $ctx = stream_context_create(array('ssl' => $ctxCopy));
-    stream_socket_client("ssl://127.0.0.1:64321", $errno, $errstr, 1, STREAM_CLIENT_CONNECT, $ctx);
-    $meta = stream_context_get_options($ctx)['ssl']['session_meta'];
+    phpt_wait();
+
+    stream_context_set_option($clientCtx, 'ssl', 'crypto_method', STREAM_CRYPTO_METHOD_SSLv3_CLIENT);
+    stream_socket_client($serverUri, $errno, $errstr, 1, $clientFlags, $clientCtx);
+    $meta = stream_context_get_options($clientCtx)['ssl']['session_meta'];
     var_dump($meta['protocol']);
 
-    // TLSv1
-    $ctxCopy = $sslCtxVars;
-    $ctxCopy['crypto_method'] = STREAM_CRYPTO_METHOD_TLSv1_0_CLIENT;
-    $ctx = stream_context_create(array('ssl' => $ctxCopy));
-    stream_socket_client("ssl://127.0.0.1:64321", $errno, $errstr, 1, STREAM_CLIENT_CONNECT, $ctx);
-    $meta = stream_context_get_options($ctx)['ssl']['session_meta'];
+    stream_context_set_option($clientCtx, 'ssl', 'crypto_method', STREAM_CRYPTO_METHOD_TLSv1_0_CLIENT);
+    stream_socket_client($serverUri, $errno, $errstr, 1, $clientFlags, $clientCtx);
+    $meta = stream_context_get_options($clientCtx)['ssl']['session_meta'];
     var_dump($meta['protocol']);
 
-    // TLSv1.1
-    $ctxCopy = $sslCtxVars;
-    $ctxCopy['crypto_method'] = STREAM_CRYPTO_METHOD_TLSv1_1_CLIENT;
-    $ctx = stream_context_create(array('ssl' => $ctxCopy));
-    stream_socket_client("ssl://127.0.0.1:64321", $errno, $errstr, 1, STREAM_CLIENT_CONNECT, $ctx);
-    $meta = stream_context_get_options($ctx)['ssl']['session_meta'];
+    stream_context_set_option($clientCtx, 'ssl', 'crypto_method', STREAM_CRYPTO_METHOD_TLSv1_1_CLIENT);
+    stream_socket_client($serverUri, $errno, $errstr, 1, $clientFlags, $clientCtx);
+    $meta = stream_context_get_options($clientCtx)['ssl']['session_meta'];
     var_dump($meta['protocol']);
 
-    // TLSv1.2
-    $ctxCopy = $sslCtxVars;
-    $ctxCopy['crypto_method'] = STREAM_CRYPTO_METHOD_TLSv1_2_CLIENT;
-    $ctx = stream_context_create(array('ssl' => $ctxCopy));
-    stream_socket_client("ssl://127.0.0.1:64321", $errno, $errstr, 1, STREAM_CLIENT_CONNECT, $ctx);
-    $meta = stream_context_get_options($ctx)['ssl']['session_meta'];
+    stream_context_set_option($clientCtx, 'ssl', 'crypto_method', STREAM_CRYPTO_METHOD_TLSv1_2_CLIENT);
+    stream_socket_client($serverUri, $errno, $errstr, 1, $clientFlags, $clientCtx);
+    $meta = stream_context_get_options($clientCtx)['ssl']['session_meta'];
     var_dump($meta['protocol']);
+CODE;
 
-} else {
-    @pcntl_wait($status);
-    @stream_socket_accept($server, 1);
-    @stream_socket_accept($server, 1);
-    @stream_socket_accept($server, 1);
-    @stream_socket_accept($server, 1);
-}
+include 'ServerClientTestCase.inc';
+ServerClientTestCase::getInstance()->run($clientCode, $serverCode);
 --EXPECTF--
 string(5) "SSLv3"
 string(5) "TLSv1"
index 6e3c69b401d5a1fe5dd37f53066005c88d7708d9..b9a49f9ac2059fe751e945d709c2ca166af4a35a 100644 (file)
@@ -2,57 +2,49 @@
 Basic bitwise stream crypto context flag assignment
 --SKIPIF--
 <?php
-if (!extension_loaded("openssl")) die("skip");
-if (!function_exists('pcntl_fork')) die("skip no fork");
+if (!extension_loaded("openssl")) die("skip openssl not loaded");
+if (!function_exists("proc_open")) die("skip no proc_open");
 --FILE--
 <?php
-$flags = STREAM_SERVER_BIND | STREAM_SERVER_LISTEN;
-$ctx = stream_context_create(['ssl' => [
-    'local_cert' => __DIR__ . '/bug54992.pem',
-    'allow_self_signed' => true
-]]);
-$server = stream_socket_server('ssl://127.0.0.1:64321', $errno, $errstr, $flags, $ctx);
-var_dump($server);
-
-$pid = pcntl_fork();
-if ($pid == -1) {
-    die('could not fork');
-} else if ($pid) {
-
-    // Base SSL context values
-    $sslCtxVars = array(
-        'verify_peer' => TRUE,
-        'cafile' => __DIR__ . '/bug54992-ca.pem',
-        'CN_match' => 'bug54992.local', // common name from the server's "local_cert" PEM file
-    );
-
-    // SSLv3
-    $ctxCopy = $sslCtxVars;
-    $ctxCopy['crypto_method'] = STREAM_CRYPTO_METHOD_SSLv3_CLIENT;
-    $ctx = stream_context_create(array('ssl' => $ctxCopy));
-    var_dump(stream_socket_client("ssl://127.0.0.1:64321", $errno, $errstr, 1, STREAM_CLIENT_CONNECT, $ctx));
-
-    // TLSv1
-    $ctxCopy = $sslCtxVars;
-    $ctxCopy['crypto_method'] = STREAM_CRYPTO_METHOD_TLSv1_0_CLIENT;
-    $ctx = stream_context_create(array('ssl' => $ctxCopy));
-    var_dump(stream_socket_client("ssl://127.0.0.1:64321", $errno, $errstr, 1, STREAM_CLIENT_CONNECT, $ctx));
-
-    // TLS (any)
-    $ctxCopy = $sslCtxVars;
-    $ctxCopy['crypto_method'] = STREAM_CRYPTO_METHOD_TLS_CLIENT;
-    $ctx = stream_context_create(array('ssl' => $ctxCopy));
-    var_dump(stream_socket_client("ssl://127.0.0.1:64321", $errno, $errstr, 1, STREAM_CLIENT_CONNECT, $ctx));
-
-} else {
-    @pcntl_wait($status);
+$serverCode = <<<'CODE'
+    $serverUri = "ssl://127.0.0.1:64321";
+    $serverFlags = STREAM_SERVER_BIND | STREAM_SERVER_LISTEN;
+    $serverCtx = stream_context_create(['ssl' => [
+        'local_cert' => __DIR__ . '/bug54992.pem'
+    ]]);
+
+    $server = stream_socket_server($serverUri, $errno, $errstr, $serverFlags, $serverCtx);
+    phpt_notify();
+
     @stream_socket_accept($server, 1);
     @stream_socket_accept($server, 1);
     @stream_socket_accept($server, 1);
-}
+CODE;
+
+$clientCode = <<<'CODE'
+    $serverUri = "ssl://127.0.0.1:64321";
+    $clientFlags = STREAM_CLIENT_CONNECT;
+    $clientCtx = stream_context_create(['ssl' => [
+        'verify_peer' => true,
+        'cafile' => __DIR__ . '/bug54992-ca.pem',
+        'CN_match' => 'bug54992.local',
+    ]]);
+
+    phpt_wait();
+
+    stream_context_set_option($clientCtx, 'ssl', 'crypto_method', STREAM_CRYPTO_METHOD_SSLv3_CLIENT);
+    var_dump(stream_socket_client($serverUri, $errno, $errstr, 1, $clientFlags, $clientCtx));
+
+    stream_context_set_option($clientCtx, 'ssl', 'crypto_method', STREAM_CRYPTO_METHOD_TLSv1_0_CLIENT);
+    var_dump(stream_socket_client($serverUri, $errno, $errstr, 1, $clientFlags, $clientCtx));
+
+    stream_context_set_option($clientCtx, 'ssl', 'crypto_method', STREAM_CRYPTO_METHOD_TLS_CLIENT);
+    var_dump(stream_socket_client($serverUri, $errno, $errstr, 1, $clientFlags, $clientCtx));
+CODE;
+
+include 'ServerClientTestCase.inc';
+ServerClientTestCase::getInstance()->run($clientCode, $serverCode);
 --EXPECTF--
 resource(%d) of type (stream)
 resource(%d) of type (stream)
 resource(%d) of type (stream)
-resource(%d) of type (stream)
-
index c1d181bc7654d80b2e130c22442f32440453b463..15b3fb94161883b215bdf8d2e9f2383f472773e2 100644 (file)
@@ -2,66 +2,56 @@
 TLSv1.1 and TLSv1.2 bitwise stream crypto flag assignment
 --SKIPIF--
 <?php
-if (!extension_loaded("openssl")) die("skip");
-if (!function_exists('pcntl_fork')) die("skip no fork");
+if (!extension_loaded("openssl")) die("skip openssl not loaded");
+if (!function_exists("proc_open")) die("skip no proc_open");
 if (OPENSSL_VERSION_NUMBER < 0x10001001) die("skip OpenSSLv1.0.1 required");
 --FILE--
 <?php
-$flags = STREAM_SERVER_BIND | STREAM_SERVER_LISTEN;
-$ctx = stream_context_create(['ssl' => [
-    'local_cert' => __DIR__ . '/bug54992.pem',
-    'allow_self_signed' => true
-]]);
-$server = stream_socket_server('ssl://127.0.0.1:64321', $errno, $errstr, $flags, $ctx);
-var_dump($server);
+$serverCode = <<<'CODE'
+    $serverUri = "ssl://127.0.0.1:64321";
+    $serverFlags = STREAM_SERVER_BIND | STREAM_SERVER_LISTEN;
+    $serverCtx = stream_context_create(['ssl' => [
+        'local_cert' => __DIR__ . '/bug54992.pem'
+    ]]);
 
-$pid = pcntl_fork();
-if ($pid == -1) {
-    die('could not fork');
-} else if ($pid) {
+    $server = stream_socket_server($serverUri, $errno, $errstr, $serverFlags, $serverCtx);
+    phpt_notify();
 
-    // Base SSL context values
-    $sslCtxVars = array(
-        'verify_peer' => TRUE,
+    @stream_socket_accept($server, 1);
+    @stream_socket_accept($server, 1);
+    @stream_socket_accept($server, 1);
+    @stream_socket_accept($server, 1);
+CODE;
+
+$clientCode = <<<'CODE'
+    $serverUri = "ssl://127.0.0.1:64321";
+    $clientFlags = STREAM_CLIENT_CONNECT;
+    $clientCtx = stream_context_create(['ssl' => [
+        'verify_peer' => true,
         'cafile' => __DIR__ . '/bug54992-ca.pem',
-        'CN_match' => 'bug54992.local', // common name from the server's "local_cert" PEM file
-    );
+        'CN_match' => 'bug54992.local',
+    ]]);
 
-    // TLSv1
-    $ctxCopy = $sslCtxVars;
-    $ctxCopy['crypto_method'] = STREAM_CRYPTO_METHOD_TLSv1_0_CLIENT;
-    $ctx = stream_context_create(array('ssl' => $ctxCopy));
-    var_dump(stream_socket_client("ssl://127.0.0.1:64321", $errno, $errstr, 1, STREAM_CLIENT_CONNECT, $ctx));
+    phpt_wait();
 
-    // TLSv1.1
-    $ctxCopy = $sslCtxVars;
-    $ctxCopy['crypto_method'] = STREAM_CRYPTO_METHOD_TLSv1_1_CLIENT;
-    $ctx = stream_context_create(array('ssl' => $ctxCopy));
-    var_dump(stream_socket_client("ssl://127.0.0.1:64321", $errno, $errstr, 1, STREAM_CLIENT_CONNECT, $ctx));
+    stream_context_set_option($clientCtx, 'ssl', 'crypto_method', STREAM_CRYPTO_METHOD_TLSv1_0_CLIENT);
+    var_dump(stream_socket_client($serverUri, $errno, $errstr, 1, $clientFlags, $clientCtx));
 
-    // TLSv1.2
-    $ctxCopy = $sslCtxVars;
-    $ctxCopy['crypto_method'] = STREAM_CRYPTO_METHOD_TLSv1_2_CLIENT;
-    $ctx = stream_context_create(array('ssl' => $ctxCopy));
-    var_dump(stream_socket_client("ssl://127.0.0.1:64321", $errno, $errstr, 1, STREAM_CLIENT_CONNECT, $ctx));
+    stream_context_set_option($clientCtx, 'ssl', 'crypto_method', STREAM_CRYPTO_METHOD_TLSv1_1_CLIENT);
+    var_dump(stream_socket_client($serverUri, $errno, $errstr, 1, $clientFlags, $clientCtx));
 
-    // TLS (any)
-    $ctxCopy = $sslCtxVars;
-    $ctxCopy['crypto_method'] = STREAM_CRYPTO_METHOD_TLS_CLIENT;
-    $ctx = stream_context_create(array('ssl' => $ctxCopy));
-    var_dump(stream_socket_client("ssl://127.0.0.1:64321", $errno, $errstr, 1, STREAM_CLIENT_CONNECT, $ctx));
+    stream_context_set_option($clientCtx, 'ssl', 'crypto_method', STREAM_CRYPTO_METHOD_TLSv1_2_CLIENT);
+    var_dump(stream_socket_client($serverUri, $errno, $errstr, 1, $clientFlags, $clientCtx));
 
-} else {
-    @pcntl_wait($status);
-    @stream_socket_accept($server, 1);
-    @stream_socket_accept($server, 1);
-    @stream_socket_accept($server, 1);
-    @stream_socket_accept($server, 1);
-}
+    stream_context_set_option($clientCtx, 'ssl', 'crypto_method', STREAM_CRYPTO_METHOD_TLS_CLIENT);
+    var_dump(stream_socket_client($serverUri, $errno, $errstr, 1, $clientFlags, $clientCtx));
+CODE;
+
+include 'ServerClientTestCase.inc';
+ServerClientTestCase::getInstance()->run($clientCode, $serverCode);
 --EXPECTF--
 resource(%d) of type (stream)
 resource(%d) of type (stream)
 resource(%d) of type (stream)
 resource(%d) of type (stream)
-resource(%d) of type (stream)
 
index 8c4dadba0dba393a94637470dc94784e0b7b76d5..c5aebd891fbdd2c2bdefe6186644b384cf9e76bc 100644 (file)
@@ -2,67 +2,59 @@
 Server bitwise stream crypto flag assignment
 --SKIPIF--
 <?php
-if (!extension_loaded("openssl")) die("skip");
-if (!function_exists('pcntl_fork')) die("skip no fork");
+if (!extension_loaded("openssl")) die("skip openssl not loaded");
+if (!function_exists("proc_open")) die("skip no proc_open");
 if (OPENSSL_VERSION_NUMBER < 0x10001001) die("skip OpenSSLv1.0.1 required");
 --FILE--
 <?php
-$flags = STREAM_SERVER_BIND | STREAM_SERVER_LISTEN;
-$ctx = stream_context_create(['ssl' => [
-    'local_cert' => __DIR__ . '/bug54992.pem',
-    'allow_self_signed' => true,
-    
-    // Only accept SSLv3 and TLSv1.2 connections
-    'crypto_method' => STREAM_CRYPTO_METHOD_SSLv3_SERVER  | STREAM_CRYPTO_METHOD_TLSv1_2_SERVER 
-]]);
-$server = stream_socket_server('ssl://127.0.0.1:64321', $errno, $errstr, $flags, $ctx);
-var_dump($server);
+$serverCode = <<<'CODE'
+    $serverUri = "ssl://127.0.0.1:64321";
+    $serverFlags = STREAM_SERVER_BIND | STREAM_SERVER_LISTEN;
+    $serverCtx = stream_context_create(['ssl' => [
+        'local_cert' => __DIR__ . '/bug54992.pem',
 
-$pid = pcntl_fork();
-if ($pid == -1) {
-    die('could not fork');
-} else if ($pid) {
+        // Only accept SSLv3 and TLSv1.2 connections
+        'crypto_method' => STREAM_CRYPTO_METHOD_SSLv3_SERVER  | STREAM_CRYPTO_METHOD_TLSv1_2_SERVER,
+    ]]);
 
-    // Base SSL context values
-    $sslCtxVars = array(
-        'verify_peer' => TRUE,
+    $server = stream_socket_server($serverUri, $errno, $errstr, $serverFlags, $serverCtx);
+    phpt_notify();
+
+    @stream_socket_accept($server, 1);
+    @stream_socket_accept($server, 1);
+    @stream_socket_accept($server, 1);
+    @stream_socket_accept($server, 1);
+CODE;
+
+$clientCode = <<<'CODE'
+    $serverUri = "ssl://127.0.0.1:64321";
+    $clientFlags = STREAM_CLIENT_CONNECT;
+    $clientCtx = stream_context_create(['ssl' => [
+        'verify_peer' => true,
         'cafile' => __DIR__ . '/bug54992-ca.pem',
-        'CN_match' => 'bug54992.local', // common name from the server's "local_cert" PEM file
-    );
+        'CN_match' => 'bug54992.local',
+    ]]);
 
-    // TLSv1.2
-    $ctxCopy = $sslCtxVars;
-    $ctxCopy['crypto_method'] = STREAM_CRYPTO_METHOD_TLSv1_2_CLIENT;
-    $ctx = stream_context_create(array('ssl' => $ctxCopy));
-    var_dump(stream_socket_client("ssl://127.0.0.1:64321", $errno, $errstr, 1, STREAM_CLIENT_CONNECT, $ctx));
+    phpt_wait();
 
-    // SSLv3
-    $ctxCopy = $sslCtxVars;
-    $ctxCopy['crypto_method'] = STREAM_CRYPTO_METHOD_SSLv3_CLIENT;
-    $ctx = stream_context_create(array('ssl' => $ctxCopy));
-    var_dump(stream_socket_client("ssl://127.0.0.1:64321", $errno, $errstr, 1, STREAM_CLIENT_CONNECT, $ctx));
-    
-    // TLSv1 (should fail)
-    $ctxCopy = $sslCtxVars;
-    $ctxCopy['crypto_method'] = STREAM_CRYPTO_METHOD_TLSv1_0_CLIENT;
-    $ctx = stream_context_create(array('ssl' => $ctxCopy));
-    var_dump(@stream_socket_client("ssl://127.0.0.1:64321", $errno, $errstr, 1, STREAM_CLIENT_CONNECT, $ctx));
-    
-    // TLSv1.1 (should fail)
-    $ctxCopy = $sslCtxVars;
-    $ctxCopy['crypto_method'] = STREAM_CRYPTO_METHOD_TLSv1_1_CLIENT;
-    $ctx = stream_context_create(array('ssl' => $ctxCopy));
-    var_dump(@stream_socket_client("ssl://127.0.0.1:64321", $errno, $errstr, 1, STREAM_CLIENT_CONNECT, $ctx));
+    stream_context_set_option($clientCtx, 'ssl', 'crypto_method', STREAM_CRYPTO_METHOD_TLSv1_2_CLIENT);
+    var_dump(stream_socket_client($serverUri, $errno, $errstr, 1, $clientFlags, $clientCtx));
 
-} else {
-    @pcntl_wait($status);
-    @stream_socket_accept($server, 1);
-    @stream_socket_accept($server, 1);
-}
+    stream_context_set_option($clientCtx, 'ssl', 'crypto_method', STREAM_CRYPTO_METHOD_SSLv3_CLIENT);
+    var_dump(stream_socket_client($serverUri, $errno, $errstr, 1, $clientFlags, $clientCtx));
+
+    stream_context_set_option($clientCtx, 'ssl', 'crypto_method', STREAM_CRYPTO_METHOD_TLSv1_0_CLIENT);
+    var_dump(@stream_socket_client($serverUri, $errno, $errstr, 1, $clientFlags, $clientCtx));
+
+    stream_context_set_option($clientCtx, 'ssl', 'crypto_method', STREAM_CRYPTO_METHOD_TLSv1_1_CLIENT);
+    var_dump(@stream_socket_client($serverUri, $errno, $errstr, 1, $clientFlags, $clientCtx));
+CODE;
+
+include 'ServerClientTestCase.inc';
+ServerClientTestCase::getInstance()->run($clientCode, $serverCode);
 --EXPECTF--
 resource(%d) of type (stream)
 resource(%d) of type (stream)
-resource(%d) of type (stream)
 bool(false)
 bool(false)
 
diff --git a/ext/openssl/tests/stream_crypto_flags_004.phpt b/ext/openssl/tests/stream_crypto_flags_004.phpt
new file mode 100644 (file)
index 0000000..38f406c
--- /dev/null
@@ -0,0 +1,60 @@
+--TEST--
+Specific protocol method specification
+--SKIPIF--
+<?php
+if (!extension_loaded("openssl")) die("skip openssl not loaded");
+if (!function_exists("proc_open")) die("skip no proc_open");
+--FILE--
+<?php
+$serverCode = <<<'CODE'
+    $serverUri = "ssl://127.0.0.1:64321";
+    $serverFlags = STREAM_SERVER_BIND | STREAM_SERVER_LISTEN;
+    $serverCtx = stream_context_create(['ssl' => [
+        'local_cert' => __DIR__ . '/bug54992.pem',
+        'crypto_method' => STREAM_CRYPTO_METHOD_TLSv1_0_SERVER,
+    ]]);
+
+    $server = stream_socket_server($serverUri, $errno, $errstr, $serverFlags, $serverCtx);
+    phpt_notify();
+
+    @stream_socket_accept($server, 1);
+    @stream_socket_accept($server, 1);
+    @stream_socket_accept($server, 1);
+    @stream_socket_accept($server, 1);
+CODE;
+
+$clientCode = <<<'CODE'
+    $serverUri = "ssl://127.0.0.1:64321";
+    $clientFlags = STREAM_CLIENT_CONNECT;
+    $clientCtx = stream_context_create(['ssl' => [
+        'verify_peer' => true,
+        'cafile' => __DIR__ . '/bug54992-ca.pem',
+        'CN_match' => 'bug54992.local',
+    ]]);
+
+    phpt_wait();
+
+    // Should succeed because the SSLv23 handshake here is compatible with the
+    // TLSv1 hello method employed in the server
+    var_dump(@stream_socket_client($serverUri, $errno, $errstr, 1, $clientFlags, $clientCtx));
+
+    // Should fail because the TLSv1.1 hello method is not supported
+    stream_context_set_option($clientCtx, 'ssl', 'crypto_method', STREAM_CRYPTO_METHOD_TLSv1_1_CLIENT);
+    var_dump(@stream_socket_client($serverUri, $errno, $errstr, 1, $clientFlags, $clientCtx));
+
+    // Should fail because the TLSv1.2 hello method is not supported
+    stream_context_set_option($clientCtx, 'ssl', 'crypto_method', STREAM_CRYPTO_METHOD_TLSv1_2_CLIENT);
+    var_dump(@stream_socket_client($serverUri, $errno, $errstr, 1, $clientFlags, $clientCtx));
+
+    // Should succeed because we use the same TLSv1 hello
+    stream_context_set_option($clientCtx, 'ssl', 'crypto_method', STREAM_CRYPTO_METHOD_TLSv1_0_CLIENT);
+    var_dump(stream_socket_client($serverUri, $errno, $errstr, 1, $clientFlags, $clientCtx));
+CODE;
+
+include 'ServerClientTestCase.inc';
+ServerClientTestCase::getInstance()->run($clientCode, $serverCode);
+--EXPECTF--
+resource(%d) of type (stream)
+bool(false)
+bool(false)
+resource(%d) of type (stream)
diff --git a/ext/openssl/tests/stream_crypto_flags_005.phpt b/ext/openssl/tests/stream_crypto_flags_005.phpt
deleted file mode 100644 (file)
index 965471f..0000000
+++ /dev/null
@@ -1,67 +0,0 @@
---TEST--
-Specific protocol method specification
---SKIPIF--
-<?php
-if (!extension_loaded("openssl")) die("skip");
-if (!function_exists('pcntl_fork')) die("skip no fork");
---FILE--
-<?php
-$flags = STREAM_SERVER_BIND | STREAM_SERVER_LISTEN;
-$ctx = stream_context_create(['ssl' => [
-    'local_cert' => __DIR__ . '/bug54992.pem',
-    'allow_self_signed' => true,
-    'crypto_method' => STREAM_CRYPTO_METHOD_TLSv1_0_SERVER
-]]);
-
-$server = stream_socket_server('ssl://127.0.0.1:64321', $errno, $errstr, $flags, $ctx);
-var_dump($server);
-
-$pid = pcntl_fork();
-if ($pid == -1) {
-    die('could not fork');
-} else if ($pid) {
-
-    // Base SSL context values
-    $sslCtxVars = array(
-        'verify_peer' => FALSE,
-        'cafile' => __DIR__ . '/bug54992-ca.pem',
-        'CN_match' => 'bug54992.local', // common name from the server's "local_cert" PEM file
-    );
-
-    // Should fail because the SSLv23 hello method is not supported
-    $ctxCopy = $sslCtxVars;
-    $ctx = stream_context_create(array('ssl' => $ctxCopy));
-    var_dump(@stream_socket_client("ssl://127.0.0.1:64321"));
-    
-    // Should fail because the TLSv1.1 hello method is not supported
-    $ctxCopy = $sslCtxVars;
-    $ctxCopy['crypto_method'] = STREAM_CRYPTO_METHOD_TLSv1_1_CLIENT;
-    $ctx = stream_context_create(array('ssl' => $ctxCopy));
-    var_dump(@stream_socket_client("ssl://127.0.0.1:64321"));
-    
-    // Should fail because the TLSv1.2 hello method is not supported
-    $ctxCopy = $sslCtxVars;
-    $ctxCopy['crypto_method'] = STREAM_CRYPTO_METHOD_TLSv1_2_CLIENT;
-    $ctx = stream_context_create(array('ssl' => $ctxCopy));
-    var_dump(@stream_socket_client("ssl://127.0.0.1:64321"));
-
-    // Should succeed because we use the same TLSv1 hello
-    $ctxCopy = $sslCtxVars;
-    $ctxCopy['crypto_method'] = STREAM_CRYPTO_METHOD_TLSv1_0_CLIENT;
-    $ctx = stream_context_create(array('ssl' => $ctxCopy));
-    var_dump(stream_socket_client("ssl://127.0.0.1:64321", $errno, $errstr, 30, STREAM_CLIENT_CONNECT, $ctx));
-
-} else {
-    @pcntl_wait($status);
-    @stream_socket_accept($server, 1);
-    @stream_socket_accept($server, 1);
-    @stream_socket_accept($server, 1);
-    @stream_socket_accept($server, 1);
-}
---EXPECTF--
-resource(%d) of type (stream)
-bool(false)
-bool(false)
-bool(false)
-resource(%d) of type (stream)
-
index 134d3cb601a0f11f1cdd5e16b701c94023ad7c77..b2f2ae3ad02e76f99e6d9c3d7c9e5ab2e7180c4a 100644 (file)
@@ -2,8 +2,8 @@
 TLS server rate-limits client-initiated renegotiation
 --SKIPIF--
 <?php
-if (!extension_loaded("openssl")) die("skip");
-if (!function_exists('pcntl_fork')) die("skip no fork");
+if (!extension_loaded("openssl")) die("skip openssl not loaded");
+if (!function_exists("proc_open")) die("skip no proc_open");
 exec('openssl help', $out, $code);
 if ($code > 0) die("skip couldn't locate openssl binary");
 --FILE--
@@ -17,73 +17,70 @@ if ($code > 0) die("skip couldn't locate openssl binary");
  * given current limitations.
  */
 
-$bindTo = 'ssl://127.0.0.1:12345';
-$flags = STREAM_SERVER_BIND | STREAM_SERVER_LISTEN;
-$server = stream_socket_server($bindTo, $errNo, $errStr, $flags, stream_context_create(['ssl' => [
-       'local_cert' => __DIR__ . '/bug54992.pem',
-       'reneg_limit' => 0,
-       'reneg_window' => 30,
-       'reneg_limit_callback' => function($stream) {
-               var_dump($stream);
-       }
-]]));
+$serverCode = <<<'CODE'
+    $serverUri = "ssl://127.0.0.1:64321";
+    $serverFlags = STREAM_SERVER_BIND | STREAM_SERVER_LISTEN;
+    $serverCtx = stream_context_create(['ssl' => [
+        'local_cert' => __DIR__ . '/bug54992.pem',
+        'reneg_limit' => 0,
+        'reneg_window' => 30,
+        'reneg_limit_callback' => function($stream) {
+            var_dump($stream);
+        }
+    ]]);
 
-$pid = pcntl_fork();
-if ($pid == -1) {
-       die('could not fork');
-} elseif ($pid) {
+    $server = stream_socket_server($serverUri, $errno, $errstr, $serverFlags, $serverCtx);
+    phpt_notify();
 
-       $cmd = 'openssl s_client -connect 127.0.0.1:12345';
-       $descriptorspec = array(
-               0 => array("pipe", "r"),
-               1 => array("pipe", "w"),
-               2 => array("pipe", "w"),
-       );
-       $process = proc_open($cmd, $descriptorspec, $pipes);
+    $clients = [];
+    while (1) {
+        $r = array_merge([$server], $clients);
+        $w = $e = [];
 
-       list($stdin, $stdout, $stderr) = $pipes;
+        stream_select($r, $w, $e, $timeout=42);
 
-       // Trigger renegotiation twice
-       // Server settings only allow one per second (should result in disconnection)
-       fwrite($stdin, "R\nR\nR\nR\n");
+        foreach ($r as $sock) {
+            if ($sock === $server && ($client = stream_socket_accept($server, $timeout = 42))) {
+                $clientId = (int) $client;
+                $clients[$clientId] = $client;
+            } elseif ($sock !== $server) {
+                $clientId = (int) $sock;
+                $buffer = fread($sock, 1024);
+                if (strlen($buffer)) {
+                    continue;
+                } elseif (!is_resource($sock) || feof($sock)) {
+                    unset($clients[$clientId]);
+                    break 2;
+                }
+            }
+        }
+    }
+CODE;
 
-       $lines = [];
-       while(!feof($stderr)) {
-               fgets($stderr);
-       }
+$clientCode = <<<'CODE'
+    $cmd = 'openssl s_client -connect 127.0.0.1:64321';
+    $descriptorSpec = [["pipe", "r"], ["pipe", "w"], ["pipe", "w"]];
+    $process = proc_open($cmd, $descriptorSpec, $pipes);
 
-       fclose($stdin);
-       fclose($stdout);
-       fclose($stderr);
-       proc_terminate($process);
-       pcntl_wait($status);
+    list($stdin, $stdout, $stderr) = $pipes;
 
-} else {
+    // Trigger renegotiation twice
+    // Server settings only allow one per second (should result in disconnection)
+    fwrite($stdin, "R\nR\nR\nR\n");
 
-       $clients = [];
+    $lines = [];
+    while(!feof($stderr)) {
+        fgets($stderr);
+    }
 
-       while (1) {
-               $r = array_merge([$server], $clients);
-               $w = $e = [];
+    fclose($stdin);
+    fclose($stdout);
+    fclose($stderr);
+    proc_terminate($process);
+    pcntl_wait($status);
+CODE;
 
-               stream_select($r, $w, $e, $timeout=42);
-
-               foreach ($r as $sock) {
-                       if ($sock === $server && ($client = stream_socket_accept($server, $timeout = 42))) {
-                               $clientId = (int) $client;
-                               $clients[$clientId] = $client;
-                       } elseif ($sock !== $server) {
-                               $clientId = (int) $sock;
-                               $buffer = fread($sock, 1024);
-                               if (strlen($buffer)) {
-                                       continue;
-                               } elseif (!is_resource($sock) || feof($sock)) {
-                                       unset($clients[$clientId]);
-                                       break 2;
-                               }
-                       }
-               }
-       }
-}
+include 'ServerClientTestCase.inc';
+ServerClientTestCase::getInstance()->run($serverCode, $clientCode);
 --EXPECTF--
 resource(%d) of type (stream)
index aa85ad559f92c4b98f14c9719d7e75fb331a672b..c4d87b82db1c114ed742c01281ce6bbf6f366d7a 100644 (file)
@@ -2,34 +2,38 @@
 Verify host name by default in client transfers
 --SKIPIF--
 <?php
-if (!extension_loaded("openssl")) die("skip");
-if (!function_exists('pcntl_fork')) die("skip no fork");
+if (!extension_loaded("openssl")) die("skip openssl not loaded");
+if (!function_exists("proc_open")) die("skip no proc_open");
 --FILE--
 <?php
-$serverUri = "ssl://127.0.0.1:64321";
-$serverFlags = STREAM_SERVER_BIND | STREAM_SERVER_LISTEN;
-$serverCtx = stream_context_create(['ssl' => [
-    'local_cert' => __DIR__ . '/bug54992.pem'
-]]);
-$server = stream_socket_server($serverUri, $errno, $errstr, $serverFlags, $serverCtx);
+$serverCode = <<<'CODE'
+    $serverUri = "ssl://127.0.0.1:64321";
+    $serverFlags = STREAM_SERVER_BIND | STREAM_SERVER_LISTEN;
+    $serverCtx = stream_context_create(['ssl' => [
+        'local_cert' => __DIR__ . '/bug54992.pem'
+    ]]);
+
+    $server = stream_socket_server($serverUri, $errno, $errstr, $serverFlags, $serverCtx);
+    phpt_notify();
 
-$pid = pcntl_fork();
-if ($pid == -1) {
-    die('could not fork');
-} else if ($pid) {
+    @stream_socket_accept($server, 1);
+CODE;
 
+$clientCode = <<<'CODE'
+    $serverUri = "ssl://127.0.0.1:64321";
     $clientFlags = STREAM_CLIENT_CONNECT;
     $clientCtx = stream_context_create(['ssl' => [
         'verify_peer' => false,
         'CN_match' => 'bug54992.local'
     ]]);
 
+    phpt_wait();
     $client = stream_socket_client($serverUri, $errno, $errstr, 1, $clientFlags, $clientCtx);
+
     var_dump($client);
+CODE;
 
-} else {
-    @pcntl_wait($status);
-    @stream_socket_accept($server, 1);
-}
+include 'ServerClientTestCase.inc';
+ServerClientTestCase::getInstance()->run($clientCode, $serverCode);
 --EXPECTF--
 resource(%d) of type (stream)
index 1ac81e2543443ffe64aa8ce9ebc850125ff23365..c0db4f2d906a212e315c5a2e9d42fd07f4688cf9 100644 (file)
@@ -2,35 +2,39 @@
 Allow host name mismatch when "verify_host" disabled
 --SKIPIF--
 <?php
-if (!extension_loaded("openssl")) die("skip");
-if (!function_exists('pcntl_fork')) die("skip no fork");
+if (!extension_loaded("openssl")) die("skip openssl not loaded");
+if (!function_exists("proc_open")) die("skip no proc_open");
 --FILE--
 <?php
-$serverUri = "ssl://127.0.0.1:64321";
-$serverFlags = STREAM_SERVER_BIND | STREAM_SERVER_LISTEN;
-$serverCtx = stream_context_create(['ssl' => [
-    'local_cert' => __DIR__ . '/bug54992.pem'
-]]);
-$server = stream_socket_server($serverUri, $errno, $errstr, $serverFlags, $serverCtx);
+$serverCode = <<<'CODE'
+    $serverUri = "ssl://127.0.0.1:64321";
+    $serverFlags = STREAM_SERVER_BIND | STREAM_SERVER_LISTEN;
+    $serverCtx = stream_context_create(['ssl' => [
+        'local_cert' => __DIR__ . '/bug54992.pem'
+    ]]);
+
+    $server = stream_socket_server($serverUri, $errno, $errstr, $serverFlags, $serverCtx);
+    phpt_notify();
 
-$pid = pcntl_fork();
-if ($pid == -1) {
-    die('could not fork');
-} else if ($pid) {
+    @stream_socket_accept($server, 1);
+CODE;
 
+$clientCode = <<<'CODE'
+    $serverUri = "ssl://127.0.0.1:64321";
     $clientFlags = STREAM_CLIENT_CONNECT;
     $clientCtx = stream_context_create(['ssl' => [
         'verify_peer' => true,
-       'cafile' => __DIR__ . '/bug54992-ca.pem',
-       'verify_host' => false
+        'cafile' => __DIR__ . '/bug54992-ca.pem',
+        'verify_host' => false
     ]]);
 
+    phpt_wait();
     $client = stream_socket_client($serverUri, $errno, $errstr, 1, $clientFlags, $clientCtx);
+
     var_dump($client);
+CODE;
 
-} else {
-    @pcntl_wait($status);
-    @stream_socket_accept($server, 1);
-}
+include 'ServerClientTestCase.inc';
+ServerClientTestCase::getInstance()->run($clientCode, $serverCode);
 --EXPECTF--
 resource(%d) of type (stream)
index ce6430a14a1d6ad07db32fbfaaaca3c151315b3d..e4e083f7f607f64912f111485e564ba740c737e9 100644 (file)
@@ -2,35 +2,39 @@
 Host name mismatch triggers error
 --SKIPIF--
 <?php
-if (!extension_loaded("openssl")) die("skip");
-if (!function_exists('pcntl_fork')) die("skip no fork");
+if (!extension_loaded("openssl")) die("skip openssl not loaded");
+if (!function_exists("proc_open")) die("skip no proc_open");
 --FILE--
 <?php
-$serverUri = "ssl://127.0.0.1:64321";
-$serverFlags = STREAM_SERVER_BIND | STREAM_SERVER_LISTEN;
-$serverCtx = stream_context_create(['ssl' => [
-    'local_cert' => __DIR__ . '/bug54992.pem'
-]]);
-$server = stream_socket_server($serverUri, $errno, $errstr, $serverFlags, $serverCtx);
-
-$pid = pcntl_fork();
-if ($pid == -1) {
-    die('could not fork');
-} else if ($pid) {
+$serverCode = <<<'CODE'
+    $serverUri = "ssl://127.0.0.1:64321";
+    $serverFlags = STREAM_SERVER_BIND | STREAM_SERVER_LISTEN;
+    $serverCtx = stream_context_create(['ssl' => [
+        'local_cert' => __DIR__ . '/bug54992.pem'
+    ]]);
+
+    $server = stream_socket_server($serverUri, $errno, $errstr, $serverFlags, $serverCtx);
+    phpt_notify();
+
+    @stream_socket_accept($server, 1);
+CODE;
 
+$clientCode = <<<'CODE'
+    $serverUri = "ssl://127.0.0.1:64321";
     $clientFlags = STREAM_CLIENT_CONNECT;
     $clientCtx = stream_context_create(['ssl' => [
         'verify_peer' => true,
-       'cafile' => __DIR__ . '/bug54992-ca.pem'
+        'cafile' => __DIR__ . '/bug54992-ca.pem'
     ]]);
 
+    phpt_wait();
     $client = stream_socket_client($serverUri, $errno, $errstr, 1, $clientFlags, $clientCtx);
+
     var_dump($client);
+CODE;
 
-} else {
-    @pcntl_wait($status);
-    @stream_socket_accept($server, 1);
-}
+include 'ServerClientTestCase.inc';
+ServerClientTestCase::getInstance()->run($clientCode, $serverCode);
 --EXPECTF--
 Warning: stream_socket_client(): Peer certificate CN=`bug54992.local' did not match expected CN=`127.0.0.1' in %s on line %d
 
index 6eee8df5f4ea0a7e7e4e46cc5c4c8d4079b98a3d..1bf9048151148a3028daa8b164a49e7b2a7fbd0a 100644 (file)
@@ -2,57 +2,51 @@
 Specific crypto method for ssl:// transports.
 --SKIPIF--
 <?php
-if (!extension_loaded('openssl')) die('skip, openssl required');
-if (!extension_loaded('pcntl')) die('skip, pcntl required');
-?>
+if (!extension_loaded("openssl")) die("skip openssl not loaded");
+if (!function_exists("proc_open")) die("skip no proc_open");
 --FILE--
 <?php
-$serverCtx = stream_context_create(['ssl' => [
-       'local_cert' => dirname(__FILE__) . '/streams_crypto_method.pem',
-]]);
-$serverFlags = STREAM_SERVER_BIND | STREAM_SERVER_LISTEN;
-$server = stream_socket_server('sslv3://127.0.0.1:12345', $errno, $errstr, $serverFlags, $serverCtx);
+$serverCode = <<<'CODE'
+    $serverUri = "ssl://127.0.0.1:64321";
+    $serverFlags = STREAM_SERVER_BIND | STREAM_SERVER_LISTEN;
+    $serverCtx = stream_context_create(['ssl' => [
+        'local_cert' => __DIR__ . '/streams_crypto_method.pem',
+    ]]);
 
-$pid = pcntl_fork();
+    $server = stream_socket_server($serverUri, $errno, $errstr, $serverFlags, $serverCtx);
+    phpt_notify();
 
-if ($pid == -1) {
-       die('could not fork');
-} else if ($pid) {
-       $clientCtx = stream_context_create(['ssl' => [
-               'crypto_method' => STREAM_CRYPTO_METHOD_SSLv3_CLIENT,
-               'verify_peer' => false,
-               'verify_host' => false
-       ]]);
+    $client = @stream_socket_accept($server);
+    if ($client) {
+        $in = '';
+        while (!preg_match('/\r?\n\r?\n/', $in)) {
+            $in .= fread($client, 2048);
+        }
+        $response = "HTTP/1.0 200 OK\r\n"
+                  . "Content-Type: text/plain\r\n"
+                  . "Content-Length: 12\r\n"
+                  . "Connection: close\r\n"
+                  . "\r\n"
+                  . "Hello World!";
+        fwrite($client, $response);
+        fclose($client);
+    }
+CODE;
 
-       $fp = fopen('https://127.0.0.1:12345/', 'r', false, $clientCtx);
+$clientCode = <<<'CODE'
+    $serverUri = "https://127.0.0.1:64321/";
+    $clientFlags = STREAM_CLIENT_CONNECT;
+    $clientCtx = stream_context_create(['ssl' => [
+        'crypto_method' => STREAM_CRYPTO_METHOD_SSLv3_CLIENT,
+        'verify_peer' => false,
+        'verify_host' => false
+    ]]);
 
-       if ($fp) {
-               fpassthru($fp);
-       fclose($fp);
-       }
-} else {
-       @pcntl_wait($status);
-       $client = @stream_socket_accept($server);
-       if ($client) {
-               $in = '';
-               while (!preg_match('/\r?\n\r?\n/', $in)) {
-                       $in .= fread($client, 2048);
-               }
-               $response = <<<EOS
-HTTP/1.1 200 OK
-Content-Type: text/plain
-Content-Length: 13
-Connection: close
+    phpt_wait();
+    echo file_get_contents($serverUri, false, $clientCtx);
+CODE;
 
-Hello World!
-
-EOS;
-               fwrite($client, $response);
-               fclose($client);
-
-               exit();
-       }
-}
-?>
+include 'ServerClientTestCase.inc';
+ServerClientTestCase::getInstance()->run($clientCode, $serverCode);
 --EXPECTF--
 Hello World!
index 108df01ee91d02376a3e829b16f19b701812d1e4..d24ab455deb9c6f53362a0c09dca3060f204d2bc 100644 (file)
@@ -2,45 +2,46 @@
 tlsv1.0 stream wrapper
 --SKIPIF--
 <?php 
-if (!extension_loaded("openssl")) die("skip");
-if (!function_exists('pcntl_fork')) die("skip no fork");
+if (!extension_loaded("openssl")) die("skip openssl not loaded");
+if (!function_exists("proc_open")) die("skip no proc_open");
 --FILE--
 <?php
-$flags = STREAM_SERVER_BIND|STREAM_SERVER_LISTEN;
-$ctx = stream_context_create(array('ssl' => array(
-       'local_cert' => __DIR__ . '/streams_crypto_method.pem',
-)));
-
-$server = stream_socket_server('tlsv1.0://127.0.0.1:64321', $errno, $errstr, $flags, $ctx);
-var_dump($server);
-
-$pid = pcntl_fork();
-if ($pid == -1) {
-       die('could not fork');
-} elseif ($pid) {
-       $flags = STREAM_CLIENT_CONNECT;
-       $ctx = stream_context_create(array('ssl' => array(
-               'verify_peer' => false,
-               'verify_host' => false
-       )));
-
-       $client = stream_socket_client("tlsv1.0://127.0.0.1:64321", $errno, $errstr, 1, $flags, $ctx);
-       var_dump($client);
-
-       $client = @stream_socket_client("sslv3://127.0.0.1:64321", $errno, $errstr, 1, $flags, $ctx);
-       var_dump($client);
-
-       $client = @stream_socket_client("tlsv1.2://127.0.0.1:64321", $errno, $errstr, 1, $flags, $ctx);
-       var_dump($client);
-
-} else {       
-       @pcntl_wait($status);
-       for ($i=0; $i < 3; $i++) {
-               @stream_socket_accept($server, 1);
-       }
-}
+$serverCode = <<<'CODE'
+    $flags = STREAM_SERVER_BIND|STREAM_SERVER_LISTEN;
+    $ctx = stream_context_create(['ssl' => [
+        'local_cert' => __DIR__ . '/streams_crypto_method.pem',
+    ]]);
+
+    $server = stream_socket_server('tlsv1.0://127.0.0.1:64321', $errno, $errstr, $flags, $ctx);
+    phpt_notify();
+
+    for ($i=0; $i < 3; $i++) {
+        @stream_socket_accept($server, 1);
+    }
+CODE;
+
+$clientCode = <<<'CODE'
+    $flags = STREAM_CLIENT_CONNECT;
+    $ctx = stream_context_create(['ssl' => [
+        'verify_peer' => false,
+        'verify_host' => false,
+    ]]);
+
+    phpt_wait();
+
+    $client = stream_socket_client("tlsv1.0://127.0.0.1:64321", $errno, $errstr, 1, $flags, $ctx);
+    var_dump($client);
+
+    $client = @stream_socket_client("sslv3://127.0.0.1:64321", $errno, $errstr, 1, $flags, $ctx);
+    var_dump($client);
+
+    $client = @stream_socket_client("tlsv1.2://127.0.0.1:64321", $errno, $errstr, 1, $flags, $ctx);
+    var_dump($client);
+CODE;
+
+include 'ServerClientTestCase.inc';
+ServerClientTestCase::getInstance()->run($clientCode, $serverCode);
 --EXPECTF--
 resource(%d) of type (stream)
-resource(%d) of type (stream)
 bool(false)
 bool(false)
index 82048e525de7544d4fe5a5a3a1983fbd6766be47..cd881782c4aebd81dc302a5f2bb31305c7c29b2f 100644 (file)
@@ -2,46 +2,47 @@
 tlsv1.1 stream wrapper
 --SKIPIF--
 <?php 
-if (!extension_loaded("openssl")) die("skip");
+if (!extension_loaded("openssl")) die("skip openssl not loaded");
+if (!function_exists("proc_open")) die("skip no proc_open");
 if (OPENSSL_VERSION_NUMBER < 0x10001001) die("skip OpenSSL 1.0.1 required");
-if (!function_exists('pcntl_fork')) die("skip no fork");
 --FILE--
 <?php
-$flags = STREAM_SERVER_BIND|STREAM_SERVER_LISTEN;
-$ctx = stream_context_create(array('ssl' => array(
-       'local_cert' => __DIR__ . '/streams_crypto_method.pem',
-)));
+$serverCode = <<<'CODE'
+    $flags = STREAM_SERVER_BIND|STREAM_SERVER_LISTEN;
+    $ctx = stream_context_create(['ssl' => [
+        'local_cert' => __DIR__ . '/streams_crypto_method.pem',
+    ]]);
 
-$server = stream_socket_server('tlsv1.1://127.0.0.1:64321', $errno, $errstr, $flags, $ctx);
-var_dump($server);
+    $server = stream_socket_server('tlsv1.1://127.0.0.1:64321', $errno, $errstr, $flags, $ctx);
+    phpt_notify();
 
-$pid = pcntl_fork();
-if ($pid == -1) {
-       die('could not fork');
-} elseif ($pid) {
-       $flags = STREAM_CLIENT_CONNECT;
-       $ctx = stream_context_create(array('ssl' => array(
-               'verify_peer' => false,
-               'verify_host' => false
-       )));
-       
-       $client = stream_socket_client("tlsv1.1://127.0.0.1:64321", $errno, $errstr, 1, $flags, $ctx);
-       var_dump($client);
-       
-       $client = @stream_socket_client("sslv3://127.0.0.1:64321", $errno, $errstr, 1, $flags, $ctx);
-       var_dump($client);
-       
-       $client = @stream_socket_client("tlsv1.2://127.0.0.1:64321", $errno, $errstr, 1, $flags, $ctx);
-       var_dump($client);
-       
-} else {       
-       @pcntl_wait($status);
-       for ($i=0; $i < 3; $i++) {
-               @stream_socket_accept($server, 1);
-       }
-}
+    for ($i=0; $i < 3; $i++) {
+        @stream_socket_accept($server, 1);
+    }
+CODE;
+
+$clientCode = <<<'CODE'
+    $flags = STREAM_CLIENT_CONNECT;
+    $ctx = stream_context_create(['ssl' => [
+        'verify_peer' => false,
+        'verify_host' => false,
+    ]]);
+
+    phpt_wait();
+
+    $client = stream_socket_client("tlsv1.1://127.0.0.1:64321", $errno, $errstr, 1, $flags, $ctx);
+    var_dump($client);
+    
+    $client = @stream_socket_client("sslv3://127.0.0.1:64321", $errno, $errstr, 1, $flags, $ctx);
+    var_dump($client);
+    
+    $client = @stream_socket_client("tlsv1.2://127.0.0.1:64321", $errno, $errstr, 1, $flags, $ctx);
+    var_dump($client);
+CODE;
+
+include 'ServerClientTestCase.inc';
+ServerClientTestCase::getInstance()->run($clientCode, $serverCode);
 --EXPECTF--
 resource(%d) of type (stream)
-resource(%d) of type (stream)
 bool(false)
 bool(false)
index d58d1a12624a41bf72fd7c96878f14e95a1d3343..124fdf202c3247a919625ba0ce84f3e60ac12305 100644 (file)
@@ -2,46 +2,47 @@
 tlsv1.2 stream wrapper
 --SKIPIF--
 <?php 
-if (!extension_loaded("openssl")) die("skip");
+if (!extension_loaded("openssl")) die("skip openssl not loaded");
+if (!function_exists("proc_open")) die("skip no proc_open");
 if (OPENSSL_VERSION_NUMBER < 0x10001001) die("skip OpenSSL 1.0.1 required");
-if (!function_exists('pcntl_fork')) die("skip no fork");
 --FILE--
 <?php
-$flags = STREAM_SERVER_BIND|STREAM_SERVER_LISTEN;
-$ctx = stream_context_create(array('ssl' => array(
-       'local_cert' => __DIR__ . '/streams_crypto_method.pem',
-)));
+$serverCode = <<<'CODE'
+    $flags = STREAM_SERVER_BIND|STREAM_SERVER_LISTEN;
+    $ctx = stream_context_create(['ssl' => [
+        'local_cert' => __DIR__ . '/streams_crypto_method.pem',
+    ]]);
 
-$server = stream_socket_server('tlsv1.2://127.0.0.1:64321', $errno, $errstr, $flags, $ctx);
-var_dump($server);
+    $server = stream_socket_server('tlsv1.2://127.0.0.1:64321', $errno, $errstr, $flags, $ctx);
+    phpt_notify();
 
-$pid = pcntl_fork();
-if ($pid == -1) {
-       die('could not fork');
-} elseif ($pid) {
-       $flags = STREAM_CLIENT_CONNECT;
-       $ctx = stream_context_create(array('ssl' => array(
-               'verify_peer' => false,
-               'verify_host' => false
-       )));
-       
-       $client = stream_socket_client("tlsv1.2://127.0.0.1:64321", $errno, $errstr, 1, $flags, $ctx);
-       var_dump($client);
-       
-       $client = @stream_socket_client("sslv3://127.0.0.1:64321", $errno, $errstr, 1, $flags, $ctx);
-       var_dump($client);
-       
-       $client = @stream_socket_client("tlsv1.1://127.0.0.1:64321", $errno, $errstr, 1, $flags, $ctx);
-       var_dump($client);
-       
-} else {       
-       @pcntl_wait($status);
-       for ($i=0; $i < 3; $i++) {
-               @stream_socket_accept($server, 1);
-       }
-}
+    for ($i=0; $i < 3; $i++) {
+        @stream_socket_accept($server, 1);
+    }
+CODE;
+
+$clientCode = <<<'CODE'
+    $flags = STREAM_CLIENT_CONNECT;
+    $ctx = stream_context_create(['ssl' => [
+        'verify_peer' => false,
+        'verify_host' => false,
+    ]]);
+
+    phpt_wait();
+
+    $client = stream_socket_client("tlsv1.2://127.0.0.1:64321", $errno, $errstr, 1, $flags, $ctx);
+    var_dump($client);
+    
+    $client = @stream_socket_client("sslv3://127.0.0.1:64321", $errno, $errstr, 1, $flags, $ctx);
+    var_dump($client);
+    
+    $client = @stream_socket_client("tlsv1.1://127.0.0.1:64321", $errno, $errstr, 1, $flags, $ctx);
+    var_dump($client);
+CODE;
+
+include 'ServerClientTestCase.inc';
+ServerClientTestCase::getInstance()->run($clientCode, $serverCode);
 --EXPECTF--
 resource(%d) of type (stream)
-resource(%d) of type (stream)
 bool(false)
 bool(false)
index d58d1a12624a41bf72fd7c96878f14e95a1d3343..ba9f77e94637c09034dcdc97fdfc652c9f8e799f 100644 (file)
@@ -9,7 +9,7 @@ if (!function_exists('pcntl_fork')) die("skip no fork");
 <?php
 $flags = STREAM_SERVER_BIND|STREAM_SERVER_LISTEN;
 $ctx = stream_context_create(array('ssl' => array(
-       'local_cert' => __DIR__ . '/streams_crypto_method.pem',
+    'local_cert' => __DIR__ . '/streams_crypto_method.pem',
 )));
 
 $server = stream_socket_server('tlsv1.2://127.0.0.1:64321', $errno, $errstr, $flags, $ctx);
@@ -17,28 +17,28 @@ var_dump($server);
 
 $pid = pcntl_fork();
 if ($pid == -1) {
-       die('could not fork');
+    die('could not fork');
 } elseif ($pid) {
-       $flags = STREAM_CLIENT_CONNECT;
-       $ctx = stream_context_create(array('ssl' => array(
-               'verify_peer' => false,
-               'verify_host' => false
-       )));
-       
-       $client = stream_socket_client("tlsv1.2://127.0.0.1:64321", $errno, $errstr, 1, $flags, $ctx);
-       var_dump($client);
-       
-       $client = @stream_socket_client("sslv3://127.0.0.1:64321", $errno, $errstr, 1, $flags, $ctx);
-       var_dump($client);
-       
-       $client = @stream_socket_client("tlsv1.1://127.0.0.1:64321", $errno, $errstr, 1, $flags, $ctx);
-       var_dump($client);
-       
-} else {       
-       @pcntl_wait($status);
-       for ($i=0; $i < 3; $i++) {
-               @stream_socket_accept($server, 1);
-       }
+    $flags = STREAM_CLIENT_CONNECT;
+    $ctx = stream_context_create(array('ssl' => array(
+        'verify_peer' => false,
+        'verify_host' => false
+    )));
+    
+    $client = stream_socket_client("tlsv1.2://127.0.0.1:64321", $errno, $errstr, 1, $flags, $ctx);
+    var_dump($client);
+    
+    $client = @stream_socket_client("sslv3://127.0.0.1:64321", $errno, $errstr, 1, $flags, $ctx);
+    var_dump($client);
+    
+    $client = @stream_socket_client("tlsv1.1://127.0.0.1:64321", $errno, $errstr, 1, $flags, $ctx);
+    var_dump($client);
+    
+} else {    
+    @pcntl_wait($status);
+    for ($i=0; $i < 3; $i++) {
+        @stream_socket_accept($server, 1);
+    }
 }
 --EXPECTF--
 resource(%d) of type (stream)