Ключевое слово в защите информации
КЛЮЧЕВОЕ СЛОВО
в защите информации
Получить ГОСТ TLS-сертификат для домена (SSL-сертификат)
Добро пожаловать, Гость! Чтобы использовать все возможности Вход или Регистрация.

Уведомление

Icon
Error

2 Страницы12>
Опции
К последнему сообщению К первому непрочитанному
Offline ikozlov  
#1 Оставлено : 29 июня 2012 г. 22:10:58(UTC)
ikozlov

Статус: Активный участник

Группы: Участники
Зарегистрирован: 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


Подскажите, пожалуйста, что не так.
Offline Андрей Писарев  
#2 Оставлено : 2 июля 2012 г. 5:41:36(UTC)
Андрей *

Статус: Сотрудник

Группы: Участники
Зарегистрирован: 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)  | Причина: Не указана

Техническую поддержку оказываем тут
Наша база знаний
Offline ikozlov  
#3 Оставлено : 2 июля 2012 г. 14:27:46(UTC)
ikozlov

Статус: Активный участник

Группы: Участники
Зарегистрирован: 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
Offline ikozlov  
#4 Оставлено : 2 июля 2012 г. 18:49:47(UTC)
ikozlov

Статус: Активный участник

Группы: Участники
Зарегистрирован: 10.05.2012(UTC)
Сообщений: 50

Пока самостоятельно разобраться не получается.
Offline Андрей Писарев  
#5 Оставлено : 2 июля 2012 г. 18:56:44(UTC)
Андрей *

Статус: Сотрудник

Группы: Участники
Зарегистрирован: 26.07.2011(UTC)
Сообщений: 13,523
Мужчина
Российская Федерация

Сказал «Спасибо»: 555 раз
Поблагодарили: 2252 раз в 1757 постах
ikozlov написал:
Пока самостоятельно разобраться не получается.


а на C++ есть возможность разобраться?
как вариант - скомпилировать свою dll

или все таки разобраться с CryptoAPI...
+ взаимодействие с неуправляемым кодом в .Net и дописать p/invoke :)

Отредактировано пользователем 2 июля 2012 г. 19:16:53(UTC)  | Причина: Не указана

Техническую поддержку оказываем тут
Наша база знаний
Offline ikozlov  
#6 Оставлено : 2 июля 2012 г. 19:24:48(UTC)
ikozlov

Статус: Активный участник

Группы: Участники
Зарегистрирован: 10.05.2012(UTC)
Сообщений: 50

Андрей * написал:
ikozlov написал:
Пока самостоятельно разобраться не получается.


а на C++ есть возможность разобраться?
как вариант - скомпилировать свою dll

или все таки разобраться с CryptoAPI...
+ взаимодействие с неуправляемым кодом в .Net и дописать p/invoke :)


Конечно хочется добить неуправляемый код. Буду читать...
Offline Андрей Писарев  
#7 Оставлено : 3 июля 2012 г. 1:56:04(UTC)
Андрей *

Статус: Сотрудник

Группы: Участники
Зарегистрирован: 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; d'oh! (а указал, что есть... = 1, строка выше)
=> SignPara.rgpMsgCert = IntPtr.Zero; хотя лучше заполнять, чтобы был сертификат подписи...

Отредактировано пользователем 3 июля 2012 г. 2:24:17(UTC)  | Причина: Не указана

Техническую поддержку оказываем тут
Наша база знаний
Offline Андрей Писарев  
#8 Оставлено : 3 июля 2012 г. 2:11:25(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)  | Причина: Не указана

Техническую поддержку оказываем тут
Наша база знаний
Offline ikozlov  
#9 Оставлено : 3 июля 2012 г. 21:43:48(UTC)
ikozlov

Статус: Активный участник

Группы: Участники
Зарегистрирован: 10.05.2012(UTC)
Сообщений: 50

Выставил вышеуказанныне параметры и указал алгоритм хэширования Индекс которого "1.2.643.2.2.3" (Алгоритм цифровой подписи ГОСТ Р 34.10-2001). Увы, пока результат тот же.
Подскажите, пожалуйста, где можно почитать про структуру CRYPT_SIGN_MESSAGE_PARA. чтобы не задавать глупых вопросов.
Offline Андрей Писарев  
#10 Оставлено : 3 июля 2012 г. 22:55:57(UTC)
Андрей *

Статус: Сотрудник

Группы: Участники
Зарегистрирован: 26.07.2011(UTC)
Сообщений: 13,523
Мужчина
Российская Федерация

Сказал «Спасибо»: 555 раз
Поблагодарили: 2252 раз в 1757 постах
ikozlov написал:

Подскажите, пожалуйста, где можно почитать про структуру CRYPT_SIGN_MESSAGE_PARA. чтобы не задавать глупых вопросов.



http://msdn.microsoft.co...p/aa381468(v=vs.85).aspx


Отредактировано пользователем 3 июля 2012 г. 22:59:53(UTC)  | Причина: Не указана

Техническую поддержку оказываем тут
Наша база знаний
RSS Лента  Atom Лента
Пользователи, просматривающие эту тему
Guest (2)
2 Страницы12>
Быстрый переход  
Вы не можете создавать новые темы в этом форуме.
Вы не можете отвечать в этом форуме.
Вы не можете удалять Ваши сообщения в этом форуме.
Вы не можете редактировать Ваши сообщения в этом форуме.
Вы не можете создавать опросы в этом форуме.
Вы не можете голосовать в этом форуме.