mirror of
				https://github.com/crypto-pro-web/crypto-pro-js.git
				synced 2025-10-31 06:13:22 +03:00 
			
		
		
		
	Методы создания отделенной и присоединенной подписи разделены и реализованы с поддержкой их проверки на сайте госуслуг
This commit is contained in:
		
							parent
							
								
									b400e8c670
								
							
						
					
					
						commit
						242794d3bf
					
				
							
								
								
									
										8
									
								
								dist/api/createAttachedSignature.d.ts
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										8
									
								
								dist/api/createAttachedSignature.d.ts
									
									
									
									
										vendored
									
									
										Normal file
									
								
							| @ -0,0 +1,8 @@ | ||||
| /** | ||||
|  * Создает присоединенную подпись сообщения по отпечатку сертификата | ||||
|  * | ||||
|  * @param thumbprint - отпечаток сертификата | ||||
|  * @param message - подписываемое сообщение | ||||
|  * @returns подпись в формате PKCS#7 | ||||
|  */ | ||||
| export declare const createAttachedSignature: (thumbprint: string, unencryptedMessage: string | ArrayBuffer) => Promise<string>; | ||||
							
								
								
									
										8
									
								
								dist/api/createDetachedSignature.d.ts
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										8
									
								
								dist/api/createDetachedSignature.d.ts
									
									
									
									
										vendored
									
									
										Normal file
									
								
							| @ -0,0 +1,8 @@ | ||||
| /** | ||||
|  * Создает отсоединенную подпись хеша по отпечатку сертификата | ||||
|  * | ||||
|  * @param thumbprint - отпечаток сертификата | ||||
|  * @param messageHash - хеш подписываемого сообщения, сгенерированный по ГОСТ Р 34.11-2012 256 бит | ||||
|  * @returns подпись в формате PKCS#7 | ||||
|  */ | ||||
| export declare const createDetachedSignature: (thumbprint: string, messageHash: string) => Promise<string>; | ||||
							
								
								
									
										9
									
								
								dist/api/createHash.d.ts
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										9
									
								
								dist/api/createHash.d.ts
									
									
									
									
										vendored
									
									
										Normal file
									
								
							| @ -0,0 +1,9 @@ | ||||
| /** | ||||
|  * Создает хэш сообщения по ГОСТ Р 34.11-2012 256 бит | ||||
|  * 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 - сообщение для хеширования | ||||
|  * | ||||
|  * @returns хэш | ||||
|  */ | ||||
| export declare const createHash: (unencryptedMessage: string | ArrayBuffer) => Promise<string>; | ||||
							
								
								
									
										4
									
								
								dist/api/createSignature.d.ts
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										4
									
								
								dist/api/createSignature.d.ts
									
									
									
									
										vendored
									
									
								
							| @ -2,8 +2,8 @@ | ||||
|  * Создает подпись base64 строки по отпечатку сертификата | ||||
|  * | ||||
|  * @param thumbprint - отпечаток сертификата | ||||
|  * @param dataBase64 - строковые данные в формате base64 | ||||
|  * @param messageHash - хэш подписываемого сообщения, сгенерированный по ГОСТ Р 34.11 | ||||
|  * @param detachedSignature = true - тип подписи открепленная (true) / присоединенная (false) | ||||
|  * @returns подпись | ||||
|  */ | ||||
| export declare const createSignature: (thumbprint: string, dataBase64: string, detachedSignature?: boolean) => Promise<string>; | ||||
| export declare const createSignature: (thumbprint: string, messageHash: string, detachedSignature?: boolean) => Promise<string>; | ||||
|  | ||||
							
								
								
									
										3
									
								
								dist/api/index.d.ts
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										3
									
								
								dist/api/index.d.ts
									
									
									
									
										vendored
									
									
								
							| @ -3,4 +3,7 @@ export * from './getUserCertificates'; | ||||
| export * from './getSystemInfo'; | ||||
| export * from './isValidSystemSetup'; | ||||
| export * from './createSignature'; | ||||
| export * from './createDetachedSignature'; | ||||
| export * from './createAttachedSignature'; | ||||
| export * from './createHash'; | ||||
| export * from './certificate'; | ||||
|  | ||||
							
								
								
									
										8
									
								
								dist/api/signHash.d.ts
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										8
									
								
								dist/api/signHash.d.ts
									
									
									
									
										vendored
									
									
										Normal file
									
								
							| @ -0,0 +1,8 @@ | ||||
