From 4ec553e7da1550129721795a95d9cfaa4166d28d Mon Sep 17 00:00:00 2001 From: pk910 Date: Thu, 31 Jul 2014 20:42:25 +0200 Subject: [PATCH] added some code --- src/crypt_base64.c | 8 ++--- src/crypt_keypacker.c | 2 ++ src/tools.c | 72 +++++++++++++++++++++++++++++++++++++++++++ src/tools.h | 2 ++ 4 files changed, 80 insertions(+), 4 deletions(-) diff --git a/src/crypt_base64.c b/src/crypt_base64.c index 60e10ee..b74a29b 100644 --- a/src/crypt_base64.c +++ b/src/crypt_base64.c @@ -74,10 +74,10 @@ unsigned char *crypt_base64_decode(const char *data, size_t input_length, size_t int i, j; for (i = 0, j = 0; i < input_length;) { - uint32_t sextet_a = data[i] == '=' ? 0 & i++ : decoding_table[data[i++]]; - uint32_t sextet_b = data[i] == '=' ? 0 & i++ : decoding_table[data[i++]]; - uint32_t sextet_c = data[i] == '=' ? 0 & i++ : decoding_table[data[i++]]; - uint32_t sextet_d = data[i] == '=' ? 0 & i++ : decoding_table[data[i++]]; + uint32_t sextet_a = data[i] == '=' ? 0 & i++ : decoding_table[(int)data[i++]]; + uint32_t sextet_b = data[i] == '=' ? 0 & i++ : decoding_table[(int)data[i++]]; + uint32_t sextet_c = data[i] == '=' ? 0 & i++ : decoding_table[(int)data[i++]]; + uint32_t sextet_d = data[i] == '=' ? 0 & i++ : decoding_table[(int)data[i++]]; uint32_t triple = (sextet_a << 3 * 6) + (sextet_b << 2 * 6) diff --git a/src/crypt_keypacker.c b/src/crypt_keypacker.c index 317e716..1c77dbe 100644 --- a/src/crypt_keypacker.c +++ b/src/crypt_keypacker.c @@ -18,6 +18,8 @@ #include "crypt_keypacker.h" #include "tools.h" #include +#include +#include /* Pack Key * - remove -----xy----- lines diff --git a/src/tools.c b/src/tools.c index acf4504..3fa6706 100644 --- a/src/tools.c +++ b/src/tools.c @@ -19,6 +19,10 @@ #include #include "tools.h" +#ifdef WIN32 +#include +#endif + int stricmp (const char *s1, const char *s2) { return stricmplen(s1, s2, -1); } @@ -110,3 +114,71 @@ int match(const char *mask, const char *name) break; } } + + +static unsigned char random_numbers[256]; +static int random_numbers_available = 0; + +int get_random(int min, int max) { + int requested_bytes = 0; + unsigned int rnd_width = max-min; + if((rnd_width % (0xFF000000))) + requested_bytes = 4; + else if((rnd_width % (0xFF0000))) + requested_bytes = 3; + else if((rnd_width % (0xFF00))) + requested_bytes = 2; + else + requested_bytes = 1; + + //get_random_generate: + + if(random_numbers_available < requested_bytes) { + // generate new random numbers + #ifdef WIN32 + HMODULE hLib=LoadLibrary("ADVAPI32.DLL"); + if (hLib) { + BOOLEAN (APIENTRY *pfn)(void*, ULONG) = (BOOLEAN (APIENTRY *)(void*,ULONG))GetProcAddress(hLib,"SystemFunction036"); + if(pfn) { + ULONG ulCbBuff = sizeof(random_numbers) - random_numbers_available; + if(pfn(random_numbers + random_numbers_available,ulCbBuff)) { + random_numbers_available += ulCbBuff; + } + } + FreeLibrary(hLib); + } + #else + int randomData = open("/dev/random", O_RDONLY); + int randLen = sizeof(random_numbers) - random_numbers_available; + size_t randomDataLen = random_numbers_available; + while (randomDataLen < randLen) { + ssize_t result = read(randomData, ((char*)random_numbers) + randomDataLen, randLen - randomDataLen); + if (result < 0) + break; + randomDataLen += result; + } + random_numbers_available = randomDataLen; + close(randomData); + #endif + + if(random_numbers_available < requested_bytes) { + //system random number generators failed! + + } + } + + int rnd = 0; + int i = 0; + do { + if(i) + rnd <<= 8; + rnd |= random_numbers[--random_numbers_available]; + } while(++i < requested_bytes); + + // TODO: find better solution for this + //if((rnd % rnd_width) > rnd_width) + // goto get_random_generate; + + return min + (rnd % rnd_width); +} + diff --git a/src/tools.h b/src/tools.h index f98e06f..105bf19 100644 --- a/src/tools.h +++ b/src/tools.h @@ -22,4 +22,6 @@ int stricmplen (const char *s1, const char *s2, int len); int match(const char *mask, const char *name); +int get_random(int min, int max); + #endif -- 2.20.1