| /* mkpasswd.c - encrypt the given passwd using salt |
| * |
| * Copyright 2013 Ashwini Kumar <ak.ashwini@gmail.com> |
| * Copyright 2013 Kyungwan Han <asura321@gmail.com> |
| * |
| * No Standard |
| |
| USE_MKPASSWD(NEWTOY(mkpasswd, ">2S:m:P#=0<0", TOYFLAG_USR|TOYFLAG_BIN)) |
| |
| config MKPASSWD |
| bool "mkpasswd" |
| default y |
| depends on !TOYBOX_ON_ANDROID |
| help |
| usage: mkpasswd [-P FD] [-m TYPE] [-S SALT] [PASSWORD] [SALT] |
| |
| Crypt PASSWORD using crypt(3) |
| |
| -P FD Read password from file descriptor FD |
| -m TYPE Encryption method (des, md5, sha256, or sha512; default is des) |
| -S SALT |
| */ |
| |
| #define FOR_mkpasswd |
| #include "toys.h" |
| |
| GLOBALS( |
| long pfd; |
| char *method; |
| char *salt; |
| ) |
| |
| void mkpasswd_main(void) |
| { |
| char salt[MAX_SALT_LEN] = {0,}; |
| int i; |
| |
| if (!TT.method) TT.method = "des"; |
| if (toys.optc == 2) { |
| if (TT.salt) error_exit("duplicate salt"); |
| TT.salt = toys.optargs[1]; |
| } |
| |
| if (-1 == (i = get_salt(salt, TT.method))) error_exit("bad -m"); |
| if (TT.salt) { |
| char *s = TT.salt; |
| |
| // In C locale, isalnum() means [A-Za-Z0-0] |
| while (isalnum(*s) || *s == '.' || *s == '/') s++; |
| if (*s) error_exit("salt not in [./A-Za-z0-9]"); |
| |
| snprintf(salt+i, sizeof(salt)-i, "%s", TT.salt); |
| } |
| |
| // Because read_password() doesn't have an fd argument |
| if (TT.pfd) { |
| if (dup2(TT.pfd, 0) == -1) perror_exit("fd"); |
| close(TT.pfd); |
| } |
| |
| // If we haven't got a password on the command line, read it from tty or FD |
| if (!*toys.optargs) { |
| // Prompt and read interactively? |
| if (isatty(0)) { |
| if (read_password(toybuf, sizeof(toybuf), "Password: ")) |
| perror_exit("password read failed"); |
| } else { |
| for (i = 0; i<sizeof(toybuf)-1; i++) { |
| if (!xread(0, toybuf+i, 1)) break; |
| if (toybuf[i] == '\n' || toybuf[i] == '\r') break; |
| } |
| toybuf[i] = 0; |
| } |
| } |
| |
| // encrypt & print the password |
| xprintf("%s\n",crypt(*toys.optargs ? *toys.optargs : toybuf, salt)); |
| } |