shkodnik написал:irbis3003 написал:та же песня - не прошел функцию d2i_X509
вы чем проверяете? и как?
есть библиотека - обертка над криптобиблиотекой Агава-С.
В ней функция для получения данных из сертификата:
int __stdcall all_ReturnCert(BLOB_INFO *Blob, INFO_CERT *PCert)
{
if(!InitLib) return CKR_CRYPTOKI_NOT_INITIALIZED;
X509 *x = NULL;
if(Blob->BlobLen < 21)
{
rv = FindAnyCert(Blob);
if(rv != 0) return rv;
};
// Если блоб сертификата или стал таковым
if(Blob->BlobLen > 20)
{
rv = PEM_BlobInfo2X509(Blob, &x); // сама функция - ниже
if(rv != 0) return rv;
// Считываем серийник
ASN1_INTEGER *bs = X509_get_serialNumber(x);
PCert->serial_len = bs->length;
memcpy(PCert->serial, bs->data, bs->length);
// Считываем даты действия
PCert->start_date = all_CharSet((DATE_TIME(X509_get_notBefore(x))).c_str());
PCert->end_date = all_CharSet((DATE_TIME(X509_get_notAfter(x))).c_str());
//************ и т.д... ***********************************************
int
PEM_BlobInfo2X509(BLOB_INFO *Blob, X509 **x)
{
int PemType = -1;
bool r = 0;
if(!Blob) return CKR_ARGUMENTS_BAD;
if((Blob->Blob == NULL) || (Blob->BlobLen == 0))
return CKR_ARGUMENTS_BAD;
r = PEM2Blob(Blob, &PemType);
if(!r)
{
return CKR_X509_NO_OPEN;
}
if(
(PemType == PEM_CERTIFICATE_REQUEST) ||
(PemType == PEM_X509_CRL) ||
(PemType == PEM_PKCS7)
) return CKR_ISNOT_X509;
long BlobLen = Blob->BlobLen;
//BYTE *Ptr = (BYTE *)OPENSSL_malloc(BlobLen);
BYTE Ptr1[CERT_LEN];
memcpy(Ptr1, Blob->Blob, BlobLen);
BYTE *Ptr = Ptr1;
try
{
if(!d2i_X509(x, &(const BYTE*)Ptr, BlobLen)) // ошибка - тут
return CKR_CERT_ENCODE; if(x[0]->cert_info->key->public_key->length != 66)
return CKR_PUBKEY_NO_OPEN;
Ptr = NULL;
}
catch(...)
{
return CKR_X509_NO_OPEN;
};