While making the last patch, I noticed ikectl uses getpass. Use
readpassphrase instead and explicit_bzero the buffers.
- Matthew Martin
diff --git ikeca.c ikeca.c
index 69ca076407b..2ec010a5831 100644
--- ikeca.c
+++ ikeca.c
@@ -22,6 +22,7 @@
#include <unistd.h>
#include <err.h>
#include <errno.h>
+#include <readpassphrase.h>
#include <string.h>
#include <stdlib.h>
#include <sys/wait.h>
@@ -636,7 +637,7 @@ ca_export(struct ca *ca, char *keyname, char *myname, char
*password)
DIR *dexp;
struct dirent *de;
struct stat st;
- char *pass;
+ char pass[_PASSWORD_LEN + 1];
char prev[_PASSWORD_LEN + 1];
char passenv[_PASSWORD_LEN + 8];
char oname[PATH_MAX];
@@ -667,16 +668,21 @@ ca_export(struct ca *ca, char *keyname, char *myname,
char *password)
if (password != NULL)
snprintf(passenv, sizeof(passenv), "EXPASS=%s", password);
else {
- pass = getpass("Export passphrase:");
- if (pass == NULL || *pass == '\0')
- err(1, "password not set");
-
- strlcpy(prev, pass, sizeof(prev));
- pass = getpass("Retype export passphrase:");
- if (pass == NULL || strcmp(prev, pass) != 0)
+ if (readpassphrase("Export passphrase:", prev, sizeof(prev), 0)
+ == NULL)
+ errx(1, "unable to read passphrase");
+ if (*prev == '\0')
+ errx(1, "password not set");
+
+ if (readpassphrase("Retype export passphrase:", pass,
+ sizeof(pass), 0) == NULL)
+ errx(1, "unable to read passphrase");
+ if (strcmp(prev, pass) != 0)
errx(1, "passphrase does not match!");
snprintf(passenv, sizeof(passenv), "EXPASS=%s", pass);
+ explicit_bzero(pass, sizeof(pass));
+ explicit_bzero(prev, sizeof(prev));
}
snprintf(cacrt, sizeof(cacrt), "%s/ca.crt", ca->sslpath);