blob: 9f8950756e80f94794dafac613d8743f21717a4e [file] [log] [blame]
/* 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]
Encrypt PASSWORD using crypt(3), with either random or provided SALT.
-P FD Read password from file descriptor FD
-m TYPE Encryption method (des, md5, sha256, or sha512; default is des)
*/
#define FOR_mkpasswd
#include "toys.h"
GLOBALS(
long P;
char *m, *S;
)
void mkpasswd_main(void)
{
char salt[32] = {0,};
int ii, jj, kk;
if (toys.optc == 2) {
if (TT.S) error_exit("duplicate salt");
TT.S = toys.optargs[1];
}
if (-1 == get_salt(salt, TT.m ? : "des", !TT.S)) error_exit("bad -m");
if (TT.S) {
char *mirv = strrchr(salt, '$'), *s = TT.S;
if (mirv) mirv++;
else mirv = salt;
ii = strlen(mirv);
// In C locale, isalnum() means [a-zA-Z0-9]
while (isalnum(*s) || *s == '.' || *s == '/') s++;
jj = s-TT.S;
kk = ii==16 ? 8 : ii;
if (*s || jj>ii || jj<kk)
error_exit("bad SALT (need [a-zA-Z0-9] len %d-%d)", ii, kk);
strcpy(mirv, TT.S);
}
// Because read_password() doesn't have an fd argument
if (TT.P) {
if (dup2(TT.P, 0) == -1) perror_exit("fd");
close(TT.P);
}
// 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 (ii = 0; ii<sizeof(toybuf)-1; ii++) {
if (!xread(0, toybuf+ii, 1)) break;
if (toybuf[ii] == '\n' || toybuf[ii] == '\r') break;
}
toybuf[ii] = 0;
}
}
// encrypt & print the password
xprintf("%s\n", crypt(*toys.optargs ? *toys.optargs : toybuf, salt));
}