6 // linear congruential generator (LCG)
9 // https://en.wikipedia.org/wiki/Linear_congruential_generator#Parameters_in_common_use
11 void make_key_borland_n(uint32_t seed
, uint8_t key
[], const size_t keylen
) {
13 uint32_t lseed
= ((seed
* 22695477U) + 1) % UINT_MAX
;
15 for (int i
= 0; i
< keylen
; i
++) {
16 lseed
= ((lseed
* 22695477U) + 1) % UINT_MAX
;
17 key
[i
] = ((lseed
>> 16) & 0x7fff) % 0xFF;
21 void make_key_recipies_n(uint32_t seed
, uint8_t key
[], const size_t keylen
) {
23 //uint32_t lseed = ((seed * 1664525) + 1013904223) % UINT_MAX;
24 uint32_t lseed
= seed
;
26 for (int i
= 0; i
< keylen
; i
++) {
27 lseed
= ((lseed
* 1664525U) + 1013904223U) % UINT_MAX
;
28 key
[i
] = (lseed
% 0xFF);
32 void make_key_glibc_n(uint32_t seed
, uint8_t key
[], const size_t keylen
) {
34 //uint32_t lseed = ((seed * 1103515245) + 12345) % 0x7fffffff;
35 uint32_t lseed
= seed
;
38 for (int i
= 0; i
< keylen
; i
++) {
39 lseed
= ((lseed
* 1103515245U) + 12345U) & 0x7fffffff;
40 key
[i
] = (lseed
& 0xFF);
44 void make_key_ansic_n(uint32_t seed
, uint8_t key
[], const size_t keylen
) {
46 //uint32_t lseed = ((seed * 1103515245) + 12345) % 0x7fffffff;
47 uint32_t lseed
= seed
;
49 for (int i
= 0; i
< keylen
; i
++) {
50 lseed
= ((lseed
* 1103515245U) + 12345U) & 0x7fffffff;
51 key
[i
] = ((lseed
>> 16) & 0x7fff) & 0xFF;
55 void make_key_turbopascal_n(uint32_t seed
, uint8_t key
[], const size_t keylen
) {
57 //uint32_t lseed = ((seed * 134775813 ) + 1 ) % UINT_MAX;
58 uint32_t lseed
= seed
;
60 for (int i
= 0; i
< keylen
; i
++) {
61 lseed
= ((lseed
* 134775813) + 1) % UINT_MAX
;
62 key
[i
] = (lseed
% 0xFF);
66 /* This algorithm is mentioned in the ISO C standard, here extended
68 void make_key_posix_rand_r_n(uint32_t seed
, uint8_t key
[], const size_t keylen
) {
70 uint32_t lseed
= seed
;
72 for (int i
= 0; i
< keylen
; i
++) {
76 int result
= (uint16_t)(lseed
/ 0x10000) % 2048;
81 result
^= (uint16_t)(lseed
/ 0x10000) % 1024;
86 result
^= (uint16_t)(lseed
/ 0x10000) % 1024;
88 key
[i
] = (result
% 0xFF);
92 // Microsoft C runtime lib rand
93 void make_key_ms_rand_r_n(uint32_t seed
, uint8_t key
[], const size_t keylen
) {
95 uint32_t lseed
= seed
;
97 for (int i
= 0; i
< keylen
; i
++) {
98 lseed
= ((lseed
* 214013L) + 2531011L);
99 key
[i
] = ((lseed
>> 16) & 0x7FFF);