(2022-06-20 14:12:23 отредактировано msberyanov)

Уточнения по сырой подписи и встраивание в XAdES-BES

Всем привет!

Стоит задача собрать XAdES-BES контейнер. Используя утилиту КриптоПро у меня получилось это сделать, именно формируя контейнер у себя на сервере, канонизируя фрагмент SignedInfo, а на фронте - используя класс RawSignature и подписывая данный фрагмент. Учитывая все особенности формирования подписи той системой - нужно было переворачивать HEX строку последовательно по 2 байтам, а затем переводить в Base64 формат. Подскажите, как Рутокен Плагин (Рутокен ЭЦП 2.0) формирует внутри себя такую подпись? Проверяю XML контейнер средствами КриптоПро, выдает ошибку. Пробовал и переворачивать строку + удалять двоеточия, и не переворачивать, и оставлять как есть, переводя в Base64 - не выходит.

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(":", "").toUpperCase();

return convertHexToBase64(reverseStr(signature));

plugin.rawSign по умолчанию создает подпись используя ГОСТ Р 34.10-2012 с длиной ключа 256 бит? Где уточнить в коде при подписании?

(2022-06-20 17:13:42 отредактировано Евгений Мироненко)

Re: Уточнения по сырой подписи и встраивание в XAdES-BES

Добрый день!

msberyanov пишет:

plugin.rawSign по умолчанию создает подпись используя ГОСТ Р 34.10-2012 с длиной ключа 256 бит?

