Merge branch 'vendor/OPENSSH'
authorPeter Avalos <pavalos@dragonflybsd.org>
Sat, 9 Apr 2011 06:57:29 +0000 (23:57 -0700)
committerPeter Avalos <pavalos@dragonflybsd.org>
Sat, 9 Apr 2011 06:57:29 +0000 (23:57 -0700)
34 files changed:
1  2 
crypto/openssh/auth-rsa.c
crypto/openssh/auth2-pubkey.c
crypto/openssh/auth2.c
crypto/openssh/authfile.c
crypto/openssh/buffer.h
crypto/openssh/channels.c
crypto/openssh/clientloop.c
crypto/openssh/kex.c
crypto/openssh/kex.h
crypto/openssh/loginrec.c
crypto/openssh/myproposal.h
crypto/openssh/packet.c
crypto/openssh/packet.h
crypto/openssh/pathnames.h
crypto/openssh/readconf.c
crypto/openssh/readconf.h
crypto/openssh/scp.c
crypto/openssh/servconf.c
crypto/openssh/servconf.h
crypto/openssh/session.c
crypto/openssh/sftp.1
crypto/openssh/sftp.c
crypto/openssh/ssh-agent.c
crypto/openssh/ssh-keygen.c
crypto/openssh/ssh.1
crypto/openssh/ssh.c
crypto/openssh/ssh_config.5
crypto/openssh/sshconnect.c
crypto/openssh/sshconnect2.c
crypto/openssh/sshd.8
crypto/openssh/sshd.c
crypto/openssh/sshd_config
crypto/openssh/sshd_config.5
crypto/openssh/sshlogin.c

@@@ -251,19 -246,10 +248,23 @@@ auth_rsa_key_allowed(struct passwd *pw
                            "actual %d vs. announced %d.",
                            file, linenum, BN_num_bits(key->rsa->n), bits);
  
+               /* Never accept a revoked key */
+               if (auth_key_is_revoked(key))
+                       break;
 +              if (blacklisted_key(key)) {
 +                      fp = key_fingerprint(key, SSH_FP_MD5, SSH_FP_HEX);
 +                      if (options.permit_blacklisted_keys)
 +                              logit("Public key %s blacklisted (see "
 +                                  "ssh-vulnkey(1)); continuing anyway", fp);
 +                      else
 +                              logit("Public key %s blacklisted (see "
 +                                  "ssh-vulnkey(1))", fp);
 +                      xfree(fp);
 +                      if (!options.permit_blacklisted_keys)
 +                              continue;
 +              }
 +
                /* We have found the desired key. */
                /*
                 * If our options do not allow this key to be used,
Simple merge
@@@ -232,15 -221,10 +232,15 @@@ input_userauth_request(int type, u_int3
        if (authctxt == NULL)
                fatal("input_userauth_request: no authctxt");
  
-       user = packet_get_string(NULL);
-       service = packet_get_string(NULL);
-       method = packet_get_string(NULL);
+       user = packet_get_cstring(NULL);
+       service = packet_get_cstring(NULL);
+       method = packet_get_cstring(NULL);
        debug("userauth-request for user %s service %s method %s", user, service, method);
 +      if (!log_flag) {
 +              logit("SSH: Server;Ltype: Authname;Remote: %s-%d;Name: %s",
 +                    get_remote_ipaddr(), get_remote_port(), user);
 +              log_flag = 1;
 +      }
        debug("attempt %d failures %d", authctxt->attempt, authctxt->failures);
  
        if ((style = strchr(user, ':')) != NULL)
Simple merge
Simple merge
Simple merge
Simple merge
@@@ -63,9 -62,36 +63,37 @@@ extern const EVP_MD *evp_ssh_sha256(voi
  static void kex_kexinit_finish(Kex *);
  static void kex_choose_conf(Kex *);
  
+ /* Validate KEX method name list */
+ int
+ kex_names_valid(const char *names)
+ {
+       char *s, *cp, *p;
+       if (names == NULL || strcmp(names, "") == 0)
+               return 0;
+       s = cp = xstrdup(names);
+       for ((p = strsep(&cp, ",")); p && *p != '\0';
+           (p = strsep(&cp, ","))) {
+               if (strcmp(p, KEX_DHGEX_SHA256) != 0 &&
+                   strcmp(p, KEX_DHGEX_SHA1) != 0 &&
+                   strcmp(p, KEX_DH14) != 0 &&
+                   strcmp(p, KEX_DH1) != 0 &&
+                   (strncmp(p, KEX_ECDH_SHA2_STEM,
+                   sizeof(KEX_ECDH_SHA2_STEM) - 1) != 0 ||
+                   kex_ecdh_name_to_nid(p) == -1)) {
+                       error("Unsupported KEX algorithm \"%.100s\"", p);
+                       xfree(s);
+                       return 0;
+               }
+       }
+       debug3("kex names ok: [%s]", names);
+       xfree(s);
+       return 1;
+ }
  /* put algorithm proposal into buffer */
 -static void
 +/* used in sshconnect.c as well as kex.c */
 +void
  kex_prop2buf(Buffer *b, char *proposal[PROPOSAL_MAX])
  {
        u_int i;
@@@ -132,8 -138,8 +138,10 @@@ struct Kex 
        void    (*kex[KEX_MAX])(Kex *);
  };
  
