[BACK]Return to ssh-agent.c CVS log [TXT][DIR] Up to [local] / src / usr.bin / ssh

Diff for /src/usr.bin/ssh/ssh-agent.c between version 1.77 and 1.78

version 1.77, 2001/12/29 21:56:01 version 1.78, 2002/01/13 17:27:07
Line 36 
Line 36 
  */   */
   
 #include "includes.h"  #include "includes.h"
   #include <sys/queue.h>
 RCSID("$OpenBSD$");  RCSID("$OpenBSD$");
   
 #include <openssl/evp.h>  #include <openssl/evp.h>
Line 77 
Line 78 
 u_int sockets_alloc = 0;  u_int sockets_alloc = 0;
 SocketEntry *sockets = NULL;  SocketEntry *sockets = NULL;
   
 typedef struct {  typedef struct identity {
           TAILQ_ENTRY(identity) next;
         Key *key;          Key *key;
         char *comment;          char *comment;
 } Identity;  } Identity;
   
 typedef struct {  typedef struct {
         int nentries;          int nentries;
         Identity *identities;          TAILQ_HEAD(idqueue, identity) idlist;
 } Idtab;  } Idtab;
   
 /* private key table, one per protocol version */  /* private key table, one per protocol version */
Line 106 
Line 108 
 {  {
         int i;          int i;
         for (i = 0; i <=2; i++) {          for (i = 0; i <=2; i++) {
                 idtable[i].identities = NULL;                  TAILQ_INIT(&idtable[i].idlist);
                 idtable[i].nentries = 0;                  idtable[i].nentries = 0;
         }          }
 }  }
