Skip to content

Commit 613c8dd

Browse files
committed
sodium ext: let crypto_pwhash() accept an optional algorithm identifier
1 parent 5d777e5 commit 613c8dd

File tree

2 files changed

+31
-4
lines changed

2 files changed

+31
-4
lines changed

ext/sodium/libsodium.c

Lines changed: 23 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -115,6 +115,8 @@ ZEND_BEGIN_ARG_INFO_EX(AI_LengthAndPasswordAndSaltAndOpsLimitAndMemLimit, 0, 0,
115115
ZEND_ARG_INFO(0, salt)
116116
ZEND_ARG_INFO(0, opslimit)
117117
ZEND_ARG_INFO(0, memlimit)
118+
/* optional */
119+
ZEND_ARG_INFO(0, alg)
118120
ZEND_END_ARG_INFO()
119121

120122
ZEND_BEGIN_ARG_INFO_EX(AI_PasswordAndOpsLimitAndMemLimit, 0, 0, 3)
@@ -447,6 +449,14 @@ PHP_MINIT_FUNCTION(sodium)
447449
REGISTER_LONG_CONSTANT("SODIUM_CRYPTO_GENERICHASH_KEYBYTES_MAX",
448450
crypto_generichash_KEYBYTES_MAX, CONST_CS | CONST_PERSISTENT);
449451
#ifdef crypto_pwhash_SALTBYTES
452+
REGISTER_LONG_CONSTANT("SODIUM_CRYPTO_PWHASH_ALG_ARGON2I13",
453+
crypto_pwhash_ALG_ARGON2I13, CONST_CS | CONST_PERSISTENT);
454+
# ifdef crypto_pwhash_ALG_ARGON2ID13
455+
REGISTER_LONG_CONSTANT("SODIUM_CRYPTO_PWHASH_ALG_ARGON2ID13",
456+
crypto_pwhash_ALG_ARGON2ID13, CONST_CS | CONST_PERSISTENT);
457+
# endif
458+
REGISTER_LONG_CONSTANT("SODIUM_CRYPTO_PWHASH_ALG_DEFAULT",
459+
crypto_pwhash_ALG_DEFAULT, CONST_CS | CONST_PERSISTENT);
450460
REGISTER_LONG_CONSTANT("SODIUM_CRYPTO_PWHASH_SALTBYTES",
451461
crypto_pwhash_SALTBYTES, CONST_CS | CONST_PERSISTENT);
452462
REGISTER_STRING_CONSTANT("SODIUM_CRYPTO_PWHASH_STRPREFIX",
@@ -1778,19 +1788,29 @@ PHP_FUNCTION(sodium_crypto_pwhash)
17781788
zend_long hash_len;
17791789
zend_long memlimit;
17801790
zend_long opslimit;
1791+
zend_long alg;
17811792
size_t passwd_len;
17821793
size_t salt_len;
17831794

1784-
if (zend_parse_parameters(ZEND_NUM_ARGS(), "lssll",
1795+
alg = (zend_long) crypto_pwhash_ALG_DEFAULT;
1796+
if (zend_parse_parameters(ZEND_NUM_ARGS(), "lssll|l",
17851797
&hash_len,
17861798
&passwd, &passwd_len,
17871799
&salt, &salt_len,
1788-
&opslimit, &memlimit) == FAILURE ||
1800+
&opslimit, &memlimit, &alg) == FAILURE ||
17891801
hash_len <= 0 || hash_len >= SIZE_MAX ||
17901802
opslimit <= 0 || memlimit <= 0 || memlimit > SIZE_MAX) {
17911803
zend_throw_exception(sodium_exception_ce, "invalid parameters", 0);
17921804
return;
17931805
}
1806+
if (alg != crypto_pwhash_ALG_ARGON2I13
1807+
# ifdef crypto_pwhash_ALG_ARGON2ID13
1808+
&& alg != crypto_pwhash_ALG_ARGON2ID13
1809+
# endif
1810+
&& alg != crypto_pwhash_ALG_DEFAULT) {
1811+
zend_throw_exception(sodium_exception_ce, "unsupported password hashing algorithm", 0);
1812+
return;
1813+
}
17941814
if (passwd_len <= 0) {
17951815
zend_error(E_WARNING, "empty password");
17961816
}
@@ -1810,7 +1830,7 @@ PHP_FUNCTION(sodium_crypto_pwhash)
18101830
((unsigned char *) ZSTR_VAL(hash), (unsigned long long) hash_len,
18111831
passwd, (unsigned long long) passwd_len, salt,
18121832
(unsigned long long) opslimit, (size_t) memlimit,
1813-
crypto_pwhash_alg_default()) != 0) {
1833+
(int) alg) != 0) {
18141834
zend_string_free(hash);
18151835
zend_throw_exception(sodium_exception_ce, "internal error", 0);
18161836
return;

ext/sodium/tests/pwhash_argon2i.phpt

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -32,8 +32,14 @@ $out_len = 100;
3232
$key = sodium_crypto_pwhash
3333
($out_len, $passwd, $salt,
3434
SODIUM_CRYPTO_PWHASH_OPSLIMIT_INTERACTIVE,
35-
SODIUM_CRYPTO_PWHASH_MEMLIMIT_INTERACTIVE);
35+
SODIUM_CRYPTO_PWHASH_MEMLIMIT_INTERACTIVE,
36+
SODIUM_CRYPTO_PWHASH_ALG_DEFAULT);
3637
var_dump(strlen($key) === $out_len);
38+
$key2 = sodium_crypto_pwhash
39+
($out_len, $passwd, $salt,
40+
SODIUM_CRYPTO_PWHASH_OPSLIMIT_INTERACTIVE,
41+
SODIUM_CRYPTO_PWHASH_MEMLIMIT_INTERACTIVE);
42+
var_dump($key2 === $key);
3743
?>
3844
--EXPECT--
3945
bool(true)
@@ -42,3 +48,4 @@ bool(false)
4248
bool(true)
4349
bool(false)
4450
bool(true)
51+
bool(true)

0 commit comments

Comments
 (0)