diff options
Diffstat (limited to 'ssh-add.c')
-rw-r--r-- | ssh-add.c | 35 |
1 files changed, 16 insertions, 19 deletions
@@ -1,4 +1,4 @@ | |||
1 | /* $OpenBSD: ssh-add.c,v 1.123 2015/07/03 03:43:18 djm Exp $ */ | 1 | /* $OpenBSD: ssh-add.c,v 1.128 2016/02/15 09:47:49 dtucker Exp $ */ |
2 | /* | 2 | /* |
3 | * Author: Tatu Ylonen <ylo@cs.hut.fi> | 3 | * Author: Tatu Ylonen <ylo@cs.hut.fi> |
4 | * Copyright (c) 1995 Tatu Ylonen <ylo@cs.hut.fi>, Espoo, Finland | 4 | * Copyright (c) 1995 Tatu Ylonen <ylo@cs.hut.fi>, Espoo, Finland |
@@ -93,7 +93,7 @@ static int lifetime = 0; | |||
93 | /* User has to confirm key use */ | 93 | /* User has to confirm key use */ |
94 | static int confirm = 0; | 94 | static int confirm = 0; |
95 | 95 | ||
96 | /* we keep a cache of one passphrases */ | 96 | /* we keep a cache of one passphrase */ |
97 | static char *pass = NULL; | 97 | static char *pass = NULL; |
98 | static void | 98 | static void |
99 | clear_pass(void) | 99 | clear_pass(void) |
@@ -150,10 +150,8 @@ delete_file(int agent_fd, const char *filename, int key_only) | |||
150 | certpath, ssh_err(r)); | 150 | certpath, ssh_err(r)); |
151 | 151 | ||
152 | out: | 152 | out: |
153 | if (cert != NULL) | 153 | sshkey_free(cert); |
154 | sshkey_free(cert); | 154 | sshkey_free(public); |
155 | if (public != NULL) | ||
156 | sshkey_free(public); | ||
157 | free(certpath); | 155 | free(certpath); |
158 | free(comment); | 156 | free(comment); |
159 | 157 | ||
@@ -218,35 +216,32 @@ add_file(int agent_fd, const char *filename, int key_only) | |||
218 | close(fd); | 216 | close(fd); |
219 | 217 | ||
220 | /* At first, try empty passphrase */ | 218 | /* At first, try empty passphrase */ |
221 | if ((r = sshkey_parse_private_fileblob(keyblob, "", filename, | 219 | if ((r = sshkey_parse_private_fileblob(keyblob, "", &private, |
222 | &private, &comment)) != 0 && r != SSH_ERR_KEY_WRONG_PASSPHRASE) { | 220 | &comment)) != 0 && r != SSH_ERR_KEY_WRONG_PASSPHRASE) { |
223 | fprintf(stderr, "Error loading key \"%s\": %s\n", | 221 | fprintf(stderr, "Error loading key \"%s\": %s\n", |
224 | filename, ssh_err(r)); | 222 | filename, ssh_err(r)); |
225 | goto fail_load; | 223 | goto fail_load; |
226 | } | 224 | } |
227 | /* try last */ | 225 | /* try last */ |
228 | if (private == NULL && pass != NULL) { | 226 | if (private == NULL && pass != NULL) { |
229 | if ((r = sshkey_parse_private_fileblob(keyblob, pass, filename, | 227 | if ((r = sshkey_parse_private_fileblob(keyblob, pass, &private, |
230 | &private, &comment)) != 0 && | 228 | &comment)) != 0 && r != SSH_ERR_KEY_WRONG_PASSPHRASE) { |
231 | r != SSH_ERR_KEY_WRONG_PASSPHRASE) { | ||
232 | fprintf(stderr, "Error loading key \"%s\": %s\n", | 229 | fprintf(stderr, "Error loading key \"%s\": %s\n", |
233 | filename, ssh_err(r)); | 230 | filename, ssh_err(r)); |
234 | goto fail_load; | 231 | goto fail_load; |
235 | } | 232 | } |
236 | } | 233 | } |
237 | if (comment == NULL) | ||
238 | comment = xstrdup(filename); | ||
239 | if (private == NULL) { | 234 | if (private == NULL) { |
240 | /* clear passphrase since it did not work */ | 235 | /* clear passphrase since it did not work */ |
241 | clear_pass(); | 236 | clear_pass(); |
242 | snprintf(msg, sizeof msg, "Enter passphrase for %.200s%s: ", | 237 | snprintf(msg, sizeof msg, "Enter passphrase for %s%s: ", |
243 | comment, confirm ? " (will confirm each use)" : ""); | 238 | filename, confirm ? " (will confirm each use)" : ""); |
244 | for (;;) { | 239 | for (;;) { |
245 | pass = read_passphrase(msg, RP_ALLOW_STDIN); | 240 | pass = read_passphrase(msg, RP_ALLOW_STDIN); |
246 | if (strcmp(pass, "") == 0) | 241 | if (strcmp(pass, "") == 0) |
247 | goto fail_load; | 242 | goto fail_load; |
248 | if ((r = sshkey_parse_private_fileblob(keyblob, pass, | 243 | if ((r = sshkey_parse_private_fileblob(keyblob, pass, |
249 | filename, &private, NULL)) == 0) | 244 | &private, &comment)) == 0) |
250 | break; | 245 | break; |
251 | else if (r != SSH_ERR_KEY_WRONG_PASSPHRASE) { | 246 | else if (r != SSH_ERR_KEY_WRONG_PASSPHRASE) { |
252 | fprintf(stderr, | 247 | fprintf(stderr, |
@@ -254,16 +249,17 @@ add_file(int agent_fd, const char *filename, int key_only) | |||
254 | filename, ssh_err(r)); | 249 | filename, ssh_err(r)); |
255 | fail_load: | 250 | fail_load: |
256 | clear_pass(); | 251 | clear_pass(); |
257 | free(comment); | ||
258 | sshbuf_free(keyblob); | 252 | sshbuf_free(keyblob); |
259 | return -1; | 253 | return -1; |
260 | } | 254 | } |
261 | clear_pass(); | 255 | clear_pass(); |
262 | snprintf(msg, sizeof msg, | 256 | snprintf(msg, sizeof msg, |
263 | "Bad passphrase, try again for %.200s%s: ", comment, | 257 | "Bad passphrase, try again for %s%s: ", filename, |
264 | confirm ? " (will confirm each use)" : ""); | 258 | confirm ? " (will confirm each use)" : ""); |
265 | } | 259 | } |
266 | } | 260 | } |
261 | if (comment == NULL || *comment == '\0') | ||
262 | comment = xstrdup(filename); | ||
267 | sshbuf_free(keyblob); | 263 | sshbuf_free(keyblob); |
268 | 264 | ||
269 | if ((r = ssh_add_identity_constrained(agent_fd, private, comment, | 265 | if ((r = ssh_add_identity_constrained(agent_fd, private, comment, |
@@ -386,7 +382,7 @@ list_identities(int agent_fd, int do_fp) | |||
386 | if (do_fp) { | 382 | if (do_fp) { |
387 | fp = sshkey_fingerprint(idlist->keys[i], | 383 | fp = sshkey_fingerprint(idlist->keys[i], |
388 | fingerprint_hash, SSH_FP_DEFAULT); | 384 | fingerprint_hash, SSH_FP_DEFAULT); |
389 | printf("%d %s %s (%s)\n", | 385 | printf("%u %s %s (%s)\n", |
390 | sshkey_size(idlist->keys[i]), | 386 | sshkey_size(idlist->keys[i]), |
391 | fp == NULL ? "(null)" : fp, | 387 | fp == NULL ? "(null)" : fp, |
392 | idlist->comments[i], | 388 | idlist->comments[i], |
@@ -485,6 +481,7 @@ main(int argc, char **argv) | |||
485 | int r, i, ch, deleting = 0, ret = 0, key_only = 0; | 481 | int r, i, ch, deleting = 0, ret = 0, key_only = 0; |
486 | int xflag = 0, lflag = 0, Dflag = 0; | 482 | int xflag = 0, lflag = 0, Dflag = 0; |
487 | 483 | ||
484 | ssh_malloc_init(); /* must be called before any mallocs */ | ||
488 | /* Ensure that fds 0, 1 and 2 are open or directed to /dev/null */ | 485 | /* Ensure that fds 0, 1 and 2 are open or directed to /dev/null */ |
489 | sanitise_stdfd(); | 486 | sanitise_stdfd(); |
490 | 487 | ||