+ int    kex_names_valid(const char *);
 +void kex_prop2buf(Buffer *, char *proposal[PROPOSAL_MAX]);
 +
  Kex   *kex_setup(char *[PROPOSAL_MAX]);
  void   kex_finish(Kex *);
  
Simple merge
Simple merge
Simple merge
  #include <termios.h>
  
  #include <openssl/bn.h>
+ #ifdef OPENSSL_HAS_ECC
+ #include <openssl/ec.h>
+ #endif
  
 +void
 +packet_request_rekeying(void);
 +
  void     packet_set_connection(int, int);
  void     packet_set_timeout(int, int);
  void     packet_set_nonblocking(void);
Simple merge
@@@ -135,8 -134,8 +137,10 @@@ typedef enum 
        oHashKnownHosts,
        oTunnel, oTunnelDevice, oLocalCommand, oPermitLocalCommand,
        oVisualHostKey, oUseRoaming, oZeroKnowledgePasswordAuthentication,
-       oHPNBufferSize, oDeprecated, oUnsupported
+       oKexAlgorithms, oIPQoS,
 +      oNoneEnabled, oTcpRcvBufPoll, oTcpRcvBuf, oNoneSwitch, oHPNDisabled,
++      oHPNBufferSize,
+       oDeprecated, oUnsupported
  } OpCodes;
  
  /* Textual representations of the tokens. */
@@@ -245,12 -243,8 +249,14 @@@ static struct 
  #else
        { "zeroknowledgepasswordauthentication", oUnsupported },
  #endif
+       { "kexalgorithms", oKexAlgorithms },
+       { "ipqos", oIPQoS },
 +      { "noneenabled", oNoneEnabled },
 +      { "tcprcvbufpoll", oTcpRcvBufPoll },
 +      { "tcprcvbuf", oTcpRcvBuf },
 +      { "noneswitch", oNoneSwitch },
 +      { "hpndisabled", oHPNDisabled },
 +      { "hpnbuffersize", oHPNBufferSize },
  
        { NULL, oBadOption }
  };
@@@ -1173,12 -1155,8 +1209,14 @@@ initialize_options(Options * options
        options->use_roaming = -1;
        options->visual_host_key = -1;
        options->zero_knowledge_password_authentication = -1;
+       options->ip_qos_interactive = -1;
+       options->ip_qos_bulk = -1;
 +      options->none_switch = -1;
 +      options->none_enabled = -1;
 +      options->hpn_disabled = -1;
 +      options->hpn_buffer_size = -1;
 +      options->tcp_rcv_buf_poll = -1;
 +      options->tcp_rcv_buf = -1;
  }
  
  /*
@@@ -59,11 -59,8 +59,12 @@@ typedef struct 
        int     compression_level;      /* Compression level 1 (fast) to 9
                                         * (best). */
        int     tcp_keep_alive; /* Set SO_KEEPALIVE. */
 +        int     tcp_rcv_buf; /* user switch to set tcp recv buffer */
 +      int     tcp_rcv_buf_poll; /* Option to poll recv buf every window transfer */
 +      int     hpn_disabled;    /* Switch to disable HPN buffer management */
 +      int     hpn_buffer_size; /* User definable size for HPN buffer window */
