using CPF.Mac.ObjCRuntime;
using System;
using System.Runtime.InteropServices;

namespace CPF.Mac.Security
{
	internal class SecItem
	{
		internal static IntPtr securityLibrary = Dlfcn.dlopen("/System/Library/Frameworks/Security.framework/Security", 0);

		private static IntPtr _MatchPolicy;

		private static IntPtr _MatchItemList;

		private static IntPtr _MatchSearchList;

		private static IntPtr _MatchIssuers;

		private static IntPtr _MatchEmailAddressIfPresent;

		private static IntPtr _MatchSubjectContains;

		private static IntPtr _MatchCaseInsensitive;

		private static IntPtr _MatchTrustedOnly;

		private static IntPtr _MatchValidOnDate;

		private static IntPtr _MatchLimit;

		private static IntPtr _ReturnData;

		private static IntPtr _ReturnAttributes;

		private static IntPtr _ReturnRef;

		private static IntPtr _ReturnPersistentRef;

		private static IntPtr _ValueData;

		private static IntPtr _ValueRef;

		private static IntPtr _ValuePersistentRef;

		private static IntPtr _UseItemList;

		public static IntPtr MatchPolicy
		{
			get
			{
				if (_MatchPolicy == IntPtr.Zero)
				{
					_MatchPolicy = Dlfcn.GetIntPtr(securityLibrary, "kSecMatchPolicy");
				}
				return _MatchPolicy;
			}
		}

		public static IntPtr MatchItemList
		{
			get
			{
				if (_MatchItemList == IntPtr.Zero)
				{
					_MatchItemList = Dlfcn.GetIntPtr(securityLibrary, "kSecMatchItemList");
				}
				return _MatchItemList;
			}
		}

		public static IntPtr MatchSearchList
		{
			get
			{
				if (_MatchSearchList == IntPtr.Zero)
				{
					_MatchSearchList = Dlfcn.GetIntPtr(securityLibrary, "kSecMatchSearchList");
				}
				return _MatchSearchList;
			}
		}

		public static IntPtr MatchIssuers
		{
			get
			{
				if (_MatchIssuers == IntPtr.Zero)
				{
					_MatchIssuers = Dlfcn.GetIntPtr(securityLibrary, "kSecMatchIssuers");
				}
				return _MatchIssuers;
			}
		}

		public static IntPtr MatchEmailAddressIfPresent
		{
			get
			{
				if (_MatchEmailAddressIfPresent == IntPtr.Zero)
				{
					_MatchEmailAddressIfPresent = Dlfcn.GetIntPtr(securityLibrary, "kSecMatchEmailAddressIfPresent");
				}
				return _MatchEmailAddressIfPresent;
			}
		}

		public static IntPtr MatchSubjectContains
		{
			get
			{
				if (_MatchSubjectContains == IntPtr.Zero)
				{
					_MatchSubjectContains = Dlfcn.GetIntPtr(securityLibrary, "kSecMatchSubjectContains");
				}
				return _MatchSubjectContains;
			}
		}

		public static IntPtr MatchCaseInsensitive
		{
			get
			{
				if (_MatchCaseInsensitive == IntPtr.Zero)
				{
					_MatchCaseInsensitive = Dlfcn.GetIntPtr(securityLibrary, "kSecMatchCaseInsensitive");
				}
				return _MatchCaseInsensitive;
			}
		}

		public static IntPtr MatchTrustedOnly
		{
			get
			{
				if (_MatchTrustedOnly == IntPtr.Zero)
				{
					_MatchTrustedOnly = Dlfcn.GetIntPtr(securityLibrary, "kSecMatchTrustedOnly");
				}
				return _MatchTrustedOnly;
			}
		}

		public static IntPtr MatchValidOnDate
		{
			get
			{
				if (_MatchValidOnDate == IntPtr.Zero)
				{
					_MatchValidOnDate = Dlfcn.GetIntPtr(securityLibrary, "kSecMatchValidOnDate");
				}
				return _MatchValidOnDate;
			}
		}

		public static IntPtr MatchLimit
		{
			get
			{
				if (_MatchLimit == IntPtr.Zero)
				{
					_MatchLimit = Dlfcn.GetIntPtr(securityLibrary, "kSecMatchLimit");
				}
				return _MatchLimit;
			}
		}

		public static IntPtr ReturnData
		{
			get
			{
				if (_ReturnData == IntPtr.Zero)
				{
					_ReturnData = Dlfcn.GetIntPtr(securityLibrary, "kSecReturnData");
				}
				return _ReturnData;
			}
		}

		public static IntPtr ReturnAttributes
		{
			get
			{
				if (_ReturnAttributes == IntPtr.Zero)
				{
					_ReturnAttributes = Dlfcn.GetIntPtr(securityLibrary, "kSecReturnAttributes");
				}
				return _ReturnAttributes;
			}
		}

		public static IntPtr ReturnRef
		{
			get
			{
				if (_ReturnRef == IntPtr.Zero)
				{
					_ReturnRef = Dlfcn.GetIntPtr(securityLibrary, "kSecReturnRef");
				}
				return _ReturnRef;
			}
		}

		public static IntPtr ReturnPersistentRef
		{
			get
			{
				if (_ReturnPersistentRef == IntPtr.Zero)
				{
					_ReturnPersistentRef = Dlfcn.GetIntPtr(securityLibrary, "kSecReturnPersistentRef");
				}
				return _ReturnPersistentRef;
			}
		}

		public static IntPtr ValueData
		{
			get
			{
				if (_ValueData == IntPtr.Zero)
				{
					_ValueData = Dlfcn.GetIntPtr(securityLibrary, "kSecValueData");
				}
				return _ValueData;
			}
		}

		public static IntPtr ValueRef
		{
			get
			{
				if (_ValueRef == IntPtr.Zero)
				{
					_ValueRef = Dlfcn.GetIntPtr(securityLibrary, "kSecValueRef");
				}
				return _ValueRef;
			}
		}

		public static IntPtr ValuePersistentRef
		{
			get
			{
				if (_ValuePersistentRef == IntPtr.Zero)
				{
					_ValuePersistentRef = Dlfcn.GetIntPtr(securityLibrary, "kSecValuePersistentRef");
				}
				return _ValuePersistentRef;
			}
		}

		public static IntPtr UseItemList
		{
			get
			{
				if (_UseItemList == IntPtr.Zero)
				{
					_UseItemList = Dlfcn.GetIntPtr(securityLibrary, "kSecUseItemList");
				}
				return _UseItemList;
			}
		}

		[DllImport("/System/Library/Frameworks/Security.framework/Security")]
		internal static extern SecStatusCode SecItemCopyMatching(IntPtr cfDictRef, out IntPtr result);

		[DllImport("/System/Library/Frameworks/Security.framework/Security")]
		internal static extern SecStatusCode SecItemAdd(IntPtr cfDictRef, IntPtr result);

		[DllImport("/System/Library/Frameworks/Security.framework/Security")]
		internal static extern SecStatusCode SecItemDelete(IntPtr cfDictRef);

		[DllImport("/System/Library/Frameworks/Security.framework/Security")]
		internal static extern SecStatusCode SecItemUpdate(IntPtr cfDictRef, IntPtr attrsToUpdate);
	}
}
