Хорошо.
А подскажите еще, может другие идентификаторы надо изменить. Дело в том, что мне дали исходники, а там вместо enum'ов цифры указаны, а что они означают и где их взяли непонятно.
AT_SIGNATURE = 2
CERT_ALG_ID = 32798
win32.CryptGetUserKey(hCryptoProvider, win32.AT_SIGNATURE, ref hPubKey);
win32.CryptCreateHash(hCryptoProvider, (uint)CryptoPro.CERT_ALG_ID, IntPtr.Zero, (uint)0, out hHash);
что вот за AT_SIGNATURE и что за CERT_ALG_ID? Может какой алгоритм другой указать?
Вобщем вот весь код подписи:
IntPtr hCryptoProvider = IntPtr.Zero;
IntPtr hPubKey = IntPtr.Zero;
IntPtr hHash = IntPtr.Zero;
try
{
win32.CryptAcquireContext(out hCryptoProvider, _container, null, CryptoPro.TYPE, 0);
win32.CryptGetUserKey(hCryptoProvider, win32.AT_SIGNATURE, ref hPubKey);
win32.CryptCreateHash(hCryptoProvider, (uint)CryptoPro.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, (uint)win32.AT_SIGNATURE, null, 0, null, ref signatureLength);
byte[] signature = new byte[signatureLength];
win32.CryptSignHash(hHash, win32.AT_SIGNATURE, null, 0, signature, ref signatureLength);
retVal = System.Convert.ToBase64String(signature, 0, (int)signatureLength);