Browse Source

Merge branch 'PHP-7.3'

* PHP-7.3:
  ext/sodium: sodium_pad(): do not copy any bytes if the string is empty
  ext/sodium: Fix sodium_pad() with blocksize >= 256
  ext/sodium: Use a correct max output size for base64 decoding
  ext/sodium: Avoid shifts wider than 32 bits on size_t values
pull/3507/merge
Frank Denis 7 years ago
parent
commit
d159d219e4
  1. 21
      ext/sodium/libsodium.c
  2. 7
      ext/sodium/tests/utils.phpt

21
ext/sodium/libsodium.c

@ -2780,7 +2780,7 @@ PHP_FUNCTION(sodium_base642bin)
"invalid base64 variant identifier", 0);
return;
}
bin_len = b64_len / 4U * 3U;
bin_len = b64_len / 4U * 3U + 1U;
bin = zend_string_alloc(bin_len, 0);
if (sodium_base642bin((unsigned char *) ZSTR_VAL(bin), bin_len,
b64, b64_len,
@ -3402,11 +3402,17 @@ PHP_FUNCTION(sodium_pad)
st = 1U;
i = 0U;
k = unpadded_len;
for (j = 0U; j <= xpadded_len; j++) {
ZSTR_VAL(padded)[j] = unpadded[i];
k -= st;
st = (~(((((k >> 48) | (k >> 32) | (k >> 16) | k) & 0xffff) - 1U) >> 16)) & 1U;
i += st;
if (unpadded_len > 0) {
st = 1U;
i = 0U;
k = unpadded_len;
for (j = 0U; j <= xpadded_len; j++) {
ZSTR_VAL(padded)[j] = unpadded[i];
k -= st;
st = (size_t) (~(((( (((uint64_t) k) >> 48) | (((uint64_t) k) >> 32) |
(k >> 16) | k) & 0xffff) - 1U) >> 16)) & 1U;
i += st;
}
}
#if SODIUM_LIBRARY_VERSION_MAJOR > 9 || (SODIUM_LIBRARY_VERSION_MAJOR == 9 && SODIUM_LIBRARY_VERSION_MINOR >= 6)
if (sodium_pad(NULL, (unsigned char *) ZSTR_VAL(padded), unpadded_len,
@ -3423,7 +3429,8 @@ PHP_FUNCTION(sodium_pad)
tail = &ZSTR_VAL(padded)[xpadded_len];
mask = 0U;
for (i = 0; i < blocksize; i++) {
barrier_mask = (unsigned char) (((i ^ xpadlen) - 1U) >> 8);
barrier_mask = (unsigned char)
(((i ^ xpadlen) - 1U) >> ((sizeof(size_t) - 1U) * CHAR_BIT));
tail[-i] = (tail[-i] & mask) | (0x80 & barrier_mask);
mask |= barrier_mask;
}

7
ext/sodium/tests/utils.phpt

@ -86,6 +86,12 @@ if (defined('SODIUM_BASE64_VARIANT_ORIGINAL')) {
} catch (Exception $e) {
var_dump('base64("O") case passed');
}
var_dump(sodium_base642bin('YWJjZA', SODIUM_BASE64_VARIANT_ORIGINAL_NO_PADDING));
} else {
var_dump('base64("O1R") case passed');
var_dump('base64("O1") case passed');
var_dump('base64("O") case passed');
var_dump('abcd');
}
?>
@ -107,3 +113,4 @@ bool(true)
string(25) "base64("O1R") case passed"
string(24) "base64("O1") case passed"
string(23) "base64("O") case passed"
string(4) "abcd"
Loading…
Cancel
Save