CertificateStore.cs

Contains the code for accessing certificates stored in the windows certificate store, by using the certificate thumbprint.

// ------------------------------------------------------------------------------------------
// <copyright file="CertificateStore.cs" company="SecMaker AB">
//   SecMaker AB
// </copyright>
// <summary>
//   Defines the CertificateStore class.
// </summary>
// -------------------------------------------------------------------------------------------

namespace SecMaker.NiP.Client
{
	using System.Text;
	using System.Security.Cryptography.X509Certificates;

	/// <summary>
	/// Defines the CertificateStore class.
	/// </summary>
	internal class CertificateStore
	{
		/// <summary>
		/// Get certificate including handler from personal certificate store.
		/// </summary>
		/// <param name="crtHash">
		/// The hash (thumbprint) of the client certificate as System.String.
		/// </param>
		/// <returns>
		/// Returns the certificate as System.Security.Cryptography.X509Certificates.X509Certificate2.
		/// </returns>
		internal static X509Certificate2 GetCertificate(string crtHash)
		{
			if (string.IsNullOrEmpty(crtHash))
			{
				return null;
			}

			var certHash =
				new StringBuilder(crtHash.ToUpper().Trim());

			const string approvedChars =
				"0123456789ABCDEF";

			for (var i = 0; i < certHash.Length; i++)
			{
				var thisChar =
					certHash[i];

				if (approvedChars.IndexOf(thisChar) > -1)
				{
					continue;
				}

				certHash.Remove(i, 1);

				i--;
			}

			var x509Store =
				new X509Store(StoreName.My, StoreLocation.CurrentUser);

			x509Store.Open(OpenFlags.MaxAllowed);

			foreach (var certificate in x509Store.Certificates)
			{
				if (certificate.GetCertHashString() == certHash.ToString())
				{
					return certificate;
				}
			}

			return null;
		}
	}
}