#include <windows.h>
#include <wincrypt.h>
#include <stdio.h>
#include <TCHAR.H>
//#pragma comment (lib, "crypt32.lib")
BYTE ValueHex(char ch) // преобразует символ в число, соответсвующее этому символу
{
if (ch <= '9')
return (ch - '0');
else
return (ch - 'a' + 10);
}
int _tmain(int argc, _TCHAR* argv[])
{
char SerialNumber[] = "00af63e07ac40cc980e811bd265789aa30"; //серийный номер сертификата, по которому осуществляется поиск
HCERTSTORE hSystemStore;
PCCERT_CONTEXT pDesiredCert = NULL;
if (!(hSystemStore = CertOpenSystemStore(0, L"MY")))
{
return 0;
}
CERT_INFO pvFindPara;
pvFindPara.SerialNumber.cbData = strlen(SerialNumber) / 2;
pvFindPara.SerialNumber.pbData = (BYTE*)malloc(pvFindPara.SerialNumber.cbData);
BYTE* P = pvFindPara.SerialNumber.pbData;
for (int i = strlen(SerialNumber); i>0; i = i - 2)
{
*P = ValueHex(SerialNumber[i - 2]) * 16 + ValueHex(SerialNumber[i - 1]);
P = P + 1;
}
CertStrToName(X509_ASN_ENCODING, _T("CN = АО \"ПФ \"СКБ Контур\" \
O = АО \"ПФ \"СКБ Контур\" \
OU = Удостоверяющий центр \
STREET = Пр.Космонавтов д. 56 \
L = Екатеринбург \
S = 66 Свердловская область \
C = RU \
ИНН = 006663003127 \
ОГРН = 1026605606620 \
E =
ca@skbkontur.ru"), CERT_X500_NAME_STR | CERT_NAME_STR_ENABLE_UTF8_UNICODE_FLAG, NULL, NULL, &(pvFindPara.Issuer.cbData), NULL);
pvFindPara.Issuer.pbData = (BYTE*)malloc(pvFindPara.Issuer.cbData);
CertStrToName(X509_ASN_ENCODING, _T("CN = АО \"ПФ \"СКБ Контур\" \
O = АО \"ПФ \"СКБ Контур\" \
OU = Удостоверяющий центр \
STREET = Пр.Космонавтов д. 56 \
L = Екатеринбург \
S = 66 Свердловская область \
C = RU \
ИНН = 006663003127 \
ОГРН = 1026605606620 \
E =
ca@skbkontur.ru"), CERT_X500_NAME_STR | CERT_NAME_STR_ENABLE_UTF8_UNICODE_FLAG, NULL, pvFindPara.Issuer.pbData, &(pvFindPara.Issuer.cbData), NULL);
if (pDesiredCert = CertFindCertificateInStore(hSystemStore,
X509_ASN_ENCODING,
0,
CERT_FIND_SUBJECT_CERT,
&pvFindPara,
NULL))
{
printf("The desired certificate was found. \n");
}
{
printf("The desired certificate not found. \n");
}
system("pause");
free(pvFindPara.SerialNumber.pbData);
free(pvFindPara.Issuer.pbData);
return 0;
}