[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.60.4.2 and 1.61

version 1.60.4.2, 2006/02/03 02:53:44 version 1.61, 2005/06/17 02:44:32
Line 275 
Line 275 
         char *name = match_list(client, server, NULL);          char *name = match_list(client, server, NULL);
         if (name == NULL)          if (name == NULL)
                 fatal("no matching comp found: client %s server %s", client, server);                  fatal("no matching comp found: client %s server %s", client, server);
         if (strcmp(name, "zlib@openssh.com") == 0) {          if (strcmp(name, "zlib") == 0) {
                 comp->type = COMP_DELAYED;                  comp->type = 1;
         } else if (strcmp(name, "zlib") == 0) {  
                 comp->type = COMP_ZLIB;  
         } else if (strcmp(name, "none") == 0) {          } else if (strcmp(name, "none") == 0) {
                 comp->type = COMP_NONE;                  comp->type = 0;
         } else {          } else {
                 fatal("unsupported comp %s", name);                  fatal("unsupported comp %s", name);
         }          }
Line 294 
Line 292 
                 fatal("no kex alg");                  fatal("no kex alg");
         if (strcmp(k->name, KEX_DH1) == 0) {          if (strcmp(k->name, KEX_DH1) == 0) {
                 k->kex_type = KEX_DH_GRP1_SHA1;                  k->kex_type = KEX_DH_GRP1_SHA1;
                 k->evp_md = EVP_sha1();  
         } else if (strcmp(k->name, KEX_DH14) == 0) {          } else if (strcmp(k->name, KEX_DH14) == 0) {
                 k->kex_type = KEX_DH_GRP14_SHA1;                  k->kex_type = KEX_DH_GRP14_SHA1;
                 k->evp_md = EVP_sha1();          } else if (strcmp(k->name, KEX_DHGEX) == 0) {
         } else if (strcmp(k->name, KEX_DHGEX_SHA1) == 0) {  
                 k->kex_type = KEX_DH_GEX_SHA1;                  k->kex_type = KEX_DH_GEX_SHA1;
                 k->evp_md = EVP_sha1();  
         } else          } else
                 fatal("bad kex alg %s", k->name);                  fatal("bad kex alg %s", k->name);
 }  }
   
 static void  static void
 choose_hostkeyalg(Kex *k, char *client, char *server)  choose_hostkeyalg(Kex *k, char *client, char *server)
 {  {
Line 398 
Line 392 
   
         /* ignore the next message if the proposals do not match */          /* ignore the next message if the proposals do not match */
         if (first_kex_follows && !proposals_match(my, peer) &&          if (first_kex_follows && !proposals_match(my, peer) &&
             !(datafellows & SSH_BUG_FIRSTKEX)) {             !(datafellows & SSH_BUG_FIRSTKEX)) {
                 type = packet_read();                  type = packet_read();
                 debug2("skipping next packet (type %u)", type);                  debug2("skipping next packet (type %u)", type);
         }          }
Line 408 
Line 402 
 }  }
   
 static u_char *  static u_char *
 derive_key(Kex *kex, int id, u_int need, u_char *hash, u_int hashlen,  derive_key(Kex *kex, int id, u_int need, u_char *hash, BIGNUM *shared_secret)
     BIGNUM *shared_secret)  
 {  {
         Buffer b;          Buffer b;
           const EVP_MD *evp_md = EVP_sha1();
         EVP_MD_CTX md;          EVP_MD_CTX md;
         char c = id;          char c = id;
         u_int have;          u_int have;
         int mdsz;          int mdsz = EVP_MD_size(evp_md);
         u_char *digest;          u_char *digest;
   
           if (mdsz < 0)
                   fatal("derive_key: mdsz < 0");
           digest = xmalloc(roundup(need, mdsz));
   
         if ((mdsz = EVP_MD_size(kex->evp_md)) <= 0)  
                 fatal("bad kex md size %d", mdsz);  
         digest = xmalloc(roundup(need, mdsz));  
   
         buffer_init(&b);          buffer_init(&b);
         buffer_put_bignum2(&b, shared_secret);          buffer_put_bignum2(&b, shared_secret);
   
         /* K1 = HASH(K || H || "A" || session_id) */          /* K1 = HASH(K || H || "A" || session_id) */
         EVP_DigestInit(&md, kex->evp_md);          EVP_DigestInit(&md, evp_md);
         if (!(datafellows & SSH_BUG_DERIVEKEY))          if (!(datafellows & SSH_BUG_DERIVEKEY))
                 EVP_DigestUpdate(&md, buffer_ptr(&b), buffer_len(&b));                  EVP_DigestUpdate(&md, buffer_ptr(&b), buffer_len(&b));
         EVP_DigestUpdate(&md, hash, hashlen);          EVP_DigestUpdate(&md, hash, mdsz);
         EVP_DigestUpdate(&md, &c, 1);          EVP_DigestUpdate(&md, &c, 1);
         EVP_DigestUpdate(&md, kex->session_id, kex->session_id_len);          EVP_DigestUpdate(&md, kex->session_id, kex->session_id_len);
         EVP_DigestFinal(&md, digest, NULL);          EVP_DigestFinal(&md, digest, NULL);
Line 440 
Line 434 
          * Key = K1 || K2 || ... || Kn           * Key = K1 || K2 || ... || Kn
          */           */
         for (have = mdsz; need > have; have += mdsz) {          for (have = mdsz; need > have; have += mdsz) {
                 EVP_DigestInit(&md, kex->evp_md);                  EVP_DigestInit(&md, evp_md);
                 if (!(datafellows & SSH_BUG_DERIVEKEY))                  if (!(datafellows & SSH_BUG_DERIVEKEY))
                         EVP_DigestUpdate(&md, buffer_ptr(&b), buffer_len(&b));                          EVP_DigestUpdate(&md, buffer_ptr(&b), buffer_len(&b));
                 EVP_DigestUpdate(&md, hash, hashlen);                  EVP_DigestUpdate(&md, hash, mdsz);
                 EVP_DigestUpdate(&md, digest, have);                  EVP_DigestUpdate(&md, digest, have);
                 EVP_DigestFinal(&md, digest + have, NULL);                  EVP_DigestFinal(&md, digest + have, NULL);
         }          }
Line 459 
Line 453 
   
 #define NKEYS   6  #define NKEYS   6
 void  void
 kex_derive_keys(Kex *kex, u_char *hash, u_int hashlen, BIGNUM *shared_secret)  kex_derive_keys(Kex *kex, u_char *hash, BIGNUM *shared_secret)
 {  {
         u_char *keys[NKEYS];          u_char *keys[NKEYS];
         u_int i, mode, ctos;          u_int i, mode, ctos;
   
         for (i = 0; i < NKEYS; i++) {          for (i = 0; i < NKEYS; i++)
                 keys[i] = derive_key(kex, 'A'+i, kex->we_need, hash, hashlen,                  keys[i] = derive_key(kex, 'A'+i, kex->we_need, hash, shared_secret);
                     shared_secret);  
         }  
   
         debug2("kex_derive_keys");          debug2("kex_derive_keys");
         for (mode = 0; mode < MODE_MAX; mode++) {          for (mode = 0; mode < MODE_MAX; mode++) {

Legend:
Removed from v.1.60.4.2  
changed lines
  Added in v.1.61