]> granicus.if.org Git - php/commitdiff
ext/sodium: call crypto_pwhash_argon2id() explicitly if required
authorFrank Denis <github@pureftpd.org>
Tue, 26 Sep 2017 16:09:00 +0000 (18:09 +0200)
committerFrank Denis <github@pureftpd.org>
Tue, 26 Sep 2017 16:09:00 +0000 (18:09 +0200)
ext/sodium/libsodium.c

index 6f8b6e80f30cf5b09afed7486f3e474e8d3ebb7c..102714ab1a4e7d483bad851500b05f23abf59a60 100644 (file)
@@ -1856,6 +1856,7 @@ PHP_FUNCTION(sodium_crypto_pwhash)
        zend_long      alg;
        size_t         passwd_len;
        size_t         salt_len;
+       int            ret;
 
        alg = (zend_long) crypto_pwhash_ALG_DEFAULT;
        if (zend_parse_parameters_throw(ZEND_NUM_ARGS(), "lssll|l",
@@ -1905,11 +1906,22 @@ PHP_FUNCTION(sodium_crypto_pwhash)
                zend_error(E_WARNING, "maximum memory for the password hashing function is low");
        }
        hash = zend_string_alloc((size_t) hash_len, 0);
-       if (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,
-                (int) alg) != 0) {
+       ret = -1;
+# ifdef crypto_pwhash_ALG_ARGON2ID13
+       if (alg == crypto_pwhash_ALG_ARGON2ID13) {
+               ret = crypto_pwhash_argon2id
+                       ((unsigned char *) ZSTR_VAL(hash), (unsigned long long) hash_len,
+                         passwd, (unsigned long long) passwd_len, salt,
+                         (unsigned long long) opslimit, (size_t) memlimit, (int) alg);
+       }
+# endif
+       if (ret == -1) {
+               ret = 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, (int) alg);
+       }
+       if (ret != 0) {
                zend_string_free(hash);
                zend_throw_exception(sodium_exception_ce, "internal error", 0);
                return;