<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
	<channel>
		<title><![CDATA[Форум Рутокен &mdash; Уточнения по сырой подписи и встраивание в XAdES-BES]]></title>
		<link>https://forum.rutoken.ru/topic/3615/</link>
		<atom:link href="https://forum.rutoken.ru/feed/rss/topic/3615" rel="self" type="application/rss+xml" />
		<description><![CDATA[Недавние сообщения в теме «Уточнения по сырой подписи и встраивание в XAdES-BES».]]></description>
		<lastBuildDate>Mon, 20 Jun 2022 13:50:39 +0000</lastBuildDate>
		<generator>PunBB</generator>
		<item>
			<title><![CDATA[Re: Уточнения по сырой подписи и встраивание в XAdES-BES]]></title>
			<link>https://forum.rutoken.ru/post/17655/#p17655</link>
			<description><![CDATA[<p>Добрый день!</p><div class="quotebox"><cite>msberyanov пишет:</cite><blockquote><p>plugin.rawSign по умолчанию создает подпись используя ГОСТ Р 34.10-2012 с длиной ключа 256 бит?</p></blockquote></div><p>Алгоритм подписи зависит от типа ключа, переданного в функцию. Тип ключа можно получить функцией getKeyInfo (<a href="https://plugin.api.rutoken.ru/CryptoPlugin.html#getKeyInfo">https://plugin.api.rutoken.ru/CryptoPlu … getKeyInfo</a>).</p><div class="quotebox"><cite>msberyanov пишет:</cite><blockquote><p>Пробовал и переворачивать строку + удалять двоеточия, и не переворачивать, и оставлять как есть, переводя в Base64 - не выходит.</p></blockquote></div><p>Пример выполнения XADES-подписи через Рутокен Плагин пока в разработке, но можете по шагам посмотреть, что нигде результаты хеширования и подписи не переворачиваются.</p><p>Исходные данные:<br /></p><div class="codebox"><pre><code>&lt;root xmlns=&quot;urn:envelope&quot;&gt;
  &lt;Data&gt;
    Hello, World!
  &lt;/Data&gt;
&lt;/root&gt;
                                    </code></pre></div><p>Данные на входе в rutoken.digest:<br /></p><div class="codebox"><pre><code>PHJvb3QgeG1sbnM9InVybjplbnZlbG9wZSI+CiAgPERhdGE+CiAgICBIZWxsbywgV29ybGQhCiAgPC9EYXRhPgo8L3Jvb3Q+</code></pre></div><p>rutoken.digest вызван с опциями: <br /></p><div class="codebox"><pre><code>{
    &quot;useHardwareHash&quot;: true,
    &quot;base64&quot;: true
}</code></pre></div><p>Данные на выходе rutoken.digest:<br /></p><div class="codebox"><pre><code>05:ed:d9:d5:76:0e:a7:98:63:52:d9:70:33:04:28:e7:cb:6a:cb:f4:a0:33:20:67:0a:cf:42:04:a4:e1:1a:97</code></pre></div><p>Данные на входе в rutoken.rawsign:<br /></p><div class="codebox"><pre><code>&lt;ds:SignedInfo xmlns=&quot;urn:envelope&quot; xmlns:ds=&quot;http://www.w3.org/2000/09/xmldsig#&quot;&gt;&lt;ds:CanonicalizationMethod Algorithm=&quot;http://www.w3.org/TR/2001/REC-xml-c14n-20010315&quot;&gt;&lt;/ds:CanonicalizationMethod&gt;&lt;ds:SignatureMethod Algorithm=&quot;urn:ietf:params:xml:ns:cpxmlsec:algorithms:gostr34102012-gostr34112012-256&quot;&gt;&lt;/ds:SignatureMethod&gt;&lt;ds:Reference&gt;&lt;ds:Transforms&gt;&lt;ds:Transform Algorithm=&quot;http://www.w3.org/2000/09/xmldsig#enveloped-signature&quot;&gt;&lt;/ds:Transform&gt;&lt;ds:Transform Algorithm=&quot;http://www.w3.org/TR/2001/REC-xml-c14n-20010315&quot;&gt;&lt;/ds:Transform&gt;&lt;/ds:Transforms&gt;&lt;ds:DigestMethod Algorithm=&quot;urn:ietf:params:xml:ns:cpxmlsec:algorithms:gostr34112012-256&quot;&gt;&lt;/ds:DigestMethod&gt;&lt;ds:DigestValue&gt;Be3Z1XYOp5hjUtlwMwQo58tqy/SgMyBnCs9CBKThGpc=&lt;/ds:DigestValue&gt;&lt;/ds:Reference&gt;&lt;ds:Reference Type=&quot;http://uri.etsi.org/01903#SignedProperties&quot; URI=&quot;#xades-id-9b37d5fe188d&quot;&gt;&lt;ds:DigestMethod Algorithm=&quot;urn:ietf:params:xml:ns:cpxmlsec:algorithms:gostr34112012-256&quot;&gt;&lt;/ds:DigestMethod&gt;&lt;ds:DigestValue&gt;e9GyhfY16ctX4DxXaRO4sh1tE2jGvF3E98GiCV1HfYs=&lt;/ds:DigestValue&gt;&lt;/ds:Reference&gt;&lt;/ds:SignedInfo&gt;</code></pre></div><p>rutoken.rawsign вызван с опциями:<br /></p><div class="codebox"><pre><code>{computeHash: true, useHardwareHash: true}</code></pre></div><p>Данные на выходе rutoken.rawSign:<br /></p><div class="codebox"><pre><code>ba:67:16:9f:9e:b4:7f:35:ee:86:53:82:50:e2:b0:cb:c8:e7:e0:9e:2f:15:53:eb:81:74:98:a5:26:e1:28:26:dc:10:58:60:cd:fc:b6:ed:31:85:10:f7:6f:60:a5:09:4d:63:b6:7b:30:7f:dd:9e:8c:d6:ba:8d:d6:df:76:e5</code></pre></div><p>Результат:<br /></p><div class="codebox"><pre><code>&lt;root xmlns=&quot;urn:envelope&quot;&gt;
  &lt;Data&gt;
    Hello, World!
  &lt;/Data&gt;
&lt;ds:Signature xmlns:ds=&quot;http://www.w3.org/2000/09/xmldsig#&quot; Id=&quot;id-9b37d5fe188d&quot;&gt;&lt;ds:SignedInfo&gt;&lt;ds:CanonicalizationMethod Algorithm=&quot;http://www.w3.org/TR/2001/REC-xml-c14n-20010315&quot;/&gt;&lt;ds:SignatureMethod Algorithm=&quot;urn:ietf:params:xml:ns:cpxmlsec:algorithms:gostr34102012-gostr34112012-256&quot;/&gt;&lt;ds:Reference&gt;&lt;ds:Transforms&gt;&lt;ds:Transform Algorithm=&quot;http://www.w3.org/2000/09/xmldsig#enveloped-signature&quot;/&gt;&lt;ds:Transform Algorithm=&quot;http://www.w3.org/TR/2001/REC-xml-c14n-20010315&quot;/&gt;&lt;/ds:Transforms&gt;&lt;ds:DigestMethod Algorithm=&quot;urn:ietf:params:xml:ns:cpxmlsec:algorithms:gostr34112012-256&quot;/&gt;&lt;ds:DigestValue&gt;Be3Z1XYOp5hjUtlwMwQo58tqy/SgMyBnCs9CBKThGpc=&lt;/ds:DigestValue&gt;&lt;/ds:Reference&gt;&lt;ds:Reference URI=&quot;#xades-id-9b37d5fe188d&quot; Type=&quot;http://uri.etsi.org/01903#SignedProperties&quot;&gt;&lt;ds:DigestMethod Algorithm=&quot;urn:ietf:params:xml:ns:cpxmlsec:algorithms:gostr34112012-256&quot;/&gt;&lt;ds:DigestValue&gt;e9GyhfY16ctX4DxXaRO4sh1tE2jGvF3E98GiCV1HfYs=&lt;/ds:DigestValue&gt;&lt;/ds:Reference&gt;&lt;/ds:SignedInfo&gt;&lt;ds:SignatureValue&gt;umcWn560fzXuhlOCUOKwy8jn4J4vFVPrgXSYpSbhKCbcEFhgzfy27TGFEPdvYKUJTWO2ezB/3Z6M1rqN1t925Q==&lt;/ds:SignatureValue&gt;&lt;ds:KeyInfo&gt;&lt;ds:X509Data&gt;&lt;ds:X509Certificate&gt;MIIE6TCCBJagAwIBAgITfAAEm2JlEsADRy71qgABAASbYjAKBggqhQMHAQEDAjCCAQoxGDAWBgUqhQNkARINMTIzNDU2Nzg5MDEyMzEaMBgGCCqFAwOBAwEBEgwwMDEyMzQ1Njc4OTAxLzAtBgNVBAkMJtGD0LsuINCh0YPRidGR0LLRgdC60LjQuSDQstCw0Lsg0LQuIDE4MQswCQYDVQQGEwJSVTEZMBcGA1UECAwQ0LMuINCc0L7RgdC60LLQsDEVMBMGA1UEBwwM0JzQvtGB0LrQstCwMSUwIwYDVQQKDBzQntCe0J4gItCa0KDQmNCf0KLQni3Qn9Cg0J4iMTswOQYDVQQDDDLQotC10YHRgtC+0LLRi9C5INCj0KYg0J7QntCeICLQmtCg0JjQn9Ci0J4t0J/QoNCeIjAeFw0yMjAyMTYwOTIwMzdaFw0yMjA1MTYwOTMwMzdaMDgxEjAQBgNVBAMMCXhhZGVzVGVzdDELMAkGA1UEBhMCUlUxFTATBgNVBAgMDNCc0L7RgdC60LLQsDBmMB8GCCqFAwcBAQEBMBMGByqFAwICIwEGCCqFAwcBAQICA0MABEAdOodmhzaBzwLgEHrPHzwcXtIOLJGZCUdSKtKffF4hGoPGifhKeJA0RPAOyVxbDOXFjuxpRsSYKWfsPLLkMYqJo4ICnDCCApgwCwYDVR0PBAQDAgbAMBMGA1UdJQQMMAoGCCsGAQUFBwMEMBMGA1UdIAQMMAowCAYGKoUDZHEBMC8GBSqFA2RvBCYMJNCh0JrQl9CYICLQoNGD0YLQvtC60LXQvSDQrdCm0J8gMi4wIjAdBgNVHQ4EFgQUWdqYgFAE9Z5lm3IAeiGcdWrFKwIwHwYDVR0jBBgwFoAUm4Ve+4HcTVkHUWPPvt/aLH/JRDwwggEPBgNVHR8EggEGMIIBAjCB/6CB/KCB+YaBtWh0dHA6Ly90ZXN0Z29zdDIwMTIuY3J5cHRvcHJvLnJ1L0NlcnRFbnJvbGwvITA0MjIhMDQzNSEwNDQxITA0NDIhMDQzZSEwNDMyITA0NGIhMDQzOSUyMCEwNDIzITA0MjYlMjAhMDQxZSEwNDFlITA0MWUlMjAhMDAyMiEwNDFhITA0MjAhMDQxOCEwNDFmITA0MjIhMDQxZS0hMDQxZiEwNDIwITA0MWUhMDAyMigxKS5jcmyGP2h0dHA6Ly90ZXN0Z29zdDIwMTIuY3J5cHRvcHJvLnJ1L0NlcnRFbnJvbGwvdGVzdGdvc3QyMDEyKDEpLmNybDCB2gYIKwYBBQUHAQEEgc0wgcowRAYIKwYBBQUHMAKGOGh0dHA6Ly90ZXN0Z29zdDIwMTIuY3J5cHRvcHJvLnJ1L0NlcnRFbnJvbGwvcm9vdDIwMTguY3J0MD8GCCsGAQUFBzABhjNodHRwOi8vdGVzdGdvc3QyMDEyLmNyeXB0b3Byby5ydS9vY3NwMjAxMmcvb2NzcC5zcmYwQQYIKwYBBQUHMAGGNWh0dHA6Ly90ZXN0Z29zdDIwMTIuY3J5cHRvcHJvLnJ1L29jc3AyMDEyZ3N0L29jc3Auc3JmMAoGCCqFAwcBAQMCA0EALqAL7TqnSkiiiBO0/DiTGxcE2rL/nYBDde14eqqr2mykbGKC9ZIyGt4IIaBvNNHOOxqrf+kSfDC371/KWeWr3Q==&lt;/ds:X509Certificate&gt;&lt;/ds:X509Data&gt;&lt;/ds:KeyInfo&gt;&lt;ds:Object&gt;&lt;xades:QualifyingProperties xmlns:xades=&quot;http://uri.etsi.org/01903/v1.3.2#&quot; Target=&quot;#id-9b37d5fe188d&quot;&gt;&lt;xades:SignedProperties Id=&quot;xades-id-9b37d5fe188d&quot;&gt;&lt;xades:SignedSignatureProperties&gt;&lt;xades:SigningTime&gt;2022-06-20T12:52:26.146Z&lt;/xades:SigningTime&gt;&lt;xades:SigningCertificateV2&gt;&lt;xades:Cert&gt;&lt;xades:CertDigest&gt;&lt;ds:DigestMethod Algorithm=&quot;urn:ietf:params:xml:ns:cpxmlsec:algorithms:gostr34112012-256&quot;/&gt;&lt;ds:DigestValue&gt;i4/zyjkuvMf9w42okOlXnLg4gYPGZoDVYCO7Edjcw3o=&lt;/ds:DigestValue&gt;&lt;/xades:CertDigest&gt;&lt;xades:IssuerSerialV2&gt;MIIBKzCCARKkggEOMIIBCjEYMBYGBSqFA2QBEg0xMjM0NTY3ODkwMTIzMRowGAYIKoUDA4EDAQESDDAwMTIzNDU2Nzg5MDEvMC0GA1UECQwm0YPQuy4g0KHRg9GJ0ZHQstGB0LrQuNC5INCy0LDQuyDQtC4gMTgxCzAJBgNVBAYTAlJVMRkwFwYDVQQIDBDQsy4g0JzQvtGB0LrQstCwMRUwEwYDVQQHDAzQnNC+0YHQutCy0LAxJTAjBgNVBAoMHNCe0J7QniAi0JrQoNCY0J/QotCeLdCf0KDQniIxOzA5BgNVBAMMMtCi0LXRgdGC0L7QstGL0Lkg0KPQpiDQntCe0J4gItCa0KDQmNCf0KLQni3Qn9Cg0J4iAhN8AASbYmUSwANHLvWqAAEABJti&lt;/xades:IssuerSerialV2&gt;&lt;/xades:Cert&gt;&lt;/xades:SigningCertificateV2&gt;&lt;/xades:SignedSignatureProperties&gt;&lt;/xades:SignedProperties&gt;&lt;/xades:QualifyingProperties&gt;&lt;/ds:Object&gt;&lt;/ds:Signature&gt;&lt;/root&gt;</code></pre></div>]]></description>
			<author><![CDATA[null@example.com (Евгений Мироненко)]]></author>
			<pubDate>Mon, 20 Jun 2022 13:50:39 +0000</pubDate>
			<guid>https://forum.rutoken.ru/post/17655/#p17655</guid>
		</item>
		<item>
			<title><![CDATA[Уточнения по сырой подписи и встраивание в XAdES-BES]]></title>
			<link>https://forum.rutoken.ru/post/17653/#p17653</link>
			<description><![CDATA[<p>Всем привет! </p><p>Стоит задача собрать XAdES-BES контейнер. Используя утилиту КриптоПро у меня получилось это сделать, именно формируя контейнер у себя на сервере, канонизируя фрагмент SignedInfo, а на фронте - используя класс RawSignature и подписывая данный фрагмент. Учитывая все особенности формирования подписи той системой - нужно было переворачивать HEX строку последовательно по 2 байтам, а затем переводить в Base64 формат. Подскажите, как Рутокен Плагин (Рутокен ЭЦП 2.0) формирует внутри себя такую подпись? Проверяю XML контейнер средствами КриптоПро, выдает ошибку. Пробовал и переворачивать строку + удалять двоеточия, и не переворачивать, и оставлять как есть, переводя в Base64 - не выходит.</p><div class="codebox"><pre><code>const key = await plugin.getKeyByCertificate(deviceId, certificateId);

const hash = await plugin.digest(deviceId, plugin.HASH_TYPE_GOST3411_12_256, unencryptedMessage, {base64: true});

try {
    signature = await plugin.rawSign(deviceId, key, hash, options);
  } catch (e) {
    console.log(e);
  }

signature = signature.replaceAll(&quot;:&quot;, &quot;&quot;).toUpperCase();

return convertHexToBase64(reverseStr(signature));</code></pre></div><p>plugin.rawSign по умолчанию создает подпись используя ГОСТ Р 34.10-2012 с длиной ключа 256 бит? Где уточнить в коде при подписании?</p>]]></description>
			<author><![CDATA[null@example.com (msberyanov)]]></author>
			<pubDate>Mon, 20 Jun 2022 10:44:42 +0000</pubDate>
			<guid>https://forum.rutoken.ru/post/17653/#p17653</guid>
		</item>
	</channel>
</rss>
