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

Diff for /src/usr.bin/ssh/kexdh.c between version 1.7 and 1.7.2.2

version 1.7, 2001/09/17 19:27:15 version 1.7.2.2, 2002/05/17 00:03:23
Line 37 
Line 37 
 #include "packet.h"  #include "packet.h"
 #include "dh.h"  #include "dh.h"
 #include "ssh2.h"  #include "ssh2.h"
   #include "monitor_wrap.h"
   
 static u_char *  static u_char *
 kex_dh_hash(  kex_dh_hash(
Line 51 
Line 52 
 {  {
         Buffer b;          Buffer b;
         static u_char digest[EVP_MAX_MD_SIZE];          static u_char digest[EVP_MAX_MD_SIZE];
         EVP_MD *evp_md = EVP_sha1();          const EVP_MD *evp_md = EVP_sha1();
         EVP_MD_CTX md;          EVP_MD_CTX md;
   
         buffer_init(&b);          buffer_init(&b);
Line 81 
Line 82 
         buffer_free(&b);          buffer_free(&b);
   
 #ifdef DEBUG_KEX  #ifdef DEBUG_KEX
         dump_digest("hash", digest, evp_md->md_size);          dump_digest("hash", digest, EVP_MD_size(evp_md));
 #endif  #endif
         return digest;          return digest;
 }  }
Line 97 
Line 98 
         u_char *server_host_key_blob = NULL, *signature = NULL;          u_char *server_host_key_blob = NULL, *signature = NULL;
         u_char *kbuf, *hash;          u_char *kbuf, *hash;
         u_int klen, kout, slen, sbloblen;          u_int klen, kout, slen, sbloblen;
         int dlen, plen;  
   
         /* generate and send 'e', client DH public key */          /* generate and send 'e', client DH public key */
         dh = dh_new_group1();          dh = dh_new_group1();
Line 115 
Line 115 
 #endif  #endif
   
         debug("expecting SSH2_MSG_KEXDH_REPLY");          debug("expecting SSH2_MSG_KEXDH_REPLY");
         packet_read_expect(&plen, SSH2_MSG_KEXDH_REPLY);          packet_read_expect(SSH2_MSG_KEXDH_REPLY);
   
         /* key, cert */          /* key, cert */
         server_host_key_blob = packet_get_string(&sbloblen);          server_host_key_blob = packet_get_string(&sbloblen);
         server_host_key = key_from_blob(server_host_key_blob, sbloblen);          server_host_key = key_from_blob(server_host_key_blob, sbloblen);
         if (server_host_key == NULL)          if (server_host_key == NULL)
                 fatal("cannot decode server_host_key_blob");                  fatal("cannot decode server_host_key_blob");
           if (server_host_key->type != kex->hostkey_type)
                   fatal("type mismatch for decoded server_host_key_blob");
         if (kex->verify_host_key == NULL)          if (kex->verify_host_key == NULL)
                 fatal("cannot verify server_host_key");                  fatal("cannot verify server_host_key");
         if (kex->verify_host_key(server_host_key) == -1)          if (kex->verify_host_key(server_host_key) == -1)
                 fatal("server_host_key verification failed");                  fatal("server_host_key verification failed");
   
         /* DH paramter f, server public DH key */          /* DH paramter f, server public DH key */
         dh_server_pub = BN_new();          if ((dh_server_pub = BN_new()) == NULL)
         if (dh_server_pub == NULL)  
                 fatal("dh_server_pub == NULL");                  fatal("dh_server_pub == NULL");
         packet_get_bignum2(dh_server_pub, &dlen);          packet_get_bignum2(dh_server_pub);
   
 #ifdef DEBUG_KEXDH  #ifdef DEBUG_KEXDH
         fprintf(stderr, "dh_server_pub= ");          fprintf(stderr, "dh_server_pub= ");
Line 143 
Line 143 
   
         /* signed H */          /* signed H */
         signature = packet_get_string(&slen);          signature = packet_get_string(&slen);
         packet_done();          packet_check_eom();
   
         if (!dh_pub_is_valid(dh, dh_server_pub))          if (!dh_pub_is_valid(dh, dh_server_pub))
                 packet_disconnect("bad server public DH value");                  packet_disconnect("bad server public DH value");
Line 154 
Line 154 
 #ifdef DEBUG_KEXDH  #ifdef DEBUG_KEXDH
         dump_digest("shared secret", kbuf, kout);          dump_digest("shared secret", kbuf, kout);
 #endif  #endif
         shared_secret = BN_new();          if ((shared_secret = BN_new()) == NULL)
                   fatal("kexdh_client: BN_new failed");
         BN_bin2bn(kbuf, kout, shared_secret);          BN_bin2bn(kbuf, kout, shared_secret);
         memset(kbuf, 0, klen);          memset(kbuf, 0, klen);
         xfree(kbuf);          xfree(kbuf);
Line 171 
Line 172 
             shared_secret              shared_secret
         );          );
         xfree(server_host_key_blob);          xfree(server_host_key_blob);
         BN_free(dh_server_pub);          BN_clear_free(dh_server_pub);
         DH_free(dh);          DH_free(dh);
   
         if (key_verify(server_host_key, signature, slen, hash, 20) != 1)          if (key_verify(server_host_key, signature, slen, hash, 20) != 1)