+       int     ip_qos_interactive;     /* IP ToS/DSCP/class for interactive */
+       int     ip_qos_bulk;            /* IP ToS/DSCP/class for bulk traffic */
        LogLevel log_level;     /* Level for logging. */
  
        int     port;           /* Port to connect. */
Simple merge
@@@ -279,43 -277,11 +290,47 @@@ fill_default_server_options(ServerOptio
                options->permit_tun = SSH_TUNMODE_NO;
        if (options->zero_knowledge_password_authentication == -1)
                options->zero_knowledge_password_authentication = 0;
+       if (options->ip_qos_interactive == -1)
+               options->ip_qos_interactive = IPTOS_LOWDELAY;
+       if (options->ip_qos_bulk == -1)
+               options->ip_qos_bulk = IPTOS_THROUGHPUT;
  
 +      if (options->hpn_disabled == -1)
 +              options->hpn_disabled = 0;
 +
 +      if (options->hpn_buffer_size == -1) {
 +              /* option not explicitly set. Now we have to figure out */
 +              /* what value to use */
 +              if (options->hpn_disabled == 1) {
 +                      options->hpn_buffer_size = CHAN_SES_WINDOW_DEFAULT;
 +              } else {
 +                      /* get the current RCV size and set it to that */
 +                      /*create a socket but don't connect it */
 +                      /* we use that the get the rcv socket size */
 +                      sock = socket(AF_INET, SOCK_STREAM, 0);
 +                      getsockopt(sock, SOL_SOCKET, SO_RCVBUF,
 +                                 &socksize, &socksizelen);
 +                      close(sock);
 +                      options->hpn_buffer_size = socksize;
 +                      debug ("HPN Buffer Size: %d", options->hpn_buffer_size);
 +
 +              }
 +      } else {
 +              /* we have to do this incase the user sets both values in a contradictory */
 +              /* manner. hpn_disabled overrrides hpn_buffer_size*/
 +              if (options->hpn_disabled <= 0) {
 +                      if (options->hpn_buffer_size == 0)
 +                              options->hpn_buffer_size = 1;
 +                      /* limit the maximum buffer to 64MB */
 +                      if (options->hpn_buffer_size > 64*1024) {
 +                              options->hpn_buffer_size = 64*1024*1024;
 +                      } else {
 +                              options->hpn_buffer_size *= 1024;
 +                      }
 +              } else
 +                      options->hpn_buffer_size = CHAN_TCP_WINDOW_DEFAULT;
 +      }
 +
        /* Turn privilege separation on by default */
        if (use_privsep == -1)
                use_privsep = 1;
@@@ -361,8 -327,7 +376,9 @@@ typedef enum 
        sUsePrivilegeSeparation, sAllowAgentForwarding,
        sZeroKnowledgePasswordAuthentication, sHostCertificate,
        sRevokedKeys, sTrustedUserCAKeys, sAuthorizedPrincipalsFile,
+       sKexAlgorithms, sIPQoS,
 +      sNoneEnabled, sTcpRcvBufPoll, sHPNDisabled, sHPNBufferSize,
 +      sVersionAddendum,
        sDeprecated, sUnsupported
  } ServerOpCodes;
  
@@@ -487,10 -450,8 +503,12 @@@ static struct 
        { "revokedkeys", sRevokedKeys, SSHCFG_ALL },
        { "trustedusercakeys", sTrustedUserCAKeys, SSHCFG_ALL },
        { "authorizedprincipalsfile", sAuthorizedPrincipalsFile, SSHCFG_ALL },
 +      { "noneenabled", sNoneEnabled },
 +      { "hpndisabled", sHPNDisabled },
 +      { "hpnbuffersize", sHPNBufferSize },
 +      { "tcprcvbufpoll", sTcpRcvBufPoll },
