+
+#ifdef __MINGW32__
+#include <conio.h>
+#ifdef PASS_MAX
+#undef PASS_MAX
+#endif
+#define PASS_MAX 256
+static char getpassbuf[PASS_MAX + 1];
+
+static char *
+getpass(const char *prompt)
+{
+ int c;
+ int i = 0;
+
+ memset(getpassbuf, sizeof(getpassbuf), 0);
+ fputs(prompt, stderr);
+ for(;;)
+ {
+ c = _getch();
+ if(c == '\r')
+ {
+ getpassbuf[i] = '\0';
+ break;
+ }
+ else if(i < PASS_MAX)
+ {
+ getpassbuf[i++] = c;
+ }
+ }
+ fputs("\r\n", stderr);
+
+ return getpassbuf;
+}
+#endif
+
+
+int
+main(int argc, char *argv[])
+{
+ 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, "xymdber: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 '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(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_DES)
+ {
+ 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();
+ }
+ }
+ 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)
+ printf("Please enter a valid password\n");
+ }
+ else
+ {
+ plaintext = getpass("plaintext: ");
+ }
+
+ printf("%s\n", rb_crypt(plaintext, salt));
+ return 0;
+}
+
+static char *
+make_des_salt()
+{
+ static char salt[3];
+ generate_random_salt(salt, 2);
+ salt[2] = '\0';
+ return salt;
+}
+
+char *
+int_to_base64(int value)