Browse Source

[System]: Reenable native Apple Certificate support on WatchOS. (#11173)

During the code refactoring this summer, support for native apple certificates
has been dropped on watchOS.

* add `apple-certificates.sources` and move all certificate-related code from
  `appletls.sources`.

* move non-network related code from `MacProxy` into a new `AppleTypes`.

* add the `MONO_FEATURE_APPLE_X509` magic to `System/Makefile` where it was missing from.
Martin Baulig 7 years ago
parent
commit
b61a3ffb02

+ 4 - 0
mcs/class/System/Makefile

@@ -86,6 +86,10 @@ ifdef ONLY_APPLETLS
 LIB_MCS_FLAGS += -d:ONLY_APPLETLS
 endif
 
+ifdef MONO_FEATURE_APPLE_X509
+LIB_MCS_FLAGS += -d:MONO_FEATURE_APPLE_X509
+endif
+
 ifndef PROFILE_DISABLE_BTLS
 ifdef HAVE_BTLS
 

+ 3 - 4
mcs/class/System/Mono.AppleTls/MonoCertificatePal.Mobile.cs

@@ -33,7 +33,6 @@ using System.Runtime.InteropServices;
 using System.Security.Cryptography.Apple;
 using System.Security.Cryptography.X509Certificates;
 using Microsoft.Win32.SafeHandles;
-using Mono.Net;
 
 namespace Mono.AppleTls
 {
@@ -56,7 +55,7 @@ namespace Mono.AppleTls
 			if (Interlocked.CompareExchange (ref initialized, 1, 0) != 0)
 				return;
 
-			var handle = CFObject.dlopen (AppleTlsContext.SecurityLibrary, 0);
+			var handle = CFObject.dlopen (SecurityLibrary, 0);
 			if (handle == IntPtr.Zero)
 				return;
 
@@ -93,7 +92,7 @@ namespace Mono.AppleTls
 			}
 		}
 
-		[DllImport (AppleTlsContext.SecurityLibrary)]
+		[DllImport (SecurityLibrary)]
 		extern static SecStatusCode SecPKCS12Import (IntPtr pkcs12_data, IntPtr options, out IntPtr items);
 
 		static SecStatusCode ImportPkcs12 (byte[] buffer, CFDictionary options, out CFDictionary[] array)
@@ -134,7 +133,7 @@ namespace Mono.AppleTls
 			return identity ?? new SafeSecIdentityHandle ();
 		}
 
-		[DllImport (AppleTlsContext.SecurityLibrary)]
+		[DllImport (SecurityLibrary)]
 		extern static SecStatusCode SecItemCopyMatching (/* CFDictionaryRef */ IntPtr query, /* CFTypeRef* */ out IntPtr result);
 
 		public static SafeSecIdentityHandle FindIdentity (SafeSecCertificateHandle certificate, bool throwOnError = false)

+ 8 - 7
mcs/class/System/Mono.AppleTls/MonoCertificatePal.cs

@@ -33,13 +33,14 @@ using System.Runtime.InteropServices;
 using System.Security.Cryptography.Apple;
 using System.Security.Cryptography.X509Certificates;
 using Microsoft.Win32.SafeHandles;
-using Mono.Net;
 
 namespace Mono.AppleTls
 {
 	static partial class MonoCertificatePal
 	{
-		[DllImport (AppleTlsContext.SecurityLibrary)]
+		const string SecurityLibrary = OSX509Certificates.SecurityLibrary;
+
+		[DllImport (SecurityLibrary)]
 		extern static IntPtr SecCertificateCreateWithData (IntPtr allocator, IntPtr cfData);
 
 		public static SafeSecCertificateHandle FromOtherCertificate (X509Certificate certificate)
@@ -66,7 +67,7 @@ namespace Mono.AppleTls
 			}
 		}
 
-		[DllImport (AppleTlsContext.SecurityLibrary)]
+		[DllImport (SecurityLibrary)]
 		extern static IntPtr SecIdentityGetTypeID ();
 
 		public static bool IsSecIdentity (IntPtr ptr)
@@ -76,7 +77,7 @@ namespace Mono.AppleTls
 			return CFType.GetTypeID (ptr) == SecIdentityGetTypeID ();
 		}
 
-		[DllImport (AppleTlsContext.SecurityLibrary)]
+		[DllImport (SecurityLibrary)]
 		public extern static IntPtr SecKeyGetTypeID ();
 		
 		public static bool IsSecKey (IntPtr ptr)
@@ -86,7 +87,7 @@ namespace Mono.AppleTls
 			return CFType.GetTypeID (ptr) == SecKeyGetTypeID ();
 		}
 
-		[DllImport (AppleTlsContext.SecurityLibrary)]
+		[DllImport (SecurityLibrary)]
 		extern static /* OSStatus */ SecStatusCode SecIdentityCopyCertificate (/* SecIdentityRef */ IntPtr identityRef,  /* SecCertificateRef* */ out IntPtr certificateRef);
 
 		public static SafeSecCertificateHandle GetCertificate (SafeSecIdentityHandle identity)
@@ -99,7 +100,7 @@ namespace Mono.AppleTls
 			return new SafeSecCertificateHandle (cert, true);
 		}
 
-		[DllImport (AppleTlsContext.SecurityLibrary)]
+		[DllImport (SecurityLibrary)]
 		extern static IntPtr SecCertificateCopySubjectSummary (IntPtr cert);
 
 		public static string GetSubjectSummary (SafeSecCertificateHandle certificate)
@@ -117,7 +118,7 @@ namespace Mono.AppleTls
 			}
 		}
 
-		[DllImport (AppleTlsContext.SecurityLibrary)]
+		[DllImport (SecurityLibrary)]
 		extern static /* CFDataRef */ IntPtr SecCertificateCopyData (/* SecCertificateRef */ IntPtr cert);
 
 		public static byte[] GetRawData (SafeSecCertificateHandle certificate)

+ 1 - 1
mcs/class/System/Mono.AppleTls/SafeHandles.Mono.cs

@@ -26,7 +26,7 @@
 using System.Runtime.InteropServices;
 using System.Security.Cryptography.Apple;
 using Microsoft.Win32.SafeHandles;
