Fix "no-ui" configuration

Reviewed-by: Matt Caswell <matt@openssl.org>
This commit is contained in:
Richard Levitte 2016-03-21 18:08:57 +01:00
parent 4de9913b8c
commit 923b1857de
7 changed files with 116 additions and 44 deletions

View File

@ -266,6 +266,7 @@ int dump_cert_text(BIO *out, X509 *x)
return 0; return 0;
} }
#ifndef OPENSSL_NO_UI
static int ui_open(UI *ui) static int ui_open(UI *ui)
{ {
return UI_method_get_opener(UI_OpenSSL())(ui); return UI_method_get_opener(UI_OpenSSL())(ui);
@ -335,20 +336,25 @@ void destroy_ui_method(void)
ui_method = NULL; ui_method = NULL;
} }
} }
#endif
int password_callback(char *buf, int bufsiz, int verify, PW_CB_DATA *cb_tmp) int password_callback(char *buf, int bufsiz, int verify, PW_CB_DATA *cb_tmp)
{ {
UI *ui = NULL;
int res = 0; int res = 0;
#ifndef OPENSSL_NO_UI
UI *ui = NULL;
const char *prompt_info = NULL; const char *prompt_info = NULL;
#endif
const char *password = NULL; const char *password = NULL;
PW_CB_DATA *cb_data = (PW_CB_DATA *)cb_tmp; PW_CB_DATA *cb_data = (PW_CB_DATA *)cb_tmp;
if (cb_data) { if (cb_data) {
if (cb_data->password) if (cb_data->password)
password = cb_data->password; password = cb_data->password;
#ifndef OPENSSL_NO_UI
if (cb_data->prompt_info) if (cb_data->prompt_info)
prompt_info = cb_data->prompt_info; prompt_info = cb_data->prompt_info;
#endif
} }
if (password) { if (password) {
@ -359,6 +365,7 @@ int password_callback(char *buf, int bufsiz, int verify, PW_CB_DATA *cb_tmp)
return res; return res;
} }
#ifndef OPENSSL_NO_UI
ui = UI_new_method(ui_method); ui = UI_new_method(ui_method);
if (ui) { if (ui) {
int ok = 0; int ok = 0;
@ -408,6 +415,7 @@ int password_callback(char *buf, int bufsiz, int verify, PW_CB_DATA *cb_tmp)
UI_free(ui); UI_free(ui);
OPENSSL_free(prompt); OPENSSL_free(prompt);
} }
#endif
return res; return res;
} }

View File

@ -347,6 +347,8 @@ int enc_main(int argc, char **argv)
} }
if ((str == NULL) && (cipher != NULL) && (hkey == NULL)) { if ((str == NULL) && (cipher != NULL) && (hkey == NULL)) {
if (1) {
#ifndef OPENSSL_NO_UI
for (;;) { for (;;) {
char prompt[200]; char prompt[200];
@ -368,6 +370,11 @@ int enc_main(int argc, char **argv)
goto end; goto end;
} }
} }
} else {
#endif
BIO_printf(bio_err, "password required\n");
goto end;
}
} }
out = bio_open_default(outfile, 'w', outformat); out = bio_open_default(outfile, 'w', outformat);

View File

@ -176,14 +176,18 @@ static int apps_startup()
| OPENSSL_INIT_LOAD_CONFIG, NULL)) | OPENSSL_INIT_LOAD_CONFIG, NULL))
return 0; return 0;
#ifndef OPENSSL_NO_UI
setup_ui_method(); setup_ui_method();
#endif
return 1; return 1;
} }
static void apps_shutdown() static void apps_shutdown()
{ {
#ifndef OPENSSL_NO_UI
destroy_ui_method(); destroy_ui_method();
#endif
} }
static char *make_config_name() static char *make_config_name()

View File

