mirror of
https://github.com/crypto-pro-web/crypto-pro-js.git
synced 2025-04-21 04:53:08 +03:00
Добавление объекта options для поддержки detached и xml подписей 512 бит
This commit is contained in:
parent
67e932b183
commit
1aec814135
@ -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;
|
||||||
})
|
})
|
||||||
|
@ -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>
|
||||||
|
@ -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) {
|
||||||
|
@ -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 хеш
|
||||||
*/
|
*/
|
||||||
|
@ -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));
|
||||||
|
Loading…
Reference in New Issue
Block a user