From 4f9daeed1104b3abce87b218cf7537f60e5b8cdb Mon Sep 17 00:00:00 2001 From: Greg Beaver Date: Fri, 13 Jun 2008 22:07:44 +0000 Subject: [PATCH] [DOC] implement full signature support for tar-based archives. By default, data archives do not have a signature, but can have one set via setSignatureAlgorithm() --- ext/phar/phar.phar | Bin 15252 -> 15252 bytes ext/phar/phar_internal.h | 2 +- ext/phar/phar_object.c | 5 - ext/phar/tar.c | 156 +++++++++++++++++- ext/phar/tests/badparameters.phpt | 6 - ext/phar/tests/phar_convert_again.phpt | 7 - ext/phar/tests/phar_setsignaturealgo2.phpt | 4 +- ext/phar/tests/stat2.phpt | 1 + ext/phar/tests/stat2_5.3.phpt | 1 + ext/phar/tests/tar/bignames.phpt | 2 + .../tests/tar/files/frontcontroller.phar.tar | Bin 6144 -> 7168 bytes .../tar/files/frontcontroller10.phar.tar | Bin 3072 -> 4096 bytes .../tar/files/frontcontroller11.phar.tar | Bin 3072 -> 4096 bytes .../tar/files/frontcontroller12.phar.tar | Bin 3072 -> 4096 bytes .../tests/tar/files/frontcontroller2.phar.tar | Bin 5120 -> 6144 bytes .../tests/tar/files/frontcontroller3.phar.tar | Bin 5120 -> 6144 bytes .../tests/tar/files/frontcontroller4.phar.tar | Bin 5120 -> 6144 bytes .../tests/tar/files/frontcontroller5.phar.tar | Bin 5120 -> 6144 bytes .../tests/tar/files/frontcontroller6.phar.tar | Bin 5120 -> 6144 bytes .../tests/tar/files/frontcontroller7.phar.tar | Bin 5120 -> 6144 bytes .../tests/tar/files/frontcontroller8.phar.tar | Bin 6144 -> 7168 bytes .../tests/tar/files/frontcontroller9.phar.tar | Bin 6144 -> 7168 bytes ext/phar/tests/tar/links.phpt | 2 + ext/phar/tests/tar/links3.phpt | 2 + ext/phar/tests/tar/links4.phpt | 2 + ext/phar/tests/tar/links5.phpt | 2 + .../tests/tar/phar_setsignaturealgo2.phpt | 84 ++++++++++ ext/phar/tests/tar/require_hash.phpt | 56 +++++++ ext/phar/tests/tar/tar_003.phpt | 1 + ext/phar/tests/tar/tar_004.phpt | 1 + ext/phar/tests/tar/tar_bz2.phpt | 1 + ext/phar/tests/tar/tar_gzip.phpt | 1 + ext/phar/tests/tar/tar_nostub.phpt | 1 + ext/phar/tests/zf_test.phpt | 1 + ext/phar/util.c | 2 +- 35 files changed, 315 insertions(+), 25 deletions(-) create mode 100644 ext/phar/tests/tar/phar_setsignaturealgo2.phpt create mode 100644 ext/phar/tests/tar/require_hash.phpt diff --git a/ext/phar/phar.phar b/ext/phar/phar.phar index 06432e05798d05ddf8d1c336a0f9a1092d05d695..834529deebd790b4eb28bf890ef7fa69fe22c685 100755 GIT binary patch delta 79 zcmbPIKBas^04tNri^)N(CLpSV)fhzWg;1YZH9Uo_*H*F8rj1_lOqCtoK3^y(hE diff --git a/ext/phar/phar_internal.h b/ext/phar/phar_internal.h index cb7a20419b..f1c12a18df 100755 --- a/ext/phar/phar_internal.h +++ b/ext/phar/phar_internal.h @@ -420,7 +420,7 @@ int phar_open_executed_filename(char *alias, int alias_len, char **error TSRMLS_ int phar_free_alias(phar_archive_data *phar, char *alias, int alias_len TSRMLS_DC); int phar_get_archive(phar_archive_data **archive, char *fname, int fname_len, char *alias, int alias_len, char **error TSRMLS_DC); int phar_open_parsed_phar(char *fname, int fname_len, char *alias, int alias_len, int is_data, int options, phar_archive_data** pphar, char **error TSRMLS_DC); -int phar_verify_signature(php_stream *fp, size_t end_of_phar, int sig_type, char *sig, int sig_len, char *fname, char **signature, int *signature_len, char **error TSRMLS_DC); +int phar_verify_signature(php_stream *fp, size_t end_of_phar, php_uint32 sig_type, char *sig, int sig_len, char *fname, char **signature, int *signature_len, char **error TSRMLS_DC); int phar_create_signature(phar_archive_data *phar, php_stream *fp, char **signature, int *signature_length, char **error TSRMLS_DC); /* utility functions */ diff --git a/ext/phar/phar_object.c b/ext/phar/phar_object.c index c7801542c9..092162b955 100755 --- a/ext/phar/phar_object.c +++ b/ext/phar/phar_object.c @@ -2707,11 +2707,6 @@ PHP_METHOD(Phar, setSignatureAlgorithm) "Cannot set signature algorithm, phar is read-only"); return; } - if (phar_obj->arc.archive->is_tar) { - zend_throw_exception_ex(spl_ce_BadMethodCallException, 0 TSRMLS_CC, - "Cannot set signature algorithm, not possible with tar-based phar archives"); - return; - } if (phar_obj->arc.archive->is_zip) { zend_throw_exception_ex(spl_ce_BadMethodCallException, 0 TSRMLS_CC, "Cannot set signature algorithm, not possible with zip-based phar archives"); diff --git a/ext/phar/tar.c b/ext/phar/tar.c index 1cd5046aa0..bb79b1a46d 100644 --- a/ext/phar/tar.c +++ b/ext/phar/tar.c @@ -243,6 +243,86 @@ int phar_parse_tarfile(php_stream* fp, char *fname, int fname_len, char *alias, size = entry.uncompressed_filesize = entry.compressed_filesize = phar_tar_number(hdr->size, sizeof(hdr->size)); + if (((!old && hdr->prefix[0] == 0) || old) && strlen(hdr->name) == sizeof(".phar/signature.bin")-1 && !strncmp(hdr->name, ".phar/signature.bin", sizeof(".phar/signature.bin")-1)) { + size_t read; + if (size > 511) { + if (error) { + spprintf(error, 4096, "phar error: tar-based phar \"%s\" has signature that is larger than 511 bytes, cannot process", fname); + } +bail: + php_stream_close(fp); + zend_hash_destroy(&myphar->manifest); + myphar->manifest.arBuckets = 0; + zend_hash_destroy(&myphar->mounted_dirs); + myphar->mounted_dirs.arBuckets = 0; + pefree(myphar, myphar->is_persistent); + return FAILURE; + } + read = php_stream_read(fp, buf, size); + if (read != size) { + if (error) { + spprintf(error, 4096, "phar error: tar-based phar \"%s\" signature cannot be read", fname); + } + goto bail; + } +#ifdef WORDS_BIGENDIAN +# define PHAR_GET_32(buffer) \ + (((((unsigned char*)(buffer))[3]) << 24) \ + | ((((unsigned char*)(buffer))[2]) << 16) \ + | ((((unsigned char*)(buffer))[1]) << 8) \ + | (((unsigned char*)(buffer))[0])) +#else +# define PHAR_GET_32(buffer) (php_uint32) *(buffer) +#endif + if (FAILURE == phar_verify_signature(fp, php_stream_tell(fp) - size - 512, PHAR_GET_32(buf), buf + 8, PHAR_GET_32(buf + 4), fname, &myphar->signature, &myphar->sig_len, error TSRMLS_CC)) { + if (error) { + char *save = *error; + spprintf(error, 4096, "phar error: tar-based phar \"%s\" signature cannot be verified: %s", fname, save); + efree(save); + } + goto bail; + } + /* signature checked out, let's ensure this is the last file in the phar */ + size = ((size+511)&~511) + 512; + if (((hdr->typeflag == 0) || (hdr->typeflag == TAR_FILE)) && size > 0) { + /* this is not good enough - seek succeeds even on truncated tars */ + php_stream_seek(fp, size, SEEK_CUR); + if ((uint)php_stream_tell(fp) > totalsize) { + if (error) { + spprintf(error, 4096, "phar error: \"%s\" is a corrupted tar file (truncated)", fname); + } + php_stream_close(fp); + zend_hash_destroy(&myphar->manifest); + myphar->manifest.arBuckets = 0; + zend_hash_destroy(&myphar->mounted_dirs); + myphar->mounted_dirs.arBuckets = 0; + pefree(myphar, myphar->is_persistent); + return FAILURE; + } + } + read = php_stream_read(fp, buf, sizeof(buf)); + if (read != sizeof(buf)) { + if (error) { + spprintf(error, 4096, "phar error: \"%s\" is a corrupted tar file (truncated)", fname); + } + php_stream_close(fp); + zend_hash_destroy(&myphar->manifest); + myphar->manifest.arBuckets = 0; + zend_hash_destroy(&myphar->mounted_dirs); + myphar->mounted_dirs.arBuckets = 0; + pefree(myphar, myphar->is_persistent); + return FAILURE; + } + hdr = (tar_header*) buf; + sum1 = phar_tar_number(hdr->checksum, sizeof(hdr->checksum)); + if (sum1 == 0 && phar_tar_checksum(buf, sizeof(buf)) == 0) { + break; + } + if (error) { + spprintf(error, 4096, "phar error: \"%s\" has entries after signature, invalid phar", fname); + } + goto bail; + } if (!old && hdr->prefix[0] != 0) { char name[256]; @@ -419,6 +499,21 @@ int phar_parse_tarfile(php_stream* fp, char *fname, int fname_len, char *alias, return FAILURE; } } while (read != 0); + + /* ensure signature set */ + if (PHAR_G(require_hash) && !myphar->signature) { + php_stream_close(fp); + zend_hash_destroy(&myphar->manifest); + myphar->manifest.arBuckets = 0; + zend_hash_destroy(&myphar->mounted_dirs); + myphar->mounted_dirs.arBuckets = 0; + pefree(myphar, myphar->is_persistent); + if (error) { + spprintf(error, 0, "tar-based phar \"%s\" does not have a signature", fname); + } + return FAILURE; + } + myphar->fname = pestrndup(fname, fname_len, myphar->is_persistent); #ifdef PHP_WIN32 phar_unixify_path_separators(myphar->fname, fname_len); @@ -712,9 +807,9 @@ int phar_tar_flush(phar_archive_data *phar, char *user_stub, long len, int defau phar_entry_info entry = {0}; static const char newstub[] = "alias, phar->alias_len); if (phar->alias_len != (int)php_stream_write(entry.fp, phar->alias, phar->alias_len)) { if (error) { spprintf(error, 0, "unable to set alias in tar-based phar \"%s\"", phar->fname); @@ -926,6 +1020,62 @@ nostub: zend_hash_apply_with_argument(&phar->manifest, (apply_func_arg_t) phar_tar_writeheaders, (void *) &pass TSRMLS_CC); + /* add signature for executable tars or tars explicitly set with setSignatureAlgorithm */ + if (!phar->is_data || phar->sig_flags) { + if (FAILURE == phar_create_signature(phar, newfile, &signature, &signature_length, error TSRMLS_CC)) { + if (error) { + char *save = *error; + spprintf(error, 0, "phar error: unable to write signature to tar-based phar: %s", save); + efree(save); + } + if (closeoldfile) { + php_stream_close(oldfile); + } + php_stream_close(newfile); + return EOF; + } + entry.filename = ".phar/signature.bin"; + entry.filename_len = sizeof(".phar/signature.bin")-1; + entry.fp = php_stream_fopen_tmpfile(); + +#ifdef WORDS_BIGENDIAN +# define PHAR_SET_32(var, buffer) \ + *(php_uint32 *)(var) = (((((unsigned char*)(buffer))[3]) << 24) \ + | ((((unsigned char*)(buffer))[2]) << 16) \ + | ((((unsigned char*)(buffer))[1]) << 8) \ + | (((unsigned char*)(buffer))[0])) +#else +# define PHAR_SET_32(var, buffer) *(php_uint32 *)(var) = (php_uint32) (buffer) +#endif + PHAR_SET_32(sigbuf, phar->sig_flags); + PHAR_SET_32(sigbuf + 4, signature_length); + if (8 != php_stream_write(entry.fp, sigbuf, 8) || signature_length != php_stream_write(entry.fp, signature, signature_length)) { + efree(signature); + if (error) { + spprintf(error, 0, "phar error: unable to write signature to tar-based phar %s", phar->fname); + } + if (closeoldfile) { + php_stream_close(oldfile); + } + php_stream_close(newfile); + return EOF; + } + efree(signature); + + entry.uncompressed_filesize = entry.compressed_filesize = signature_length + 8; + /* throw out return value and write the signature */ + entry.filename_len = phar_tar_writeheaders((void *)&entry, (void *)&pass); + + if (error && *error) { + if (closeoldfile) { + php_stream_close(oldfile); + } + /* error is set by writeheaders */ + php_stream_close(newfile); + return EOF; + } + } /* signature */ + /* add final zero blocks */ buf = (char *) ecalloc(1024, 1); php_stream_write(newfile, buf, 1024); diff --git a/ext/phar/tests/badparameters.phpt b/ext/phar/tests/badparameters.phpt index c644424d25..ed3ae274b5 100644 --- a/ext/phar/tests/badparameters.phpt +++ b/ext/phar/tests/badparameters.phpt @@ -77,11 +77,6 @@ $a->setSignatureAlgorithm(Phar::MD5); echo $e->getMessage() . "\n"; } try { -$b->setSignatureAlgorithm(Phar::MD5); -} catch (Exception $e) { -echo $e->getMessage() . "\n"; -} -try { $c->setSignatureAlgorithm(Phar::MD5); } catch (Exception $e) { echo $e->getMessage() . "\n"; @@ -165,7 +160,6 @@ A Phar stub cannot be set in a plain tar archive Warning: Phar::setDefaultStub() expects parameter 1 to be string, array given in %sbadparameters.php on line %d Cannot change stub: phar.readonly=1 Cannot set signature algorithm, phar is read-only -Cannot set signature algorithm, not possible with tar-based phar archives Cannot set signature algorithm, not possible with zip-based phar archives Warning: Phar::compress() expects parameter 1 to be long, array given in %sbadparameters.php on line %d diff --git a/ext/phar/tests/phar_convert_again.phpt b/ext/phar/tests/phar_convert_again.phpt index 4543a238d5..9485f1e6aa 100644 --- a/ext/phar/tests/phar_convert_again.phpt +++ b/ext/phar/tests/phar_convert_again.phpt @@ -139,12 +139,6 @@ $data->setDefaultStub(); } catch (Exception $e) { echo $e->getMessage() . "\n"; } -try { -$data->setSignatureAlgorithm(Phar::MD5); -} catch (Exception $e) { -echo $e->getMessage() . "\n"; -} - try { $tgz->convertToData(Phar::TAR, Phar::GZ, '.phar.tgz.oops'); } catch (Exception $e) { @@ -211,7 +205,6 @@ Unknown compression specified, please pass one of Phar::GZ or Phar::BZ2 A Phar stub cannot be set in a plain tar archive A Phar alias cannot be set in a plain tar archive A Phar stub cannot be set in a plain tar archive -Cannot set signature algorithm, not possible with tar-based phar archives data phar "%sphar_convert_again2.phar.tgz.oops" has invalid extension phar.tgz.oops phar "%sphar_convert_again2.tgz.oops" has invalid extension tgz.oops data phar "%sphar_convert_again2.phar/.tgz.oops" has invalid extension phar/.tgz.oops diff --git a/ext/phar/tests/phar_setsignaturealgo2.phpt b/ext/phar/tests/phar_setsignaturealgo2.phpt index 57b16097e7..c7f5f9ecfc 100644 --- a/ext/phar/tests/phar_setsignaturealgo2.phpt +++ b/ext/phar/tests/phar_setsignaturealgo2.phpt @@ -10,7 +10,7 @@ phar.readonly=0 --FILE-- getSignature()); $p->setSignatureAlgorithm(Phar::MD5); @@ -42,7 +42,7 @@ echo $e->getMessage(); ===DONE=== --CLEAN-- --EXPECTF-- array(2) { diff --git a/ext/phar/tests/stat2.phpt b/ext/phar/tests/stat2.phpt index 6e911028ca..defda719f3 100644 --- a/ext/phar/tests/stat2.phpt +++ b/ext/phar/tests/stat2.phpt @@ -5,6 +5,7 @@ Phar: test stat function interceptions and is_file/is_link edge cases (PHP 5.2) --INI-- phar.readonly=0 +phar.require_hash=0 --FILE-- --INI-- phar.readonly=0 +phar.require_hash=0 --FILE-- +--INI-- +phar.require_hash=0 --FILE-- % delta 211 zcmZp$XfT+N!D3)$W;QWLO3c96z|g?l#K6eh$i&nD1We70jVB8-rfz0rOlO9wlN2{J zF+o=d)MW-y$O>18-9RG~h&oOrbw+0B=9w87K`rJ*R%d{r&eX^dVxHiCro{$gEC738 BF1`Q& diff --git a/ext/phar/tests/tar/files/frontcontroller10.phar.tar b/ext/phar/tests/tar/files/frontcontroller10.phar.tar index d43ed916a13489480678609c069207eb1efe69e1..574d7cd7c877ff8977096126c3aed0ef89cef1ac 100644 GIT binary patch delta 194 zcmZpWXi%7t!D41+#xOBQLej*{gu&3zz{teZ%-G1-h{3?Xz|7d(NWoyTAY;mAM#gkz zxKd*S45j8qCWbJjtpAxNv9R-GrspM=loqAxC1vJK6b$458fXBrY;q2ZlsLKpAdAf) w225sT{4c}Az`!5^#O(aStmm(77oC@HWVIvS>cnnFp7PBX+4NZ_D==;a0Ejj&CjbBd delta 93 zcmZorXpoqY!D3)$W;Qv8LsHzt%*4RZz}&>Z$lS=p+|&RF%uG#8CJQpAZf0amXNIYi W5;MS1Xl`O?3{lAXpJ}lH7YhL8qZJDP diff --git a/ext/phar/tests/tar/files/frontcontroller11.phar.tar b/ext/phar/tests/tar/files/frontcontroller11.phar.tar index c8f98a1e78f04cc44c0d48d8c9ad53e6aacf08a8..08cbdc1bfedbc0416fef723a3d5c9333231ddb5d 100644 GIT binary patch delta 194 zcmZpWXi%7t!D41+#xOBQLej*{gu&3zz{teZ%-G1-gu%eTz|7d(M8ROPAY;mAM#gkz zxKblCb9ANVMyAFvrL6y%Cb6*dWTxjOmXsEy>Lq37O%x2|02*iju}o3|Xg;c4K#NTc xAO=ikWc)9~#K6EH0>rDYG6XH>V>+}z;qsqD;>tqGSr2ya8GA{rC delta 94 zcmZorXpoqY!D3)$W;Qv8LsHzt%*4RZz}&>Z$lS=(&;SI?OpT2u3o@o|W@JofMyND0 VGe=ixZenN%QOWwBX|Vwp3jp@T6)gY& diff --git a/ext/phar/tests/tar/files/frontcontroller12.phar.tar b/ext/phar/tests/tar/files/frontcontroller12.phar.tar index 06e7e59b03ed4677e37bd252d5d13ad712b7d5aa..e0f22f5f459c22e91265539c973b8c84b131e4b2 100644 GIT binary patch delta 194 zcmZpWXi%7t!D41+#xOBQLej*{gu&3zz{teZ%-G1-jKRRbz|7d(Ou=BXAY;mAM#gkz zxKbl?BXp(aMy7@^rL6y%Cb6*dWTxjOmXsEy>Lq37O%x2|02*iju}o6J7~L+Q#im9O w112*v{+D55U|Z$lS=((AWS7%uJ0QznDX;n#{=fUxtZ+fk6a_*Ylqj*m5FxmXh4Eg=MKW ScaBY(z_wYD?>_591y%r)Pe087 delta 171 zcmZoLXwaCD!D3)$W;QWLO3c96z|g?l#K6eh$i&px00>OYjLjwsGNx{3WK3sQ%Z9SG*seU{latcG_5y(VdG((sK7Oe z1Fv(ofJrH!JepXPv0P F3ILg^TeJWG delta 271 zcmZoLXwaCD!D3)$W;QWLO3c96z|g?l)Y#n6%*@o#00>OYOiU*WGNx{3WK3swa^E2LzmDCFgrC=`|E#pEej^G-g`Ce6sZ o`4t-v<0KCJjy5)fxP=q$XeluxGjunb85l!7$NQgYv4Ic^07s=k0ssI2 diff --git a/ext/phar/tests/tar/files/frontcontroller4.phar.tar b/ext/phar/tests/tar/files/frontcontroller4.phar.tar index 5d11af499c181d8bada5b7a9d0579368cb034865..4cd684d25cc0346fafcd7a7e4bb5e107c16494e4 100644 GIT binary patch delta 388 zcmZqBXfT+N!D41+#xOBQO5B*i(9poh#MI2#$jE@fz`(%N#LQH|V6q@%%4SB!bY`eR z2}xsfGjyfqMkeMkrK~KBf?R2(dC4W2`FRS(8Y+pJT-B2$+0-XHvZ)DjDF8uHYDsBP zo`OoEHCOHAYBn1)uGHj=dOYOpPWBGNx{3WK3s5B46&6H?mQ_mBQtc@nHiWs Ny}|pRX|aJ23jq0eIX(aY diff --git a/ext/phar/tests/tar/files/frontcontroller5.phar.tar b/ext/phar/tests/tar/files/frontcontroller5.phar.tar index e6e9015bf8e23f9532eb73997712f8dcbc2d39da..6053eb278333d956fbdfc5c5db42ace0f97d543e 100644 GIT binary patch delta 274 zcmZqBXfT+N!D41+#xOBQO5B*i(9poh#MI2#$jFevz`(%N#LP^=V6q@%%4SB!bY`eR z2}vU(Q*@=~Mka-1266!1XaI4&q=c~vngJlcm_V$W%*gm(hKYfJK?H~ool~$$Ne`HMp`>!v V)ZHRm1y{SA*sRERpLL=FD*%1RKnnl> delta 171 zcmZoLXwaCD!D3)$W;QWLO3c96z|g?l#K6eh$i&Rh00>OYj7=vCGNx{3WK3rUtDBs| uBPC{JimuSy#LxhukQJ&Bmw`rR5OthL>Ws|L%`-DFf?CY`pJ}my5DNgOYjLjztGNx{3WK3rUtDBs| tBPC{Jj;_$$#LxtykQJ&Br-23#b(~1*jLgu@GXpvTqK@}J(_#Z5769FKCJ+Ds diff --git a/ext/phar/tests/tar/files/frontcontroller7.phar.tar b/ext/phar/tests/tar/files/frontcontroller7.phar.tar index c7ccc940c149fafcc84595c7c736094bc574e4b5..8327ae981685c34a30f65ce646f67a2edf53397f 100644 GIT binary patch delta 274 zcmZqBXfT+N!D41+#xOBQO5B*i(9poh#MI2#$jF4jz`(%N#N1H9V6q@%%4SB!bY`eR z2}vVk19YY4MkWR@rL1tJSj{vuf+^&LDx93dA|-ByZltN18QgZ>|4fru*m*M3^Abx+ zi&FKHGV>-1266!1XaI4&q=c~vngJlcm_w|Z%*gm(hKYfJK?H~ywu>ss<+8qYyVtJ% U$)~qa*(>JqW<|dHtP>Sj0Z`jMJpcdz delta 171 zcmZoLXwaCD!D3)$W;QWLO3c96z|g?l#K6eh$i&Rl00>OYObjOrGNx{3WK3rUtDBs| uBPC{RfUeNo#LxhukQJ&Bmx0Dc5OthL>Ws|L%`-DFhFZ+~pJ}my5DNg=X(k2$ diff --git a/ext/phar/tests/tar/files/frontcontroller8.phar.tar b/ext/phar/tests/tar/files/frontcontroller8.phar.tar index 98495717cec043718c39f6c04632a3c90bccd93d..3440a7f32a55316265a93e883020c09749cfeb25 100644 GIT binary patch delta 312 zcmZoLXt0=&!D41+#xOBQO5B9O(9poh#MI2#$jFSrz`(%N%+y@LV6q@%%4SB!bY`eR z2}xrEGjyfqMkZ!3rL1tJ*vvFBGlePSge#Pk0NRLdyQzTzOeHT|B^D#ifR@7)3jSxB z#KO*#nVy$eQd*R%mz0?|Q817L=otf$Hz((?U>X4Qw5cJ)fXR%E|7DmM7#Ku=_|pCl c%o9Q;?z?cX>(9>(>lM76SKDqD6ner60DD_WYXATM delta 211 zcmZp$XfT+N!D3)$W;QWLO3c8-z|g?l#K6eh$i&Rt00_*0?8$(uRIwK78OwCLUAnJIL)L}Z%9Ozz%I>G-;iw(qB E0DM(0*8l(j diff --git a/ext/phar/tests/tar/files/frontcontroller9.phar.tar b/ext/phar/tests/tar/files/frontcontroller9.phar.tar index 481864c1cf465897f23968ad6d7298f2af522da5..15e95b18f24898fa3e0a6226230707eee924597e 100644 GIT binary patch delta 311 zcmZoLXt0=&!D41+#xOBQO5B9O(9poh#MI2#$k>3vz`(%N%+yH1V6q@%%4SB!bY`eR z2}xrULv*F)MkWR@rL1tJ*vvFBgDd2OE0mNlGDA1g)WqBvW+X3MB^D#i%ni+93I+c& zO=4l^$xP2nEGaEY)l16Enx00_(sjEp7=GNx{3WK3rUtDBr7 zA}wl&uFl-V&;X*26{-%qd8TH@P<5P0>Ws|L%`-JKF@~7Oi=+ +--INI-- +phar.require_hash=0 --FILE-- +--INI-- +phar.require_hash=0 --FILE-- +--INI-- +phar.require_hash=0 --FILE-- +--INI-- +phar.require_hash=0 --FILE-- + + +--INI-- +phar.require_hash=0 +phar.readonly=0 +--FILE-- +getSignature()); +$p->setSignatureAlgorithm(Phar::MD5); +var_dump($p->getSignature()); +$p->setSignatureAlgorithm(Phar::SHA1); +var_dump($p->getSignature()); +try { +$p->setSignatureAlgorithm(Phar::SHA256); +var_dump($p->getSignature()); +} catch (Exception $e) { +echo $e->getMessage(); +} +try { +$p->setSignatureAlgorithm(Phar::SHA512); +var_dump($p->getSignature()); +} catch (Exception $e) { +echo $e->getMessage(); +} +try { +$private = openssl_get_privatekey(file_get_contents(dirname(dirname(__FILE__)) . '/files/private.pem')); +$pkey = ''; +openssl_pkey_export($private, $pkey); +$p->setSignatureAlgorithm(Phar::OPENSSL, $pkey); +var_dump($p->getSignature()); +} catch (Exception $e) { +echo $e->getMessage(); +} +?> +===DONE=== +--CLEAN-- + +--EXPECTF-- +array(2) { + ["hash"]=> + string(%d) "%s" + ["hash_type"]=> + string(5) "SHA-1" +} +array(2) { + ["hash"]=> + string(%d) "%s" + ["hash_type"]=> + string(3) "MD5" +} +array(2) { + ["hash"]=> + string(%d) "%s" + ["hash_type"]=> + string(5) "SHA-1" +} +array(2) { + ["hash"]=> + string(%d) "%s" + ["hash_type"]=> + string(7) "SHA-256" +} +array(2) { + ["hash"]=> + string(%d) "%s" + ["hash_type"]=> + string(7) "SHA-512" +} +array(2) { + ["hash"]=> + string(%d) "%s" + ["hash_type"]=> + string(7) "OpenSSL" +} +===DONE=== diff --git a/ext/phar/tests/tar/require_hash.phpt b/ext/phar/tests/tar/require_hash.phpt new file mode 100644 index 0000000000..002931bba6 --- /dev/null +++ b/ext/phar/tests/tar/require_hash.phpt @@ -0,0 +1,56 @@ +--TEST-- +Phar: tar-based phar, require_hash=1, no signature +--SKIPIF-- + + +--INI-- +phar.readonly=1 +phar.require_hash=0 +--FILE-- +init(); +$tar->addFile('tar_004.php', 'addFile('internal/file/here', "hi there!\n"); +$tar->close(); + +try { + $phar = new Phar($fname); + var_dump($phar->getStub()); +} catch (Exception $e) { + echo $e->getMessage()."\n"; +} +ini_set('phar.require_hash', 0); +try { + $phar = new PharData($fname2); + $phar['file'] = 'hi'; + var_dump($phar->getSignature()); + $phar->setSignatureAlgorithm(Phar::MD5); + var_dump($phar->getSignature()); +} catch (Exception $e) { + echo $e->getMessage()."\n"; +} + +?> +===DONE=== +--CLEAN-- + +--EXPECTF-- +tar-based phar "%star_004.phar.tar" does not have a signature +bool(false) +array(2) { + ["hash"]=> + string(32) "%s" + ["hash_type"]=> + string(3) "MD5" +} +===DONE=== diff --git a/ext/phar/tests/tar/tar_003.phpt b/ext/phar/tests/tar/tar_003.phpt index b390805dc3..3dec341784 100644 --- a/ext/phar/tests/tar/tar_003.phpt +++ b/ext/phar/tests/tar/tar_003.phpt @@ -5,6 +5,7 @@ Phar: tar-based phar, valid 1 --INI-- phar.readonly=0 +phar.require_hash=0 --FILE-- --INI-- phar.readonly=0 +phar.require_hash=0 --FILE-- --INI-- phar.readonly=0 +phar.require_hash=0 --FILE-- --INI-- phar.readonly=0 +phar.require_hash=0 --FILE-- getStub() --INI-- phar.readonly=1 +phar.require_hash=0 --FILE-- --INI-- phar.readonly=0 +phar.require_hash=0 --FILE--