06.10.2005 11:08:38Добавить несколько параметров в расширение сертификатов Ответов: 1
al
Создаю запрос на CriptoAPI. Не получается сделать так, чтобы в расширении сертификатов было более одного раздела (например Улучшенный ключ и Использование ключа). Поправьте, где ошибка:

CERT_REQUEST_INFO CertReqInfo;
BOOL bResult;
CRYPT_ATTR_BLOB CertAttrBlob[2] = {0};
CERT_ENHKEY_USAGE CertEnhKeyUsage = {0};
CRYPT_BIT_BLOB CertBitBl = {0};
CERT_EXTENSION CertExtEnhKeyUsage = {0};
CERT_EXTENSIONS CertExtentions = {0};

// Раздел Улучшенный ключ
CertEnhKeyUsage.cUsageIdentifier = 3;
CertEnhKeyUsage.rgpszUsageIdentifier = (LPSTR*)malloc(sizeof(LPSTR)*CertEnhKeyUsage.cUsageIdentifier);
CertEnhKeyUsage.rgpszUsageIdentifier[0] = "1.3.6.1.5.5.7.3.4";
CertEnhKeyUsage.rgpszUsageIdentifier[1] = "1.3.6.1.5.5.7.3.2";
CertEnhKeyUsage.rgpszUsageIdentifier[2] = "1.2.643.3.7.1";
bResult = CryptEncodeObject(X509_ASN_ENCODING|PKCS_7_ASN_ENCODING,X509_ENHANCED_KEY_USAGE,(LPVOID)&CertEnhKeyUsage,NULL,&CertExtEnhKeyUsage.Value.cbData);
CertExtEnhKeyUsage.Value.pbData = (LPBYTE)malloc(CertExtEnhKeyUsage.Value.cbData);
bResult = CryptEncodeObject(X509_ASN_ENCODING|PKCS_7_ASN_ENCODING,X509_ENHANCED_KEY_USAGE,(LPVOID)&CertEnhKeyUsage,CertExtEnhKeyUsage.Value.pbData,&CertExtEnhKeyUsage.Value.cbData);
free(CertEnhKeyUsage.rgpszUsageIdentifier);
CertExtEnhKeyUsage.pszObjId = szOID_ENHANCED_KEY_USAGE;
CertExtEnhKeyUsage.fCritical = FALSE;
CertExtentions.cExtension = 1;
CertExtentions.rgExtension = &CertExtEnhKeyUsage;
bResult = CryptEncodeObject(X509_ASN_ENCODING|PKCS_7_ASN_ENCODING,szOID_CERT_EXTENSIONS,&CertExtentions,NULL,&CertAttrBlob[0].cbData);
CertAttrBlob[0].pbData = (LPBYTE)malloc(CertAttrBlob[0].cbData);
bResult = CryptEncodeObject(X509_ASN_ENCODING|PKCS_7_ASN_ENCODING,szOID_CERT_EXTENSIONS,&CertExtentions,CertAttrBlob[0].pbData,&CertAttrBlob[0].cbData);

// Раздел Использование ключа
CertBitBl.cbData = 4;
CertBitBl.pbData = (BYTE*)malloc(4);
int rrr = CERT_DIGITAL_SIGNATURE_KEY_USAGE|CERT_NON_REPUDIATION_KEY_USAGE|CERT_KEY_ENCIPHERMENT_KEY_USAGE|CERT_DATA_ENCIPHERMENT_KEY_USAGE;
CopyMemory(CertBitBl.pbData,&rrr,4);
bResult = CryptEncodeObject(X509_ASN_ENCODING|PKCS_7_ASN_ENCODING,X509_KEY_USAGE,(LPVOID)&CertBitBl,NULL,&CertExtEnhKeyUsage.Value.cbData);
CertExtEnhKeyUsage.Value.pbData = (LPBYTE)malloc(CertExtEnhKeyUsage.Value.cbData);
bResult = CryptEncodeObject(X509_ASN_ENCODING|PKCS_7_ASN_ENCODING,X509_KEY_USAGE,(LPVOID)&CertBitBl,CertExtEnhKeyUsage.Value.pbData,&CertExtEnhKeyUsage.Value.cbData);
CertExtEnhKeyUsage.pszObjId = szOID_KEY_USAGE;
CertExtEnhKeyUsage.fCritical = TRUE;
CertExtentions.cExtension = 1;
CertExtentions.rgExtension = &CertExtEnhKeyUsage;
bResult = CryptEncodeObject(X509_ASN_ENCODING|PKCS_7_ASN_ENCODING,szOID_CERT_EXTENSIONS,&CertExtentions,NULL,&CertAttrBlob[1].cbData);
CertAttrBlob[1].pbData = (LPBYTE)malloc(CertAttrBlob[1].cbData);
bResult = CryptEncodeObject(X509_ASN_ENCODING|PKCS_7_ASN_ENCODING,szOID_CERT_EXTENSIONS,&CertExtentions,CertAttrBlob[1].pbData,&CertAttrBlob[1].cbData);

// Раздел Расширения сертификатов и в него включаю Улучшенный ключ и Использование ключа
CRYPT_ATTRIBUTE rgAttrib = {0};
rgAttrib.pszObjId = szOID_CERT_EXTENSIONS;
rgAttrib.cValue = 2;
rgAttrib.rgValue = CertAttrBlob;
CertReqInfo.cAttribute = 1;
CertReqInfo.rgAttribute = &rgAttrib;

Получается только Использование ключа.
 
Ответы:
06.10.2005 12:23:26Kirill Sobolev
Все расширения должны лежать в одном атрибуте. Для этого сначала создаете массив расширений, заполяете его и затем кодируете в ASN1.