-using Mono.Net;
+using Mono;
 
 namespace System.Security.Cryptography.X509Certificates
 {

+ 1 - 1
mcs/class/System/Mono.AppleTls/SafeHandles.cs

@@ -26,7 +26,7 @@
 using System.Runtime.InteropServices;
 using System.Security.Cryptography.Apple;
 using Microsoft.Win32.SafeHandles;
-using Mono.Net;
+using Mono;
 
 namespace System.Security.Cryptography.X509Certificates
 {

+ 673 - 0
mcs/class/System/Mono/AppleTypes.cs

@@ -0,0 +1,673 @@
+// 
+// MacProxy.cs
+//  
+// Author: Jeffrey Stedfast <[email protected]>
+// 
+// Copyright (c) 2012-2014 Xamarin Inc.
+// 
+// Permission is hereby granted, free of charge, to any person obtaining a copy
+// of this software and associated documentation files (the "Software"), to deal
+// in the Software without restriction, including without limitation the rights
+// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+// copies of the Software, and to permit persons to whom the Software is
+// furnished to do so, subject to the following conditions:
+// 
+// The above copyright notice and this permission notice shall be included in
+// all copies or substantial portions of the Software.
+// 
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+// THE SOFTWARE.
+// 
+
+using System;
+using System.Collections.Generic;
+using System.Runtime.InteropServices;
+using System.Threading;
+using ObjCRuntimeInternal;
+
+namespace Mono
+{
+	internal class CFType {
+		[DllImport (CFObject.CoreFoundationLibrary, EntryPoint="CFGetTypeID")]
+		public static extern IntPtr GetTypeID (IntPtr typeRef);
+	}
+
+	internal class CFObject : IDisposable, INativeObject
+	{
+		public const string CoreFoundationLibrary = "/System/Library/Frameworks/CoreFoundation.framework/CoreFoundation";
+		const string SystemLibrary = "/usr/lib/libSystem.dylib";
+
+		[DllImport (SystemLibrary)]
+		public static extern IntPtr dlopen (string path, int mode);
+
+		[DllImport (SystemLibrary)]
+		static extern IntPtr dlsym (IntPtr handle, string symbol);
+
+		[DllImport (SystemLibrary)]
+		public static extern void dlclose (IntPtr handle);
+
+		public static IntPtr GetIndirect (IntPtr handle, string symbol)
+		{
+			return dlsym (handle, symbol);
+		}
+
+		public static CFString GetStringConstant (IntPtr handle, string symbol)
+		{
+			var indirect = dlsym (handle, symbol);
+			if (indirect == IntPtr.Zero)
+				return null;
+			var actual = Marshal.ReadIntPtr (indirect);
+			if (actual == IntPtr.Zero)
+				return null;
+			return new CFString (actual, false);
+		}
+
+		public static IntPtr GetIntPtr (IntPtr handle, string symbol)
+		{
+			var indirect = dlsym (handle, symbol);
+			if (indirect == IntPtr.Zero)
+				return IntPtr.Zero;
+			return Marshal.ReadIntPtr (indirect);
+		}
+
+		public static IntPtr GetCFObjectHandle (IntPtr handle, string symbol)
+		{
+			var indirect = dlsym (handle, symbol);
+			if (indirect == IntPtr.Zero)
+				return IntPtr.Zero;
+
+			return Marshal.ReadIntPtr (indirect);
+		}
+
+		public CFObject (IntPtr handle, bool own)
+		{
+			Handle = handle;
+
+			if (!own)
+				Retain ();
+		}
+
+		~CFObject ()
+		{
+			Dispose (false);
+		}
+
+		public IntPtr Handle { get; private set; }
+
+		[DllImport (CoreFoundationLibrary)]
+		internal extern static IntPtr CFRetain (IntPtr handle);
+
+		void Retain ()
+		{
+			CFRetain (Handle);
+		}
+
+		[DllImport (CoreFoundationLibrary)]
+		internal extern static void CFRelease (IntPtr handle);
+
+		void Release ()
+		{
+			CFRelease (Handle);
+		}
+
+		protected virtual void Dispose (bool disposing)
+		{
+			if (Handle != IntPtr.Zero) {
+				Release ();
+				Handle = IntPtr.Zero;
+			}
+		}
+
+		public void Dispose ()
+		{
+			Dispose (true);
+			GC.SuppressFinalize (this);
+		}
+	}
+
+	internal class CFArray : CFObject
+	{
+		public CFArray (IntPtr handle, bool own) : base (handle, own) { }
+
+		[DllImport (CoreFoundationLibrary)]
+		extern static IntPtr CFArrayCreate (IntPtr allocator, IntPtr values, /* CFIndex */ IntPtr numValues, IntPtr callbacks);
+		static readonly IntPtr kCFTypeArrayCallbacks;
+
+		static CFArray ()
+		{
+			var handle = dlopen (CoreFoundationLibrary, 0);
+			if (handle == IntPtr.Zero)
+				return;
+
+			try {
+				kCFTypeArrayCallbacks = GetIndirect (handle, "kCFTypeArrayCallBacks");
+			} finally {
+				dlclose (handle);
+			}
+		}
+		
+		public static CFArray FromNativeObjects (params INativeObject[] values)
+		{
+			return new CFArray (Create (values), true);
+		}
+
+		public static unsafe IntPtr Create (params IntPtr[] values)
+		{
+			if (values == null)
+				throw new ArgumentNullException ("values");
+			fixed (IntPtr* pv = values) {
+				return CFArrayCreate (IntPtr.Zero, (IntPtr) pv, (IntPtr)values.Length, kCFTypeArrayCallbacks);
+			}
+		}
+
+		internal static unsafe CFArray CreateArray (params IntPtr[] values)
+		{
+			if (values == null)
+				throw new ArgumentNullException ("values");
+
+			fixed (IntPtr *pv = values) {
+				IntPtr handle = CFArrayCreate (IntPtr.Zero, (IntPtr) pv, (IntPtr) values.Length, kCFTypeArrayCallbacks);
+
+				return new CFArray (handle, false);
+			}
+		}
+		
+		public static CFArray CreateArray (params INativeObject[] values)
+		{
+			return new CFArray (Create (values), true);
+		}
+
+		public static IntPtr Create (params INativeObject[] values)
+		{
+			if (values == null)
+				throw new ArgumentNullException ("values");
+			IntPtr[] _values = new IntPtr [values.Length];
+			for (int i = 0; i < _values.Length; ++i)
+				_values [i] = values [i].Handle;
+			return Create (_values);
+		}
+
+		[DllImport (CoreFoundationLibrary)]
+		extern static /* CFIndex */ IntPtr CFArrayGetCount (IntPtr handle);
+
+		public int Count {
+			get { return (int) CFArrayGetCount (Handle); }
+		}
+
+		[DllImport (CoreFoundationLibrary)]
+		extern static IntPtr CFArrayGetValueAtIndex (IntPtr handle, /* CFIndex */ IntPtr index);
+
+		public IntPtr this[int index] {
+			get {
+				return CFArrayGetValueAtIndex (Handle, (IntPtr) index);
+			}
+		}
+		
+		static public T [] ArrayFromHandle<T> (IntPtr handle, Func<IntPtr, T> creation) where T : class, INativeObject
+		{
+			if (handle == IntPtr.Zero)
+				return null;
+
+			var c = CFArrayGetCount (handle);
+			T [] ret = new T [(int)c];
+
+			for (uint i = 0; i < (uint)c; i++) {
+				ret [i] = creation (CFArrayGetValueAtIndex (handle, (IntPtr)i));
+			}
+			return ret;
+		}
+	}
+
+	internal class CFNumber : CFObject
+	{
+		public CFNumber (IntPtr handle, bool own) : base (handle, own) { }
+
+		[DllImport (CoreFoundationLibrary)]
+		[return: MarshalAs (UnmanagedType.I1)]
+		extern static bool CFNumberGetValue (IntPtr handle, /* CFNumberType */ IntPtr type, [MarshalAs (UnmanagedType.I1)] out bool value);
+
+		public static bool AsBool (IntPtr handle)
+		{
+			bool value;
+
+			if (handle == IntPtr.Zero)
+				return false;
+
+			CFNumberGetValue (handle, (IntPtr) 1, out value);
+
+			return value;
+		}
+
+		public static implicit operator bool (CFNumber number)
+		{
+			return AsBool (number.Handle);
+		}
+
+		[DllImport (CoreFoundationLibrary)]
+		[return: MarshalAs (UnmanagedType.I1)]
+		extern static bool CFNumberGetValue (IntPtr handle, /* CFNumberType */ IntPtr type, out int value);
+
+		public static int AsInt32 (IntPtr handle)
+		{
+			int value;
+
+			if (handle == IntPtr.Zero)
+				return 0;
+
+			// 9 == kCFNumberIntType == C int
+			CFNumberGetValue (handle, (IntPtr) 9, out value);
+
+			return value;
+		}
+		
+		[DllImport (CoreFoundationLibrary)]
+		extern static IntPtr CFNumberCreate (IntPtr allocator, IntPtr theType, IntPtr valuePtr);	
+
+		public static CFNumber FromInt32 (int number)
+		{
+			// 9 == kCFNumberIntType == C int
+			return new CFNumber (CFNumberCreate (IntPtr.Zero, (IntPtr)9, (IntPtr)number), true);
+		}
+
+		public static implicit operator int (CFNumber number)
+		{
+			return AsInt32 (number.Handle);
+		}
+	}
+
+	internal struct CFRange {
+		public IntPtr Location, Length;
+		
+		public CFRange (int loc, int len)
+		{
+			Location = (IntPtr) loc;
+			Length = (IntPtr) len;
+		}
+	}
+
+	internal class CFString : CFObject
+	{
+		string str;
+
+		public CFString (IntPtr handle, bool own) : base (handle, own) { }
+
+		[DllImport (CoreFoundationLibrary)]
+		extern static IntPtr CFStringCreateWithCharacters (IntPtr alloc, IntPtr chars, /* CFIndex */ IntPtr length);
+
+		public static CFString Create (string value)
+		{
+			IntPtr handle;
+
+			unsafe {
+				fixed (char *ptr = value) {
+					handle = CFStringCreateWithCharacters (IntPtr.Zero, (IntPtr) ptr, (IntPtr) value.Length);
+				}
+			}
+
+			if (handle == IntPtr.Zero)
+				return null;
+
+			return new CFString (handle, true);
+		}
+
+		[DllImport (CoreFoundationLibrary)]
+		extern static /* CFIndex */ IntPtr CFStringGetLength (IntPtr handle);
+
+		public int Length {
+			get {
+				if (str != null)
+					return str.Length;
+
+				return (int) CFStringGetLength (Handle);
+			}
+		}
+		
+		[DllImport (CoreFoundationLibrary)]
+		extern static int CFStringCompare (IntPtr theString1, IntPtr theString2, int compareOptions);
+		
+		public static int Compare (IntPtr string1, IntPtr string2, int compareOptions = 0)
+		{
+			return CFStringCompare (string1, string2, compareOptions);
+		}
+
+		[DllImport (CoreFoundationLibrary)]
+		extern static IntPtr CFStringGetCharactersPtr (IntPtr handle);
+
+		[DllImport (CoreFoundationLibrary)]
+		extern static IntPtr CFStringGetCharacters (IntPtr handle, CFRange range, IntPtr buffer);
+
+		public static string AsString (IntPtr handle)
+		{
+			if (handle == IntPtr.Zero)
+				return null;
+			
+			int len = (int) CFStringGetLength (handle);
+			
+			if (len == 0)
+				return string.Empty;
+			
+			IntPtr chars = CFStringGetCharactersPtr (handle);
+			IntPtr buffer = IntPtr.Zero;
+			
+			if (chars == IntPtr.Zero) {
+				CFRange range = new CFRange (0, len);
+				buffer = Marshal.AllocHGlobal (len * 2);
+				CFStringGetCharacters (handle, range, buffer);
+				chars = buffer;
+			}
+
+			string str;
+
+			unsafe {
+				str = new string ((char *) chars, 0, len);
+			}
+			
+			if (buffer != IntPtr.Zero)
+				Marshal.FreeHGlobal (buffer);
+
+			return str;
+		}
+
+		public override string ToString ()
+		{
+			if (str == null)
+				str = AsString (Handle);
+
+			return str;
+		}
+
+		public static implicit operator string (CFString str)
+		{
+			return str.ToString ();
+		}
+
+		public static implicit operator CFString (string str)
+		{
+			return Create (str);
+		}
+	}
+
+	
+	internal class CFData : CFObject
+	{
+		public CFData (IntPtr handle, bool own) : base (handle, own) { }
+	
+		[DllImport (CoreFoundationLibrary)]
+		extern static /* CFDataRef */ IntPtr CFDataCreate (/* CFAllocatorRef */ IntPtr allocator, /* UInt8* */ IntPtr bytes, /* CFIndex */ IntPtr length);
+		public unsafe static CFData FromData (byte [] buffer)
+		{
+			fixed (byte* p = buffer)
+			{
+				return FromData ((IntPtr)p, (IntPtr)buffer.Length);
+			}
+		}
+
+		public static CFData FromData (IntPtr buffer, IntPtr length)
+		{
+			return new CFData (CFDataCreate (IntPtr.Zero, buffer, length), true);
+		}
+		
+		public IntPtr Length {
+			get { return CFDataGetLength (Handle); }
+		}
+
+		[DllImport (CoreFoundationLibrary)]
+		internal extern static /* CFIndex */ IntPtr CFDataGetLength (/* CFDataRef */ IntPtr theData);
+
+		[DllImport (CoreFoundationLibrary)]
+		internal extern static /* UInt8* */ IntPtr CFDataGetBytePtr (/* CFDataRef */ IntPtr theData);
+
+		/*
+		 * Exposes a read-only pointer to the underlying storage.
+		 */
+		public IntPtr Bytes {
+			get { return CFDataGetBytePtr (Handle); }
+		}
+
+		public byte this [long idx] {
+			get {
+				if (idx < 0 || (ulong) idx > (ulong) Length)
+					throw new ArgumentException ("idx");
+				return Marshal.ReadByte (new IntPtr (Bytes.ToInt64 () + idx));
+			}
+
+			set {
+				throw new NotImplementedException ("NSData arrays can not be modified, use an NSMutableData instead");
+			}
+		}
+
+	}
+
+	internal class CFDictionary : CFObject
+	{
+		static readonly IntPtr KeyCallbacks;
+		static readonly IntPtr ValueCallbacks;
+		
+		static CFDictionary ()
+		{
+			var handle = dlopen (CoreFoundationLibrary, 0);
+			if (handle == IntPtr.Zero)
+				return;
+
+			try {		
+				KeyCallbacks = GetIndirect (handle, "kCFTypeDictionaryKeyCallBacks");
+				ValueCallbacks = GetIndirect (handle, "kCFTypeDictionaryValueCallBacks");
+			} finally {
+				dlclose (handle);
+			}
+		}
+
+		public CFDictionary (IntPtr handle, bool own) : base (handle, own) { }
+
+		public static CFDictionary FromObjectAndKey (IntPtr obj, IntPtr key)
+		{
+			return new CFDictionary (CFDictionaryCreate (IntPtr.Zero, new IntPtr[] { key }, new IntPtr [] { obj }, (IntPtr)1, KeyCallbacks, ValueCallbacks), true);
+		}
+
+		public static CFDictionary FromKeysAndObjects (IList<Tuple<IntPtr,IntPtr>> items)
+		{
+			var keys = new IntPtr [items.Count];
+			var values = new IntPtr [items.Count];
+			for (int i = 0; i < items.Count; i++) {
+				keys [i] = items [i].Item1;
+				values [i] = items [i].Item2;
+			}
+			return new CFDictionary (CFDictionaryCreate (IntPtr.Zero, keys, values, (IntPtr)items.Count, KeyCallbacks, ValueCallbacks), true);
+		}
+
+		[DllImport (CoreFoundationLibrary)]
+		extern static IntPtr CFDictionaryCreate (IntPtr allocator, IntPtr[] keys, IntPtr[] vals, IntPtr len, IntPtr keyCallbacks, IntPtr valCallbacks);
+
+		[DllImport (CoreFoundationLibrary)]
+		extern static IntPtr CFDictionaryGetValue (IntPtr handle, IntPtr key);
+
+		[DllImport (CoreFoundationLibrary)]
+		extern static IntPtr CFDictionaryCreateCopy (IntPtr allocator, IntPtr handle);
+
+		public CFDictionary Copy ()
+		{
+			return new CFDictionary (CFDictionaryCreateCopy (IntPtr.Zero, Handle), true);
+		}
+		
+		public CFMutableDictionary MutableCopy ()
+		{
+			return new CFMutableDictionary (CFDictionaryCreateMutableCopy (IntPtr.Zero, IntPtr.Zero, Handle), true);
+		}
+
+		[DllImport (CoreFoundationLibrary)]
+		extern static IntPtr CFDictionaryCreateMutableCopy (IntPtr allocator, IntPtr capacity, IntPtr theDict);
+
+		public IntPtr GetValue (IntPtr key)
+		{
+			return CFDictionaryGetValue (Handle, key);
+		}
+
+		public IntPtr this[IntPtr key] {
+			get {
+				return GetValue (key);
+			}
+		}
+	}
+	
+	internal class CFMutableDictionary : CFDictionary
+	{
+		public CFMutableDictionary (IntPtr handle, bool own) : base (handle, own) { }
+
+		public void SetValue (IntPtr key, IntPtr val)
+		{
+			CFDictionarySetValue (Handle, key, val);
+		}
+
+		public static CFMutableDictionary Create ()
+		{
+			var handle = CFDictionaryCreateMutable (IntPtr.Zero, IntPtr.Zero, IntPtr.Zero, IntPtr.Zero);
+			if (handle == IntPtr.Zero)
+				throw new InvalidOperationException ();
+			return new CFMutableDictionary (handle, true);
+		}
+
+		[DllImport (CoreFoundationLibrary)]
+		extern static void CFDictionarySetValue (IntPtr handle, IntPtr key, IntPtr val);
+
+		[DllImport (CoreFoundationLibrary)]
+		extern static IntPtr CFDictionaryCreateMutable (IntPtr allocator, IntPtr capacity, IntPtr keyCallback, IntPtr valueCallbacks);
+
+	}
+
+	class CFBoolean : INativeObject, IDisposable {
+		IntPtr handle;
+
+		public static readonly CFBoolean True;
+		public static readonly CFBoolean False;
+
+		static CFBoolean ()
+		{
+			var handle = CFObject.dlopen (CFObject.CoreFoundationLibrary, 0);
+			if (handle == IntPtr.Zero)
+				return;
+			try {
+				True  = new CFBoolean (CFObject.GetCFObjectHandle (handle, "kCFBooleanTrue"), false);
+				False = new CFBoolean (CFObject.GetCFObjectHandle (handle, "kCFBooleanFalse"), false);
+			}
+			finally {
+				CFObject.dlclose (handle);
+			}
+		}
+
+		internal CFBoolean (IntPtr handle, bool owns)
+		{
+			this.handle = handle;
+			if (!owns)
+				CFObject.CFRetain (handle);
+		}
+
+		~CFBoolean ()
+		{
+			Dispose (false);
+		}
+
+		public IntPtr Handle {
+			get {
+				return handle;
+			}
+		}
+
+		public void Dispose ()
+		{
+			Dispose (true);
+			GC.SuppressFinalize (this);
+		}
+
+		protected virtual void Dispose (bool disposing)
+		{
+			if (handle != IntPtr.Zero){
+				CFObject.CFRelease (handle);
+				handle = IntPtr.Zero;
+			}
+		}
+
+		public static implicit operator bool (CFBoolean value)
+		{
+			return value.Value;
+		}
+
+		public static explicit operator CFBoolean (bool value)
+		{
+			return FromBoolean (value);
+		}
+
+		public static CFBoolean FromBoolean (bool value)
+		{
+			return value ? True : False;
+		}
+
+		[DllImport (CFObject.CoreFoundationLibrary)]
+		[return: MarshalAs (UnmanagedType.I1)]
+		extern static /* Boolean */ bool CFBooleanGetValue (/* CFBooleanRef */ IntPtr boolean);
+
+		public bool Value {
+			get {return CFBooleanGetValue (handle);}
+		}
+
+		public static bool GetValue (IntPtr boolean)
+		{
+			return CFBooleanGetValue (boolean);
+		}
+	}
+
+	internal class CFDate : INativeObject, IDisposable {
+		IntPtr handle;
+
+		internal CFDate (IntPtr handle, bool owns)
+		{
+			this.handle = handle;
+			if (!owns)
+				CFObject.CFRetain (handle);
+		}
+
+		~CFDate ()
+		{
+			Dispose (false);
+		}
+
+		[DllImport (CFObject.CoreFoundationLibrary)]
+		extern static IntPtr CFDateCreate (IntPtr allocator, /* CFAbsoluteTime */ double at);
+
+		public static CFDate Create (DateTime date)
+		{
+			var referenceTime = new DateTime (2001, 1, 1);
+			var difference = (date - referenceTime).TotalSeconds;
+			var handle = CFDateCreate (IntPtr.Zero, difference);
+			if (handle == IntPtr.Zero)
+				throw new NotSupportedException ();
+			return new CFDate (handle, true);
+		}
+
+		public IntPtr Handle {
+			get {
+				return handle;
+			}
+		}
+
+		public void Dispose ()
+		{
+			Dispose (true);
+			GC.SuppressFinalize (this);
+		}
+
+		protected virtual void Dispose (bool disposing)
+		{
+			if (handle != IntPtr.Zero) {
+				CFObject.CFRelease (handle);
+				handle = IntPtr.Zero;
+			}
+		}
+
+	}
+
+}

+ 0 - 638
mcs/class/System/System.Net/MacProxy.cs

@@ -33,264 +33,6 @@ using ObjCRuntimeInternal;
 
 namespace Mono.Net
 {
-	internal class CFType {
-		[DllImport (CFObject.CoreFoundationLibrary, EntryPoint="CFGetTypeID")]
-		public static extern IntPtr GetTypeID (IntPtr typeRef);
-	}
-
-	internal class CFObject : IDisposable, INativeObject
-	{
-		public const string CoreFoundationLibrary = "/System/Library/Frameworks/CoreFoundation.framework/CoreFoundation";
-		const string SystemLibrary = "/usr/lib/libSystem.dylib";
-
-		[DllImport (SystemLibrary)]
-		public static extern IntPtr dlopen (string path, int mode);
-
-		[DllImport (SystemLibrary)]
-		static extern IntPtr dlsym (IntPtr handle, string symbol);
-
-		[DllImport (SystemLibrary)]
-		public static extern void dlclose (IntPtr handle);
-
-		public static IntPtr GetIndirect (IntPtr handle, string symbol)
-		{
-			return dlsym (handle, symbol);
-		}
-
-		public static CFString GetStringConstant (IntPtr handle, string symbol)
-		{
-			var indirect = dlsym (handle, symbol);
-			if (indirect == IntPtr.Zero)
-				return null;
-			var actual = Marshal.ReadIntPtr (indirect);
-			if (actual == IntPtr.Zero)
-				return null;
-			return new CFString (actual, false);
-		}
-
-		public static IntPtr GetIntPtr (IntPtr handle, string symbol)
-		{
-			var indirect = dlsym (handle, symbol);
-			if (indirect == IntPtr.Zero)
-				return IntPtr.Zero;
-			return Marshal.ReadIntPtr (indirect);
-		}
-
-		public static IntPtr GetCFObjectHandle (IntPtr handle, string symbol)
-		{
-			var indirect = dlsym (handle, symbol);
-			if (indirect == IntPtr.Zero)
-				return IntPtr.Zero;
-
-			return Marshal.ReadIntPtr (indirect);
-		}
-
-		public CFObject (IntPtr handle, bool own)
-		{
-			Handle = handle;
-
-			if (!own)
-				Retain ();
-		}
-
-		~CFObject ()
-		{
-			Dispose (false);
-		}
-
-		public IntPtr Handle { get; private set; }
-
-		[DllImport (CoreFoundationLibrary)]
-		internal extern static IntPtr CFRetain (IntPtr handle);
-
-		void Retain ()
-		{
-			CFRetain (Handle);
-		}
-
-		[DllImport (CoreFoundationLibrary)]
-		internal extern static void CFRelease (IntPtr handle);
-
-		void Release ()
-		{
-			CFRelease (Handle);
-		}
-
-		protected virtual void Dispose (bool disposing)
-		{
-			if (Handle != IntPtr.Zero) {
-				Release ();
-				Handle = IntPtr.Zero;
-			}
-		}
-
-		public void Dispose ()
-		{
-			Dispose (true);
-			GC.SuppressFinalize (this);
-		}
-	}
-
-	internal class CFArray : CFObject
-	{
-		public CFArray (IntPtr handle, bool own) : base (handle, own) { }
-
-		[DllImport (CoreFoundationLibrary)]
-		extern static IntPtr CFArrayCreate (IntPtr allocator, IntPtr values, /* CFIndex */ IntPtr numValues, IntPtr callbacks);
-		static readonly IntPtr kCFTypeArrayCallbacks;
-
-		static CFArray ()
-		{
-			var handle = dlopen (CoreFoundationLibrary, 0);
-			if (handle == IntPtr.Zero)
-				return;
-
-			try {
-				kCFTypeArrayCallbacks = GetIndirect (handle, "kCFTypeArrayCallBacks");
-			} finally {
-				dlclose (handle);
-			}
-		}
-		
-		public static CFArray FromNativeObjects (params INativeObject[] values)
-		{
-			return new CFArray (Create (values), true);
-		}
-
-		public static unsafe IntPtr Create (params IntPtr[] values)
-		{
-			if (values == null)
-				throw new ArgumentNullException ("values");
-			fixed (IntPtr* pv = values) {
-				return CFArrayCreate (IntPtr.Zero, (IntPtr) pv, (IntPtr)values.Length, kCFTypeArrayCallbacks);
-			}
-		}
-
-		internal static unsafe CFArray CreateArray (params IntPtr[] values)
-		{
-			if (values == null)
-				throw new ArgumentNullException ("values");
-
-			fixed (IntPtr *pv = values) {
-				IntPtr handle = CFArrayCreate (IntPtr.Zero, (IntPtr) pv, (IntPtr) values.Length, kCFTypeArrayCallbacks);
-
-				return new CFArray (handle, false);
-			}
-		}
-		
-		public static CFArray CreateArray (params INativeObject[] values)
-		{
-			return new CFArray (Create (values), true);
-		}
-
-		public static IntPtr Create (params INativeObject[] values)
-		{
-			if (values == null)
-				throw new ArgumentNullException ("values");
-			IntPtr[] _values = new IntPtr [values.Length];
-			for (int i = 0; i < _values.Length; ++i)
-				_values [i] = values [i].Handle;
-			return Create (_values);
-		}
-
-		[DllImport (CoreFoundationLibrary)]
-		extern static /* CFIndex */ IntPtr CFArrayGetCount (IntPtr handle);
-
-		public int Count {
-			get { return (int) CFArrayGetCount (Handle); }
-		}
-
-		[DllImport (CoreFoundationLibrary)]
-		extern static IntPtr CFArrayGetValueAtIndex (IntPtr handle, /* CFIndex */ IntPtr index);
-
-		public IntPtr this[int index] {
-			get {
-				return CFArrayGetValueAtIndex (Handle, (IntPtr) index);
-			}
-		}
-		
-		static public T [] ArrayFromHandle<T> (IntPtr handle, Func<IntPtr, T> creation) where T : class, INativeObject
-		{
-			if (handle == IntPtr.Zero)
-				return null;
-
-			var c = CFArrayGetCount (handle);
-			T [] ret = new T [(int)c];
-
-			for (uint i = 0; i < (uint)c; i++) {
-				ret [i] = creation (CFArrayGetValueAtIndex (handle, (IntPtr)i));
-			}
-			return ret;
-		}
-	}
-
-	internal class CFNumber : CFObject
-	{
-		public CFNumber (IntPtr handle, bool own) : base (handle, own) { }
-
-		[DllImport (CoreFoundationLibrary)]
-		[return: MarshalAs (UnmanagedType.I1)]
-		extern static bool CFNumberGetValue (IntPtr handle, /* CFNumberType */ IntPtr type, [MarshalAs (UnmanagedType.I1)] out bool value);
-
-		public static bool AsBool (IntPtr handle)
-		{
-			bool value;
-
-			if (handle == IntPtr.Zero)
-				return false;
-
-			CFNumberGetValue (handle, (IntPtr) 1, out value);
-
-			return value;
-		}
-
-		public static implicit operator bool (CFNumber number)
-		{
-			return AsBool (number.Handle);
-		}
-
-		[DllImport (CoreFoundationLibrary)]
-		[return: MarshalAs (UnmanagedType.I1)]
-		extern static bool CFNumberGetValue (IntPtr handle, /* CFNumberType */ IntPtr type, out int value);
-
-		public static int AsInt32 (IntPtr handle)
-		{
-			int value;
-
-			if (handle == IntPtr.Zero)
-				return 0;
-
-			// 9 == kCFNumberIntType == C int
-			CFNumberGetValue (handle, (IntPtr) 9, out value);
-
-			return value;
-		}
-		
-		[DllImport (CoreFoundationLibrary)]
-		extern static IntPtr CFNumberCreate (IntPtr allocator, IntPtr theType, IntPtr valuePtr);	
-
-		public static CFNumber FromInt32 (int number)
-		{
-			// 9 == kCFNumberIntType == C int
-			return new CFNumber (CFNumberCreate (IntPtr.Zero, (IntPtr)9, (IntPtr)number), true);
-		}
-
-		public static implicit operator int (CFNumber number)
-		{
-			return AsInt32 (number.Handle);
-		}
-	}
-
-	internal struct CFRange {
-		public IntPtr Location, Length;
-		
-		public CFRange (int loc, int len)
-		{
-			Location = (IntPtr) loc;
-			Length = (IntPtr) len;
-		}
-	}
-
 	internal struct CFStreamClientContext {
 		public IntPtr Version;
 		public IntPtr Info;
@@ -299,255 +41,6 @@ namespace Mono.Net
 		public IntPtr CopyDescription;
 	}
 
-	internal class CFString : CFObject
-	{
-		string str;
-
-		public CFString (IntPtr handle, bool own) : base (handle, own) { }
-
-		[DllImport (CoreFoundationLibrary)]
-		extern static IntPtr CFStringCreateWithCharacters (IntPtr alloc, IntPtr chars, /* CFIndex */ IntPtr length);
-
-		public static CFString Create (string value)
-		{
-			IntPtr handle;
-
-			unsafe {
-				fixed (char *ptr = value) {
-					handle = CFStringCreateWithCharacters (IntPtr.Zero, (IntPtr) ptr, (IntPtr) value.Length);
-				}
-			}
-
-			if (handle == IntPtr.Zero)
-				return null;
-
-			return new CFString (handle, true);
-		}
-
-		[DllImport (CoreFoundationLibrary)]
-		extern static /* CFIndex */ IntPtr CFStringGetLength (IntPtr handle);
-
-		public int Length {
-			get {
-				if (str != null)
-					return str.Length;
-
-				return (int) CFStringGetLength (Handle);
-			}
-		}
-		
-		[DllImport (CoreFoundationLibrary)]
-		extern static int CFStringCompare (IntPtr theString1, IntPtr theString2, int compareOptions);
-		
-		public static int Compare (IntPtr string1, IntPtr string2, int compareOptions = 0)
-		{
-			return CFStringCompare (string1, string2, compareOptions);
-		}
-
-		[DllImport (CoreFoundationLibrary)]
-		extern static IntPtr CFStringGetCharactersPtr (IntPtr handle);
-
-		[DllImport (CoreFoundationLibrary)]
-		extern static IntPtr CFStringGetCharacters (IntPtr handle, CFRange range, IntPtr buffer);
-
-		public static string AsString (IntPtr handle)
-		{
-			if (handle == IntPtr.Zero)
-				return null;
-			
-			int len = (int) CFStringGetLength (handle);
-			
-			if (len == 0)
-				return string.Empty;
-			
-			IntPtr chars = CFStringGetCharactersPtr (handle);
-			IntPtr buffer = IntPtr.Zero;
-			
-			if (chars == IntPtr.Zero) {
-				CFRange range = new CFRange (0, len);
-				buffer = Marshal.AllocHGlobal (len * 2);
-				CFStringGetCharacters (handle, range, buffer);
-				chars = buffer;
-			}
-
-			string str;
-
-			unsafe {
-				str = new string ((char *) chars, 0, len);
-			}
-			
-			if (buffer != IntPtr.Zero)
-				Marshal.FreeHGlobal (buffer);
-
-			return str;
-		}
-
-		public override string ToString ()
-		{
-			if (str == null)
-				str = AsString (Handle);
-
-			return str;
-		}
-
-		public static implicit operator string (CFString str)
-		{
-			return str.ToString ();
-		}
-
-		public static implicit operator CFString (string str)
-		{
-			return Create (str);
-		}
-	}
-
-	
-	internal class CFData : CFObject
-	{
-		public CFData (IntPtr handle, bool own) : base (handle, own) { }
-	
-		[DllImport (CoreFoundationLibrary)]
-		extern static /* CFDataRef */ IntPtr CFDataCreate (/* CFAllocatorRef */ IntPtr allocator, /* UInt8* */ IntPtr bytes, /* CFIndex */ IntPtr length);
-		public unsafe static CFData FromData (byte [] buffer)
-		{
-			fixed (byte* p = buffer)
-			{
-				return FromData ((IntPtr)p, (IntPtr)buffer.Length);
-			}
-		}
-
-		public static CFData FromData (IntPtr buffer, IntPtr length)
-		{
-			return new CFData (CFDataCreate (IntPtr.Zero, buffer, length), true);
-		}
-		
-		public IntPtr Length {
-			get { return CFDataGetLength (Handle); }
-		}
-
-		[DllImport (CoreFoundationLibrary)]
-		internal extern static /* CFIndex */ IntPtr CFDataGetLength (/* CFDataRef */ IntPtr theData);
-
-		[DllImport (CoreFoundationLibrary)]
-		internal extern static /* UInt8* */ IntPtr CFDataGetBytePtr (/* CFDataRef */ IntPtr theData);
-
-		/*
-		 * Exposes a read-only pointer to the underlying storage.
-		 */
-		public IntPtr Bytes {
-			get { return CFDataGetBytePtr (Handle); }
-		}
-
-		public byte this [long idx] {
-			get {
-				if (idx < 0 || (ulong) idx > (ulong) Length)
-					throw new ArgumentException ("idx");
-				return Marshal.ReadByte (new IntPtr (Bytes.ToInt64 () + idx));
-			}
-
-			set {
-				throw new NotImplementedException ("NSData arrays can not be modified, use an NSMutableData instead");
-			}
-		}
-
-	}
-
-	internal class CFDictionary : CFObject
-	{
-		static readonly IntPtr KeyCallbacks;
-		static readonly IntPtr ValueCallbacks;
-		
-		static CFDictionary ()
-		{
-			var handle = dlopen (CoreFoundationLibrary, 0);
-			if (handle == IntPtr.Zero)
-				return;
-
-			try {		
-				KeyCallbacks = GetIndirect (handle, "kCFTypeDictionaryKeyCallBacks");
-				ValueCallbacks = GetIndirect (handle, "kCFTypeDictionaryValueCallBacks");
-			} finally {
-				dlclose (handle);
-			}
-		}
-
-		public CFDictionary (IntPtr handle, bool own) : base (handle, own) { }
-
-		public static CFDictionary FromObjectAndKey (IntPtr obj, IntPtr key)
-		{
-			return new CFDictionary (CFDictionaryCreate (IntPtr.Zero, new IntPtr[] { key }, new IntPtr [] { obj }, (IntPtr)1, KeyCallbacks, ValueCallbacks), true);
-		}
-
-		public static CFDictionary FromKeysAndObjects (IList<Tuple<IntPtr,IntPtr>> items)
-		{
-			var keys = new IntPtr [items.Count];
-			var values = new IntPtr [items.Count];
-			for (int i = 0; i < items.Count; i++) {
-				keys [i] = items [i].Item1;
-				values [i] = items [i].Item2;
-			}
-			return new CFDictionary (CFDictionaryCreate (IntPtr.Zero, keys, values, (IntPtr)items.Count, KeyCallbacks, ValueCallbacks), true);
-		}
-
-		[DllImport (CoreFoundationLibrary)]
-		extern static IntPtr CFDictionaryCreate (IntPtr allocator, IntPtr[] keys, IntPtr[] vals, IntPtr len, IntPtr keyCallbacks, IntPtr valCallbacks);
-
-		[DllImport (CoreFoundationLibrary)]
-		extern static IntPtr CFDictionaryGetValue (IntPtr handle, IntPtr key);
-
-		[DllImport (CoreFoundationLibrary)]
-		extern static IntPtr CFDictionaryCreateCopy (IntPtr allocator, IntPtr handle);
-
-		public CFDictionary Copy ()
-		{
-			return new CFDictionary (CFDictionaryCreateCopy (IntPtr.Zero, Handle), true);
-		}
-		
-		public CFMutableDictionary MutableCopy ()
-		{
-			return new CFMutableDictionary (CFDictionaryCreateMutableCopy (IntPtr.Zero, IntPtr.Zero, Handle), true);
-		}
-
-		[DllImport (CoreFoundationLibrary)]
-		extern static IntPtr CFDictionaryCreateMutableCopy (IntPtr allocator, IntPtr capacity, IntPtr theDict);
-
-		public IntPtr GetValue (IntPtr key)
-		{
-			return CFDictionaryGetValue (Handle, key);
-		}
-
-		public IntPtr this[IntPtr key] {
-			get {
-				return GetValue (key);
-			}
-		}
-	}
-	
-	internal class CFMutableDictionary : CFDictionary
-	{
-		public CFMutableDictionary (IntPtr handle, bool own) : base (handle, own) { }
-
-		public void SetValue (IntPtr key, IntPtr val)
-		{
-			CFDictionarySetValue (Handle, key, val);
-		}
-
-		public static CFMutableDictionary Create ()
-		{
-			var handle = CFDictionaryCreateMutable (IntPtr.Zero, IntPtr.Zero, IntPtr.Zero, IntPtr.Zero);
-			if (handle == IntPtr.Zero)
-				throw new InvalidOperationException ();
-			return new CFMutableDictionary (handle, true);
-		}
-
-		[DllImport (CoreFoundationLibrary)]
-		extern static void CFDictionarySetValue (IntPtr handle, IntPtr key, IntPtr val);
-
-		[DllImport (CoreFoundationLibrary)]
-		extern static IntPtr CFDictionaryCreateMutable (IntPtr allocator, IntPtr capacity, IntPtr keyCallback, IntPtr valueCallbacks);
-
-	}
-
 	internal class CFUrl : CFObject
 	{
 		public CFUrl (IntPtr handle, bool own) : base (handle, own) { }
@@ -1287,135 +780,4 @@ namespace Mono.Net
 		}
 	}
 
-	class CFBoolean : INativeObject, IDisposable {
-		IntPtr handle;
-
-		public static readonly CFBoolean True;
-		public static readonly CFBoolean False;
-
-		static CFBoolean ()
-		{
-			var handle = CFObject.dlopen (CFObject.CoreFoundationLibrary, 0);
-			if (handle == IntPtr.Zero)
-				return;
-			try {
-				True  = new CFBoolean (CFObject.GetCFObjectHandle (handle, "kCFBooleanTrue"), false);
-				False = new CFBoolean (CFObject.GetCFObjectHandle (handle, "kCFBooleanFalse"), false);
-			}
-			finally {
-				CFObject.dlclose (handle);
-			}
-		}
-
-		internal CFBoolean (IntPtr handle, bool owns)
-		{
-			this.handle = handle;
-			if (!owns)
-				CFObject.CFRetain (handle);
-		}
-
-		~CFBoolean ()
-		{
-			Dispose (false);
-		}
-
-		public IntPtr Handle {
-			get {
-				return handle;
-			}
-		}
-
-		public void Dispose ()
-		{
-			Dispose (true);
-			GC.SuppressFinalize (this);
-		}
-
-		protected virtual void Dispose (bool disposing)
-		{
-			if (handle != IntPtr.Zero){
-				CFObject.CFRelease (handle);
-				handle = IntPtr.Zero;
-			}
-		}
-
-		public static implicit operator bool (CFBoolean value)
-		{
-			return value.Value;
-		}
-
-		public static explicit operator CFBoolean (bool value)
-		{
-			return FromBoolean (value);
-		}
-
-		public static CFBoolean FromBoolean (bool value)
-		{
-			return value ? True : False;
-		}
-
-		[DllImport (CFObject.CoreFoundationLibrary)]
-		[return: MarshalAs (UnmanagedType.I1)]
-		extern static /* Boolean */ bool CFBooleanGetValue (/* CFBooleanRef */ IntPtr boolean);
-
-		public bool Value {
-			get {return CFBooleanGetValue (handle);}
-		}
-
-		public static bool GetValue (IntPtr boolean)
-		{
-			return CFBooleanGetValue (boolean);
-		}
-	}
-
-	internal class CFDate : INativeObject, IDisposable {
-		IntPtr handle;
-
-		internal CFDate (IntPtr handle, bool owns)
-		{
-			this.handle = handle;
-			if (!owns)
-				CFObject.CFRetain (handle);
-		}
-
-		~CFDate ()
-		{
-			Dispose (false);
-		}
-
-		[DllImport (CFObject.CoreFoundationLibrary)]
-		extern static IntPtr CFDateCreate (IntPtr allocator, /* CFAbsoluteTime */ double at);
-
-		public static CFDate Create (DateTime date)
-		{
-			var referenceTime = new DateTime (2001, 1, 1);
-			var difference = (date - referenceTime).TotalSeconds;
-			var handle = CFDateCreate (IntPtr.Zero, difference);
-			if (handle == IntPtr.Zero)
-				throw new NotSupportedException ();
-			return new CFDate (handle, true);
-		}
-
-		public IntPtr Handle {
-			get {
-				return handle;
-			}
-		}
-
-		public void Dispose ()
-		{
-			Dispose (true);
-			GC.SuppressFinalize (this);
-		}
-
-		protected virtual void Dispose (bool disposing)
-		{
-			if (handle != IntPtr.Zero) {
-				CFObject.CFRelease (handle);
-				handle = IntPtr.Zero;
-			}
-		}
-
-	}
-
 }

+ 10 - 2
mcs/class/System/System.csproj

@@ -47,12 +47,12 @@
   <PropertyGroup Condition=" '$(Platform)' == 'monotouch_watch' ">
     <OutputPath>./../../class/lib/monotouch_watch</OutputPath>
     <IntermediateOutputPath>./../../class/obj/$(AssemblyName)-monotouch_watch</IntermediateOutputPath>
-    <DefineConstants>NET_1_1;NET_2_0;NET_2_1;NET_3_5;NET_4_0;NET_4_5;MOBILE;MOBILE_LEGACY;MONO;MONOTOUCH;DISABLE_REMOTING;DISABLE_COM;FEATURE_INTERCEPTABLE_THREADPOOL_CALLBACK;FULL_AOT_RUNTIME;FEATURE_NO_BSD_SOCKETS;MONOTOUCH_WATCH;COREFX;CONFIGURATION_2_0;XML_DEP;SECURITY_DEP;FEATURE_PAL;SYSTEM_NAMESPACE;MONO;PLATFORM_UNIX;INSIDE_SYSTEM</DefineConstants>
+    <DefineConstants>NET_1_1;NET_2_0;NET_2_1;NET_3_5;NET_4_0;NET_4_5;MOBILE;MOBILE_LEGACY;MONO;MONOTOUCH;DISABLE_REMOTING;DISABLE_COM;FEATURE_INTERCEPTABLE_THREADPOOL_CALLBACK;FULL_AOT_RUNTIME;FEATURE_NO_BSD_SOCKETS;MONOTOUCH_WATCH;COREFX;CONFIGURATION_2_0;XML_DEP;SECURITY_DEP;FEATURE_PAL;SYSTEM_NAMESPACE;MONO;PLATFORM_UNIX;INSIDE_SYSTEM;MONO_FEATURE_APPLE_X509</DefineConstants>
   </PropertyGroup>
   <PropertyGroup Condition=" '$(Platform)' == 'monotouch_watch_runtime' ">
     <OutputPath>./../../class/lib/monotouch_watch_runtime</OutputPath>
     <IntermediateOutputPath>./../../class/obj/$(AssemblyName)-monotouch_watch_runtime</IntermediateOutputPath>
-    <DefineConstants>NET_1_1;NET_2_0;NET_2_1;NET_3_5;NET_4_0;NET_4_5;MOBILE;MOBILE_LEGACY;MONO;MONOTOUCH;DISABLE_REMOTING;DISABLE_COM;FEATURE_INTERCEPTABLE_THREADPOOL_CALLBACK;FEATURE_NO_BSD_SOCKETS;MONOTOUCH_WATCH;COREFX;CONFIGURATION_2_0;XML_DEP;SECURITY_DEP;FEATURE_PAL;SYSTEM_NAMESPACE;MONO;PLATFORM_UNIX;MONO_FEATURE_PROCESS_START;MONO_FEATURE_MULTIPLE_APPDOMAINS;INSIDE_SYSTEM</DefineConstants>
+    <DefineConstants>NET_1_1;NET_2_0;NET_2_1;NET_3_5;NET_4_0;NET_4_5;MOBILE;MOBILE_LEGACY;MONO;MONOTOUCH;DISABLE_REMOTING;DISABLE_COM;FEATURE_INTERCEPTABLE_THREADPOOL_CALLBACK;FEATURE_NO_BSD_SOCKETS;MONOTOUCH_WATCH;COREFX;CONFIGURATION_2_0;XML_DEP;SECURITY_DEP;FEATURE_PAL;SYSTEM_NAMESPACE;MONO;PLATFORM_UNIX;MONO_FEATURE_PROCESS_START;MONO_FEATURE_MULTIPLE_APPDOMAINS;INSIDE_SYSTEM;MONO_FEATURE_APPLE_X509</DefineConstants>
   </PropertyGroup>
   <PropertyGroup Condition=" '$(Platform)' == 'monotouch_tv' ">
     <OutputPath>./../../class/lib/monotouch_tv</OutputPath>
@@ -803,6 +803,7 @@
     <Compile Include="Mono.Btls\X509PalImpl.Btls.cs" />
     <Compile Include="Mono.Util\MonoPInvokeCallbackAttribute.cs" />
     <Compile Include="MonoTouch\Dummy.cs" />
+    <Compile Include="Mono\AppleTypes.cs" />
     <Compile Include="Mono\SystemCertificateProvider.cs" />
     <Compile Include="Mono\SystemDependencyProvider.cs" />
     <Compile Include="Mono\X509Pal.cs" />
@@ -3455,6 +3456,13 @@
         <Compile Include="..\Mono.Security\Mono.Security.X509\X520Attributes.cs" />
         <Compile Include="..\Mono.Security\Mono.Security\PKCS7.cs" />
         <Compile Include="Internal.Cryptography\OidLookup.Managed.cs" />
+        <Compile Include="Mono.AppleTls\Enums.cs" />
+        <Compile Include="Mono.AppleTls\MonoCertificatePal.Mobile.cs" />
+        <Compile Include="Mono.AppleTls\MonoCertificatePal.cs" />
+        <Compile Include="Mono.AppleTls\SafeHandles.Mono.cs" />
+        <Compile Include="Mono.AppleTls\SafeHandles.cs" />
+        <Compile Include="Mono.AppleTls\X509CertificateImplApple.cs" />
+        <Compile Include="Mono.AppleTls\X509PalImpl.Apple.cs" />
         <Compile Include="System.Net.Mail\SmtpClient.platformnotsupported.cs" />
         <Compile Include="System.Net.NetworkInformation\LinuxIPInterfaceProperties.cs" />
         <Compile Include="System.Net.NetworkInformation\LinuxIPv4InterfaceProperties.cs" />

+ 6 - 0
mcs/class/System/apple-certificates.sources

@@ -0,0 +1,6 @@
+Mono.AppleTls/Enums.cs
+Mono.AppleTls/X509CertificateImplApple.cs
+Mono.AppleTls/X509PalImpl.Apple.cs
+
+Mono.AppleTls/MonoCertificatePal.cs
+Mono.AppleTls/SafeHandles.Mono.cs

+ 0 - 6
mcs/class/System/appletls.sources

@@ -2,13 +2,7 @@ Mono.AppleTls/AppleCertificateHelper.cs
 Mono.AppleTls/AppleTlsContext.cs
 Mono.AppleTls/AppleTlsProvider.cs
 Mono.AppleTls/AppleTlsStream.cs
-Mono.AppleTls/Enums.cs
 Mono.AppleTls/SecureTransport.cs
 Mono.AppleTls/Policy.cs
 Mono.AppleTls/Trust.cs
 Mono.AppleTls/SslConnection.cs
-Mono.AppleTls/X509CertificateImplApple.cs
-Mono.AppleTls/X509PalImpl.Apple.cs
-
-Mono.AppleTls/MonoCertificatePal.cs
-Mono.AppleTls/SafeHandles.Mono.cs

+ 1 - 0
mcs/class/System/common.sources

@@ -191,6 +191,7 @@ System.Timers/ElapsedEventArgs.cs
 
 System.Windows.Input/ICommand.cs
 
+Mono/AppleTypes.cs
 Mono/SystemCertificateProvider.cs
 Mono/SystemDependencyProvider.cs
 Mono/X509Pal.cs

+ 1 - 0
mcs/class/System/macos_net_4_x_System.dll.sources

@@ -1,5 +1,6 @@
 #include corefx.unix.sources
 #include net_4_x_System.dll.sources
+#include apple-certificates.sources
 #include appletls.sources
 
 Mono.AppleTls/MonoCertificatePal.OSX.cs

+ 1 - 0
mcs/class/System/monotouch_System.dll.sources

@@ -1,4 +1,5 @@
 #include mobile_System.dll.sources
+#include apple-certificates.sources
 #include appletls.sources
 
 Mono.AppleTls/MonoCertificatePal.Mobile.cs

+ 0 - 2
mcs/class/System/monotouch_watch_System.dll.exclude.sources

@@ -1,4 +1,2 @@
 #include common_networking.sources
 #include appletls.sources
-Mono.AppleTls/MonoCertificatePal.Mobile.cs
-Mono.AppleTls/SafeHandles.cs

+ 3 - 1
mcs/class/System/monotouch_watch_System.dll.sources

@@ -1,4 +1,6 @@
 #include monotouch_System.dll.sources
+#include apple-certificates.sources
+
 System.Net.Mail/SmtpClient.platformnotsupported.cs
 System.Net.Security/SslStream.platformnotsupported.cs
 System.Net.Sockets/TcpClient.platformnotsupported.cs
@@ -38,4 +40,4 @@ System.Net.WebSockets/HttpListenerWebSocketContext.platformnotsupported.cs
 ../Mono.Security/Mono.Security.X509/X520Attributes.cs
 ../Mono.Security/Mono.Security.X509.Extensions/BasicConstraintsExtension.cs
 ../Mono.Security/Mono.Security.X509.Extensions/KeyUsageExtension.cs
-../Mono.Security/Mono.Security.X509.Extensions/SubjectKeyIdentifierExtension.cs
+../Mono.Security/Mono.Security.X509.Extensions/SubjectKeyIdentifierExtension.cs

+ 1 - 0
mcs/class/System/xammac_System.dll.sources

@@ -1,4 +1,5 @@
 #include mobile_System.dll.sources
+#include apple-certificates.sources
 #include appletls.sources
 
 Mono.AppleTls/MonoCertificatePal.Mobile.cs