src/lib/util.c
void make_session_key(char *key, char *seed, int mode)
{
   int j, k;
   struct MD5Context md5c;
   unsigned char md5key[16], md5key1[16];
   char s[1024];

#define ss sizeof(s)

   s[0] = 0;
   if (seed != NULL) {
     bstrncat(s, seed, sizeof(s));
   }

   /* The following creates a seed for the session key generator
     based on a collection of volatile and environment-specific
     information unlikely to be vulnerable (as a whole) to an
     exhaustive search attack.  If one of these items isn't
     available on your machine, replace it with something
     equivalent or, if you like, just delete it. */

#if defined(HAVE_WIN32)
   {
      LARGE_INTEGER     li;
      DWORD             length;
      FILETIME          ft;

      bsnprintf(s + strlen(s), ss, "%lu", (uint32_t)GetCurrentProcessId());
      (void)getcwd(s + strlen(s), 256);
      bsnprintf(s + strlen(s), ss, "%lu", (uint32_t)GetTickCount());
      QueryPerformanceCounter(&li);
      bsnprintf(s + strlen(s), ss, "%lu", (uint32_t)li.LowPart);
      GetSystemTimeAsFileTime(&ft);
      bsnprintf(s + strlen(s), ss, "%lu", (uint32_t)ft.dwLowDateTime);
      bsnprintf(s + strlen(s), ss, "%lu", (uint32_t)ft.dwHighDateTime);
      length = 256;
      GetComputerName(s + strlen(s), &length);
      length = 256;
      GetUserName(s + strlen(s), &length);
   }
#else
   bsnprintf(s + strlen(s), ss, "%lu", (uint32_t)getpid());
   bsnprintf(s + strlen(s), ss, "%lu", (uint32_t)getppid());
   (void)getcwd(s + strlen(s), 256);
   bsnprintf(s + strlen(s), ss, "%lu", (uint32_t)clock());
   bsnprintf(s + strlen(s), ss, "%lu", (uint32_t)time(NULL));
#if defined(Solaris)
   sysinfo(SI_HW_SERIAL,s + strlen(s), 12);
#endif
#if defined(HAVE_GETHOSTID)
   bsnprintf(s + strlen(s), ss, "%lu", (uint32_t) gethostid());
#endif
   gethostname(s + strlen(s), 256);
   bsnprintf(s + strlen(s), ss, "%lu", (uint32_t)getuid());
   bsnprintf(s + strlen(s), ss, "%lu", (uint32_t)getgid());
#endif
   MD5Init(&md5c);
   MD5Update(&md5c, (uint8_t *)s, strlen(s));
   MD5Final(md5key, &md5c);
   bsnprintf(s + strlen(s), ss, "%lu", (uint32_t)((time(NULL) + 65121) ^ 0x375F));
   MD5Init(&md5c);
   MD5Update(&md5c, (uint8_t *)s, strlen(s));
   MD5Final(md5key1, &md5c);
#define nextrand    (md5key[j] ^ md5key1[j])
   if (mode) {
     for (j = k = 0; j < 16; j++) {
        unsigned char rb = nextrand;

#define Rad16(x) ((x) + 'A')
        key[k++] = Rad16((rb >> 4) & 0xF);
        key[k++] = Rad16(rb & 0xF);
#undef Rad16
        if (j & 1) {
           key[k++] = '-';
        }
     }
     key[--k] = 0;
   } else {
     for (j = 0; j < 16; j++) {
        key[j] = nextrand;
     }
   }
}
/*  MAKESESSIONKEY  --  Generate session key with optional start
                        key.  If mode is TRUE, the key will be
                        translated to a string, otherwise it is
                        returned as 16 binary bytes.

    from SpeakFreely by John Walker */
MAKESESSIONKEY  --  Generate session key with optional start
key.  If mode is TRUE, the key will be
translated to a string, otherwise it is
returned as 16 binary bytes.

