[PATCH] libcrypt/sha512-crypt: convert nested function b64_from_24bit() into a macro

William Pitcock nenolod at dereferenced.org
Wed Nov 16 12:05:07 UTC 2011


The glibc implementation of sha512-crypt used inline functions which should
really be converted into a macro because otherwise a trampoline is potentially
created.

Signed-off-by: William Pitcock <nenolod at dereferenced.org>
---
 libcrypt/sha512-crypt.c |   68 +++++++++++++++++++++++-----------------------
 1 files changed, 34 insertions(+), 34 deletions(-)

diff --git a/libcrypt/sha512-crypt.c b/libcrypt/sha512-crypt.c
index dece925..0321be0 100644
--- a/libcrypt/sha512-crypt.c
+++ b/libcrypt/sha512-crypt.c
@@ -48,6 +48,18 @@ static const char sha512_rounds_prefix[] = "rounds=";
 static const char b64t[64] =
 "./0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz";
 
+#define B64_FROM_24BIT(b2, b1, b0, steps) \
+	{ \
+		int n = (steps); \
+		unsigned int w = ((b2) << 16) | ((b1) << 8) | (b0); \
+		while (n-- > 0 && buflen > 0) \
+		{ \
+			*cp++ = b64t[w & 0x3f]; \
+			--buflen; \
+			w >>= 6; \
+		} \
+	}
+
 char *
 __sha512_crypt_r (const char *key,
      const char *salt,
@@ -246,40 +258,28 @@ __sha512_crypt_r (const char *key,
       --buflen;
     }
 
-  void b64_from_24bit (unsigned int b2, unsigned int b1, unsigned int b0,
-		       int n)
-  {
-    unsigned int w = (b2 << 16) | (b1 << 8) | b0;
-    while (n-- > 0 && buflen > 0)
-      {
-	*cp++ = b64t[w & 0x3f];
-	--buflen;
-	w >>= 6;
-      }
-  }
-
-  b64_from_24bit (alt_result[0], alt_result[21], alt_result[42], 4);
-  b64_from_24bit (alt_result[22], alt_result[43], alt_result[1], 4);
-  b64_from_24bit (alt_result[44], alt_result[2], alt_result[23], 4);
-  b64_from_24bit (alt_result[3], alt_result[24], alt_result[45], 4);
-  b64_from_24bit (alt_result[25], alt_result[46], alt_result[4], 4);
-  b64_from_24bit (alt_result[47], alt_result[5], alt_result[26], 4);
-  b64_from_24bit (alt_result[6], alt_result[27], alt_result[48], 4);
-  b64_from_24bit (alt_result[28], alt_result[49], alt_result[7], 4);
-  b64_from_24bit (alt_result[50], alt_result[8], alt_result[29], 4);
-  b64_from_24bit (alt_result[9], alt_result[30], alt_result[51], 4);
-  b64_from_24bit (alt_result[31], alt_result[52], alt_result[10], 4);
-  b64_from_24bit (alt_result[53], alt_result[11], alt_result[32], 4);
-  b64_from_24bit (alt_result[12], alt_result[33], alt_result[54], 4);
-  b64_from_24bit (alt_result[34], alt_result[55], alt_result[13], 4);
-  b64_from_24bit (alt_result[56], alt_result[14], alt_result[35], 4);
-  b64_from_24bit (alt_result[15], alt_result[36], alt_result[57], 4);
-  b64_from_24bit (alt_result[37], alt_result[58], alt_result[16], 4);
-  b64_from_24bit (alt_result[59], alt_result[17], alt_result[38], 4);
-  b64_from_24bit (alt_result[18], alt_result[39], alt_result[60], 4);
-  b64_from_24bit (alt_result[40], alt_result[61], alt_result[19], 4);
-  b64_from_24bit (alt_result[62], alt_result[20], alt_result[41], 4);
-  b64_from_24bit (0, 0, alt_result[63], 2);
+  B64_FROM_24BIT (alt_result[0], alt_result[21], alt_result[42], 4);
+  B64_FROM_24BIT (alt_result[22], alt_result[43], alt_result[1], 4);
+  B64_FROM_24BIT (alt_result[44], alt_result[2], alt_result[23], 4);
+  B64_FROM_24BIT (alt_result[3], alt_result[24], alt_result[45], 4);
+  B64_FROM_24BIT (alt_result[25], alt_result[46], alt_result[4], 4);
+  B64_FROM_24BIT (alt_result[47], alt_result[5], alt_result[26], 4);
+  B64_FROM_24BIT (alt_result[6], alt_result[27], alt_result[48], 4);
+  B64_FROM_24BIT (alt_result[28], alt_result[49], alt_result[7], 4);
+  B64_FROM_24BIT (alt_result[50], alt_result[8], alt_result[29], 4);
+  B64_FROM_24BIT (alt_result[9], alt_result[30], alt_result[51], 4);
+  B64_FROM_24BIT (alt_result[31], alt_result[52], alt_result[10], 4);
+  B64_FROM_24BIT (alt_result[53], alt_result[11], alt_result[32], 4);
+  B64_FROM_24BIT (alt_result[12], alt_result[33], alt_result[54], 4);
+  B64_FROM_24BIT (alt_result[34], alt_result[55], alt_result[13], 4);
+  B64_FROM_24BIT (alt_result[56], alt_result[14], alt_result[35], 4);
+  B64_FROM_24BIT (alt_result[15], alt_result[36], alt_result[57], 4);
+  B64_FROM_24BIT (alt_result[37], alt_result[58], alt_result[16], 4);
+  B64_FROM_24BIT (alt_result[59], alt_result[17], alt_result[38], 4);
+  B64_FROM_24BIT (alt_result[18], alt_result[39], alt_result[60], 4);
+  B64_FROM_24BIT (alt_result[40], alt_result[61], alt_result[19], 4);
+  B64_FROM_24BIT (alt_result[62], alt_result[20], alt_result[41], 4);
+  B64_FROM_24BIT (0, 0, alt_result[63], 2);
 
   if (buflen <= 0)
     {
-- 
1.7.7.3



More information about the uClibc mailing list