Line 121 
Line 123 
 }  }
   
 /* return matching private key for given public key */  /* return matching private key for given public key */
 static Key *  static Identity *
 lookup_private_key(Key *key, int *idx, int version)  lookup_identity(Key *key, int version)
 {  {
         int i;          Identity *id;
   
         Idtab *tab = idtab_lookup(version);          Idtab *tab = idtab_lookup(version);
         for (i = 0; i < tab->nentries; i++) {          TAILQ_FOREACH(id, &tab->idlist, next) {
                 if (key_equal(key, tab->identities[i].key)) {                  if (key_equal(key, id->key))
                         if (idx != NULL)                          return (id);
                                 *idx = i;  
                         return tab->identities[i].key;  
                 }  
         }          }
         return NULL;          return (NULL);
 }  }
   
   static void
   free_identity(Identity *id)
   {
           key_free(id->key);
           xfree(id->comment);
           xfree(id);
   }
   
 /* send list of supported public keys to 'client' */  /* send list of supported public keys to 'client' */
 static void  static void
 process_request_identities(SocketEntry *e, int version)  process_request_identities(SocketEntry *e, int version)
 {  {
         Idtab *tab = idtab_lookup(version);          Idtab *tab = idtab_lookup(version);
         Buffer msg;          Buffer msg;
         int i;          Identity *id;
   
         buffer_init(&msg);          buffer_init(&msg);
         buffer_put_char(&msg, (version == 1) ?          buffer_put_char(&msg, (version == 1) ?
             SSH_AGENT_RSA_IDENTITIES_ANSWER : SSH2_AGENT_IDENTITIES_ANSWER);              SSH_AGENT_RSA_IDENTITIES_ANSWER : SSH2_AGENT_IDENTITIES_ANSWER);
         buffer_put_int(&msg, tab->nentries);          buffer_put_int(&msg, tab->nentries);
         for (i = 0; i < tab->nentries; i++) {          TAILQ_FOREACH(id, &tab->idlist, next) {
                 Identity *id = &tab->identities[i];  
                 if (id->key->type == KEY_RSA1) {                  if (id->key->type == KEY_RSA1) {
                         buffer_put_int(&msg, BN_num_bits(id->key->rsa->n));                          buffer_put_int(&msg, BN_num_bits(id->key->rsa->n));
                         buffer_put_bignum(&msg, id->key->rsa->e);                          buffer_put_bignum(&msg, id->key->rsa->e);
Line 172 
Line 179 
 static void  static void
 process_authentication_challenge1(SocketEntry *e)  process_authentication_challenge1(SocketEntry *e)
 {  {
         Key *key, *private;          Identity *id;
           Key *key;
         BIGNUM *challenge;          BIGNUM *challenge;
         int i, len;          int i, len;
         Buffer msg;          Buffer msg;
Line 198 
Line 206 
         if (response_type != 1)          if (response_type != 1)
                 goto failure;                  goto failure;
   
         private = lookup_private_key(key, NULL, 1);          id = lookup_identity(key, 1);
         if (private != NULL) {          if (id != NULL) {
                   Key *private = id->key;
                 /* Decrypt the challenge using the private key. */                  /* Decrypt the challenge using the private key. */
                 if (rsa_private_decrypt(challenge, challenge, private->rsa) <= 0)                  if (rsa_private_decrypt(challenge, challenge, private->rsa) <= 0)
                         goto failure;                          goto failure;
Line 240 
Line 249 
 process_sign_request2(SocketEntry *e)  process_sign_request2(SocketEntry *e)
 {  {
         extern int datafellows;          extern int datafellows;
         Key *key, *private;          Key *key;
         u_char *blob, *data, *signature = NULL;          u_char *blob, *data, *signature = NULL;
         u_int blen, dlen, slen = 0;          u_int blen, dlen, slen = 0;
         int flags;          int flags;
Line 258 
Line 267 
   
         key = key_from_blob(blob, blen);          key = key_from_blob(blob, blen);
         if (key != NULL) {          if (key != NULL) {
                 private = lookup_private_key(key, NULL, 2);                  Identity *id = lookup_identity(key, 2);
                 if (private != NULL)                  if (id != NULL)
                         ok = key_sign(private, &signature, &slen, data, dlen);                          ok = key_sign(id->key, &signature, &slen, data, dlen);
         }          }
         key_free(key);          key_free(key);
         buffer_init(&msg);          buffer_init(&msg);
Line 284 
Line 293 
 static void  static void
 process_remove_identity(SocketEntry *e, int version)  process_remove_identity(SocketEntry *e, int version)
 {  {
         Key *key = NULL, *private;          Key *key = NULL;
         u_char *blob;          u_char *blob;
         u_int blen;          u_int blen;
         u_int bits;          u_int bits;
Line 308 
Line 317 
                 break;                  break;
         }          }
         if (key != NULL) {          if (key != NULL) {
                 int idx;                  Identity *id = lookup_identity(key, version);
                 private = lookup_private_key(key, &idx, version);                  if (id != NULL) {
                 if (private != NULL) {  
                         /*                          /*
                          * We have this key.  Free the old key.  Since we                           * We have this key.  Free the old key.  Since we
                          * don\'t want to leave empty slots in the middle of                           * don\'t want to leave empty slots in the middle of
Line 319 
Line 327 
                          * of the array.                           * of the array.
                          */                           */
                         Idtab *tab = idtab_lookup(version);                          Idtab *tab = idtab_lookup(version);
                         key_free(tab->identities[idx].key);  
                         xfree(tab->identities[idx].comment);  
                         if (tab->nentries < 1)                          if (tab->nentries < 1)
                                 fatal("process_remove_identity: "                                  fatal("process_remove_identity: "
                                     "internal error: tab->nentries %d",                                      "internal error: tab->nentries %d",
                                     tab->nentries);                                      tab->nentries);
                         if (idx != tab->nentries - 1) {                          TAILQ_REMOVE(&tab->idlist, id, next);
                                 int i;                          free_identity(id);
                                 for (i = idx; i < tab->nentries - 1; i++)  
                                         tab->identities[i] = tab->identities[i+1];  
                         }  
                         tab->identities[tab->nentries - 1].key = NULL;  
                         tab->identities[tab->nentries - 1].comment = NULL;  
                         tab->nentries--;                          tab->nentries--;
                         success = 1;                          success = 1;
                 }                  }
Line 345 
Line 346 
 static void  static void
 process_remove_all_identities(SocketEntry *e, int version)  process_remove_all_identities(SocketEntry *e, int version)
 {  {
         u_int i;  
         Idtab *tab = idtab_lookup(version);          Idtab *tab = idtab_lookup(version);
           Identity *id;
   
         /* Loop over all identities and clear the keys. */          /* Loop over all identities and clear the keys. */
         for (i = 0; i < tab->nentries; i++) {          for (id = TAILQ_FIRST(&tab->idlist); id;
                 key_free(tab->identities[i].key);              id = TAILQ_FIRST(&tab->idlist)) {
                 xfree(tab->identities[i].comment);                  TAILQ_REMOVE(&tab->idlist, id, next);
                   free_identity(id);
         }          }
   
         /* Mark that there are no identities. */          /* Mark that there are no identities. */
Line 425 
Line 427 
                 goto send;                  goto send;
         }          }
         success = 1;          success = 1;
         if (lookup_private_key(k, NULL, version) == NULL) {          if (lookup_identity(k, version) == NULL) {
                 if (tab->nentries == 0)                  Identity *id = xmalloc(sizeof(Identity));
                         tab->identities = xmalloc(sizeof(Identity));                  id->key = k;
                 else                  id->comment = comment;
                         tab->identities = xrealloc(tab->identities,                  TAILQ_INSERT_TAIL(&tab->idlist, id, next);
                             (tab->nentries + 1) * sizeof(Identity));  
                 tab->identities[tab->nentries].key = k;  
                 tab->identities[tab->nentries].comment = comment;  
                 /* Increment the number of identities. */                  /* Increment the number of identities. */
                 tab->nentries++;                  tab->nentries++;
         } else {          } else {
Line 467 
Line 466 
   
         tab = idtab_lookup(1);          tab = idtab_lookup(1);
         k->type = KEY_RSA1;          k->type = KEY_RSA1;
         if (lookup_private_key(k, NULL, 1) == NULL) {          if (lookup_identity(k, 1) == NULL) {
                 if (tab->nentries == 0)                  Identity *id = xmalloc(sizeof(Identity));
                         tab->identities = xmalloc(sizeof(Identity));  
                 else  
                         tab->identities = xrealloc(tab->identities,  
                             (tab->nentries + 1) * sizeof(Identity));  
                 n = key_new(KEY_RSA1);                  n = key_new(KEY_RSA1);
                 BN_copy(n->rsa->n, k->rsa->n);                  BN_copy(n->rsa->n, k->rsa->n);
                 BN_copy(n->rsa->e, k->rsa->e);                  BN_copy(n->rsa->e, k->rsa->e);
                 RSA_set_method(n->rsa, sc_get_engine());                  RSA_set_method(n->rsa, sc_get_engine());
                 tab->identities[tab->nentries].key = n;                  id->key = n;
                 tab->identities[tab->nentries].comment =                  id->comment = xstrdup("rsa1 smartcard");
                     xstrdup("rsa1 smartcard");                  TAILQ_INSERT_TAIL(&tab->idlist, id, next);
                 tab->nentries++;                  tab->nentries++;
         }          }
         k->type = KEY_RSA;          k->type = KEY_RSA;
         tab = idtab_lookup(2);          tab = idtab_lookup(2);
         if (lookup_private_key(k, NULL, 2) == NULL) {          if (lookup_identity(k, 2) == NULL) {
                 if (tab->nentries == 0)                  Identity *id = xmalloc(sizeof(Identity));
                         tab->identities = xmalloc(sizeof(Identity));  
                 else  
                         tab->identities = xrealloc(tab->identities,  
                             (tab->nentries + 1) * sizeof(Identity));  
                 n = key_new(KEY_RSA);                  n = key_new(KEY_RSA);
                 BN_copy(n->rsa->n, k->rsa->n);                  BN_copy(n->rsa->n, k->rsa->n);
                 BN_copy(n->rsa->e, k->rsa->e);                  BN_copy(n->rsa->e, k->rsa->e);
                 RSA_set_method(n->rsa, sc_get_engine());                  RSA_set_method(n->rsa, sc_get_engine());
                 tab->identities[tab->nentries].key = n;                  id->key = n;
                 tab->identities[tab->nentries].comment =                  id->comment = xstrdup("rsa smartcard");
                     xstrdup("rsa smartcard");                  TAILQ_INSERT_TAIL(&tab->idlist, id, next);
                 tab->nentries++;                  tab->nentries++;
         }          }
         key_free(k);          key_free(k);
Line 509 
Line 500 
 static void  static void
 process_remove_smartcard_key(SocketEntry *e)  process_remove_smartcard_key(SocketEntry *e)
 {  {
         Key *k = NULL, *private;          Key *k = NULL;
         int idx;  
         int success = 0;          int success = 0;
         char *sc_reader_id = NULL;          char *sc_reader_id = NULL;
   
Line 521 
Line 511 
         if (k == NULL) {          if (k == NULL) {
                 error("sc_get_pubkey failed");                  error("sc_get_pubkey failed");
         } else {          } else {
                   Identity *id;
                 k->type = KEY_RSA1;                  k->type = KEY_RSA1;
                 private = lookup_private_key(k, &idx, 1);                  id = lookup_identity(k, 1);
                 if (private != NULL) {                  if (id != NULL) {
                         Idtab *tab = idtab_lookup(1);                          Idtab *tab = idtab_lookup(1);
                         key_free(tab->identities[idx].key);                          TAILQ_REMOVE(&tab->idlist, id, next);
                         xfree(tab->identities[idx].comment);                          free_identity(id);
                         if (idx != tab->nentries)  
                                 tab->identities[idx] = tab->identities[tab->nentries];  
                         tab->nentries--;                          tab->nentries--;
                         success = 1;                          success = 1;
                 }                  }
                 k->type = KEY_RSA;                  k->type = KEY_RSA;
                 private = lookup_private_key(k, &idx, 2);                  id = lookup_identity(k, 2);
                 if (private != NULL) {                  if (id != NULL) {
                         Idtab *tab = idtab_lookup(2);                          Idtab *tab = idtab_lookup(2);
                         key_free(tab->identities[idx].key);                          TAILQ_REMOVE(&tab->idlist, id, next);
                         xfree(tab->identities[idx].comment);                          free_identity(id);
                         if (idx != tab->nentries)  
                                 tab->identities[idx] = tab->identities[tab->nentries];  
                         tab->nentries--;                          tab->nentries--;
                         success = 1;                          success = 1;
                 }                  }

Legend:
Removed from v.1.77  
changed lines
  Added in v.1.78