|
@@ -29,11 +29,15 @@ static void die_(int err, int line)
|
|
|
#define die(i) do { die_(i, __LINE__); } while(0)
|
|
|
#define DIE(s, ...) do { print_err("%3d: " s "\n", __LINE__, ##__VA_ARGS__); exit(EXIT_FAILURE); } while(0)
|
|
|
|
|
|
-static int getpassword(const char *prompt, char *pass, unsigned long *len)
|
|
|
+static char* getpassword(const char *prompt, size_t maxlen)
|
|
|
{
|
|
|
+ char *wr, *end, *pass = XCALLOC(1, maxlen + 1);
|
|
|
struct termios tio;
|
|
|
tcflag_t c_lflag;
|
|
|
- unsigned long maxlen = *len, wr = 0;
|
|
|
+ if (pass == NULL)
|
|
|
+ return NULL;
|
|
|
+ wr = pass;
|
|
|
+ end = pass + maxlen;
|
|
|
|
|
|
tcgetattr(0, &tio);
|
|
|
c_lflag = tio.c_lflag;
|
|
@@ -42,25 +46,24 @@ static int getpassword(const char *prompt, char *pass, unsigned long *len)
|
|
|
|
|
|
printf("%s", prompt);
|
|
|
fflush(stdout);
|
|
|
- while (1) {
|
|
|
+ while (pass < end) {
|
|
|
int c = getchar();
|
|
|
if (c == '\r' || c == '\n' || c == -1)
|
|
|
break;
|
|
|
- if (wr < maxlen)
|
|
|
- pass[wr] = c;
|
|
|
- wr++;
|
|
|
+ *wr++ = c;
|
|
|
}
|
|
|
- *len = wr;
|
|
|
tio.c_lflag = c_lflag;
|
|
|
tcsetattr(0, TCSAFLUSH, &tio);
|
|
|
printf("\n");
|
|
|
- return wr <= maxlen;
|
|
|
+ return pass;
|
|
|
}
|
|
|
|
|
|
-static int password_get(void *p, unsigned long *l, void *u)
|
|
|
+static int password_get(void **p, unsigned long *l, void *u)
|
|
|
{
|
|
|
(void)u;
|
|
|
- return getpassword("Enter passphrase: ", p, l);
|
|
|
+ *p = getpassword("Enter passphrase: ", 256);
|
|
|
+ *l = strlen(*p);
|
|
|
+ return 0;
|
|
|
}
|
|
|
|
|
|
static void print(ltc_pka_key *k)
|