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

Уведомление

Icon
Error

Опции
К последнему сообщению К первому непрочитанному
Offline Хемуль Хемулевский  
#1 Оставлено : 9 октября 2025 г. 11:52:41(UTC)
Хемуль Хемулевский

Статус: Участник

Группы: Участники
Зарегистрирован: 11.12.2024(UTC)
Сообщений: 10
Российская Федерация
Откуда: Москва

Коллеги добрый день. Помогите разобраться. Используем csp v5.0.10013 KC1. Пытаемся подписать сообщение ключом с алгоритмом 1.2.643.7.1.1.1.2 и хеш алгоритмом 1.2.643.7.1.1.2.3 с помощью низкоуровневого и высокоуровневого апи криптопро csp. Но в результате проверки подписи видим что алгоритм ключа попадает в то место где должен быть алгоритм подписи указан и в итоге вместо ожидаемого 1.2.643.7.1.1.3.3 получаем 1.2.643.7.1.1.1.2 и в результате ошибку JCSP: no such algorithm: 1.2.643.7.1.1.1.2 for provider JCSP.
Стали разбираться и нашли что в файле wincrypt.h сказано:
Цитата:
If HashEncryptionAlgorithm is present and not NULL its used instead of
the SigningCert's PublicKeyInfo.Algorithm.
Попробовали применить, но похоже что значение HashEncryptionAlgorithm игнорируется и в методе CryptSignMessage и в CryptMsgOpenToEncode. Подскажите пожалуйста, что делаем не так?

Код:
  CryptAcquireCertificatePrivateKey(
            pCertCtx_,
            0,
            NULL,
            &hProv,
            &dwKeySpec,
            &fCallerFreeProv)
   
        EncodedTime signTime = getCurrentEncodedTime();
        result.date = signTime.localTime;
        CRYPT_ATTR_BLOB attrBlob{};
        CRYPT_ATTRIBUTE attr{};
        attrBlob.cbData = signTime.asn1Data.size();
        attrBlob.pbData = signTime.asn1Data.data();
        attr.pszObjId = (LPSTR)szOID_RSA_signingTime;
        attr.cValue = 1;
        attr.rgValue = &attrBlob;
        
        CRYPT_OBJID_BLOB emptyParam;
        emptyParam.cbData = 0;
        emptyParam.pbData = nullptr;
        CRYPT_ALGORITHM_IDENTIFIER hashAlgo{};
        CRYPT_ALGORITHM_IDENTIFIER signAlgo{};
        [b]hashAlgo.pszObjId = (LPSTR)szOID_CP_GOST_R3411_12_512;
        signAlgo.pszObjId = (LPSTR)szOID_CP_GOST_R3411_12_512_R3410[/b];
        signAlgo.Parameters = emptyParam;
        hashAlgo.Parameters = emptyParam;

        CMSG_SIGNER_ENCODE_INFO signer{};
        signer.cbSize = sizeof(signer);
        signer.pCertInfo = pCertCtx_->pCertInfo;
        signer.hCryptProv = hProv;
        signer.dwKeySpec = dwKeySpec;
        signer.HashAlgorithm = hashAlgo;
        signer.HashEncryptionAlgorithm = signAlgo;
        signer.pvHashAuxInfo = nullptr;
        signer.pvHashEncryptionAuxInfo = nullptr;
        signer.cAuthAttr = 1;
        signer.rgAuthAttr = &attr;

        CMSG_SIGNED_ENCODE_INFO signedInfo{};
        signedInfo.cbSize = sizeof(signedInfo);
        signedInfo.cSigners = 1;
        signedInfo.rgSigners = &signer;
        signedInfo.cCertEncoded = 0;
        signedInfo.rgCertEncoded = NULL;

        hMsg = CryptMsgOpenToEncode(
            PKCS_7_ASN_ENCODING | X509_ASN_ENCODING,
            CMSG_DETACHED_FLAG,   
            CMSG_SIGNED,
            &signedInfo,
            NULL,
            NULL
        );
        
        CryptMsgUpdate(hMsg, reinterpret_cast<const BYTE*>(dataToSign.bytes()), dataToSign.length, TRUE)
              

Отредактировано пользователем 9 октября 2025 г. 11:54:41(UTC)  | Причина: Не указана

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