Note

Access to this page requires authorization. You can try signing in or .

Access to this page requires authorization. You can try .

Example C Code for Opening Certificate Stores

The following examples provide code to open a variety of common certificate stores. These examples are a series of code fragments and are not stand-alone programs.

The following example opens the My system store.

HCERTSTORE hSysStore;
hSysStore = CertOpenStore(
 CERT_STORE_PROV_SYSTEM, // the store provider type
 0, // the encoding type is not needed
 NULL, // use the default HCRYPTPROV
 CERT_SYSTEM_STORE_CURRENT_USER,
 // set the store location in a 
 // registry location
 L"My" // the store name as a Unicode string
 );

// If call was successful, close hSystStore; otherwise, 
// call print an error message.
if(hSysStore)
{
 if (!(CertCloseStore(hSysStore, 0)))
 {
 printf("Error closing system store.");
 }
}
else
 printf("Error opening system store.");


// Substitute other common system store names
// for "My" 
// including "root", "trust", or "CA".

The following example opens a memory store.

HCERTSTORE hMemStore;
hMemStore = CertOpenStore(
 CERT_STORE_PROV_MEMORY, // the memory provider type
 0, // the encoding type is not needed
 NULL, // use the default HCRYPTPROV
 0, // accept the default dwFlags
 NULL // pvPara is not used
 );

// If call was successful, close hMemStore; otherwise, 
// call print an error message.
if(hMemStore)
{
 if (!(CertCloseStore(hMemStore, 0)))
 {
 printf("Error closing memory store.");
 }
}
else
 printf("Error opening memory store.");

The following example opens a store from disk. The example uses the CreateMyDACL function, defined in the Creating a DACL topic, to ensure the open file is created with a proper DACL.

// In this example, the read-only flag is set.
HANDLE hFile;
HCERTSTORE hFileStore;
LPCWSTR pszFileName = L"TestStor2.sto";
SECURITY_ATTRIBUTES sa; // for DACL

// Create a DACL for the file.
sa.nLength = sizeof(SECURITY_ATTRIBUTES);
sa.bInheritHandle = FALSE; 

// Call function to set the DACL. The DACL
// is set in the SECURITY_ATTRIBUTES 
// lpSecurityDescriptor member.
// if CreateMyDACL(&sa) fails, exit(1)

// Obtain a file handle.
hFile = CreateFile(
 pszFileName, // the file name
 GENERIC_READ|GENERIC_WRITE, // access mode: 
 // read from and write to
 // this file
 0, // share mode
 &sa, // security 
 OPEN_ALWAYS, // how to create
 FILE_ATTRIBUTE_NORMAL, // file attributes
 NULL); // template

if (!(hFile))
{
 fprintf(stderr, "Could not create file.\n");
 exit(1);
}

//-------------------------------------------------------------------
// At this point, read and use data in the open file that precedes
// the serialized certificate store data. The file pointer must
// be placed at the beginning of the certificate store data before 
// CertOpenStore is called with the CERT_STORE_PROV_FILE provider.
// Open the store.

hFileStore = CertOpenStore(
 CERT_STORE_PROV_FILE, // load certificates from a file
 0, // encoding type not used
 NULL, // use the default HCRYPTPROV
 CERT_STORE_READONLY_FLAG, // see the LOWORD of dwFlags to make
 // the store read-only
 hFile // the handle for the open file 
 // that is the source of the 
 // certificates
 );

//-------------------------------------------------------------------
// Include code to work with the certificates.
// The data file from which the certificate store information has 
// been read is still open. Any data in that file that follows the 
// serialized store can be read from the file and used at this point.

//-------------------------------------------------------------------
// Close the file store and the file.

if(hFileStore)
{
 if(!(CertCloseStore(
 hFileStore, 
 CERT_CLOSE_STORE_CHECK_FLAG)))
 {
 fprintf(stderr, "Error closing store.\n");
 }
}
else 
{
 fprintf(stderr, "Error opening store.\n");
}

if(!(CloseHandle(hFile)))
{
 fprintf(stderr, "Error closing hFile.\n");
}

The following example opens a file-based store using CERT_STORE_PROV_FILENAME.

#include <windows.h>
#include <stdio.h>
#include "Wincrypt.h"


#define ENCODING_TYPE (PKCS_7_ASN_ENCODING | X509_ASN_ENCODING)

