20.06.2006 10:49:36Правильное создание CRL (WinAPI) Ответов: 1
Иван
Добрый день, пытаюсь правильно создать CRL, вроде все проходит без ошибок но файл не могу открыть пишет ошибка в формирование, укажите где "собака зарыта". Спасибо.

CCC_Crl::CCC_Crl()
{
CRL_ENTRY CRLEntry;
CRL_INFO CRLs;
PBYTE ser_num;
DWORD ser_num_len;
int ser_num_int;
CERT_RDN_ATTR nameAttr;
char *nameString;
CERT_RDN rdn;
CERT_NAME_INFO nameInfo;
DWORD encNameLen;
PBYTE EncName;
char *st1;
CRYPT_OBJID_BLOB Parameters;
DWORD CRL_enc_len;
PBYTE CRL_enc;
CERT_EXTENSION extension;
CERT_EXTENSION crls_extension;
int reason_code;
int i;
FILETIME ftTime;
SYSTEMTIME stTime;



RTAsciiString MyText ("miam");
nameAttr.dwValueType = CERT_RDN_PRINTABLE_STRING;
nameAttr.pszObjId = "2.5.4.3";
nameAttr.Value.cbData = (DWORD)::strlen(MyText.ToAsciiString());
nameAttr.Value.pbData = (BYTE *) MyText.ToAsciiString();

rdn.cRDNAttr= 1;
rdn.rgRDNAttr= &nameAttr;
nameInfo.cRDN= 1;
nameInfo.rgRDN= &rdn;

if (!(::CryptEncodeObject(MY_ENCODING_TYPE, ((LPCSTR) 7), &nameInfo, NULL, &encNameLen)))
{
// Error in CryptEncodeObject .
}

if (!(EncName = (BYTE *) _alloca(encNameLen)))
{
//
// Error @@@ Обработка через throw
// RTException(RTError::BadOperation, errNo, L"Функция",
// L"Операция"
//
}

if (!(::CryptEncodeObject(MY_ENCODING_TYPE, ((LPCSTR) 7), &nameInfo, EncName, &encNameLen)))
{
// Error in CryptEncodeObject
}
ser_num_int=30;
CRLEntry.SerialNumber.cbData=sizeof(ser_num_int);
CRLEntry.SerialNumber.pbData=(BYTE *)ser_num_int;

GetSystemTime(&stTime);
SystemTimeToFileTime(&stTime, &ftTime);
CRLEntry.RevocationDate = ftTime;
reason_code=0;
CryptEncodeObject(MY_ENCODING_TYPE,
X509_CRL_REASON_CODE,
&reason_code,
NULL,
&extension.Value.cbData);
if (!(extension.Value.pbData = (BYTE *) _alloca(extension.Value.cbData)))
{
//
// Error @@@ Обработка через throw
// RTException(RTError::BadOperation, errNo, L"Функция",
// L"Операция"
//
}
CryptEncodeObject(MY_ENCODING_TYPE,
X509_CRL_REASON_CODE,
&reason_code,
extension.Value.pbData,
&extension.Value.cbData);

extension.pszObjId = szOID_CRL_REASON_CODE;
extension.fCritical = false;
CRLEntry.cExtension = 0;
CRLEntry.rgExtension = &extension;
CRLs.dwVersion = CRL_V1;
//memset(params, 0, sizeof(params));

memset(&Parameters, 0, sizeof(Parameters));
CRLs.SignatureAlgorithm.pszObjId = szOID_OIWSEC_sha1RSASign;
CRLs.SignatureAlgorithm.Parameters = Parameters;

GetSystemTime(&stTime);
SystemTimeToFileTime(&stTime, &ftTime);
CRLs.ThisUpdate = ftTime;

GetSystemTime(&stTime);
SystemTimeToFileTime(&stTime, &ftTime);
WORD wMonths = 24;
stTime.wMonth += wMonths;
if ((stTime.wMonth / 12) > 0)
{
stTime.wYear += (stTime.wMonth / 12);
stTime.wMonth = (stTime.wMonth % 12);
}

SystemTimeToFileTime(&stTime, &ftTime);
CRLs.NextUpdate = ftTime;
CRLs.cCRLEntry = 1;
CRLs.rgCRLEntry = &CRLEntry;

CRLs.cExtension=0;
CRLs.rgExtension=NULL;
CRLs.Issuer.cbData=encNameLen;
CRLs.Issuer.pbData=EncName;
CCC_PrivateKeyCreator *ClientKeys;
ClientKeys = new CCC_PrivateKeyCreator(1024);
HCRYPTPROV hCryptProvREQ = ClientKeys->getHandle();

CryptSignAndEncodeCertificate(hCryptProvREQ,
AT_SIGNATURE,
MY_ENCODING_TYPE,
X509_CERT_CRL_TO_BE_SIGNED,
&CRLs,
&(CRLs.SignatureAlgorithm),
NULL,
NULL,
&CRL_enc_len);
if (!(CRL_enc = (BYTE *) _alloca(CRL_enc_len)))
{
//
// Error @@@ Обработка через throw
// RTException(RTError::BadOperation, errNo, L"Функция",
// L"Операция"
//
}
CryptSignAndEncodeCertificate(hCryptProvREQ,
AT_SIGNATURE,
MY_ENCODING_TYPE,
X509_CERT_CRL_TO_BE_SIGNED,
&CRLs,
&(CRLs.SignatureAlgorithm),
NULL,
CRL_enc,
&CRL_enc_len);


PCCRL_CONTEXT MyCRLContext = CertCreateCRLContext(
MY_ENCODING_TYPE,
CRL_enc,
sizeof(CRL_enc));

if (MyCRLContext == NULL)
{
FILE * myfile;
myfile = fopen( "c:\\mycrlerror.txt", "a");
int t = GetLastError();
fprintf(myfile, "%d", t);
fclose(myfile);
}else{

FILE * myfile;
myfile = fopen( "c:\\mycrl.crl", "w");
fprintf(myfile, "%s", MyCRLContext);
fclose(myfile);
}

ClientKeys->~CCC_PrivateKeyCreator();
}
 
Ответы:
20.06.2006 14:09:08Kirill Sobolev
У Вас какое-то нетрадиционное сохранение в файл.
Результат работы функции CryptSignAndEncodeCertificate - это бинарный буфер. А Вы его преобразовываете в структуру CRL_CONTEXT и потом пытаетесь ее сохранить в файл как текстовую строку! Так ничего работать не будет.
Нужно что-то типа
myfile = fopen( "c:\\mycrl.crl", "wb");
fwrite(CRL_enc, sizeof(BYTE), CRL_enc_len, myfile);
Контекст создается тоже неправильно, последний аргумент должен быть длина блоба а не размер перемнной.