Line 201 
Line 202 
         Key *server_host_key;          Key *server_host_key;
         u_char *kbuf, *hash, *signature = NULL, *server_host_key_blob = NULL;          u_char *kbuf, *hash, *signature = NULL, *server_host_key_blob = NULL;
         u_int sbloblen, klen, kout;          u_int sbloblen, klen, kout;
         int dlen, slen, plen;          u_int slen;
   
         /* generate server DH public key */          /* generate server DH public key */
         dh = dh_new_group1();          dh = dh_new_group1();
         dh_gen_key(dh, kex->we_need * 8);          dh_gen_key(dh, kex->we_need * 8);
   
         debug("expecting SSH2_MSG_KEXDH_INIT");          debug("expecting SSH2_MSG_KEXDH_INIT");
         packet_read_expect(&plen, SSH2_MSG_KEXDH_INIT);          packet_read_expect(SSH2_MSG_KEXDH_INIT);
   
         if (kex->load_host_key == NULL)          if (kex->load_host_key == NULL)
                 fatal("Cannot load hostkey");                  fatal("Cannot load hostkey");
Line 217 
Line 218 
                 fatal("Unsupported hostkey type %d", kex->hostkey_type);                  fatal("Unsupported hostkey type %d", kex->hostkey_type);
   
         /* key, cert */          /* key, cert */
         dh_client_pub = BN_new();          if ((dh_client_pub = BN_new()) == NULL)
         if (dh_client_pub == NULL)  
                 fatal("dh_client_pub == NULL");                  fatal("dh_client_pub == NULL");
         packet_get_bignum2(dh_client_pub, &dlen);          packet_get_bignum2(dh_client_pub);
           packet_check_eom();
   
 #ifdef DEBUG_KEXDH  #ifdef DEBUG_KEXDH
         fprintf(stderr, "dh_client_pub= ");          fprintf(stderr, "dh_client_pub= ");
Line 244 
Line 245 
 #ifdef DEBUG_KEXDH  #ifdef DEBUG_KEXDH
         dump_digest("shared secret", kbuf, kout);          dump_digest("shared secret", kbuf, kout);
 #endif  #endif
         shared_secret = BN_new();          if ((shared_secret = BN_new()) == NULL)
                   fatal("kexdh_server: BN_new failed");
         BN_bin2bn(kbuf, kout, shared_secret);          BN_bin2bn(kbuf, kout, shared_secret);
         memset(kbuf, 0, klen);          memset(kbuf, 0, klen);
         xfree(kbuf);          xfree(kbuf);
Line 262 
Line 264 
             dh->pub_key,              dh->pub_key,
             shared_secret              shared_secret
         );          );
         BN_free(dh_client_pub);          BN_clear_free(dh_client_pub);
   
         /* save session id := H */          /* save session id := H */
         /* XXX hashlen depends on KEX */          /* XXX hashlen depends on KEX */
Line 274 
Line 276 
   
         /* sign H */          /* sign H */
         /* XXX hashlen depends on KEX */          /* XXX hashlen depends on KEX */
         key_sign(server_host_key, &signature, &slen, hash, 20);          PRIVSEP(key_sign(server_host_key, &signature, &slen, hash, 20));
   
         /* destroy_sensitive_data(); */          /* destroy_sensitive_data(); */
   

Legend:
Removed from v.1.7  
changed lines
  Added in v.1.7.2.2