Loading...
--- Libc/Libc-262.3.2/gen/crypt.c
+++ Libc/Libc-498/gen/crypt.c
@@ -2,8 +2,6 @@
* Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
*
* @APPLE_LICENSE_HEADER_START@
- *
- * Copyright (c) 1999-2003 Apple Computer, Inc. All Rights Reserved.
*
* This file contains Original Code and/or Modifications of Original Code
* as defined in and that are subject to the Apple Public Source License
@@ -59,8 +57,10 @@
*/
+#include <sys/cdefs.h>
#include <unistd.h>
#include <limits.h>
+#include <sys/types.h>
#include <pwd.h>
#include <stdlib.h>
@@ -85,7 +85,7 @@
/*
* define "MUST_ALIGN" if your compiler cannot load/store
* long integers at arbitrary (e.g. odd) memory locations.
- * (Either that or never pass unaligned addresses to des_cipher!)
+ * (Either that or never pass unaligned addresses to __crypt_des_cipher!)
*/
#if !defined(vax)
#define MUST_ALIGN
@@ -101,7 +101,7 @@
* define "LONG_IS_32_BITS" only if sizeof(long)==4.
* This avoids use of bit fields (your compiler may be sloppy with them).
*/
-#if !defined(cray)
+#if !defined(cray) && (LONG_BIT == 32)
#define LONG_IS_32_BITS
#endif
@@ -118,7 +118,7 @@
/*
* define "LARGEDATA" to get faster permutations, by using about 72 kilobytes
- * of lookup tables. This speeds up des_setkey() and des_cipher(), but has
+ * of lookup tables. This speeds up __crypt_des_setkey() and __crypt_des_cipher(), but has
* little effect on crypt().
*/
#if defined(notdef)
@@ -129,7 +129,10 @@
#ifndef STATIC
#define STATIC static
#endif
+#ifndef BUILDING_VARIANT
STATIC void init_des(), init_perm(), permute();
+#endif /* BUILDING_VARIANT */
+__private_extern__ int __crypt_des_cipher(), __crypt_des_setkey();
#ifdef DEBUG
STATIC prtab();
#endif
@@ -317,6 +320,7 @@
#define PERM3264(d,d0,d1,cpp,p) \
{ C_block tblk; permute(cpp,&tblk,p,4); LOAD (d,d0,d1,tblk); }
+#ifndef BUILDING_VARIANT
STATIC void permute(cp, out, p, chars_in)
unsigned char *cp;
C_block *out;
@@ -335,11 +339,18 @@
} while (--chars_in > 0);
STORE(D,D0,D1,*out);
}
+#endif /* BUILDING_VARIANT */
#endif /* LARGEDATA */
+#ifndef BUILDING_VARIANT
+__private_extern__ int __crypt_des_setkey_called = 0;
+#else /* BUILDING_VARIANT */
+__private_extern__ int __crypt_des_setkey_called;
+#endif /* BUILDING_VARIANT */
/* ===== (mostly) Standard DES Tables ==================== */
+#ifndef BUILDING_VARIANT
static unsigned char IP[] = { /* initial permutation */
58, 50, 42, 34, 26, 18, 10, 2,
60, 52, 44, 36, 28, 20, 12, 4,
@@ -394,46 +405,54 @@
};
static const unsigned char S[8][64] = { /* 48->32 bit substitution tables */
- /* S[1] */
+ { /* S[1] */
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,
15, 12, 8, 2, 4, 9, 1, 7, 5, 11, 3, 14, 10, 0, 6, 13,
- /* S[2] */
+ },
+ { /* S[2] */
15, 1, 8, 14, 6, 11, 3, 4, 9, 7, 2, 13, 12, 0, 5, 10,
3, 13, 4, 7, 15, 2, 8, 14, 12, 0, 1, 10, 6, 9, 11, 5,
0, 14, 7, 11, 10, 4, 13, 1, 5, 8, 12, 6, 9, 3, 2, 15,
13, 8, 10, 1, 3, 15, 4, 2, 11, 6, 7, 12, 0, 5, 14, 9,
- /* S[3] */
+ },
+ { /* S[3] */
10, 0, 9, 14, 6, 3, 15, 5, 1, 13, 12, 7, 11, 4, 2, 8,
13, 7, 0, 9, 3, 4, 6, 10, 2, 8, 5, 14, 12, 11, 15, 1,
13, 6, 4, 9, 8, 15, 3, 0, 11, 1, 2, 12, 5, 10, 14, 7,
1, 10, 13, 0, 6, 9, 8, 7, 4, 15, 14, 3, 11, 5, 2, 12,
- /* S[4] */
+ },
+ { /* S[4] */
7, 13, 14, 3, 0, 6, 9, 10, 1, 2, 8, 5, 11, 12, 4, 15,
13, 8, 11, 5, 6, 15, 0, 3, 4, 7, 2, 12, 1, 10, 14, 9,
10, 6, 9, 0, 12, 11, 7, 13, 15, 1, 3, 14, 5, 2, 8, 4,
3, 15, 0, 6, 10, 1, 13, 8, 9, 4, 5, 11, 12, 7, 2, 14,
- /* S[5] */
+ },
+ { /* S[5] */
2, 12, 4, 1, 7, 10, 11, 6, 8, 5, 3, 15, 13, 0, 14, 9,
14, 11, 2, 12, 4, 7, 13, 1, 5, 0, 15, 10, 3, 9, 8, 6,
4, 2, 1, 11, 10, 13, 7, 8, 15, 9, 12, 5, 6, 3, 0, 14,
11, 8, 12, 7, 1, 14, 2, 13, 6, 15, 0, 9, 10, 4, 5, 3,
- /* S[6] */
+ },
+ { /* S[6] */
12, 1, 10, 15, 9, 2, 6, 8, 0, 13, 3, 4, 14, 7, 5, 11,
10, 15, 4, 2, 7, 12, 9, 5, 6, 1, 13, 14, 0, 11, 3, 8,
9, 14, 15, 5, 2, 8, 12, 3, 7, 0, 4, 10, 1, 13, 11, 6,
4, 3, 2, 12, 9, 5, 15, 10, 11, 14, 1, 7, 6, 0, 8, 13,
- /* S[7] */
+ },
+ { /* S[7] */
4, 11, 2, 14, 15, 0, 8, 13, 3, 12, 9, 7, 5, 10, 6, 1,
13, 0, 11, 7, 4, 9, 1, 10, 14, 3, 5, 12, 2, 15, 8, 6,
1, 4, 11, 13, 12, 3, 7, 14, 10, 15, 6, 8, 0, 5, 9, 2,
6, 11, 13, 8, 1, 4, 10, 7, 9, 5, 0, 15, 14, 2, 3, 12,
- /* S[8] */
+ },
+ { /* S[8] */
13, 2, 8, 4, 6, 15, 11, 1, 10, 9, 3, 14, 5, 0, 12, 7,
1, 15, 13, 8, 10, 3, 7, 4, 12, 5, 6, 11, 0, 14, 9, 2,
7, 11, 4, 1, 9, 12, 14, 2, 0, 6, 10, 13, 15, 3, 5, 8,
2, 1, 14, 7, 4, 10, 8, 13, 15, 12, 9, 0, 3, 5, 6, 11,
+ },
};
static unsigned char P32Tr[] = { /* 32-bit permutation function */
@@ -516,7 +535,7 @@
key++;
keyblock.b[i] = t;
}
- if (des_setkey((char *)keyblock.b)) /* also initializes "a64toi" */
+ if (__crypt_des_setkey((char *)keyblock.b)) /* also initializes "a64toi" */
return (NULL);
encp = &cryptresult[0];
@@ -526,7 +545,7 @@
* Involve the rest of the password 8 characters at a time.
*/
while (*key) {
- if (des_cipher((char *)&keyblock,
+ if (__crypt_des_cipher((char *)&keyblock,
(char *)&keyblock, 0L, 1))
return (NULL);
for (i = 0; i < 8; i++) {
@@ -534,7 +553,7 @@
key++;
keyblock.b[i] ^= t;
}
- if (des_setkey((char *)keyblock.b))
+ if (__crypt_des_setkey((char *)keyblock.b))
return (NULL);
}
@@ -565,7 +584,7 @@
salt = (salt<<6) | a64toi[t];
}
encp += salt_size;
- if (des_cipher((char *)&constdatablock, (char *)&rsltblock,
+ if (__crypt_des_cipher((char *)&constdatablock, (char *)&rsltblock,
salt, num_iter))
return (NULL);
@@ -594,7 +613,7 @@
/*
- * The Key Schedule, filled in by des_setkey() or setkey().
+ * The Key Schedule, filled in by __crypt_des_setkey() or setkey().
*/
#define KS_SIZE 16
static C_block KS[KS_SIZE];
@@ -602,7 +621,7 @@
/*
* Set up the key schedule from the key.
*/
-STATIC int des_setkey(key)
+__private_extern__ int __crypt_des_setkey(key)
register const char *key;
{
register DCL_BLOCK(K, K0, K1);
@@ -625,6 +644,7 @@
PERM6464(K,K0,K1,(unsigned char *)key,ptabp);
STORE(K&~0x03030303L, K0&~0x03030303L, K1, *(C_block *)key);
}
+ __crypt_des_setkey_called = 1;
return (0);
}
@@ -636,7 +656,7 @@
* NOTE: the performance of this routine is critically dependent on your
* compiler and machine architecture.
*/
-STATIC int des_cipher(in, out, salt, num_iter)
+__private_extern__ int __crypt_des_cipher(in, out, salt, num_iter)
const char *in;
char *out;
long salt;
@@ -648,7 +668,8 @@
#endif
register long L0, L1, R0, R1, k;
register C_block *kp;
- register int ks_inc, loop_count;
+ register int loop_count;
+ ssize_t ks_inc;
C_block B;
L0 = salt;
@@ -924,11 +945,16 @@
}
}
}
+#endif /* BUILDING_VARIANT */
/*
* "setkey" routine (for backwards compatibility)
*/
+#if __DARWIN_UNIX03
+void setkey(key)
+#else /* !__DARWIN_UNIX03 */
int setkey(key)
+#endif /* __DARWIN_UNIX03 */
register const char *key;
{
register int i, j, k;
@@ -942,19 +968,33 @@
}
keyblock.b[i] = k;
}
- return (des_setkey((char *)keyblock.b));
+#if __DARWIN_UNIX03
+ __crypt_des_setkey((char *)keyblock.b);
+#else /* !__DARWIN_UNIX03 */
+ return (__crypt_des_setkey((char *)keyblock.b));
+#endif /* __DARWIN_UNIX03 */
}
/*
* "encrypt" routine (for backwards compatibility)
*/
+#if __DARWIN_UNIX03
+void encrypt(block, flag)
+#else /* !__DARWIN_UNIX03 */
int encrypt(block, flag)
+#endif /* __DARWIN_UNIX03 */
register char *block;
int flag;
{
register int i, j, k;
C_block cblock;
+ /* Prevent encrypt from crashing if setkey was never called.
+ * This does not make a good cypher */
+ if (!__crypt_des_setkey_called) {
+ cblock.b32.i0 = cblock.b32.i1 = 0;
+ __crypt_des_setkey((char *)cblock.b);
+ }
for (i = 0; i < 8; i++) {
k = 0;
for (j = 0; j < 8; j++) {
@@ -963,8 +1003,12 @@
}
cblock.b[i] = k;
}
- if (des_cipher((char *)&cblock, (char *)&cblock, 0L, (flag ? -1: 1)))
+ if (__crypt_des_cipher((char *)&cblock, (char *)&cblock, 0L, (flag ? -1: 1)))
+#if __DARWIN_UNIX03
+ return;
+#else /* !__DARWIN_UNIX03 */
return (1);
+#endif /* __DARWIN_UNIX03 */
for (i = 7; i >= 0; i--) {
k = cblock.b[i];
for (j = 7; j >= 0; j--) {
@@ -972,9 +1016,12 @@
k >>= 1;
}
}
+#if !__DARWIN_UNIX03
return (0);
+#endif /* !__DARWIN_UNIX03 */
}
+#ifndef BUILDING_VARIANT
#ifdef DEBUG
STATIC
prtab(s, t, num_rows)
@@ -994,3 +1041,4 @@
(void)printf("\n");
}
#endif
+#endif /* BUILDING_VARIANT */