Статус: Новичок
Группы: Участники
Зарегистрирован: 04.10.2018(UTC) Сообщений: 3  Сказал(а) «Спасибо»: 1 раз
|
Добрый день. На тестовой машине установлен КриптоПро CSP 4.0 Сформирован сертификат с поддержкой ГОСТ 2012 с использованием: https://cryptopro.ru/certsrv/certrqma.aspСсылка на скриншот: https://ibb.co/cCHnieНа C# написан код по получению OID алгоритма хэширования: Код:
string _sOID = "";
IntPtr hHashAlgInfo = IntPtr.Zero;
IntPtr hData = IntPtr.Zero;
CERT_CONTEXT pContext = (CERT_CONTEXT)Marshal.PtrToStructure(_hCertHandle, typeof(CERT_CONTEXT));
CERT_INFO pCertInfo = (CERT_INFO)Marshal.PtrToStructure(pContext.pCertInfo, typeof(CERT_INFO));
byte[]arData = BitConverter.GetBytes(Capi.CertOIDToAlgId(pCertInfo.SignatureAlgorithm.pszObjId));
hData = Marshal.AllocHGlobal(arData.Length);
Marshal.Copy(arData, 0, hData, arData.Length);
//// Поиск OID
hHashAlgInfo = CryptFindOIDInfo(CryptoConst.CRYPT_OID_INFO_ALGID_KEY, hData, OidGroup.HashAlgorithm);
CRYPT_OID_INFO pHashAlgInfo = (CRYPT_OID_INFO)Marshal.PtrToStructure(hHashAlgInfo, typeof(CRYPT_OID_INFO));
_sOID = pHashAlgInfo.pszOID;
В результате получаю: "1.2.643.2.2.9", что согласно таблице http://cpdn.cryptopro.ru/content/csp40/html/group___pro_c_s_p_ex_DP8.html соответствует szOID_CP_GOST_R3411. При этом метод CryptSignMessage возвращает False при указании обозначенного выше OID, а отрабатывает только при явном указании OID "1.2.643.7.1.1.2.2", что соответствует szOID_CP_GOST_R3411_12_256 (собственно, именно этот алгоритм и выбирался при формировании тестового сертификата). Подскажите, пожалуйста, как определить правильный OID в данном случае? Причем, если я явно указываю имя контейнера и провайдер, то нужный OID удается получить для указанного сертификата, но это не совсем корректный способ (привожу куски кода): Код:
CryptAcquireContext(ref hCrypto, contName, "Crypto-Pro GOST R 34.10-2012 Cryptographic Service Provider",
80, CryptAcquireContextFlags.VerifyContext);
...
CryptGetProvParam(hCrypto, PP_ENUMALGS_EX, arData, ref iLen, iFlag);
IntPtr unPtr = Marshal.AllocHGlobal(iLen);
Marshal.Copy(arData, 0, unPtr, iLen);
PROV_ENUMALGS_EX pInfo = (PROV_ENUMALGS_EX)Marshal.PtrToStructure(unPtr, typeof(PROV_ENUMALGS_EX));
byte[] arDataAlg = BitConverter.GetBytes(pInfo.aiAlgid);
IntPtr hDataAlg = Marshal.AllocHGlobal(arDataAlg.Length);
Marshal.Copy(arDataAlg, 0, hDataAlg, arDataAlg.Length);
CryptFindOIDInfo(CRYPT_OID_INFO_ALGID_KEY, hDataAlg, OidGroup.HashAlgorithm);
CRYPT_OID_INFO pHashAlgInfo = (CRYPT_OID_INFO)Marshal.PtrToStructure(hHashAlgInfo2, typeof(CRYPT_OID_INFO));
_sOID = pHashAlgInfo.pszOID;
Отредактировано пользователем 4 октября 2018 г. 13:38:31(UTC)
| Причина: Не указана
|