#include #include #include #include #include #include "sha1.h" #include "sha1passwd.h" static void do_test(void) { static const struct { char *sha1passwd; char *cleartext; } tests[] = { {"$ssha1$/EExmSfmhQSPHDJaTxwQSdb/uPpzYWx0ZXI=", "secret"}, {"$ssha1$gVK8WC9YyFT1gMsQHTGCgT3sSv5zYWx0", "secret"}, {"$ssha1$W3ipFGmzS3+j6/FhT7ZC39MIfqFcct9Ep0KEGA==", "asddsa123"}, {"$ssha1$YbB2R1D2AlzYc9wk/YPtslG7NoiOWaoMOztLHA==", "ripthispassword"}, {"$ssha1$0jVwy2q3GhzwzqAPTLzsWqGJEOsnZikzMT8qLA==", "foo"}, {NULL} }; int i; for(i=0;tests[i].sha1passwd;i++) { printf("orig : %s\n", tests[i].sha1passwd); fprintf(stderr, "check: %d\n", ssha1_checkpass(tests[i].cleartext, tests[i].sha1passwd)); } } static void usage() { printf( "usage: sha1passwd [-ht] [-c hash] [-s hash] [passwords...]\n" " -c check password(s) against hash. return success if any match.\n" " -s get salt from hashed password\n" " -h help\n" " -v verbose\n" " -t perform tests\n" ); } static void apply_args(const char *plaintext, const char *check_password, int verbose, int *status) { if(check_password) { int res; res=ssha1_checkpass(plaintext, check_password); if(verbose) printf("%d\t%s\n", res, plaintext); if(!res) *status=EXIT_FAILURE; } else { char hash[SSHA1_CRYPTTEXT_MAX+1]; hash[SSHA1_CRYPTTEXT_MAX]='*'; /* test code */ ssha1_newpass(plaintext, sizeof hash-1, hash); printf("%s\n", hash); } } int main(int argc, char **argv) { int ch; int i; const char *check_password = 0; int verbose = 0; int status = 0; int max_asks = -1; /* infinite */ srand(time(0)+getpid()); while((ch=getopt(argc, argv, "htvs:c:n:"))!=-1) { switch(ch) { case 'n': max_asks=atoi(optarg); break; case 'v': verbose++; break; case 't': do_test(); return 0; case 'c': check_password=optarg; break; case 's': { unsigned char salt[SSHA1_SALT_MAX]; int salt_len; printf("orig : %s\n", optarg); salt_len=ssha1_getsalt(optarg, sizeof salt, salt); printf("salt: %.*s\n", salt_len, salt); } return 0; case 'h': default : usage(); return EXIT_FAILURE; } } if(argc==optind) { const char *plaintext; while((max_asks<0 || max_asks>0) && (plaintext=getpass("password:")) && *plaintext) { apply_args(plaintext, check_password, verbose, &status); if(max_asks>0) max_asks--; } } else { for(i=optind;i