By using a function table, we can more cleanly support new crypt
implementations, such as SHA256 ($5$) and SHA512 ($6$).

Signed-off-by: William Pitcock <[email protected]>
---
 libcrypt/crypt.c |   32 ++++++++++++++++++++++++++------
 1 files changed, 26 insertions(+), 6 deletions(-)

diff --git a/libcrypt/crypt.c b/libcrypt/crypt.c
index 89a2614..e6f1f8a 100644
--- a/libcrypt/crypt.c
+++ b/libcrypt/crypt.c
@@ -8,17 +8,37 @@
 #define __FORCE_GLIBC
 #include <crypt.h>
 #include <unistd.h>
+#include <string.h>
+#include <syscall.h>
 #include "libcrypt.h"
 
+#define ARRAY_SIZE(v) (sizeof(v) / sizeof((v)[0]))
+
+typedef char *(*crypt_impl_f)(const unsigned char *pw, const unsigned char 
*salt);
+
+static const struct {
+       const char *salt_pfx;
+       const crypt_impl_f crypt_impl;
+} crypt_impl_tab[] = {
+       { "$1$",        __md5_crypt },
+       { NULL,         __des_crypt },
+};
+
 char *crypt(const char *key, const char *salt)
 {
        const unsigned char *ukey = (const unsigned char *)key;
        const unsigned char *usalt = (const unsigned char *)salt;
+       size_t i;
+
+       for (i = 0; i < ARRAY_SIZE(crypt_impl_tab); i++) {
+               if (crypt_impl_tab[i].salt_pfx != NULL &&
+                   strncmp(crypt_impl_tab[i].salt_pfx, salt, 
strlen(crypt_impl_tab[i].salt_pfx)))
+                       continue;
+
+               return crypt_impl_tab[i].crypt_impl(ukey, usalt);
+       }
 
-       /* First, check if we are supposed to be using the MD5 replacement
-        * instead of DES...  */
-       if (salt[0]=='$' && salt[1]=='1' && salt[2]=='$')
-               return __md5_crypt(ukey, usalt);
-       else
-               return __des_crypt(ukey, usalt);
+       /* this should never happen, but just incase... */
+       __set_errno(ENOSYS);
+       return NULL;
 }
-- 
1.7.8

_______________________________________________
uClibc mailing list
[email protected]
http://lists.busybox.net/mailman/listinfo/uclibc

Reply via email to