Re: OpenSSL and Phar
| From: | Steph Fox | Date: | Mon, 23 Jun 2008 14:38:53 +0000 |
| Subject: | Re: OpenSSL and Phar | ||
| References: | 1 2 3 4 | Groups: | php.internals |
| Request: | Send a blank email to internals+get-38543@lists.php.net to get a copy of this message | ||
Hey Pierre,
--enable-phar-ssl and do (not tested but it gives the idea): if (PHP_PHAR_SSL == "yes") { ADD_EXTENSION_DEP("phar", "openssl", true); } else { ....Erm... no, you've definitely missed the point. ADD_EXTENSION_DEP() only works in one of the four possible scenarios, and that one is when both phar and openssl are built as static. It will break the build for all other combinations. There are two ways to get phar to build alongside openssl in the other three scenarios: You can add an explicit dependency on the underlying OpenSSL libs, or you can ignore the relationship completely. If you do the former, the related functionality in phar does not actually require ext/openssl to be loaded. If you do the latter, it does.
'enabled by default' usually implies 'built-in'. and it is built shared as almost allFWIW, I think having Phar built-in is actually a disadvantage when it comes to this kind of thing. ext/openssl isn't enabled by default and is only available as shared to the vast majority of Windows users.it is enabled by default
extensions. The rest is a matter of documenting it, like almost all extensions, "please enable phar and openssl (if available) in your php.ini".We can sign and verify OpenSSL signatures without ext/openssl if we have the library dependency. In other words, this (with the module checks in util.c commented out) works fine: $p = new Phar('sigtest.phar'); $p['a.txt'] = 'whatever'; $pkey = file_get_contents(dirname(__FILE__) . '/files/private.pem'); $p->setSignatureAlgorithm(Phar::OPENSSL, $pkey); var_dump($p->getSignature()); output: array(2) { ["hash"]=> string(256) "A408120F3D5EAD7FAFB891FD6D3DB8A35A68741A550009F685517BA05086C35919730B81DAC06408082E0363F7DC25B7F51AFA9D3B598ECBE42D961296A201EE4ECD343BB707CD3C7F8E788C812477343644516591470F885A712326058B8A46DA769DADA8CDBC30C4DF47DD0A13C0A9AEF9FE4E62300EBD79C53215B415999E" ["hash_type"]=> string(7) "OpenSSL" } and so does this: $p = new Phar(dirname(__FILE__) . '/files/openssl.phar'); $sig = $p->getSignature(); var_dump($sig); output: array(2) { ["hash"]=> string(256) "1614A127C7DEB5405D175FFB2D20031E5E78A1FB993D8A854862940F28D0BB3207E1722F424DC731131BFC082D4B8A2F7B053E1B4405400F4D6D6AA0BBF2E45B3028CC6C01C9C361DC1A4B65D3932B075CB33948AF0B147076EBA3B13010B27DC64D7DAD340B2E399CA7848BB59434C1BC55B5B062F134A6943202F8FF63BD7B" ["hash_type"]=> string(7) "OpenSSL" } Currently my config.w32 for PECL looks like this: ARG_ENABLE("phar", "enable phar support", "no"); ARG_ENABLE("phar-ssl", "enable phar with OpenSSL support", "no"); if (PHP_PHAR_SSL != "no") { PHP_PHAR = PHP_PHAR_SSL; PHP_PHAR_SHARED = PHP_PHAR_SSL_SHARED; } if (PHP_PHAR != "no") { EXTENSION("phar", "dirstream.c func_interceptors.c phar.c phar_object.c phar_path_check.c stream.c tar.c util.c zip.c"); if (PHP_PHAR_SHARED) { ADD_FLAG("CFLAGS_PHAR", "/D COMPILE_DL_PHAR "); } if (PHP_PHAR_SSL != "no" || PHP_OPENSSL != "no") { ADD_FLAG("LIBS_PHAR", "libeay32.lib ssleay32.lib"); AC_DEFINE('PHAR_HAVE_OPENSSL', 1); } ADD_EXTENSION_DEP('phar', 'spl', true); } The config.w32 for core needs more thought because phar is enabled statically by default there. It might be that Greg's is the only solution in that set-up (i.e. phar only has internal openssl support if ext/openssl is also statically linked, and the only way to get openssl support in phar otherwise is to load php_openssl.dll.) - Steph