libbb/crypt: code shrink
authorDenis Vlasenko <vda.linux@googlemail.com>
Thu, 4 Dec 2008 15:29:35 +0000 (15:29 -0000)
committerDenis Vlasenko <vda.linux@googlemail.com>
Thu, 4 Dec 2008 15:29:35 +0000 (15:29 -0000)
function                                             old     new   delta
to64_msb_first                                         -      63     +63
des_crypt                                           1509    1338    -171
------------------------------------------------------------------------------
(add/remove: 1/0 grow/shrink: 0/1 up/down: 63/-171)          Total: -108 bytes

libbb/pw_encrypt_des.c
libbb/pw_encrypt_md5.c

index cd19a63f78c846f91700fc8305b3c735cc9e3137..4e506f4986cd2c39536f0dc4a7cb3a09e68093f2 100644 (file)
@@ -696,13 +696,22 @@ do_des(struct des_ctx *ctx, /*uint32_t l_in, uint32_t r_in,*/ uint32_t *l_out, u
 
 #define DES_OUT_BUFSIZE 21
 
+static void
+to64_msb_first(char *s, unsigned v)
+{
+       *s++ = ascii64[(v >> 18) & 0x3f]; /* bits 23..18 */
+       *s++ = ascii64[(v >> 12) & 0x3f]; /* bits 17..12 */
+       *s++ = ascii64[(v >> 6) & 0x3f]; /* bits 11..6 */
+       *s = ascii64[v & 0x3f]; /* bits 5..0 */
+}
+
 static char *
 NOINLINE
 des_crypt(struct des_ctx *ctx, char output[DES_OUT_BUFSIZE],
                const unsigned char *key, const unsigned char *setting)
 {
-       uint32_t salt, l, r0, r1, keybuf[2];
-       uint8_t *p, *q;
+       uint32_t salt, r0, r1, keybuf[2];
+       uint8_t *q;
 
        /*
         * Copy the key, shifting each character up by one bit
@@ -733,34 +742,39 @@ des_crypt(struct des_ctx *ctx, char output[DES_OUT_BUFSIZE],
         */
        output[1] = setting[1] ? setting[1] : output[0];
 
-       p = (uint8_t *)output + 2;
-
        setup_salt(ctx, salt);
-       /*
-        * Do it.
-        */
+       /* Do it. */
        do_des(ctx, /*0, 0,*/ &r0, &r1, 25 /* count */);
 
-       /*
-        * Now encode the result...
-        */
-       l = (r0 >> 8);
-       *p++ = ascii64[(l >> 18) & 0x3f];
-       *p++ = ascii64[(l >> 12) & 0x3f];
-       *p++ = ascii64[(l >> 6) & 0x3f];
-       *p++ = ascii64[l & 0x3f];
-
+       /* Now encode the result. */
+#if 0
+{
+       uint32_t l = (r0 >> 8);
+       q = (uint8_t *)output + 2;
+       *q++ = ascii64[(l >> 18) & 0x3f]; /* bits 31..26 of r0 */
+       *q++ = ascii64[(l >> 12) & 0x3f]; /* bits 25..20 of r0 */
+       *q++ = ascii64[(l >> 6) & 0x3f]; /* bits 19..14 of r0 */
+       *q++ = ascii64[l & 0x3f]; /* bits 13..8 of r0 */
        l = ((r0 << 16) | (r1 >> 16));
-       *p++ = ascii64[(l >> 18) & 0x3f];
-       *p++ = ascii64[(l >> 12) & 0x3f];
-       *p++ = ascii64[(l >> 6) & 0x3f];
-       *p++ = ascii64[l & 0x3f];
-
+       *q++ = ascii64[(l >> 18) & 0x3f]; /* bits 7..2 of r0 */
+       *q++ = ascii64[(l >> 12) & 0x3f]; /* bits 1..2 of r0 and 31..28 of r1 */
+       *q++ = ascii64[(l >> 6) & 0x3f]; /* bits 27..22 of r1 */
+       *q++ = ascii64[l & 0x3f]; /* bits 21..16 of r1 */
        l = r1 << 2;
-       *p++ = ascii64[(l >> 12) & 0x3f];
-       *p++ = ascii64[(l >> 6) & 0x3f];
-       *p++ = ascii64[l & 0x3f];
-       *p = 0;
+       *q++ = ascii64[(l >> 12) & 0x3f]; /* bits 15..10 of r1 */
+       *q++ = ascii64[(l >> 6) & 0x3f]; /* bits 9..4 of r1 */
+       *q++ = ascii64[l & 0x3f]; /* bits 3..0 of r1 + 00 */
+       *q = 0;
+}
+#else
+       /* Each call takes low-order 24 bits and stores 4 chars */
+       /* bits 31..8 of r0 */
+       to64_msb_first(output + 2, (r0 >> 8));
+       /* bits 7..0 of r0 and 31..16 of r1 */
+       to64_msb_first(output + 6, (r0 << 16) | (r1 >> 16));
+       /* (bits 15..0 of r1 + 00) and NUL byte */
+       to64_msb_first(output + 10, (r1 << 8));
+#endif
 
        return output;
 }
index b02cbecfa003f2babd9b4c01a654f2a4a5131027..58964b56769c7b62bd0135ecf2102e29c41c93c7 100644 (file)
  * by Erik Andersen to remove reentrance stuff...
  */
 
-#define MD5_MAGIC_STR "$1$"
-#define MD5_MAGIC_LEN (sizeof(MD5_MAGIC_STR) - 1)
-static const unsigned char __md5__magic[] = MD5_MAGIC_STR;
-
 /*
  * UNIX password
  *
@@ -163,5 +159,3 @@ md5_crypt(char result[MD5_OUT_BUFSIZE], const unsigned char *pw, const unsigned
 
        return result;
 }
-#undef MD5_MAGIC_STR
-#undef MD5_MAGIC_LEN