passwd: small size optimization. salt generation improved
authorDenis Vlasenko <vda.linux@googlemail.com>
Thu, 30 Nov 2006 20:41:28 +0000 (20:41 -0000)
committerDenis Vlasenko <vda.linux@googlemail.com>
Thu, 30 Nov 2006 20:41:28 +0000 (20:41 -0000)
(really generated different salts even if called back-to-back).

Makefile.custom
libbb/pw_encrypt.c
loginutils/passwd.c

index ce808196a5f2b28785d2ce35bcbf307d964a7ab1..254279178cd61719d24636872c2655ecd481ebda 100644 (file)
@@ -63,6 +63,10 @@ baseline: busybox_unstripped
 objsizes: busybox_unstripped
        $(srctree)/scripts/objsizes
 
+.PHONY: bigdata
+bigdata: busybox_unstripped
+       nm --size-sort busybox_unstripped | grep -vi ' [tr] ' | tail -20
+
 # Documentation Targets
 .PHONY: doc
 doc: docs/busybox.pod docs/BusyBox.txt docs/BusyBox.1 docs/BusyBox.html
index f6085f3d2c541fedab12a8890828381e7845ec40..d546bc883ec4d3606b37f19b1fbd7b031720e981 100644 (file)
@@ -8,7 +8,6 @@
  */
 
 #include "libbb.h"
-#include <string.h>
 #include <crypt.h>
 
 char *pw_encrypt(const char *clear, const char *salt)
index 41033e51a2f9f94a4974540792ebeb7bb8404187..83c3a2d7327827fc204eda38796387e6eae6cb08 100644 (file)
@@ -5,6 +5,7 @@
 
 #include "busybox.h"
 #include <syslog.h>
+#include <sys/times.h> /* times() */
 
 
 static void nuke_str(char *str)
@@ -19,28 +20,35 @@ static int i64c(int i)
                return '.';
        if (i == 1)
                return '/';
-       if (i >= 2 && i < 12)
+       if (i < 12)
                return ('0' - 2 + i);
-       if (i >= 12 && i < 38)
+       if (i < 38)
                return ('A' - 12 + i);
-       if (i >= 38 && i < 63)
-               return ('a' - 38 + i);
-       return 'z';
+       return ('a' - 38 + i);
 }
 
 
-static char *crypt_make_salt(void)
+static void crypt_make_salt(char *p, int cnt)
 {
-       time_t now;
-       static unsigned long x;
-       static char result[3];
-
-       time(&now);
-       x += now + getpid() + clock();
-       result[0] = i64c(((x >> 18) ^ (x >> 6)) & 077);
-       result[1] = i64c(((x >> 12) ^ x) & 077);
-       result[2] = '\0';
-       return result;
+#if !defined(__GLIBC__)
+       struct tms t;
+#define TIMES times(&t)
+#else
+/* glibc allows for times(NULL) a-la time() */
+#define TIMES times(NULL)
+#endif
+       unsigned long x = x; /* it's pointless to initialize it anyway :) */
+
+       x += getpid();
+       do {
+       /* clock() and times() variability is different between systems */
+       /* hopefully at least one is good enough */
+               x += time(NULL) + clock() + TIMES;
+               *p++ = i64c(((x >> 18) ^ (x >> 6)) & 0x3f);
+               *p++ = i64c(((x >> 12) ^ x) & 0x3f);
+               usleep(100); /* or else time() etc won't change */
+       } while (--cnt);
+       *p = '\0';
 }
 
 
@@ -88,14 +96,12 @@ static char* new_password(const struct passwd *pw, const char *old_crypted,
                goto err_ret;
        }
 
-       memset(salt, 0, sizeof(salt));
-       if (algo == 1) { /* MD5 */
+       /*memset(salt, 0, sizeof(salt)); - why?*/
+       crypt_make_salt(salt, 1); /* des */
+       if (algo) { /* MD5 */
                strcpy(salt, "$1$");
-               strcat(salt, crypt_make_salt());
-               strcat(salt, crypt_make_salt());
-               strcat(salt, crypt_make_salt());
+               crypt_make_salt(salt + 3, 4);
        }
-       strcat(salt, crypt_make_salt());
        ret = xstrdup(pw_encrypt(newp, salt)); /* returns ptr to static */
        /* whee, success! */