| /** | ||||
|  * Создает подпись хеша по отпечатку сертификата | ||||
|  * | ||||
|  * @param thumbprint - отпечаток сертификата | ||||
|  * @param messageHash - хэш подписываемого сообщения, сгенерированный по ГОСТ Р 34.11 | ||||
|  * @returns подпись | ||||
|  */ | ||||
| export declare const signHash: (thumbprint: string, messageHash: string) => Promise<string>; | ||||
							
								
								
									
										6
									
								
								dist/crypto-pro.d.ts
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										6
									
								
								dist/crypto-pro.d.ts
									
									
									
									
										vendored
									
									
								
							| @ -1,7 +1 @@ | ||||
| // Type definitions for crypto-pro 2.0.5
 | ||||
| // Project: crypto-pro
 | ||||
| // Definitions by: Vitalii Goma https://github.com/vgoma
 | ||||
| 
 | ||||
| export as namespace cryptoPro; | ||||
| 
 | ||||
| export * from './api'; | ||||
|  | ||||
							
								
								
									
										2463
									
								
								dist/crypto-pro.js
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										2463
									
								
								dist/crypto-pro.js
									
									
									
									
										vendored
									
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
							
								
								
									
										2
									
								
								dist/crypto-pro.js.map
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										2
									
								
								dist/crypto-pro.js.map
									
									
									
									
										vendored
									
									
								
							
										
											
												File diff suppressed because one or more lines are too long
											
										
									
								
							
							
								
								
									
										11
									
								
								dist/crypto-pro.min.js
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										11
									
								
								dist/crypto-pro.min.js
									
									
									
									
										vendored
									
									
								
							
										
											
												File diff suppressed because one or more lines are too long
											
										
									
								
							
							
								
								
									
										2
									
								
								dist/crypto-pro.min.js.map
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										2
									
								
								dist/crypto-pro.min.js.map
									
									
									
									
										vendored
									
									
								
							
										
											
												File diff suppressed because one or more lines are too long
											
										
									
								
							
							
								
								
									
										18
									
								
								lib/api/createHash.d.ts
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										18
									
								
								lib/api/createHash.d.ts
									
									
									
									
										vendored
									
									
										Normal file
									
								
							| @ -0,0 +1,18 @@ | ||||
| declare type Algorithm = 'GOST_3411' | 'GOST_3411_2012_256' | 'GOST_3411_2012_512' | 'GOST_3411_HMAC' | 'GOST_3411_2012_256_HMAC' | 'GOST_3411_2012_512_HMAC'; | ||||
| /** | ||||
|  * Создает хэш сообщения по ГОСТ Р 34.11 | ||||
|  * 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 algorithm - один из алгоритмов хеширования: | ||||
|  * GOST_3411 | ||||
|  * GOST_3411_2012_256 | ||||
|  * GOST_3411_2012_512 - по умолчанию | ||||
|  * GOST_3411_HMAC | ||||
|  * GOST_3411_2012_256_HMAC | ||||
|  * GOST_3411_2012_512_HMAC | ||||
|  * | ||||
|  * @returns хэш | ||||
|  */ | ||||
| export declare const createHash: (unencryptedMessage: string | ArrayBuffer, algorithm?: Algorithm) => Promise<string>; | ||||
| export {}; | ||||
							
								
								
									
										4
									
								
								lib/api/createSignature.d.ts
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										4
									
								
								lib/api/createSignature.d.ts
									
									
									
									
										vendored
									
									
								
							| @ -2,8 +2,8 @@ | ||||
|  * Создает подпись base64 строки по отпечатку сертификата | ||||
|  * | ||||
|  * @param thumbprint - отпечаток сертификата | ||||
|  * @param dataBase64 - строковые данные в формате base64 | ||||
|  * @param messageHash - хэш подписываемого сообщения, сгенерированный по ГОСТ Р 34.11 | ||||
|  * @param detachedSignature = true - тип подписи открепленная (true) / присоединенная (false) | ||||
|  * @returns подпись | ||||
|  */ | ||||
| export declare const createSignature: (thumbprint: string, dataBase64: string, detachedSignature?: boolean) => Promise<string>; | ||||
| export declare const createSignature: (thumbprint: string, messageHash: string, detachedSignature?: boolean) => Promise<string>; | ||||
|  | ||||
							
								
								
									
										1
									
								
								lib/api/index.d.ts
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										1
									
								
								lib/api/index.d.ts
									
									
									
									
										vendored
									
									
								
							| @ -3,4 +3,5 @@ export * from './getUserCertificates'; | ||||
