* Author: Tatu Ylonen <ylo@cs.hut.fi>
* Copyright (c) 1995 Tatu Ylonen <ylo@cs.hut.fi>, Espoo, Finland
* All rights reserved
- * Created: Thu Apr 6 00:52:24 1995 ylo
* Adds an identity to the authentication server, or removes an identity.
*
+ * As far as I am concerned, the code I have written for this software
+ * can be used freely for any purpose. Any derived versions of this
+ * software must be clearly marked as such, and if the derived work is
+ * incompatible with the protocol description in the RFC file, it must be
+ * called by a name other than "ssh" or "Secure Shell".
+ *
* SSH2 implementation,
* Copyright (c) 2000 Markus Friedl. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+ * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+ * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
#include "includes.h"
-RCSID("$OpenBSD: ssh-add.c,v 1.19 2000/08/19 21:34:43 markus Exp $");
+RCSID("$OpenBSD: ssh-add.c,v 1.27 2001/01/21 19:05:56 markus Exp $");
#include <openssl/evp.h>
-#include <openssl/rsa.h>
-#include <openssl/dsa.h>
-#include "rsa.h"
#include "ssh.h"
+#include "rsa.h"
+#include "log.h"
#include "xmalloc.h"
#include "key.h"
#include "authfd.h"
#include "authfile.h"
+#include "pathnames.h"
+#include "readpass.h"
#ifdef HAVE___PROGNAME
extern char *__progname;
-#else /* HAVE___PROGNAME */
-static const char *__progname = "ssh-add";
-#endif /* HAVE___PROGNAME */
+#else
+char *__progname;
+#endif
void
delete_file(AuthenticationConnection *ac, const char *filename)
Key *public;
char *comment;
- public = key_new(KEY_RSA);
+ public = key_new(KEY_RSA1);
if (!load_public_key(filename, public, &comment)) {
- printf("Bad key file %s: %s\n", filename, strerror(errno));
- return;
+ key_free(public);
+ public = key_new(KEY_UNSPEC);
+ if (!try_load_public_key(filename, public, &comment)) {
+ printf("Bad key file %s\n", filename);
+ return;
+ }
}
if (ssh_remove_identity(ac, public))
fprintf(stderr, "Identity removed: %s (%s)\n", filename, comment);
if (success)
fprintf(stderr, "All identities removed.\n");
else
- fprintf(stderr, "Failed to remove all identitities.\n");
+ fprintf(stderr, "Failed to remove all identities.\n");
}
char *
int p[2], status;
char buf[1024];
+ if (fflush(stdout) != 0)
+ error("ssh_askpass: fflush: %s", strerror(errno));
if (askpass == NULL)
fatal("internal error: askpass undefined");
if (pipe(p) < 0)
char buf[1024], msg[1024];
int success;
int interactive = isatty(STDIN_FILENO);
- int type = KEY_RSA;
+ int type = KEY_RSA1;
if (stat(filename, &st) < 0) {
perror(filename);
* try to load the public key. right now this only works for RSA,
* since DSA keys are fully encrypted
*/
- public = key_new(KEY_RSA);
+ public = key_new(KEY_RSA1);
if (!load_public_key(filename, public, &saved_comment)) {
- /* ok, so we will asume this is a DSA key */
- type = KEY_DSA;
+ /* ok, so we will assume this is 'some' key */
+ type = KEY_UNSPEC;
saved_comment = xstrdup(filename);
}
key_free(public);
if (getenv(SSH_ASKPASS_ENV))
askpass = getenv(SSH_ASKPASS_ENV);
else
- askpass = SSH_ASKPASS_DEFAULT;
+ askpass = _PATH_SSH_ASKPASS_DEFAULT;
}
/* At first, try empty passphrase */
key = ssh_get_next_identity(ac, &comment, version)) {
had_identities = 1;
if (fp) {
- printf("%d %s %s\n",
- key_size(key), key_fingerprint(key), comment);
+ printf("%d %s %s (%s)\n",
+ key_size(key), key_fingerprint(key),
+ comment, key_type(key));
} else {
if (!key_write(key, stdout))
fprintf(stderr, "key_write failed");
int i;
int deleting = 0;
+ __progname = get_progname(argv[0]);
init_rng();
- /* check if RSA support exists */
- if (rsa_alive() == 0) {
- fprintf(stderr,
- "%s: no RSA support in libssl and libcrypto. See ssl(8).\n",
- __progname);
- exit(1);
- }
SSLeay_add_all_algorithms();
/* At first, get a connection to the authentication agent. */
if (no_files) {
pw = getpwuid(getuid());
if (!pw) {
- fprintf(stderr, "No user found with uid %d\n", (int) getuid());
+ fprintf(stderr, "No user found with uid %u\n",
+ (u_int)getuid());
ssh_close_authentication_connection(ac);
exit(1);
}
- snprintf(buf, sizeof buf, "%s/%s", pw->pw_dir, SSH_CLIENT_IDENTITY);
+ snprintf(buf, sizeof buf, "%s/%s", pw->pw_dir, _PATH_SSH_CLIENT_IDENTITY);
if (deleting)
delete_file(ac, buf);
else