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