Skip to content

Commit c51af22

Browse files
committed
implement openssl_256 and openssl_512 for phar singatures
1 parent 8bb0c74 commit c51af22

14 files changed

+128
-18
lines changed

ext/openssl/openssl.c

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -69,6 +69,7 @@
6969

7070
#define MIN_KEY_LENGTH 384
7171

72+
/* constants used in ext/phar/util.c, keep in sync */
7273
#define OPENSSL_ALGO_SHA1 1
7374
#define OPENSSL_ALGO_MD5 2
7475
#define OPENSSL_ALGO_MD4 3

ext/phar/phar.1.in

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -475,7 +475,15 @@ SHA512
475475
.TP
476476
.PD
477477
.B openssl
478-
OpenSSL
478+
OpenSSL using SHA-1
479+
.TP
480+
.PD
481+
.B openssl_sha256
482+
OpenSSL using SHA-256
483+
.TP
484+
.PD
485+
.B openssl_sha512
486+
OpenSSL using SHA-512
479487

480488
.SH SEE ALSO
481489
For a more or less complete description of PHAR look here:

ext/phar/phar.c

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -858,6 +858,8 @@ static int phar_parse_pharfile(php_stream *fp, char *fname, size_t fname_len, ch
858858
PHAR_GET_32(sig_ptr, sig_flags);
859859

860860
switch(sig_flags) {
861+
case PHAR_SIG_OPENSSL_SHA512:
862+
case PHAR_SIG_OPENSSL_SHA256:
861863
case PHAR_SIG_OPENSSL: {
862864
uint32_t signature_len;
863865
char *sig;
@@ -892,7 +894,7 @@ static int phar_parse_pharfile(php_stream *fp, char *fname, size_t fname_len, ch
892894
return FAILURE;
893895
}
894896

895-
if (FAILURE == phar_verify_signature(fp, end_of_phar, PHAR_SIG_OPENSSL, sig, signature_len, fname, &signature, &sig_len, error)) {
897+
if (FAILURE == phar_verify_signature(fp, end_of_phar, sig_flags, sig, signature_len, fname, &signature, &sig_len, error)) {
896898
efree(savebuf);
897899
efree(sig);
898900
php_stream_close(fp);
@@ -3146,7 +3148,9 @@ int phar_flush(phar_archive_data *phar, char *user_stub, zend_long len, int conv
31463148

31473149
php_stream_write(newfile, digest, digest_len);
31483150
efree(digest);
3149-
if (phar->sig_flags == PHAR_SIG_OPENSSL) {
3151+
if (phar->sig_flags == PHAR_SIG_OPENSSL ||
3152+
phar->sig_flags == PHAR_SIG_OPENSSL_SHA256 ||
3153+
phar->sig_flags == PHAR_SIG_OPENSSL_SHA512) {
31503154
phar_set_32(sig_buf, digest_len);
31513155
php_stream_write(newfile, sig_buf, 4);
31523156
}

ext/phar/phar/pharcommand.inc

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -92,7 +92,7 @@ class PharCommand extends CLICommand
9292
'typ' => 'select',
9393
'val' => NULL,
9494
'inf' => '<method> Selects the hash algorithm.',
95-
'select' => array('md5' => 'MD5','sha1' => 'SHA1', 'sha256' => 'SHA256', 'sha512' => 'SHA512', 'openssl' => 'OPENSSL')
95+
'select' => ['md5' => 'MD5','sha1' => 'SHA1', 'sha256' => 'SHA256', 'sha512' => 'SHA512', 'openssl' => 'OPENSSL', 'openssl_sha256' => 'OPENSSL_SHA256', 'openssl_sha512' => 'OPENSSL_SHA512']
9696
),
9797
'i' => array(
9898
'typ' => 'regex',
@@ -156,6 +156,8 @@ class PharCommand extends CLICommand
156156
$hash_avail = Phar::getSupportedSignatures();
157157
$hash_optional = array('SHA-256' => 'SHA256',
158158
'SHA-512' => 'SHA512',
159+
'OpenSSL_sha256' => 'OpenSSL_SHA256',
160+
'OpenSSL_sha512' => 'OpenSSL_SHA512',
159161
'OpenSSL' => 'OpenSSL');
160162
if (!in_array('OpenSSL', $hash_avail)) {
161163
unset($phar_args['y']);
@@ -429,6 +431,16 @@ class PharCommand extends CLICommand
429431
self::error("Cannot use OpenSSL signing without key.\n");
430432
}
431433
return Phar::OPENSSL;
434+
case 'openssl_sha256':
435+
if (!$privkey) {
436+
self::error("Cannot use OpenSSL signing without key.\n");
437+
}
438+
return Phar::OPENSSL_SHA256;
439+
case 'openssl_sha512':
440+
if (!$privkey) {
441+
self::error("Cannot use OpenSSL signing without key.\n");
442+
}
443+
return Phar::OPENSSL_SHA512;
432444
}
433445
}
434446
// }}}

ext/phar/phar_internal.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -88,6 +88,8 @@
8888
#define PHAR_SIG_SHA256 0x0003
8989
#define PHAR_SIG_SHA512 0x0004
9090
#define PHAR_SIG_OPENSSL 0x0010
91+
#define PHAR_SIG_OPENSSL_SHA256 0x0011
92+
#define PHAR_SIG_OPENSSL_SHA512 0x0012
9193

9294
/* flags byte for each file adheres to these bitmasks.
9395
All unused values are reserved */

ext/phar/phar_object.c

Lines changed: 19 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1239,9 +1239,13 @@ PHP_METHOD(Phar, getSupportedSignatures)
12391239
add_next_index_stringl(return_value, "SHA-512", 7);
12401240
#ifdef PHAR_HAVE_OPENSSL
12411241
add_next_index_stringl(return_value, "OpenSSL", 7);
1242+
add_next_index_stringl(return_value, "OpenSSL_SHA256", 14);
1243+
add_next_index_stringl(return_value, "OpenSSL_SHA512", 14);
12421244
#else
12431245
if (zend_hash_str_exists(&module_registry, "openssl", sizeof("openssl")-1)) {
12441246
add_next_index_stringl(return_value, "OpenSSL", 7);
1247+
add_next_index_stringl(return_value, "OpenSSL_SHA256", 14);
1248+
add_next_index_stringl(return_value, "OpenSSL_SHA512", 14);
12451249
}
12461250
#endif
12471251
}
@@ -3003,6 +3007,8 @@ PHP_METHOD(Phar, setSignatureAlgorithm)
30033007
case PHAR_SIG_MD5:
30043008
case PHAR_SIG_SHA1:
30053009
case PHAR_SIG_OPENSSL:
3010+
case PHAR_SIG_OPENSSL_SHA256:
3011+
case PHAR_SIG_OPENSSL_SHA512:
30063012
if (phar_obj->archive->is_persistent && FAILURE == phar_copy_on_write(&(phar_obj->archive))) {
30073013
zend_throw_exception_ex(phar_ce_PharException, 0, "phar \"%s\" is persistent, unable to copy on write", phar_obj->archive->fname);
30083014
RETURN_THROWS();
@@ -3041,19 +3047,25 @@ PHP_METHOD(Phar, getSignature)
30413047
add_assoc_stringl(return_value, "hash", phar_obj->archive->signature, phar_obj->archive->sig_len);
30423048
switch(phar_obj->archive->sig_flags) {
30433049
case PHAR_SIG_MD5:
3044-
add_assoc_stringl(return_value, "hash_type", "MD5", 3);
3050+
add_assoc_string(return_value, "hash_type", "MD5");
30453051
break;
30463052
case PHAR_SIG_SHA1:
3047-
add_assoc_stringl(return_value, "hash_type", "SHA-1", 5);
3053+
add_assoc_string(return_value, "hash_type", "SHA-1");
30483054
break;
30493055
case PHAR_SIG_SHA256:
3050-
add_assoc_stringl(return_value, "hash_type", "SHA-256", 7);
3056+
add_assoc_string(return_value, "hash_type", "SHA-256");
30513057
break;
30523058
case PHAR_SIG_SHA512:
3053-
add_assoc_stringl(return_value, "hash_type", "SHA-512", 7);
3059+
add_assoc_string(return_value, "hash_type", "SHA-512");
30543060
break;
30553061
case PHAR_SIG_OPENSSL:
3056-
add_assoc_stringl(return_value, "hash_type", "OpenSSL", 7);
3062+
add_assoc_string(return_value, "hash_type", "OpenSSL");
3063+
break;
3064+
case PHAR_SIG_OPENSSL_SHA256:
3065+
add_assoc_string(return_value, "hash_type", "OpenSSL_SHA256");
3066+
break;
3067+
case PHAR_SIG_OPENSSL_SHA512:
3068+
add_assoc_string(return_value, "hash_type", "OpenSSL_SHA512");
30573069
break;
30583070
default:
30593071
unknown = strpprintf(0, "Unknown (%u)", phar_obj->archive->sig_flags);
@@ -5064,6 +5076,8 @@ void phar_object_init(void) /* {{{ */
50645076
REGISTER_PHAR_CLASS_CONST_LONG(phar_ce_archive, "PHPS", PHAR_MIME_PHPS)
50655077
REGISTER_PHAR_CLASS_CONST_LONG(phar_ce_archive, "MD5", PHAR_SIG_MD5)
50665078
REGISTER_PHAR_CLASS_CONST_LONG(phar_ce_archive, "OPENSSL", PHAR_SIG_OPENSSL)
5079+
REGISTER_PHAR_CLASS_CONST_LONG(phar_ce_archive, "OPENSSL_SHA256", PHAR_SIG_OPENSSL_SHA256)
5080+
REGISTER_PHAR_CLASS_CONST_LONG(phar_ce_archive, "OPENSSL_SHA512", PHAR_SIG_OPENSSL_SHA512)
50675081
REGISTER_PHAR_CLASS_CONST_LONG(phar_ce_archive, "SHA1", PHAR_SIG_SHA1)
50685082
REGISTER_PHAR_CLASS_CONST_LONG(phar_ce_archive, "SHA256", PHAR_SIG_SHA256)
50695083
REGISTER_PHAR_CLASS_CONST_LONG(phar_ce_archive, "SHA512", PHAR_SIG_SHA512)

ext/phar/tests/files/openssl256.phar

6.96 KB
Binary file not shown.
Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
-----BEGIN PUBLIC KEY-----
2+
MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDA3ADUiKZIEhekYShzPCZ3LFbg
3+
rDuV44jH94OdJQfqaCQBvZXqMoG1bWOeYfbc3iO0gHWW3SKB27Sf1ZBnc5c1+YzB
4+
mx9bFipOX2W2ouKS2YoHeIoR9leDNu4yqwBsuggFPGVPxM9ikEI+YAOGVTCd4mV5
5+
agpkVsHLNJWbz/nPVwIDAQAB
6+
-----END PUBLIC KEY-----

ext/phar/tests/files/openssl512.phar

6.96 KB
Binary file not shown.
Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
-----BEGIN PUBLIC KEY-----
2+
MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDA3ADUiKZIEhekYShzPCZ3LFbg
3+
rDuV44jH94OdJQfqaCQBvZXqMoG1bWOeYfbc3iO0gHWW3SKB27Sf1ZBnc5c1+YzB
4+
mx9bFipOX2W2ouKS2YoHeIoR9leDNu4yqwBsuggFPGVPxM9ikEI+YAOGVTCd4mV5
5+
agpkVsHLNJWbz/nPVwIDAQAB
6+
-----END PUBLIC KEY-----

0 commit comments

Comments
 (0)