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

Diff for /src/usr.bin/ssh/kex.c between version 1.52 and 1.53

version 1.52, 2002/11/21 22:45:31 version 1.53, 2003/02/02 10:56:08
Line 74 
Line 74 
   
 /* parse buffer and return algorithm proposal */  /* parse buffer and return algorithm proposal */
 static char **  static char **
 kex_buf2prop(Buffer *raw)  kex_buf2prop(Buffer *raw, int *first_kex_follows)
 {  {
         Buffer b;          Buffer b;
         int i;          int i;
Line 94 
Line 94 
         }          }
         /* first kex follows / reserved */          /* first kex follows / reserved */
         i = buffer_get_char(&b);          i = buffer_get_char(&b);
           if (first_kex_follows != NULL)
                   *first_kex_follows = i;
         debug2("kex_parse_kexinit: first_kex_follows %d ", i);          debug2("kex_parse_kexinit: first_kex_follows %d ", i);
         i = buffer_get_int(&b);          i = buffer_get_int(&b);
         debug2("kex_parse_kexinit: reserved %d ", i);          debug2("kex_parse_kexinit: reserved %d ", i);
Line 317 
Line 319 
         xfree(hostkeyalg);          xfree(hostkeyalg);
 }  }
   
   static int
   proposals_match(char *my[PROPOSAL_MAX], char *peer[PROPOSAL_MAX])
   {
           static int check[] = {
                   PROPOSAL_KEX_ALGS, PROPOSAL_SERVER_HOST_KEY_ALGS, -1
           };
           int *idx;
           char *p;
   
           for (idx = &check[0]; *idx != -1; idx++) {
                   if ((p = strchr(my[*idx], ',')) != NULL)
                           *p = '\0';
                   if ((p = strchr(peer[*idx], ',')) != NULL)
                           *p = '\0';
                   if (strcmp(my[*idx], peer[*idx]) != 0) {
                           debug2("proposal mismatch: my %s peer %s",
                               my[*idx], peer[*idx]);
                           return (0);
                   }
           }
           debug2("proposals match");
           return (1);
   }
   
 static void  static void
 kex_choose_conf(Kex *kex)  kex_choose_conf(Kex *kex)
 {  {
Line 327 
Line 353 
         int mode;          int mode;
         int ctos;                               /* direction: if true client-to-server */          int ctos;                               /* direction: if true client-to-server */
         int need;          int need;
           int first_kex_follows, type;
   
         my   = kex_buf2prop(&kex->my);          my   = kex_buf2prop(&kex->my, NULL);
         peer = kex_buf2prop(&kex->peer);          peer = kex_buf2prop(&kex->peer, &first_kex_follows);
   
         if (kex->server) {          if (kex->server) {
                 cprop=peer;                  cprop=peer;
Line 372 
Line 399 
         }          }
         /* XXX need runden? */          /* XXX need runden? */
         kex->we_need = need;          kex->we_need = need;
   
           /* ignore the next message if the proposals do not match */
           if (first_kex_follows && !proposals_match(my, peer)) {
                   type = packet_read();
                   debug2("skipping next packet (type %u)", type);
           }
   
         kex_prop_free(my);          kex_prop_free(my);
         kex_prop_free(peer);          kex_prop_free(peer);

Legend:
Removed from v.1.52  
changed lines
  Added in v.1.53