]> granicus.if.org Git - php/commitdiff
Adds test cases for openssl EC improvements
authorDominic Luechinger <doldev@snowgarden.ch>
Mon, 24 Nov 2014 01:31:19 +0000 (02:31 +0100)
committerStanislav Malyshev <stas@php.net>
Mon, 1 Dec 2014 02:17:48 +0000 (18:17 -0800)
ext/openssl/openssl.c
ext/openssl/tests/027.phpt [new file with mode: 0644]
ext/openssl/tests/028.phpt [new file with mode: 0644]
ext/openssl/tests/private_ec.key [new file with mode: 0644]
ext/openssl/tests/public_ec.key [new file with mode: 0644]

index a1304437d74f9ea62cf7d8b88cffb127c167f10b..b221d96602cd8dfcb5dd9737ee56955d9c0aae2d 100755 (executable)
@@ -3487,8 +3487,8 @@ PHP_FUNCTION(openssl_pkey_get_details)
                        if (pkey->pkey.ec == NULL) {
                                break;
                        }
-
-                       zval ec;
+               {
+                       zval *ec;
                        const EC_GROUP *ec_group;
                        int nid;
                        char *crv_sn;
@@ -3503,24 +3503,25 @@ PHP_FUNCTION(openssl_pkey_get_details)
                        if (nid == NID_undef) {
                                break;
                        }
-
-                       array_init(&ec);
+                       ALLOC_INIT_ZVAL(ec);
+                       array_init(ec);
 
                        // Short object name
                        crv_sn = (char*) OBJ_nid2sn(nid);
                        if (crv_sn != NULL) {
-                               add_assoc_string(&ec, "curve_name", crv_sn);
+                               add_assoc_string(ec, "curve_name", crv_sn, 1);
                        }
 
                        obj = OBJ_nid2obj(nid);
                        if (obj != NULL) {
                                int oir_len = OBJ_obj2txt(oir_buf, sizeof(oir_buf), obj, 1);
-                               add_assoc_stringl(&ec, "curve_oid", (char*)oir_buf, oir_len);
+                               add_assoc_stringl(ec, "curve_oid", (char*)oir_buf, oir_len, 1);
                                ASN1_OBJECT_free(obj);
                        }
 
-                       add_assoc_zval(return_value, "ec", &ec);
+                       add_assoc_zval(return_value, "ec", ec);
                        break;
+               }
 #endif
                default:
                        ktype = -1;
diff --git a/ext/openssl/tests/027.phpt b/ext/openssl/tests/027.phpt
new file mode 100644 (file)
index 0000000..8311ab1
--- /dev/null
@@ -0,0 +1,52 @@
+--TEST--
+openssl_pkey_export() with EC key
+--SKIPIF--
+<?php
+if (!extension_loaded("openssl")) die("skip");
+if (!defined('OPENSSL_KEYTYPE_EC')) die("skip no EC available");
+?>
+--FILE--
+<?php
+$key = openssl_pkey_get_private('file://' . dirname(__FILE__) . '/private_ec.key');
+var_dump($key);
+
+var_dump(openssl_pkey_export($key, $output));
+echo $output;
+
+// Load the private key from the exported pem string
+$details = openssl_pkey_get_details(openssl_pkey_get_private($output));
+var_dump(OPENSSL_KEYTYPE_EC === $details['type']);
+
+// Export key with passphrase
+openssl_pkey_export($key, $output, 'passphrase');
+
+$details = openssl_pkey_get_details(openssl_pkey_get_private($output, 'passphrase'));
+var_dump(OPENSSL_KEYTYPE_EC === $details['type']);
+
+// Read public key
+$pKey = openssl_pkey_get_public('file://' . dirname(__FILE__) . '/public_ec.key');
+var_dump($pKey);
+// The details are the same for a public or private key
+var_dump($details === openssl_pkey_get_details($pKey));
+
+
+// Export to file
+$tempname = tempnam(sys_get_temp_dir(), 'openssl_ec');
+var_dump(openssl_pkey_export_to_file($key, $tempname));
+$details = openssl_pkey_get_details(openssl_pkey_get_private('file://' . $tempname));
+var_dump(OPENSSL_KEYTYPE_EC === $details['type']);
+
+// Clean the temporary file
+@unlink($tempname);
+
+?>
+--EXPECTF--
+resource(%d) of type (OpenSSL key)
+bool(true)
+-----BEGIN EC PRIVATE KEY-----%a-----END EC PRIVATE KEY-----
+bool(true)
+bool(true)
+resource(%d) of type (OpenSSL key)
+bool(true)
+bool(true)
+bool(true)
diff --git a/ext/openssl/tests/028.phpt b/ext/openssl/tests/028.phpt
new file mode 100644 (file)
index 0000000..8e0cef4
--- /dev/null
@@ -0,0 +1,28 @@
+--TEST--
+openssl_pkey_get_details() with EC key
+--SKIPIF--
+<?php
+if (!extension_loaded("openssl")) die("skip");
+if (!defined('OPENSSL_KEYTYPE_EC')) die("skip no EC available");
+?>
+--FILE--
+<?php
+$key = openssl_pkey_get_private('file://' . dirname(__FILE__) . '/private_ec.key');
+
+print_r(openssl_pkey_get_details($key));
+?>
+--EXPECTF--
+Array
+(
+    [bits] => 256
+    [key] => -----BEGIN PUBLIC KEY-----%a
+-----END PUBLIC KEY-----
+
+    [ec] => Array
+        (
+            [curve_name] => prime256v1
+            [curve_oid] => 1.2.840.10045.3.1.7
+        )
+
+    [type] => 3
+)
diff --git a/ext/openssl/tests/private_ec.key b/ext/openssl/tests/private_ec.key
new file mode 100644 (file)
index 0000000..51cdcb7
--- /dev/null
@@ -0,0 +1,5 @@
+-----BEGIN EC PRIVATE KEY-----
+MHcCAQEEILPkqoeyM7XgwYkuSj3077lrsrfWJK5LqMolv+m2oOjZoAoGCCqGSM49
+AwEHoUQDQgAEPq4hbIWHvB51rdWr8ejrjWo4qVNWVugYFtPg/xLQw0mHkIPZ4DvK
+sqOTOnMoezkbSmVVMuwz9flvnqHGmQvmug==
+-----END EC PRIVATE KEY-----
diff --git a/ext/openssl/tests/public_ec.key b/ext/openssl/tests/public_ec.key
new file mode 100644 (file)
index 0000000..a93b2c8
--- /dev/null
@@ -0,0 +1,4 @@
+-----BEGIN PUBLIC KEY-----
+MFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEPq4hbIWHvB51rdWr8ejrjWo4qVNW
+VugYFtPg/xLQw0mHkIPZ4DvKsqOTOnMoezkbSmVVMuwz9flvnqHGmQvmug==
+-----END PUBLIC KEY-----