}
/* }}}*/
+static const char hexChars[] = "0123456789ABCDEF";
+
+static int phar_hex_str(const char *digest, size_t digest_len, char ** signature)
+{
+ int pos = -1;
+ size_t len;
+
+ *signature = (char*)safe_emalloc(digest_len, 2, 1);
+
+ for(len = 0; len < digest_len; ++len) {
+ (*signature)[++pos] = hexChars[((const unsigned char *)digest)[len] >> 4];
+ (*signature)[++pos] = hexChars[((const unsigned char *)digest)[len] & 0x0F];
+ }
+ (*signature)[++pos] = '\0';
+ return pos;
+}
+
/**
* Does not check for a previously opened phar in the cache.
*
return FAILURE;
}
- sig_len = sizeof(digest) * 2;
- signature = (char*)safe_emalloc(sizeof(digest), 2, 1);
- for(len = 0; len < sizeof(digest); ++len)
- {
- sprintf(signature+len+len, "%02X", digest[len]);
- }
- signature[sizeof(digest) * 2] = '\0';
+ sig_len = phar_hex_str(digest, sizeof(digest), &signature);
break;
}
case PHAR_SIG_MD5: {
return FAILURE;
}
- sig_len = sizeof(digest) * 2;
- signature = (char*)safe_emalloc(sizeof(digest), 2, 1);
- for(len = 0; len < sizeof(digest); ++len)
- {
- sprintf(signature+len+len, "%02X", digest[len]);
- }
- signature[sizeof(digest) * 2] = '\0';
+ sig_len = phar_hex_str(digest, sizeof(digest), &signature);
break;
}
default:
/* append signature */
if (global_flags & PHAR_HDR_SIGNATURE) {
unsigned char buf[1024];
- int sig_flags = 0, sig_len, len;
+ int sig_flags = 0, sig_len;
char sig_buf[4];
php_stream_rewind(newfile);
PHP_SHA1Final(digest, &context);
php_stream_write(newfile, (char *) digest, sizeof(digest));
sig_flags |= PHAR_SIG_SHA1;
- archive->signature = (char*)safe_emalloc(sizeof(digest), 2, 1);
- for(len = 0; len < sizeof(digest); ++len)
- {
- sprintf(archive->signature+len+len, "%02X", digest[len]);
- }
- archive->signature[sizeof(digest) * 2] = '\0';
- archive->sig_len = sizeof(digest) * 2;
+ archive->sig_len = phar_hex_str(digest, sizeof(digest), &archive->signature);
break;
}
case PHAR_SIG_MD5: {
PHP_MD5Final(digest, &context);
php_stream_write(newfile, (char *) digest, sizeof(digest));
sig_flags |= PHAR_SIG_MD5;
- archive->signature = (char*)safe_emalloc(sizeof(digest), 2, 1);
- for(len = 0; len < sizeof(digest); ++len)
- {
- sprintf(archive->signature+len+len, "%02X", digest[len]);
- }
- archive->signature[sizeof(digest) * 2] = '\0';
- archive->sig_len = sizeof(digest) * 2;
+ archive->sig_len = phar_hex_str(digest, sizeof(digest), &archive->signature);
break;
}
}