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

Уведомление

Icon
Error

9 Страницы«<23456>»
Опции
К последнему сообщению К первому непрочитанному
Offline kkklll  
#31 Оставлено : 14 мая 2015 г. 19:10:50(UTC)
kkklll

Статус: Новичок

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

Сказал(а) «Спасибо»: 1 раз
Поблагодарили: 2 раз в 2 постах
чтобы сделать хэш по ГОСТу и запросить по нему таймстэм воспользовался библиотекой от BouncyCastle.

для хэша поправил Microsoft.Xades.HttpTsaClient.ComputeHashValueOfElementList:
Код:

        public byte[] ComputeHashValueOfElementList(XmlElement signatureXmlElement, ArrayList elementXpaths, ref ArrayList elementIdValues)
        {
            XmlDocument xmlDocument;
            XmlNamespaceManager xmlNamespaceManager;
            XmlNodeList searchXmlNodeList;
            XmlElement composedXmlElement;
            XmlDsigC14NTransform xmlDsigC14NTransform;
            Stream canonicalizedStream;
            SHA1 sha1Managed;
            byte[] retVal;

            xmlDocument = signatureXmlElement.OwnerDocument;
            composedXmlElement = xmlDocument.CreateElement("ComposedElement", SignedXml.XmlDsigNamespaceUrl);
            xmlNamespaceManager = new XmlNamespaceManager(xmlDocument.NameTable);
            xmlNamespaceManager.AddNamespace("ds", SignedXml.XmlDsigNamespaceUrl);
            xmlNamespaceManager.AddNamespace("xsd", XadesSignedXml.XadesNamespaceUri);
            foreach (string elementXpath in elementXpaths)
            {
                searchXmlNodeList = signatureXmlElement.SelectNodes(elementXpath, xmlNamespaceManager);
                if (searchXmlNodeList.Count == 0)
                {
                    throw new CryptographicException("Element " + elementXpath + " not found while calculating hash");
                }
                foreach (XmlNode xmlNode in searchXmlNodeList)
                {
                    if (((XmlElement)xmlNode).HasAttribute("Id"))
                    {
                        elementIdValues.Add(((XmlElement)xmlNode).Attributes["Id"].Value);
                        composedXmlElement.AppendChild(xmlNode);
                    }
                    else
                    {
                        throw new CryptographicException("Id attribute missing on " + xmlNode.LocalName + " element");
                    }
                }
            }
            xmlDsigC14NTransform = new XmlDsigC14NTransform(false);
            xmlDsigC14NTransform.LoadInput(composedXmlElement.ChildNodes);
            canonicalizedStream = (Stream)xmlDsigC14NTransform.GetOutput(typeof(Stream));

            [h]const string signatureMethod = "http://www.w3.org/2001/04/xmldsig-more#gostr34102001-gostr3411";
            var signatureDescription = CryptoConfig.CreateFromName(signatureMethod) as SignatureDescription;
            if (signatureDescription == null)
                throw new CryptographicException("Cryptography_Xml_SignatureDescriptionNotCreated");
            var digest = signatureDescription.CreateDigest();
            retVal = digest.ComputeHash(canonicalizedStream);[/h]

            /*sha1Managed = new SHA1Managed();
            retVal = sha1Managed.ComputeHash(canonicalizedStream);*/

            canonicalizedStream.Close();

            return retVal;
        }


сам вызов TSA:
Код:

var reqGen = new TimeStampRequestGenerator();
reqGen.SetCertReq(true);
var request = reqGen.Generate(TspAlgorithms.Gost3411, signatureValueHash, BigInteger.ValueOf(100));
var reqData = request.GetEncoded();

var httpReq = (HttpWebRequest)WebRequest.Create("http://testca.cryptopro.ru/tsp/tsp.srf"); //http://www.cryptopro.ru/tsp/tsp.srf
httpReq.Method = "POST";
httpReq.ContentType = "application/timestamp-query";
httpReq.ContentLength = reqData.Length;

                // Write the request content
                var reqStream = httpReq.GetRequestStream();
                reqStream.Write(reqData, 0, reqData.Length);
                reqStream.Close();

                var httpResp = (HttpWebResponse)httpReq.GetResponse();

                // Read the response
                Stream respStream = new BufferedStream(httpResp.GetResponseStream());
                var response = new TimeStampResponse(respStream);
                respStream.Close();


