gskit: adapt to new ssl proxy parameters
This commit is contained in:
		@@ -289,10 +289,11 @@ static CURLcode set_callback(struct SessionHandle *data,
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
static CURLcode set_ciphers(struct SessionHandle *data,
 | 
			
		||||
static CURLcode set_ciphers(struct connectdata *conn,
 | 
			
		||||
                                        gsk_handle h, unsigned int *protoflags)
 | 
			
		||||
{
 | 
			
		||||
  const char *cipherlist = data->set.str[STRING_SSL_CIPHER_LIST];
 | 
			
		||||
  struct SessionHandle *data = conn->data;
 | 
			
		||||
  const char *cipherlist = SSL_CONN_CONFIG(cipher_list);
 | 
			
		||||
  const char *clp;
 | 
			
		||||
  const gskit_cipher *ctp;
 | 
			
		||||
  int i;
 | 
			
		||||
@@ -501,16 +502,16 @@ static void close_async_handshake(struct ssl_connect_data *connssl)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
static void close_one(struct ssl_connect_data *conn,
 | 
			
		||||
static void close_one(struct ssl_connect_data *connssl,
 | 
			
		||||
                      struct SessionHandle *data)
 | 
			
		||||
{
 | 
			
		||||
  if(conn->handle) {
 | 
			
		||||
    gskit_status(data, gsk_secure_soc_close(&conn->handle),
 | 
			
		||||
  if(connssl->handle) {
 | 
			
		||||
    gskit_status(data, gsk_secure_soc_close(&connssl->handle),
 | 
			
		||||
              "gsk_secure_soc_close()", 0);
 | 
			
		||||
    conn->handle = (gsk_handle) NULL;
 | 
			
		||||
    connssl->handle = (gsk_handle) NULL;
 | 
			
		||||
  }
 | 
			
		||||
  if(conn->iocport >= 0)
 | 
			
		||||
    close_async_handshake(conn);
 | 
			
		||||
  if(connssl->iocport >= 0)
 | 
			
		||||
    close_async_handshake(connssl);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@@ -560,14 +561,28 @@ static CURLcode gskit_connect_step1(struct connectdata *conn, int sockindex)
 | 
			
		||||
  gsk_handle envir;
 | 
			
		||||
  CURLcode result;
 | 
			
		||||
  int rc;
 | 
			
		||||
  char *keyringfile;
 | 
			
		||||
  char *keyringpwd;
 | 
			
		||||
  char *keyringlabel;
 | 
			
		||||
  char *sni;
 | 
			
		||||
  const char * const keyringfile = SSL_CONN_CONFIG(CAfile);
 | 
			
		||||
  const char * const keyringpwd = SSL_SET_OPTION(key_passwd);
 | 
			
		||||
  const char * const keyringlabel = SSL_SET_OPTION(cert);
 | 
			
		||||
  const long int ssl_version = SSL_CONN_CONFIG(version);
 | 
			
		||||
  const bool verifypeer = SSL_CONN_CONFIG(verifypeer);
 | 
			
		||||
  const char * const hostname = SSL_IS_PROXY()? conn->http_proxy.host.name:
 | 
			
		||||
    conn->host.name;
 | 
			
		||||
  const char *sni;
 | 
			
		||||
  unsigned int protoflags;
 | 
			
		||||
  long timeout;
 | 
			
		||||
  Qso_OverlappedIO_t commarea;
 | 
			
		||||
 | 
			
		||||
  /* GSKit does not feature an easy way to manipulate the encrypted data,
 | 
			
		||||
     thus SSL stacking is not yet implemented.
 | 
			
		||||
     GSKit always reads/writes the encrypted data from/to a file descriptor:
 | 
			
		||||
     the stacking could therefore be implemented via a socketpair() and
 | 
			
		||||
     and by periodically calling an interface procedure (no threads, no fork on
 | 
			
		||||
     OS/400 in interactive mode). */
 | 
			
		||||
 | 
			
		||||
  if(conn->proxy_ssl[sockindex].use)
 | 
			
		||||
    return CURLE_UNSUPPORTED_PROTOCOL;
 | 
			
		||||
 | 
			
		||||
  /* Create SSL environment, start (preferably asynchronous) handshake. */
 | 
			
		||||
 | 
			
		||||
  connssl->handle = (gsk_handle) NULL;
 | 
			
		||||
@@ -586,9 +601,6 @@ static CURLcode gskit_connect_step1(struct connectdata *conn, int sockindex)
 | 
			
		||||
   *  application identifier mode is tried first, as recommended in IBM doc.
 | 
			
		||||
   */
 | 
			
		||||
 | 
			
		||||
  keyringfile = data->set.str[STRING_SSL_CAFILE];
 | 
			
		||||
  keyringpwd = data->set.str[STRING_KEY_PASSWD];
 | 
			
		||||
  keyringlabel = data->set.str[STRING_CERT];
 | 
			
		||||
  envir = (gsk_handle) NULL;
 | 
			
		||||
 | 
			
		||||
  if(keyringlabel && *keyringlabel && !keyringpwd &&
 | 
			
		||||
@@ -616,15 +628,15 @@ static CURLcode gskit_connect_step1(struct connectdata *conn, int sockindex)
 | 
			
		||||
  /* Determine which SSL/TLS version should be enabled. */
 | 
			
		||||
  protoflags = CURL_GSKPROTO_TLSV10_MASK | CURL_GSKPROTO_TLSV11_MASK |
 | 
			
		||||
               CURL_GSKPROTO_TLSV12_MASK;
 | 
			
		||||
  sni = conn->host.name;
 | 
			
		||||
  switch (data->set.ssl.version) {
 | 
			
		||||
  sni = hostname;
 | 
			
		||||
  switch (ssl_version) {
 | 
			
		||||
  case CURL_SSLVERSION_SSLv2:
 | 
			
		||||
    protoflags = CURL_GSKPROTO_SSLV2_MASK;
 | 
			
		||||
    sni = (char *) NULL;
 | 
			
		||||
    sni = NULL;
 | 
			
		||||
    break;
 | 
			
		||||
  case CURL_SSLVERSION_SSLv3:
 | 
			
		||||
    protoflags = CURL_GSKPROTO_SSLV3_MASK;
 | 
			
		||||
    sni = (char *) NULL;
 | 
			
		||||
    sni = NULL;
 | 
			
		||||
    break;
 | 
			
		||||
  case CURL_SSLVERSION_TLSv1:
 | 
			
		||||
    protoflags = CURL_GSKPROTO_TLSV10_MASK |
 | 
			
		||||
@@ -663,7 +675,7 @@ static CURLcode gskit_connect_step1(struct connectdata *conn, int sockindex)
 | 
			
		||||
  if(!result)
 | 
			
		||||
    result = set_numeric(data, connssl->handle, GSK_FD, conn->sock[sockindex]);
 | 
			
		||||
  if(!result)
 | 
			
		||||
    result = set_ciphers(data, connssl->handle, &protoflags);
 | 
			
		||||
    result = set_ciphers(conn, connssl->handle, &protoflags);
 | 
			
		||||
  if(!protoflags) {
 | 
			
		||||
    failf(data, "No SSL protocol/cipher combination enabled");
 | 
			
		||||
    result = CURLE_SSL_CIPHER;
 | 
			
		||||
@@ -706,7 +718,7 @@ static CURLcode gskit_connect_step1(struct connectdata *conn, int sockindex)
 | 
			
		||||
  }
 | 
			
		||||
  if(!result)
 | 
			
		||||
    result = set_enum(data, connssl->handle, GSK_SERVER_AUTH_TYPE,
 | 
			
		||||
                      data->set.ssl.verifypeer? GSK_SERVER_AUTH_FULL:
 | 
			
		||||
                      verifypeer? GSK_SERVER_AUTH_FULL:
 | 
			
		||||
                      GSK_SERVER_AUTH_PASSTHRU, FALSE);
 | 
			
		||||
 | 
			
		||||
  if(!result) {
 | 
			
		||||
@@ -977,10 +989,9 @@ CURLcode Curl_gskit_connect(struct connectdata *conn, int sockindex)
 | 
			
		||||
void Curl_gskit_close(struct connectdata *conn, int sockindex)
 | 
			
		||||
{
 | 
			
		||||
  struct SessionHandle *data = conn->data;
 | 
			
		||||
  struct ssl_connect_data *connssl = &conn->ssl[sockindex];
 | 
			
		||||
 | 
			
		||||
  if(connssl->use)
 | 
			
		||||
    close_one(connssl, data);
 | 
			
		||||
  close_one(&conn->ssl[sockindex], data);
 | 
			
		||||
  close_one(&conn->proxy_ssl[sockindex], data);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -1063,6 +1063,11 @@ CURLcode Curl_verifyhost(struct connectdata * conn,
 | 
			
		||||
  int matched = -1;
 | 
			
		||||
  size_t addrlen = (size_t) -1;
 | 
			
		||||
  ssize_t len;
 | 
			
		||||
  const char * const hostname = SSL_IS_PROXY()? conn->http_proxy.host.name:
 | 
			
		||||
                                                conn->host.name;
 | 
			
		||||
  const char * const dispname = SSL_IS_PROXY()?
 | 
			
		||||
                                  conn->http_proxy.host.dispname:
 | 
			
		||||
                                  conn->host.dispname;
 | 
			
		||||
#ifdef ENABLE_IPV6
 | 
			
		||||
  struct in6_addr addr;
 | 
			
		||||
#else
 | 
			
		||||
@@ -1072,7 +1077,7 @@ CURLcode Curl_verifyhost(struct connectdata * conn,
 | 
			
		||||
  /* Verify that connection server matches info in X509 certificate at
 | 
			
		||||
     `beg'..`end'. */
 | 
			
		||||
 | 
			
		||||
  if(!data->set.ssl.verifyhost)
 | 
			
		||||
  if(!SSL_CONN_CONFIG(verifyhost))
 | 
			
		||||
    return CURLE_OK;
 | 
			
		||||
 | 
			
		||||
  if(!beg)
 | 
			
		||||
@@ -1081,11 +1086,11 @@ CURLcode Curl_verifyhost(struct connectdata * conn,
 | 
			
		||||
 | 
			
		||||
  /* Get the server IP address. */
 | 
			
		||||
#ifdef ENABLE_IPV6
 | 
			
		||||
  if(conn->bits.ipv6_ip && Curl_inet_pton(AF_INET6, conn->host.name, &addr))
 | 
			
		||||
  if(conn->bits.ipv6_ip && Curl_inet_pton(AF_INET6, hostname, &addr))
 | 
			
		||||
    addrlen = sizeof(struct in6_addr);
 | 
			
		||||
  else
 | 
			
		||||
#endif
 | 
			
		||||
  if(Curl_inet_pton(AF_INET, conn->host.name, &addr))
 | 
			
		||||
  if(Curl_inet_pton(AF_INET, hostname, &addr))
 | 
			
		||||
    addrlen = sizeof(struct in_addr);
 | 
			
		||||
 | 
			
		||||
  /* Process extensions. */
 | 
			
		||||
@@ -1110,7 +1115,7 @@ CURLcode Curl_verifyhost(struct connectdata * conn,
 | 
			
		||||
                            name.beg, name.end);
 | 
			
		||||
          if(len > 0)
 | 
			
		||||
            if(strlen(dnsname) == (size_t) len)
 | 
			
		||||
              i = Curl_cert_hostcheck((const char *) dnsname, conn->host.name);
 | 
			
		||||
              i = Curl_cert_hostcheck((const char *) dnsname, hostname);
 | 
			
		||||
          free(dnsname);
 | 
			
		||||
          if(!i)
 | 
			
		||||
            return CURLE_PEER_FAILED_VERIFICATION;
 | 
			
		||||
@@ -1129,12 +1134,12 @@ CURLcode Curl_verifyhost(struct connectdata * conn,
 | 
			
		||||
  switch (matched) {
 | 
			
		||||
  case 1:
 | 
			
		||||
    /* an alternative name matched the server hostname */
 | 
			
		||||
    infof(data, "\t subjectAltName: %s matched\n", conn->host.dispname);
 | 
			
		||||
    infof(data, "\t subjectAltName: %s matched\n", dispname);
 | 
			
		||||
    return CURLE_OK;
 | 
			
		||||
  case 0:
 | 
			
		||||
    /* an alternative name field existed, but didn't match and then
 | 
			
		||||
       we MUST fail */
 | 
			
		||||
    infof(data, "\t subjectAltName does not match %s\n", conn->host.dispname);
 | 
			
		||||
    infof(data, "\t subjectAltName does not match %s\n", dispname);
 | 
			
		||||
    return CURLE_PEER_FAILED_VERIFICATION;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
@@ -1166,14 +1171,14 @@ CURLcode Curl_verifyhost(struct connectdata * conn,
 | 
			
		||||
    }
 | 
			
		||||
    if(strlen(dnsname) != (size_t) len)         /* Nul byte in string ? */
 | 
			
		||||
      failf(data, "SSL: illegal cert name field");
 | 
			
		||||
    else if(Curl_cert_hostcheck((const char *) dnsname, conn->host.name)) {
 | 
			
		||||
    else if(Curl_cert_hostcheck((const char *) dnsname, hostname)) {
 | 
			
		||||
      infof(data, "\t common name: %s (matched)\n", dnsname);
 | 
			
		||||
      free(dnsname);
 | 
			
		||||
      return CURLE_OK;
 | 
			
		||||
    }
 | 
			
		||||
    else
 | 
			
		||||
      failf(data, "SSL: certificate subject name '%s' does not match "
 | 
			
		||||
            "target host name '%s'", dnsname, conn->host.dispname);
 | 
			
		||||
            "target host name '%s'", dnsname, dispname);
 | 
			
		||||
    free(dnsname);
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user