Добавление объекта options для поддержки detached и xml подписей 512 бит

This commit is contained in:
Vladislav Moiseev 2023-06-22 17:47:16 +04:00
parent 67e932b183
commit 1aec814135
5 changed files with 80 additions and 16 deletions

View File

@ -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, var thumbprint = $certificate.value,
signatureType = document.querySelector('input[name="signatureType"]:checked').value, signatureType = document.querySelector('input[name="signatureType"]:checked').value,
signaturePromise; signaturePromise;
@ -51,11 +56,11 @@
break; break;
case 'xml': case 'xml':
signaturePromise = window.cryptoPro.createXMLSignature(thumbprint, message); signaturePromise = window.cryptoPro.createXMLSignature(thumbprint, message, { signatureMethod: signatureMethod, digestMethod: digestMethod });
break; break;
case 'detached': case 'detached':
signaturePromise = window.cryptoPro.createDetachedSignature(thumbprint, hash); signaturePromise = window.cryptoPro.createDetachedSignature(thumbprint, hash, { hashedAlgorithm: hashedAlgorithm });
break; break;
} }
@ -81,7 +86,9 @@
$createSignature.addEventListener('submit', function (event) { $createSignature.addEventListener('submit', function (event) {
var messageFile = $messageFile && $messageFile.files.length && $messageFile.files[0], 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) { if (messageFile) {
messagePromise = readFile(messageFile); messagePromise = readFile(messageFile);
@ -93,10 +100,25 @@
$hash.placeholder = 'Вычисляется...'; $hash.placeholder = 'Вычисляется...';
$hash.value = ''; $hash.value = '';
window.cryptoPro.createHash(message).then(createSignature.bind(null, message), function (hashError) { // Определение алгоритма хеширования в зависимости от сертификата ЭП
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 = 'Не вычислен'; $hash.placeholder = 'Не вычислен';
$hashError.textContent = hashError.message; $hashError.textContent = hashError.message;
}); }
);
}, function (fileError) { }, function (fileError) {
$messageFileError.textContent = fileError; $messageFileError.textContent = fileError;
}) })

View File

@ -49,7 +49,7 @@
<fieldset> <fieldset>
<legend>Результат</legend> <legend>Результат</legend>
<label for="hash">Хеш (ГОСТ Р 34.11-2012 256 бит):</label><br> <label for="hash">Хеш (ГОСТ Р 34.11-2012):</label><br>
<textarea id="hash" cols="80" rows="5" placeholder="Не вычислен"></textarea> <textarea id="hash" cols="80" rows="5" placeholder="Не вычислен"></textarea>
<br> <br>
<pre id="hashError"></pre> <pre id="hashError"></pre>

View File

