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)
#include <ctype.h>
#include "tools.h"
+#ifdef WIN32
+#include <windows.h>
+#endif
+
int stricmp (const char *s1, const char *s2) {
return stricmplen(s1, s2, -1);
}
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);
+}
+