- char *plaintext = NULL;
- int c;
- char *saltpara = NULL;
- char *salt;
- int flag = 0;
- int length = 0; /* Not Set */
- int rounds = 0; /* Not set, since extended DES needs 25 and blowfish needs
- ** 4 by default, a side effect of this being the encryption
- ** type parameter must be specified before the rounds
- ** parameter.
- */
-
- while( (c=getopt(argc, argv, "mdber:h?l:s:p:")) != -1)
- {
- switch(c)
- {
- case 'm':
- flag |= FLAG_MD5;
- break;
- case 'd':
- flag |= FLAG_DES;
- break;
- case 'b':
- flag |= FLAG_BLOWFISH;
- rounds = 4;
- break;
- case 'e':
- flag |= FLAG_EXT;
- rounds = 25;
- break;
- case 'l':
- flag |= FLAG_LENGTH;
- length = atoi(optarg);
- break;
- case 'r':
- flag |= FLAG_ROUNDS;
- rounds = atoi(optarg);
- break;
- case 's':
- flag |= FLAG_SALT;
- saltpara = optarg;
- break;
- case 'p':
- flag |= FLAG_PASS;
- plaintext = optarg;
- break;
- case 'h':
- full_usage();
- /* NOT REACHED */
- break;
- case '?':
- brief_usage();
- /* NOT REACHED */
- break;
- default:
- printf("Invalid Option: -%c\n", c);
- break;
- }
- }
-
- if (flag & FLAG_MD5)
- {
- if (length == 0)
- length = 8;
- if (flag & FLAG_SALT)
- salt = make_md5_salt_para(saltpara);
- else
- salt = make_md5_salt(length);
- }
- else if (flag & FLAG_BLOWFISH)
- {
- if (length == 0)
- length = 22;
- if (flag & FLAG_SALT)
- salt = make_bf_salt_para(rounds, saltpara);
- else
- salt = make_bf_salt(rounds, length);
- }
- else if (flag & FLAG_EXT)
- {
- /* XXX - rounds needs to be done */
- if (flag & FLAG_SALT)
- {
- if ((strlen(saltpara) == 4))
- {
- salt = make_ext_salt_para(rounds, saltpara);
- }
- else
- {
- printf("Invalid salt, please enter 4 alphanumeric characters\n");
- exit(1);
- }
- }
- else
- {
- salt = make_ext_salt(rounds);
- }
- }
- else
- {
- if (flag & FLAG_SALT)
- {
- if ((strlen(saltpara) == 2))
- {
- salt = saltpara;
- }
- else
- {
- printf("Invalid salt, please enter 2 alphanumeric characters\n");
- exit(1);
- }
- }
- else
- {
- salt = make_des_salt();
- }
- }
-
- if (flag & FLAG_PASS)
- {
- if (!plaintext)
- printf("Please enter a valid password\n");
- }
- else
- {
- plaintext = getpass("plaintext: ");
- }
-
- printf("%s\n", crypt(plaintext, salt));
- return 0;
+ char *plaintext = NULL;
+ int c;
+ char *saltpara = NULL;
+ char *salt;
+ char *hashed, *hashed2;
+ int flag = 0;
+ int length = 0; /* Not Set */
+ int rounds = 0; /* Not set, since blowfish needs 4 by default, a side effect
+ * of this being the encryption type parameter must be
+ * specified before the rounds parameter.
+ */
+
+ while((c = getopt(argc, argv, "xymbr:h?l:s:p:")) != -1)
+ {
+ switch (c)
+ {
+ case 'm':
+ flag |= FLAG_MD5;
+ break;
+ case 'b':
+ flag |= FLAG_BLOWFISH;
+ rounds = 4;
+ break;
+ case 'l':
+ flag |= FLAG_LENGTH;
+ length = atoi(optarg);
+ break;
+ case 'r':
+ flag |= FLAG_ROUNDS;
+ rounds = atoi(optarg);
+ break;
+ case 's':
+ flag |= FLAG_SALT;
+ saltpara = optarg;
+ break;
+ case 'p':
+ flag |= FLAG_PASS;
+ plaintext = optarg;
+ break;
+ case 'x':
+ flag |= FLAG_SHA256;
+ break;
+ case 'y':
+ flag |= FLAG_SHA512;
+ break;
+ case 'h':
+ full_usage();
+ /* NOT REACHED */
+ break;
+ case '?':
+ brief_usage();
+ /* NOT REACHED */
+ break;
+ default:
+ printf("Invalid Option: -%c\n", c);
+ break;
+ }
+ }
+
+ if(flag & FLAG_MD5)
+ {
+ if(length == 0)
+ length = 8;
+ if(flag & FLAG_SALT)
+ salt = make_md5_salt_para(saltpara);
+ else
+ salt = make_md5_salt(length);
+ }
+ else if(flag & FLAG_BLOWFISH)
+ {
+ if(length == 0)
+ length = 22;
+ if(flag & FLAG_SALT)
+ salt = make_bf_salt_para(rounds, saltpara);
+ else
+ salt = make_bf_salt(rounds, length);
+ }
+ else if(flag & FLAG_SHA256)
+ {
+ if(length == 0)
+ length = 16;
+ if(flag & FLAG_SALT)
+ salt = make_sha256_salt_para(saltpara);
+ else
+ salt = make_sha256_salt(length);
+ }
+ else
+ {
+ if(length == 0)
+ length = 16;
+ if(flag & FLAG_SALT)
+ salt = make_sha512_salt_para(saltpara);
+ else
+ salt = make_sha512_salt(length);
+ }
+
+ if(flag & FLAG_PASS)
+ {
+ if(!plaintext)
+ {
+ fprintf(stderr, "Please enter a valid password\n");
+ return 1;
+ }
+
+ hashed = rb_crypt(plaintext, salt);
+ }
+ else
+ {
+ plaintext = getpass("plaintext: ");
+ hashed = rb_crypt(plaintext, salt);
+ if (!hashed)
+ {
+ fprintf(stderr, "rb_crypt() failed\n");
+ return 1;
+ }
+ hashed = strdup(hashed);
+
+ plaintext = getpass("again: ");
+ hashed2 = rb_crypt(plaintext, salt);
+ if (!hashed2)
+ {
+ fprintf(stderr, "rb_crypt() failed\n");
+ return 1;
+ }
+
+ if (strcmp(hashed, hashed2) != 0)
+ {
+ fprintf(stderr, "Passwords do not match\n");
+ return 1;
+ }
+ }
+
+ printf("%s\n", hashed);
+ return 0;