@@ -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 )
118120ZEND_END_ARG_INFO ()
119121
120122ZEND_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 ;
0 commit comments