Home | History | Annotate | Line # | Download | only in libdes
ofcrypt.c revision 1.1
      1  1.1  christos /* NOCW */
      2  1.1  christos #include <stdio.h>
      3  1.1  christos 
      4  1.1  christos /* This version of crypt has been developed from my MIT compatible
      5  1.1  christos  * DES library.
      6  1.1  christos  * Eric Young (eay (at) cryptsoft.com)
      7  1.1  christos  */
      8  1.1  christos 
      9  1.1  christos /* Modification by Jens Kupferschmidt (Cu)
     10  1.1  christos  * I have included directive PARA for shared memory computers.
     11  1.1  christos  * I have included a directive LONGCRYPT to using this routine to cipher
     12  1.1  christos  * passwords with more than 8 bytes like HP-UX 10.x it used. The MAXPLEN
     13  1.1  christos  * definition is the maximum of length of password and can changed. I have
     14  1.1  christos  * defined 24.
     15  1.1  christos  */
     16  1.1  christos 
     17  1.1  christos #include "des_locl.h"
     18  1.1  christos 
     19  1.1  christos /* Added more values to handle illegal salt values the way normal
     20  1.1  christos  * crypt() implementations do.  The patch was sent by
     21  1.1  christos  * Bjorn Gronvall <bg (at) sics.se>
     22  1.1  christos  */
     23  1.1  christos static unsigned const char con_salt[128]={
     24  1.1  christos 0xD2,0xD3,0xD4,0xD5,0xD6,0xD7,0xD8,0xD9,
     25  1.1  christos 0xDA,0xDB,0xDC,0xDD,0xDE,0xDF,0xE0,0xE1,
     26  1.1  christos 0xE2,0xE3,0xE4,0xE5,0xE6,0xE7,0xE8,0xE9,
     27  1.1  christos 0xEA,0xEB,0xEC,0xED,0xEE,0xEF,0xF0,0xF1,
     28  1.1  christos 0xF2,0xF3,0xF4,0xF5,0xF6,0xF7,0xF8,0xF9,
     29  1.1  christos 0xFA,0xFB,0xFC,0xFD,0xFE,0xFF,0x00,0x01,
     30  1.1  christos 0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,
     31  1.1  christos 0x0A,0x0B,0x05,0x06,0x07,0x08,0x09,0x0A,
     32  1.1  christos 0x0B,0x0C,0x0D,0x0E,0x0F,0x10,0x11,0x12,
     33  1.1  christos 0x13,0x14,0x15,0x16,0x17,0x18,0x19,0x1A,
     34  1.1  christos 0x1B,0x1C,0x1D,0x1E,0x1F,0x20,0x21,0x22,
     35  1.1  christos 0x23,0x24,0x25,0x20,0x21,0x22,0x23,0x24,
     36  1.1  christos 0x25,0x26,0x27,0x28,0x29,0x2A,0x2B,0x2C,
     37  1.1  christos 0x2D,0x2E,0x2F,0x30,0x31,0x32,0x33,0x34,
     38  1.1  christos 0x35,0x36,0x37,0x38,0x39,0x3A,0x3B,0x3C,
     39  1.1  christos 0x3D,0x3E,0x3F,0x40,0x41,0x42,0x43,0x44,
     40  1.1  christos };
     41  1.1  christos 
     42  1.1  christos static unsigned const char cov_2char[64]={
     43  1.1  christos 0x2E,0x2F,0x30,0x31,0x32,0x33,0x34,0x35,
     44  1.1  christos 0x36,0x37,0x38,0x39,0x41,0x42,0x43,0x44,
     45  1.1  christos 0x45,0x46,0x47,0x48,0x49,0x4A,0x4B,0x4C,
     46  1.1  christos 0x4D,0x4E,0x4F,0x50,0x51,0x52,0x53,0x54,
     47  1.1  christos 0x55,0x56,0x57,0x58,0x59,0x5A,0x61,0x62,
     48  1.1  christos 0x63,0x64,0x65,0x66,0x67,0x68,0x69,0x6A,
     49  1.1  christos 0x6B,0x6C,0x6D,0x6E,0x6F,0x70,0x71,0x72,
     50  1.1  christos 0x73,0x74,0x75,0x76,0x77,0x78,0x79,0x7A
     51  1.1  christos };
     52  1.1  christos 
     53  1.1  christos void fcrypt_body(DES_LONG *out,des_key_schedule ks,
     54  1.1  christos 	DES_LONG Eswap0, DES_LONG Eswap1);
     55  1.1  christos 
     56  1.1  christos char *des_crypt(const char *buf, const char *salt)
     57  1.1  christos 	{
     58  1.1  christos 	static char buff[14];
     59  1.1  christos 
     60  1.1  christos #ifndef CHARSET_EBCDIC
     61  1.1  christos 	return(des_fcrypt(buf,salt,buff));
     62  1.1  christos #else
     63  1.1  christos 	char e_salt[2+1];
     64  1.1  christos 	char e_buf[32+1];	/* replace 32 by 8 ? */
     65  1.1  christos 	char *ret;
     66  1.1  christos 
     67  1.1  christos 	/* Copy at most 2 chars of salt */
     68  1.1  christos 	if ((e_salt[0] = salt[0]) != '\0')
     69  1.1  christos 	    e_salt[1] = salt[1];
     70  1.1  christos 
     71  1.1  christos 	/* Copy at most 32 chars of password */
     72  1.1  christos 	strncpy (e_buf, buf, sizeof(e_buf));
     73  1.1  christos 
     74  1.1  christos 	/* Make sure we have a delimiter */
     75  1.1  christos 	e_salt[sizeof(e_salt)-1] = e_buf[sizeof(e_buf)-1] = '\0';
     76  1.1  christos 
     77  1.1  christos 	/* Convert the e_salt to ASCII, as that's what des_fcrypt works on */
     78  1.1  christos 	ebcdic2ascii(e_salt, e_salt, sizeof e_salt);
     79  1.1  christos 
     80  1.1  christos 	/* Convert the cleartext password to ASCII */
     81  1.1  christos 	ebcdic2ascii(e_buf, e_buf, sizeof e_buf);
     82  1.1  christos 
     83  1.1  christos 	/* Encrypt it (from/to ASCII) */
     84  1.1  christos 	ret = des_fcrypt(e_buf,e_salt,buff);
     85  1.1  christos 
     86  1.1  christos 	/* Convert the result back to EBCDIC */
     87  1.1  christos 	ascii2ebcdic(ret, ret, strlen(ret));
     88  1.1  christos 
     89  1.1  christos 	return ret;
     90  1.1  christos #endif
     91  1.1  christos 	}
     92  1.1  christos 
     93  1.1  christos 
     94  1.1  christos char *des_fcrypt(const char *buf, const char *salt, char *ret)
     95  1.1  christos 	{
     96  1.1  christos 	unsigned int i,j,x,y;
     97  1.1  christos 	DES_LONG Eswap0,Eswap1;
     98  1.1  christos 	DES_LONG out[2],ll;
     99  1.1  christos 	des_cblock key;
    100  1.1  christos 	des_key_schedule ks;
    101  1.1  christos 	unsigned char bb[9];
    102  1.1  christos 	unsigned char *b=bb;
    103  1.1  christos 	unsigned char c,u;
    104  1.1  christos 
    105  1.1  christos 	/* eay 25/08/92
    106  1.1  christos 	 * If you call crypt("pwd","*") as often happens when you
    107  1.1  christos 	 * have * as the pwd field in /etc/passwd, the function
    108  1.1  christos 	 * returns *\0XXXXXXXXX
    109  1.1  christos 	 * The \0 makes the string look like * so the pwd "*" would
    110  1.1  christos 	 * crypt to "*".  This was found when replacing the crypt in
    111  1.1  christos 	 * our shared libraries.  People found that the disabled
    112  1.1  christos 	 * accounts effectively had no passwd :-(. */
    113  1.1  christos #ifndef CHARSET_EBCDIC
    114  1.1  christos 	x=ret[0]=((salt[0] == '\0')?'A':salt[0]);
    115  1.1  christos 	Eswap0=con_salt[x]<<2;
    116  1.1  christos 	x=ret[1]=((salt[1] == '\0')?'A':salt[1]);
    117  1.1  christos 	Eswap1=con_salt[x]<<6;
    118  1.1  christos #else
    119  1.1  christos 	x=ret[0]=((salt[0] == '\0')?os_toascii['A']:salt[0]);
    120  1.1  christos 	Eswap0=con_salt[x]<<2;
    121  1.1  christos 	x=ret[1]=((salt[1] == '\0')?os_toascii['A']:salt[1]);
    122  1.1  christos 	Eswap1=con_salt[x]<<6;
    123  1.1  christos #endif
    124  1.1  christos 
    125  1.1  christos /* EAY
    126  1.1  christos r=strlen(buf);
    127  1.1  christos r=(r+7)/8;
    128  1.1  christos */
    129  1.1  christos 	for (i=0; i<8; i++)
    130  1.1  christos 		{
    131  1.1  christos 		c= *(buf++);
    132  1.1  christos 		if (!c) break;
    133  1.1  christos 		key[i]=(c<<1);
    134  1.1  christos 		}
    135  1.1  christos 	for (; i<8; i++)
    136  1.1  christos 		key[i]=0;
    137  1.1  christos 
    138  1.1  christos 	des_set_key_unchecked(&key,ks);
    139  1.1  christos 	fcrypt_body(&(out[0]),ks,Eswap0,Eswap1);
    140  1.1  christos 
    141  1.1  christos 	ll=out[0]; l2c(ll,b);
    142  1.1  christos 	ll=out[1]; l2c(ll,b);
    143  1.1  christos 	y=0;
    144  1.1  christos 	u=0x80;
    145  1.1  christos 	bb[8]=0;
    146  1.1  christos 	for (i=2; i<13; i++)
    147  1.1  christos 		{
    148  1.1  christos 		c=0;
    149  1.1  christos 		for (j=0; j<6; j++)
    150  1.1  christos 			{
    151  1.1  christos 			c<<=1;
    152  1.1  christos 			if (bb[y] & u) c|=1;
    153  1.1  christos 			u>>=1;
    154  1.1  christos 			if (!u)
    155  1.1  christos 				{
    156  1.1  christos 				y++;
    157  1.1  christos 				u=0x80;
    158  1.1  christos 				}
    159  1.1  christos 			}
    160  1.1  christos 		ret[i]=cov_2char[c];
    161  1.1  christos 		}
    162  1.1  christos 	ret[13]='\0';
    163  1.1  christos 	return(ret);
    164  1.1  christos 	}
    165  1.1  christos 
    166