Skip to content

Commit 616be5b

Browse files
committed
wip
1 parent c26b9c3 commit 616be5b

File tree

3 files changed

+29
-22
lines changed

3 files changed

+29
-22
lines changed

ext/random/random.c

Lines changed: 15 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -597,12 +597,11 @@ static uint64_t user_generate(void *state) {
597597
size_t size;
598598
zval retval;
599599
int i;
600-
char *ptr;
601600

602601
zend_call_known_instance_method_with_0_params(s->generate_method, s->object, &retval);
603602

604603
/* Store generated size in a state */
605-
size = Z_STR(retval)->len;
604+
size = Z_STRLEN(retval);
606605

607606
/* Guard for over 64-bit results */
608607
if (size > sizeof(uint64_t)) {
@@ -612,9 +611,8 @@ static uint64_t user_generate(void *state) {
612611

613612
if (size > 0) {
614613
/* Endianness safe copy */
615-
ptr = (char *) &result;
616614
for (i = 0; i < size; i++) {
617-
ptr[i] = Z_STR(retval)->val[i];
615+
result += (unsigned char) Z_STRVAL(retval)[i] << 8 * i;
618616
}
619617
} else {
620618
result = 0;
@@ -1274,7 +1272,7 @@ PHP_METHOD(Random_Engine_CombinedLCG, generate)
12741272
uint64_t generated;
12751273
zend_string *bytes;
12761274
int i;
1277-
1275+
12781276
ZEND_PARSE_PARAMETERS_NONE();
12791277

12801278
RANDOM_ENGINE_GENERATE_SIZE(engine->algo, engine->state, generated, size);
@@ -1285,7 +1283,6 @@ PHP_METHOD(Random_Engine_CombinedLCG, generate)
12851283
for (i = 0; i < size; i++) {
12861284
ZSTR_VAL(bytes)[i] = (generated >> (i * 8)) & 0xff;
12871285
}
1288-
12891286
ZSTR_VAL(bytes)[size] = '\0';
12901287

12911288
RETURN_STR(bytes);
@@ -1412,6 +1409,7 @@ PHP_METHOD(Random_Engine_XorShift128Plus, __construct)
14121409
php_random_engine_state_xorshift128plus *state = engine->state;
14131410
zend_string *str_seed = NULL;
14141411
zend_long int_seed = 0;
1412+
int i, j;
14151413

14161414
ZEND_PARSE_PARAMETERS_START(1, 1)
14171415
Z_PARAM_STR_OR_LONG(str_seed, int_seed)
@@ -1421,10 +1419,10 @@ PHP_METHOD(Random_Engine_XorShift128Plus, __construct)
14211419
/* char (8 bit) * 16 = 128 bits */
14221420
if (str_seed->len == 16) {
14231421
/* Endianness safe copy */
1424-
int i;
1425-
char *ptr = (char *) &state->s;
1426-
for (i = 0; i < 16; i++) {
1427-
ptr[i] = str_seed->val[i];
1422+
for (i = 0; i < 2; i++) {
1423+
for (j = 0; j < 8; j++) {
1424+
state->s[i] += (unsigned char) ZSTR_VAL(str_seed)[(i * j) + j] >> (j * 8);
1425+
}
14281426
}
14291427
} else {
14301428
zend_argument_value_error(1, "state strings must be 16 bytes");
@@ -1443,6 +1441,7 @@ PHP_METHOD(Random_Engine_Xoshiro256StarStar, __construct)
14431441
php_random_engine_state_xoshiro256starstar *state = engine->state;
14441442
zend_string *str_seed = NULL;
14451443
zend_long int_seed = 0;
1444+
int i, j;
14461445

14471446
ZEND_PARSE_PARAMETERS_START(1, 1)
14481447
Z_PARAM_STR_OR_LONG(str_seed, int_seed)
@@ -1452,10 +1451,10 @@ PHP_METHOD(Random_Engine_Xoshiro256StarStar, __construct)
14521451
/* char (8 bit) * 32 = 256 bits */
14531452
if (str_seed->len == 32) {
14541453
/* Endianness safe copy */
1455-
int i;
1456-
char *ptr = (char *) &state->s;
1457-
for (i = 0; i < 32; i++) {
1458-
ptr[i] = str_seed->val[i];
1454+
for (i = 0; i < 4; i++) {
1455+
for (j = 0; j < 8; j++) {
1456+
state->s[i] += (unsigned char) ZSTR_VAL(str_seed)[(i * j) + j] >> (j * 8);
1457+
}
14591458
}
14601459
} else {
14611460
zend_argument_value_error(1, "state strings must be 32 bytes");
@@ -1550,7 +1549,7 @@ PHP_METHOD(Random_Randomizer, getBytes)
15501549
}
15511550

15521551
retval = zend_string_alloc(length, 0);
1553-
required_size = length * sizeof(char);
1552+
required_size = length;
15541553

15551554
while (total_size < required_size) {
15561555
uint64_t result;
@@ -1559,7 +1558,7 @@ PHP_METHOD(Random_Randomizer, getBytes)
15591558
RANDOM_ENGINE_GENERATE_SIZE(randomizer->algo, randomizer->state, result, generated_size);
15601559

15611560
for (i = 0; i < generated_size; i++) {
1562-
ZSTR_VAL(retval)[total_size++] = (result >> (i * sizeof(char)) & 0xff);
1561+
ZSTR_VAL(retval)[total_size++] = (result >> (i * 8) & 0xff);
15631562
if (total_size >= required_size) {
15641563
break;
15651564
}

ext/random/tests/randomizer/compatibility_user.phpt

Lines changed: 13 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -7,29 +7,36 @@ $native_randomizer = new \Random\Randomizer(new \Random\Engine\CombinedLCG(1234)
77
$user_randomizer = new \Random\Randomizer(new class (1234) extends \Random\Engine\CombinedLCG {});
88

99
for ($i = 0; $i < 1000; $i++) {
10-
if ($native_randomizer->getInt() !== $user_randomizer->getInt()) {
11-
die('failure CombinedLCG');
10+
$native = $native_randomizer->getInt();
11+
$user = $user_randomizer->getInt();
12+
if ($native !== $user) {
13+
die("failure CombinedLCG i: ${i} native: ${native} user: ${user}");
1214
}
1315
}
1416

1517
$native_randomizer = new \Random\Randomizer(new \Random\Engine\MersenneTwister(1234));
1618
$user_randomizer = new \Random\Randomizer(new class (1234) extends \Random\Engine\MersenneTwister {});
1719

1820
for ($i = 0; $i < 1000; $i++) {
19-
if ($native_randomizer->getInt() !== $user_randomizer->getInt()) {
20-
die('failure MersenneTwister');
21+
$native = $native_randomizer->getInt();
22+
$user = $user_randomizer->getInt();
23+
if ($native !== $user) {
24+
die("failure MersenneTwister i: ${i} native: ${native} user: ${user}");
2125
}
2226
}
2327

2428
$native_randomizer = new \Random\Randomizer(new \Random\Engine\XorShift128Plus(1234));
2529
$user_randomizer = new \Random\Randomizer(new class (1234) extends \Random\Engine\XorShift128Plus {});
2630

2731
for ($i = 0; $i < 1000; $i++) {
28-
if ($native_randomizer->getInt() !== $user_randomizer->getInt()) {
29-
die('failure XorShift128Plus');
32+
$native = $native_randomizer->getInt();
33+
$user = $user_randomizer->getInt();
34+
if ($native !== $user) {
35+
die("failure XorShift128Plus i: ${i} native: ${native} user: ${user}");
3036
}
3137
}
3238

39+
3340
die('success');
3441
?>
3542
--EXPECT--

ext/random/tests/randomizer/get_bytes.phpt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ $randomizer = new \Random\Randomizer (
1717
3 => 'l',
1818
4 => 'o',
1919
5 => \random_bytes(32), // 128-bit
20+
default => \random_bytes(16),
2021
};
2122
}
2223
}

0 commit comments

Comments
 (0)