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