diff options
author | Christoph M. Becker <cmbecker69@gmx.de> | 2017-09-18 18:09:53 +0200 |
---|---|---|
committer | Christoph M. Becker <cmbecker69@gmx.de> | 2017-10-12 12:52:37 +0200 |
commit | 3f8961dfac96a992df2516c0e383e6820eedd31b (patch) | |
tree | 814d87fd905780df1876eb38148da73ed6a16ca4 /ext | |
parent | ee3650742389883f0f3e4d4d009c236dab13bb7d (diff) | |
download | php-git-3f8961dfac96a992df2516c0e383e6820eedd31b.tar.gz |
Fixed bug #75221 (Argon2i always throws NUL at the end)
Apparently, `argon2_encodedlen()` also counts the terminating NUL byte;
that doesn't appear to be documented somewhere, but from looking at the
implementation[1] it is pretty obvious. Therefore, the respective
`zend_string` has to be one byte shorter.
[1] <https://github.com/P-H-C/phc-winner-argon2/blob/20161029/src/argon2.c#L431-L436>
Diffstat (limited to 'ext')
-rw-r--r-- | ext/standard/password.c | 4 | ||||
-rw-r--r-- | ext/standard/tests/password/bug75221.phpt | 19 |
2 files changed, 21 insertions, 2 deletions
diff --git a/ext/standard/password.c b/ext/standard/password.c index 680eed47a8..7f99f21e29 100644 --- a/ext/standard/password.c +++ b/ext/standard/password.c @@ -526,7 +526,7 @@ PHP_FUNCTION(password_hash) #endif ); - encoded = zend_string_alloc(encoded_len, 0); + encoded = zend_string_alloc(encoded_len - 1, 0); status = argon2_hash( time_cost, memory_cost, @@ -538,7 +538,7 @@ PHP_FUNCTION(password_hash) ZSTR_VAL(out), ZSTR_LEN(out), ZSTR_VAL(encoded), - ZSTR_LEN(encoded), + encoded_len, type, ARGON2_VERSION_NUMBER ); diff --git a/ext/standard/tests/password/bug75221.phpt b/ext/standard/tests/password/bug75221.phpt new file mode 100644 index 0000000000..ec03f92ea6 --- /dev/null +++ b/ext/standard/tests/password/bug75221.phpt @@ -0,0 +1,19 @@ +--TEST-- +Bug #75221 (Argon2i always throws NUL at the end) +--SKIPIF-- +<?php +if (!defined('PASSWORD_ARGON2I')) die('skip password_hash not built with Argon2'); +?> +--FILE-- +<?php +$hash = password_hash( + "php", + PASSWORD_ARGON2I, + ['memory_cost' => 16384, 'time_cost' => 2, 'threads' => 4] +); +var_dump(substr($hash, -1, 1) !== "\0"); +?> +===DONE=== +--EXPECT-- +bool(true) +===DONE=== |