Тема: Работа с библиотекой cpki1.dll :: VCERT_FindCert

Здравствуйте!

Пишу программу с использованием SDK для упрощенного интерфейса cpki1, и возникла необходимость определения параметров собственного сертификата. А именно, интересуют поля "альтернативного" имени владельца. Использую следующий код (выдержки) :

    error_status_t error_code = VCERT_OK;
    context_t hCtx = NULL;
    find_param_t FindParam = {0};
    find_result_t FindResult = {0};
    // ...
    error_code = CryptoFunctions.VCERT_Initialize((string_t)"My", FLAG_INIT_NOCRLUPDATE | FLAG_INIT_NOLDAP, &hCtx);
    memset(&FindParam, 0, sizeof(find_param_t));
    FindParam.flag = FLAG_FIND_MY;
    FindParam.info = FIELD_SUBJECTALTNAME;
    error_code = CryptoFunctions.VCERT_FindCert(hCtx, &FindParam, &FindResult);
    if (error_code != VCERT_OK)
    {
        errorMsg(NULL, "Ошибка! %s (%08X)", CryptoFunctions.VCERT_GetErrorText(error_code, szError, sizeof(szError)), error_code);
        return false;
    }
    if ((FindResult.certs[0].subjectAltName.surname == NULL) ||
        (FindResult.certs[0].subjectAltName.businessCategory == NULL) ||
        (FindResult.certs[0].subjectAltName.registredAddress == NULL) ||
        (FindResult.certs[0].subjectAltName.telephoneNumber == NULL) ||
        (FindResult.certs[0].subjectAltName.DNS == NULL))
    {
        errorMsg(NULL, "%s", "Ошибка получения параметров личного сертификата");
        return false;
    }
    // ...
Несмотря на то, что find_result_t::num я получаю 1 (намек на то, что 1 сертификат все-таки найден, и он, по идее, должен быть личным), в find_result_t::certs[0], (по моему впечатлению) находится "мусор". Например, в поле fields находится некоторое число, у меня на домашней машине это 147680, на рабочей - другое число, заполнены 2 поля - notBefore, notAfter (возможно, это тоже "мусор"), во всех остальных полях NULL.

Самое интересное, что иногда (приблизительно в 1 случае из 5) я все же получаю правильный результат, т.е., иногда работает, но чаще нет. При этом find_result_t::num = 1 всегда, вне зависимости, удалось получить поля или нет.

Использую CCERT PKI сборки 3.1.160.0 и Крипто Про 2.0 сборки 2083.

Подскажите, пожалуйста, что можно сделать в данной ситуации?

С уважением,
Дмитрий

2

Re: Работа с библиотекой cpki1.dll :: VCERT_FindCert

Если я ещё что-то помню - то код правильный, стоит только анализировать FindResult.num перед обращением к полям