From 1aec8141355144a46e10831728ef51c179bc498f Mon Sep 17 00:00:00 2001 From: Vladislav Moiseev Date: Thu, 22 Jun 2023 17:47:16 +0400 Subject: [PATCH] =?UTF-8?q?=D0=94=D0=BE=D0=B1=D0=B0=D0=B2=D0=BB=D0=B5?= =?UTF-8?q?=D0=BD=D0=B8=D0=B5=20=D0=BE=D0=B1=D1=8A=D0=B5=D0=BA=D1=82=D0=B0?= =?UTF-8?q?=20options=20=D0=B4=D0=BB=D1=8F=20=D0=BF=D0=BE=D0=B4=D0=B4?= =?UTF-8?q?=D0=B5=D1=80=D0=B6=D0=BA=D0=B8=20detached=20=D0=B8=20xml=20?= =?UTF-8?q?=D0=BF=D0=BE=D0=B4=D0=BF=D0=B8=D1=81=D0=B5=D0=B9=20512=20=D0=B1?= =?UTF-8?q?=D0=B8=D1=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- examples/script-tag/public/create-sign.js | 38 ++++++++++++++++++----- examples/script-tag/public/index.html | 2 +- src/api/createDetachedSignature.ts | 19 ++++++++++-- src/api/createHash.ts | 13 +++++++- src/api/createXMLSignature.ts | 24 ++++++++++++-- 5 files changed, 80 insertions(+), 16 deletions(-) diff --git a/examples/script-tag/public/create-sign.js b/examples/script-tag/public/create-sign.js index 8561009..95e992b 100644 --- a/examples/script-tag/public/create-sign.js +++ b/examples/script-tag/public/create-sign.js @@ -35,7 +35,12 @@ }); } - function createSignature(message, hash) { + function createSignature(message, data) { + var hash = data.hash; + var hashedAlgorithm = data.is512bit ? window.cadesplugin.CADESCOM_HASH_ALGORITHM_CP_GOST_3411_2012_512 : null; + var signatureMethod = data.is512bit ? window.cadesplugin.XmlDsigGost3410Url2012512 : null; + var digestMethod = data.is512bit ? window.cadesplugin.XmlDsigGost3411Url2012512 : null; + var thumbprint = $certificate.value, signatureType = document.querySelector('input[name="signatureType"]:checked').value, signaturePromise; @@ -51,11 +56,11 @@ break; case 'xml': - signaturePromise = window.cryptoPro.createXMLSignature(thumbprint, message); + signaturePromise = window.cryptoPro.createXMLSignature(thumbprint, message, { signatureMethod: signatureMethod, digestMethod: digestMethod }); break; case 'detached': - signaturePromise = window.cryptoPro.createDetachedSignature(thumbprint, hash); + signaturePromise = window.cryptoPro.createDetachedSignature(thumbprint, hash, { hashedAlgorithm: hashedAlgorithm }); break; } @@ -81,7 +86,9 @@ $createSignature.addEventListener('submit', function (event) { var messageFile = $messageFile && $messageFile.files.length && $messageFile.files[0], - messagePromise = Promise.resolve($message.value); + messagePromise = Promise.resolve($message.value), + thumbprint = $certificate.value, + is512bit = false; if (messageFile) { messagePromise = readFile(messageFile); @@ -93,10 +100,25 @@ $hash.placeholder = 'Вычисляется...'; $hash.value = ''; - window.cryptoPro.createHash(message).then(createSignature.bind(null, message), function (hashError) { - $hash.placeholder = 'Не вычислен'; - $hashError.textContent = hashError.message; - }); + // Определение алгоритма хеширования в зависимости от сертификата ЭП + window.cryptoPro.getCertificate(thumbprint) + .then(function (certificate) { return certificate.getAlgorithm(); }) + .then(function (algorithm) { + // Замена алгоритма хеширования для 512 бит + if (algorithm.oid === '1.2.643.7.1.1.1.2') + is512bit = true; + + return window.cryptoPro.createHash(message, { hashedAlgorithm: is512bit ? window.cadesplugin.CADESCOM_HASH_ALGORITHM_CP_GOST_3411_2012_512 : null }); + }) + .then( + function (hash) { + createSignature(message, { hash: hash, is512bit: is512bit }); + }, + function (hashError) { + $hash.placeholder = 'Не вычислен'; + $hashError.textContent = hashError.message; + } + ); }, function (fileError) { $messageFileError.textContent = fileError; }) diff --git a/examples/script-tag/public/index.html b/examples/script-tag/public/index.html index 84d00f2..e4b37d1 100755 --- a/examples/script-tag/public/index.html +++ b/examples/script-tag/public/index.html @@ -49,7 +49,7 @@
Результат -
+


diff --git a/src/api/createDetachedSignature.ts b/src/api/createDetachedSignature.ts
index 8358829..0ce38d6 100644
--- a/src/api/createDetachedSignature.ts
+++ b/src/api/createDetachedSignature.ts
@@ -5,15 +5,26 @@ import { __cadesAsyncToken__, __createCadesPluginObject__, _generateCadesFn } fr
 import { _getCadesCert } from '../helpers/_getCadesCert';
 import { _getDateObj } from '../helpers/_getDateObj';
 
+/** Дополнительные настройки */
+type Options = {
+  /**
+   * Алгоритм хеширования
+   *
+   * @defaultValue `cadesplugin.CADESCOM_HASH_ALGORITHM_CP_GOST_3411_2012_256`
+   */
+  hashedAlgorithm?: number;
+};
+
 /**
  * Создает отсоединенную подпись хеша по отпечатку сертификата
  *
  * @param thumbprint - отпечаток сертификата
- * @param messageHash - хеш подписываемого сообщения, сгенерированный по ГОСТ Р 34.11-2012 256 бит
+ * @param messageHash - хеш подписываемого сообщения, сгенерированный по ГОСТ Р 34.11-2012 256 или 512 бит в зависимости от алгоритма открытого ключа
+ * @param options - дополнительные настройки
  * @returns подпись в формате PKCS#7
  */
 export const createDetachedSignature = _afterPluginsLoaded(
-  async (thumbprint: string, messageHash: string): Promise => {
+  async (thumbprint: string, messageHash: string, options?: Options): Promise => {
     const { cadesplugin } = window;
     const cadesCertificate = await _getCadesCert(thumbprint);
 
@@ -62,7 +73,9 @@ export const createDetachedSignature = _afterPluginsLoaded(
         try {
           void (
             __cadesAsyncToken__ +
-            cadesHashedData.propset_Algorithm(cadesplugin.CADESCOM_HASH_ALGORITHM_CP_GOST_3411_2012_256)
+            cadesHashedData.propset_Algorithm(
+              options?.hashedAlgorithm ?? cadesplugin.CADESCOM_HASH_ALGORITHM_CP_GOST_3411_2012_256,
+            )
           );
           void (__cadesAsyncToken__ + cadesHashedData.SetHashValue(messageHash));
         } catch (error) {
diff --git a/src/api/createHash.ts b/src/api/createHash.ts
index b60d8b0..04f4c97 100644
--- a/src/api/createHash.ts
+++ b/src/api/createHash.ts
@@ -3,8 +3,19 @@ import { _afterPluginsLoaded } from '../helpers/_afterPluginsLoaded';
 import { _extractMeaningfulErrorMessage } from '../helpers/_extractMeaningfulErrorMessage';
 import { __cadesAsyncToken__, __createCadesPluginObject__, _generateCadesFn } from '../helpers/_generateCadesFn';
 
+/** Дополнительные настройки */
 type Options = {
+  /**
+   * Алгоритм хеширования
+   *
+   * @defaultValue `cadesplugin.CADESCOM_HASH_ALGORITHM_CP_GOST_3411_2012_256`
+   */
   hashedAlgorithm?: number;
+  /**
+   * Кодировка сообщения для хеширования
+   *
+   * @defaultValue `utf8`
+   */
   encoding?: TranscodeEncoding;
 };
 
@@ -13,7 +24,7 @@ type Options = {
  * https://ru.wikipedia.org/wiki/%D0%A1%D1%82%D1%80%D0%B8%D0%B1%D0%BE%D0%B3_(%D1%85%D0%B5%D1%88-%D1%84%D1%83%D0%BD%D0%BA%D1%86%D0%B8%D1%8F)
  *
  * @param unencryptedMessage - сообщение для хеширования
- * @hashedAlgorithm - алгоритм хеширования. По умолчанию - CADESCOM_HASH_ALGORITHM_CP_GOST_3411_2012_256.
+ * @options - дополнительные настройки
  *
  * @returns хеш
  */
diff --git a/src/api/createXMLSignature.ts b/src/api/createXMLSignature.ts
index 103fb1a..5449c82 100644
--- a/src/api/createXMLSignature.ts
+++ b/src/api/createXMLSignature.ts
@@ -3,15 +3,33 @@ import { _extractMeaningfulErrorMessage } from '../helpers/_extractMeaningfulErr
 import { __cadesAsyncToken__, __createCadesPluginObject__, _generateCadesFn } from '../helpers/_generateCadesFn';
 import { _getCadesCert } from '../helpers/_getCadesCert';
 
+/** Дополнительные настройки */
+type Options = {
+  /**
+   * Метод подписи
+   *
+   * @defaultValue `cadesplugin.XmlDsigGost3410Url2012256`
+   */
+  signatureMethod?: string;
+  /**
+   * Метод формирования дайджеста
+   *
+   * @defaultValue `cadesplugin.XmlDsigGost3411Url2012256`
+   */
+  digestMethod?: string;
+};
+
 /**
  * Создает XML подпись для документа в формате XML
  *
  * @param thumbprint - отпечаток сертификата
  * @param unencryptedMessage - подписываемое сообщение в формате XML
+ * @options - дополнительные настройки
+ *
  * @returns подпись
  */
 export const createXMLSignature = _afterPluginsLoaded(
-  async (thumbprint: string, unencryptedMessage: string): Promise => {
+  async (thumbprint: string, unencryptedMessage: string, options?: Options): Promise => {
     const { cadesplugin } = window;
     const cadesCertificate = await _getCadesCert(thumbprint);
 
@@ -30,8 +48,8 @@ export const createXMLSignature = _afterPluginsLoaded(
         }
 
         try {
-          const signatureMethod = 'urn:ietf:params:xml:ns:cpxmlsec:algorithms:gostr34102012-gostr34112012-256';
-          const digestMethod = 'urn:ietf:params:xml:ns:cpxmlsec:algorithms:gostr34112012-256';
+          const signatureMethod = options?.signatureMethod ?? cadesplugin.XmlDsigGost3410Url2012256;
+          const digestMethod = options?.digestMethod ?? cadesplugin.XmlDsigGost3411Url2012256;
 
           void (__cadesAsyncToken__ + cadesSigner.propset_Certificate(cadesCertificate));
           void (__cadesAsyncToken__ + cadesSigner.propset_CheckCertificate(true));