| export * from './getSystemInfo'; | ||||
| export * from './isValidSystemSetup'; | ||||
| export * from './createSignature'; | ||||
| export * from './createHash'; | ||||
| export * from './certificate'; | ||||
|  | ||||
							
								
								
									
										2192
									
								
								lib/crypto-pro.js
									
									
									
									
									
								
							
							
						
						
									
										2192
									
								
								lib/crypto-pro.js
									
									
									
									
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
										
											
												File diff suppressed because one or more lines are too long
											
										
									
								
							
							
								
								
									
										86
									
								
								src/api/createAttachedSignature.ts
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										86
									
								
								src/api/createAttachedSignature.ts
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,86 @@ | ||||
| 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'; | ||||
| 
 | ||||
| /** | ||||
|  * Создает присоединенную подпись сообщения по отпечатку сертификата | ||||
|  * | ||||
|  * @param thumbprint - отпечаток сертификата | ||||
|  * @param message - подписываемое сообщение | ||||
|  * @returns подпись в формате PKCS#7 | ||||
|  */ | ||||
| export const createAttachedSignature = _afterPluginsLoaded( | ||||
|   async (thumbprint: string, unencryptedMessage: string | ArrayBuffer): Promise<string> => { | ||||
|     const { cadesplugin } = window; | ||||
|     const cadesCertificate = await _getCadesCert(thumbprint); | ||||
| 
 | ||||
|     return eval( | ||||
|       _generateCadesFn(function createAttachedSignature(): 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 messageBase64; | ||||
| 
 | ||||
|         try { | ||||
|           messageBase64 = Buffer.from(unencryptedMessage).toString('base64'); | ||||
|         } catch (error) { | ||||
|           console.error(error); | ||||
| 
 | ||||
|           throw new Error('Ошибка при преобразовании сообщения в Base64'); | ||||
|         } | ||||
| 
 | ||||
|         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(messageBase64)); | ||||
|           void (__cadesAsyncToken__ + cadesSigner.propset_Options(cadesplugin.CAPICOM_CERTIFICATE_INCLUDE_WHOLE_CHAIN)); | ||||
|         } catch (error) { | ||||
|           console.error(error); | ||||
| 
 | ||||
|           throw new Error(_extractMeaningfulErrorMessage(error) || 'Ошибка при указании данных для подписи'); | ||||
|         } | ||||
| 
 | ||||
|         let signature: string; | ||||
| 
 | ||||
|         try { | ||||
|           signature = __cadesAsyncToken__ + cadesSignedData.SignCades(cadesSigner, cadesplugin.CADESCOM_PKCS7_TYPE); | ||||
|         } catch (error) { | ||||
|           console.error(error); | ||||
| 
 | ||||
|           throw new Error(_extractMeaningfulErrorMessage(error) || 'Ошибка при подписании данных'); | ||||
|         } | ||||
| 
 | ||||
|         return signature; | ||||
|       }), | ||||
|     ); | ||||
|   }, | ||||
| ); | ||||
							
								
								
									
										71
									
								
								src/api/createDetachedSignature.ts
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										71
									
								
								src/api/createDetachedSignature.ts
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,71 @@ | ||||
| import { _afterPluginsLoaded } from '../helpers/_afterPluginsLoaded'; | ||||
| import { _extractMeaningfulErrorMessage } from '../helpers/_extractMeaningfulErrorMessage'; | ||||
| import { __cadesAsyncToken__, __createCadesPluginObject__, _generateCadesFn } from '../helpers/_generateCadesFn'; | ||||
| import { _getCadesCert } from '../helpers/_getCadesCert'; | ||||
| 
 | ||||
