From 65ea801974c2816c8f4cc4c13066e8b5c6da304b Mon Sep 17 00:00:00 2001 From: Saki Takamachi Date: Thu, 11 Jul 2024 23:35:43 +0900 Subject: [PATCH 1/3] Changed calculate bitmask 8 bytes at a time. --- ext/random/randomizer.c | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/ext/random/randomizer.c b/ext/random/randomizer.c index 9d0545eefe4d8..f5e0329672e18 100644 --- a/ext/random/randomizer.c +++ b/ext/random/randomizer.c @@ -432,6 +432,8 @@ PHP_METHOD(Random_Randomizer, getBytesFromString) mask |= mask >> 2; mask |= mask >> 4; + /* Example: if mask is 0xAB, will be 0xABABABABABABABAB */ + uint64_t mask_repeat = (~((uint64_t) 0) / 0xff) * mask; int failures = 0; while (total_size < length) { php_random_result result = engine.algo->generate(engine.state); @@ -440,8 +442,9 @@ PHP_METHOD(Random_Randomizer, getBytesFromString) RETURN_THROWS(); } + uint64_t offsets = result.result & mask_repeat; for (size_t i = 0; i < result.size; i++) { - uint64_t offset = (result.result >> (i * 8)) & mask; + uint64_t offset = offsets >> (i * 8) & 0xff; if (offset > max_offset) { if (++failures > PHP_RANDOM_RANGE_ATTEMPTS) { From f23980d985890d3b12acbece9b651961d71ba1a8 Mon Sep 17 00:00:00 2001 From: Saki Takamachi Date: Thu, 11 Jul 2024 23:37:34 +0900 Subject: [PATCH 2/3] Optimized bit shifting --- ext/random/randomizer.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/ext/random/randomizer.c b/ext/random/randomizer.c index f5e0329672e18..692cc432c5820 100644 --- a/ext/random/randomizer.c +++ b/ext/random/randomizer.c @@ -444,7 +444,8 @@ PHP_METHOD(Random_Randomizer, getBytesFromString) uint64_t offsets = result.result & mask_repeat; for (size_t i = 0; i < result.size; i++) { - uint64_t offset = offsets >> (i * 8) & 0xff; + uint64_t offset = offsets & 0xff; + offsets >>= 8; if (offset > max_offset) { if (++failures > PHP_RANDOM_RANGE_ATTEMPTS) { From 2fd607f96f615eac4a462ede37769ae12152f35a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tim=20D=C3=BCsterhus?= Date: Sat, 20 Jul 2024 14:59:16 +0200 Subject: [PATCH 3/3] Improve clarity of the mask expansion --- ext/random/randomizer.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/ext/random/randomizer.c b/ext/random/randomizer.c index 692cc432c5820..76ff5bf590a88 100644 --- a/ext/random/randomizer.c +++ b/ext/random/randomizer.c @@ -431,9 +431,9 @@ PHP_METHOD(Random_Randomizer, getBytesFromString) mask |= mask >> 1; mask |= mask >> 2; mask |= mask >> 4; + // Expand the lowest byte into all bytes. + mask *= 0x0101010101010101; - /* Example: if mask is 0xAB, will be 0xABABABABABABABAB */ - uint64_t mask_repeat = (~((uint64_t) 0) / 0xff) * mask; int failures = 0; while (total_size < length) { php_random_result result = engine.algo->generate(engine.state); @@ -442,7 +442,7 @@ PHP_METHOD(Random_Randomizer, getBytesFromString) RETURN_THROWS(); } - uint64_t offsets = result.result & mask_repeat; + uint64_t offsets = result.result & mask; for (size_t i = 0; i < result.size; i++) { uint64_t offset = offsets & 0xff; offsets >>= 8;