mirror of
				https://github.com/crypto-pro-web/crypto-pro-js.git
				synced 2025-10-31 06:13:22 +03:00 
			
		
		
		
	Merge pull request #140 from vladdy-moses/master
Добавление объекта options для поддержки detached и xml подписей 512 бит
This commit is contained in:
		
						commit
						f11b857346
					
				| @ -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; | ||||
|     }) | ||||
|  | ||||
| @ -49,7 +49,7 @@ | ||||
| 
 | ||||
|         <fieldset> | ||||
|             <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> | ||||
|             <br> | ||||
|             <pre id="hashError"></pre> | ||||
|  | ||||
| @ -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<string> => { | ||||
|   async (thumbprint: string, messageHash: string, options?: Options): Promise<string> => { | ||||
|     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) { | ||||
|  | ||||
| @ -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 хеш | ||||
|  */ | ||||
|  | ||||
| @ -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<string> => { | ||||
|   async (thumbprint: string, unencryptedMessage: string, options?: Options): Promise<string> => { | ||||
|     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)); | ||||
|  | ||||
		Loading…
	
		Reference in New Issue
	
	Block a user
	 Vitalii Goma
						Vitalii Goma