(crypt): Recognize the new $5$ and $6$ prefixes and call the
authordrepper <drepper>
Wed, 19 Sep 2007 20:37:15 +0000 (20:37 +0000)
committerdrepper <drepper>
Wed, 19 Sep 2007 20:37:15 +0000 (20:37 +0000)
appropriate code.

crypt/crypt-entry.c

index ca219bb..fdddad2 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * UFC-crypt: ultra fast crypt(3) implementation
  *
- * Copyright (C) 1991, 1992, 1993, 1996, 1997 Free Software Foundation, Inc.
+ * Copyright (C) 1991,1992,1993,1996,1997,2007 Free Software Foundation, Inc.
  *
  * The GNU C Library is free software; you can redistribute it and/or
  * modify it under the terms of the GNU Lesser General Public
@@ -55,6 +55,12 @@ void _ufc_clearmem (char *start, int cnt);
 extern char *__md5_crypt_r (const char *key, const char *salt, char *buffer,
                            int buflen);
 extern char *__md5_crypt (const char *key, const char *salt);
+extern char *__sha256_crypt_r (const char *key, const char *salt,
+                              char *buffer, int buflen);
+extern char *__sha256_crypt (const char *key, const char *salt);
+extern char *__sha512_crypt_r (const char *key, const char *salt,
+                              char *buffer, int buflen);
+extern char *__sha512_crypt (const char *key, const char *salt);
 #endif
 
 /* Define our magic string to mark salt for MD5 encryption
@@ -62,6 +68,12 @@ extern char *__md5_crypt (const char *key, const char *salt);
    encryption implementations.  */
 static const char md5_salt_prefix[] = "$1$";
 
+/* Magic string for SHA256 encryption.  */
+static const char sha256_salt_prefix[] = "$5$";
+
+/* Magic string for SHA512 encryption.  */
+static const char sha512_salt_prefix[] = "$6$";
+
 /* For use by the old, non-reentrant routines (crypt/encrypt/setkey)  */
 extern struct crypt_data _ufc_foobar;
 
@@ -84,6 +96,16 @@ __crypt_r (key, salt, data)
   if (strncmp (md5_salt_prefix, salt, sizeof (md5_salt_prefix) - 1) == 0)
     return __md5_crypt_r (key, salt, (char *) data,
                          sizeof (struct crypt_data));
+
+  /* Try to find out whether we have to use SHA256 encryption replacement.  */
+  if (strncmp (sha256_salt_prefix, salt, sizeof (sha256_salt_prefix) - 1) == 0)
+    return __sha256_crypt_r (key, salt, (char *) data,
+                            sizeof (struct crypt_data));
+
+  /* Try to find out whether we have to use SHA512 encryption replacement.  */
+  if (strncmp (sha512_salt_prefix, salt, sizeof (sha512_salt_prefix) - 1) == 0)
+    return __sha512_crypt_r (key, salt, (char *) data,
+                            sizeof (struct crypt_data));
 #endif
 
   /*
@@ -126,6 +148,14 @@ crypt (key, salt)
   /* Try to find out whether we have to use MD5 encryption replacement.  */
   if (strncmp (md5_salt_prefix, salt, sizeof (md5_salt_prefix) - 1) == 0)
     return __md5_crypt (key, salt);
+
+  /* Try to find out whether we have to use SHA256 encryption replacement.  */
+  if (strncmp (sha256_salt_prefix, salt, sizeof (sha256_salt_prefix) - 1) == 0)
+    return __sha256_crypt (key, salt);
+
+  /* Try to find out whether we have to use SHA512 encryption replacement.  */
+  if (strncmp (sha512_salt_prefix, salt, sizeof (sha512_salt_prefix) - 1) == 0)
+    return __sha512_crypt (key, salt);
 #endif
 
   return __crypt_r (key, salt, &_ufc_foobar);