Всем привет.
Очень нужна помощь.
Есть код на C# для верификации подписи с использование CryptoApi и получением ключа из сертификата КриптоПро.
//Считываем сертификат из файла
FileInfo fi = new FileInfo(certPath);
uint certLen;
byte[] cert = new byte[fi.Length];
using (FileStream fs = File.OpenRead(certPath))
{
certLen = (uint)fs.Read(cert, 0, (int)fi.Length);
fs.Close();
}
//Получение контекста публичного сертификата
hCertContext = CryptoApi.CertCreateCertificateContext((int)CryptoPro.CERT_ENCODING, cert, cert.Length);
//Получение контекста криптопровайдера для проверки подписи
CryptoApi.CryptAcquireContext(out hCryptoProvider, null, null, CryptoPro.PROV_GOST_2001_DH, CryptoApi.CRYPT_VERIFYCONTEXT);
//Получаем указатель на SubjectPublicKeyInfo
CryptoApi.CERT_CONTEXT certContextStruct = (CryptoApi.CERT_CONTEXT)Marshal.PtrToStructure(hCertContext,typeof(CryptoApi.CERT_CONTEXT));
IntPtr pCertInfo = certContextStruct.pCertInfo;
IntPtr pSubjectPublicKeyInfo = (IntPtr)(pCertInfo.ToInt32() + 56);
//Импорт публичного ключа в криптопровайдер
CryptoApi.CryptImportPublicKeyInfo(hCryptoProvider, CryptoPro.CERT_ENCODING, pSubjectPublicKeyInfo, out hPubKey); //Вот в этом месте проблема
bool res = CryptoApi.CryptCreateHash(hCryptoProvider, CryptoPro.CALG_GR3411, IntPtr.Zero, 0, ref hHash);
Encoding encoding = Encoding.GetEncoding(encodingHeaderName);
byte[] buffer = encoding.GetBytes(body);
res = CryptoApi.CryptHashData(hHash, buffer, (uint)buffer.Length, 0);
byte[] verifySignature = Convert.FromBase64String(signature);
retVal = CryptoApi.CryptVerifySignature(hHash,verifySignature,verifySignature.Length, hPubKey, null, 0);
Данный код отлично работает на .NET 1.1 независимо от архитектуры операционной системы (x86, x64), наверно потому что .net 1.1 может быть только x86.
Так же отлично работает на NET 4.0 в x86 среде.
Но, при запуске данного кода в приложении .NET 4 под Windows x64 не отрабатывает вызов CryptImportPublicKeyInfo, LastWin32Error = -2146881269 (CRYPT_E_ASN1_BADTAG), ну и соответственно проверка подписи далее не проходит.
Нагуглить решение не смог.
В чем может быть проблема?
Update:
Система: Windows Server 2008 R2
Крипто Про CSP 3.6 KC1
Отредактировано пользователем 7 февраля 2012 г. 19:40:51(UTC)
| Причина: Не указана