private IDictionary<string, Entry> Load(string thumbprint)
{
lock (m_lock)
{
DateTime now = DateTime.UtcNow;
// refresh the directories.
if (m_certificateSubdir != null)
{
m_certificateSubdir.Refresh();
}
if (!NoPrivateKeys)
{
if (m_privateKeySubdir != null)
{
m_privateKeySubdir.Refresh();
}
}
// check if store exists.
if (!m_certificateSubdir.Exists)
{
m_certificates.Clear();
return m_certificates;
}
// check if cache is still good.
if (m_certificateSubdir.LastWriteTimeUtc < m_lastDirectoryCheck && (NoPrivateKeys || this.m_privateKeySubdir.LastWriteTimeUtc < m_lastDirectoryCheck))
{
return m_certificates;
}
m_certificates.Clear();
m_lastDirectoryCheck = now;
bool incompleteSearch = false;
// check for public keys.
foreach (FileInfo file in m_certificateSubdir.GetFiles("*.der"))
{
try
{
Entry entry = new Entry();
entry.Certificate = new X509Certificate2(file.FullName);
entry.CertificateFile = file;
entry.PrivateKeyFile = null;
entry.CertificateWithPrivateKey = null;
if (!NoPrivateKeys)
{
string fileRoot = file.Name.Substring(0, entry.CertificateFile.Name.Length - entry.CertificateFile.Extension.Length);
StringBuilder filePath = new StringBuilder();
filePath.Append(m_privateKeySubdir.FullName);
filePath.Append(Path.DirectorySeparatorChar);
filePath.Append(fileRoot);
entry.PrivateKeyFile = new FileInfo(filePath.ToString() + ".pfx");
// check for PFX file.
if (entry.PrivateKeyFile.Exists)
{
try
{
X509Certificate2 certificate = new X509Certificate2(
entry.PrivateKeyFile.FullName
);
if (certificate.HasPrivateKey)
{
entry.CertificateWithPrivateKey = certificate;
}
}
catch (Exception e)
{
Utils.Trace(e, "Could not load private key certificate from file: {0}", entry.PrivateKeyFile.Name);
}
}
// check for PEM file.
else
{
entry.PrivateKeyFile = new FileInfo(filePath.ToString() + ".pem");
if (!entry.PrivateKeyFile.Exists)
{
entry.PrivateKeyFile = null;
}
}
}
m_certificates[entry.Certificate.Thumbprint] = entry;
if (!String.IsNullOrEmpty(thumbprint) && thumbprint == entry.Certificate.Thumbprint)
{
incompleteSearch = true;
break;
}
}
catch (Exception e)
{
Utils.Trace(e, "Could not load certificate from file: {0}", file.FullName);
}
}
if (incompleteSearch)
{
m_lastDirectoryCheck = DateTime.MinValue;
}
return m_certificates;
}
}