trivial crypt shrinkage
authorDenis Vlasenko <vda.linux@googlemail.com>
Fri, 13 Jun 2008 15:13:41 +0000 (15:13 -0000)
committerDenis Vlasenko <vda.linux@googlemail.com>
Fri, 13 Jun 2008 15:13:41 +0000 (15:13 -0000)
function                                             old     new   delta
__md5_to64                                            27      29      +2
pw_encrypt                                          3631    3608     -23

libbb/pw_encrypt_des.c
libbb/pw_encrypt_md5.c

index 637765e..ab217d8 100644 (file)
@@ -673,8 +673,6 @@ des_crypt(struct des_ctx *ctx, char output[21], const unsigned char *key, const
        return output;
 }
 
-// des_setkey never fails
-
 #undef C
 #undef init_perm
 #undef final_perm
index 42eb134..6c94d2d 100644 (file)
@@ -501,13 +501,14 @@ static void __md5_Transform(uint32_t state[4], const unsigned char block[64])
 }
 
 
-static void
-__md5_to64(char *s, unsigned long v, int n)
+static char*
+__md5_to64(char *s, unsigned v, int n)
 {
        while (--n >= 0) {
                *s++ = ascii64[v & 0x3f];
                v >>= 6;
        }
+       return s;
 }
 
 /*
@@ -515,7 +516,7 @@ __md5_to64(char *s, unsigned long v, int n)
  *
  * Use MD5 for what it is best at...
  */
-#define MD5_OUT_BUFSIZE 120
+#define MD5_OUT_BUFSIZE 36
 
 static char *
 md5_crypt(char passwd[120], const unsigned char *pw, const unsigned char *salt)
@@ -578,7 +579,6 @@ md5_crypt(char passwd[120], const unsigned char *pw, const unsigned char *salt)
        passwd[2] = '$';
        strncpy(passwd + 3, (char*)sp, sl);
        passwd[sl + 3] = '$';
-       passwd[sl + 4] = '\0';
 
        __md5_Final(final, &ctx);
 
@@ -607,15 +607,16 @@ md5_crypt(char passwd[120], const unsigned char *pw, const unsigned char *salt)
                __md5_Final(final, &ctx1);
        }
 
-       p = passwd + sl + 4; /*strlen(passwd);*/
+       p = passwd + sl + 4; /* 12 bytes max (sl is up to 8 bytes) */
 
+       /* Add 5*4+2 = 22 bytes of hash, + NUL byte. */
        final[16] = final[5];
        for (i = 0; i < 5; i++) {
                l = (final[i] << 16) | (final[i+6] << 8) | final[i+12];
-               __md5_to64(p, l, 4); p += 4;
+               p = __md5_to64(p, l, 4);
        }
        l = final[11];
-       __md5_to64(p, l, 2); p += 2;
+       p = __md5_to64(p, l, 2);
        *p = '\0';
 
        /* Don't leave anything around in vm they could use. */