@ -118,7 +118,10 @@ int passwd_main(int argc, char **argv)
char *infile = NULL, *salt = NULL, *passwd = NULL, **passwds = NULL; char *infile = NULL, *salt = NULL, *passwd = NULL, **passwds = NULL;
char *salt_malloc = NULL, *passwd_malloc = NULL, *prog; char *salt_malloc = NULL, *passwd_malloc = NULL, *prog;
OPTION_CHOICE o; OPTION_CHOICE o;
int in_stdin = 0, in_noverify = 0, pw_source_defined = 0; int in_stdin = 0, pw_source_defined = 0;
#ifndef OPENSSL_NO_UI
int in_noverify = 0;
#endif
int passed_salt = 0, quiet = 0, table = 0, reverse = 0; int passed_salt = 0, quiet = 0, table = 0, reverse = 0;
int ret = 1, usecrypt = 0, use1 = 0, useapr1 = 0; int ret = 1, usecrypt = 0, use1 = 0, useapr1 = 0;
size_t passwd_malloc_size = 0, pw_maxlen = 256; size_t passwd_malloc_size = 0, pw_maxlen = 256;
@ -142,7 +145,9 @@ int passwd_main(int argc, char **argv)
pw_source_defined = 1; pw_source_defined = 1;
break; break;
case OPT_NOVERIFY: case OPT_NOVERIFY:
#ifndef OPENSSL_NO_UI
in_noverify = 1; in_noverify = 1;
#endif
break; break;
case OPT_QUIET: case OPT_QUIET:
quiet = 1; quiet = 1;
@ -232,6 +237,8 @@ int passwd_main(int argc, char **argv)
} }
if ((in == NULL) && (passwds == NULL)) { if ((in == NULL) && (passwds == NULL)) {
if (1) {
#ifndef OPENSSL_NO_UI
/* build a null-terminated list */ /* build a null-terminated list */
static char *passwds_static[2] = { NULL, NULL }; static char *passwds_static[2] = { NULL, NULL };
@ -242,7 +249,13 @@ int passwd_main(int argc, char **argv)
!(passed_salt || in_noverify)) != 0) !(passed_salt || in_noverify)) != 0)
goto end; goto end;
passwds[0] = passwd_malloc; passwds[0] = passwd_malloc;
} else {
#endif
BIO_printf(bio_err, "password required\n");
goto end;
} }
}
if (in == NULL) { if (in == NULL) {
assert(passwds != NULL); assert(passwds != NULL);

View File

@ -176,7 +176,8 @@ int pkcs12_main(int argc, char **argv)
int cert_pbe = NID_pbe_WithSHA1And3_Key_TripleDES_CBC; int cert_pbe = NID_pbe_WithSHA1And3_Key_TripleDES_CBC;
# endif # endif
int key_pbe = NID_pbe_WithSHA1And3_Key_TripleDES_CBC; int key_pbe = NID_pbe_WithSHA1And3_Key_TripleDES_CBC;
int ret = 1, macver = 1, noprompt = 0, add_lmk = 0, private = 0; int ret = 1, macver = 1, add_lmk = 0, private = 0;
int noprompt = 0;
char *passinarg = NULL, *passoutarg = NULL, *passarg = NULL; char *passinarg = NULL, *passoutarg = NULL, *passarg = NULL;
char *passin = NULL, *passout = NULL, *inrand = NULL, *macalg = NULL; char *passin = NULL, *passout = NULL, *inrand = NULL, *macalg = NULL;
char *cpass = NULL, *mpass = NULL, *CApath = NULL, *CAfile = NULL; char *cpass = NULL, *mpass = NULL, *CApath = NULL, *CAfile = NULL;
@ -367,11 +368,18 @@ int pkcs12_main(int argc, char **argv)
} }
if (twopass) { if (twopass) {
if (1) {
#ifndef OPENSSL_NO_UI
if (EVP_read_pw_string if (EVP_read_pw_string
(macpass, sizeof macpass, "Enter MAC Password:", export_cert)) { (macpass, sizeof macpass, "Enter MAC Password:", export_cert)) {
BIO_printf(bio_err, "Can't read Password\n"); BIO_printf(bio_err, "Can't read Password\n");
goto end; goto end;
} }
} else {
#endif
BIO_printf(bio_err, "Unsupported option -twopass\n");
goto end;
}
} }
if (export_cert) { if (export_cert) {
@ -477,12 +485,21 @@ int pkcs12_main(int argc, char **argv)
if (add_lmk && key) if (add_lmk && key)
EVP_PKEY_add1_attr_by_NID(key, NID_LocalKeySet, 0, NULL, -1); EVP_PKEY_add1_attr_by_NID(key, NID_LocalKeySet, 0, NULL, -1);
if (!noprompt && if (!noprompt) {
EVP_read_pw_string(pass, sizeof pass, "Enter Export Password:", if (1) {
#ifndef OPENSSL_NO_UI
if (EVP_read_pw_string(pass, sizeof pass, "Enter Export Password:",
1)) { 1)) {
BIO_printf(bio_err, "Can't read Password\n"); BIO_printf(bio_err, "Can't read Password\n");
goto export_end; goto export_end;
} }
} else {
#endif
BIO_printf(bio_err, "Password required\n");
goto export_end;
}
}
if (!twopass) if (!twopass)
OPENSSL_strlcpy(macpass, pass, sizeof macpass); OPENSSL_strlcpy(macpass, pass, sizeof macpass);
@ -534,12 +551,20 @@ int pkcs12_main(int argc, char **argv)
goto end; goto end;
} }
if (!noprompt if (!noprompt) {
&& EVP_read_pw_string(pass, sizeof pass, "Enter Import Password:", if (1) {
#ifndef OPENSSL_NO_UI
if (EVP_read_pw_string(pass, sizeof pass, "Enter Import Password:",
0)) { 0)) {
BIO_printf(bio_err, "Can't read Password\n"); BIO_printf(bio_err, "Can't read Password\n");
goto end; goto end;
} }
} else {
#endif
BIO_printf(bio_err, "Password required\n");
goto end;
}
}
if (!twopass) if (!twopass)
OPENSSL_strlcpy(macpass, pass, sizeof macpass); OPENSSL_strlcpy(macpass, pass, sizeof macpass);

