118ec03543c3731e1ea25182ef72c49ac5ec2d1c7Rob Landley/* mkpasswd.c - encrypt the given passwd using salt 218ec03543c3731e1ea25182ef72c49ac5ec2d1c7Rob Landley * 318ec03543c3731e1ea25182ef72c49ac5ec2d1c7Rob Landley * Copyright 2013 Ashwini Kumar <ak.ashwini@gmail.com> 418ec03543c3731e1ea25182ef72c49ac5ec2d1c7Rob Landley * Copyright 2013 Kyungwan Han <asura321@gmail.com> 518ec03543c3731e1ea25182ef72c49ac5ec2d1c7Rob Landley * 618ec03543c3731e1ea25182ef72c49ac5ec2d1c7Rob Landley * No Standard 718ec03543c3731e1ea25182ef72c49ac5ec2d1c7Rob Landley 818ec03543c3731e1ea25182ef72c49ac5ec2d1c7Rob LandleyUSE_MKPASSWD(NEWTOY(mkpasswd, ">2S:m:P#=0<0", TOYFLAG_USR|TOYFLAG_BIN)) 918ec03543c3731e1ea25182ef72c49ac5ec2d1c7Rob Landley 1018ec03543c3731e1ea25182ef72c49ac5ec2d1c7Rob Landleyconfig MKPASSWD 1118ec03543c3731e1ea25182ef72c49ac5ec2d1c7Rob Landley bool "mkpasswd" 12474d0a9e00b72ee73c0c908c65a09f7dde495019Rob Landley default y 136c74ee8d02cfab6dd8a45de56150afbd11452beeElliott Hughes depends on !TOYBOX_ON_ANDROID 1418ec03543c3731e1ea25182ef72c49ac5ec2d1c7Rob Landley help 156d15f0d33fbc422689f92fbbf4dc65d3ab1fb970Rob Landley usage: mkpasswd [-P FD] [-m TYPE] [-S SALT] [PASSWORD] [SALT] 1618ec03543c3731e1ea25182ef72c49ac5ec2d1c7Rob Landley 1718ec03543c3731e1ea25182ef72c49ac5ec2d1c7Rob Landley Crypt PASSWORD using crypt(3) 1818ec03543c3731e1ea25182ef72c49ac5ec2d1c7Rob Landley 196d15f0d33fbc422689f92fbbf4dc65d3ab1fb970Rob Landley -P FD Read password from file descriptor FD 206d15f0d33fbc422689f92fbbf4dc65d3ab1fb970Rob Landley -m TYPE Encryption method (des, md5, sha256, or sha512; default is des) 2118ec03543c3731e1ea25182ef72c49ac5ec2d1c7Rob Landley -S SALT 2218ec03543c3731e1ea25182ef72c49ac5ec2d1c7Rob Landley*/ 2318ec03543c3731e1ea25182ef72c49ac5ec2d1c7Rob Landley 2418ec03543c3731e1ea25182ef72c49ac5ec2d1c7Rob Landley#define FOR_mkpasswd 2518ec03543c3731e1ea25182ef72c49ac5ec2d1c7Rob Landley#include "toys.h" 2618ec03543c3731e1ea25182ef72c49ac5ec2d1c7Rob Landley 2718ec03543c3731e1ea25182ef72c49ac5ec2d1c7Rob LandleyGLOBALS( 2818ec03543c3731e1ea25182ef72c49ac5ec2d1c7Rob Landley long pfd; 2918ec03543c3731e1ea25182ef72c49ac5ec2d1c7Rob Landley char *method; 3018ec03543c3731e1ea25182ef72c49ac5ec2d1c7Rob Landley char *salt; 3118ec03543c3731e1ea25182ef72c49ac5ec2d1c7Rob Landley) 3218ec03543c3731e1ea25182ef72c49ac5ec2d1c7Rob Landley 3318ec03543c3731e1ea25182ef72c49ac5ec2d1c7Rob Landleyvoid mkpasswd_main(void) 3418ec03543c3731e1ea25182ef72c49ac5ec2d1c7Rob Landley{ 3518ec03543c3731e1ea25182ef72c49ac5ec2d1c7Rob Landley char salt[MAX_SALT_LEN] = {0,}; 366d15f0d33fbc422689f92fbbf4dc65d3ab1fb970Rob Landley int i; 3718ec03543c3731e1ea25182ef72c49ac5ec2d1c7Rob Landley 386d15f0d33fbc422689f92fbbf4dc65d3ab1fb970Rob Landley if (!TT.method) TT.method = "des"; 396d15f0d33fbc422689f92fbbf4dc65d3ab1fb970Rob Landley if (toys.optc == 2) { 406d15f0d33fbc422689f92fbbf4dc65d3ab1fb970Rob Landley if (TT.salt) error_exit("duplicate salt"); 416d15f0d33fbc422689f92fbbf4dc65d3ab1fb970Rob Landley TT.salt = toys.optargs[1]; 4218ec03543c3731e1ea25182ef72c49ac5ec2d1c7Rob Landley } 4318ec03543c3731e1ea25182ef72c49ac5ec2d1c7Rob Landley 446d15f0d33fbc422689f92fbbf4dc65d3ab1fb970Rob Landley if (-1 == (i = get_salt(salt, TT.method))) error_exit("bad -m"); 4518ec03543c3731e1ea25182ef72c49ac5ec2d1c7Rob Landley if (TT.salt) { 466d15f0d33fbc422689f92fbbf4dc65d3ab1fb970Rob Landley char *s = TT.salt; 476d15f0d33fbc422689f92fbbf4dc65d3ab1fb970Rob Landley 486d15f0d33fbc422689f92fbbf4dc65d3ab1fb970Rob Landley // In C locale, isalnum() means [A-Za-Z0-0] 496d15f0d33fbc422689f92fbbf4dc65d3ab1fb970Rob Landley while (isalnum(*s) || *s == '.' || *s == '/') s++; 506d15f0d33fbc422689f92fbbf4dc65d3ab1fb970Rob Landley if (*s) error_exit("salt not in [./A-Za-z0-9]"); 516d15f0d33fbc422689f92fbbf4dc65d3ab1fb970Rob Landley 526d15f0d33fbc422689f92fbbf4dc65d3ab1fb970Rob Landley snprintf(salt+i, sizeof(salt)-i, "%s", TT.salt); 5318ec03543c3731e1ea25182ef72c49ac5ec2d1c7Rob Landley } 5418ec03543c3731e1ea25182ef72c49ac5ec2d1c7Rob Landley 556d15f0d33fbc422689f92fbbf4dc65d3ab1fb970Rob Landley // Because read_password() doesn't have an fd argument 566d15f0d33fbc422689f92fbbf4dc65d3ab1fb970Rob Landley if (TT.pfd) { 576d15f0d33fbc422689f92fbbf4dc65d3ab1fb970Rob Landley if (dup2(TT.pfd, 0) == -1) perror_exit("fd"); 5818ec03543c3731e1ea25182ef72c49ac5ec2d1c7Rob Landley close(TT.pfd); 5918ec03543c3731e1ea25182ef72c49ac5ec2d1c7Rob Landley } 6018ec03543c3731e1ea25182ef72c49ac5ec2d1c7Rob Landley 616d15f0d33fbc422689f92fbbf4dc65d3ab1fb970Rob Landley // If we haven't got a password on the command line, read it from tty or FD 626d15f0d33fbc422689f92fbbf4dc65d3ab1fb970Rob Landley if (!*toys.optargs) { 636d15f0d33fbc422689f92fbbf4dc65d3ab1fb970Rob Landley // Prompt and read interactively? 646d15f0d33fbc422689f92fbbf4dc65d3ab1fb970Rob Landley if (isatty(0)) { 6518ec03543c3731e1ea25182ef72c49ac5ec2d1c7Rob Landley if (read_password(toybuf, sizeof(toybuf), "Password: ")) 6618ec03543c3731e1ea25182ef72c49ac5ec2d1c7Rob Landley perror_exit("password read failed"); 6718ec03543c3731e1ea25182ef72c49ac5ec2d1c7Rob Landley } else { 686d15f0d33fbc422689f92fbbf4dc65d3ab1fb970Rob Landley for (i = 0; i<sizeof(toybuf)-1; i++) { 696d15f0d33fbc422689f92fbbf4dc65d3ab1fb970Rob Landley if (!xread(0, toybuf+i, 1)) break; 706d15f0d33fbc422689f92fbbf4dc65d3ab1fb970Rob Landley if (toybuf[i] == '\n' || toybuf[i] == '\r') break; 7118ec03543c3731e1ea25182ef72c49ac5ec2d1c7Rob Landley } 726d15f0d33fbc422689f92fbbf4dc65d3ab1fb970Rob Landley toybuf[i] = 0; 7318ec03543c3731e1ea25182ef72c49ac5ec2d1c7Rob Landley } 746d15f0d33fbc422689f92fbbf4dc65d3ab1fb970Rob Landley } 7518ec03543c3731e1ea25182ef72c49ac5ec2d1c7Rob Landley 7618ec03543c3731e1ea25182ef72c49ac5ec2d1c7Rob Landley // encrypt & print the password 776d15f0d33fbc422689f92fbbf4dc65d3ab1fb970Rob Landley xprintf("%s\n",crypt(*toys.optargs ? *toys.optargs : toybuf, salt)); 7818ec03543c3731e1ea25182ef72c49ac5ec2d1c7Rob Landley} 79