1656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project/* NOCW */
2656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#include <stdio.h>
3656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#ifdef _OSD_POSIX
4656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#ifndef CHARSET_EBCDIC
5656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#define CHARSET_EBCDIC 1
6656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#endif
7656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#endif
8656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#ifdef CHARSET_EBCDIC
9656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#include <openssl/ebcdic.h>
10656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#endif
11656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
12656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project/* This version of crypt has been developed from my MIT compatible
13656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * DES library.
14656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * Eric Young (eay@cryptsoft.com)
15656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project */
16656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
17656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project/* Modification by Jens Kupferschmidt (Cu)
18656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * I have included directive PARA for shared memory computers.
19656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * I have included a directive LONGCRYPT to using this routine to cipher
20656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * passwords with more then 8 bytes like HP-UX 10.x it used. The MAXPLEN
21656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * definition is the maximum of length of password and can changed. I have
22656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * defined 24.
23656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project */
24656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
25656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#include "des_locl.h"
26656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
27656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project/* Added more values to handle illegal salt values the way normal
28656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * crypt() implementations do.  The patch was sent by
29656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * Bjorn Gronvall <bg@sics.se>
30656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project */
31656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectstatic unsigned const char con_salt[128]={
32656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project0xD2,0xD3,0xD4,0xD5,0xD6,0xD7,0xD8,0xD9,
33656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project0xDA,0xDB,0xDC,0xDD,0xDE,0xDF,0xE0,0xE1,
34656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project0xE2,0xE3,0xE4,0xE5,0xE6,0xE7,0xE8,0xE9,
35656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project0xEA,0xEB,0xEC,0xED,0xEE,0xEF,0xF0,0xF1,
36656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project0xF2,0xF3,0xF4,0xF5,0xF6,0xF7,0xF8,0xF9,
37656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project0xFA,0xFB,0xFC,0xFD,0xFE,0xFF,0x00,0x01,
38656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,
39656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project0x0A,0x0B,0x05,0x06,0x07,0x08,0x09,0x0A,
40656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project0x0B,0x0C,0x0D,0x0E,0x0F,0x10,0x11,0x12,
41656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project0x13,0x14,0x15,0x16,0x17,0x18,0x19,0x1A,
42656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project0x1B,0x1C,0x1D,0x1E,0x1F,0x20,0x21,0x22,
43656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project0x23,0x24,0x25,0x20,0x21,0x22,0x23,0x24,
44656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project0x25,0x26,0x27,0x28,0x29,0x2A,0x2B,0x2C,
45656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project0x2D,0x2E,0x2F,0x30,0x31,0x32,0x33,0x34,
46656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project0x35,0x36,0x37,0x38,0x39,0x3A,0x3B,0x3C,
47656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project0x3D,0x3E,0x3F,0x40,0x41,0x42,0x43,0x44,
48656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project};
49656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
50656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectstatic unsigned const char cov_2char[64]={
51656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project0x2E,0x2F,0x30,0x31,0x32,0x33,0x34,0x35,
52656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project0x36,0x37,0x38,0x39,0x41,0x42,0x43,0x44,
53656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project0x45,0x46,0x47,0x48,0x49,0x4A,0x4B,0x4C,
54656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project0x4D,0x4E,0x4F,0x50,0x51,0x52,0x53,0x54,
55656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project0x55,0x56,0x57,0x58,0x59,0x5A,0x61,0x62,
56656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project0x63,0x64,0x65,0x66,0x67,0x68,0x69,0x6A,
57656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project0x6B,0x6C,0x6D,0x6E,0x6F,0x70,0x71,0x72,
58656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project0x73,0x74,0x75,0x76,0x77,0x78,0x79,0x7A
59656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project};
60656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
61656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectchar *DES_crypt(const char *buf, const char *salt)
62656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	{
63656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	static char buff[14];
64656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
65656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#ifndef CHARSET_EBCDIC
66656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	return(DES_fcrypt(buf,salt,buff));
67656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#else
68656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	char e_salt[2+1];
69656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	char e_buf[32+1];	/* replace 32 by 8 ? */
70656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	char *ret;
71656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
72656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	/* Copy at most 2 chars of salt */
73656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	if ((e_salt[0] = salt[0]) != '\0')
74656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	    e_salt[1] = salt[1];
75656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
76656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	/* Copy at most 32 chars of password */
77656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	strncpy (e_buf, buf, sizeof(e_buf));
78656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
79656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	/* Make sure we have a delimiter */
80656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	e_salt[sizeof(e_salt)-1] = e_buf[sizeof(e_buf)-1] = '\0';
81656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
82656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	/* Convert the e_salt to ASCII, as that's what DES_fcrypt works on */
83656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	ebcdic2ascii(e_salt, e_salt, sizeof e_salt);
84656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
85656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	/* Convert the cleartext password to ASCII */
86656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	ebcdic2ascii(e_buf, e_buf, sizeof e_buf);
87656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
88656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	/* Encrypt it (from/to ASCII) */
89656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	ret = DES_fcrypt(e_buf,e_salt,buff);
90656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
91656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	/* Convert the result back to EBCDIC */
92656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	ascii2ebcdic(ret, ret, strlen(ret));
93656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
94656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	return ret;
95656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#endif
96656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	}
97656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
98656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
99656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectchar *DES_fcrypt(const char *buf, const char *salt, char *ret)
100656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	{
101656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	unsigned int i,j,x,y;
102656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	DES_LONG Eswap0,Eswap1;
103656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	DES_LONG out[2],ll;
104656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	DES_cblock key;
105656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	DES_key_schedule ks;
106656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	unsigned char bb[9];
107656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	unsigned char *b=bb;
108656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	unsigned char c,u;
109656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
110656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	/* eay 25/08/92
111656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	 * If you call crypt("pwd","*") as often happens when you
112656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	 * have * as the pwd field in /etc/passwd, the function
113656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	 * returns *\0XXXXXXXXX
114656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	 * The \0 makes the string look like * so the pwd "*" would
115656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	 * crypt to "*".  This was found when replacing the crypt in
116656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	 * our shared libraries.  People found that the disabled
117656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	 * accounts effectively had no passwd :-(. */
118656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#ifndef CHARSET_EBCDIC
119656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	x=ret[0]=((salt[0] == '\0')?'A':salt[0]);
120656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	Eswap0=con_salt[x]<<2;
121656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	x=ret[1]=((salt[1] == '\0')?'A':salt[1]);
122656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	Eswap1=con_salt[x]<<6;
123656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#else
124656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	x=ret[0]=((salt[0] == '\0')?os_toascii['A']:salt[0]);
125656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	Eswap0=con_salt[x]<<2;
126656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	x=ret[1]=((salt[1] == '\0')?os_toascii['A']:salt[1]);
127656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	Eswap1=con_salt[x]<<6;
128656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#endif
129656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
130656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project/* EAY
131656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectr=strlen(buf);
132656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectr=(r+7)/8;
133656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project*/
134656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	for (i=0; i<8; i++)
135656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		{
136656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		c= *(buf++);
137656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		if (!c) break;
138656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		key[i]=(c<<1);
139656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		}
140656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	for (; i<8; i++)
141656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		key[i]=0;
142656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
143656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	DES_set_key_unchecked(&key,&ks);
144656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	fcrypt_body(&(out[0]),&ks,Eswap0,Eswap1);
145656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
146656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	ll=out[0]; l2c(ll,b);
147656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	ll=out[1]; l2c(ll,b);
148656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	y=0;
149656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	u=0x80;
150656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	bb[8]=0;
151656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	for (i=2; i<13; i++)
152656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		{
153656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		c=0;
154656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		for (j=0; j<6; j++)
155656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			{
156656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			c<<=1;
157656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			if (bb[y] & u) c|=1;
158656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			u>>=1;
159656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			if (!u)
160656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				{
161656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				y++;
162656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				u=0x80;
163656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				}
164656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			}
165656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		ret[i]=cov_2char[c];
166656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		}
167656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	ret[13]='\0';
168656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	return(ret);
169656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	}
170656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
171