Makefile: display firmware size
[RRG-proxmark3.git] / tools / mfd_aes_brute / randoms.c
blob523366d9dfb3865d22a03392f5a523e0a3298452
1 #include "randoms.h"
2 #include <stdlib.h>
3 #include <stdint.h>
4 #include <limits.h>
6 // linear congruential generator (LCG)
7 //
8 // ref
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
67 for 32 bits. */
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++) {
74 lseed *= 1103515245;
75 lseed += 12345;
76 int result = (uint16_t)(lseed / 0x10000) % 2048;
78 lseed *= 1103515245;
79 lseed += 12345;
80 result <<= 10;
81 result ^= (uint16_t)(lseed / 0x10000) % 1024;
83 lseed *= 1103515245;
84 lseed += 12345;
85 result <<= 10;
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);