//---------------------------------------------------------------------------

#pragma hdrstop
#include <windows.h>
#include <wincrypt.h>
//---------------------------------------------------------------------------
#define MY_ENCODING_TYPE  (PKCS_7_ASN_ENCODING | X509_ASN_ENCODING)
#pragma argsused
int main(int argc, char* argv[])
{
HCRYPTPROV hProv=0;
HCRYPTKEY hKey=0;
DWORD ret=0;
DWORD certSize=0;
BYTE* certBuff=NULL;
PCCERT_CONTEXT pCertContext=NULL;
try
{
        // получаем хэндл на криптопровайдер на нужный профайл
        if (!CryptAcquireContext(&hProv,"profile://MT","Tumar CSP",25,0)) throw GetLastError();
        // получаем хэндл на нужный ключ
        if (!CryptGetUserKey(hProv,AT_SIGNATURE,&hKey)) throw GetLastError();
        // извлекаем сертификат из контейнера
        if (!CryptGetKeyParam(hKey,KP_CERTIFICATE,NULL,&certSize,0)) throw GetLastError();
        certBuff = (BYTE*)malloc(certSize);
        if (!CryptGetKeyParam(hKey,KP_CERTIFICATE,certBuff,&certSize,0)) throw GetLastError();
        // создаем контекст сертификата
        pCertContext = CertCreateCertificateContext(MY_ENCODING_TYPE,certBuff,certSize);
        if (pCertContext==NULL) throw GetLastError();
        // ................
        // что-то делаем с сертификатом
        // .........................
        //.........................
        // после работы освобождаем контекст сертификата
        if (!CertFreeCertificateContext(pCertContext)) throw GetLastError();
        // освобождаем хэндл на ключ
        if (!CryptDestroyKey(hKey)) throw GetLastError();
        // освобождаем хэндл на криптопровайдер
        if (!CryptReleaseContext(hProv,0)) throw GetLastError();
}
catch(DWORD err)
{
}

return ret;
}
//---------------------------------------------------------------------------