from SpeakFreely by John Walker
MAKESESSIONKEY -- Generate session key with optional start key . If mode is TRUE the key will be translated to a string otherwise it is returned as 16 binary bytes . from SpeakFreely by John Walker
void make_session_key(char *key, char *seed, int mode)
{
   int j, k;
   struct MD5Context md5c;
   unsigned char md5key[16], md5key1[16];
   char s[1024];
#define ss sizeof(s)
   s[0] = 0;
   if (seed != NULL) {
     bstrncat(s, seed, sizeof(s));
   }
#if defined(HAVE_WIN32)
   {
      LARGE_INTEGER     li;
      DWORD             length;
      FILETIME          ft;
      bsnprintf(s + strlen(s), ss, "%lu", (uint32_t)GetCurrentProcessId());
      (void)getcwd(s + strlen(s), 256);
      bsnprintf(s + strlen(s), ss, "%lu", (uint32_t)GetTickCount());
      QueryPerformanceCounter(&li);
      bsnprintf(s + strlen(s), ss, "%lu", (uint32_t)li.LowPart);
      GetSystemTimeAsFileTime(&ft);
      bsnprintf(s + strlen(s), ss, "%lu", (uint32_t)ft.dwLowDateTime);
      bsnprintf(s + strlen(s), ss, "%lu", (uint32_t)ft.dwHighDateTime);
      length = 256;
      GetComputerName(s + strlen(s), &length);
      length = 256;
      GetUserName(s + strlen(s), &length);
   }
#else
   bsnprintf(s + strlen(s), ss, "%lu", (uint32_t)getpid());
   bsnprintf(s + strlen(s), ss, "%lu", (uint32_t)getppid());
   (void)getcwd(s + strlen(s), 256);
   bsnprintf(s + strlen(s), ss, "%lu", (uint32_t)clock());
   bsnprintf(s + strlen(s), ss, "%lu", (uint32_t)time(NULL));
#if defined(Solaris)
   sysinfo(SI_HW_SERIAL,s + strlen(s), 12);
#endif
#if defined(HAVE_GETHOSTID)
   bsnprintf(s + strlen(s), ss, "%lu", (uint32_t) gethostid());
#endif
   gethostname(s + strlen(s), 256);
   bsnprintf(s + strlen(s), ss, "%lu", (uint32_t)getuid());
   bsnprintf(s + strlen(s), ss, "%lu", (uint32_t)getgid());
#endif
   MD5Init(&md5c);
   MD5Update(&md5c, (uint8_t *)s, strlen(s));
   MD5Final(md5key, &md5c);
   bsnprintf(s + strlen(s), ss, "%lu", (uint32_t)((time(NULL) + 65121) ^ 0x375F));
   MD5Init(&md5c);
   MD5Update(&md5c, (uint8_t *)s, strlen(s));
   MD5Final(md5key1, &md5c);
#define nextrand    (md5key[j] ^ md5key1[j])
   if (mode) {
     for (j = k = 0; j < 16; j++) {
        unsigned char rb = nextrand;
#define Rad16(x) ((x) + 'A')
        key[k++] = Rad16((rb >> 4) & 0xF);
        key[k++] = Rad16(rb & 0xF);
#undef Rad16
        if (j & 1) {
           key[k++] = '-';
        }
     }
     key[--k] = 0;
   } else {
     for (j = 0; j < 16; j++) {
        key[j] = nextrand;
     }
   }
}
void make_session_key ( char * key , char * seed , int mode ) { int j , k ; struct MD5Context md5c ; unsigned char md5key [ 16 ] , md5key1 [ 16 ] ; char s [ 1024 ] ; #define ss  sizeof(s) s [ 0 ] = 0 ; if ( seed != NULL ) { bstrncat ( s , seed , sizeof ( s ) ) ; } #if defined ( HAVE_WIN32 ) { LARGE_INTEGER li ; DWORD length ; FILETIME ft ; bsnprintf ( s + strlen ( s ) , ss , " " , ( uint32_t ) GetCurrentProcessId ( ) ) ; ( void ) getcwd ( s + strlen ( s ) , 256 ) ; bsnprintf ( s + strlen ( s ) , ss , " " , ( uint32_t ) GetTickCount ( ) ) ; QueryPerformanceCounter ( & li ) ; bsnprintf ( s + strlen ( s ) , ss , " " , ( uint32_t ) li . LowPart ) ; GetSystemTimeAsFileTime ( & ft ) ; bsnprintf ( s + strlen ( s ) , ss , " " , ( uint32_t ) ft . dwLowDateTime ) ; bsnprintf ( s + strlen ( s ) , ss , " " , ( uint32_t ) ft . dwHighDateTime ) ; length = 256 ; GetComputerName ( s + strlen ( s ) , & length ) ; length = 256 ; GetUserName ( s + strlen ( s ) , & length ) ; } #else bsnprintf ( s + strlen ( s ) , ss , " " , ( uint32_t ) getpid ( ) ) ; bsnprintf ( s + strlen ( s ) , ss , " " , ( uint32_t ) getppid ( ) ) ; ( void ) getcwd ( s + strlen ( s ) , 256 ) ; bsnprintf ( s + strlen ( s ) , ss , " " , ( uint32_t ) clock ( ) ) ; bsnprintf ( s + strlen ( s ) , ss , " " , ( uint32_t ) time ( NULL ) ) ; #if defined ( Solaris ) sysinfo ( SI_HW_SERIAL , s + strlen ( s ) , 12 ) ; #endif #if defined ( HAVE_GETHOSTID ) bsnprintf ( s + strlen ( s ) , ss , " " , ( uint32_t ) gethostid ( ) ) ; #endif gethostname ( s + strlen ( s ) , 256 ) ; bsnprintf ( s + strlen ( s ) , ss , " " , ( uint32_t ) getuid ( ) ) ; bsnprintf ( s + strlen ( s ) , ss , " " , ( uint32_t ) getgid ( ) ) ; #endif MD5Init ( & md5c ) ; MD5Update ( & md5c , ( uint8_t * ) s , strlen ( s ) ) ; MD5Final ( md5key , & md5c ) ; bsnprintf ( s + strlen ( s ) , ss , " " , ( uint32_t ) ( ( time ( NULL ) + 65121 ) ^ 0x375F ) ) ; MD5Init ( & md5c ) ; MD5Update ( & md5c , ( uint8_t * ) s , strlen ( s ) ) ; MD5Final ( md5key1 , & md5c ) ; #define nextrand     (md5key[j] ^ md5key1[j]) if ( mode ) { for ( j = k = 0 ; j < 16 ; j ++ ) { unsigned char rb = nextrand ; #define Rad16 ( x )  ((x) + 'A') key [ k ++ ] = Rad16 ( ( rb >> 4 ) & 0xF ) ; key [ k ++ ] = Rad16 ( rb & 0xF ) ; #undef  Rad16 if ( j & 1 ) { key [ k ++ ] = ' ' ; } } key [ -- k ] = 0 ; } else { for ( j = 0 ; j < 16 ; j ++ ) { key [ j ] = nextrand ; } } }
MAKESESSIONKEY  --  Generate session key with optional start
key.
MAKESESSIONKEY -- Generate session key with optional start key .
/* The following creates a seed for the session key generator
     based on a collection of volatile and environment-specific
     information unlikely to be vulnerable (as a whole) to an
     exhaustive search attack.  If one of these items isn't
     available on your machine, replace it with something
     equivalent or, if you like, just delete it. */