+       { "kexalgorithms", sKexAlgorithms, SSHCFG_GLOBAL },
+       { "ipqos", sIPQoS, SSHCFG_ALL },
        { NULL, sBadOption, 0 }
  };
  
Simple merge
Simple merge
Simple merge
Simple merge
Simple merge
@@@ -1448,10 -1478,10 +1478,10 @@@ do_ca_sign(struct passwd *pw, int argc
                fclose(f);
  
                if (!quiet) {
 -                      logit("Signed %s key %s: id \"%s\" serial %llu%s%s "
 +                      logit("Signed %s key %s: id \"%s\" serial %ju%s%s "
                            "valid %s", key_cert_type(public), 
                            out, public->cert->key_id,
-                           (intmax_t)public->cert->serial,
+                           (unsigned long long)public->cert->serial,
                            cert_principals != NULL ? " for " : "",
                            cert_principals != NULL ? cert_principals : "",
                            fmt_validity(cert_valid_from, cert_valid_to));
@@@ -1337,7 -1341,7 +1342,7 @@@ manual page for more information
  This file is for host-based authentication (see above).
  It should only be writable by root.
  .Pp
- .It /etc/ssh/shosts.equiv
 -.It Pa /etc/shosts.equiv
++.It Pa /etc/ssh/shosts.equiv
  This file is used in exactly the same way as
  .Pa hosts.equiv ,
  but allows host-based authentication without permitting login with
Simple merge
Simple merge
@@@ -167,32 -170,18 +170,43 @@@ ssh_proxy_connect(const char *host, u_s
        return 0;
  }
  
+ void
+ ssh_kill_proxy_command(void)
+ {
+       /*
+        * Send SIGHUP to proxy command if used. We don't wait() in
+        * case it hangs and instead rely on init to reap the child
+        */
+       if (proxy_command_pid > 1)
+               kill(proxy_command_pid, SIGHUP);
+ }
  /*
 + * Set TCP receive buffer if requested.
 + * Note: tuning needs to happen after the socket is
 + * created but before the connection happens
 + * so winscale is negotiated properly -cjr
 + */
 +static void
 +ssh_set_socket_recvbuf(int sock)
 +{
 +      void *buf = (void *)&options.tcp_rcv_buf;
 +      int sz = sizeof(options.tcp_rcv_buf);
 +      int socksize;
 +      int socksizelen = sizeof(int);
 +
 +      debug("setsockopt Attempting to set SO_RCVBUF to %d", options.tcp_rcv_buf);
 +      if (setsockopt(sock, SOL_SOCKET, SO_RCVBUF, buf, sz) >= 0) {
 +        getsockopt(sock, SOL_SOCKET, SO_RCVBUF, &socksize, &socksizelen);
 +        debug("setsockopt SO_RCVBUF: %.100s %d", strerror(errno), socksize);
 +      }
 +      else
 +              error("Couldn't set socket receive buffer to %d: %.100s",
 +                  options.tcp_rcv_buf, strerror(errno));
 +}
 +
 +
 +/*
   * Creates a (possibly privileged) socket for use as the ssh connection.
   */
  static int
Simple merge
@@@ -847,7 -850,7 +852,7 @@@ This file is for host-based authenticat
  .Xr ssh 1 ) .
  It should only be writable by root.
  .Pp
- .It /etc/ssh/moduli
 -.It Pa /etc/moduli
++.It Pa /etc/ssh/moduli
  Contains Diffie-Hellman groups used for the "Diffie-Hellman Group Exchange".
  The file format is described in
  .Xr moduli 5 .
@@@ -865,7 -868,7 +870,7 @@@ are displayed to anyone trying to log i
  refused.
  The file should be world-readable.
  .Pp
- .It /etc/ssh/shosts.equiv
 -.It Pa /etc/shosts.equiv
++.It Pa /etc/ssh/shosts.equiv
  This file is used in exactly the same way as
  .Pa hosts.equiv ,
  but allows host-based authentication without permitting login with
Simple merge
Simple merge
Simple merge
Simple merge