simple menu: support sha256 and sha512 passwords
authorH. Peter Anvin <hpa@zytor.com>
Mon, 11 Feb 2008 06:53:07 +0000 (22:53 -0800)
committerH. Peter Anvin <hpa@zytor.com>
Mon, 11 Feb 2008 06:53:07 +0000 (22:53 -0800)
Add support for sha256 and sha512 passwords in the simple menu system.

com32/menu/passwd.c

index 0016a0d..b3bb70a 100644 (file)
@@ -11,8 +11,8 @@
  * ----------------------------------------------------------------------- */
 
 #include <string.h>
+#include <xcrypt.h>
 #include <sha1.h>
-#include <md5.h>
 #include <base64.h>
 
 #include "menu.h"
@@ -50,14 +50,41 @@ static int passwd_compare_md5(const char *passwd, const char *entry)
     (passwd[len] == '\0' || passwd[len] == '$');
 }
 
+static int passwd_compare_sha256(const char *passwd, const char *entry)
+{
+  const char *crypted = sha256_crypt(entry, passwd+3);
+  int len = strlen(crypted);
+
+  return !strncmp(crypted, passwd, len) &&
+    (passwd[len] == '\0' || passwd[len] == '$');
+}
+
+static int passwd_compare_sha512(const char *passwd, const char *entry)
+{
+  const char *crypted = sha512_crypt(entry, passwd+3);
+  int len = strlen(crypted);
+
+  return !strncmp(crypted, passwd, len) &&
+    (passwd[len] == '\0' || passwd[len] == '$');
+}
+
 int passwd_compare(const char *passwd, const char *entry)
 {
-  if ( passwd[0] != '$' )      /* Plaintext passwd, yuck! */
+  if ( passwd[0] != '$' || !passwd[1] || passwd[2] != '$' ) {
+    /* Plaintext passwd, yuck! */
     return !strcmp(entry, passwd);
-  else if ( !strncmp(passwd, "$4$", 3) )
-    return passwd_compare_sha1(passwd, entry);
-  else if ( !strncmp(passwd, "$1$", 3) )
-    return passwd_compare_md5(passwd, entry);
-  else
-    return 0;                  /* Invalid encryption algorithm */
+  } else {
+    switch (passwd[1]) {
+    case '1':
+      return passwd_compare_md5(passwd, entry);
+    case '4':
+      return passwd_compare_sha1(passwd, entry);
+    case '5':
+      return passwd_compare_sha256(passwd, entry);
+    case '6':
+      return passwd_compare_sha512(passwd, entry);
+    default:
+      return 0;                        /* Unknown encryption algorithm -> false */
+    }
+  }
 }