вставка этого в результат с небольшой почти как раньше (если правильно понимаю что брать из результата)
Код:

                    var signatureTimeStamp = new TimeStamp("SignatureTimeStamp")
                    {
                        EncapsulatedTimeStamp =
                        {
                            Id = "SignatureTimeStampId",
                            PkiData = response.GetEncoded() // httpTSAClient.TsaTimeStamp
                        }
                    };
                    // this.signatureTimeStampIdTextBox.Text;
                    var hashDataInfo = new HashDataInfo { UriAttribute = "#" + elementIdValues[0] };
                    signatureTimeStamp.HashDataInfoCollection.Add(hashDataInfo);
                    var unsignedProperties = signedXml.UnsignedProperties;
                    unsignedProperties.UnsignedSignatureProperties.SignatureTimeStampCollection.Add(signatureTimeStamp);
                    signedXml.UnsignedProperties = unsignedProperties;



ошибка на стороне гис гмп поменялась, но суть пока та же - подпись не верна.
есть ли у кого-нибудь готовая библиотека? лс )

Отредактировано пользователем 14 мая 2015 г. 19:58:20(UTC)  | Причина: Не указана

Offline strelok671  
#32 Оставлено : 18 мая 2015 г. 15:05:36(UTC)
strelok671

Статус: Участник

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

Сказал(а) «Спасибо»: 1 раз
Поблагодарили: 2 раз в 2 постах
Кажется получилось.
Что делал:
1. скачал по ссылке с гитхаба в начале темы (4 сообщение) источники пространства имен Microsoft.Xades от их французского подразделения;
2. изменил в модуле XadesSignedXml.cs процедуру AddXadesObject следующим образом:
Код:

		public void AddXadesObject(XadesObject xadesObject)
		{
			Reference reference;
			DataObject dataObject;
			XmlElement bufferXmlElement;

			if (this.SignatureStandard != KnownSignatureStandard.Xades)
			{
				dataObject = new DataObject();
				dataObject.Id = xadesObject.Id;
				dataObject.Data = xadesObject.GetXml().ChildNodes;
				this.AddObject(dataObject); //Add the XAdES object

				reference = new Reference();
				signedPropertiesIdBuffer = xadesObject.QualifyingProperties.SignedProperties.Id;
				reference.Uri = "#" + signedPropertiesIdBuffer;
				reference.Type = SignedPropertiesType;

                // ================================================================================
                // Inserted for GOST Sign Standard
                reference.AddTransform(new XmlDsigEnvelopedSignatureTransform());
                XmlDsigExcC14NTransform env = new XmlDsigExcC14NTransform();
                reference.AddTransform(env); // +
#pragma warning disable 612
                reference.DigestMethod = CryptoPro.Sharpei.Xml.CPSignedXml.XmlDsigGost3411UrlObsolete;
#pragma warning restore 612
                // ================================================================================

				this.AddReference(reference); //Add the XAdES object reference

				this.cachedXadesObjectDocument = new XmlDocument();
				bufferXmlElement = xadesObject.GetXml();

                // Add "ds" namespace prefix to all XmlDsig nodes in the XAdES object
                SetPrefix("ds", bufferXmlElement);

				this.cachedXadesObjectDocument.PreserveWhitespace = true;
				this.cachedXadesObjectDocument.LoadXml(bufferXmlElement.OuterXml); //Cache to XAdES object for later use

				this.signatureStandard = KnownSignatureStandard.Xades;
			}
			else
			{
				throw new CryptographicException("Can't add XAdES object, the signature already contains a XAdES object");
			}
		}

Не забываем добавить ссылку на библиотеку CryptoPro.Sharpei.
3. скомпилил библиотеку и подсоединил пространство Microsoft.Xades к проекту;
4. далее используем стандартным образом класс XadesSignedXml.
thanks 1 пользователь поблагодарил strelok671 за этот пост.
kkklll оставлено 19.05.2015(UTC)
Offline kkklll  
#33 Оставлено : 18 мая 2015 г. 17:44:56(UTC)
kkklll

Статус: Новичок

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

Сказал(а) «Спасибо»: 1 раз
Поблагодарили: 2 раз в 2 постах
Автор: strelok671 Перейти к цитате
Кажется получилось.

а таймстемп тоже правили на вычисление по ГОСТ?

что-то использовали в качестве библиотеки или полностью своё?


делали ли вот эти правки (т.к. в контрольных примерах от ГИС ГМП такие версии):
XadesSignedXml.cs

Код:
public const string XadesNamespaceUri = "http://uri.etsi.org/01903/v1.1.1#"; // было "http://uri.etsi.org/01903/v1.3.2#";
public const string SignedPropertiesType = "http://uri.etsi.org/01903/v1.1.1#SignedProperties";  // было "http://uri.etsi.org/01903/v1.3.2#SignedProperties";

Отредактировано пользователем 18 мая 2015 г. 17:49:49(UTC)  | Причина: Не указана

Offline strelok671  
#34 Оставлено : 19 мая 2015 г. 8:10:39(UTC)
strelok671

Статус: Участник

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

