added some code
authorpk910 <philipp@zoelle1.de>
Thu, 31 Jul 2014 18:42:25 +0000 (20:42 +0200)
committerpk910 <philipp@zoelle1.de>
Thu, 31 Jul 2014 18:42:25 +0000 (20:42 +0200)
src/crypt_base64.c
src/crypt_keypacker.c
src/tools.c
src/tools.h

index 60e10eee7182f8b907aac0d09b00c4fe6b80a94f..b74a29b29e8fea57a06480cd380994970ca2067b 100644 (file)
@@ -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)
index 317e7163e3661ecfb11eee5f6d78468d850e20a1..1c77dbe0a55efd59d92d2a792be4d6b6be401771 100644 (file)
@@ -18,6 +18,8 @@
 #include "crypt_keypacker.h"
 #include "tools.h"
 #include <stdlib.h>
+#include <string.h>
+#include <stdio.h>
 
 /* Pack Key
 * - remove -----xy----- lines
index acf4504f215fb429798924b5db8364a7b3698861..3fa6706148932740bd28b52a2cfca3707bd83040 100644 (file)
 #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);
 }
@@ -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);
+}
+
index f98e06fed8c16a58ede2beec28a8b8df601e0419..105bf1969e92ee325a7ec9ca9bfe145b165a0145 100644 (file)
@@ -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