Skip to content

Use hash_ops->is_crypto in hash_init() #2321

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
wants to merge 1 commit into from
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
5 changes: 5 additions & 0 deletions ext/hash/hash.c
Original file line number Diff line number Diff line change
Expand Up @@ -350,6 +350,11 @@ PHP_FUNCTION(hash_init)
RETURN_FALSE;
}

if (options & PHP_HASH_HMAC && !ops->is_crypto) {
php_error_docref(NULL, E_WARNING, "HMAC requested with a non-cryptographic hashing algorithm: %s", algo);
RETURN_FALSE;
}

if (options & PHP_HASH_HMAC &&
key_len <= 0) {
/* Note: a zero length key is no key at all */
Expand Down
8 changes: 4 additions & 4 deletions ext/hash/tests/bug52240.phpt
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@ Bug #52240 (hash_copy() does not copy the HMAC key, causes wrong results and PHP
--FILE--
<?php

$h = hash_init('crc32b', HASH_HMAC, '123456' );
$h = hash_init('md5', HASH_HMAC, '123456');
$h2 = hash_copy($h);
var_dump(hash_final($h));
$h3 = hash_copy($h2);
Expand All @@ -14,6 +14,6 @@ var_dump(hash_final($h3));

?>
--EXPECT--
string(8) "278af264"
string(8) "278af264"
string(8) "278af264"
string(32) "cab1380ea86d8acc9aa62390a58406aa"
string(32) "cab1380ea86d8acc9aa62390a58406aa"
string(32) "cab1380ea86d8acc9aa62390a58406aa"
44 changes: 44 additions & 0 deletions ext/hash/tests/hash_init_error.phpt
Original file line number Diff line number Diff line change
@@ -0,0 +1,44 @@
--TEST--
hash_init() function - errors test
--SKIPIF--
<?php
if (!extension_loaded('hash')) die('skip hash extension not available');
?>
--FILE--
<?php
echo "*** Testing hash_init(): error conditions ***\n";

echo "-- Testing hash_init() function with no parameters --\n";
var_dump(hash_init());

echo "-- Testing hash_init() function with unknown algorithms --\n";
var_dump(hash_init('dummy'));

echo "-- Testing hash_init() function with HASH_HMAC and non-cryptographic algorithms --\n";
var_dump(hash_init('crc32', HASH_HMAC));

echo "-- Testing hash_init() function with HASH_HMAC and no key --\n";
var_dump(hash_init('md5', HASH_HMAC));
var_dump(hash_init('md5', HASH_HMAC, null));
?>
--EXPECTF--
*** Testing hash_init(): error conditions ***
-- Testing hash_init() function with no parameters --

Warning: hash_init() expects at least 1 parameter, 0 given in %s on line %d
NULL
-- Testing hash_init() function with unknown algorithms --

Warning: hash_init(): Unknown hashing algorithm: dummy in %s on line %d
bool(false)
-- Testing hash_init() function with HASH_HMAC and non-cryptographic algorithms --

Warning: hash_init(): HMAC requested with a non-cryptographic hashing algorithm: crc32 in %s on line %d
bool(false)
-- Testing hash_init() function with HASH_HMAC and no key --

Warning: hash_init(): HMAC requested without a key %s on line %d
bool(false)

Warning: hash_init(): HMAC requested without a key %s on line %d
bool(false)