Commit aaa42aa0 authored by Marc Hoersken's avatar Marc Hoersken Committed by Daniel Stenberg
Browse files

schannel: Added SSL/TLS support with Microsoft Windows Schannel SSPI

parent 1f635608
Loading
Loading
Loading
Loading

lib/curl_schannel.c

0 → 100644
+848 −0

File added.

Preview size limit exceeded, changes collapsed.

lib/curl_schannel.h

0 → 100644
+65 −0
Original line number Diff line number Diff line
#ifndef HEADER_SCHANNEL_H
#define HEADER_SCHANNEL_H
/***************************************************************************
 *                                  _   _ ____  _
 *  Project                     ___| | | |  _ \| |
 *                             / __| | | | |_) | |
 *                            | (__| |_| |  _ <| |___
 *                             \___|\___/|_| \_\_____|
 *
 * Copyright (C) 2012, Marc Hoersken, <info@marc-hoersken.de>, et al.
 *
 * This software is licensed as described in the file COPYING, which
 * you should have received as part of this distribution. The terms
 * are also available at http://curl.haxx.se/docs/copyright.html.
 *
 * You may opt to use, copy, modify, merge, publish, distribute and/or sell
 * copies of the Software, and permit persons to whom the Software is
 * furnished to do so, under the terms of the COPYING file.
 *
 * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
 * KIND, either express or implied.
 *
 ***************************************************************************/
#include "setup.h"

#ifdef USE_WINDOWS_SSPI
#ifdef USE_SCHANNEL

#ifndef UNISP_NAME_A
#define UNISP_NAME_A "Microsoft Unified Security Protocol Provider"
#endif

CURLcode Curl_schannel_connect(struct connectdata *conn, int sockindex);

CURLcode Curl_schannel_connect_nonblocking(struct connectdata *conn,
                                           int sockindex,
                                           bool *done);

bool Curl_schannel_data_pending(const struct connectdata *conn, int sockindex);
void Curl_schannel_close(struct connectdata *conn, int sockindex);
int Curl_schannel_shutdown(struct connectdata *conn, int sockindex);

int Curl_schannel_init();
void Curl_schannel_cleanup();
size_t Curl_schannel_version(char *buffer, size_t size);

/* API setup for Schannel */
#define curlssl_init Curl_schannel_init
#define curlssl_cleanup Curl_schannel_cleanup
#define curlssl_connect Curl_schannel_connect
#define curlssl_connect_nonblocking Curl_schannel_connect_nonblocking
#define curlssl_session_free(x)  (x=x, CURLE_NOT_BUILT_IN)
#define curlssl_close_all(x) (x=x, CURLE_NOT_BUILT_IN)
#define curlssl_close Curl_schannel_close
#define curlssl_shutdown Curl_schannel_shutdown
#define curlssl_set_engine(x,y) (x=x, y=y, CURLE_NOT_BUILT_IN)
#define curlssl_set_engine_default(x) (x=x, CURLE_NOT_BUILT_IN)
#define curlssl_engines_list(x) (x=x, (struct curl_slist *)NULL)
#define curlssl_version Curl_schannel_version
#define curlssl_check_cxn(x) (x=x, -1)
#define curlssl_data_pending Curl_schannel_data_pending

#endif /* USE_SCHANNEL */
#endif /* USE_WINDOWS_SSPI */
#endif /* HEADER_SCHANNEL_H */
+2 −0
Original line number Diff line number Diff line
@@ -33,6 +33,7 @@
   Curl_nss_ - prefix for NSS ones
   Curl_polarssl_ - prefix for PolarSSL ones
   Curl_cyassl_ - prefix for CyaSSL ones
   Curl_schannel_ - prefix for Schannel SSPI ones

   Note that this source code uses curlssl_* functions, and they are all
   defines/macros #defined by the lib-specific header files.
@@ -57,6 +58,7 @@
#include "polarssl.h" /* PolarSSL versions */
#include "axtls.h"  /* axTLS versions */
#include "cyassl.h"  /* CyaSSL versions */
#include "curl_schannel.h" /* Schannel SSPI version */
#include "sendf.h"
#include "rawstr.h"
#include "url.h"
+17 −0
Original line number Diff line number Diff line
@@ -131,6 +131,11 @@
#undef realloc
#endif /* USE_AXTLS */

#ifdef USE_SCHANNEL
#include <schnlsp.h>
#include "curl_sspi.h"
#endif

#ifdef HAVE_NETINET_IN_H
#include <netinet/in.h>
#endif
@@ -282,6 +287,18 @@ struct ssl_connect_data {
  SSL_CTX* ssl_ctx;
  SSL*     ssl;
#endif /* USE_AXTLS */
#ifdef USE_SCHANNEL
  bool schannel;
  TimeStamp time_stamp;
  CredHandle cred_handle;
  CtxtHandle ctxt_handle;
  SecPkgContext_StreamSizes stream_sizes;
  ssl_connect_state connecting_state;
  size_t encdata_length, decdata_length;
  size_t encdata_offset, decdata_offset;
  unsigned char *encdata_buffer, *decdata_buffer;
  unsigned long req_flags, ret_flags;
#endif /* USE_SCHANNEL */
};

struct ssl_config_data {