Есть код создания подписи запроса (soap-сообщение) на сервер из .NET приложения (x86 и x64 версии).
Есть два варианта поведения:
1) В Windows 7 Pro x86 подпись успешно создается и на сервере не возникает ошибок проверки.
Информация о системе:
- Microsoft Windows 7 Максимальная x86.
Версия 6.1.7601 Service Pack 1 Сборка 7601
x86-based PC
- Приложение собрано под .NET Framework 4.0.
- КриптоПро CSP 3.6.6497
Версия ядра СКЗИ: 3.6.5359 КС1
- Для хэша используется ГОСТ Р 34.11-94.
2) В Windows 7 Professional x64 подпись создается, но для одних тех же данных каждый раз получается новая
(и в x86 версии приложения, и в x64 версии), и на стороне сервера возникает ошибка проверки подписи.
- Microsoft Windows 7 Профессиональная x64
6.1.7601 Service Pack 1 Сборка 7601
x64-based PC
- Приложение собрано под .NET Framework 4.0.
- КриптоПро CSP 3.6.7777
Версия ядра СКЗИ: 3.6.5365 КС1
- Для хэша используется ГОСТ Р 34.11-94.
Сталкивался ли кто-нибудь с такой проблемой на Windows x64?
Есть ли какие-нибудь идеи?
Код подписи сообщения выглядит примерно так:
public const uint AT_SIGNATURE = 2;
public const uint CERT_ALG_ID = 32798;
public const uint TYPE = 75;
IntPtr hCryptoProvider = IntPtr.Zero;
IntPtr hPubKey = IntPtr.Zero;
IntPtr hHash = IntPtr.Zero;
bool result = win32.CryptAcquireContext(out hCryptoProvider, _container, null, TYPE, 0);
win32.CryptGetUserKey(hCryptoProvider, AT_SIGNATURE, ref hPubKey);
win32.CryptCreateHash(hCryptoProvider, CERT_ALG_ID, IntPtr.Zero, (uint)0, out hHash);
Encoding encoding = Encoding.GetEncoding(encodingHeaderName);
byte[] buffer = encoding.GetBytes(body);
win32.CryptHashData(hHash, buffer, buffer.Length, 0);
uint signatureLength = 0;
win32.CryptSignHash(hHash, AT_SIGNATURE, null, 0, null, ref signatureLength);
byte[] signature = new byte[signatureLength];
win32.CryptSignHash(hHash, AT_SIGNATURE, null, 0, signature, ref signatureLength);
retVal = System.Convert.ToBase64String(signature, 0, (int)signatureLength);