| ||||
| ||||
Нужен прототип CryptSignMessage() в C# | ||||
Ответы: | ||||
| ||||
Существует два способа подписания CMS сообщений: 1. При помощи пакета System.Security.Cryptography.Pkcs входящего в состав .NET Framework version 2.0. 2. При помощи P/Invoke. К сожалению .NET Framework не поддерживает разбор ГОСТ сертификатов и ряд других функций работы с криптографией. Мы занимаемся разработкой поддержки алгоритмов ГОСТ в .Net, но продукта пока нет. Так, что остается только вариант вызова через P/Invoke, он документирован в Microoft. Скорее всего Вам не удастся ограничиться одной функцией и придется написать достаточно большое число дополнительных классов и структур. | ||||
| ||||
[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; } | ||||