mirror of
https://github.com/php/php-src.git
synced 2025-08-15 21:48:51 +02:00

* random: Expose xoshiro256**'s seeding functions * random: Expose pcgoneseq128xslrr64's seeding functions * random: Expose Mt19937's seeding functions * random: Expose CombinedLCG's seeding functions * random: Call php_random_mt19937_seed32 to seed the global Mt19937 This avoids the function pointer indirection and improves type safety. * random: NULL the generic seeding function Different engines work quite differently, it is not useful to attempt to seed them in a generic way using a 64 bit integer. As an example Mt19937 completely ignores the upper 32 bits. * random: Remove the `seed` member from `php_random_algo` See the explanation in the previous commit for the reasoning. This member is unused since the previous commit and was not consistently available even before that (specifically for the Secure engine). * UPGRADING.INTERNALS * random: Remove useless cast in `php_mt_srand()`
82 lines
2.3 KiB
C
82 lines
2.3 KiB
C
/*
|
|
+----------------------------------------------------------------------+
|
|
| Copyright (c) The PHP Group |
|
|
+----------------------------------------------------------------------+
|
|
| This source file is subject to version 3.01 of the PHP license, |
|
|
| that is bundled with this package in the file LICENSE, and is |
|
|
| available through the world-wide-web at the following url: |
|
|
| https://www.php.net/license/3_01.txt |
|
|
| If you did not receive a copy of the PHP license and are unable to |
|
|
| obtain it through the world-wide-web, please send a note to |
|
|
| license@php.net so we can mail you a copy immediately. |
|
|
+----------------------------------------------------------------------+
|
|
| Author: Go Kudo <zeriyoshi@php.net> |
|
|
+----------------------------------------------------------------------+
|
|
*/
|
|
|
|
#ifdef HAVE_CONFIG_H
|
|
# include "config.h"
|
|
#endif
|
|
|
|
#include "php.h"
|
|
#include "php_random.h"
|
|
|
|
static php_random_result generate(void *state)
|
|
{
|
|
php_random_status_state_user *s = state;
|
|
uint64_t result = 0;
|
|
size_t size;
|
|
zval retval;
|
|
|
|
zend_call_known_instance_method_with_0_params(s->generate_method, s->object, &retval);
|
|
|
|
if (EG(exception)) {
|
|
return (php_random_result){
|
|
.size = sizeof(uint64_t),
|
|
.result = 0,
|
|
};
|
|
}
|
|
|
|
size = Z_STRLEN(retval);
|
|
|
|
/* Guard for over 64-bit results */
|
|
if (size > sizeof(uint64_t)) {
|
|
size = sizeof(uint64_t);
|
|
}
|
|
|
|
if (size > 0) {
|
|
/* Endianness safe copy */
|
|
for (size_t i = 0; i < size; i++) {
|
|
result += ((uint64_t) (unsigned char) Z_STRVAL(retval)[i]) << (8 * i);
|
|
}
|
|
} else {
|
|
zend_throw_error(random_ce_Random_BrokenRandomEngineError, "A random engine must return a non-empty string");
|
|
return (php_random_result){
|
|
.size = sizeof(uint64_t),
|
|
.result = 0,
|
|
};
|
|
}
|
|
|
|
zval_ptr_dtor(&retval);
|
|
|
|
return (php_random_result){
|
|
.size = size,
|
|
.result = result,
|
|
};
|
|
}
|
|
|
|
static zend_long range(void *state, zend_long min, zend_long max)
|
|
{
|
|
return php_random_range((php_random_algo_with_state){
|
|
.algo = &php_random_algo_user,
|
|
.state = state,
|
|
}, min, max);
|
|
}
|
|
|
|
const php_random_algo php_random_algo_user = {
|
|
sizeof(php_random_status_state_user),
|
|
generate,
|
|
range,
|
|
NULL,
|
|
NULL,
|
|
};
|