This is a short introduction of a feature I've been working on. Summary ------- The current OpenSSL extension only supports generating RSA key pairs. The PR [1] adds support for ECC (Elliptic curve cryptography) key generation. The corresponding bug is 61204 [2]. -------
Motivation ---------- Why needs PHP support for creating ECC key pairs? ECC has the benefit to give the same security grantees as RSA but with smaller key sizes. The current workaround without this improvement is to generate a key pair with the help of the OpenSSL CLI tool (PHP exec) or use a userland library like phpecc [3]. To protect against cryptography attack vectors like timing attack or other side-channel attacks in PHP is quite difficult. A native support would solve this issue or at least gives the responsibility to the underlying crypto library. ---------- In details ---------- The PR introduces new '$configargs' setting to openssl_pkey_new [4]. E.g.: openssl_pkey_new( array( 'curve_name' => 'secp384r1', 'private_key_type' => OPENSSL_KEYTYPE_EC, ) ); With the new ECC support it's also possible to load ECC key parameters into the openssl_pkey_new to create a key resource. openssl_pkey_new( array( 'ec' => array( 'curve_name' => 'prime256v1', 'd' => gmp_export('3138550867681922400546388175470823984762234518836963313664'), ), ) ); A use case of this possibility is e.g. the transformation on a JWK [5] to a ECC key resource. Despite the extension of openssl_pkey_new a new PHP function is introduced: openssl_get_curve_names() list names of the supported curves of the underlying OpenSSL core. This function could be used to check if a certain curve is supported and could be referenced when generating a new key pair. I'd like to outline that the ECC support is not a new feature. PHP is capable of reading and working with ECC key pairs. I've contributed some patches to improve the support. To work with ECC key pairs but not being able to generate a new key pair is the main motivation of this PR. ---------- Reference to other languages ---------------------------- The following languages have support for a ECC key pair generation: Ruby [6] Python via cryptography [7] Golang [8] Java via Bouncycastel [9] ---------------------------- Regards Dominic Luechinger [1] https://github.com/php/php-src/pull/1686 [2] https://bugs.php.net/bug.php?id=61204 [3] https://github.com/phpecc/phpecc [4] http://php.net/manual/en/function.openssl-pkey-new.php [5] https://tools.ietf.org/html/rfc7517#page-25 [6] http://ruby-doc.org/stdlib-2.0.0/libdoc/openssl/rdoc/OpenSSL/PKey/EC.html [7] https://cryptography.io/en/latest/hazmat/primitives/asymmetric/ec/ [8] https://golang.org/pkg/crypto/elliptic/#GenerateKey [9] http://www.bouncycastle.org/wiki/display/JA1/Elliptic+Curve+Key+Pair+Generation+and+Key+Factories -- PHP Internals - PHP Runtime Development Mailing List To unsubscribe, visit: http://www.php.net/unsub.php