12.09.2006 10:42:24Нужен прототип CryptSignMessage() в C# Ответов: 2
Василий
Нужен прототип CryptSignMessage() в C#
 
Ответы:
12.09.2006 13:07:42Александр
Существует два способа подписания CMS сообщений:
1. При помощи пакета System.Security.Cryptography.Pkcs входящего в состав .NET Framework version 2.0.
2. При помощи P/Invoke.

К сожалению .NET Framework не поддерживает разбор ГОСТ сертификатов и ряд других функций работы с криптографией. Мы занимаемся разработкой поддержки алгоритмов ГОСТ в .Net, но продукта пока нет. Так, что остается только вариант вызова через P/Invoke, он документирован в Microoft. Скорее всего Вам не удастся ограничиться одной функцией и придется написать достаточно большое число дополнительных классов и структур.
13.09.2006 13:08:42Андрей Горячев
[DllImport("Crypt.dll", EntryPoint = "SignMessage")]
private static extern bool signMessage(byte[] message, int messageSize,
byte[] signedMessageBlob, ref int signedMessageBlobSize);

Это в C#;
А это в C++ (.dll с импортируемыми функциями):

extern "C" bool __declspec(dllexport) SignMessage(const BYTE* Message, DWORD MessageSize,
BYTE* pbSignedMessageBlob, DWORD* cbSignedMessageBlob)
{
const BYTE* MessageArray[] = { Message };
DWORD MessageSizeArray[1];

MessageSizeArray[0] = MessageSize;

CRYPT_SIGN_MESSAGE_PARA SigParams;

memset(&SigParams, 0, sizeof(SigParams));
SigParams.cbSize = sizeof(CRYPT_SIGN_MESSAGE_PARA);
SigParams.dwMsgEncodingType = MY_ENCODING_TYPE;
SigParams.pSigningCert = curentCert;
SigParams.HashAlgorithm.pszObjId = curentCert->pCertInfo->SubjectPublicKeyInfo.Algorithm.pszObjId;
SigParams.HashAlgorithm.Parameters.cbData = NULL;
SigParams.cMsgCert = 1;
SigParams.rgpMsgCert = &curentCert;
SigParams.cAuthAttr = 0;
SigParams.dwInnerContentType = 0;
SigParams.cMsgCrl = 0;
SigParams.cUnauthAttr = 0;
SigParams.dwFlags = 0;
SigParams.pvHashAuxInfo = NULL;
SigParams.rgAuthAttr = NULL;

if(!CryptSignMessage(&SigParams, FALSE, 1, MessageArray, MessageSizeArray, pbSignedMessageBlob, cbSignedMessageBlob))
{
setLastError();
return false;
}

return true;
}