@ -5,15 +5,26 @@ import { __cadesAsyncToken__, __createCadesPluginObject__, _generateCadesFn } fr
import { _getCadesCert } from '../helpers/_getCadesCert'; import { _getCadesCert } from '../helpers/_getCadesCert';
import { _getDateObj } from '../helpers/_getDateObj'; import { _getDateObj } from '../helpers/_getDateObj';
/** Дополнительные настройки */
type Options = {
/**
* Алгоритм хеширования
*
* @defaultValue `cadesplugin.CADESCOM_HASH_ALGORITHM_CP_GOST_3411_2012_256`
*/
hashedAlgorithm?: number;
};
/** /**
* Создает отсоединенную подпись хеша по отпечатку сертификата * Создает отсоединенную подпись хеша по отпечатку сертификата
* *
* @param thumbprint - отпечаток сертификата * @param thumbprint - отпечаток сертификата
* @param messageHash - хеш подписываемого сообщения, сгенерированный по ГОСТ Р 34.11-2012 256 бит * @param messageHash - хеш подписываемого сообщения, сгенерированный по ГОСТ Р 34.11-2012 256 или 512 бит в зависимости от алгоритма открытого ключа
* @param options - дополнительные настройки
* @returns подпись в формате PKCS#7 * @returns подпись в формате PKCS#7
*/ */
export const createDetachedSignature = _afterPluginsLoaded( export const createDetachedSignature = _afterPluginsLoaded(
async (thumbprint: string, messageHash: string): Promise<string> => { async (thumbprint: string, messageHash: string, options?: Options): Promise<string> => {
const { cadesplugin } = window; const { cadesplugin } = window;
const cadesCertificate = await _getCadesCert(thumbprint); const cadesCertificate = await _getCadesCert(thumbprint);
@ -62,7 +73,9 @@ export const createDetachedSignature = _afterPluginsLoaded(
try { try {
void ( void (
__cadesAsyncToken__ + __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)); void (__cadesAsyncToken__ + cadesHashedData.SetHashValue(messageHash));
} catch (error) { } catch (error) {

View File

@ -3,8 +3,19 @@ import { _afterPluginsLoaded } from '../helpers/_afterPluginsLoaded';
import { _extractMeaningfulErrorMessage } from '../helpers/_extractMeaningfulErrorMessage'; import { _extractMeaningfulErrorMessage } from '../helpers/_extractMeaningfulErrorMessage';
import { __cadesAsyncToken__, __createCadesPluginObject__, _generateCadesFn } from '../helpers/_generateCadesFn'; import { __cadesAsyncToken__, __createCadesPluginObject__, _generateCadesFn } from '../helpers/_generateCadesFn';
/** Дополнительные настройки */
type Options = { type Options = {
/**
* Алгоритм хеширования
*
* @defaultValue `cadesplugin.CADESCOM_HASH_ALGORITHM_CP_GOST_3411_2012_256`
*/
hashedAlgorithm?: number; hashedAlgorithm?: number;
/**
* Кодировка сообщения для хеширования
*
* @defaultValue `utf8`
*/
encoding?: TranscodeEncoding; 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) * 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 - сообщение для хеширования * @param unencryptedMessage - сообщение для хеширования
* @hashedAlgorithm - алгоритм хеширования. По умолчанию - CADESCOM_HASH_ALGORITHM_CP_GOST_3411_2012_256. * @options - дополнительные настройки
* *
* @returns хеш * @returns хеш
*/ */

View File

@ -3,15 +3,33 @@ import { _extractMeaningfulErrorMessage } from '../helpers/_extractMeaningfulErr
import { __cadesAsyncToken__, __createCadesPluginObject__, _generateCadesFn } from '../helpers/_generateCadesFn'; import { __cadesAsyncToken__, __createCadesPluginObject__, _generateCadesFn } from '../helpers/_generateCadesFn';
import { _getCadesCert } from '../helpers/_getCadesCert'; import { _getCadesCert } from '../helpers/_getCadesCert';
/** Дополнительные настройки */
type Options = {
/**
* Метод подписи
*
* @defaultValue `cadesplugin.XmlDsigGost3410Url2012256`
*/
signatureMethod?: string;
/**
* Метод формирования дайджеста
*
* @defaultValue `cadesplugin.XmlDsigGost3411Url2012256`
*/
digestMethod?: string;
};
/** /**
* Создает XML подпись для документа в формате XML * Создает XML подпись для документа в формате XML
* *
* @param thumbprint - отпечаток сертификата * @param thumbprint - отпечаток сертификата
* @param unencryptedMessage - подписываемое сообщение в формате XML * @param unencryptedMessage - подписываемое сообщение в формате XML
* @options - дополнительные настройки
*
* @returns подпись * @returns подпись
*/ */
export const createXMLSignature = _afterPluginsLoaded( export const createXMLSignature = _afterPluginsLoaded(
async (thumbprint: string, unencryptedMessage: string): Promise<string> => { async (thumbprint: string, unencryptedMessage: string, options?: Options): Promise<string> => {
const { cadesplugin } = window; const { cadesplugin } = window;
const cadesCertificate = await _getCadesCert(thumbprint); const cadesCertificate = await _getCadesCert(thumbprint);
@ -30,8 +48,8 @@ export const createXMLSignature = _afterPluginsLoaded(
} }
try { try {
const signatureMethod = 'urn:ietf:params:xml:ns:cpxmlsec:algorithms:gostr34102012-gostr34112012-256'; const signatureMethod = options?.signatureMethod ?? cadesplugin.XmlDsigGost3410Url2012256;
const digestMethod = 'urn:ietf:params:xml:ns:cpxmlsec:algorithms:gostr34112012-256'; const digestMethod = options?.digestMethod ?? cadesplugin.XmlDsigGost3411Url2012256;
void (__cadesAsyncToken__ + cadesSigner.propset_Certificate(cadesCertificate)); void (__cadesAsyncToken__ + cadesSigner.propset_Certificate(cadesCertificate));
void (__cadesAsyncToken__ + cadesSigner.propset_CheckCertificate(true)); void (__cadesAsyncToken__ + cadesSigner.propset_CheckCertificate(true));