Форум КриптоПро
»
Устаревшие продукты
»
КриптоПро CSP 3.6
»
Получение цифровой подписи алгоритмом GOST3411(C# по средством invoke)
Статус: Активный участник
Группы: Участники
Зарегистрирован: 10.05.2012(UTC) Сообщений: 50
|
Доброго времени суток! Хочется подписать байт массив по алгоритму GOST3411. Для начала пытаюсь получить размер буффера. Код:[StructLayout (LayoutKind. Sequential)]
public struct CRYPTOAPI_BLOB
{
public int cbData;
public byte [] pbData;
}
[StructLayout (LayoutKind. Sequential)]
public struct CRYPT_ALGORITHM_IDENTIFIER
{
[MarshalAs (UnmanagedType. LPStr)]
public String pszObjId;//LPSTR
public CRYPTOAPI_BLOB Parameters;
}
[StructLayout (LayoutKind. Sequential)]
public struct CRYPT_SIGN_MESSAGE_PARA
{
public int cbSize;
public int dwMsgEncodingType;
public IntPtr pSigningCert;//PCCERT_CONTEXT
public CRYPT_ALGORITHM_IDENTIFIER HashAlgorithm;//CRYPT_ALGORITHM_IDENTIFIER
public IntPtr pvHashAuxInfo;//void*
public int cMsgCert;
public IntPtr[] rgpMsgCert;
public int cMsgCrl;
public IntPtr rgpMsgCrl;//PCCRL_CONTEXT*
public int cAuthAttr;
public IntPtr rgAuthAttr;//PCRYPT_ATTRIBUTE
public int cUnauthAttr;
public IntPtr rgUnauthAttr;//PCRYPT_ATTRIBUTE
public int dwFlags;
public int dwInnerContentType;
public CRYPT_ALGORITHM_IDENTIFIER HashEncryptionAlgorithm;//CRYPT_ALGORITHM_IDENTIFIER
public IntPtr pvHashEncryptionAuxInfo;//void*
}
[DllImport("crypt32.dll", SetLastError = true)]
public static extern int CryptSignMessage (
ref CRYPT_SIGN_MESSAGE_PARA pSignPara,
//int fDetachedSignature,
bool fDetachedSignature,
int cToBeSigned,
IntPtr [] rgpbToBeSigned,
int [] rgcbToBeSigned,
byte [] pbSignedBlob,
ref int pcbSignedBlob
);
public static void Sign(byte[] data, X509Certificate2 signingCert)
{
int X509_ASN_ENCODING = 0x00000001;
int PKCS_7_ASN_ENCODING = 0x00010000;
int MY_ENCODING_TYPE = X509_ASN_ENCODING | PKCS_7_ASN_ENCODING;
IntPtr[] rgpbToBeSigned = new IntPtr[1];
int[] rgcbToBeSigned = new int[1];
CRYPT_SIGN_MESSAGE_PARA SignPara = new CRYPT_SIGN_MESSAGE_PARA();
IntPtr buffer = Marshal.AllocCoTaskMem(Marshal.SizeOf(data[0]) * data.Length);
Marshal.Copy(data, 0, buffer, data.Length);
rgpbToBeSigned[0] = buffer;
rgcbToBeSigned[0] = 1;
SignPara.cbSize = Marshal.SizeOf(SignPara);
SignPara.dwMsgEncodingType = MY_ENCODING_TYPE;
SignPara.pSigningCert = signingCert.Handle;
SignPara.HashAlgorithm.pszObjId = "1.2.643.2.2.4"; // szOID_CP_GOST_R3411_R3410
SignPara.HashAlgorithm.Parameters.cbData = 0;
SignPara.HashAlgorithm.Parameters.pbData = null;
SignPara.pvHashAuxInfo = IntPtr.Zero;
SignPara.cMsgCert = 1;
SignPara.rgpMsgCert = null;
SignPara.cMsgCrl = 0;
SignPara.cAuthAttr = 0;
SignPara.dwInnerContentType = 0;
SignPara.cUnauthAttr = 0;
SignPara.dwFlags = 0;
SignPara.pvHashAuxInfo = IntPtr.Zero;
SignPara.rgAuthAttr = IntPtr.Zero;
int signSize = 0;
int csm = CryptSignMessage (ref SignPara, true, 1, rgpbToBeSigned, rgcbToBeSigned, null, ref signSize);
Console.WriteLine("data.Length: " + data.Length);
Console.WriteLine("csm: " + csm);
}
Но при этом получаю: Цитата:data.Length: 936 csm: 0 Подскажите, пожалуйста, что не так.
|
|
|
|
Статус: Сотрудник
Группы: Участники
Зарегистрирован: 26.07.2011(UTC) Сообщений: 13,523   Сказал «Спасибо»: 555 раз Поблагодарили: 2252 раз в 1757 постах
|
Цитата:rgcbToBeSigned[0] = 1; это осмысленно указано или просто копирование кода (99,99%) с форумов на данную тему? Цитата:[DllImport("crypt32.dll", SetLastError = true)]
а проверка не нужна? или Marshal.GetLastWin32Error - выдает 0 ? Отредактировано пользователем 2 июля 2012 г. 5:59:26(UTC)
| Причина: Не указана |
|
|
|
|
Статус: Активный участник
Группы: Участники
Зарегистрирован: 10.05.2012(UTC) Сообщений: 50
|
Андрей * написал:Цитата:rgcbToBeSigned[0] = 1; это осмысленно указано или просто копирование кода (99,99%) с форумов на данную тему? Цитата:[DllImport("crypt32.dll", SetLastError = true)]
а проверка не нужна? или Marshal.GetLastWin32Error - выдает 0 ? Цитата:rgcbToBeSigned[0] = 1; Не осмысленно. Скопировал т.к. не знал что присвоить туда. Marshal.GetLastWin32Error возвращает Marshal.GetLastWin32Error: -2146893792
|
|
|
|
Статус: Активный участник
Группы: Участники
Зарегистрирован: 10.05.2012(UTC) Сообщений: 50
|
Пока самостоятельно разобраться не получается.
|
|
|
|
Статус: Сотрудник
Группы: Участники
Зарегистрирован: 26.07.2011(UTC) Сообщений: 13,523   Сказал «Спасибо»: 555 раз Поблагодарили: 2252 раз в 1757 постах
|
ikozlov написал:Пока самостоятельно разобраться не получается. а на C++ есть возможность разобраться? как вариант - скомпилировать свою dll или все таки разобраться с CryptoAPI... + взаимодействие с неуправляемым кодом в .Net и дописать p/invoke :) Отредактировано пользователем 2 июля 2012 г. 19:16:53(UTC)
| Причина: Не указана |
|
|
|
|
Статус: Активный участник
Группы: Участники
Зарегистрирован: 10.05.2012(UTC) Сообщений: 50
|
Андрей * написал:ikozlov написал:Пока самостоятельно разобраться не получается. а на C++ есть возможность разобраться? как вариант - скомпилировать свою dll или все таки разобраться с CryptoAPI... + взаимодействие с неуправляемым кодом в .Net и дописать p/invoke :) Конечно хочется добить неуправляемый код. Буду читать...
|
|
|
|
Статус: Сотрудник
Группы: Участники
Зарегистрирован: 26.07.2011(UTC) Сообщений: 13,523   Сказал «Спасибо»: 555 раз Поблагодарили: 2252 раз в 1757 постах
|
ikozlov написал:Андрей * написал:ikozlov написал:Пока самостоятельно разобраться не получается. а на C++ есть возможность разобраться? как вариант - скомпилировать свою dll или все таки разобраться с CryptoAPI... + взаимодействие с неуправляемым кодом в .Net и дописать p/invoke :) Конечно хочется добить неуправляемый код. Буду читать... добивай... public IntPtr[] rgpMsgCert; => public IntPtr rgpMsgCert; SignPara.cMsgCert = 1; SignPara.rgpMsgCert = null;  (а указал, что есть... = 1, строка выше) => SignPara.rgpMsgCert = IntPtr.Zero; хотя лучше заполнять, чтобы был сертификат подписи... Отредактировано пользователем 3 июля 2012 г. 2:24:17(UTC)
| Причина: Не указана |
|
|
|
|
Статус: Сотрудник
Группы: Участники
Зарегистрирован: 26.07.2011(UTC) Сообщений: 13,523   Сказал «Спасибо»: 555 раз Поблагодарили: 2252 раз в 1757 постах
|
ikozlov написал:Андрей * написал:Цитата:rgcbToBeSigned[0] = 1; это осмысленно указано или просто копирование кода (99,99%) с форумов на данную тему? Цитата:[DllImport("crypt32.dll", SetLastError = true)]
а проверка не нужна? или Marshal.GetLastWin32Error - выдает 0 ? Цитата:rgcbToBeSigned[0] = 1; Не осмысленно. Скопировал т.к. не знал что присвоить туда. Marshal.GetLastWin32Error возвращает Marshal.GetLastWin32Error: -2146893792 = внутренняя ошибка Цитата:Хочется подписать байт массив по алгоритму GOST3411.
алгоритм хеширования: string GOST_34_11_94 = "1.2.643.2.2.9"; а в коде "указано": Цитата: SignPara.HashAlgorithm.pszObjId = "1.2.643.2.2.4"; // szOID_CP_GOST_R3411_R3410 = Алгоритм цифровой подписи ГОСТ Р 34.10-94 вместо ГОСТ Р 34.10- 94 давно используется ГОСТ Р 34.10-2001 может прояснит вот это: http://cpdn.cryptopro.ru...___pro_c_s_p_ex_DP8.htmlи код "почти готов"... Отредактировано пользователем 3 июля 2012 г. 2:23:32(UTC)
| Причина: Не указана |
|
|
|
|
Статус: Активный участник
Группы: Участники
Зарегистрирован: 10.05.2012(UTC) Сообщений: 50
|
Выставил вышеуказанныне параметры и указал алгоритм хэширования Индекс которого "1.2.643.2.2.3" (Алгоритм цифровой подписи ГОСТ Р 34.10-2001). Увы, пока результат тот же. Подскажите, пожалуйста, где можно почитать про структуру CRYPT_SIGN_MESSAGE_PARA. чтобы не задавать глупых вопросов.
|
|
|
|
Статус: Сотрудник
Группы: Участники
Зарегистрирован: 26.07.2011(UTC) Сообщений: 13,523   Сказал «Спасибо»: 555 раз Поблагодарили: 2252 раз в 1757 постах
|
|
|
|
|
|
Форум КриптоПро
»
Устаревшие продукты
»
КриптоПро CSP 3.6
»
Получение цифровой подписи алгоритмом GOST3411(C# по средством invoke)
Быстрый переход
Вы не можете создавать новые темы в этом форуме.
Вы не можете отвечать в этом форуме.
Вы не можете удалять Ваши сообщения в этом форуме.
Вы не можете редактировать Ваши сообщения в этом форуме.
Вы не можете создавать опросы в этом форуме.
Вы не можете голосовать в этом форуме.
Important Information:
The Форум КриптоПро uses cookies. By continuing to browse this site, you are agreeing to our use of cookies.
More Details
Close