/// <summary>
        /// Initializes a new instance of the CertificateProvider class.
        /// This initializes the default certificate store locations.
        /// </summary>
        public CertificateProvider()
        {
            //
            // initialize storeLocations list and also update the cache
            //
            lock (s_staticLock)
            {
                if (s_storeLocations == null)
                {
                    s_pathCache = new Hashtable(StringComparer.OrdinalIgnoreCase);
                    s_storeLocations =
                        new List<X509StoreLocation>();

                    //
                    // create and cache CurrentUser store-location
                    //
                    X509StoreLocation user =
                        new X509StoreLocation(StoreLocation.CurrentUser);
                    s_storeLocations.Add(user);
                    AddItemToCache(StoreLocation.CurrentUser.ToString(),
                                  user);

                    //
                    // create and cache LocalMachine store-location
                    //
                    X509StoreLocation machine =
                        new X509StoreLocation(StoreLocation.LocalMachine);
                    s_storeLocations.Add(machine);
                    AddItemToCache(StoreLocation.LocalMachine.ToString(),
                                   machine);

                    AddItemToCache("", s_storeLocations);
                }
            }
        } // constructor
        public static void WriteSendAsTrustedIssuerProperty(X509Certificate2 cert, string certPath, bool addProperty)
        {
            if (DownLevelHelper.TrustedIssuerSupported())
            {
                IntPtr propertyPtr = IntPtr.Zero;
                Security.NativeMethods.CRYPT_DATA_BLOB dataBlob = new Security.NativeMethods.CRYPT_DATA_BLOB();
                dataBlob.cbData = 0;
                dataBlob.pbData = IntPtr.Zero;
                X509Certificate certFromStore = null;

                try
                {
                    if (certPath != null)
                    {
                        //try to open the store and get the cert out
                        //in case the store handle is already released
                        string[] pathElements = GetPathElements(certPath);

                        //certpath is in the format: Microsoft.Powershell.Security\
                        //Certificate::CurrentUser(LocalMachine)\my\HashID
                        //obtained pathElements[0] is Microsoft.Powershell.Security
                        //obtained pathElements[1] is Certificate::CurrentUser
                        //obtained pathElements[2] is MY
                        //obtained pathElements[3] is HashID

                        bool fUserContext = String.Equals(pathElements[1], "Certificate::CurrentUser", StringComparison.OrdinalIgnoreCase);

                        X509StoreLocation storeLocation =
                            new X509StoreLocation(fUserContext ? StoreLocation.CurrentUser : StoreLocation.LocalMachine);

                        //get certificate from the store pathElements[2]
                        X509NativeStore store = null;

                        store = new X509NativeStore(storeLocation, pathElements[2]);
                        store.Open(true); //including archival flag

                        IntPtr certContext = store.GetCertByName(pathElements[3]);

                        if (certContext != IntPtr.Zero)
                        {
                            certFromStore = new X509Certificate2(certContext);
                            store.FreeCert(certContext);
                        }
                    }

                    if (addProperty) //should add the property
                    {
                        propertyPtr = Marshal.AllocHGlobal(Marshal.SizeOf(dataBlob));
                        Marshal.StructureToPtr(dataBlob, propertyPtr, false);
                    }

                    //set property
                    if (!Security.NativeMethods.CertSetCertificateContextProperty(
                                certFromStore != null ? certFromStore.Handle : cert.Handle,
                                Security.NativeMethods.CertPropertyId.CERT_SEND_AS_TRUSTED_ISSUER_PROP_ID,
                                0,
                                propertyPtr))
                    {
                        throw new System.ComponentModel.Win32Exception(Marshal.GetLastWin32Error());
                    }
                }
                finally
                {
                    if (propertyPtr != IntPtr.Zero)
                    {
                        Marshal.FreeHGlobal(propertyPtr);
                    }
                }
            }
            else
            {
                throw Marshal.GetExceptionForHR(Security.NativeMethods.NTE_NOT_SUPPORTED);
            }
        }
        //#region tracer

        /// <summary>
        /// Initializes a new instance of the X509NativeStore class.
        /// </summary>
        public X509NativeStore(X509StoreLocation StoreLocation, string StoreName)
        {
            _storeLocation = StoreLocation;
            _storeName = StoreName;
        }
        /// <summary>
        /// gets the X509NativeStore at the specified path.
        /// Adds to cache if not already there.
        /// </summary>
        ///
        /// <param name="storePath"> path to the store </param>
        ///
        /// <param name="storeName"> name of store (path leaf element) </param>
        ///
        /// <param name="storeLocation"> location of store (CurrentUser or LocalMachine) </param>
        ///
        /// <returns> X509NativeStore object </returns>
        ///
        private X509NativeStore GetStore(string storePath,
                                   string storeName,
                                   X509StoreLocation storeLocation)
        {
            if (!storeLocation.StoreNames.ContainsKey(storeName))
            {
                ThrowItemNotFound(storePath, CertificateProviderItem.Store);
            }
            if (s_storeCache != null)
            {
                if (s_storeCache.Location != storeLocation ||
                    !String.Equals(
                                s_storeCache.StoreName,
                                storeName,
                                StringComparison.OrdinalIgnoreCase))
                {
                    s_storeCache = null;
                }
            }

            if (s_storeCache == null)
            {
                s_storeCache = new X509NativeStore(storeLocation, storeName);
            }

            return s_storeCache;
        }