| /** | ||||
|  * Создает отсоединенную подпись хеша по отпечатку сертификата | ||||
|  * | ||||
|  * @param thumbprint - отпечаток сертификата | ||||
|  * @param messageHash - хеш подписываемого сообщения, сгенерированный по ГОСТ Р 34.11-2012 256 бит | ||||
|  * @returns подпись в формате PKCS#7 | ||||
|  */ | ||||
| export const createDetachedSignature = _afterPluginsLoaded( | ||||
|   async (thumbprint: string, messageHash: string): Promise<string> => { | ||||
|     const { cadesplugin } = window; | ||||
|     const cadesCertificate = await _getCadesCert(thumbprint); | ||||
| 
 | ||||
|     return eval( | ||||
|       _generateCadesFn(function createDetachedSignature(): string { | ||||
|         let cadesHashedData; | ||||
|         let cadesSignedData; | ||||
|         let cadesSigner; | ||||
| 
 | ||||
|         try { | ||||
|           cadesHashedData = __cadesAsyncToken__ + __createCadesPluginObject__('CAdESCOM.HashedData'); | ||||
|           cadesSignedData = __cadesAsyncToken__ + __createCadesPluginObject__('CAdESCOM.CadesSignedData'); | ||||
|           cadesSigner = __cadesAsyncToken__ + __createCadesPluginObject__('CAdESCOM.CPSigner'); | ||||
|         } catch (error) { | ||||
|           console.error(error); | ||||
| 
 | ||||
|           throw new Error(_extractMeaningfulErrorMessage(error) || 'Ошибка при инициализации подписи'); | ||||
|         } | ||||
| 
 | ||||
|         try { | ||||
|           void (__cadesAsyncToken__ + cadesSigner.propset_Certificate(cadesCertificate)); | ||||
|           void (__cadesAsyncToken__ + cadesSigner.propset_Options(cadesplugin.CAPICOM_CERTIFICATE_INCLUDE_WHOLE_CHAIN)); | ||||
|         } catch (error) { | ||||
|           console.error(error); | ||||
| 
 | ||||
|           throw new Error(_extractMeaningfulErrorMessage(error) || 'Ошибка при установке сертификата'); | ||||
|         } | ||||
| 
 | ||||
|         try { | ||||
|           void ( | ||||
|             __cadesAsyncToken__ + | ||||
|             cadesHashedData.propset_Algorithm(cadesplugin.CADESCOM_HASH_ALGORITHM_CP_GOST_3411_2012_256) | ||||
|           ); | ||||
|           void (__cadesAsyncToken__ + cadesHashedData.SetHashValue(messageHash)); | ||||
|         } catch (error) { | ||||
|           console.error(error); | ||||
| 
 | ||||
|           throw new Error(_extractMeaningfulErrorMessage(error) || 'Ошибка при установке хеша'); | ||||
|         } | ||||
| 
 | ||||
|         let signature: string; | ||||
| 
 | ||||
|         try { | ||||
|           signature = | ||||
|             __cadesAsyncToken__ + | ||||
|             cadesSignedData.SignHash(cadesHashedData, cadesSigner, cadesplugin.CADESCOM_PKCS7_TYPE); | ||||
|         } catch (error) { | ||||
|           console.error(error); | ||||
| 
 | ||||
|           throw new Error(_extractMeaningfulErrorMessage(error) || 'Ошибка при подписании данных'); | ||||
|         } | ||||
| 
 | ||||
|         return signature; | ||||
|       }), | ||||
|     ); | ||||
|   }, | ||||
| ); | ||||
| @ -15,6 +15,13 @@ import { _getDateObj } from '../helpers/_getDateObj'; | ||||
|  */ | ||||
| export const createSignature = _afterPluginsLoaded( | ||||
|   async (thumbprint: string, messageHash: string, detachedSignature: boolean = true): Promise<string> => { | ||||
|     console.warn( | ||||
|       [ | ||||
|         'cryptoPro: Метод "createSignature" является устаревшим и будет убран из будущих версий.', | ||||
|         'Используйте "createAttachedSignature" и "createDetachedSignature".', | ||||
|       ].join('\n'), | ||||
|     ); | ||||
| 
 | ||||
|     const { cadesplugin } = window; | ||||
|     const cadesCertificate = await _getCadesCert(thumbprint); | ||||
| 
 | ||||
|  | ||||
| @ -3,5 +3,7 @@ export * from './getUserCertificates'; | ||||
| export * from './getSystemInfo'; | ||||
| export * from './isValidSystemSetup'; | ||||
| export * from './createSignature'; | ||||
| export * from './createDetachedSignature'; | ||||
| export * from './createAttachedSignature'; | ||||
| export * from './createHash'; | ||||
| export * from './certificate'; | ||||
|  | ||||
		Loading…
	
		Reference in New Issue
	
	Block a user
	 vgoma
						vgoma