Ключевое слово в защите информации
КЛЮЧЕВОЕ СЛОВО
в защите информации
Получить ГОСТ TLS-сертификат для домена (SSL-сертификат)
Добро пожаловать, Гость! Чтобы использовать все возможности Вход. Новые регистрации запрещены.

Уведомление

Icon
Error

Опции
К последнему сообщению К первому непрочитанному
Offline RMad  
#1 Оставлено : 11 марта 2010 г. 15:23:59(UTC)
RMad

Статус: Новичок

Группы: Участники
Зарегистрирован: 08.10.2008(UTC)
Сообщений: 9

Добрый день.
Есть необходимость программно, используя Crypto API 2.0, получить (к примеру для последующей печати) все имеющиеся у сертификата расширения: их названия и значения.
использую следующий код:
Код:

    BYTE* pbDecoded;	        // result
    DWORD cbDecoded;	// result length
    DWORD ExtCount = pCertContext->pCertInfo->cExtension;
    for (int i = 0; i < ExtCount; i++) // перебор все расширений сертификата
    {
         // Get length needed to buffer;
        if (!CryptDecodeObject(
            pCertContext->dwCertEncodingType,
            pCertContext->pCertInfo->rgExtension[i].pszObjId,
            pCertContext->pCertInfo->rgExtension[i].Value.pbData,
            pCertContext->pCertInfo->rgExtension[i].Value.cbData,
            NULL,
            NULL,
            &cbDecoded))
        {
            return 0;
        }
        // Allocated the needed buffer
        pbDecoded = (BYTE*)malloc(cbDecoded);
        if (!pbDecoded)
        {
            return 0;
        }
        // Call again to
        if (!CryptDecodeObject(
            pCertContext->dwCertEncodingType,
            pCertContext->pCertInfo->rgExtension[i].pszObjId,
            pCertContext->pCertInfo->rgExtension[i].Value.pbData,
            pCertContext->pCertInfo->rgExtension[i].Value.cbData,
            NULL,
            pbDecoded,
            &cbDecoded))
        {
            return 0;
        }
        // далее по названию расширения пытаюсь получить его значение
        if (!strcmp(pCertContext->pCertInfo->rgExtension[i].pszObjId, szOID_KEY_USAGE))
        {
            PCERT_KEY_ATTRIBUTES_INFO pKeyAtt;
            pKeyAtt= (PCERT_KEY_ATTRIBUTES_INFO) pbDecoded;
            if (*pKeyAtt->IntendedKeyUsage.pbData & CERT_DIGITAL_SIGNATURE_KEY_USAGE) // строка генерирует access violation
                fprintf(fout, "CERT_DIGITAL_SIGNATURE_KEY_USAGE");       // вывод значения - CERT_DIGITAL_SIGNATURE_KEY_USAGE
            //if (*pKeyAtt->IntendedKeyUsage.pbData & CERT_DIGITAL_SIGNATURE_KEY_USAGE)
            //    fprintf(fout, "CERT_DATA_ENCIPHERMENT_KEY_USAGE");
            // и т. д для все описанных в wincrypt.h атрибутов
        }
        //(!strcmp(pCertContext->pCertInfo->rgExtension[i].pszObjId, szOID_KEY_USAGE))
        // далее для всех описанных в wincrypt.h OID-ов расширений 
    }

при побитовом сравнении декодированных и приведенных к PCERT_KEY_ATTRIBUTES_INFO данных, возникает ошибка чтения памяти, видимо с декодированием или приведением данных что-то не так.
Еще бы хотелось узнать общий алгоритм чтения всех расширений и их значений, имеющихся у сертификата)).
Offline Kirill Sobolev  
#2 Оставлено : 11 марта 2010 г. 19:30:10(UTC)
Кирилл Соболев

Статус: Сотрудник

Группы: Участники
Зарегистрирован: 25.12.2007(UTC)
Сообщений: 1,733
Мужчина
Откуда: КРИПТО-ПРО

Поблагодарили: 177 раз в 168 постах
Цитата:
возникает ошибка чтения памяти, видимо с декодированием

по szOID_KEY_USAGE CryptDecodeObject декодирует в CRYPT_BIT_BLOB, а не в PCERT_KEY_ATTRIBUTES_INFO
Цитата:
Еще бы хотелось узнать общий алгоритм чтения всех расширений и их значений, имеющихся у сертификата)).

Перебор в цикле, как у Вас сделано.
Техническую поддержку оказываем тут
Наша база знаний
Offline RMad  
#3 Оставлено : 12 марта 2010 г. 3:01:00(UTC)
RMad

Статус: Новичок

Группы: Участники
Зарегистрирован: 08.10.2008(UTC)
Сообщений: 9

Cтал декодировать в CRYPT_BIT_BLOB, и все стало работать как надо.
Большое спасибо)).
RSS Лента  Atom Лента
Пользователи, просматривающие эту тему
Guest
Быстрый переход  
Вы не можете создавать новые темы в этом форуме.
Вы не можете отвечать в этом форуме.
Вы не можете удалять Ваши сообщения в этом форуме.
Вы не можете редактировать Ваши сообщения в этом форуме.
Вы не можете создавать опросы в этом форуме.
Вы не можете голосовать в этом форуме.