Сказал(а) «Спасибо»: 1 раз
Поблагодарили: 2 раз в 2 постах
Автор: kkklll Перейти к цитате
Автор: strelok671 Перейти к цитате
Кажется получилось.

а таймстемп тоже правили на вычисление по ГОСТ?

что-то использовали в качестве библиотеки или полностью своё?


делали ли вот эти правки (т.к. в контрольных примерах от ГИС ГМП такие версии):
XadesSignedXml.cs

Код:
public const string XadesNamespaceUri = "http://uri.etsi.org/01903/v1.1.1#"; // было "http://uri.etsi.org/01903/v1.3.2#";
public const string SignedPropertiesType = "http://uri.etsi.org/01903/v1.1.1#SignedProperties";  // было "http://uri.etsi.org/01903/v1.3.2#SignedProperties";


Штамп времени выкусывается из ответа сервера, тут менять нечего. ASN парсер переделал под себя, но французский тоже работает.
Еще чуть подправил процедуру получения ответа от сервера времени. Нужно учитывать, что ответ может придти не сразу. Поэтому читать входящий поток нужно пока не получите нужное количество символов, иначе asn парсер может давать ошибку.

Используется библиотека CryptoPro.NET.

Названия пространства имен не менял.
Offline kkklll  
#35 Оставлено : 19 мая 2015 г. 9:17:56(UTC)
kkklll

Статус: Новичок

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

Сказал(а) «Спасибо»: 1 раз
Поблагодарили: 2 раз в 2 постах
strelok671 Offline , спасибо за подсказку сообщением про AddXadesObject. У меня тоже подпись заработала.
Пространство имён изменено на "v1.1.1#" (как поменял несколько дней назад, так и не возвращал), генерация хэша для TSA идёт по GOST.

Шарпея я не подключал, просто забил константу:
Код:

reference.DigestMethod = "http://www.w3.org/2001/04/xmldsig-more#gostr3411"; //CryptoPro.Sharpei.Xml.CPSignedXml.XmlDsigGost3411UrlObsolete;


остаётся последний вопрос: какой TSA использовать в боевом контуре СМЭВ'а?
если у кого-то появится информация, просьба написать.

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

Offline Blaksa  
#36 Оставлено : 23 мая 2015 г. 11:06:16(UTC)
Blaksa

Статус: Новичок

Группы: Участники
Зарегистрирован: 23.05.2015(UTC)
Сообщений: 2
Откуда: Moscow

Поблагодарили: 1 раз в 1 постах
Автор: kkklll Перейти к цитате
Автор: strelok671 Перейти к цитате
Кажется получилось.

а таймстемп тоже правили на вычисление по ГОСТ?
что-то использовали в качестве библиотеки или полностью своё?


Что касается TimeStamp по госту, все ведь определяется алгоритмом хэша передоваемом в запросе.
Я поправил функцию формирования запроса. длина хэша 20 - SHA1, 32 - ГОСТ

Код:

private byte[] BuildTsaRequest(byte[] hashToTimestamp)
{
  int offset = 0;
  byte[] requestTemplate;
	byte[] requestGOST3411 =              // gost
	{
		0x30, 0x34,												  //Request SEQUENCE (length: 52)
		0x02, 0x01, 0x01,									  //Version INTEGER (length: 1) value: 1
		0x30, 0x2c,												  //MessageImprint SEQUENCE (length: 44)
		0x30, 0x08,												  //AlgorithmOID SEQUENCE (length: 7)
		0x06, 0x06,												  //OID (length: 6)
    0x2a, 0x85, 0x03, 0x02, 0x02, 0x09, //szOID_CP_GOST_R3411 1.2.643.2.2.9
		0x04, 0x20,												  //Hash OCTET STRING (length: 32)
		0x00, 0x00, 0x00, 0x00, 0x00,			  //Placeholders for hash
		0x00, 0x00, 0x00, 0x00, 0x00,
		0x00, 0x00, 0x00, 0x00, 0x00,
		0x00, 0x00, 0x00, 0x00, 0x00,
		0x00, 0x00, 0x00, 0x00, 0x00,
		0x00, 0x00, 0x00, 0x00, 0x00,
		0x00, 0x00, 
    0x01, 0x01,	0xff										//RequestCertificate BOOLEAN (length: 1) value: true
	};
  byte[] requestSHA1 =
	{
		0x30, 0x27,												  //Request SEQUENCE (length: 39)
		0x02, 0x01, 0x01,									  //Version INTEGER (length: 1) value: 1
		0x30, 0x1f,												  //MessageImprint SEQUENCE (length: 31)
		0x30, 0x07,												  //AlgorithmOID SEQUENCE (length: 7)
		0x06, 0x05,												  //OID (length: 5)
		0x2b, 0x0e, 0x03, 0x02, 0x1a,			  //OIDSHA1 value: 1 3 14 3 2 26 -> 1*40+3=2B 14=0E 3=03 2=02 26=1A
		0x04, 0x14,												  //Hash OCTET STRING (length: 20)
		0x00, 0x00, 0x00, 0x00, 0x00,			  //Placeholders for hash
		0x00, 0x00, 0x00, 0x00, 0x00,
		0x00, 0x00, 0x00, 0x00, 0x00,
		0x00, 0x00, 0x00, 0x00, 0x00,
		0x01, 0x01,	0xff										//RequestCertificate BOOLEAN (length: 1) value: true
	};
  if (hashToTimestamp.Length == 20) 
  {
    requestTemplate = requestSHA1;
    offset = 18;
  }
  else if (hashToTimestamp.Length == 32) 
  {
    requestTemplate = requestGOST3411;
    offset = 19;
  } 
  else
  {
    throw new Exception("Illegal hash length should be 20 or 32 bytes long (" + hashToTimestamp.Length + ")");
  }

	for (int byteCounter = 0; byteCounter < hashToTimestamp.Length; byteCounter++)
	{
		requestTemplate[offset + byteCounter] = hashToTimestamp[byteCounter];
	}

	if (this.requestTsaCertificate)
	{
    requestTemplate[requestTemplate.GetUpperBound(0)] = 0xff;
	}
	else
	{
    requestTemplate[requestTemplate.GetUpperBound(0)] = 0x00;
	}
	return requestTemplate;
}
thanks 1 пользователь поблагодарил Blaksa за этот пост.
slavw оставлено 02.07.2015(UTC)
Offline Андрей Писарев  
#37 Оставлено : 23 мая 2015 г. 12:00:49(UTC)
Андрей *

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

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