void main()
{
// The pvPara parameter here is the name of an existing file.
// The function fails if the file does not exist.
// The file is not opened using CreateFile before the call to 
// CertOpenStore. 
// CERT_STORE_PROV_FILENAME_A is used if the file name is in ASCII;
// CERT_STORE_PROV_FILENAME is used if the file name is a
// Unicode string.

//#define moved
HCERTSTORE hFileStoreHandle;

hFileStoreHandle = CertOpenStore(
 CERT_STORE_PROV_FILENAME, // the store provider type
 ENCODING_TYPE, // if needed, use the usual
 // encoding types
 NULL, // use the default HCRYPTPROV
 0, // accept the default for all
 // dwFlags
 L"FileStore.sto" ); // the name of an existing file
 // as a Unicode string
if(hFileStoreHandle)
{
 if(!(CertCloseStore(hFileStoreHandle, 0)))
 {
 fprintf(stderr, "Failed to close hFileStoreHandle\n");
 }
}
else
{
 fprintf(stderr, "Failed to open store.\n");
}

The following example opens a collection store.

// Note that the collection store is empty.
// Certificates, CRLs, and CTLs can be added to and found in
// stores that are added as sibling stores to the collection store.

HCERTSTORE hCollectionStoreHandle;
HCERTSTORE hSiblingStoreHandle;
hCollectionStoreHandle = CertOpenStore(
 CERT_STORE_PROV_COLLECTION,
 0, // for CERT_STORE_PROV_COLLECTION,
 // the rest of the parameters
 // are zero or NULL
 NULL,
 0,
 NULL);

// Check that call to CertOpenStore succeeded.
if(!(hCollectionStoreHandle))
{
 fprintf(stderr, "Could not open collection store.\n");
 exit(1);
}

//-------------------------------------------------------------------
// Open the sibling store as a file-based store.

hSiblingStoreHandle = CertOpenStore(
 CERT_STORE_PROV_FILENAME, // the store provider type
 ENCODING_TYPE, // if needed, use the usual
 // encoding type
 NULL, // use the default HCRYPTPROV
 0, // accept the default for all
 // dwFlags
 L"siblstore.sto"); // the name of an existing file
 // as a Unicode string

// Check that call to CertOpenStore succeeded.
if(!(hSiblingStoreHandle))
{
 fprintf(stderr, "Could not open sibling store.\n");
 exit(1);
}


//-------------------------------------------------------------------
// The open sibling store can now be added to the collection 
// using CertAddStoreToCollection and processing of certificates can 
// begin.

if(!(CertAddStoreToCollection(
 hCollectionStoreHandle,
 hSiblingStoreHandle,
 CERT_PHYSICAL_STORE_ADD_ENABLE_FLAG,
 1)))
{
 fprintf(stderr, "Could not add sibling store to collection.\n");
}

//-------------------------------------------------------------------
// All processing of the certificates in the
// collection store will also involve the certificates in the sibling
// store.

// Close the stores.
if(!(CertCloseStore(hCollectionStoreHandle, 0)))
{
 fprintf(stderr, "Failed to close hCollectionStoreHandle\n");
}

if(!(CertCloseStore(hCollectionStoreHandle, 0)))
{
 fprintf(stderr, "Failed to close hCollectionStoreHandle\n");
}

The following example opens a register store.

HCERTSTORE hRegStore = NULL;

//--------------------------------------------------------------------
// A register subkey be opened with RegOpenKeyEx or 
// RegCreateKeyEx. A handle to the open register subkey, hkResult, is
// returned in one of parameters of RegOpenKeyEx or RegCreateKeyEx.
hRegStore = CertOpenStore(
 CERT_STORE_PROV_REG,
 0, // no encoding type is needed
 NULL, // accept the default HCRYPTPROV
 0, // accept the default dwFlags
 hkResult); // hkResult is the handle of a 
 // register subkey opened by RegOpenKeyEx
 // or created and opened by 
 // RegCreateKeyEx
// Close hRegStore.
if(!(CertCloseStore(hRegStore, 0)))
{
 fprintf(stderr, "Could not close hRegStore.\n");
}

The following example opens a certificate store based on a PKCS #7 message.

HCERTSTORE hLastStore;
CRYPT_DATA_BLOB message_BLOB;

//-------------------------------------------------------------------
// Initialize the message BLOB.

HCERTSTORE hSystemStore = CertOpenStore(
 CERT_STORE_PROV_SYSTEM, // the store provider type
 0, // the encoding type is not needed
 NULL, // use the default HCRYPTPROV
 CERT_SYSTEM_STORE_CURRENT_USER,
 // the store location in a registry
 // location
 L"CA"); // the store name as a Unicode string

message_BLOB.cbData = 0;
message_BLOB.pbData = NULL;

//-------------------------------------------------------------------
// Get the cbData length.

if(CertSaveStore(
 hSystemStore,
 PKCS_7_ASN_ENCODING | X509_ASN_ENCODING,
 CERT_STORE_SAVE_AS_PKCS7,
 CERT_STORE_SAVE_TO_MEMORY,
 &message_BLOB,
 0))
{
 printf("The length is %d \n",message_BLOB.cbData);
}
else
{
// An error has occurred in saving the store. Print an error
// message and exit.
 fprintf(stderr, "Error saving a file store.");
 exit(1);
}

//-------------------------------------------------------------------
// Allocate the memory or pbData.

if( message_BLOB.pbData = (BYTE *)malloc(message_BLOB.cbData))
{
 printf("The function succeeded. \n");
}
else
{
// An error has occurred in memory allocation. Print an error
// message and exit.
 fprintf(stderr, "Error in memory allocation.\n");
 exit(1);
}

//-------------------------------------------------------------------
// Get the contents of pbData.

if(CertSaveStore(
 hSystemStore,
 PKCS_7_ASN_ENCODING | X509_ASN_ENCODING,
 CERT_STORE_SAVE_AS_PKCS7,
 CERT_STORE_SAVE_TO_MEMORY,
 &message_BLOB,
 0))
{
 printf("Saved the store to a memory BLOB. \n");
}
else
{
// An error has occurred in saving the store. Print an error
// message and exit.
 fprintf(stderr, "Error saving file store.\n");
 exit(1);
}

if( hLastStore = CertOpenStore(
 CERT_STORE_PROV_PKCS7,
 PKCS_7_ASN_ENCODING | X509_ASN_ENCODING,
 NULL,
 0,
 &message_BLOB))
{
 printf("The function succeeded. \n");
}
else
{
// An error has occurred in opening the store. Print an error
// message and exit.
 fprintf(stderr, "Error opening file store.\n");
 exit(1);
}

// Clean up memory.
if(!(CertCloseStore(hSystemStore, 0)))
{
 fprintf(stderr, "Could not close hSystemStore\n");
}
if(!(CertCloseStore(hLastStore, 0)))
{
 fprintf(stderr, "Could not close hLastStore\n");
}
free(message_BLOB.pbData);

Feedback

Was this page helpful?

Additional resources