diff options
Diffstat (limited to 'lib/lib3.c')
| -rw-r--r-- | lib/lib3.c | 56 |
1 files changed, 52 insertions, 4 deletions
@@ -47,10 +47,6 @@ int cbc_padding_oracle(char *encrypted, int length) } -int convert_to_little_endian(char *string) -{ - -} /** * format is: 64 nonce concat with 64 bit counter * calle has to make sure that nonce is at least 8 bytes @@ -81,3 +77,55 @@ int aes_ctr(char *in, int length_in, char *out, char *string_key, char *nonce) 16, length_last_block); } + +void mt_19937_seed(unsigned int seed) +{ + int i; + + __global_mt_19937.index = MT_19937_N; + __global_mt_19937.mt[0] = seed; + memset(&__global_mt_19937.mt[1], 0, 623); + for(i=1;i<=MT_19937_N;i++) { + __global_mt_19937.mt[i] = (1812433253 * (__global_mt_19937.mt[i-1] + ^ (__global_mt_19937.mt[i-1] >> 30))) + i; + // only the last 32 bit + __global_mt_19937.mt[i] &= 0xFFFFFFFF; + } +} + +void mt_19937_generate() +{ + unsigned int i, x; + + for(i=0;i<=MT_19937_N;i++) { + x = (((__global_mt_19937.mt[i] & MT_19937_UPPER_MASK) + + (__global_mt_19937.mt[(i+1) % 624] & MT_19937_LOWER_MASK) + )& 0xFFFFFFFF); + + __global_mt_19937.mt[i] = __global_mt_19937.mt[(i+397) % MT_19937_N] ^ x >> 1; + + if (x % 2) + __global_mt_19937.mt[i] ^= 0x9908b0df; + } + __global_mt_19937.index = 0; +} + + +int mt_19937() +{ + unsigned int y = 0x0; + + if(__global_mt_19937.index >= MT_19937_N) + mt_19937_generate(); + + y = __global_mt_19937.mt[__global_mt_19937.index]; + + y = y ^ (y >> 11); + y = y ^ ((y << 7) & 0x9D2C5680); + y = y ^ ((y << 15) & 0xEFC60000); + y = y ^ (y >> 18); + + __global_mt_19937.index++; + + return (y & 0xFFFFFFFF); +} |
