import { CADESCOM_AUTHENTICATED_ATTRIBUTE_SIGNING_TIME } from '../constants'; import { _afterPluginsLoaded } from '../helpers/_afterPluginsLoaded'; import { _extractMeaningfulErrorMessage } from '../helpers/_extractMeaningfulErrorMessage'; import { __cadesAsyncToken__, __createCadesPluginObject__, _generateCadesFn } from '../helpers/_generateCadesFn'; import { _getCadesCert } from '../helpers/_getCadesCert'; import { _getDateObj } from '../helpers/_getDateObj'; /** * Создает подпись base64 строки по отпечатку сертификата * * @param thumbprint - отпечаток сертификата * @param messageHash - хеш подписываемого сообщения, сгенерированный по ГОСТ Р 34.11 * @param detachedSignature = true - тип подписи открепленная (true) / присоединенная (false) * @returns подпись */ export const createSignature = _afterPluginsLoaded( async (thumbprint: string, messageHash: string, detachedSignature: boolean = true): Promise => { console.warn( [ 'cryptoPro: Метод "createSignature" является устаревшим и будет убран из будущих версий.', 'Используйте "createAttachedSignature" и "createDetachedSignature".', ].join('\n'), ); const { cadesplugin } = window; const cadesCertificate = await _getCadesCert(thumbprint); return eval( _generateCadesFn(function createSignature(): string { let cadesAttrs; let cadesSignedData; let cadesSigner; try { cadesAttrs = __cadesAsyncToken__ + __createCadesPluginObject__('CADESCOM.CPAttribute'); cadesSignedData = __cadesAsyncToken__ + __createCadesPluginObject__('CAdESCOM.CadesSignedData'); cadesSigner = __cadesAsyncToken__ + __createCadesPluginObject__('CAdESCOM.CPSigner'); } catch (error) { console.error(error); throw new Error(_extractMeaningfulErrorMessage(error) || 'Ошибка при инициализации подписи'); } const currentTime = _getDateObj(new Date()); try { void (__cadesAsyncToken__ + cadesAttrs.propset_Name(CADESCOM_AUTHENTICATED_ATTRIBUTE_SIGNING_TIME)); void (__cadesAsyncToken__ + cadesAttrs.propset_Value(currentTime)); } catch (error) { console.error(error); throw new Error(_extractMeaningfulErrorMessage(error) || 'Ошибка при установке времени подписи'); } let cadesAuthAttrs; try { void (__cadesAsyncToken__ + cadesSigner.propset_Certificate(cadesCertificate)); cadesAuthAttrs = __cadesAsyncToken__ + cadesSigner.AuthenticatedAttributes2; void (__cadesAsyncToken__ + cadesAuthAttrs.Add(cadesAttrs)); void (__cadesAsyncToken__ + cadesSignedData.propset_ContentEncoding(cadesplugin.CADESCOM_BASE64_TO_BINARY)); void (__cadesAsyncToken__ + cadesSignedData.propset_Content(messageHash)); void ( __cadesAsyncToken__ + cadesSigner.propset_Options(cadesplugin.CAPICOM_CERTIFICATE_INCLUDE_END_ENTITY_ONLY) ); } catch (error) { console.error(error); throw new Error(_extractMeaningfulErrorMessage(error) || 'Ошибка при указании данных для подписи'); } let signature: string; try { signature = __cadesAsyncToken__ + cadesSignedData.SignCades(cadesSigner, cadesplugin.CADESCOM_CADES_BES, detachedSignature); } catch (error) { console.error(error); throw new Error(_extractMeaningfulErrorMessage(error) || 'Ошибка при подписании данных'); } return signature; }), ); }, );