Beispiel #5
0
		public CertificateProvider()
		{
			lock (CertificateProvider.staticLock)
			{
				if (CertificateProvider.storeLocations == null)
				{
					CertificateProvider.pathCache = new Hashtable(StringComparer.OrdinalIgnoreCase);
					CertificateProvider.storeLocations = new List<X509StoreLocation>();
					X509StoreLocation x509StoreLocation = new X509StoreLocation(StoreLocation.CurrentUser);
					CertificateProvider.storeLocations.Add(x509StoreLocation);
					CertificateProvider.AddItemToCache(StoreLocation.CurrentUser.ToString(), x509StoreLocation);
					X509StoreLocation x509StoreLocation1 = new X509StoreLocation(StoreLocation.LocalMachine);
					CertificateProvider.storeLocations.Add(x509StoreLocation1);
					CertificateProvider.AddItemToCache(StoreLocation.LocalMachine.ToString(), x509StoreLocation1);
					CertificateProvider.AddItemToCache("", CertificateProvider.storeLocations);
				}
			}
		}
Beispiel #6
0
 public X509NativeStore(X509StoreLocation StoreLocation, string StoreName)
 {
     this.storeLocation = StoreLocation;
     this.storeName     = StoreName;
 }
Beispiel #7
0
        public static void WriteSendAsTrustedIssuerProperty(X509Certificate2 cert, string certPath, bool addProperty)
        {
            IntPtr        handle;
            StoreLocation storeLocation;

            if (!DownLevelHelper.IsWin8AndAbove())
            {
                throw Marshal.GetExceptionForHR(-2146893783);
            }
            else
            {
                IntPtr zero = IntPtr.Zero;
                NativeMethods.CRYPT_DATA_BLOB cRYPTDATABLOB = new NativeMethods.CRYPT_DATA_BLOB();
                cRYPTDATABLOB.cbData = 0;
                cRYPTDATABLOB.pbData = IntPtr.Zero;
                X509Certificate x509Certificate2 = null;
                try
                {
                    if (certPath != null)
                    {
                        string[] pathElements = SendAsTrustedIssuerProperty.GetPathElements(certPath);
                        bool     flag         = string.Equals(pathElements[0], "CurrentUser", StringComparison.OrdinalIgnoreCase);
                        if (flag)
                        {
                            storeLocation = StoreLocation.CurrentUser;
                        }
                        else
                        {
                            storeLocation = StoreLocation.LocalMachine;
                        }
                        X509StoreLocation x509StoreLocation = new X509StoreLocation(storeLocation);
                        X509NativeStore   x509NativeStore   = new X509NativeStore(x509StoreLocation, pathElements[1]);
                        x509NativeStore.Open(true);
                        IntPtr certByName = x509NativeStore.GetCertByName(pathElements[2]);
                        if (certByName != IntPtr.Zero)
                        {
                            x509Certificate2 = new X509Certificate2(certByName);
                            x509NativeStore.FreeCert(certByName);
                        }
                    }
                    if (addProperty)
                    {
                        zero = Marshal.AllocHGlobal(Marshal.SizeOf(cRYPTDATABLOB));
                        Marshal.StructureToPtr(cRYPTDATABLOB, zero, false);
                    }
                    if (x509Certificate2 != null)
                    {
                        handle = x509Certificate2.Handle;
                    }
                    else
                    {
                        handle = cert.Handle;
                    }
                    if (!NativeMethods.CertSetCertificateContextProperty(handle, NativeMethods.CertPropertyId.CERT_SEND_AS_TRUSTED_ISSUER_PROP_ID, 0, zero))
                    {
                        throw new Win32Exception(Marshal.GetLastWin32Error());
                    }
                }
                finally
                {
                    if (zero != IntPtr.Zero)
                    {
                        Marshal.FreeHGlobal(zero);
                    }
                }
                return;
            }
        }
		public static void WriteSendAsTrustedIssuerProperty(X509Certificate2 cert, string certPath, bool addProperty)
		{
			IntPtr handle;
			StoreLocation storeLocation;
			if (!DownLevelHelper.IsWin8AndAbove())
			{
				throw Marshal.GetExceptionForHR(-2146893783);
			}
			else
			{
				IntPtr zero = IntPtr.Zero;
				NativeMethods.CRYPT_DATA_BLOB cRYPTDATABLOB = new NativeMethods.CRYPT_DATA_BLOB();
				cRYPTDATABLOB.cbData = 0;
				cRYPTDATABLOB.pbData = IntPtr.Zero;
				X509Certificate x509Certificate2 = null;
				try
				{
					if (certPath != null)
					{
						string[] pathElements = SendAsTrustedIssuerProperty.GetPathElements(certPath);
						bool flag = string.Equals(pathElements[0], "CurrentUser", StringComparison.OrdinalIgnoreCase);
						if (flag)
						{
							storeLocation = StoreLocation.CurrentUser;
						}
						else
						{
							storeLocation = StoreLocation.LocalMachine;
						}
						X509StoreLocation x509StoreLocation = new X509StoreLocation(storeLocation);
						X509NativeStore x509NativeStore = new X509NativeStore(x509StoreLocation, pathElements[1]);
						x509NativeStore.Open(true);
						IntPtr certByName = x509NativeStore.GetCertByName(pathElements[2]);
						if (certByName != IntPtr.Zero)
						{
							x509Certificate2 = new X509Certificate2(certByName);
							x509NativeStore.FreeCert(certByName);
						}
					}
					if (addProperty)
					{
						zero = Marshal.AllocHGlobal(Marshal.SizeOf(cRYPTDATABLOB));
						Marshal.StructureToPtr(cRYPTDATABLOB, zero, false);
					}
					if (x509Certificate2 != null)
					{
						handle = x509Certificate2.Handle;
					}
					else
					{
						handle = cert.Handle;
					}
					if (!NativeMethods.CertSetCertificateContextProperty(handle, NativeMethods.CertPropertyId.CERT_SEND_AS_TRUSTED_ISSUER_PROP_ID, 0, zero))
					{
						throw new Win32Exception(Marshal.GetLastWin32Error());
					}
				}
				finally
				{
					if (zero != IntPtr.Zero)
					{
						Marshal.FreeHGlobal(zero);
					}
				}
				return;
			}
		}