Прошу помощи в определении причины следующей проблемы
Время от времени windows-сервис (.NET Framework), пользующийся CSP КриптоПро, сталкивается с ошибками при вызовах CryptoAPI-функций CryptGetUserKey и CryptDestroyKey.
В обоих случаях код ошибки совершенно неинформативен - 80090020 (NTE_FAIL).
Кусок кода:
if (!CryptoAPI.CryptContextAddRef(hCryptoProvider, null, 0))
throw new Win32Exception("Ошибка при добавлении ссылки на криптопровайдер");
try
{
// определяем подходящий для данного ключа keySpec
uint dwKeySpec = CryptoAPI.AT_KEYEXCHANGE;
IntPtr userKey;
if (!CryptoAPI.CryptGetUserKey(hCryptoProvider, dwKeySpec, out userKey))
{
dwKeySpec = CryptoAPI.AT_SIGNATURE;
if (!CryptoAPI.CryptGetUserKey(hCryptoProvider, dwKeySpec, out userKey))
{
throw new Win32Exception("Ошибка получения хэндла ключа.");
// !!!ошибка возникает иногда здесь!!! }
}
IntPtr hHash;
//Получение объекта для хэширования.
if (!CryptoAPI.CryptCreateHash(hCryptoProvider, cryptoAlgId, IntPtr.Zero, 0, out hHash))
throw new Win32Exception("Ошибка при создании хэша");
try
{
byte[] buffer = encoding.GetBytes(message);
//Хэширование сообщения.
if (!CryptoAPI.CryptHashData(hHash, buffer, buffer.Length, 0))
throw new Win32Exception("Ошибка при хэшировании сообщения");
int signatureLength = 0;
//Определение размера подписи.
if (!CryptoAPI.CryptSignHash(hHash, dwKeySpec, null, 0, null, ref signatureLength))
throw new Win32Exception("Ошибка при определении размера подписи");
byte[] signature = new byte[signatureLength];
//Подпись хэша сообщения.
if (!CryptoAPI.CryptSignHash(hHash, dwKeySpec, null, 0, signature, ref signatureLength))
throw new Win32Exception("Ошибка при подписи хэша сообщения");
return Convert.ToBase64String(signature, 0, signatureLength);
}
finally
{
if (!CryptoAPI.CryptDestroyHash(hHash))
throw new Win32Exception("Ошибка при уничтожении объекта хэширования");
if (!CryptoAPI.CryptDestroyKey(userKey))
// !!!ошибка возникает иногда здесь!!! throw new Win32Exception("Ошибка при удалении хэндла ключа");
}
}
finally
{
if (!CryptoAPI.CryptReleaseContext(hCryptoProvider, 0))
throw new Win32Exception("Ошибка при освобождении ссылки на криптопровайдер");
}
В системном eventlog никаких следов/намеков не обнаружено.
В чем может быть проблема?
Отредактировано пользователем 28 февраля 2011 г. 20:59:26(UTC)
| Причина: Не указана