Статус: Активный участник
Группы: Участники
Зарегистрирован: 26.08.2010(UTC) Сообщений: 38 Откуда: Санкт-Петербург
Сказал(а) «Спасибо»: 21 раз
|
Автор: Kirill Sobolev  Не могу разобраться, что именно кодировать CertStrToName()? Вот моя функция для создания запроса на сертификат. Код:
bool createRequest(char* path, CERT_NAME_INFO RDNs) {
size_t i;
CERT_REQUEST_INFO CertReqInfo;
CERT_NAME_BLOB SubjNameBlob;
DWORD cbNameEncoded;
BYTE* pbNameEncoded;
DWORD cbPublicKeyInfo;
CERT_PUBLIC_KEY_INFO* pbPublicKeyInfo;
DWORD cbEncodedCertReqSize;
CRYPT_OBJID_BLOB Parameters;
CRYPT_ALGORITHM_IDENTIFIER SigAlg;
BYTE* pbSignedEncodedCertReq;
char* pSignedEncodedCertReqBlob;
if (CryptEncodeObject(
MY_ENCODING_TYPE, // Encoding type
X509_NAME, // Structure type
&RDNs, // Address of CERT_NAME_INFO structure
NULL, // pbEncoded
&cbNameEncoded)) // pbEncoded size
{
printf("The first call to CryptEncodeObject succeeded. \n");
}
else {
printf("The first call to CryptEncodeObject failed. \nA public/private key pair may not exit in the container. \n");
}
if (!(pbNameEncoded = (BYTE*)malloc(cbNameEncoded))) {
printf("The pbNamencoded malloc operation failed. \n");
return false;
}
if (CryptEncodeObject(
MY_ENCODING_TYPE, // Encoding type
X509_NAME, // Structure type
&RDNs, // Address of CERT_NAME_INFO structure
pbNameEncoded, // pbEncoded
&cbNameEncoded)) // pbEncoded size
{
printf("The object is encoded. \n");
}
else {
free(pbNameEncoded);
printf("The second call to CryptEncodeObject failed. \n");
return false;
}
SubjNameBlob.cbData = cbNameEncoded;
SubjNameBlob.pbData = pbNameEncoded;
CertReqInfo.Subject = SubjNameBlob;
CertReqInfo.cAttribute = 0;
CertReqInfo.rgAttribute = NULL;
CertReqInfo.dwVersion = CERT_REQUEST_V1;
if (hCryptProv == NULL) {
if (CryptAcquireContext(
&hCryptProv, // Address for handle to be returned.
CommonName, // Use the current user's logon name.
ProviderName, // Use the default provider.
75, // Need to both encrypt and sign.
NULL)) // No flags needed.
{
printf("A cryptographic provider has been acquired. \n");
}
else {
free(pbNameEncoded);
printf("CryptAcquireContext failed. \n");
return false;
}
}
if (CryptExportPublicKeyInfo(
hCryptProv, // Provider handle
AT_KEYEXCHANGE, // Key spec
MY_ENCODING_TYPE, // Encoding type
NULL, // pbPublicKeyInfo
&cbPublicKeyInfo)) // Size of PublicKeyInfo
{
printf("The keyinfo structure is %d bytes. \n", cbPublicKeyInfo);
}
else {
free(pbNameEncoded);
printf("The first call to CryptExportPublickKeyInfo failed. \nThe probable cause is that \nthere is no key pair in the key container. \n");
return false;
}
if (pbPublicKeyInfo = (CERT_PUBLIC_KEY_INFO*)malloc(cbPublicKeyInfo))
{
printf("Memory is allocated for the public key structure. \n");
}
else {
free(pbNameEncoded);
printf("Memory allocation failed. \n");
return false;
}
if (CryptExportPublicKeyInfo(
hCryptProv, // Provider handle
AT_KEYEXCHANGE, // Key spec
MY_ENCODING_TYPE, // Encoding type
pbPublicKeyInfo, // pbPublicKeyInfo
&cbPublicKeyInfo)) // Size of PublicKeyInfo
{
printf("The key has been exported. \n");
}
else {
free(pbNameEncoded);
free(pbPublicKeyInfo);
printf("The second call to CryptExportPublicKeyInfo failed. \n");
return false;
}
CertReqInfo.SubjectPublicKeyInfo = *pbPublicKeyInfo;
memset(&Parameters, 0, sizeof(Parameters));
SigAlg.pszObjId = szOID_CP_GOST_R3411_R3410EL;
SigAlg.Parameters = Parameters;
if (CryptSignAndEncodeCertificate(
hCryptProv, // Crypto provider
AT_KEYEXCHANGE, // Key spec
MY_ENCODING_TYPE, // Encoding type
X509_CERT_REQUEST_TO_BE_SIGNED, // Structure type
&CertReqInfo, // Structure information
&SigAlg, // Signature algorithm
NULL, // Not used
NULL, // pbSignedEncodedCertReq
&cbEncodedCertReqSize)) // Size of certificate
{
printf("The size of the encoded certificate is set. \n");
}
else {
free(pbNameEncoded);
free(pbPublicKeyInfo);
printf("First call to CryptSignandEncode failed. \n");
return false;
}
if (pbSignedEncodedCertReq = (BYTE*)malloc(cbEncodedCertReqSize)) {
printf("Memory has been allocated.\n");
}
else {
free(pbNameEncoded);
free(pbPublicKeyInfo);
printf("The malloc operation failed. \n");
return false;
}
if (CryptSignAndEncodeCertificate(
hCryptProv, // Crypto provider
AT_KEYEXCHANGE, // Key spec
MY_ENCODING_TYPE, // Encoding type
X509_CERT_REQUEST_TO_BE_SIGNED, // Struct type
&CertReqInfo, // Struct info
&SigAlg, // Signature algorithm
NULL, // Not used
pbSignedEncodedCertReq, // Pointer
&cbEncodedCertReqSize)) // Length of the message
{
printf("The message is encoded and signed. \n");
}
else {
free(pbNameEncoded);
free(pbPublicKeyInfo);
free(pbSignedEncodedCertReq);
printf("The second call to CryptSignAndEncode failed. \n");
return false;
}
writeToFile(path, pbSignedEncodedCertReq, cbEncodedCertReqSize);
free(pbNameEncoded);
free(pbPublicKeyInfo);
free(pbSignedEncodedCertReq);
CryptReleaseContext(hCryptProv, 0);
printf("\n Memory freed. Program ran without error. \n");
return true;
}
А вот так я заполняю RDN. Код:
int count = getCountTrue();
int i = 0;
CERT_RDN_ATTR *rgNameAttr = new CERT_RDN_ATTR[count];
CERT_RDN *rgRDN = new CERT_RDN[count];
if(testCommonName(true)) {
LPSTR edit = W2A(EditCommonName);
//CN - общее имя
rgNameAttr[i].pszObjId = "2.5.4.3";
rgNameAttr[i].dwValueType = CERT_RDN_PRINTABLE_STRING;
rgNameAttr[i].Value.cbData = strlen(edit);
rgNameAttr[i].Value.pbData = (BYTE*)edit;
rgRDN[i].cRDNAttr = 1;
rgRDN[i].rgRDNAttr = &rgNameAttr[i];
i++;
} else {
return;
}
if (testT(true)) {
LPSTR edit = W2A(EditT);
//T - Должность
rgNameAttr[i].pszObjId = "2.5.4.12";
rgNameAttr[i].dwValueType = CERT_RDN_PRINTABLE_STRING;
rgNameAttr[i].Value.cbData = strlen(edit);
rgNameAttr[i].Value.pbData = (BYTE*)edit;
rgRDN[i].cRDNAttr = 1;
rgRDN[i].rgRDNAttr = &rgNameAttr[i];
i++;
}
else {
return;
}
if(testOrganizationalUnit(true)) {
LPSTR edit = W2A(EditOrganizationalUnit);
//OU - Подразделение
rgNameAttr[i].pszObjId = "2.5.4.11";
rgNameAttr[i].dwValueType = CERT_RDN_PRINTABLE_STRING;
rgNameAttr[i].Value.cbData = strlen(edit);
rgNameAttr[i].Value.pbData = (BYTE*)edit;
rgRDN[i].cRDNAttr = 1;
rgRDN[i].rgRDNAttr = &rgNameAttr[i];
i++;
} else {
return;
}
if(testOrganization(true)) {
LPSTR edit = W2A(EditOrganization);
//O - Организация
rgNameAttr[i].pszObjId = "2.5.4.10";
rgNameAttr[i].dwValueType = CERT_RDN_PRINTABLE_STRING;
rgNameAttr[i].Value.cbData = strlen(edit);
rgNameAttr[i].Value.pbData = (BYTE*)edit;
rgRDN[i].cRDNAttr = 1;
rgRDN[i].rgRDNAttr = &rgNameAttr[i];
i++;
} else {
return;
}
if(testLocality(true)) {
LPSTR edit = W2A(EditLocality);
//L - Населенный пункт
rgNameAttr[i].pszObjId = "2.5.4.7";
rgNameAttr[i].dwValueType = CERT_RDN_PRINTABLE_STRING;
rgNameAttr[i].Value.cbData = strlen(edit);
rgNameAttr[i].Value.pbData = (BYTE*)edit;
rgRDN[i].cRDNAttr = 1;
rgRDN[i].rgRDNAttr = &rgNameAttr[i];
i++;
} else {
return;
}
if(testState(true)) {
LPSTR edit = W2A(EditState);
//S - Регион
rgNameAttr[i].pszObjId = "2.5.4.8";
rgNameAttr[i].dwValueType = CERT_RDN_PRINTABLE_STRING;
rgNameAttr[i].Value.cbData = strlen(edit);
rgNameAttr[i].Value.pbData = (BYTE*)edit;
rgRDN[i].cRDNAttr = 1;
rgRDN[i].rgRDNAttr = &rgNameAttr[i];
i++;
} else {
return;
}
if (testAddress(true)) {
LPSTR edit = W2A(EditAddress);
//A - Адрес
rgNameAttr[i].pszObjId = "2.5.4.9";
rgNameAttr[i].dwValueType = CERT_RDN_PRINTABLE_STRING;
rgNameAttr[i].Value.cbData = strlen(edit);
rgNameAttr[i].Value.pbData = (BYTE*)edit;
rgRDN[i].cRDNAttr = 1;
rgRDN[i].rgRDNAttr = &rgNameAttr[i];
i++;
}
else {
return;
}
if(testEmail(true)) {
LPSTR edit = W2A(EditEmail);
//E - адрес электронной почты
rgNameAttr[i].pszObjId = "1.2.840.113549.1.9.1";
rgNameAttr[i].dwValueType = CERT_RDN_PRINTABLE_STRING;
rgNameAttr[i].Value.cbData = strlen(edit);
rgNameAttr[i].Value.pbData = (BYTE*)edit;
rgRDN[i].cRDNAttr = 1;
rgRDN[i].rgRDNAttr = &rgNameAttr[i];
i++;
} else {
return;
}
if(testOGRN(true)) {
LPSTR edit = W2A(EditOGRN);
//OGRN - ОГРН
rgNameAttr[i].pszObjId = "1.2.643.100.1";
rgNameAttr[i].dwValueType = CERT_RDN_PRINTABLE_STRING;
rgNameAttr[i].Value.cbData = strlen(edit);
rgNameAttr[i].Value.pbData = (BYTE*)edit;
rgRDN[i].cRDNAttr = 1;
rgRDN[i].rgRDNAttr = &rgNameAttr[i];
i++;
} else {
return;
}
if(testINN(true)) {
LPSTR edit = W2A(EditINN);
//INN - ИНН
rgNameAttr[i].pszObjId = "1.2.643.3.131.1.1";
rgNameAttr[i].dwValueType = CERT_RDN_PRINTABLE_STRING;
rgNameAttr[i].Value.cbData = strlen(edit);
rgNameAttr[i].Value.pbData = (BYTE*)edit;
rgRDN[i].cRDNAttr = 1;
rgRDN[i].rgRDNAttr = &rgNameAttr[i];
i++;
} else {
return;
}
if(testOGRNIP(true)) {
LPSTR edit = W2A(EditOGRNIP);
//OGRNIP - ОГРНИП
rgNameAttr[i].pszObjId = "1.2.643.100.5";
rgNameAttr[i].dwValueType = CERT_RDN_PRINTABLE_STRING;
rgNameAttr[i].Value.cbData = strlen(edit);
rgNameAttr[i].Value.pbData = (BYTE*)edit;
rgRDN[i].cRDNAttr = 1;
rgRDN[i].rgRDNAttr = &rgNameAttr[i];
i++;
} else {
return;
}
if(testSNILS(true)) {
LPSTR edit = W2A(SNILS);
//SNILS - СНИЛС
rgNameAttr[i].pszObjId = "1.2.643.100.3";
rgNameAttr[i].dwValueType = CERT_RDN_PRINTABLE_STRING;
rgNameAttr[i].Value.cbData = strlen(edit);
rgNameAttr[i].Value.pbData = (BYTE*)edit;
rgRDN[i].cRDNAttr = 1;
rgRDN[i].rgRDNAttr = &rgNameAttr[i];
i++;
} else {
return;
}
//C - страна
rgNameAttr[i].pszObjId = "2.5.4.6";
rgNameAttr[i].dwValueType = CERT_RDN_PRINTABLE_STRING;
rgNameAttr[i].Value.cbData = strlen("RU");
rgNameAttr[i].Value.pbData = (BYTE*)"RU";
rgRDN[i].cRDNAttr = 1;
rgRDN[i].rgRDNAttr = &rgNameAttr[i];
CERT_NAME_INFO RDNs = { count, rgRDN };
|