diff options
| author | Benedict <benedict@0xb8000.de> | 2016-08-11 17:55:46 +0200 |
|---|---|---|
| committer | Benedict <benedict@0xb8000.de> | 2017-02-21 13:00:25 +0100 |
| commit | 62fa141050aa054183fb781fed8e782f99e6072f (patch) | |
| tree | 0b3cd551675a835880f7f9d6665d2e0055818d7b /lib | |
| parent | 7060b54d2385018fc5f7c081dfd0630db3b402e2 (diff) | |
set3, completed challenge 21
Diffstat (limited to 'lib')
| -rw-r--r-- | lib/lib3.c | 56 | ||||
| -rw-r--r-- | lib/lib3.h | 17 |
2 files changed, 69 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); +} @@ -8,9 +8,26 @@ #define BLOCKSIZE 16 +#define MT_19937_N 624 +// needed for initialization +#define MT_19937_F 0x6C078965 +// word size +#define MT_19937_W 32 +#define MT_19937_UPPER_MASK 0x80000000 +#define MT_19937_LOWER_MASK 0x7fffffff + +struct mt_19937_state { + unsigned int mt[MT_19937_N]; + unsigned int index; +}; + +struct mt_19937_state __global_mt_19937; + char *challenge17_encrypt(int *length); int cbc_padding_oracle(char *encrypted, int length); int aes_ctr(char *in, int length_in, char *out, char *string_key, char *nonce); +void mt_19937_seed(unsigned int seed); +int mt_19937(); #endif |