Алгоритм подписи зависит от типа ключа, переданного в функцию. Тип ключа можно получить функцией getKeyInfo (https://plugin.api.rutoken.ru/CryptoPlu … getKeyInfo).

msberyanov пишет:

Пробовал и переворачивать строку + удалять двоеточия, и не переворачивать, и оставлять как есть, переводя в Base64 - не выходит.

Пример выполнения XADES-подписи через Рутокен Плагин пока в разработке, но можете по шагам посмотреть, что нигде результаты хеширования и подписи не переворачиваются.

Исходные данные:

<root xmlns="urn:envelope">
  <Data>
    Hello, World!
  </Data>
</root>
                                    

Данные на входе в rutoken.digest:

PHJvb3QgeG1sbnM9InVybjplbnZlbG9wZSI+CiAgPERhdGE+CiAgICBIZWxsbywgV29ybGQhCiAgPC9EYXRhPgo8L3Jvb3Q+

rutoken.digest вызван с опциями:

{
    "useHardwareHash": true,
    "base64": true
}

Данные на выходе rutoken.digest:

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

Данные на входе в rutoken.rawsign:

<ds:SignedInfo xmlns="urn:envelope" xmlns:ds="http://www.w3.org/2000/09/xmldsig#"><ds:CanonicalizationMethod Algorithm="http://www.w3.org/TR/2001/REC-xml-c14n-20010315"></ds:CanonicalizationMethod><ds:SignatureMethod Algorithm="urn:ietf:params:xml:ns:cpxmlsec:algorithms:gostr34102012-gostr34112012-256"></ds:SignatureMethod><ds:Reference><ds:Transforms><ds:Transform Algorithm="http://www.w3.org/2000/09/xmldsig#enveloped-signature"></ds:Transform><ds:Transform Algorithm="http://www.w3.org/TR/2001/REC-xml-c14n-20010315"></ds:Transform></ds:Transforms><ds:DigestMethod Algorithm="urn:ietf:params:xml:ns:cpxmlsec:algorithms:gostr34112012-256"></ds:DigestMethod><ds:DigestValue>Be3Z1XYOp5hjUtlwMwQo58tqy/SgMyBnCs9CBKThGpc=</ds:DigestValue></ds:Reference><ds:Reference Type="http://uri.etsi.org/01903#SignedProperties" URI="#xades-id-9b37d5fe188d"><ds:DigestMethod Algorithm="urn:ietf:params:xml:ns:cpxmlsec:algorithms:gostr34112012-256"></ds:DigestMethod><ds:DigestValue>e9GyhfY16ctX4DxXaRO4sh1tE2jGvF3E98GiCV1HfYs=</ds:DigestValue></ds:Reference></ds:SignedInfo>

rutoken.rawsign вызван с опциями:

{computeHash: true, useHardwareHash: true}

Данные на выходе rutoken.rawSign:

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

Результат:

<root xmlns="urn:envelope">
  <Data>
    Hello, World!
  </Data>
<ds:Signature xmlns:ds="http://www.w3.org/2000/09/xmldsig#" Id="id-9b37d5fe188d"><ds:SignedInfo><ds:CanonicalizationMethod Algorithm="http://www.w3.org/TR/2001/REC-xml-c14n-20010315"/><ds:SignatureMethod Algorithm="urn:ietf:params:xml:ns:cpxmlsec:algorithms:gostr34102012-gostr34112012-256"/><ds:Reference><ds:Transforms><ds:Transform Algorithm="http://www.w3.org/2000/09/xmldsig#enveloped-signature"/><ds:Transform Algorithm="http://www.w3.org/TR/2001/REC-xml-c14n-20010315"/></ds:Transforms><ds:DigestMethod Algorithm="urn:ietf:params:xml:ns:cpxmlsec:algorithms:gostr34112012-256"/><ds:DigestValue>Be3Z1XYOp5hjUtlwMwQo58tqy/SgMyBnCs9CBKThGpc=</ds:DigestValue></ds:Reference><ds:Reference URI="#xades-id-9b37d5fe188d" Type="http://uri.etsi.org/01903#SignedProperties"><ds:DigestMethod Algorithm="urn:ietf:params:xml:ns:cpxmlsec:algorithms:gostr34112012-256"/><ds:DigestValue>e9GyhfY16ctX4DxXaRO4sh1tE2jGvF3E98GiCV1HfYs=</ds:DigestValue></ds:Reference></ds:SignedInfo><ds:SignatureValue>umcWn560fzXuhlOCUOKwy8jn4J4vFVPrgXSYpSbhKCbcEFhgzfy27TGFEPdvYKUJTWO2ezB/3Z6M1rqN1t925Q==</ds:SignatureValue><ds:KeyInfo><ds:X509Data><ds:X509Certificate>MIIE6TCCBJagAwIBAgITfAAEm2JlEsADRy71qgABAASbYjAKBggqhQMHAQEDAjCCAQoxGDAWBgUqhQNkARINMTIzNDU2Nzg5MDEyMzEaMBgGCCqFAwOBAwEBEgwwMDEyMzQ1Njc4OTAxLzAtBgNVBAkMJtGD0LsuINCh0YPRidGR0LLRgdC60LjQuSDQstCw0Lsg0LQuIDE4MQswCQYDVQQGEwJSVTEZMBcGA1UECAwQ0LMuINCc0L7RgdC60LLQsDEVMBMGA1UEBwwM0JzQvtGB0LrQstCwMSUwIwYDVQQKDBzQntCe0J4gItCa0KDQmNCf0KLQni3Qn9Cg0J4iMTswOQYDVQQDDDLQotC10YHRgtC+0LLRi9C5INCj0KYg0J7QntCeICLQmtCg0JjQn9Ci0J4t0J/QoNCeIjAeFw0yMjAyMTYwOTIwMzdaFw0yMjA1MTYwOTMwMzdaMDgxEjAQBgNVBAMMCXhhZGVzVGVzdDELMAkGA1UEBhMCUlUxFTATBgNVBAgMDNCc0L7RgdC60LLQsDBmMB8GCCqFAwcBAQEBMBMGByqFAwICIwEGCCqFAwcBAQICA0MABEAdOodmhzaBzwLgEHrPHzwcXtIOLJGZCUdSKtKffF4hGoPGifhKeJA0RPAOyVxbDOXFjuxpRsSYKWfsPLLkMYqJo4ICnDCCApgwCwYDVR0PBAQDAgbAMBMGA1UdJQQMMAoGCCsGAQUFBwMEMBMGA1UdIAQMMAowCAYGKoUDZHEBMC8GBSqFA2RvBCYMJNCh0JrQl9CYICLQoNGD0YLQvtC60LXQvSDQrdCm0J8gMi4wIjAdBgNVHQ4EFgQUWdqYgFAE9Z5lm3IAeiGcdWrFKwIwHwYDVR0jBBgwFoAUm4Ve+4HcTVkHUWPPvt/aLH/JRDwwggEPBgNVHR8EggEGMIIBAjCB/6CB/KCB+YaBtWh0dHA6Ly90ZXN0Z29zdDIwMTIuY3J5cHRvcHJvLnJ1L0NlcnRFbnJvbGwvITA0MjIhMDQzNSEwNDQxITA0NDIhMDQzZSEwNDMyITA0NGIhMDQzOSUyMCEwNDIzITA0MjYlMjAhMDQxZSEwNDFlITA0MWUlMjAhMDAyMiEwNDFhITA0MjAhMDQxOCEwNDFmITA0MjIhMDQxZS0hMDQxZiEwNDIwITA0MWUhMDAyMigxKS5jcmyGP2h0dHA6Ly90ZXN0Z29zdDIwMTIuY3J5cHRvcHJvLnJ1L0NlcnRFbnJvbGwvdGVzdGdvc3QyMDEyKDEpLmNybDCB2gYIKwYBBQUHAQEEgc0wgcowRAYIKwYBBQUHMAKGOGh0dHA6Ly90ZXN0Z29zdDIwMTIuY3J5cHRvcHJvLnJ1L0NlcnRFbnJvbGwvcm9vdDIwMTguY3J0MD8GCCsGAQUFBzABhjNodHRwOi8vdGVzdGdvc3QyMDEyLmNyeXB0b3Byby5ydS9vY3NwMjAxMmcvb2NzcC5zcmYwQQYIKwYBBQUHMAGGNWh0dHA6Ly90ZXN0Z29zdDIwMTIuY3J5cHRvcHJvLnJ1L29jc3AyMDEyZ3N0L29jc3Auc3JmMAoGCCqFAwcBAQMCA0EALqAL7TqnSkiiiBO0/DiTGxcE2rL/nYBDde14eqqr2mykbGKC9ZIyGt4IIaBvNNHOOxqrf+kSfDC371/KWeWr3Q==</ds:X509Certificate></ds:X509Data></ds:KeyInfo><ds:Object><xades:QualifyingProperties xmlns:xades="http://uri.etsi.org/01903/v1.3.2#" Target="#id-9b37d5fe188d"><xades:SignedProperties Id="xades-id-9b37d5fe188d"><xades:SignedSignatureProperties><xades:SigningTime>2022-06-20T12:52:26.146Z</xades:SigningTime><xades:SigningCertificateV2><xades:Cert><xades:CertDigest><ds:DigestMethod Algorithm="urn:ietf:params:xml:ns:cpxmlsec:algorithms:gostr34112012-256"/><ds:DigestValue>i4/zyjkuvMf9w42okOlXnLg4gYPGZoDVYCO7Edjcw3o=</ds:DigestValue></xades:CertDigest><xades:IssuerSerialV2>MIIBKzCCARKkggEOMIIBCjEYMBYGBSqFA2QBEg0xMjM0NTY3ODkwMTIzMRowGAYIKoUDA4EDAQESDDAwMTIzNDU2Nzg5MDEvMC0GA1UECQwm0YPQuy4g0KHRg9GJ0ZHQstGB0LrQuNC5INCy0LDQuyDQtC4gMTgxCzAJBgNVBAYTAlJVMRkwFwYDVQQIDBDQsy4g0JzQvtGB0LrQstCwMRUwEwYDVQQHDAzQnNC+0YHQutCy0LAxJTAjBgNVBAoMHNCe0J7QniAi0JrQoNCY0J/QotCeLdCf0KDQniIxOzA5BgNVBAMMMtCi0LXRgdGC0L7QstGL0Lkg0KPQpiDQntCe0J4gItCa0KDQmNCf0KLQni3Qn9Cg0J4iAhN8AASbYmUSwANHLvWqAAEABJti</xades:IssuerSerialV2></xades:Cert></xades:SigningCertificateV2></xades:SignedSignatureProperties></xades:SignedProperties></xades:QualifyingProperties></ds:Object></ds:Signature></root>