home *** CD-ROM | disk | FTP | other *** search
/ PDA Software Library / pdasoftwarelib.iso / PSION / MISC / PSI-KEY / MINKSUBR.C < prev    next >
Encoding:
C/C++ Source or Header  |  1995-07-08  |  2.3 KB  |  117 lines

  1. #include <plib.h>
  2. #include "md4.h"
  3.  
  4. #if (defined(__MSDOS__) || defined(MPU8086) || defined(MPU8080) \
  5.  || defined(vax) || defined (MIPSEL))
  6. #define    LITTLE_ENDIAN    /* Low order bytes are first in memory */
  7. #endif            /* Almost all other machines are big-endian */
  8.  
  9. /* Crunch a key:
  10.  * concatenate the seed and the password, run through MD4 and
  11.  * collapse to 64 bits. This is defined as the user's starting key.
  12.  */
  13. int keycrunch( char * result, char * seed, char * passwd )
  14. {    char *buf;
  15.     MDstruct md;
  16.     unsigned int buflen;
  17. #ifndef    LITTLE_ENDIAN
  18.     int i;
  19.     register long tmp;
  20. #endif
  21.     
  22.     buflen = p_slen(seed) + p_slen(passwd);
  23.     if((buf = (char *)p_alloc(buflen+1)) == NULL)
  24.         return -1;
  25.     p_scpy(buf,seed);
  26.     p_scat(buf,passwd);
  27.  
  28.     /* Crunch the key through MD4 */
  29.     MDbegin(&md);
  30.     MDupdate(&md,(unsigned char *)buf,8*buflen);
  31.  
  32.     p_free(buf);
  33.  
  34.     /* Fold result from 128 to 64 bits */
  35.     md.buffer[0] ^= md.buffer[2];
  36.     md.buffer[1] ^= md.buffer[3];
  37.  
  38. #ifdef    LITTLE_ENDIAN
  39.     /* Only works on byte-addressed little-endian machines!! */
  40.     p_bcpy(result,(char *)md.buffer,8);
  41. #else
  42.     /* Default (but slow) code that will convert to
  43.      * little-endian byte ordering on any machine
  44.      */
  45.     for(i=0;i<2;i++){
  46.         tmp = md.buffer[i];
  47.         *result++ = tmp;
  48.         tmp >>= 8;
  49.         *result++ = tmp;
  50.         tmp >>= 8;
  51.         *result++ = tmp;
  52.         tmp >>= 8;
  53.         *result++ = tmp;
  54.     }
  55. #endif
  56.  
  57.     return 0;
  58. }
  59.  
  60. /* The one-way function f(). Takes 8 bytes and returns 8 bytes in place */
  61. void
  62. f(x)
  63. char *x;
  64. {
  65.     MDstruct md;
  66. #ifndef    LITTLE_ENDIAN
  67.     register long tmp;
  68. #endif
  69.  
  70.     MDbegin(&md);
  71.     MDupdate(&md,(unsigned char *)x,64);
  72.  
  73.     /* Fold 128 to 64 bits */
  74.     md.buffer[0] ^= md.buffer[2];
  75.     md.buffer[1] ^= md.buffer[3];
  76.  
  77. #ifdef    LITTLE_ENDIAN
  78.     /* Only works on byte-addressed little-endian machines!! */
  79.     p_bcpy(x,(char *)md.buffer,8);
  80.  
  81. #else
  82.     /* Default (but slow) code that will convert to
  83.      * little-endian byte ordering on any machine
  84.      */
  85.     tmp = md.buffer[0];
  86.     *x++ = tmp;
  87.     tmp >>= 8;
  88.     *x++ = tmp;
  89.     tmp >>= 8;
  90.     *x++ = tmp;
  91.     tmp >>= 8;
  92.     *x++ = tmp;
  93.  
  94.     tmp = md.buffer[1];
  95.     *x++ = tmp;
  96.     tmp >>= 8;
  97.     *x++ = tmp;
  98.     tmp >>= 8;
  99.     *x++ = tmp;
  100.     tmp >>= 8;
  101.     *x = tmp;
  102. #endif
  103. }
  104.  
  105. /* Strip trailing cr/lf from a line of text */
  106. void rip( char * buf )
  107. {    
  108.     int i;
  109.  
  110.     if ((i = p_sloc(buf,'\r')) != -1)
  111.         buf[i]= '\0';
  112.  
  113.     if ((i = p_sloc(buf,'\n')) != -1)
  114.         buf[i]= '\0';
  115.  
  116. }
  117.