diff options
| -rw-r--r-- | libcrypt/Makefile | 4 | ||||
| -rw-r--r-- | libcrypt/crypt.c | 6 | ||||
| -rw-r--r-- | libcrypt/des.c | 59 | ||||
| -rw-r--r-- | libcrypt/md5.c | 130 | 
4 files changed, 98 insertions, 101 deletions
diff --git a/libcrypt/Makefile b/libcrypt/Makefile index cc623fa5e..ecb2831e5 100644 --- a/libcrypt/Makefile +++ b/libcrypt/Makefile @@ -28,7 +28,7 @@ LIBCRYPT=libcrypt.a  LIBCRYPT_SHARED=libcrypt.so  LIBCRYPT_SHARED_FULLNAME=libcrypt-$(MAJOR_VERSION).$(MINOR_VERSION).so -CSRC = crypt.c des.c md5.c +CSRC = crypt.c des.c  OBJS=$(patsubst %.c,%.o, $(CSRC))  all: $(OBJS) $(LIBCRYPT) @@ -47,6 +47,8 @@ $(OBJS): %.o : %.c  $(OBJ): Makefile +des.o: des.c md5.c +  shared: all  	$(LD) $(LDFLAGS) -soname=$(LIBCRYPT_SHARED).$(MAJOR_VERSION) \  		-o $(LIBCRYPT_SHARED_FULLNAME) --whole-archive $(LIBCRYPT) \ diff --git a/libcrypt/crypt.c b/libcrypt/crypt.c index 4c489ed36..9c41bdaec 100644 --- a/libcrypt/crypt.c +++ b/libcrypt/crypt.c @@ -27,17 +27,17 @@  /* For use by the old, non-reentrant routines (crypt/encrypt/setkey)  */  static struct crypt_data __crypt_data; -char * crypt(const char *key, const char *salt) +extern char * crypt(const char *key, const char *salt)  {      return crypt_r (key, salt, &__crypt_data);  } -void setkey(const char *key) +extern void setkey(const char *key)  {      return setkey_r(key, &__crypt_data);  } -void encrypt(char *block, int edflag) +extern void encrypt(char *block, int edflag)  {      return encrypt_r(block, edflag, &__crypt_data);  } diff --git a/libcrypt/des.c b/libcrypt/des.c index 1c4ed7f94..77168a700 100644 --- a/libcrypt/des.c +++ b/libcrypt/des.c @@ -46,56 +46,56 @@  #include <string.h>  #include <crypt.h> -extern char * md5_crypt_r( const char *pw, const char *salt, struct crypt_data * data); +static char * __md5_crypt_r( const char *pw, const char *salt, struct crypt_data * data); -static const struct ordering InitialTr = { { +static const struct ordering __des_InitialTr = { {  	58,50,42,34,26,18,10, 2,60,52,44,36,28,20,12, 4,  	62,54,46,38,30,22,14, 6,64,56,48,40,32,24,16, 8,  	57,49,41,33,25,17, 9, 1,59,51,43,35,27,19,11, 3,  	61,53,45,37,29,21,13, 5,63,55,47,39,31,23,15, 7,  } }; -static const struct ordering FinalTr = { { +static const struct ordering __des_FinalTr = { {  	40, 8,48,16,56,24,64,32,39, 7,47,15,55,23,63,31,  	38, 6,46,14,54,22,62,30,37, 5,45,13,53,21,61,29,  	36, 4,44,12,52,20,60,28,35, 3,43,11,51,19,59,27,  	34, 2,42,10,50,18,58,26,33, 1,41, 9,49,17,57,25,  } }; -static const struct ordering swap = { { +static const struct ordering __des_Swap = { {  	33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,  	49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,  	 1, 2, 3, 4, 5, 6, 7, 8, 9,10,11,12,13,14,15,16,  	17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,  } }; -static const struct ordering KeyTr1 = { { +static const struct ordering __des_KeyTr1 = { {  	57,49,41,33,25,17, 9, 1,58,50,42,34,26,18,  	10, 2,59,51,43,35,27,19,11, 3,60,52,44,36,  	63,55,47,39,31,23,15, 7,62,54,46,38,30,22,  	14, 6,61,53,45,37,29,21,13, 5,28,20,12, 4,  } }; -static const struct ordering KeyTr2 = { { +static const struct ordering __des_KeyTr2 = { {  	14,17,11,24, 1, 5, 3,28,15, 6,21,10,  	23,19,12, 4,26, 8,16, 7,27,20,13, 2,  	41,52,31,37,47,55,30,40,51,45,33,48,  	44,49,39,56,34,53,46,42,50,36,29,32,  } }; -static const struct ordering etr = { { +static const struct ordering __des_Etr = { {  	32, 1, 2, 3, 4, 5, 4, 5, 6, 7, 8, 9,  	 8, 9,10,11,12,13,12,13,14,15,16,17,  	16,17,18,19,20,21,20,21,22,23,24,25,  	24,25,26,27,28,29,28,29,30,31,32, 1,  } }; -static const struct ordering ptr = { { +static const struct ordering __des_Ptr = { {  	16, 7,20,21,29,12,28,17, 1,15,23,26, 5,18,31,10,  	 2, 8,24,14,32,27, 3, 9,19,13,30, 6,22,11, 4,25,  } }; -static const unsigned char s_boxes[8][64] = { +static const unsigned char __des_S_boxes[8][64] = {  {	14, 4,13, 1, 2,15,11, 8, 3,10, 6,12, 5, 9, 0, 7,  	 0,15, 7, 4,14, 2,13, 1,10, 6,12,11, 9, 5, 3, 8,  	 4, 1,14, 8,13, 6, 2,11,15,12, 9, 7, 3,10, 5, 0, @@ -145,11 +145,11 @@ static const unsigned char s_boxes[8][64] = {  },  }; -static const int rots[] = { +static const int __des_Rots[] = {  	1,1,2,2,2,2,2,2,1,2,2,2,2,2,2,1,  }; -static void transpose(struct block *data, const struct ordering *t, int n) +static void __des_transpose(struct block *data, const struct ordering *t, int n)  {  	struct block x; @@ -160,7 +160,7 @@ static void transpose(struct block *data, const struct ordering *t, int n)  	}  } -static void rotate(struct block *key) +static void __des_rotate(struct block *key)  {  	unsigned char *p = key->b_data;  	unsigned char *ep = &(key->b_data[55]); @@ -171,17 +171,17 @@ static void rotate(struct block *key)  	key->b_data[55] = data28;  } -static void f(int i, struct block *key, struct block *a, struct block *x, struct crypt_data *data) +static void __des_encrypt(int i, struct block *key, struct block *a, struct block *x, struct crypt_data *data)  {  	struct block e, ikey, y;  	int k;  	unsigned char *p, *q, *r;  	e = *a; -	transpose(&e, data->EP, 48); -	for (k = rots[i]; k; k--) rotate(key); +	__des_transpose(&e, data->EP, 48); +	for (k = __des_Rots[i]; k; k--) __des_rotate(key);  	ikey = *key; -	transpose(&ikey, &KeyTr2, 48); +	__des_transpose(&ikey, &__des_KeyTr2, 48);  	p = &(y.b_data[48]);  	q = &(e.b_data[48]);  	r = &(ikey.b_data[48]); @@ -199,21 +199,21 @@ static void f(int i, struct block *key, struct block *a, struct block *x, struct  		r += *p++;  		r += *p++ << 4; -		xb = s_boxes[k][r]; +		xb = __des_S_boxes[k][r];  		*q++ = (xb >> 3) & 1;  		*q++ = (xb>>2) & 1;  		*q++ = (xb>>1) & 1;  		*q++ = (xb & 1);  	} -	transpose(x, &ptr, 32); +	__des_transpose(x, &__des_Ptr, 32);  } -void setkey_r(const char *k, struct crypt_data *data) +extern void setkey_r(const char *k, struct crypt_data *data)  {  	struct block *key = &(data->key);  	memcpy(key, k, (sizeof(struct block))); -	transpose(key, &KeyTr1, 56); +	__des_transpose(key, &__des_KeyTr1, 56);  }  extern void encrypt_r(char *blck, int edflag, struct crypt_data *data) @@ -222,7 +222,8 @@ extern void encrypt_r(char *blck, int edflag, struct crypt_data *data)  	struct block *p = (struct block *) blck;  	int i; -	transpose(p, &InitialTr, 64); +	__des_transpose(p, &__des_InitialTr, 64); +	data->EP = &__des_Etr;  	for (i = 15; i>= 0; i--) {  		int j = edflag ? i : 15 - i;  		int k; @@ -232,13 +233,13 @@ extern void encrypt_r(char *blck, int edflag, struct crypt_data *data)  		for (k = 31; k >= 0; k--) {  			p->b_data[k] = b.b_data[k + 32];  		} -		f(j, key, p, &x, data); +		__des_encrypt(j, key, p, &x, data);  		for (k = 31; k >= 0; k--) {  			p->b_data[k+32] = b.b_data[k] ^ x.b_data[k];  		}  	} -	transpose(p, &swap, 64); -	transpose(p, &FinalTr, 64); +	__des_transpose(p, &__des_Swap, 64); +	__des_transpose(p, &__des_FinalTr, 64);  }  extern char *crypt_r(const char *pw, const char *salt, struct crypt_data *data) @@ -253,9 +254,8 @@ extern char *crypt_r(const char *pw, const char *salt, struct crypt_data *data)  	/* First, check if we are supposed to be using the MD5 replacement  	 * instead of DES...  */  	if (salt[0]=='$' && salt[1]=='1' && salt[2]=='$') -		return md5_crypt_r(pw, salt, data); +		return __md5_crypt_r(pw, salt, data); -	data->EP = &etr;  	while (*pw && p < &pwb[64]) {  		int j = 7; @@ -271,7 +271,7 @@ extern char *crypt_r(const char *pw, const char *salt, struct crypt_data *data)  	while (p < &pwb[66]) *p++ = 0; -	new_etr = etr; +	new_etr = __des_Etr;  	data->EP = &new_etr;  	if (salt[0] == 0 || salt[1] == 0) salt = "**";  	for (i = 0; i < 2; i++) { @@ -295,8 +295,9 @@ extern char *crypt_r(const char *pw, const char *salt, struct crypt_data *data)  	if (result[1] == 0) result[1] = result[0]; +	data->EP = &__des_Etr;  	for (i = 0; i < 25; i++) encrypt_r(pwb,0, data); -	data->EP = &etr; +	data->EP = &__des_Etr;  	p = pwb;  	cp = result+2; @@ -355,3 +356,5 @@ extern char *crypt_r(const char *pw, const char *salt, struct crypt_data *data)   */ +#include <md5.c> + diff --git a/libcrypt/md5.c b/libcrypt/md5.c index 3bc669112..2231fd317 100644 --- a/libcrypt/md5.c +++ b/libcrypt/md5.c @@ -76,47 +76,39 @@  #include <sys/cdefs.h>  /* MD5 context. */ -typedef struct MD5Context { +struct MD5Context {    u_int32_t state[4];	/* state (ABCD) */    u_int32_t count[2];	/* number of bits, modulo 2^64 (lsb first) */    unsigned char buffer[64];	/* input buffer */ -} MD5_CTX; +}; -void   MD5Init (MD5_CTX *); -void   MD5Update (MD5_CTX *, const unsigned char *, unsigned int); -void   MD5Pad (MD5_CTX *); -void   MD5Final (unsigned char [16], MD5_CTX *); -char * MD5End(MD5_CTX *, char *); -char * MD5File(const char *, char *); -char * MD5Data(const unsigned char *, unsigned int, char *); -char * md5_crypt_r( const char *pw, const char *salt, struct crypt_data * data); +static void   __md5_Init (struct MD5Context *); +static void   __md5_Update (struct MD5Context *, const unsigned char *, unsigned int); +static void   __md5_Pad (struct MD5Context *); +static void   __md5_Final (unsigned char [16], struct MD5Context *); +static char * __md5_crypt_r( const char *pw, const char *salt, struct crypt_data * data); +static void __md5_Transform __P((u_int32_t [4], const unsigned char [64])); -char	*md5_magic = "$1$";	/* * This string is magic for this algorithm.  Having  -				   it this way, we can get better later on */ -static const unsigned char itoa64[] =		/* 0 ... 63 => ascii - 64 */ +static const char __md5__magic[] = "$1$";	/* This string is magic for this algorithm.  Having  +						   it this way, we can get better later on */ +static const unsigned char __md5_itoa64[] =		/* 0 ... 63 => ascii - 64 */  	"./0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz"; -static void MD5Transform __P((u_int32_t [4], const unsigned char [64])); - -#ifdef KERNEL -#define memset(x,y,z)	bzero(x,z); -#define memcpy(x,y,z)	bcopy(y, x, z) -#endif  #ifdef i386 -#define Encode memcpy -#define Decode memcpy +#define __md5_Encode memcpy +#define __md5_Decode memcpy  #else /* i386 */  /* - * Encodes input (u_int32_t) into output (unsigned char). Assumes len is + * __md5_Encodes input (u_int32_t) into output (unsigned char). Assumes len is   * a multiple of 4.   */  static void -Encode (output, input, len) +__md5_Encode (output, input, len)  	unsigned char *output;  	u_int32_t *input;  	unsigned int len; @@ -132,12 +124,12 @@ Encode (output, input, len)  }  /* - * Decodes input (unsigned char) into output (u_int32_t). Assumes len is + * __md5_Decodes input (unsigned char) into output (u_int32_t). Assumes len is   * a multiple of 4.   */  static void -Decode (output, input, len) +__md5_Decode (output, input, len)  	u_int32_t *output;  	const unsigned char *input;  	unsigned int len; @@ -186,7 +178,7 @@ Decode (output, input, len)  /* MD5 initialization. Begins an MD5 operation, writing a new context. */ -void MD5Init (MD5_CTX *context) +static void __md5_Init (struct MD5Context *context)  {  	context->count[0] = context->count[1] = 0; @@ -203,7 +195,7 @@ void MD5Init (MD5_CTX *context)   * context.   */ -void MD5Update ( MD5_CTX *context, const unsigned char *input, unsigned int inputLen) +static void __md5_Update ( struct MD5Context *context, const unsigned char *input, unsigned int inputLen)  {  	unsigned int i, index, partLen; @@ -222,10 +214,10 @@ void MD5Update ( MD5_CTX *context, const unsigned char *input, unsigned int inpu  	if (inputLen >= partLen) {  		memcpy((void *)&context->buffer[index], (const void *)input,  		    partLen); -		MD5Transform (context->state, context->buffer); +		__md5_Transform (context->state, context->buffer);  		for (i = partLen; i + 63 < inputLen; i += 64) -			MD5Transform (context->state, &input[i]); +			__md5_Transform (context->state, &input[i]);  		index = 0;  	} @@ -241,7 +233,7 @@ void MD5Update ( MD5_CTX *context, const unsigned char *input, unsigned int inpu   * MD5 padding. Adds padding followed by original length.   */ -void MD5Pad ( MD5_CTX *context) +static void __md5_Pad ( struct MD5Context *context)  {  	unsigned char bits[8];  	unsigned int index, padLen; @@ -251,15 +243,15 @@ void MD5Pad ( MD5_CTX *context)  	PADDING[0] = 0x80;  	/* Save number of bits */ -	Encode (bits, context->count, 8); +	__md5_Encode (bits, context->count, 8);  	/* Pad out to 56 mod 64. */  	index = (unsigned int)((context->count[0] >> 3) & 0x3f);  	padLen = (index < 56) ? (56 - index) : (120 - index); -	MD5Update (context, PADDING, padLen); +	__md5_Update (context, PADDING, padLen);  	/* Append length (before padding) */ -	MD5Update (context, bits, 8); +	__md5_Update (context, bits, 8);  }  /* @@ -267,13 +259,13 @@ void MD5Pad ( MD5_CTX *context)   * the message digest and zeroizing the context.   */ -void MD5Final ( unsigned char digest[16], MD5_CTX *context) +static void __md5_Final ( unsigned char digest[16], struct MD5Context *context)  {  	/* Do padding. */ -	MD5Pad (context); +	__md5_Pad (context);  	/* Store state in digest */ -	Encode (digest, context->state, 16); +	__md5_Encode (digest, context->state, 16);  	/* Zeroize sensitive information. */  	memset ((void *)context, 0, sizeof (*context)); @@ -282,7 +274,7 @@ void MD5Final ( unsigned char digest[16], MD5_CTX *context)  /* MD5 basic transformation. Transforms state based on block. */  static void -MD5Transform (state, block) +__md5_Transform (state, block)  	u_int32_t state[4];  	const unsigned char block[64];  { @@ -337,7 +329,7 @@ MD5Transform (state, block)  #endif /* MD5_SIZE_OVER_SPEED > 0 */ -	Decode (x, block, 64); +	__md5_Decode (x, block, 64);  	a = state[0]; b = state[1]; c = state[2]; d = state[3];  @@ -527,10 +519,10 @@ MD5Transform (state, block)  } -static void to64( char *s, unsigned long v, int n) +static void __md5_to64( char *s, unsigned long v, int n)  {  	while (--n >= 0) { -		*s++ = itoa64[v&0x3f]; +		*s++ = __md5_itoa64[v&0x3f];  		v >>= 6;  	}  } @@ -541,7 +533,7 @@ static void to64( char *s, unsigned long v, int n)   * Use MD5 for what it is best at...   */ -char * md5_crypt_r( const char *pw, const char *salt, struct crypt_data * data) +static char * __md5_crypt_r( const char *pw, const char *salt, struct crypt_data * data)  {  	char *p = data->p;  	const char *sp = data->sp; @@ -551,17 +543,17 @@ char * md5_crypt_r( const char *pw, const char *salt, struct crypt_data * data)  					   a separate field in struct crypt_data,   					   but this spot should do nicely... */  	unsigned char	final[17];	/* final[16] exists only to aid in looping */ -	int sl,pl,i,md5_magic_len,pw_len; -	MD5_CTX	ctx,ctx1; +	int sl,pl,i,__md5__magic_len,pw_len; +	struct MD5Context ctx,ctx1;  	unsigned long l;  	/* Refine the Salt first */  	sp = salt;  	/* If it starts with the magic string, then skip that */ -	md5_magic_len = strlen(md5_magic); -	if(!strncmp(sp,md5_magic,md5_magic_len)) -		sp += md5_magic_len; +	__md5__magic_len = strlen(__md5__magic); +	if(!strncmp(sp,__md5__magic,__md5__magic_len)) +		sp += __md5__magic_len;  	/* It stops at the first '$', max 8 chars */  	for(ep=sp;*ep && *ep != '$' && ep < (sp+8);ep++) @@ -570,41 +562,41 @@ char * md5_crypt_r( const char *pw, const char *salt, struct crypt_data * data)  	/* get the length of the true salt */  	sl = ep - sp; -	MD5Init(&ctx); +	__md5_Init(&ctx);  	/* The password first, since that is what is most unknown */  	pw_len = strlen(pw); -	MD5Update(&ctx,pw,pw_len); +	__md5_Update(&ctx,pw,pw_len);  	/* Then our magic string */ -	MD5Update(&ctx,md5_magic,md5_magic_len); +	__md5_Update(&ctx,__md5__magic,__md5__magic_len);  	/* Then the raw salt */ -	MD5Update(&ctx,sp,sl); +	__md5_Update(&ctx,sp,sl);  	/* Then just as many characters of the MD5(pw,salt,pw) */ -	MD5Init(&ctx1); -	MD5Update(&ctx1,pw,pw_len); -	MD5Update(&ctx1,sp,sl); -	MD5Update(&ctx1,pw,pw_len); -	MD5Final(final,&ctx1); +	__md5_Init(&ctx1); +	__md5_Update(&ctx1,pw,pw_len); +	__md5_Update(&ctx1,sp,sl); +	__md5_Update(&ctx1,pw,pw_len); +	__md5_Final(final,&ctx1);  	for(pl = pw_len; pl > 0; pl -= 16) -		MD5Update(&ctx,final,pl>16 ? 16 : pl); +		__md5_Update(&ctx,final,pl>16 ? 16 : pl);  	/* Don't leave anything around in vm they could use. */  	memset(final,0,sizeof final);  	/* Then something really weird... */  	for (i = pw_len; i ; i >>= 1) { -		MD5Update(&ctx, ((i&1) ? final : (const unsigned char *) pw), 1); +		__md5_Update(&ctx, ((i&1) ? final : (const unsigned char *) pw), 1);  	}  	/* Now make the output string */ -	strcpy(passwd,md5_magic); +	strcpy(passwd,__md5__magic);  	strncat(passwd,sp,sl);  	strcat(passwd,"$"); -	MD5Final(final,&ctx); +	__md5_Final(final,&ctx);  	/*  	 * and now, just to make sure things don't run too fast @@ -612,23 +604,23 @@ char * md5_crypt_r( const char *pw, const char *salt, struct crypt_data * data)  	 * need 30 seconds to build a 1000 entry dictionary...  	 */  	for(i=0;i<1000;i++) { -		MD5Init(&ctx1); +		__md5_Init(&ctx1);  		if(i & 1) -			MD5Update(&ctx1,pw,pw_len); +			__md5_Update(&ctx1,pw,pw_len);  		else -			MD5Update(&ctx1,final,16); +			__md5_Update(&ctx1,final,16);  		if(i % 3) -			MD5Update(&ctx1,sp,sl); +			__md5_Update(&ctx1,sp,sl);  		if(i % 7) -			MD5Update(&ctx1,pw,pw_len); +			__md5_Update(&ctx1,pw,pw_len);  		if(i & 1) -			MD5Update(&ctx1,final,16); +			__md5_Update(&ctx1,final,16);  		else -			MD5Update(&ctx1,pw,pw_len); -		MD5Final(final,&ctx1); +			__md5_Update(&ctx1,pw,pw_len); +		__md5_Final(final,&ctx1);  	}  	p = passwd + strlen(passwd); @@ -636,10 +628,10 @@ char * md5_crypt_r( const char *pw, const char *salt, struct crypt_data * data)  	final[16] = final[5];  	for ( i=0 ; i < 5 ; i++ ) {  		l = (final[i]<<16) | (final[i+6]<<8) | final[i+12]; -		to64(p,l,4); p += 4; +		__md5_to64(p,l,4); p += 4;  	}  	l = final[11]; -	to64(p,l,2); p += 2; +	__md5_to64(p,l,2); p += 2;  	*p = '\0';  	/* Don't leave anything around in vm they could use. */  | 