Сказал «Спасибо»: 500 раз
Поблагодарили: 2043 раз в 1584 постах
Blaksa,
еще есть ГОСТ Р 34.11-2012, у хешей и OID-ы другие и размеры 256\512 бит.
Техническую поддержку оказываем тут
Наша база знаний
Offline Blaksa  
#38 Оставлено : 23 мая 2015 г. 15:55:51(UTC)
Blaksa

Статус: Новичок

Группы: Участники
Зарегистрирован: 23.05.2015(UTC)
Сообщений: 2
Откуда: Moscow

Поблагодарили: 1 раз в 1 постах
Fylhtq, т.е. Андрей, во первых привет.
Кто бы спрорил. А путь к светлому будущему народу указали? Правильно Указали.
Далее просто техника. Лишний параметр и т.д.
Ищкшылф aka Boris@Serezhkin.com
P.S. На портрет взгляни...

P.P.S кстати 256 бит как раз 32 байта будетDrool

Отредактировано пользователем 23 мая 2015 г. 16:09:16(UTC)  | Причина: Не указана

Offline Андрей Писарев  
#39 Оставлено : 23 мая 2015 г. 16:30:24(UTC)
Андрей *

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

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

Сказал «Спасибо»: 500 раз
Поблагодарили: 2043 раз в 1584 постах
Автор: Blaksa Перейти к цитате
Fylhtq, т.е. Андрей, во первых привет.
Кто бы спрорил. А путь к светлому будущему народу указали? Правильно Указали.
Далее просто техника. Лишний параметр и т.д.
Ищкшылф aka Boris@Serezhkin.com
P.S. На портрет взгляни...

P.P.S кстати 256 бит как раз 32 байта будетDrool


Привет.
256 бит, 32 байта... но OID-ы разные, как и требуемые версии СКЗИ для реализации.
Техническую поддержку оказываем тут
Наша база знаний
Offline Boris@Serezhkin.com  
#40 Оставлено : 25 мая 2015 г. 15:44:11(UTC)
Boris@Serezhkin.com

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

Группы: Участники
Зарегистрирован: 26.08.2010(UTC)
Сообщений: 259
Откуда: Moscow

Сказал(а) «Спасибо»: 4 раз
Поблагодарили: 11 раз в 10 постах
Голова пухнет, Подскажите что не так
ГИСГМП 1,16,1 возвращает SMEV-100003
Свм запрос прилогаю.
Вложение(я):
Request.xml (15kb) загружен 31 раз(а).

У Вас нет прав для просмотра или загрузки вложений. Попробуйте зарегистрироваться.
RSS Лента  Atom Лента
Пользователи, просматривающие эту тему
9 Страницы«<23456>»
Быстрый переход  
Вы не можете создавать новые темы в этом форуме.
Вы не можете отвечать в этом форуме.
Вы не можете удалять Ваши сообщения в этом форуме.
Вы не можете редактировать Ваши сообщения в этом форуме.
Вы не можете создавать опросы в этом форуме.
Вы не можете голосовать в этом форуме.