gnutls has been the default since wine-6.11.
Signed-off-by: Gijs Vermeulen gijsvrm@gmail.com --- dlls/secur32/Makefile.in | 3 +- dlls/secur32/schannel_macosx.c | 1278 -------------------------------- 2 files changed, 1 insertion(+), 1280 deletions(-) delete mode 100644 dlls/secur32/schannel_macosx.c
diff --git a/dlls/secur32/Makefile.in b/dlls/secur32/Makefile.in index a5aa3b52691..d298181573f 100644 --- a/dlls/secur32/Makefile.in +++ b/dlls/secur32/Makefile.in @@ -3,14 +3,13 @@ IMPORTLIB = secur32 IMPORTS = advapi32 DELAYIMPORTS = crypt32 EXTRAINCL = $(GNUTLS_CFLAGS) -EXTRALIBS = $(SECURITY_LIBS) $(PTHREAD_LIBS) +EXTRALIBS = $(PTHREAD_LIBS)
C_SRCS = \ lsa.c \ negotiate.c \ schannel.c \ schannel_gnutls.c \ - schannel_macosx.c \ secur32.c \ thunks.c \ wrapper.c diff --git a/dlls/secur32/schannel_macosx.c b/dlls/secur32/schannel_macosx.c deleted file mode 100644 index f7f7db955ef..00000000000 --- a/dlls/secur32/schannel_macosx.c +++ /dev/null @@ -1,1278 +0,0 @@ -/* - * Mac OS X Secure Transport implementation of the schannel (SSL/TLS) provider. - * - * Copyright 2005 Juan Lang - * Copyright 2008 Henri Verbeet - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2.1 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA - */ - -#if 0 -#pragma makedep unix -#endif - -#include "config.h" -#include "wine/port.h" - -#include <stdarg.h> -#include <pthread.h> -#ifdef HAVE_SECURITY_SECURITY_H -#include <Security/Security.h> -#define GetCurrentThread GetCurrentThread_Mac -#define LoadResource LoadResource_Mac -#include <CoreServices/CoreServices.h> -#undef GetCurrentThread -#undef LoadResource -#endif - -#include "ntstatus.h" -#define WIN32_NO_STATUS -#include "windef.h" -#include "winbase.h" -#include "sspi.h" -#include "schannel.h" -#include "winternl.h" -#include "secur32_priv.h" -#include "wine/debug.h" - -#if defined(HAVE_SECURITY_SECURITY_H) && !defined(SONAME_LIBGNUTLS) - -WINE_DEFAULT_DEBUG_CHANNEL(secur32); - -static const struct schan_callbacks *callbacks; - -#if MAC_OS_X_VERSION_MAX_ALLOWED < 1060 -/* Defined in <Security/CipherSuite.h> in the 10.6 SDK or later. */ -enum { - TLS_ECDH_ECDSA_WITH_NULL_SHA = 0xC001, - TLS_ECDH_ECDSA_WITH_RC4_128_SHA = 0xC002, - TLS_ECDH_ECDSA_WITH_3DES_EDE_CBC_SHA = 0xC003, - TLS_ECDH_ECDSA_WITH_AES_128_CBC_SHA = 0xC004, - TLS_ECDH_ECDSA_WITH_AES_256_CBC_SHA = 0xC005, - TLS_ECDHE_ECDSA_WITH_NULL_SHA = 0xC006, - TLS_ECDHE_ECDSA_WITH_RC4_128_SHA = 0xC007, - TLS_ECDHE_ECDSA_WITH_3DES_EDE_CBC_SHA = 0xC008, - TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA = 0xC009, - TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA = 0xC00A, - TLS_ECDH_RSA_WITH_NULL_SHA = 0xC00B, - TLS_ECDH_RSA_WITH_RC4_128_SHA = 0xC00C, - TLS_ECDH_RSA_WITH_3DES_EDE_CBC_SHA = 0xC00D, - TLS_ECDH_RSA_WITH_AES_128_CBC_SHA = 0xC00E, - TLS_ECDH_RSA_WITH_AES_256_CBC_SHA = 0xC00F, - TLS_ECDHE_RSA_WITH_NULL_SHA = 0xC010, - TLS_ECDHE_RSA_WITH_RC4_128_SHA = 0xC011, - TLS_ECDHE_RSA_WITH_3DES_EDE_CBC_SHA = 0xC012, - TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA = 0xC013, - TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA = 0xC014, - TLS_ECDH_anon_WITH_NULL_SHA = 0xC015, - TLS_ECDH_anon_WITH_RC4_128_SHA = 0xC016, - TLS_ECDH_anon_WITH_3DES_EDE_CBC_SHA = 0xC017, - TLS_ECDH_anon_WITH_AES_128_CBC_SHA = 0xC018, - TLS_ECDH_anon_WITH_AES_256_CBC_SHA = 0xC019, -}; -#endif - -#if MAC_OS_X_VERSION_MAX_ALLOWED < 1080 -/* Defined in <Security/CipherSuite.h> in the 10.8 SDK or later. */ -enum { - TLS_NULL_WITH_NULL_NULL = 0x0000, - TLS_RSA_WITH_NULL_MD5 = 0x0001, - TLS_RSA_WITH_NULL_SHA = 0x0002, - TLS_RSA_WITH_RC4_128_MD5 = 0x0004, - TLS_RSA_WITH_RC4_128_SHA = 0x0005, - TLS_RSA_WITH_3DES_EDE_CBC_SHA = 0x000A, - TLS_RSA_WITH_NULL_SHA256 = 0x003B, - TLS_RSA_WITH_AES_128_CBC_SHA256 = 0x003C, - TLS_RSA_WITH_AES_256_CBC_SHA256 = 0x003D, - TLS_DH_DSS_WITH_3DES_EDE_CBC_SHA = 0x000D, - TLS_DH_RSA_WITH_3DES_EDE_CBC_SHA = 0x0010, - TLS_DHE_DSS_WITH_3DES_EDE_CBC_SHA = 0x0013, - TLS_DHE_RSA_WITH_3DES_EDE_CBC_SHA = 0x0016, - TLS_DH_DSS_WITH_AES_128_CBC_SHA256 = 0x003E, - TLS_DH_RSA_WITH_AES_128_CBC_SHA256 = 0x003F, - TLS_DHE_DSS_WITH_AES_128_CBC_SHA256 = 0x0040, - TLS_DHE_RSA_WITH_AES_128_CBC_SHA256 = 0x0067, - TLS_DH_DSS_WITH_AES_256_CBC_SHA256 = 0x0068, - TLS_DH_RSA_WITH_AES_256_CBC_SHA256 = 0x0069, - TLS_DHE_DSS_WITH_AES_256_CBC_SHA256 = 0x006A, - TLS_DHE_RSA_WITH_AES_256_CBC_SHA256 = 0x006B, - TLS_DH_anon_WITH_RC4_128_MD5 = 0x0018, - TLS_DH_anon_WITH_3DES_EDE_CBC_SHA = 0x001B, - TLS_DH_anon_WITH_AES_128_CBC_SHA256 = 0x006C, - TLS_DH_anon_WITH_AES_256_CBC_SHA256 = 0x006D, - TLS_RSA_WITH_AES_128_GCM_SHA256 = 0x009C, - TLS_RSA_WITH_AES_256_GCM_SHA384 = 0x009D, - TLS_DHE_RSA_WITH_AES_128_GCM_SHA256 = 0x009E, - TLS_DHE_RSA_WITH_AES_256_GCM_SHA384 = 0x009F, - TLS_DH_RSA_WITH_AES_128_GCM_SHA256 = 0x00A0, - TLS_DH_RSA_WITH_AES_256_GCM_SHA384 = 0x00A1, - TLS_DHE_DSS_WITH_AES_128_GCM_SHA256 = 0x00A2, - TLS_DHE_DSS_WITH_AES_256_GCM_SHA384 = 0x00A3, - TLS_DH_DSS_WITH_AES_128_GCM_SHA256 = 0x00A4, - TLS_DH_DSS_WITH_AES_256_GCM_SHA384 = 0x00A5, - TLS_DH_anon_WITH_AES_128_GCM_SHA256 = 0x00A6, - TLS_DH_anon_WITH_AES_256_GCM_SHA384 = 0x00A7, - TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256 = 0xC023, - TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA384 = 0xC024, - TLS_ECDH_ECDSA_WITH_AES_128_CBC_SHA256 = 0xC025, - TLS_ECDH_ECDSA_WITH_AES_256_CBC_SHA384 = 0xC026, - TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256 = 0xC027, - TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384 = 0xC028, - TLS_ECDH_RSA_WITH_AES_128_CBC_SHA256 = 0xC029, - TLS_ECDH_RSA_WITH_AES_256_CBC_SHA384 = 0xC02A, - TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256 = 0xC02B, - TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384 = 0xC02C, - TLS_ECDH_ECDSA_WITH_AES_128_GCM_SHA256 = 0xC02D, - TLS_ECDH_ECDSA_WITH_AES_256_GCM_SHA384 = 0xC02E, - TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 = 0xC02F, - TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 = 0xC030, - TLS_ECDH_RSA_WITH_AES_128_GCM_SHA256 = 0xC031, - TLS_ECDH_RSA_WITH_AES_256_GCM_SHA384 = 0xC032, - TLS_EMPTY_RENEGOTIATION_INFO_SCSV = 0x00FF, -}; - -/* Defined in <Security/SecureTransport.h> in the 10.8 SDK or later. */ -enum { - kTLSProtocol11 = 7, /* TLS 1.1 */ - kTLSProtocol12 = 8, /* TLS 1.2 */ -}; -#endif - -#if MAC_OS_X_VERSION_MAX_ALLOWED < 1090 -/* Defined in <Security/CipherSuite.h> in the 10.9 SDK or later. */ -enum { - TLS_PSK_WITH_RC4_128_SHA = 0x008A, - TLS_PSK_WITH_3DES_EDE_CBC_SHA = 0x008B, - TLS_PSK_WITH_AES_128_CBC_SHA = 0x008C, - TLS_PSK_WITH_AES_256_CBC_SHA = 0x008D, - TLS_DHE_PSK_WITH_RC4_128_SHA = 0x008E, - TLS_DHE_PSK_WITH_3DES_EDE_CBC_SHA = 0x008F, - TLS_DHE_PSK_WITH_AES_128_CBC_SHA = 0x0090, - TLS_DHE_PSK_WITH_AES_256_CBC_SHA = 0x0091, - TLS_RSA_PSK_WITH_RC4_128_SHA = 0x0092, - TLS_RSA_PSK_WITH_3DES_EDE_CBC_SHA = 0x0093, - TLS_RSA_PSK_WITH_AES_128_CBC_SHA = 0x0094, - TLS_RSA_PSK_WITH_AES_256_CBC_SHA = 0x0095, - TLS_PSK_WITH_NULL_SHA = 0x002C, - TLS_DHE_PSK_WITH_NULL_SHA = 0x002D, - TLS_RSA_PSK_WITH_NULL_SHA = 0x002E, - TLS_PSK_WITH_AES_128_GCM_SHA256 = 0x00A8, - TLS_PSK_WITH_AES_256_GCM_SHA384 = 0x00A9, - TLS_DHE_PSK_WITH_AES_128_GCM_SHA256 = 0x00AA, - TLS_DHE_PSK_WITH_AES_256_GCM_SHA384 = 0x00AB, - TLS_RSA_PSK_WITH_AES_128_GCM_SHA256 = 0x00AC, - TLS_RSA_PSK_WITH_AES_256_GCM_SHA384 = 0x00AD, - TLS_PSK_WITH_AES_128_CBC_SHA256 = 0x00AE, - TLS_PSK_WITH_AES_256_CBC_SHA384 = 0x00AF, - TLS_PSK_WITH_NULL_SHA256 = 0x00B0, - TLS_PSK_WITH_NULL_SHA384 = 0x00B1, - TLS_DHE_PSK_WITH_AES_128_CBC_SHA256 = 0x00B2, - TLS_DHE_PSK_WITH_AES_256_CBC_SHA384 = 0x00B3, - TLS_DHE_PSK_WITH_NULL_SHA256 = 0x00B4, - TLS_DHE_PSK_WITH_NULL_SHA384 = 0x00B5, - TLS_RSA_PSK_WITH_AES_128_CBC_SHA256 = 0x00B6, - TLS_RSA_PSK_WITH_AES_256_CBC_SHA384 = 0x00B7, - TLS_RSA_PSK_WITH_NULL_SHA256 = 0x00B8, - TLS_RSA_PSK_WITH_NULL_SHA384 = 0x00B9, -}; -#endif - -enum schan_mode { - schan_mode_NONE, - schan_mode_READ, - schan_mode_WRITE, - schan_mode_HANDSHAKE, -}; - -struct mac_session { - SSLContextRef context; - struct schan_transport *transport; - enum schan_mode mode; - pthread_mutex_t mutex; -}; - -enum { - schan_proto_SSL, - schan_proto_TLS, -}; - -enum { - schan_kx_DH_anon_EXPORT, - schan_kx_DH_anon, - schan_kx_DH_DSS_EXPORT, - schan_kx_DH_DSS, - schan_kx_DH_RSA_EXPORT, - schan_kx_DH_RSA, - schan_kx_DHE_DSS_EXPORT, - schan_kx_DHE_DSS, - schan_kx_DHE_PSK, - schan_kx_DHE_RSA_EXPORT, - schan_kx_DHE_RSA, - schan_kx_ECDH_anon, - schan_kx_ECDH_ECDSA, - schan_kx_ECDH_RSA, - schan_kx_ECDHE_ECDSA, - schan_kx_ECDHE_RSA, - schan_kx_FORTEZZA_DMS, - schan_kx_NULL, - schan_kx_PSK, - schan_kx_RSA_EXPORT, - schan_kx_RSA_PSK, - schan_kx_RSA, -}; - -enum { - schan_enc_3DES_EDE_CBC, - schan_enc_AES_128_CBC, - schan_enc_AES_128_GCM, - schan_enc_AES_256_CBC, - schan_enc_AES_256_GCM, - schan_enc_DES_CBC, - schan_enc_DES40_CBC, - schan_enc_FORTEZZA_CBC, - schan_enc_IDEA_CBC, - schan_enc_NULL, - schan_enc_RC2_CBC, - schan_enc_RC2_CBC_40, - schan_enc_RC4_128, - schan_enc_RC4_40, -}; - -enum { - schan_mac_MD5, - schan_mac_NULL, - schan_mac_SHA, - schan_mac_SHA256, - schan_mac_SHA384, -}; - - -struct cipher_suite { - SSLCipherSuite suite; - int protocol; - int kx_alg; - int enc_alg; - int mac_alg; -}; - -/* This table corresponds to the enum in <Security/CipherSuite.h>. */ -static const struct cipher_suite cipher_suites[] = { -#define CIPHER_SUITE(p, kx, enc, mac) { p##_##kx##_WITH_##enc##_##mac, schan_proto_##p, \ - schan_kx_##kx, schan_enc_##enc, schan_mac_##mac } - CIPHER_SUITE(SSL, RSA, NULL, MD5), - CIPHER_SUITE(SSL, RSA, NULL, MD5), - CIPHER_SUITE(SSL, RSA, NULL, SHA), - CIPHER_SUITE(SSL, RSA_EXPORT, RC4_40, MD5), - CIPHER_SUITE(SSL, RSA, RC4_128, MD5), - CIPHER_SUITE(SSL, RSA, RC4_128, SHA), - CIPHER_SUITE(SSL, RSA_EXPORT, RC2_CBC_40, MD5), - CIPHER_SUITE(SSL, RSA, IDEA_CBC, SHA), - CIPHER_SUITE(SSL, RSA_EXPORT, DES40_CBC, SHA), - CIPHER_SUITE(SSL, RSA, DES_CBC, SHA), - CIPHER_SUITE(SSL, RSA, 3DES_EDE_CBC, SHA), - CIPHER_SUITE(SSL, DH_DSS_EXPORT, DES40_CBC, SHA), - CIPHER_SUITE(SSL, DH_DSS, DES_CBC, SHA), - CIPHER_SUITE(SSL, DH_DSS, 3DES_EDE_CBC, SHA), - CIPHER_SUITE(SSL, DH_RSA_EXPORT, DES40_CBC, SHA), - CIPHER_SUITE(SSL, DH_RSA, DES_CBC, SHA), - CIPHER_SUITE(SSL, DH_RSA, 3DES_EDE_CBC, SHA), - CIPHER_SUITE(SSL, DHE_DSS_EXPORT, DES40_CBC, SHA), - CIPHER_SUITE(SSL, DHE_DSS, DES_CBC, SHA), - CIPHER_SUITE(SSL, DHE_DSS, 3DES_EDE_CBC, SHA), - CIPHER_SUITE(SSL, DHE_RSA_EXPORT, DES40_CBC, SHA), - CIPHER_SUITE(SSL, DHE_RSA, DES_CBC, SHA), - CIPHER_SUITE(SSL, DHE_RSA, 3DES_EDE_CBC, SHA), - CIPHER_SUITE(SSL, DH_anon_EXPORT, RC4_40, MD5), - CIPHER_SUITE(SSL, DH_anon, RC4_128, MD5), - CIPHER_SUITE(SSL, DH_anon_EXPORT, DES40_CBC, SHA), - CIPHER_SUITE(SSL, DH_anon, DES_CBC, SHA), - CIPHER_SUITE(SSL, DH_anon, 3DES_EDE_CBC, SHA), - CIPHER_SUITE(SSL, FORTEZZA_DMS, NULL, SHA), - CIPHER_SUITE(SSL, FORTEZZA_DMS, FORTEZZA_CBC, SHA), - - CIPHER_SUITE(TLS, RSA, AES_128_CBC, SHA), - CIPHER_SUITE(TLS, DH_DSS, AES_128_CBC, SHA), - CIPHER_SUITE(TLS, DH_RSA, AES_128_CBC, SHA), - CIPHER_SUITE(TLS, DHE_DSS, AES_128_CBC, SHA), - CIPHER_SUITE(TLS, DHE_RSA, AES_128_CBC, SHA), - CIPHER_SUITE(TLS, DH_anon, AES_128_CBC, SHA), - CIPHER_SUITE(TLS, RSA, AES_256_CBC, SHA), - CIPHER_SUITE(TLS, DH_DSS, AES_256_CBC, SHA), - CIPHER_SUITE(TLS, DH_RSA, AES_256_CBC, SHA), - CIPHER_SUITE(TLS, DHE_DSS, AES_256_CBC, SHA), - CIPHER_SUITE(TLS, DHE_RSA, AES_256_CBC, SHA), - CIPHER_SUITE(TLS, DH_anon, AES_256_CBC, SHA), - - CIPHER_SUITE(TLS, ECDH_ECDSA, NULL, SHA), - CIPHER_SUITE(TLS, ECDH_ECDSA, RC4_128, SHA), - CIPHER_SUITE(TLS, ECDH_ECDSA, 3DES_EDE_CBC, SHA), - CIPHER_SUITE(TLS, ECDH_ECDSA, AES_128_CBC, SHA), - CIPHER_SUITE(TLS, ECDH_ECDSA, AES_256_CBC, SHA), - CIPHER_SUITE(TLS, ECDHE_ECDSA, NULL, SHA), - CIPHER_SUITE(TLS, ECDHE_ECDSA, RC4_128, SHA), - CIPHER_SUITE(TLS, ECDHE_ECDSA, 3DES_EDE_CBC, SHA), - CIPHER_SUITE(TLS, ECDHE_ECDSA, AES_128_CBC, SHA), - CIPHER_SUITE(TLS, ECDHE_ECDSA, AES_256_CBC, SHA), - CIPHER_SUITE(TLS, ECDH_RSA, NULL, SHA), - CIPHER_SUITE(TLS, ECDH_RSA, RC4_128, SHA), - CIPHER_SUITE(TLS, ECDH_RSA, 3DES_EDE_CBC, SHA), - CIPHER_SUITE(TLS, ECDH_RSA, AES_128_CBC, SHA), - CIPHER_SUITE(TLS, ECDH_RSA, AES_256_CBC, SHA), - CIPHER_SUITE(TLS, ECDHE_RSA, NULL, SHA), - CIPHER_SUITE(TLS, ECDHE_RSA, RC4_128, SHA), - CIPHER_SUITE(TLS, ECDHE_RSA, 3DES_EDE_CBC, SHA), - CIPHER_SUITE(TLS, ECDHE_RSA, AES_128_CBC, SHA), - CIPHER_SUITE(TLS, ECDHE_RSA, AES_256_CBC, SHA), - CIPHER_SUITE(TLS, ECDH_anon, NULL, SHA), - CIPHER_SUITE(TLS, ECDH_anon, RC4_128, SHA), - CIPHER_SUITE(TLS, ECDH_anon, 3DES_EDE_CBC, SHA), - CIPHER_SUITE(TLS, ECDH_anon, AES_128_CBC, SHA), - CIPHER_SUITE(TLS, ECDH_anon, AES_256_CBC, SHA), - - CIPHER_SUITE(TLS, NULL, NULL, NULL), - CIPHER_SUITE(TLS, RSA, NULL, MD5), - CIPHER_SUITE(TLS, RSA, NULL, SHA), - CIPHER_SUITE(TLS, RSA, RC4_128, MD5), - CIPHER_SUITE(TLS, RSA, RC4_128, SHA), - CIPHER_SUITE(TLS, RSA, 3DES_EDE_CBC, SHA), - CIPHER_SUITE(TLS, RSA, NULL, SHA256), - CIPHER_SUITE(TLS, RSA, AES_128_CBC, SHA256), - CIPHER_SUITE(TLS, RSA, AES_256_CBC, SHA256), - CIPHER_SUITE(TLS, DH_DSS, 3DES_EDE_CBC, SHA), - CIPHER_SUITE(TLS, DH_RSA, 3DES_EDE_CBC, SHA), - CIPHER_SUITE(TLS, DHE_DSS, 3DES_EDE_CBC, SHA), - CIPHER_SUITE(TLS, DHE_RSA, 3DES_EDE_CBC, SHA), - CIPHER_SUITE(TLS, DH_DSS, AES_128_CBC, SHA256), - CIPHER_SUITE(TLS, DH_RSA, AES_128_CBC, SHA256), - CIPHER_SUITE(TLS, DHE_DSS, AES_128_CBC, SHA256), - CIPHER_SUITE(TLS, DHE_RSA, AES_128_CBC, SHA256), - CIPHER_SUITE(TLS, DH_DSS, AES_256_CBC, SHA256), - CIPHER_SUITE(TLS, DH_RSA, AES_256_CBC, SHA256), - CIPHER_SUITE(TLS, DHE_DSS, AES_256_CBC, SHA256), - CIPHER_SUITE(TLS, DHE_RSA, AES_256_CBC, SHA256), - CIPHER_SUITE(TLS, DH_anon, RC4_128, MD5), - CIPHER_SUITE(TLS, DH_anon, 3DES_EDE_CBC, SHA), - CIPHER_SUITE(TLS, DH_anon, AES_128_CBC, SHA256), - CIPHER_SUITE(TLS, DH_anon, AES_256_CBC, SHA256), - - CIPHER_SUITE(TLS, PSK, RC4_128, SHA), - CIPHER_SUITE(TLS, PSK, 3DES_EDE_CBC, SHA), - CIPHER_SUITE(TLS, PSK, AES_128_CBC, SHA), - CIPHER_SUITE(TLS, PSK, AES_256_CBC, SHA), - CIPHER_SUITE(TLS, DHE_PSK, RC4_128, SHA), - CIPHER_SUITE(TLS, DHE_PSK, 3DES_EDE_CBC, SHA), - CIPHER_SUITE(TLS, DHE_PSK, AES_128_CBC, SHA), - CIPHER_SUITE(TLS, DHE_PSK, AES_256_CBC, SHA), - CIPHER_SUITE(TLS, RSA_PSK, RC4_128, SHA), - CIPHER_SUITE(TLS, RSA_PSK, 3DES_EDE_CBC, SHA), - CIPHER_SUITE(TLS, RSA_PSK, AES_128_CBC, SHA), - CIPHER_SUITE(TLS, RSA_PSK, AES_256_CBC, SHA), - CIPHER_SUITE(TLS, PSK, NULL, SHA), - CIPHER_SUITE(TLS, DHE_PSK, NULL, SHA), - CIPHER_SUITE(TLS, RSA_PSK, NULL, SHA), - - CIPHER_SUITE(TLS, RSA, AES_128_GCM, SHA256), - CIPHER_SUITE(TLS, RSA, AES_256_GCM, SHA384), - CIPHER_SUITE(TLS, DHE_RSA, AES_128_GCM, SHA256), - CIPHER_SUITE(TLS, DHE_RSA, AES_256_GCM, SHA384), - CIPHER_SUITE(TLS, DH_RSA, AES_128_GCM, SHA256), - CIPHER_SUITE(TLS, DH_RSA, AES_256_GCM, SHA384), - CIPHER_SUITE(TLS, DHE_DSS, AES_128_GCM, SHA256), - CIPHER_SUITE(TLS, DHE_DSS, AES_256_GCM, SHA384), - CIPHER_SUITE(TLS, DH_DSS, AES_128_GCM, SHA256), - CIPHER_SUITE(TLS, DH_DSS, AES_256_GCM, SHA384), - CIPHER_SUITE(TLS, DH_anon, AES_128_GCM, SHA256), - CIPHER_SUITE(TLS, DH_anon, AES_256_GCM, SHA384), - - CIPHER_SUITE(TLS, PSK, AES_128_GCM, SHA256), - CIPHER_SUITE(TLS, PSK, AES_256_GCM, SHA384), - CIPHER_SUITE(TLS, DHE_PSK, AES_128_GCM, SHA256), - CIPHER_SUITE(TLS, DHE_PSK, AES_256_GCM, SHA384), - CIPHER_SUITE(TLS, RSA_PSK, AES_128_GCM, SHA256), - CIPHER_SUITE(TLS, RSA_PSK, AES_256_GCM, SHA384), - CIPHER_SUITE(TLS, PSK, AES_128_CBC, SHA256), - CIPHER_SUITE(TLS, PSK, AES_256_CBC, SHA384), - CIPHER_SUITE(TLS, PSK, NULL, SHA256), - CIPHER_SUITE(TLS, PSK, NULL, SHA384), - CIPHER_SUITE(TLS, DHE_PSK, AES_128_CBC, SHA256), - CIPHER_SUITE(TLS, DHE_PSK, AES_256_CBC, SHA384), - CIPHER_SUITE(TLS, DHE_PSK, NULL, SHA256), - CIPHER_SUITE(TLS, DHE_PSK, NULL, SHA384), - CIPHER_SUITE(TLS, RSA_PSK, AES_128_CBC, SHA256), - CIPHER_SUITE(TLS, RSA_PSK, AES_256_CBC, SHA384), - CIPHER_SUITE(TLS, RSA_PSK, NULL, SHA256), - CIPHER_SUITE(TLS, RSA_PSK, NULL, SHA384), - - CIPHER_SUITE(TLS, ECDHE_ECDSA, AES_128_CBC, SHA256), - CIPHER_SUITE(TLS, ECDHE_ECDSA, AES_256_CBC, SHA384), - CIPHER_SUITE(TLS, ECDH_ECDSA, AES_128_CBC, SHA256), - CIPHER_SUITE(TLS, ECDH_ECDSA, AES_256_CBC, SHA384), - CIPHER_SUITE(TLS, ECDHE_RSA, AES_128_CBC, SHA256), - CIPHER_SUITE(TLS, ECDHE_RSA, AES_256_CBC, SHA384), - CIPHER_SUITE(TLS, ECDH_RSA, AES_128_CBC, SHA256), - CIPHER_SUITE(TLS, ECDH_RSA, AES_256_CBC, SHA384), - CIPHER_SUITE(TLS, ECDHE_ECDSA, AES_128_GCM, SHA256), - CIPHER_SUITE(TLS, ECDHE_ECDSA, AES_256_GCM, SHA384), - CIPHER_SUITE(TLS, ECDH_ECDSA, AES_128_GCM, SHA256), - CIPHER_SUITE(TLS, ECDH_ECDSA, AES_256_GCM, SHA384), - CIPHER_SUITE(TLS, ECDHE_RSA, AES_128_GCM, SHA256), - CIPHER_SUITE(TLS, ECDHE_RSA, AES_256_GCM, SHA384), - CIPHER_SUITE(TLS, ECDH_RSA, AES_128_GCM, SHA256), - CIPHER_SUITE(TLS, ECDH_RSA, AES_256_GCM, SHA384), - - CIPHER_SUITE(SSL, RSA, RC2_CBC, MD5), - CIPHER_SUITE(SSL, RSA, IDEA_CBC, MD5), - CIPHER_SUITE(SSL, RSA, DES_CBC, MD5), - CIPHER_SUITE(SSL, RSA, 3DES_EDE_CBC, MD5), -#undef CIPHER_SUITE -}; - - -static const struct cipher_suite* get_cipher_suite(SSLCipherSuite cipher_suite) -{ - int i; - for (i = 0; i < ARRAY_SIZE(cipher_suites); i++) - { - if (cipher_suites[i].suite == cipher_suite) - return &cipher_suites[i]; - } - - return NULL; -} - - -static DWORD get_session_protocol(struct mac_session* s) -{ - SSLProtocol protocol; - int status; - - TRACE("(%p/%p)\n", s, s->context); - - status = SSLGetNegotiatedProtocolVersion(s->context, &protocol); - if (status != noErr) - { - ERR("Failed to get session protocol: %d\n", status); - return 0; - } - - TRACE("protocol %d\n", protocol); - - switch (protocol) - { - case kSSLProtocol2: return SP_PROT_SSL2_CLIENT; - case kSSLProtocol3: return SP_PROT_SSL3_CLIENT; - case kTLSProtocol1: return SP_PROT_TLS1_CLIENT; - case kTLSProtocol11: return SP_PROT_TLS1_1_CLIENT; - case kTLSProtocol12: return SP_PROT_TLS1_2_CLIENT; - default: - FIXME("unknown protocol %d\n", protocol); - return 0; - } -} - -static ALG_ID get_cipher_algid(const struct cipher_suite* c) -{ - TRACE("(%#x)\n", (unsigned int)c->suite); - - switch (c->enc_alg) - { - case schan_enc_3DES_EDE_CBC: return CALG_3DES; - case schan_enc_AES_128_CBC: return CALG_AES_128; - case schan_enc_AES_256_CBC: return CALG_AES_256; - case schan_enc_DES_CBC: return CALG_DES; - case schan_enc_DES40_CBC: return CALG_DES; - case schan_enc_NULL: return 0; - case schan_enc_RC2_CBC_40: return CALG_RC2; - case schan_enc_RC2_CBC: return CALG_RC2; - case schan_enc_RC4_128: return CALG_RC4; - case schan_enc_RC4_40: return CALG_RC4; - - case schan_enc_AES_128_GCM: - case schan_enc_AES_256_GCM: - case schan_enc_FORTEZZA_CBC: - case schan_enc_IDEA_CBC: - FIXME("Don't know CALG for encryption algorithm %d, returning 0\n", c->enc_alg); - return 0; - - default: - FIXME("Unknown encryption algorithm %d for cipher suite %#x, returning 0\n", c->enc_alg, (unsigned int)c->suite); - return 0; - } -} - -static unsigned int get_cipher_key_size(const struct cipher_suite* c) -{ - TRACE("(%#x)\n", (unsigned int)c->suite); - - switch (c->enc_alg) - { - case schan_enc_3DES_EDE_CBC: return 168; - case schan_enc_AES_128_CBC: return 128; - case schan_enc_AES_128_GCM: return 128; - case schan_enc_AES_256_CBC: return 256; - case schan_enc_AES_256_GCM: return 256; - case schan_enc_DES_CBC: return 56; - case schan_enc_DES40_CBC: return 40; - case schan_enc_NULL: return 0; - case schan_enc_RC2_CBC_40: return 40; - case schan_enc_RC2_CBC: return 128; - case schan_enc_RC4_128: return 128; - case schan_enc_RC4_40: return 40; - - case schan_enc_FORTEZZA_CBC: - case schan_enc_IDEA_CBC: - FIXME("Don't know key size for encryption algorithm %d, returning 0\n", c->enc_alg); - return 0; - - default: - FIXME("Unknown encryption algorithm %d for cipher suite %#x, returning 0\n", c->enc_alg, (unsigned int)c->suite); - return 0; - } -} - -static ALG_ID get_mac_algid(const struct cipher_suite* c) -{ - TRACE("(%#x)\n", (unsigned int)c->suite); - - switch (c->mac_alg) - { - case schan_mac_MD5: return CALG_MD5; - case schan_mac_NULL: return 0; - case schan_mac_SHA: return CALG_SHA; - case schan_mac_SHA256: return CALG_SHA_256; - case schan_mac_SHA384: return CALG_SHA_384; - - default: - FIXME("Unknown hashing algorithm %d for cipher suite %#x, returning 0\n", c->mac_alg, (unsigned)c->suite); - return 0; - } -} - -static unsigned int get_mac_key_size(const struct cipher_suite* c) -{ - TRACE("(%#x)\n", (unsigned int)c->suite); - - switch (c->mac_alg) - { - case schan_mac_MD5: return 128; - case schan_mac_NULL: return 0; - case schan_mac_SHA: return 160; - case schan_mac_SHA256: return 256; - case schan_mac_SHA384: return 384; - - default: - FIXME("Unknown hashing algorithm %d for cipher suite %#x, returning 0\n", c->mac_alg, (unsigned)c->suite); - return 0; - } -} - -static ALG_ID get_kx_algid(const struct cipher_suite* c) -{ - TRACE("(%#x)\n", (unsigned int)c->suite); - - switch (c->kx_alg) - { - case schan_kx_DHE_DSS_EXPORT: - case schan_kx_DHE_DSS: - case schan_kx_DHE_PSK: - case schan_kx_DHE_RSA_EXPORT: - case schan_kx_DHE_RSA: return CALG_DH_EPHEM; - case schan_kx_ECDH_anon: - case schan_kx_ECDH_ECDSA: - case schan_kx_ECDH_RSA: return CALG_ECDH; - case schan_kx_ECDHE_ECDSA: - case schan_kx_ECDHE_RSA: return CALG_ECDH_EPHEM; - case schan_kx_NULL: return 0; - case schan_kx_RSA: - case schan_kx_RSA_EXPORT: - case schan_kx_RSA_PSK: return CALG_RSA_KEYX; - - case schan_kx_DH_anon_EXPORT: - case schan_kx_DH_anon: - case schan_kx_DH_DSS_EXPORT: - case schan_kx_DH_DSS: - case schan_kx_DH_RSA_EXPORT: - case schan_kx_DH_RSA: - case schan_kx_FORTEZZA_DMS: - case schan_kx_PSK: - FIXME("Don't know CALG for key exchange algorithm %d for cipher suite %#x, returning 0\n", c->kx_alg, (unsigned)c->suite); - return 0; - - default: - FIXME("Unknown key exchange algorithm %d for cipher suite %#x, returning 0\n", c->kx_alg, (unsigned)c->suite); - return 0; - } -} - - -/* pull_adapter - * Callback registered with SSLSetIOFuncs as the read function for a - * session. Reads data from the session connection. Conforms to the - * SSLReadFunc type. - * - * transport - The session connection - * buff - The buffer into which to store the read data. Must be at least - * *buff_len bytes in length. - * *buff_len - On input, the desired length to read. On successful return, - * the number of bytes actually read. - * - * Returns: - * noErr on complete success meaning the requested length was successfully - * read. - * errSSLWouldBlock when the requested length could not be read without - * blocking. *buff_len indicates how much was actually read. The - * caller should try again if/when they want to read more. - * errSSLClosedGraceful when the connection has closed and there's no - * more data to be read. - * other error code for failure. - */ -static OSStatus pull_adapter(SSLConnectionRef transport, void *buff, SIZE_T *buff_len) -{ - struct mac_session *s = (struct mac_session*)transport; - size_t requested = *buff_len; - int status; - OSStatus ret; - - TRACE("(%p/%p, %p, %p/%lu)\n", s, s->transport, buff, buff_len, *buff_len); - - if (s->mode != schan_mode_READ && s->mode != schan_mode_HANDSHAKE) - { - WARN("called in mode %u\n", s->mode); - return noErr; - } - - status = callbacks->pull(s->transport, buff, buff_len); - if (status == 0) - { - if (*buff_len == 0) - { - TRACE("Connection closed\n"); - ret = errSSLClosedGraceful; - } - else if (*buff_len < requested) - { - TRACE("Pulled %lu bytes before would block\n", *buff_len); - ret = errSSLWouldBlock; - } - else - { - TRACE("Pulled %lu bytes\n", *buff_len); - ret = noErr; - } - } - else if (status == -1) - { - TRACE("Would block before being able to pull anything\n"); - ret = errSSLWouldBlock; - } - else - { - FIXME("Unknown status code from schan_pull: %d\n", status); - ret = ioErr; - } - - return ret; -} - -/* push_adapter - * Callback registered with SSLSetIOFuncs as the write function for a - * session. Writes data to the session connection. Conforms to the - * SSLWriteFunc type. - * - * transport - The session connection - * buff - The buffer of data to write. Must be at least *buff_len bytes in length. - * *buff_len - On input, the desired length to write. On successful return, - * the number of bytes actually written. - * - * Returns: - * noErr on complete or partial success; *buff_len indicates how much data - * was actually written, which may be less than requested. - * errSSLWouldBlock when no data could be written without blocking. The - * caller should try again. - * other error code for failure. - */ -static OSStatus push_adapter(SSLConnectionRef transport, const void *buff, SIZE_T *buff_len) -{ - struct mac_session *s = (struct mac_session*)transport; - int status; - OSStatus ret; - - TRACE("(%p/%p, %p, %p/%lu)\n", s, s->transport, buff, buff_len, *buff_len); - - if (s->mode != schan_mode_WRITE && s->mode != schan_mode_HANDSHAKE) - { - WARN("called in mode %u\n", s->mode); - return noErr; - } - - status = callbacks->push(s->transport, buff, buff_len); - if (status == 0) - { - TRACE("Pushed %lu bytes\n", *buff_len); - ret = noErr; - } - else if (status == -1) - { - TRACE("Would block before being able to push anything\n"); - ret = errSSLWouldBlock; - } - else - { - FIXME("Unknown status code from schan_push: %d\n", status); - ret = ioErr; - } - - return ret; -} - -static const struct { - DWORD enable_flag; - SSLProtocol mac_version; -} protocol_priority_flags[] = { - {SP_PROT_TLS1_2_CLIENT, kTLSProtocol12}, - {SP_PROT_TLS1_1_CLIENT, kTLSProtocol11}, - {SP_PROT_TLS1_0_CLIENT, kTLSProtocol1}, - {SP_PROT_SSL3_CLIENT, kSSLProtocol3}, - {SP_PROT_SSL2_CLIENT, kSSLProtocol2} -}; - -static DWORD supported_protocols; - -static DWORD CDECL schan_get_enabled_protocols(void) -{ - return supported_protocols; -} - -static BOOL CDECL schan_create_session(schan_session *session, schan_credentials *cred) -{ - struct mac_session *s; - unsigned i; - int status; - - TRACE("(%p)\n", session); - - if (!(s = RtlAllocateHeap(GetProcessHeap(), 0, sizeof(*s)))) return FALSE; - - pthread_mutex_init(&s->mutex, NULL); - - status = SSLNewContext(cred->credential_use == SECPKG_CRED_INBOUND, &s->context); - if (status != noErr) - { - ERR("Failed to create session context: %d\n", status); - goto fail; - } - - status = SSLSetConnection(s->context, s); - if (status != noErr) - { - ERR("Failed to set session connection: %d\n", status); - goto fail; - } - - status = SSLSetEnableCertVerify(s->context, FALSE); - if (status != noErr) - { - ERR("Failed to disable certificate verification: %d\n", status); - goto fail; - } - - for(i = 0; i < ARRAY_SIZE(protocol_priority_flags); i++) { - if(!(protocol_priority_flags[i].enable_flag & supported_protocols)) - continue; - - status = SSLSetProtocolVersionEnabled(s->context, protocol_priority_flags[i].mac_version, - (cred->enabled_protocols & protocol_priority_flags[i].enable_flag) != 0); - if (status != noErr) - { - ERR("Failed to set SSL version %d: %d\n", protocol_priority_flags[i].mac_version, status); - goto fail; - } - } - - status = SSLSetIOFuncs(s->context, pull_adapter, push_adapter); - if (status != noErr) - { - ERR("Failed to set session I/O funcs: %d\n", status); - goto fail; - } - - s->mode = schan_mode_NONE; - - TRACE(" -> %p/%p\n", s, s->context); - - *session = (schan_session)s; - return TRUE; - -fail: - RtlFreeHeap(GetProcessHeap(), 0, s); - return FALSE; -} - -static void CDECL schan_dispose_session(schan_session session) -{ - struct mac_session *s = (struct mac_session*)session; - int status; - - TRACE("(%p/%p)\n", s, s->context); - - status = SSLDisposeContext(s->context); - if (status != noErr) - ERR("Failed to dispose of session context: %d\n", status); - pthread_mutex_destroy(&s->mutex); - RtlFreeHeap(GetProcessHeap(), 0, s); -} - -static void CDECL schan_set_session_transport(schan_session session, struct schan_transport *t) -{ - struct mac_session *s = (struct mac_session*)session; - - TRACE("(%p/%p, %p)\n", s, s->context, t); - - s->transport = t; -} - -static void CDECL schan_set_session_target(schan_session session, const char *target) -{ - struct mac_session *s = (struct mac_session*)session; - - TRACE("(%p/%p, %s)\n", s, s->context, debugstr_a(target)); - - SSLSetPeerDomainName( s->context, target, strlen(target) ); -} - -static SECURITY_STATUS CDECL schan_handshake(schan_session session) -{ - struct mac_session *s = (struct mac_session*)session; - int status; - - TRACE("(%p/%p)\n", s, s->context); - - s->mode = schan_mode_HANDSHAKE; - status = SSLHandshake(s->context); - s->mode = schan_mode_NONE; - - if (status == noErr) - { - TRACE("Handshake completed\n"); - return SEC_E_OK; - } - else if (status == errSSLWouldBlock) - { - TRACE("Continue...\n"); - return SEC_I_CONTINUE_NEEDED; - } - else if (errSecErrnoBase <= status && status <= errSecErrnoLimit) - { - ERR("Handshake failed: %s\n", strerror(status)); - return SEC_E_INTERNAL_ERROR; - } - else - { - ERR("Handshake failed: %d\n", status); - cssmPerror("SSLHandshake", status); - return SEC_E_INTERNAL_ERROR; - } - - /* Never reached */ - return SEC_E_OK; -} - -static unsigned int CDECL schan_get_session_cipher_block_size(schan_session session) -{ - struct mac_session* s = (struct mac_session*)session; - SSLCipherSuite cipherSuite; - const struct cipher_suite* c; - int status; - - TRACE("(%p/%p)\n", s, s->context); - - status = SSLGetNegotiatedCipher(s->context, &cipherSuite); - if (status != noErr) - { - ERR("Failed to get session cipher suite: %d\n", status); - return 0; - } - - c = get_cipher_suite(cipherSuite); - if (!c) - { - ERR("Unknown session cipher suite: %#x\n", (unsigned int)cipherSuite); - return 0; - } - - switch (c->enc_alg) - { - case schan_enc_3DES_EDE_CBC: return 64; - case schan_enc_AES_128_CBC: return 128; - case schan_enc_AES_128_GCM: return 128; - case schan_enc_AES_256_CBC: return 128; - case schan_enc_AES_256_GCM: return 128; - case schan_enc_DES_CBC: return 64; - case schan_enc_DES40_CBC: return 64; - case schan_enc_NULL: return 0; - case schan_enc_RC2_CBC_40: return 64; - case schan_enc_RC2_CBC: return 64; - case schan_enc_RC4_128: return 0; - case schan_enc_RC4_40: return 0; - - case schan_enc_FORTEZZA_CBC: - case schan_enc_IDEA_CBC: - FIXME("Don't know block size for encryption algorithm %d, returning 0\n", c->enc_alg); - return 0; - - default: - FIXME("Unknown encryption algorithm %d for cipher suite %#x, returning 0\n", c->enc_alg, (unsigned int)c->suite); - return 0; - } -} - -static unsigned int CDECL schan_get_max_message_size(schan_session session) -{ - FIXME("Returning 1 << 14.\n"); - return 1 << 14; -} - -static ALG_ID CDECL schan_get_key_signature_algorithm(schan_session session) -{ - struct mac_session* s = (struct mac_session*)session; - SSLCipherSuite cipherSuite; - const struct cipher_suite* c; - int status; - - TRACE("(%p/%p)\n", s, s->context); - - status = SSLGetNegotiatedCipher(s->context, &cipherSuite); - if (status != noErr) - { - ERR("Failed to get session cipher suite: %d\n", status); - return 0; - } - - c = get_cipher_suite(cipherSuite); - if (!c) - { - ERR("Unknown session cipher suite: %#x\n", (unsigned int)cipherSuite); - return 0; - } - - switch (c->kx_alg) - { - case schan_kx_DH_DSS_EXPORT: - case schan_kx_DH_DSS: - case schan_kx_DHE_DSS_EXPORT: - case schan_kx_DHE_DSS: - return CALG_DSS_SIGN; - - case schan_kx_DH_RSA_EXPORT: - case schan_kx_DH_RSA: - case schan_kx_DHE_RSA_EXPORT: - case schan_kx_DHE_RSA: - case schan_kx_ECDH_RSA: - case schan_kx_ECDHE_RSA: - case schan_kx_RSA_EXPORT: - case schan_kx_RSA: - return CALG_RSA_SIGN; - - case schan_kx_ECDH_ECDSA: - case schan_kx_ECDHE_ECDSA: - return CALG_ECDSA; - - case schan_kx_DH_anon_EXPORT: - case schan_kx_DH_anon: - case schan_kx_DHE_PSK: - case schan_kx_ECDH_anon: - case schan_kx_FORTEZZA_DMS: - case schan_kx_NULL: - case schan_kx_PSK: - case schan_kx_RSA_PSK: - FIXME("Don't know key signature algorithm for key exchange algorithm %d, returning 0\n", c->kx_alg); - return 0; - - default: - FIXME("Unknown key exchange algorithm %d for cipher suite %#x, returning 0\n", c->kx_alg, (unsigned int)c->suite); - return 0; - } -} - -static SECURITY_STATUS CDECL schan_get_connection_info(schan_session session, SecPkgContext_ConnectionInfo *info) -{ - struct mac_session* s = (struct mac_session*)session; - SSLCipherSuite cipherSuite; - const struct cipher_suite* c; - int status; - - TRACE("(%p/%p, %p)\n", s, s->context, info); - - status = SSLGetNegotiatedCipher(s->context, &cipherSuite); - if (status != noErr) - { - ERR("Failed to get session cipher suite: %d\n", status); - return SEC_E_INTERNAL_ERROR; - } - - c = get_cipher_suite(cipherSuite); - if (!c) - { - ERR("Unknown session cipher suite: %#x\n", (unsigned int)cipherSuite); - return SEC_E_INTERNAL_ERROR; - } - - info->dwProtocol = get_session_protocol(s); - info->aiCipher = get_cipher_algid(c); - info->dwCipherStrength = get_cipher_key_size(c); - info->aiHash = get_mac_algid(c); - info->dwHashStrength = get_mac_key_size(c); - info->aiExch = get_kx_algid(c); - /* FIXME: info->dwExchStrength? */ - info->dwExchStrength = 0; - - return SEC_E_OK; -} - -static SECURITY_STATUS CDECL schan_get_unique_channel_binding(schan_session session, SecPkgContext_Bindings *bindings) -{ - FIXME("SECPKG_ATTR_UNIQUE_BINDINGS is unsupported on MacOS\n"); - return SEC_E_UNSUPPORTED_FUNCTION; -} - -static SECURITY_STATUS CDECL schan_get_session_peer_certificate(schan_session session, struct schan_cert_list *list) -{ - struct mac_session *s = (struct mac_session *)session; - SECURITY_STATUS ret = SEC_E_OK; - SecCertificateRef cert; - CFArrayRef cert_array; - int status; - unsigned int size; - CFIndex i; - CFDataRef data; - BYTE *ptr; - - TRACE("(%p/%p, %p)\n", s, s->context, list); - - status = SSLCopyPeerCertificates(s->context, &cert_array); - if (status != noErr || !cert_array) - { - WARN("SSLCopyPeerCertificates failed: %d\n", status); - return SEC_E_INTERNAL_ERROR; - } - - list->count = CFArrayGetCount(cert_array); - size = list->count * sizeof(list->certs[0]); - - for (i = 0; i < list->count; i++) - { - if (!(cert = (SecCertificateRef)CFArrayGetValueAtIndex(cert_array, i)) || - (SecItemExport(cert, kSecFormatX509Cert, 0, NULL, &data) != noErr)) - { - WARN("Couldn't extract certificate data\n"); - ret = SEC_E_INTERNAL_ERROR; - goto done; - } - size += CFDataGetLength(data); - CFRelease(data); - } - - if (!(list->certs = RtlAllocateHeap(GetProcessHeap(), 0, size))) - { - ret = SEC_E_INSUFFICIENT_MEMORY; - goto done; - } - - ptr = (BYTE *)&list->certs[list->count]; - for (i = 0; i < list->count; i++) - { - if (!(cert = (SecCertificateRef)CFArrayGetValueAtIndex(cert_array, i)) || - (SecKeychainItemExport(cert, kSecFormatX509Cert, 0, NULL, &data) != noErr)) - { - WARN("Couldn't extract certificate data\n"); - ret = SEC_E_INTERNAL_ERROR; - goto done; - } - list->certs[i].cbData = CFDataGetLength(data); - list->certs[i].pbData = ptr; - memcpy(list->certs[i].pbData, CFDataGetBytePtr(data), CFDataGetLength(data)); - ptr += CFDataGetLength(data); - CFRelease(data); - } - -done: - CFRelease(cert_array); - return ret; -} - -static SECURITY_STATUS CDECL schan_send(schan_session session, const void *buffer, SIZE_T *length) -{ - struct mac_session* s = (struct mac_session*)session; - int status; - - TRACE("(%p/%p, %p, %p/%lu)\n", s, s->context, buffer, length, *length); - - pthread_mutex_lock(&s->mutex); - s->mode = schan_mode_WRITE; - - status = SSLWrite(s->context, buffer, *length, length); - - s->mode = schan_mode_NONE; - pthread_mutex_unlock(&s->mutex); - - if (status == noErr) - TRACE("Wrote %lu bytes\n", *length); - else if (status == errSSLWouldBlock) - { - if (!*length) - { - TRACE("Would block before being able to write anything\n"); - return SEC_I_CONTINUE_NEEDED; - } - else - TRACE("Wrote %lu bytes before would block\n", *length); - } - else - { - WARN("SSLWrite failed: %d\n", status); - return SEC_E_INTERNAL_ERROR; - } - - return SEC_E_OK; -} - -static SECURITY_STATUS CDECL schan_recv(schan_session session, void *buffer, SIZE_T *length) -{ - struct mac_session* s = (struct mac_session*)session; - int status; - - TRACE("(%p/%p, %p, %p/%lu)\n", s, s->context, buffer, length, *length); - - pthread_mutex_lock(&s->mutex); - s->mode = schan_mode_READ; - - status = SSLRead(s->context, buffer, *length, length); - - s->mode = schan_mode_NONE; - pthread_mutex_unlock(&s->mutex); - - if (status == noErr || status == errSSLClosedGraceful) - TRACE("Read %lu bytes\n", *length); - else if (status == errSSLWouldBlock) - { - if (!*length) - { - TRACE("Would block before being able to read anything\n"); - return SEC_I_CONTINUE_NEEDED; - } - else - TRACE("Read %lu bytes before would block\n", *length); - } - else - { - WARN("SSLRead failed: %d\n", status); - return SEC_E_INTERNAL_ERROR; - } - - return SEC_E_OK; -} - -static BOOL CDECL schan_allocate_certificate_credentials(schan_credentials *c, const CERT_CONTEXT *cert, - const DATA_BLOB *key_blob) -{ - if (cert) FIXME("no support for certificate credentials on this platform\n"); - c->credentials = NULL; - return TRUE; -} - -static void CDECL schan_free_certificate_credentials(schan_credentials *c) -{ -} - -static void CDECL schan_set_application_protocols(schan_session session, unsigned char *buffer, unsigned int buflen) -{ - FIXME("no support for application protocols on this platform\n"); -} - -static SECURITY_STATUS CDECL schan_get_application_protocol(schan_session session, - SecPkgContext_ApplicationProtocol *protocol) -{ - FIXME("no support for application protocols on this platform\n"); - return SEC_E_UNSUPPORTED_FUNCTION; -} - -static SECURITY_STATUS CDECL schan_set_dtls_mtu(schan_session session, unsigned int mtu) -{ - FIXME("no support for setting dtls mtu on this platform\n"); - return SEC_E_UNSUPPORTED_FUNCTION; -} - -static void ssl_init(void) -{ - TRACE("()\n"); - - supported_protocols = SP_PROT_SSL2_CLIENT | SP_PROT_SSL3_CLIENT | SP_PROT_TLS1_0_CLIENT; - -#if MAC_OS_X_VERSION_MAX_ALLOWED >= 1080 - if(&SSLGetProtocolVersionMax != NULL) { - SSLProtocol max_protocol; - SSLContextRef ctx; - OSStatus status; - - status = SSLNewContext(FALSE, &ctx); - if(status == noErr) { - status = SSLGetProtocolVersionMax(ctx, &max_protocol); - if(status == noErr) { - if(max_protocol >= kTLSProtocol11) - supported_protocols |= SP_PROT_TLS1_1_CLIENT; - if(max_protocol >= kTLSProtocol12) - supported_protocols |= SP_PROT_TLS1_2_CLIENT; - } - SSLDisposeContext(ctx); - }else { - WARN("SSLNewContext failed\n"); - } - } -#endif -} - -static const struct schan_funcs funcs = -{ - schan_allocate_certificate_credentials, - schan_create_session, - schan_dispose_session, - schan_free_certificate_credentials, - schan_get_application_protocol, - schan_get_connection_info, - schan_get_enabled_protocols, - schan_get_key_signature_algorithm, - schan_get_max_message_size, - schan_get_session_cipher_block_size, - schan_get_session_peer_certificate, - schan_get_unique_channel_binding, - schan_handshake, - schan_recv, - schan_send, - schan_set_application_protocols, - schan_set_dtls_mtu, - schan_set_session_target, - schan_set_session_transport, -}; - -NTSTATUS CDECL __wine_init_unix_lib( HMODULE module, DWORD reason, const void *ptr_in, void *ptr_out ) -{ - if (reason != DLL_PROCESS_ATTACH) return STATUS_SUCCESS; - ssl_init(); - callbacks = ptr_in; - *(const struct schan_funcs **)ptr_out = &funcs; - return STATUS_SUCCESS; -} - -#endif /* HAVE_SECURITY_SECURITY_H && !SONAME_LIBGNUTLS */