]> andersk Git - openssh.git/blobdiff - authfd.c
- markus@cvs.openbsd.org 2001/08/07 10:37:46
[openssh.git] / authfd.c
index db877e43e7fc09900884ad0cbc282459dd8528d9..2eb4513d472d6f01c8b98c76b8dca9fca29a8c78 100644 (file)
--- a/authfd.c
+++ b/authfd.c
@@ -35,7 +35,7 @@
  */
 
 #include "includes.h"
-RCSID("$OpenBSD: authfd.c,v 1.35 2001/02/04 15:32:22 stevesk Exp $");
+RCSID("$OpenBSD: authfd.c,v 1.44 2001/08/07 10:37:46 markus Exp $");
 
 #include <openssl/evp.h>
 
@@ -58,7 +58,8 @@ int   decode_reply(int type);
 
 /* macro to check for "agent failure" message */
 #define agent_failed(x) \
-    ((x == SSH_AGENT_FAILURE) || (x == SSH_COM_AGENT2_FAILURE))
+    ((x == SSH_AGENT_FAILURE) || (x == SSH_COM_AGENT2_FAILURE) || \
+     (x == SSH2_AGENT_FAILURE))
 
 /* Returns the number of the authentication fd, or -1 if there is none. */
 
@@ -75,10 +76,9 @@ ssh_get_authentication_socket(void)
 
        sunaddr.sun_family = AF_UNIX;
        strlcpy(sunaddr.sun_path, authsocket, sizeof(sunaddr.sun_path));
-#ifdef HAVE_SUN_LEN_IN_SOCKADDR_UN
-       sunaddr.sun_len = len = SUN_LEN(&sunaddr)+1;
-#else /* HAVE_SUN_LEN_IN_SOCKADDR_UN */
        len = SUN_LEN(&sunaddr)+1;
+#ifdef HAVE_SUN_LEN_IN_SOCKADDR_UN
+       sunaddr.sun_len = len;
 #endif /* HAVE_SUN_LEN_IN_SOCKADDR_UN */
 
        sock = socket(AF_UNIX, SOCK_STREAM, 0);
@@ -97,7 +97,7 @@ ssh_get_authentication_socket(void)
        return sock;
 }
 
-int
+static int
 ssh_request_reply(AuthenticationConnection *auth, Buffer *request, Buffer *reply)
 {
        int l, len;
@@ -121,6 +121,8 @@ ssh_request_reply(AuthenticationConnection *auth, Buffer *request, Buffer *reply
        len = 4;
        while (len > 0) {
                l = read(auth->fd, buf + 4 - len, len);
+               if (l == -1 && (errno == EAGAIN || errno == EINTR))
+                       continue;
                if (l <= 0) {
                        error("Error reading response length from authentication socket.");
                        return 0;
@@ -140,6 +142,8 @@ ssh_request_reply(AuthenticationConnection *auth, Buffer *request, Buffer *reply
                if (l > sizeof(buf))
                        l = sizeof(buf);
                l = read(auth->fd, buf, l);
+               if (l == -1 && (errno == EAGAIN || errno == EINTR))
+                       continue;
                if (l <= 0) {
                        error("Error reading response from authentication socket.");
                        return 0;
@@ -255,7 +259,7 @@ ssh_get_num_identities(AuthenticationConnection *auth, int version)
        /* Get the number of entries in the response and check it for sanity. */
        auth->howmany = buffer_get_int(&auth->identities);
        if (auth->howmany > 1024)
-               fatal("Too many identities in authentication reply: %d\n",
+               fatal("Too many identities in authentication reply: %d",
                    auth->howmany);
 
        return auth->howmany;
@@ -416,7 +420,7 @@ ssh_agent_sign(AuthenticationConnection *auth,
 
 /* Encode key for a message to the agent. */
 
-void
+static void
 ssh_encode_identity_rsa1(Buffer *b, RSA *key, const char *comment)
 {
        buffer_clear(b);
@@ -429,10 +433,10 @@ ssh_encode_identity_rsa1(Buffer *b, RSA *key, const char *comment)
        buffer_put_bignum(b, key->iqmp);        /* ssh key->u */
        buffer_put_bignum(b, key->q);   /* ssh key->p, SSL key->q */
        buffer_put_bignum(b, key->p);   /* ssh key->q, SSL key->p */
-       buffer_put_string(b, comment, strlen(comment));
+       buffer_put_cstring(b, comment);
 }
 
-void
+static void
 ssh_encode_identity_ssh2(Buffer *b, Key *key, const char *comment)
 {
        buffer_clear(b);
@@ -531,6 +535,25 @@ ssh_remove_identity(AuthenticationConnection *auth, Key *key)
        return decode_reply(type);
 }
 
+int
+ssh_update_card(AuthenticationConnection *auth, int add, const char *reader_id)
+{
+       Buffer msg;
+       int type;
+
+       buffer_init(&msg);
+       buffer_put_char(&msg, add ? SSH_AGENTC_ADD_SMARTCARD_KEY :
+           SSH_AGENTC_REMOVE_SMARTCARD_KEY);
+       buffer_put_cstring(&msg, reader_id);
+       if (ssh_request_reply(auth, &msg, &msg) == 0) {
+               buffer_free(&msg);
+               return 0;
+       }
+       type = buffer_get_char(&msg);
+       buffer_free(&msg);
+       return decode_reply(type);
+}
+
 /*
  * Removes all identities from the agent.  This call is not meant to be used
  * by normal applications.
@@ -563,6 +586,7 @@ decode_reply(int type)
        switch (type) {
        case SSH_AGENT_FAILURE:
        case SSH_COM_AGENT2_FAILURE:
+       case SSH2_AGENT_FAILURE:
                log("SSH_AGENT_FAILURE");
                return 0;
        case SSH_AGENT_SUCCESS:
This page took 0.039247 seconds and 4 git commands to generate.