View File

@ -111,7 +111,10 @@ int pkcs8_main(int argc, char **argv)
const EVP_CIPHER *cipher = NULL; const EVP_CIPHER *cipher = NULL;
char *infile = NULL, *outfile = NULL; char *infile = NULL, *outfile = NULL;
char *passinarg = NULL, *passoutarg = NULL, *prog; char *passinarg = NULL, *passoutarg = NULL, *prog;
char pass[50], *passin = NULL, *passout = NULL, *p8pass = NULL; #ifndef OPENSSL_NO_UI
char pass[50];
#endif
char *passin = NULL, *passout = NULL, *p8pass = NULL;
OPTION_CHOICE o; OPTION_CHOICE o;
int nocrypt = 0, ret = 1, iter = PKCS12_DEFAULT_ITER; int nocrypt = 0, ret = 1, iter = PKCS12_DEFAULT_ITER;
int informat = FORMAT_PEM, outformat = FORMAT_PEM, topk8 = 0, pbe_nid = -1; int informat = FORMAT_PEM, outformat = FORMAT_PEM, topk8 = 0, pbe_nid = -1;
@ -272,13 +275,18 @@ int pkcs8_main(int argc, char **argv)
} }
if (passout) if (passout)
p8pass = passout; p8pass = passout;
else { else if (1) {
#ifndef OPENSSL_NO_UI
p8pass = pass; p8pass = pass;
if (EVP_read_pw_string if (EVP_read_pw_string
(pass, sizeof pass, "Enter Encryption Password:", 1)) { (pass, sizeof pass, "Enter Encryption Password:", 1)) {
X509_ALGOR_free(pbe); X509_ALGOR_free(pbe);
goto end; goto end;
} }
} else {
#endif
BIO_printf(bio_err, "Password required\n");
goto end;
} }
app_RAND_load_file(NULL, 0); app_RAND_load_file(NULL, 0);
p8 = PKCS8_set0_pbe(p8pass, strlen(p8pass), p8inf, pbe); p8 = PKCS8_set0_pbe(p8pass, strlen(p8pass), p8inf, pbe);
@ -330,9 +338,14 @@ int pkcs8_main(int argc, char **argv)
} }
if (passin) if (passin)
p8pass = passin; p8pass = passin;
else { else if (1) {
#ifndef OPENSSL_NO_UI
p8pass = pass; p8pass = pass;
EVP_read_pw_string(pass, sizeof pass, "Enter Password:", 0); EVP_read_pw_string(pass, sizeof pass, "Enter Password:", 0);
} else {
#endif
BIO_printf(bio_err, "Password required\n");
goto end;
} }
p8inf = PKCS8_decrypt(p8, p8pass, strlen(p8pass)); p8inf = PKCS8_decrypt(p8, p8pass, strlen(p8pass));
} }

View File

@ -133,7 +133,9 @@ void err_load_crypto_strings_intern(void)
ERR_load_ENGINE_strings(); ERR_load_ENGINE_strings();
# endif # endif
ERR_load_OCSP_strings(); ERR_load_OCSP_strings();
#ifndef OPENSSL_NO_UI
ERR_load_UI_strings(); ERR_load_UI_strings();
#endif
# ifdef OPENSSL_FIPS # ifdef OPENSSL_FIPS
ERR_load_FIPS_strings(); ERR_load_FIPS_strings();
# endif # endif