summaryrefslogtreecommitdiffstats
path: root/userdb/userdbpw.c
diff options
context:
space:
mode:
Diffstat (limited to 'userdb/userdbpw.c')
-rw-r--r--userdb/userdbpw.c251
1 files changed, 251 insertions, 0 deletions
diff --git a/userdb/userdbpw.c b/userdb/userdbpw.c
new file mode 100644
index 0000000..23620df
--- /dev/null
+++ b/userdb/userdbpw.c
@@ -0,0 +1,251 @@
+/*
+** Copyright 1998 - 2006 Double Precision, Inc.
+** See COPYING for distribution information.
+*/
+
+#if HAVE_CONFIG_H
+#include "config.h"
+#endif
+#include <sys/types.h>
+#if HAVE_SYS_STAT_H
+#include <sys/stat.h>
+#endif
+#if HAVE_FCNTL_H
+#include <fcntl.h>
+#endif
+#if HAVE_UNISTD_H
+#include <unistd.h>
+#endif
+#if TIME_WITH_SYS_TIME
+#include <sys/time.h>
+#include <time.h>
+#else
+#if HAVE_SYS_TIME_H
+#include <sys/time.h>
+#else
+#include <time.h>
+#endif
+#endif
+#if HAVE_MD5
+#include "md5/md5.h"
+#endif
+#if HAVE_HMAC
+#include "libhmac/hmac.h"
+#endif
+
+#include <string.h>
+#include <stdio.h>
+#include <signal.h>
+#include <stdlib.h>
+#if HAVE_TERMIOS_H
+#include <termios.h>
+#endif
+#if HAVE_CRYPT_H
+#include <crypt.h>
+#endif
+
+#if HAVE_CRYPT
+#if NEED_CRYPT_PROTOTYPE
+extern char *crypt(const char *, const char *);
+#endif
+#endif
+
+extern char userdb_hex64[];
+
+#ifdef RANDOM
+extern void userdb_get_random(char *buf, unsigned n);
+#endif
+
+#if HAVE_MD5
+
+char *userdb_mkmd5pw(const char *);
+
+#endif
+
+/*
+** Where possible, we turn off echo when entering the password.
+** We set up a signal handler to catch signals and restore the echo
+** prior to exiting.
+*/
+
+#if HAVE_TERMIOS_H
+static struct termios tios;
+static int have_tios;
+
+static RETSIGTYPE sighandler(int signum)
+{
+ if (write(1, "\n", 1) < 0)
+ ; /* ignore gcc warning */
+ tcsetattr(0, TCSANOW, &tios);
+ _exit(0);
+#if RETSIGTYPE != void
+ return (0);
+#endif
+}
+#endif
+
+static void read_pw(char *buf)
+{
+int n, c;
+
+ n=0;
+ while ((c=getchar()) != EOF && c != '\n')
+ if (n < BUFSIZ-1)
+ buf[n++]=c;
+ if (c == EOF && n == 0) exit(1);
+ buf[n]=0;
+}
+
+int main(int argc, char **argv)
+{
+int n=1;
+int md5=0;
+char buf[BUFSIZ];
+char salt[9];
+#if HAVE_HMAC
+struct hmac_hashinfo *hmac=0;
+#endif
+
+ while (n < argc)
+ {
+ if (strcmp(argv[n], "-md5") == 0)
+ {
+ md5=1;
+ ++n;
+ continue;
+ }
+#if HAVE_HMAC
+ if (strncmp(argv[n], "-hmac-", 6) == 0)
+ {
+ int i;
+
+ for (i=0; hmac_list[i] &&
+ strcmp(hmac_list[i]->hh_name, argv[n]+6); i++)
+ ;
+ if (hmac_list[i])
+ {
+ hmac=hmac_list[i];
+ ++n;
+ continue;
+ }
+ }
+#endif
+ fprintf(stderr, "%s: invalid argument.\n", argv[0]);
+ exit(1);
+ }
+
+ /* Read the password */
+#if HAVE_TERMIOS_H
+
+ have_tios=0;
+ if (tcgetattr(0, &tios) == 0)
+ {
+ struct termios tios2;
+ char buf2[BUFSIZ];
+
+ have_tios=1;
+ signal(SIGINT, sighandler);
+ signal(SIGHUP, sighandler);
+ tios2=tios;
+ tios2.c_lflag &= ~ECHO;
+ tcsetattr(0, TCSANOW, &tios2);
+
+ for (;;)
+ {
+ if (write(2, "Password: ", 10) < 0)
+ ; /* ignore gcc warning */
+ read_pw(buf);
+ if (write(2, "\nReenter password: ", 19) < 0)
+ ; /* ignore gcc warning */
+ read_pw(buf2);
+ if (strcmp(buf, buf2) == 0) break;
+ if (write(2, "\nPasswords don't match.\n\n", 25) < 0)
+ ; /* ignore gcc warning */
+ }
+
+ }
+ else
+#endif
+ read_pw(buf);
+
+#if HAVE_TERMIOS_H
+ if (have_tios)
+ {
+ if (write(2, "\n", 1) < 0)
+ ; /* ignore gcc warning */
+
+ tcsetattr(0, TCSANOW, &tios);
+ signal(SIGINT, SIG_DFL);
+ signal(SIGHUP, SIG_DFL);
+ }
+#endif
+
+ /* Set the password */
+
+#if HAVE_HMAC
+ if (hmac)
+ {
+ unsigned char *p=malloc(hmac->hh_L*2);
+ unsigned i;
+
+ if (!p)
+ {
+ perror("malloc");
+ exit(1);
+ }
+
+ hmac_hashkey(hmac, buf, strlen(buf), p, p+hmac->hh_L);
+ for (i=0; i<hmac->hh_L*2; i++)
+ printf("%02x", (int)p[i]);
+ printf("\n");
+ exit(0);
+ }
+#endif
+
+#if HAVE_CRYPT
+
+#else
+ md5=1;
+#endif
+
+#if HAVE_MD5
+ if (md5)
+ {
+
+ printf("%s\n", userdb_mkmd5pw(buf));
+ exit(0);
+ }
+#endif
+#ifdef RANDOM
+ userdb_get_random(salt, 2);
+ salt[0]=userdb_hex64[salt[0] & 63];
+ salt[1]=userdb_hex64[salt[0] & 63];
+#else
+ {
+ time_t t;
+ int i;
+
+ time(&t);
+ t ^= getpid();
+ salt[0]=0;
+ salt[1]=0;
+ for (i=0; i<6; i++)
+ {
+ salt[0] <<= 1;
+ salt[1] <<= 1;
+ salt[0] |= (t & 1);
+ t >>= 1;
+ salt[1] |= (t & 1);
+ t >>= 1;
+ }
+ salt[0]=userdb_hex64[(unsigned)salt[0]];
+ salt[1]=userdb_hex64[(unsigned)salt[1]];
+ }
+#endif
+
+#if HAVE_CRYPT
+ printf("%s\n", crypt(buf, salt));
+ fflush(stdout);
+#endif
+ return (0);
+}