Skip to content

Improve error messages of ext/hash #5275

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Closed
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
65 changes: 26 additions & 39 deletions ext/hash/hash.c
Original file line number Diff line number Diff line change
Expand Up @@ -132,13 +132,13 @@ static void php_hash_do_hash(INTERNAL_FUNCTION_PARAMETERS, int isfilename, zend_

ops = php_hash_fetch_ops(algo);
if (!ops) {
php_error_docref(NULL, E_WARNING, "Unknown hashing algorithm: %s", ZSTR_VAL(algo));
RETURN_FALSE;
zend_argument_value_error(1, "must be a valid hashing algorithm");
RETURN_THROWS();
}
if (isfilename) {
if (CHECK_NULL_PATH(data, data_len)) {
php_error_docref(NULL, E_WARNING, "Invalid path");
RETURN_FALSE;
zend_argument_type_error(1, "must be a valid path");
RETURN_THROWS();
}
stream = php_stream_open_wrapper_ex(data, "rb", REPORT_ERRORS, NULL, FG(default_context));
if (!stream) {
Expand Down Expand Up @@ -254,18 +254,14 @@ static void php_hash_do_hash_hmac(INTERNAL_FUNCTION_PARAMETERS, int isfilename,
}

ops = php_hash_fetch_ops(algo);
if (!ops) {
zend_throw_error(NULL, "Unknown hashing algorithm: %s", ZSTR_VAL(algo));
RETURN_THROWS();
}
else if (!ops->is_crypto) {
zend_throw_error(NULL, "Non-cryptographic hashing algorithm: %s", ZSTR_VAL(algo));
if (!ops || !ops->is_crypto) {
zend_argument_value_error(1, "must be a valid cryptographic hashing algorithm");
RETURN_THROWS();
}

if (isfilename) {
if (CHECK_NULL_PATH(data, data_len)) {
zend_throw_error(NULL, "Invalid path");
zend_argument_type_error(2, "must be a valid path");
RETURN_THROWS();
}
stream = php_stream_open_wrapper_ex(data, "rb", REPORT_ERRORS, NULL, FG(default_context));
Expand Down Expand Up @@ -361,18 +357,18 @@ PHP_FUNCTION(hash_init)

ops = php_hash_fetch_ops(algo);
if (!ops) {
zend_throw_error(NULL, "Unknown hashing algorithm: %s", ZSTR_VAL(algo));
zend_argument_value_error(1, "must be a valid hashing algorithm");
RETURN_THROWS();
}

if (options & PHP_HASH_HMAC) {
if (!ops->is_crypto) {
zend_throw_error(NULL, "HMAC requested with a non-cryptographic hashing algorithm: %s", ZSTR_VAL(algo));
zend_argument_value_error(1, "must be a cryptographic hashing algorithm if HMAC is requested");
RETURN_THROWS();
}
if (!key || (ZSTR_LEN(key) == 0)) {
/* Note: a zero length key is no key at all */
zend_throw_error(NULL, "HMAC requested without a key");
zend_argument_value_error(3, "cannot be empty when HMAC is requested");
RETURN_THROWS();
}
}
Expand Down Expand Up @@ -649,28 +645,23 @@ PHP_FUNCTION(hash_hkdf)
}

ops = php_hash_fetch_ops(algo);
if (!ops) {
zend_throw_error(NULL, "Unknown hashing algorithm: %s", ZSTR_VAL(algo));
RETURN_THROWS();
}

if (!ops->is_crypto) {
zend_throw_error(NULL, "Non-cryptographic hashing algorithm: %s", ZSTR_VAL(algo));
if (!ops || !ops->is_crypto) {
zend_argument_value_error(1, "must be a valid cryptographic hashing algorithm");
RETURN_THROWS();
}

if (ZSTR_LEN(ikm) == 0) {
zend_throw_error(NULL, "Input keying material cannot be empty");
zend_argument_value_error(2, "cannot be empty");
RETURN_THROWS();
}

if (length < 0) {
zend_throw_error(NULL, "Length must be greater than or equal to 0: " ZEND_LONG_FMT, length);
zend_argument_value_error(3, "must be greater than or equal to 0");
RETURN_THROWS();
} else if (length == 0) {
length = ops->digest_size;
} else if (length > (zend_long) (ops->digest_size * 255)) {
zend_throw_error(NULL, "Length must be less than or equal to %zd: " ZEND_LONG_FMT, ops->digest_size * 255, length);
zend_argument_value_error(3, "must be less than or equal to %zd", ops->digest_size * 255);
RETURN_THROWS();
}

Expand Down Expand Up @@ -749,27 +740,23 @@ PHP_FUNCTION(hash_pbkdf2)
}

ops = php_hash_fetch_ops(algo);
if (!ops) {
zend_throw_error(NULL, "Unknown hashing algorithm: %s", ZSTR_VAL(algo));
if (!ops || !ops->is_crypto) {
zend_argument_value_error(1, "must be a valid cryptographic hashing algorithm");
RETURN_THROWS();
}
else if (!ops->is_crypto) {
zend_throw_error(NULL, "Non-cryptographic hashing algorithm: %s", ZSTR_VAL(algo));

if (salt_len > INT_MAX - 4) {
zend_argument_value_error(3, "must be less than or equal to INT_MAX - 4 bytes");
RETURN_THROWS();
}

if (iterations <= 0) {
zend_throw_error(NULL, "Iterations must be a positive integer: " ZEND_LONG_FMT, iterations);
zend_argument_value_error(4, "must be greater than 0");
RETURN_THROWS();
}

if (length < 0) {
zend_throw_error(NULL, "Length must be greater than or equal to 0: " ZEND_LONG_FMT, length);
RETURN_THROWS();
}

if (salt_len > INT_MAX - 4) {
zend_throw_error(NULL, "Supplied salt is too long, max of INT_MAX - 4 bytes: %zd supplied", salt_len);
zend_argument_value_error(5, "must be greater than or equal to 0");
RETURN_THROWS();
}

Expand Down Expand Up @@ -875,12 +862,12 @@ PHP_FUNCTION(hash_equals)

/* We only allow comparing string to prevent unexpected results. */
if (Z_TYPE_P(known_zval) != IS_STRING) {
zend_type_error("Expected known_string to be a string, %s given", zend_zval_type_name(known_zval));
zend_argument_type_error(1, "must be of type string, %s given", zend_zval_type_name(known_zval));
RETURN_THROWS();
}

if (Z_TYPE_P(user_zval) != IS_STRING) {
zend_type_error("Expected user_string to be a string, %s given", zend_zval_type_name(user_zval));
zend_argument_type_error(2, "must be of type string, %s given", zend_zval_type_name(user_zval));
RETURN_THROWS();
}

Expand Down Expand Up @@ -1065,8 +1052,8 @@ PHP_FUNCTION(mhash_keygen_s2k)

bytes = (int)l_bytes;
if (bytes <= 0){
php_error_docref(NULL, E_WARNING, "The byte parameter must be greater than 0");
RETURN_FALSE;
zend_argument_value_error(4, "must be a greater than 0");
RETURN_THROWS();
}

salt_len = MIN(salt_len, SALT_SIZE);
Expand Down
12 changes: 6 additions & 6 deletions ext/hash/tests/hash_equals.phpt
Original file line number Diff line number Diff line change
Expand Up @@ -39,9 +39,9 @@ bool(false)
bool(false)
bool(false)
bool(true)
[TypeError] Expected known_string to be a string, int given
[TypeError] Expected user_string to be a string, int given
[TypeError] Expected known_string to be a string, int given
[TypeError] Expected known_string to be a string, null given
[TypeError] Expected known_string to be a string, null given
[TypeError] Expected known_string to be a string, null given
[TypeError] hash_equals(): Argument #1 ($known_string) must be of type string, int given
[TypeError] hash_equals(): Argument #2 ($user_string) must be of type string, int given
[TypeError] hash_equals(): Argument #1 ($known_string) must be of type string, int given
[TypeError] hash_equals(): Argument #1 ($known_string) must be of type string, null given
[TypeError] hash_equals(): Argument #1 ($known_string) must be of type string, null given
[TypeError] hash_equals(): Argument #1 ($known_string) must be of type string, null given
12 changes: 7 additions & 5 deletions ext/hash/tests/hash_error.phpt
Original file line number Diff line number Diff line change
Expand Up @@ -11,13 +11,15 @@ Hash: hash() function : error conditions
echo "*** Testing hash() : error conditions ***\n";

echo "\n-- Testing hash() function with invalid hash algorithm --\n";
var_dump(hash('foo', ''));
try {
hash('foo', '');
} catch (ValueError $exception) {
echo $exception->getMessage() . "\n";
}

?>
--EXPECTF--
--EXPECT--
*** Testing hash() : error conditions ***

-- Testing hash() function with invalid hash algorithm --

Warning: hash(): Unknown hashing algorithm: foo in %s on line %d
bool(false)
hash(): Argument #1 ($algo) must be a valid hashing algorithm
12 changes: 7 additions & 5 deletions ext/hash/tests/hash_file_error.phpt
Original file line number Diff line number Diff line change
Expand Up @@ -19,10 +19,14 @@ file_put_contents( $filename, 'The quick brown fox jumped over the lazy dog.' );

// hash_file() error tests
echo "\n-- Testing hash_file() function with an unknown algorithm --\n";
var_dump( hash_file( 'foobar', $filename ) );
try {
hash_file('foobar', $filename);
} catch (ValueError $exception) {
echo $exception->getMessage() . "\n";
}

echo "\n-- Testing hash_file() function with a non-existent file --\n";
var_dump( hash_file( 'md5', 'nonexistent.txt' ) );
var_dump(hash_file('md5', 'nonexistent.txt'));

?>
--CLEAN--
Expand All @@ -36,9 +40,7 @@ unlink( $filename );
*** Testing hash_file() : error conditions ***

-- Testing hash_file() function with an unknown algorithm --

Warning: hash_file(): Unknown hashing algorithm: %s in %s on line %d
bool(false)
hash_file(): Argument #1 ($algo) must be a valid hashing algorithm

-- Testing hash_file() function with a non-existent file --

Expand Down
2 changes: 1 addition & 1 deletion ext/hash/tests/hash_hkdf_edges.phpt
Original file line number Diff line number Diff line change
Expand Up @@ -31,4 +31,4 @@ Length < digestSize: 98b16391063ece
Length % digestSize != 0: 98b16391063ecee006a3ca8ee5776b1e5f
Algo name case-sensitivity: true
Non-crypto algo name case-sensitivity:
[Error] Non-cryptographic hashing algorithm: jOaAt
[Error] hash_hkdf(): Argument #1 ($algo) must be a valid cryptographic hashing algorithm
24 changes: 12 additions & 12 deletions ext/hash/tests/hash_hkdf_error.phpt
Original file line number Diff line number Diff line change
Expand Up @@ -53,19 +53,19 @@ trycatch_dump(
*** Testing hash_hkdf(): error conditions ***

-- Testing hash_hkdf() function with invalid hash algorithm --
[Error] Unknown hashing algorithm: foo
[ValueError] hash_hkdf(): Argument #1 ($algo) must be a valid cryptographic hashing algorithm

-- Testing hash_hkdf() function with non-cryptographic hash algorithm --
[Error] Non-cryptographic hashing algorithm: adler32
[Error] Non-cryptographic hashing algorithm: crc32
[Error] Non-cryptographic hashing algorithm: crc32b
[Error] Non-cryptographic hashing algorithm: fnv132
[Error] Non-cryptographic hashing algorithm: fnv1a32
[Error] Non-cryptographic hashing algorithm: fnv164
[Error] Non-cryptographic hashing algorithm: fnv1a64
[Error] Non-cryptographic hashing algorithm: joaat
[ValueError] hash_hkdf(): Argument #1 ($algo) must be a valid cryptographic hashing algorithm
[ValueError] hash_hkdf(): Argument #1 ($algo) must be a valid cryptographic hashing algorithm
[ValueError] hash_hkdf(): Argument #1 ($algo) must be a valid cryptographic hashing algorithm
[ValueError] hash_hkdf(): Argument #1 ($algo) must be a valid cryptographic hashing algorithm
[ValueError] hash_hkdf(): Argument #1 ($algo) must be a valid cryptographic hashing algorithm
[ValueError] hash_hkdf(): Argument #1 ($algo) must be a valid cryptographic hashing algorithm
[ValueError] hash_hkdf(): Argument #1 ($algo) must be a valid cryptographic hashing algorithm
[ValueError] hash_hkdf(): Argument #1 ($algo) must be a valid cryptographic hashing algorithm

-- Testing hash_hkdf() function with invalid parameters --
[Error] Input keying material cannot be empty
[Error] Length must be greater than or equal to 0: -1
[Error] Length must be less than or equal to 5100: 5101
[ValueError] hash_hkdf(): Argument #2 ($ikm) cannot be empty
[ValueError] hash_hkdf(): Argument #3 ($length) must be greater than or equal to 0
[ValueError] hash_hkdf(): Argument #3 ($length) must be less than or equal to 5100
4 changes: 2 additions & 2 deletions ext/hash/tests/hash_hmac_error.phpt
Original file line number Diff line number Diff line change
Expand Up @@ -33,7 +33,7 @@ catch (\Error $e) {
*** Testing hash_hmac() : error conditions ***

-- Testing hash_hmac() function with invalid hash algorithm --
Unknown hashing algorithm: foo
hash_hmac(): Argument #1 ($algo) must be a valid cryptographic hashing algorithm

-- Testing hash_hmac() function with non-cryptographic hash algorithm --
Non-cryptographic hashing algorithm: crc32
hash_hmac(): Argument #1 ($algo) must be a valid cryptographic hashing algorithm
8 changes: 4 additions & 4 deletions ext/hash/tests/hash_hmac_file_error.phpt
Original file line number Diff line number Diff line change
Expand Up @@ -34,7 +34,7 @@ echo "\n-- Testing hash_hmac_file() function with bad path --\n";
try {
var_dump(hash_hmac_file('md5', $file.chr(0).$file, $key, TRUE));
}
catch (\Error $e) {
catch (TypeError $e) {
echo $e->getMessage() . "\n";
}

Expand All @@ -43,10 +43,10 @@ catch (\Error $e) {
*** Testing hash() : error conditions ***

-- Testing hash_hmac_file() function with invalid hash algorithm --
Unknown hashing algorithm: foo
hash_hmac_file(): Argument #1 ($algo) must be a valid cryptographic hashing algorithm

-- Testing hash_hmac_file() function with non-cryptographic hash algorithm --
Non-cryptographic hashing algorithm: crc32
hash_hmac_file(): Argument #1 ($algo) must be a valid cryptographic hashing algorithm

-- Testing hash_hmac_file() function with bad path --
Invalid path
hash_hmac_file(): Argument #2 ($data) must be a valid path
8 changes: 4 additions & 4 deletions ext/hash/tests/hash_init_error.phpt
Original file line number Diff line number Diff line change
Expand Up @@ -41,11 +41,11 @@ catch (\Error $e) {
*** Testing hash_init(): error conditions ***

-- Testing hash_init() function with unknown algorithms --
Unknown hashing algorithm: dummy
hash_init(): Argument #1 ($algo) must be a valid hashing algorithm

-- Testing hash_init() function with HASH_HMAC and non-cryptographic algorithms --
HMAC requested with a non-cryptographic hashing algorithm: crc32
hash_init(): Argument #1 ($algo) must be a cryptographic hashing algorithm if HMAC is requested

-- Testing hash_init() function with HASH_HMAC and no key --
HMAC requested without a key
HMAC requested without a key
hash_init(): Argument #3 ($key) cannot be empty when HMAC is requested
hash_init(): Argument #3 ($key) cannot be empty when HMAC is requested
10 changes: 5 additions & 5 deletions ext/hash/tests/hash_pbkdf2_error.phpt
Original file line number Diff line number Diff line change
Expand Up @@ -57,14 +57,14 @@ catch (\Error $e) {
*** Testing hash_pbkdf2() : error conditions ***

-- Testing hash_pbkdf2() function with invalid hash algorithm --
Unknown hashing algorithm: foo
hash_pbkdf2(): Argument #1 ($algo) must be a valid cryptographic hashing algorithm

-- Testing hash_pbkdf2() function with non-cryptographic hash algorithm --
Non-cryptographic hashing algorithm: crc32
hash_pbkdf2(): Argument #1 ($algo) must be a valid cryptographic hashing algorithm

-- Testing hash_pbkdf2() function with invalid iterations --
Iterations must be a positive integer: 0
Iterations must be a positive integer: -1
hash_pbkdf2(): Argument #4 ($iterations) must be greater than 0
hash_pbkdf2(): Argument #4 ($iterations) must be greater than 0

-- Testing hash_pbkdf2() function with invalid length --
Length must be greater than or equal to 0: -1
hash_pbkdf2(): Argument #5 ($length) must be greater than or equal to 0