|
145 | 145 | ZEND_DECLARE_MODULE_GLOBALS(random)
|
146 | 146 |
|
147 | 147 | PHPAPI zend_class_entry *random_ce_Random_Engine;
|
| 148 | +PHPAPI zend_class_entry *random_ce_Random_CryptoSafeEngine; |
| 149 | +PHPAPI zend_class_entry *random_ce_Random_SeedableEngine; |
| 150 | +PHPAPI zend_class_entry *random_ce_Random_SerializableEngine; |
| 151 | + |
148 | 152 | PHPAPI zend_class_entry *random_ce_Random_Engine_CombinedLCG;
|
149 | 153 | PHPAPI zend_class_entry *random_ce_Random_Engine_MersenneTwister;
|
150 | 154 | PHPAPI zend_class_entry *random_ce_Random_Engine_Secure;
|
@@ -1403,13 +1407,6 @@ PHP_METHOD(Random_Engine_MersenneTwister, __construct)
|
1403 | 1407 | }
|
1404 | 1408 | /* }}} */
|
1405 | 1409 |
|
1406 |
| -/* {{{ Construct object */ |
1407 |
| -PHP_METHOD(Random_Engine_Secure, __construct) |
1408 |
| -{ |
1409 |
| - ZEND_PARSE_PARAMETERS_NONE(); |
1410 |
| -} |
1411 |
| -/* }}} */ |
1412 |
| - |
1413 | 1410 | /* {{{ Construct object */
|
1414 | 1411 | PHP_METHOD(Random_Engine_XorShift128Plus, __construct)
|
1415 | 1412 | {
|
@@ -1443,6 +1440,32 @@ PHP_METHOD(Random_Engine_XorShift128Plus, __construct)
|
1443 | 1440 | }
|
1444 | 1441 | /* }}} */
|
1445 | 1442 |
|
| 1443 | +/* {{{ Jump a state */ |
| 1444 | +PHP_METHOD(Random_Engine_XorShift128Plus, jump) |
| 1445 | +{ |
| 1446 | + php_random_engine *engine = Z_RANDOM_ENGINE_P(ZEND_THIS); |
| 1447 | + php_random_engine_state_xorshift128plus *s = (php_random_engine_state_xorshift128plus *) engine->state; |
| 1448 | + static const uint64_t jmp[] = { 0x8a5cd789635d2dff, 0x121fd2155c472f96 }; |
| 1449 | + uint64_t s0 = 0, s1 = 0; |
| 1450 | + int i, j; |
| 1451 | + |
| 1452 | + ZEND_PARSE_PARAMETERS_NONE(); |
| 1453 | + |
| 1454 | + for (i = 0; i < sizeof (jmp) / sizeof (*jmp); i++) { |
| 1455 | + for (j = 0; j < 64; j++) { |
| 1456 | + if (jmp[i] & UINT64_C(1) << j) { |
| 1457 | + s0 ^= s->s[0]; |
| 1458 | + s1 ^= s->s[1]; |
| 1459 | + } |
| 1460 | + engine->algo->generate(engine->state); |
| 1461 | + } |
| 1462 | + } |
| 1463 | + |
| 1464 | + s->s[0] = s0; |
| 1465 | + s->s[1] = s1; |
| 1466 | +} |
| 1467 | +/* }}} */ |
| 1468 | + |
1446 | 1469 | /* {{{ Construct object */
|
1447 | 1470 | PHP_METHOD(Random_Engine_Xoshiro256StarStar, __construct)
|
1448 | 1471 | {
|
@@ -1476,6 +1499,66 @@ PHP_METHOD(Random_Engine_Xoshiro256StarStar, __construct)
|
1476 | 1499 | }
|
1477 | 1500 | /* }}} */
|
1478 | 1501 |
|
| 1502 | +/* {{{ Jump a state */ |
| 1503 | +PHP_METHOD(Random_Engine_Xoshiro256StarStar, jump) |
| 1504 | +{ |
| 1505 | + php_random_engine *engine = Z_RANDOM_ENGINE_P(ZEND_THIS); |
| 1506 | + php_random_engine_state_xoshiro256starstar *s = (php_random_engine_state_xoshiro256starstar *) engine->state; |
| 1507 | + static const uint64_t jmp[] = { 0x180ec6d33cfd0aba, 0xd5a61266f0c9392c, 0xa9582618e03fc9aa, 0x39abdc4529b1661c }; |
| 1508 | + uint64_t s0 = 0, s1 = 0, s2 = 0, s3 = 0; |
| 1509 | + int i, j; |
| 1510 | + |
| 1511 | + ZEND_PARSE_PARAMETERS_NONE(); |
| 1512 | + |
| 1513 | + for (i = 0; i < sizeof(jmp) / sizeof(*jmp); i++) { |
| 1514 | + for (j = 0; j < 64; j++) { |
| 1515 | + if (jmp[i] & UINT64_C(1) << j) { |
| 1516 | + s0 ^= s->s[0]; |
| 1517 | + s1 ^= s->s[1]; |
| 1518 | + s2 ^= s->s[2]; |
| 1519 | + s3 ^= s->s[3]; |
| 1520 | + } |
| 1521 | + engine->algo->generate(engine->state); |
| 1522 | + } |
| 1523 | + } |
| 1524 | + |
| 1525 | + s->s[0] = s0; |
| 1526 | + s->s[1] = s1; |
| 1527 | + s->s[2] = s2; |
| 1528 | + s->s[3] = s3; |
| 1529 | +} |
| 1530 | +/* }}} */ |
| 1531 | + |
| 1532 | +/* {{{ Jump a long state */ |
| 1533 | +PHP_METHOD(Random_Engine_Xoshiro256StarStar, jumpLong) |
| 1534 | +{ |
| 1535 | + php_random_engine *engine = Z_RANDOM_ENGINE_P(ZEND_THIS); |
| 1536 | + php_random_engine_state_xoshiro256starstar *s = (php_random_engine_state_xoshiro256starstar *) engine->state; |
| 1537 | + static const uint64_t jmp[] = { 0x76e15d3efefdcbbf, 0xc5004e441c522fb3, 0x77710069854ee241, 0x39109bb02acbe635 }; |
| 1538 | + uint64_t s0 = 0, s1 = 0, s2 = 0, s3 = 0; |
| 1539 | + int i, j; |
| 1540 | + |
| 1541 | + ZEND_PARSE_PARAMETERS_NONE(); |
| 1542 | + |
| 1543 | + for (i = 0; i < sizeof(jmp) / sizeof(*jmp); i++) { |
| 1544 | + for (j = 0; j < 64; j++) { |
| 1545 | + if (jmp[i] & UINT64_C(1) << j) { |
| 1546 | + s0 ^= s->s[0]; |
| 1547 | + s1 ^= s->s[1]; |
| 1548 | + s2 ^= s->s[2]; |
| 1549 | + s3 ^= s->s[3]; |
| 1550 | + } |
| 1551 | + engine->algo->generate(engine->state); |
| 1552 | + } |
| 1553 | + } |
| 1554 | + |
| 1555 | + s->s[0] = s0; |
| 1556 | + s->s[1] = s1; |
| 1557 | + s->s[2] = s2; |
| 1558 | + s->s[3] = s3; |
| 1559 | +} |
| 1560 | +/* }}} */ |
| 1561 | + |
1479 | 1562 | /* {{{ Construct object */
|
1480 | 1563 | PHP_METHOD(Random_Randomizer, __construct)
|
1481 | 1564 | {
|
@@ -1664,40 +1747,49 @@ PHP_MINIT_FUNCTION(random)
|
1664 | 1747 | /* Random\Engine */
|
1665 | 1748 | random_ce_Random_Engine = register_class_Random_Engine();
|
1666 | 1749 |
|
| 1750 | + /* Random\CryptoSafeEngine */ |
| 1751 | + random_ce_Random_CryptoSafeEngine = register_class_Random_CryptoSafeEngine(random_ce_Random_Engine); |
| 1752 | + |
| 1753 | + /* Random\SeedableEngine */ |
| 1754 | + random_ce_Random_SeedableEngine = register_class_Random_SeedableEngine(random_ce_Random_Engine); |
| 1755 | + |
| 1756 | + /* Random\SerializableEngine */ |
| 1757 | + random_ce_Random_SerializableEngine = register_class_Random_SerializableEngine(random_ce_Random_Engine); |
| 1758 | + |
1667 | 1759 | /* Random\Engine\CombinedLCG */
|
1668 |
| - random_ce_Random_Engine_CombinedLCG = register_class_Random_Engine_CombinedLCG(random_ce_Random_Engine); |
| 1760 | + random_ce_Random_Engine_CombinedLCG = register_class_Random_Engine_CombinedLCG(random_ce_Random_SeedableEngine, random_ce_Random_SerializableEngine); |
1669 | 1761 | random_ce_Random_Engine_CombinedLCG->create_object = php_random_engine_combinedlcg_new;
|
1670 | 1762 | memcpy(&random_engine_combinedlcg_object_handlers, zend_get_std_object_handlers(), sizeof(zend_object_handlers));
|
1671 | 1763 | random_engine_combinedlcg_object_handlers.offset = XtOffsetOf(php_random_engine, std);
|
1672 | 1764 | random_engine_combinedlcg_object_handlers.free_obj = php_random_engine_common_free_obj;
|
1673 | 1765 | random_engine_combinedlcg_object_handlers.clone_obj = php_random_engine_common_clone_obj;
|
1674 | 1766 |
|
1675 | 1767 | /* Random\Engine\MersenneTwister */
|
1676 |
| - random_ce_Random_Engine_MersenneTwister = register_class_Random_Engine_MersenneTwister(random_ce_Random_Engine); |
| 1768 | + random_ce_Random_Engine_MersenneTwister = register_class_Random_Engine_MersenneTwister(random_ce_Random_SeedableEngine, random_ce_Random_SerializableEngine); |
1677 | 1769 | random_ce_Random_Engine_MersenneTwister->create_object = php_random_engine_mersennetwister_new;
|
1678 | 1770 | memcpy(&random_engine_mersennetwister_object_handlers, zend_get_std_object_handlers(), sizeof(zend_object_handlers));
|
1679 | 1771 | random_engine_mersennetwister_object_handlers.offset = XtOffsetOf(php_random_engine, std);
|
1680 | 1772 | random_engine_mersennetwister_object_handlers.free_obj = php_random_engine_common_free_obj;
|
1681 | 1773 | random_engine_mersennetwister_object_handlers.clone_obj = php_random_engine_common_clone_obj;
|
1682 | 1774 |
|
1683 | 1775 | /* Random\Engine\Secure */
|
1684 |
| - random_ce_Random_Engine_Secure = register_class_Random_Engine_Secure(random_ce_Random_Engine); |
| 1776 | + random_ce_Random_Engine_Secure = register_class_Random_Engine_Secure(random_ce_Random_CryptoSafeEngine); |
1685 | 1777 | random_ce_Random_Engine_Secure->create_object = php_random_engine_secure_new;
|
1686 | 1778 | memcpy(&random_engine_secure_object_handlers, zend_get_std_object_handlers(), sizeof(zend_object_handlers));
|
1687 | 1779 | random_engine_secure_object_handlers.offset = XtOffsetOf(php_random_engine, std);
|
1688 | 1780 | random_engine_secure_object_handlers.free_obj = php_random_engine_common_free_obj;
|
1689 | 1781 | random_engine_secure_object_handlers.clone_obj = NULL;
|
1690 | 1782 |
|
1691 | 1783 | /* Random\Engine\XorShift128Plus */
|
1692 |
| - random_ce_Random_Engine_XorShift128Plus = register_class_Random_Engine_XorShift128Plus(random_ce_Random_Engine); |
| 1784 | + random_ce_Random_Engine_XorShift128Plus = register_class_Random_Engine_XorShift128Plus(random_ce_Random_SeedableEngine, random_ce_Random_SerializableEngine); |
1693 | 1785 | random_ce_Random_Engine_XorShift128Plus->create_object = php_random_engine_xorshift128plus_new;
|
1694 | 1786 | memcpy(&random_engine_xorshift128plus_object_handlers, zend_get_std_object_handlers(), sizeof(zend_object_handlers));
|
1695 | 1787 | random_engine_xorshift128plus_object_handlers.offset = XtOffsetOf(php_random_engine, std);
|
1696 | 1788 | random_engine_xorshift128plus_object_handlers.free_obj = php_random_engine_common_free_obj;
|
1697 | 1789 | random_engine_xorshift128plus_object_handlers.clone_obj = php_random_engine_common_clone_obj;
|
1698 | 1790 |
|
1699 | 1791 | /* Random\Engine\Xoshiro256StarStar */
|
1700 |
| - random_ce_Random_Engine_Xoshiro256StarStar = register_class_Random_Engine_Xoshiro256StarStar(random_ce_Random_Engine); |
| 1792 | + random_ce_Random_Engine_Xoshiro256StarStar = register_class_Random_Engine_Xoshiro256StarStar(random_ce_Random_SeedableEngine, random_ce_Random_SerializableEngine); |
1701 | 1793 | random_ce_Random_Engine_Xoshiro256StarStar->create_object = php_random_engine_xoshiro256starstar_new;
|
1702 | 1794 | memcpy(&random_engine_xoshiro256starstar_object_handlers, zend_get_std_object_handlers(), sizeof(zend_object_handlers));
|
1703 | 1795 | random_engine_xoshiro256starstar_object_handlers.offset = XtOffsetOf(php_random_engine, std);
|
|
0 commit comments