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);

Reply via email to