1
0
mirror of https://github.com/php/php-src.git synced 2026-04-17 13:01:02 +02:00

sodium ext: let crypto_pwhash() accept an optional algorithm identifier

This commit is contained in:
Frank Denis
2017-07-29 13:04:54 +02:00
parent 5d777e56e2
commit 613c8dd7b0
2 changed files with 31 additions and 4 deletions

View File

@@ -115,6 +115,8 @@ ZEND_BEGIN_ARG_INFO_EX(AI_LengthAndPasswordAndSaltAndOpsLimitAndMemLimit, 0, 0,
ZEND_ARG_INFO(0, salt)
ZEND_ARG_INFO(0, opslimit)
ZEND_ARG_INFO(0, memlimit)
/* optional */
ZEND_ARG_INFO(0, alg)
ZEND_END_ARG_INFO()
ZEND_BEGIN_ARG_INFO_EX(AI_PasswordAndOpsLimitAndMemLimit, 0, 0, 3)
@@ -447,6 +449,14 @@ PHP_MINIT_FUNCTION(sodium)
REGISTER_LONG_CONSTANT("SODIUM_CRYPTO_GENERICHASH_KEYBYTES_MAX",
crypto_generichash_KEYBYTES_MAX, CONST_CS | CONST_PERSISTENT);
#ifdef crypto_pwhash_SALTBYTES
REGISTER_LONG_CONSTANT("SODIUM_CRYPTO_PWHASH_ALG_ARGON2I13",
crypto_pwhash_ALG_ARGON2I13, CONST_CS | CONST_PERSISTENT);
# ifdef crypto_pwhash_ALG_ARGON2ID13
REGISTER_LONG_CONSTANT("SODIUM_CRYPTO_PWHASH_ALG_ARGON2ID13",
crypto_pwhash_ALG_ARGON2ID13, CONST_CS | CONST_PERSISTENT);
# endif
REGISTER_LONG_CONSTANT("SODIUM_CRYPTO_PWHASH_ALG_DEFAULT",
crypto_pwhash_ALG_DEFAULT, CONST_CS | CONST_PERSISTENT);
REGISTER_LONG_CONSTANT("SODIUM_CRYPTO_PWHASH_SALTBYTES",
crypto_pwhash_SALTBYTES, CONST_CS | CONST_PERSISTENT);
REGISTER_STRING_CONSTANT("SODIUM_CRYPTO_PWHASH_STRPREFIX",
@@ -1778,19 +1788,29 @@ PHP_FUNCTION(sodium_crypto_pwhash)
zend_long hash_len;
zend_long memlimit;
zend_long opslimit;
zend_long alg;
size_t passwd_len;
size_t salt_len;
if (zend_parse_parameters(ZEND_NUM_ARGS(), "lssll",
alg = (zend_long) crypto_pwhash_ALG_DEFAULT;
if (zend_parse_parameters(ZEND_NUM_ARGS(), "lssll|l",
&hash_len,
&passwd, &passwd_len,
&salt, &salt_len,
&opslimit, &memlimit) == FAILURE ||
&opslimit, &memlimit, &alg) == FAILURE ||
hash_len <= 0 || hash_len >= SIZE_MAX ||
opslimit <= 0 || memlimit <= 0 || memlimit > SIZE_MAX) {
zend_throw_exception(sodium_exception_ce, "invalid parameters", 0);
return;
}
if (alg != crypto_pwhash_ALG_ARGON2I13
# ifdef crypto_pwhash_ALG_ARGON2ID13
&& alg != crypto_pwhash_ALG_ARGON2ID13
# endif
&& alg != crypto_pwhash_ALG_DEFAULT) {
zend_throw_exception(sodium_exception_ce, "unsupported password hashing algorithm", 0);
return;
}
if (passwd_len <= 0) {
zend_error(E_WARNING, "empty password");
}
@@ -1810,7 +1830,7 @@ PHP_FUNCTION(sodium_crypto_pwhash)
((unsigned char *) ZSTR_VAL(hash), (unsigned long long) hash_len,
passwd, (unsigned long long) passwd_len, salt,
(unsigned long long) opslimit, (size_t) memlimit,
crypto_pwhash_alg_default()) != 0) {
(int) alg) != 0) {
zend_string_free(hash);
zend_throw_exception(sodium_exception_ce, "internal error", 0);
return;

View File

@@ -32,8 +32,14 @@ $out_len = 100;
$key = sodium_crypto_pwhash
($out_len, $passwd, $salt,
SODIUM_CRYPTO_PWHASH_OPSLIMIT_INTERACTIVE,
SODIUM_CRYPTO_PWHASH_MEMLIMIT_INTERACTIVE);
SODIUM_CRYPTO_PWHASH_MEMLIMIT_INTERACTIVE,
SODIUM_CRYPTO_PWHASH_ALG_DEFAULT);
var_dump(strlen($key) === $out_len);
$key2 = sodium_crypto_pwhash
($out_len, $passwd, $salt,
SODIUM_CRYPTO_PWHASH_OPSLIMIT_INTERACTIVE,
SODIUM_CRYPTO_PWHASH_MEMLIMIT_INTERACTIVE);
var_dump($key2 === $key);
?>
--EXPECT--
bool(true)
@@ -42,3 +48,4 @@ bool(false)
bool(true)
bool(false)
bool(true)
bool(true)