@it-enterprise/digital-signature 1.2.1 → 1.2.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/euscp/EndUserConstants.d.ts +2 -0
- package/euscp/euscp.js +2 -2
- package/package.json +1 -1
- package/readme.md +62 -8
- package/src/DigitalSignature.js +88 -124
- package/src/GlSign.js +16 -0
- package/src/Models.js +89 -2
- package/src/Utils.js +6 -2
package/package.json
CHANGED
package/readme.md
CHANGED
|
@@ -66,34 +66,41 @@ import {
|
|
|
66
66
|
|
|
67
67
|
# Инициализация
|
|
68
68
|
|
|
69
|
-
|
|
69
|
+
Инициализация библиотеки
|
|
70
70
|
```javascript
|
|
71
|
+
import {
|
|
72
|
+
DigitalSignature,
|
|
73
|
+
Models
|
|
74
|
+
} from "@it-enterprise/digital-signature";
|
|
75
|
+
|
|
71
76
|
const ds = new DigitalSignature(
|
|
72
77
|
new Models.DefaultSettingProvider(
|
|
73
78
|
"uk", // Язык ошибок (строка, или функция, возвращающая строку)
|
|
74
79
|
userId, // id пользователя (для сохранения ключей и предпочитаемого типа ключа) (строка, или функция, возвращающая строку)
|
|
75
80
|
location.pathname + "api/ds/") // Путь к API ЕЦП
|
|
76
81
|
);
|
|
77
|
-
Возвращает текущий тип ключа (файловый, аппаратный, облачный)
|
|
82
|
+
// Возвращает текущий тип ключа (файловый, аппаратный, облачный)
|
|
78
83
|
const currentKeyType = await ds.initialise();
|
|
79
84
|
```
|
|
80
85
|
Сменить тип библиотеки
|
|
81
86
|
```javascript
|
|
82
87
|
/** Подпись файловыми ключами, через облачные сервисы */
|
|
83
|
-
|
|
88
|
+
const DigitalSignatureLibraryTypeJS = 0;
|
|
84
89
|
/** Подпись аппартными ключами */
|
|
85
|
-
|
|
90
|
+
const DigitalSignatureLibraryTypeSW = 1;
|
|
86
91
|
/**
|
|
87
92
|
* Типы библиотеки
|
|
88
93
|
*/
|
|
89
|
-
|
|
94
|
+
enum DigitalSignatureLibraryType = {
|
|
90
95
|
/** Подпись файловыми ключами и через облачные сервисы */
|
|
91
96
|
JS: DigitalSignatureLibraryTypeJS,
|
|
92
97
|
/** Подпись аппартными ключами */
|
|
93
98
|
SW: DigitalSignatureLibraryTypeSW
|
|
94
99
|
};
|
|
95
100
|
|
|
96
|
-
|
|
101
|
+
import { Models } from "@it-enterprise/digital-signature";
|
|
102
|
+
|
|
103
|
+
await ds.setLibraryType(Models.DigitalSignatureLibraryType.JS);
|
|
97
104
|
```
|
|
98
105
|
|
|
99
106
|
# Центры сертификации ключей
|
|
@@ -116,6 +123,8 @@ const needCerts = ds.needPrivateKeyCertificates();
|
|
|
116
123
|
```
|
|
117
124
|
Структура объекта CASettings
|
|
118
125
|
```javascript
|
|
126
|
+
import { EUSignCP.CASettings } from "@it-enterprise/digital-signature";
|
|
127
|
+
|
|
119
128
|
class CASettings {
|
|
120
129
|
// Названия ЦСК (обычно используется первое из списка)
|
|
121
130
|
issuerCNs: Array<string>;
|
|
@@ -212,12 +221,15 @@ const ksps = ds.KSPs;
|
|
|
212
221
|
|
|
213
222
|
```javascript
|
|
214
223
|
class KSPSettings {
|
|
224
|
+
// Идентификатор
|
|
225
|
+
id: string;
|
|
215
226
|
// Название провайдера
|
|
216
227
|
name: string;
|
|
217
228
|
// Провайдер работает через QR код или через ID пользователя
|
|
218
229
|
needQRCode: boolean;
|
|
219
230
|
// Тип ID пользователя (имя пользователя/телефон/email)
|
|
220
231
|
clientIdType?: EndUserKSPClientIdType;
|
|
232
|
+
// Тип провайдера
|
|
221
233
|
ksp: EndUserKSP;
|
|
222
234
|
address?: string;
|
|
223
235
|
port?: string;
|
|
@@ -228,6 +240,36 @@ class KSPSettings {
|
|
|
228
240
|
pollingInterval?: number;
|
|
229
241
|
systemId?: string;
|
|
230
242
|
}
|
|
243
|
+
import { EUSignCP.KSPSettings } from "@it-enterprise/digital-signature";
|
|
244
|
+
|
|
245
|
+
// Тип провайдера облачных ключей
|
|
246
|
+
enum EndUserKSP = {
|
|
247
|
+
// DepositSign, ESign, Вчасно
|
|
248
|
+
IIT
|
|
249
|
+
// SmartID, CloudKey
|
|
250
|
+
PB
|
|
251
|
+
// Дія.Підпис
|
|
252
|
+
DIIA
|
|
253
|
+
// Подписание ключами с Гряды через сервис подписи
|
|
254
|
+
GRYADA
|
|
255
|
+
}
|
|
256
|
+
import { Models.EndUserKSP } from "@it-enterprise/digital-signature";
|
|
257
|
+
|
|
258
|
+
// Тип ID пользователя
|
|
259
|
+
enum EndUserKSPClientIdType = {
|
|
260
|
+
// По умолчанию
|
|
261
|
+
Default,
|
|
262
|
+
// Имя пользователя
|
|
263
|
+
Name,
|
|
264
|
+
// Номер телефона
|
|
265
|
+
Phone,
|
|
266
|
+
// Email
|
|
267
|
+
Email,
|
|
268
|
+
// Имя пользователя и пароль (2 поля)
|
|
269
|
+
NamePassword
|
|
270
|
+
}
|
|
271
|
+
import { Models.EndUserKSPClientIdType } from "@it-enterprise/digital-signature";
|
|
272
|
+
|
|
231
273
|
```
|
|
232
274
|
|
|
233
275
|
Для ключей, работающих через QR код, после инициализации библиотеки нужно подписаться на событие подтверждения операции
|
|
@@ -245,6 +287,7 @@ ds.addConfirmKSPOperationEventListener(eventArgs => { ... });
|
|
|
245
287
|
|
|
246
288
|
Структура объекта, приходящего в коллбек события
|
|
247
289
|
```javascript
|
|
290
|
+
// Аргументы события
|
|
248
291
|
class EndUserConfirmKSPOperationEvent {
|
|
249
292
|
// Ссылка на подтверждение операции
|
|
250
293
|
url: string;
|
|
@@ -255,6 +298,8 @@ class EndUserConfirmKSPOperationEvent {
|
|
|
255
298
|
// Время, до которого действует ссылка
|
|
256
299
|
expireDate: Date;
|
|
257
300
|
}
|
|
301
|
+
import { EUSignCP.EndUserEvents.EndUserConfirmKSPOperationEvent } from "@it-enterprise/digital-signature";
|
|
302
|
+
|
|
258
303
|
```
|
|
259
304
|
QR код нужно отобразить пользовтелю, что бы он мог отсканировать его в приложении и подтвердить подписание
|
|
260
305
|
Для отображения QR кода можно использовать содержимое поля qrCode, либо сгенерировать его на основе ссылки из поля url
|
|
@@ -276,7 +321,9 @@ const keyInfo = await ds.readPrivateKeyKSP(
|
|
|
276
321
|
// Получать информацию о сертификатах пользователя
|
|
277
322
|
// true - поля ownerInfo и certificates в keyInfo будут заполены, но пользователю нужно будет подтвердить дополнительную операцию подписания
|
|
278
323
|
// false - поля ownerInfo и certificates в keyInfo будут пустыми, но пользователь не получит дополнительный запрос на подписание
|
|
279
|
-
getCerts = false
|
|
324
|
+
getCerts = false,
|
|
325
|
+
// Пароль пользователя, если clientIdType == NamePassword
|
|
326
|
+
keyID = null);
|
|
280
327
|
```
|
|
281
328
|
|
|
282
329
|
|
|
@@ -327,6 +374,7 @@ class EndUserSignContainerInfo {
|
|
|
327
374
|
// Тип подписи в ASiC контейнере (только для ASiC контейнеров)
|
|
328
375
|
asicSignType: EndUserASiCSignType;
|
|
329
376
|
}
|
|
377
|
+
import { EUSignCP.EndUserSignContainerInfo } from "@it-enterprise/digital-signature";
|
|
330
378
|
```
|
|
331
379
|
Типы контейнеров подписи
|
|
332
380
|
```javascript
|
|
@@ -344,6 +392,7 @@ enum EndUserSignContainerType {
|
|
|
344
392
|
// Контейнер для подписей в виде ZIP-архива
|
|
345
393
|
ASiC
|
|
346
394
|
}
|
|
395
|
+
import { EUSignCP.EndUserConstants.EndUserSignContainerType } from "@it-enterprise/digital-signature";
|
|
347
396
|
```
|
|
348
397
|
Типы подписей CAdES
|
|
349
398
|
```javascript
|
|
@@ -355,6 +404,7 @@ enum EndUserCAdESType {
|
|
|
355
404
|
// Подпись в одном контейнере с данными (внутренняя подпись)
|
|
356
405
|
Enveloped
|
|
357
406
|
}
|
|
407
|
+
import { EUSignCP.EndUserConstants.EndUserCAdESType } from "@it-enterprise/digital-signature";
|
|
358
408
|
```
|
|
359
409
|
Типы подписей XAdES
|
|
360
410
|
```javascript
|
|
@@ -363,9 +413,10 @@ const EU_XADES_TYPE_ENVELOPED = 3;
|
|
|
363
413
|
enum EndUserXAdESType {
|
|
364
414
|
// Подпись отдельно от данных (внешняя подпись)
|
|
365
415
|
Detached,
|
|
366
|
-
// Подпись в одном контейнере с данными (внутренняя подпись)
|
|
416
|
+
// Подпись в одном контейнере с данными (внутренняя подпись) !! Данные могут быть только в формате XML !!
|
|
367
417
|
Enveloped
|
|
368
418
|
}
|
|
419
|
+
import { EUSignCP.EndUserConstants.EndUserXAdESType } from "@it-enterprise/digital-signature";
|
|
369
420
|
```
|
|
370
421
|
Типы контейнеров ASiC
|
|
371
422
|
```javascript
|
|
@@ -377,6 +428,7 @@ enum EndUserASiCType {
|
|
|
377
428
|
// Расширенный контейнер, может содержать несколько файлов с данными и несколько подписей
|
|
378
429
|
E
|
|
379
430
|
}
|
|
431
|
+
import { EUSignCP.EndUserConstants.EndUserASiCType } from "@it-enterprise/digital-signature";
|
|
380
432
|
```
|
|
381
433
|
Типы подписей, которые могут содержаться в ASiC контейнере
|
|
382
434
|
```javascript
|
|
@@ -386,6 +438,7 @@ enum EndUserASiCSignType {
|
|
|
386
438
|
CAdES,
|
|
387
439
|
XAdES
|
|
388
440
|
}
|
|
441
|
+
import { EUSignCP.EndUserConstants.EndUserASiCSignType } from "@it-enterprise/digital-signature";
|
|
389
442
|
```
|
|
390
443
|
|
|
391
444
|
Пример использования формата подписи:
|
|
@@ -435,6 +488,7 @@ declare type NamedData = {
|
|
|
435
488
|
// В качестве возвращаемого результата: контейнер с подписью
|
|
436
489
|
val: string | Uint8Array;
|
|
437
490
|
};
|
|
491
|
+
import { EUSignCP.NamedData } from "@it-enterprise/digital-signature";
|
|
438
492
|
```
|
|
439
493
|
Пример использования формата именованных данных
|
|
440
494
|
```javascript
|
package/src/DigitalSignature.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { EndUser, EndUserConstants, EndUserProxySettings, EndUserError, KSPSettings, EndUserCertificate, EndUserKeyMedia, EndUserSignContainerInfo } from "../euscp/euscp";
|
|
2
|
-
import { DigitalSignatureKeyType, PrivateKeyInfo, FilePrivateKeyInfo, HardwarePrivateKeyInfo, KspPrivateKeyInfo } from "./Models";
|
|
3
|
-
import { downloadAndSignFiles, downloadData, format, readFile, signAlgoToHashAlgo } from "./Utils";
|
|
2
|
+
import { DigitalSignatureKeyType, PrivateKeyInfo, FilePrivateKeyInfo, HardwarePrivateKeyInfo, KspPrivateKeyInfo, EndUserKSP } from "./Models";
|
|
3
|
+
import { downloadAndSignFiles, downloadData, format, isDefaultValue, readFile, signAlgoToHashAlgo } from "./Utils";
|
|
4
4
|
import Resourses from "./Resourses.json";
|
|
5
5
|
import GlSign from "./GlSign";
|
|
6
6
|
|
|
@@ -31,85 +31,8 @@ export default class DigitalSignature {
|
|
|
31
31
|
/** @type {CASettings} */
|
|
32
32
|
this._selectedCA = null;
|
|
33
33
|
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
depositsign.ksp = EndUserConstants.EU_KSP_IIT;
|
|
37
|
-
depositsign.address = "https://depositsign.com/api/v1/it-enterprise/sign-server";
|
|
38
|
-
depositsign.directAccess = true;
|
|
39
|
-
depositsign.needQRCode = false;
|
|
40
|
-
|
|
41
|
-
const diia = new KSPSettings();
|
|
42
|
-
diia.name = "Дія.Підпис";
|
|
43
|
-
diia.ksp = EndUserConstants.EU_KSP_DIIA;
|
|
44
|
-
diia.directAccess = true;
|
|
45
|
-
diia.mobileAppName = "Дія";
|
|
46
|
-
diia.address = "https://diia-sign.it.ua/KSPSign";
|
|
47
|
-
diia.systemId = "diia-sign-it-ent";
|
|
48
|
-
diia.needQRCode = true;
|
|
49
|
-
|
|
50
|
-
const smartId = new KSPSettings();
|
|
51
|
-
smartId.name = "Приватбанк - хмарний підпис \"SmartID\"";
|
|
52
|
-
smartId.ksp = EndUserConstants.EU_KSP_PB;
|
|
53
|
-
smartId.directAccess = true;
|
|
54
|
-
smartId.mobileAppName = "Приват24";
|
|
55
|
-
smartId.address = "https://acsk.privatbank.ua/cloud/api/back/";
|
|
56
|
-
smartId.clientIdPrefix = "IEIS_";
|
|
57
|
-
smartId.confirmationURL = "https://www.privat24.ua/rd/kep";
|
|
58
|
-
smartId.needQRCode = true;
|
|
59
|
-
|
|
60
|
-
const vchasno = new KSPSettings();
|
|
61
|
-
vchasno.name = "Вчасно - хмарний підпис";
|
|
62
|
-
vchasno.ksp = EndUserConstants.EU_KSP_IIT;
|
|
63
|
-
vchasno.address = "https://cs.vchasno.ua/ss/";
|
|
64
|
-
vchasno.directAccess = true;
|
|
65
|
-
vchasno.needQRCode = false;
|
|
66
|
-
|
|
67
|
-
const cloudKey = new KSPSettings();
|
|
68
|
-
cloudKey.name = "ТОВ «ЦСК «Україна» - хмарний підпис CloudKey";
|
|
69
|
-
cloudKey.ksp = EndUserConstants.EU_KSP_PB;
|
|
70
|
-
cloudKey.directAccess = true;
|
|
71
|
-
cloudKey.mobileAppName = "CloudKey";
|
|
72
|
-
cloudKey.address = "https://sid.uakey.com.ua/smartid/iit/";
|
|
73
|
-
cloudKey.clientIdPrefix = "DIIA_2";
|
|
74
|
-
cloudKey.confirmationURL = "https://sid.uakey.com.ua/kep?hash=rd/kep";
|
|
75
|
-
cloudKey.needQRCode = true;
|
|
76
|
-
|
|
77
|
-
const esign = new KSPSettings();
|
|
78
|
-
esign.name = "ESign - хмарний підпис";
|
|
79
|
-
esign.ksp = EndUserConstants.EU_KSP_IIT;
|
|
80
|
-
esign.address = "https://cabinet.e-life.com.ua/api/EDG/Sign";
|
|
81
|
-
esign.directAccess = true;
|
|
82
|
-
esign.needQRCode = false;
|
|
83
|
-
|
|
84
|
-
const idd = new KSPSettings();
|
|
85
|
-
idd.name = "ІДД ДПС - хмарний підпис";
|
|
86
|
-
idd.ksp = EndUserConstants.EU_KSP_IIT;
|
|
87
|
-
idd.address = "https://smart-sign.tax.gov.ua/";
|
|
88
|
-
idd.port = "443";
|
|
89
|
-
idd.directAccess = true;
|
|
90
|
-
idd.clientIdType = 1;
|
|
91
|
-
idd.needQRCode = false;
|
|
92
|
-
|
|
93
|
-
this._KSPs = {
|
|
94
|
-
depositsign,
|
|
95
|
-
diia,
|
|
96
|
-
smartId,
|
|
97
|
-
vchasno,
|
|
98
|
-
cloudKey,
|
|
99
|
-
esign,
|
|
100
|
-
idd,
|
|
101
|
-
asArray: function() {
|
|
102
|
-
return [
|
|
103
|
-
depositsign,
|
|
104
|
-
diia,
|
|
105
|
-
smartId,
|
|
106
|
-
vchasno,
|
|
107
|
-
cloudKey,
|
|
108
|
-
esign,
|
|
109
|
-
idd
|
|
110
|
-
];
|
|
111
|
-
}
|
|
112
|
-
};
|
|
34
|
+
/** @type {KSPSettings} */
|
|
35
|
+
this._KSPs = [];
|
|
113
36
|
|
|
114
37
|
/** @type {PrivateKeyInfo} */
|
|
115
38
|
this._readedKey = null;
|
|
@@ -138,7 +61,7 @@ export default class DigitalSignature {
|
|
|
138
61
|
async setLibraryType(type) {
|
|
139
62
|
switch (type) {
|
|
140
63
|
case DigitalSignatureKeyType.Token:
|
|
141
|
-
if (this._euSign === this._euSignKeyMedia) {
|
|
64
|
+
if (this._euSign === this._euSignKeyMedia && await this._euSign.IsInitialized()) {
|
|
142
65
|
return;
|
|
143
66
|
}
|
|
144
67
|
this._euSign = this._euSignKeyMedia;
|
|
@@ -335,6 +258,29 @@ export default class DigitalSignature {
|
|
|
335
258
|
return this._euSignKeyMedia.GetKeyMedias();
|
|
336
259
|
}
|
|
337
260
|
|
|
261
|
+
/**
|
|
262
|
+
* Считать ключ по параметрам
|
|
263
|
+
* @param {PrivateKeyInfo} keyInfo - Параметры ключа
|
|
264
|
+
*/
|
|
265
|
+
async readPrivateKeyByInfo(keyInfo) {
|
|
266
|
+
if (!keyInfo) {
|
|
267
|
+
throw {
|
|
268
|
+
code: EndUserError.EU_ERROR_BAD_PARAMETER,
|
|
269
|
+
message: this._resourses.BadParameter + " keyInfo"
|
|
270
|
+
};
|
|
271
|
+
}
|
|
272
|
+
|
|
273
|
+
await this.setLibraryType(keyInfo.keyType);
|
|
274
|
+
switch (keyInfo.keyType) {
|
|
275
|
+
case DigitalSignatureKeyType.File:
|
|
276
|
+
return await this.readFileKey(keyInfo.privateKey, keyInfo.password, keyInfo.certificates);
|
|
277
|
+
case DigitalSignatureKeyType.Token:
|
|
278
|
+
return await this.readHardwareKey(keyInfo.keyMedia, keyInfo.certificates);
|
|
279
|
+
case DigitalSignatureKeyType.KSP:
|
|
280
|
+
return await this.readPrivateKeyKSP(keyInfo.ksp, keyInfo.kspUserId, false);
|
|
281
|
+
}
|
|
282
|
+
}
|
|
283
|
+
|
|
338
284
|
/**
|
|
339
285
|
* Считать аппаратный ключ
|
|
340
286
|
* @param {EndUserKeyMedia} keyMedia - Параметры аппаратного ключа
|
|
@@ -485,7 +431,8 @@ export default class DigitalSignature {
|
|
|
485
431
|
* @param {boolean?} getCerts - Получать информацию о ключе пользователя. Это приведёт к дополнительному запросу на подписание
|
|
486
432
|
*/
|
|
487
433
|
async readPrivateKeyDepositsign(userId, getCerts = false) {
|
|
488
|
-
|
|
434
|
+
var deposit = this.KSPs.find(ksp => ksp.id === "depositsign");
|
|
435
|
+
return await this.readPrivateKeyKSP(userId, deposit, getCerts);
|
|
489
436
|
}
|
|
490
437
|
|
|
491
438
|
/**
|
|
@@ -493,7 +440,8 @@ export default class DigitalSignature {
|
|
|
493
440
|
* @param {boolean?} getCerts - Получать информацию о ключе пользователя. Это приведёт к дополнительному запросу на подписание
|
|
494
441
|
*/
|
|
495
442
|
async readPrivateKeyDiia(getCerts = false) {
|
|
496
|
-
|
|
443
|
+
var diia = this.KSPs.find(ksp => ksp.id === "diia-sign");
|
|
444
|
+
return await this.readPrivateKeyKSP(null, diia, getCerts);
|
|
497
445
|
}
|
|
498
446
|
|
|
499
447
|
/**
|
|
@@ -502,14 +450,14 @@ export default class DigitalSignature {
|
|
|
502
450
|
* @param {string?} userId - Идентификатор пользователя
|
|
503
451
|
* @param {boolean?} getCerts - Получать информацию о ключе пользователя. Это приведёт к дополнительному запросу на подписание
|
|
504
452
|
*/
|
|
505
|
-
async readPrivateKeyKSP(ksp, userId, getCerts = false) {
|
|
453
|
+
async readPrivateKeyKSP(ksp, userId, getCerts = false, keyId) {
|
|
506
454
|
await this.setLibraryType(DigitalSignatureKeyType.KSP);
|
|
507
455
|
|
|
508
456
|
if (ksp.ksp === EndUserConstants.EU_KSP_DIIA) {
|
|
509
|
-
await this._diiaCheckAccess();
|
|
457
|
+
await this._diiaCheckAccess(ksp);
|
|
510
458
|
}
|
|
511
459
|
|
|
512
|
-
const ownerInfo = await this._euSign.ReadPrivateKeyKSP(userId, ksp.name, getCerts);
|
|
460
|
+
const ownerInfo = await this._euSign.ReadPrivateKeyKSP(userId, ksp.name, getCerts, keyId);
|
|
513
461
|
if (getCerts && !ownerInfo) {
|
|
514
462
|
throw {
|
|
515
463
|
code: EndUserError.EU_ERROR_KEY_MEDIAS_READ_FAILED,
|
|
@@ -547,7 +495,7 @@ export default class DigitalSignature {
|
|
|
547
495
|
* @returns {KSPSettings[]} Список поддержирживаемых облачных провайдеров
|
|
548
496
|
*/
|
|
549
497
|
get KSPs() {
|
|
550
|
-
return this.
|
|
498
|
+
return this._glSign.KSPs;
|
|
551
499
|
}
|
|
552
500
|
|
|
553
501
|
/**
|
|
@@ -609,7 +557,7 @@ export default class DigitalSignature {
|
|
|
609
557
|
signType = new EndUserSignContainerInfo();
|
|
610
558
|
signType.type = EndUserConstants.EndUserSignContainerType.CAdES;
|
|
611
559
|
signType.subType = EndUserConstants.EndUserCAdESType.Enveloped;
|
|
612
|
-
} else if (
|
|
560
|
+
} else if (isDefaultValue(signType)) {
|
|
613
561
|
// По умолчанию создаётся подпись CAdES Detached
|
|
614
562
|
signType = new EndUserSignContainerInfo();
|
|
615
563
|
signType.type = EndUserConstants.EndUserSignContainerType.CAdES;
|
|
@@ -777,9 +725,9 @@ export default class DigitalSignature {
|
|
|
777
725
|
*/
|
|
778
726
|
async verifyHash(hash, sign, signIndex) {
|
|
779
727
|
if (!Number.isInteger(signIndex)) {
|
|
780
|
-
signIndex =
|
|
728
|
+
signIndex = -1;
|
|
781
729
|
}
|
|
782
|
-
return await this._euSign.VerifyHash(hash, sign, signIndex);
|
|
730
|
+
return await this._euSign.VerifyHash(hash.val || hash, sign.val || sign, signIndex);
|
|
783
731
|
}
|
|
784
732
|
|
|
785
733
|
/**
|
|
@@ -808,7 +756,7 @@ export default class DigitalSignature {
|
|
|
808
756
|
const result = [];
|
|
809
757
|
for (let i = 0; i < signs.length; i++) {
|
|
810
758
|
const sign = signs[i];
|
|
811
|
-
let signInfo = await this.verifyData(data[i], sign);
|
|
759
|
+
let signInfo = await this.verifyData(data[i].val || data[i], sign.val || sign);
|
|
812
760
|
if (Array.isArray(signInfo)) {
|
|
813
761
|
signInfo = signInfo[signInfo.length - 1];
|
|
814
762
|
}
|
|
@@ -825,7 +773,7 @@ export default class DigitalSignature {
|
|
|
825
773
|
}
|
|
826
774
|
return result;
|
|
827
775
|
} else {
|
|
828
|
-
let signInfo = await this.verifyData(data, signs);
|
|
776
|
+
let signInfo = await this.verifyData(data.val || data, signs.val || signs);
|
|
829
777
|
if (Array.isArray(signInfo)) {
|
|
830
778
|
signInfo = signInfo[signInfo.length - 1];
|
|
831
779
|
}
|
|
@@ -844,20 +792,11 @@ export default class DigitalSignature {
|
|
|
844
792
|
|
|
845
793
|
/**
|
|
846
794
|
* Выполнить подписание с проверкой подписи
|
|
847
|
-
* @param {string | NamedData} fileUrl - ссылка на загрузку файла для подписания
|
|
848
|
-
* @param {
|
|
795
|
+
* @param {string | NamedData | Array<string> | Array<NamedData>} fileUrl - ссылка на загрузку файла для подписания
|
|
796
|
+
* @param {EndUserSignContainerInfo?} signType - Тип подписи
|
|
849
797
|
*/
|
|
850
|
-
async signFileEx(fileUrl,
|
|
851
|
-
|
|
852
|
-
let data = await downloadData(isNamedData ? fileUrl.val : fileUrl, "binary");
|
|
853
|
-
if (isNamedData) {
|
|
854
|
-
data = {name: fileUrl.name, val: data};
|
|
855
|
-
}
|
|
856
|
-
if (hash) {
|
|
857
|
-
return await this.signHashEx(data);
|
|
858
|
-
} else {
|
|
859
|
-
return await this.signDataEx(data, false);
|
|
860
|
-
}
|
|
798
|
+
async signFileEx(fileUrl, signType) {
|
|
799
|
+
return await downloadAndSignFiles(fileUrl, async (data) => await this.signDataEx(data, signType));
|
|
861
800
|
}
|
|
862
801
|
|
|
863
802
|
/**
|
|
@@ -865,19 +804,44 @@ export default class DigitalSignature {
|
|
|
865
804
|
* @param {string | NamedData} hash - хеш для подписания
|
|
866
805
|
*/
|
|
867
806
|
async signHashEx(hash) {
|
|
868
|
-
const
|
|
869
|
-
|
|
870
|
-
|
|
871
|
-
|
|
872
|
-
|
|
873
|
-
|
|
874
|
-
|
|
875
|
-
|
|
876
|
-
|
|
877
|
-
|
|
878
|
-
|
|
807
|
+
const signs = await this.signHash(hash);
|
|
808
|
+
|
|
809
|
+
if (Array.isArray(hash)) {
|
|
810
|
+
const result = [];
|
|
811
|
+
for (let i = 0; i < signs.length; i++) {
|
|
812
|
+
const sign = signs[i];
|
|
813
|
+
let signInfo = await this.verifyHash(hash[i].val || hash[i], sign.val || sign);
|
|
814
|
+
if (Array.isArray(signInfo)) {
|
|
815
|
+
signInfo = signInfo[signInfo.length - 1];
|
|
816
|
+
}
|
|
817
|
+
result[i] = {
|
|
818
|
+
Success: true,
|
|
819
|
+
Sign: sign.val || sign,
|
|
820
|
+
SignatureInfo: {
|
|
821
|
+
Success: true,
|
|
822
|
+
DateTimeStr: signInfo.timeInfo.time,
|
|
823
|
+
Signer: signInfo.ownerInfo.subjCN,
|
|
824
|
+
OwnerInfo: signInfo.ownerInfo
|
|
825
|
+
}
|
|
826
|
+
};
|
|
879
827
|
}
|
|
880
|
-
|
|
828
|
+
return result;
|
|
829
|
+
} else {
|
|
830
|
+
let signInfo = await this.verifyHash(hash.val || hash, signs.val || signs);
|
|
831
|
+
if (Array.isArray(signInfo)) {
|
|
832
|
+
signInfo = signInfo[signInfo.length - 1];
|
|
833
|
+
}
|
|
834
|
+
return {
|
|
835
|
+
Success: true,
|
|
836
|
+
Sign: signs.val || signs,
|
|
837
|
+
SignatureInfo: {
|
|
838
|
+
Success: true,
|
|
839
|
+
DateTimeStr: signInfo.timeInfo.time,
|
|
840
|
+
Signer: signInfo.ownerInfo.subjCN,
|
|
841
|
+
OwnerInfo: signInfo.ownerInfo
|
|
842
|
+
}
|
|
843
|
+
};
|
|
844
|
+
}
|
|
881
845
|
}
|
|
882
846
|
|
|
883
847
|
/**
|
|
@@ -938,7 +902,7 @@ export default class DigitalSignature {
|
|
|
938
902
|
* @param {boolean} toLocalStorage - Будет ли ключ сохранён после закрытия вкладки
|
|
939
903
|
*/
|
|
940
904
|
async storePrivateKeyInfo(privateKeyInfo, toLocalStorage) {
|
|
941
|
-
if (privateKeyInfo.ksp && privateKeyInfo.ksp.
|
|
905
|
+
if (privateKeyInfo.ksp && privateKeyInfo.ksp.needQRCode) {
|
|
942
906
|
return;
|
|
943
907
|
}
|
|
944
908
|
|
|
@@ -1015,8 +979,8 @@ export default class DigitalSignature {
|
|
|
1015
979
|
*/
|
|
1016
980
|
async removeStoredPrivateKeyInfo(keyId) {
|
|
1017
981
|
if (keyId === undefined) {
|
|
1018
|
-
localStorage.removeItem(this._userId +
|
|
1019
|
-
sessionStorage.removeItem(this._userId +
|
|
982
|
+
localStorage.removeItem(this._userId + PRIVATE_KEY_INFO);
|
|
983
|
+
sessionStorage.removeItem(this._userId + PRIVATE_KEY_INFO);
|
|
1020
984
|
}
|
|
1021
985
|
else {
|
|
1022
986
|
const localStoredKeys = await this.getPrivateKeyInfoFromStorage(true);
|
|
@@ -1028,7 +992,7 @@ export default class DigitalSignature {
|
|
|
1028
992
|
if (keyIndex > -1) {
|
|
1029
993
|
keys.splice(keyIndex, 1);
|
|
1030
994
|
const data = await this._euSignFile.ProtectDataByPassword(JSON.stringify(keys), "", true);
|
|
1031
|
-
storage[this._userId +
|
|
995
|
+
storage[this._userId + PRIVATE_KEY_INFO] = data;
|
|
1032
996
|
}
|
|
1033
997
|
}
|
|
1034
998
|
}
|
|
@@ -1071,11 +1035,11 @@ export default class DigitalSignature {
|
|
|
1071
1035
|
/**
|
|
1072
1036
|
* Проверка доступности Дiя
|
|
1073
1037
|
*/
|
|
1074
|
-
async _diiaCheckAccess() {
|
|
1038
|
+
async _diiaCheckAccess(ksp) {
|
|
1075
1039
|
const diia = "DIIA";
|
|
1076
1040
|
if (sessionStorage[diia] != "+") {
|
|
1077
1041
|
try {
|
|
1078
|
-
sessionStorage[diia] = await downloadData(new URL(
|
|
1042
|
+
sessionStorage[diia] = await downloadData(new URL(ksp.address).origin + "/diia");
|
|
1079
1043
|
} catch {
|
|
1080
1044
|
throw {
|
|
1081
1045
|
code: EndUserError.EU_ERROR_TRANSMIT_REQUEST,
|
package/src/GlSign.js
CHANGED
|
@@ -1,4 +1,7 @@
|
|
|
1
1
|
/* eslint-disable no-magic-numbers */
|
|
2
|
+
|
|
3
|
+
import { getDefaultKSPs } from "./Models";
|
|
4
|
+
|
|
2
5
|
/**
|
|
3
6
|
* ПГУ GlSign
|
|
4
7
|
*/
|
|
@@ -68,6 +71,19 @@ export default class GlSign {
|
|
|
68
71
|
this.AgentSignWeb = this._getZoneValue(settingArray, 21) === "+";
|
|
69
72
|
this.TestCAConnection = this._getZoneValue(settingArray, 22) === "+";
|
|
70
73
|
this.DontSaveToRegistry = this._getZoneValue(settingArray, 23) === "+";
|
|
74
|
+
|
|
75
|
+
var ksps = this._getZoneValue(settingArray, 24);
|
|
76
|
+
if (!ksps) {
|
|
77
|
+
this.KSPs = getDefaultKSPs();
|
|
78
|
+
} else {
|
|
79
|
+
ksps = Buffer.from(ksps, "base64").toString();
|
|
80
|
+
this.KSPs = JSON.parse(ksps);
|
|
81
|
+
if (this.KSPs.length === 0)
|
|
82
|
+
{
|
|
83
|
+
this.KSPs = getDefaultKSPs();
|
|
84
|
+
}
|
|
85
|
+
console.log(Buffer.from(JSON.stringify(this.KSPs)).toString("base64"));
|
|
86
|
+
}
|
|
71
87
|
}
|
|
72
88
|
_getZoneValue(zones, zone) {
|
|
73
89
|
if (zones.length >= zone) {
|
package/src/Models.js
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
|
-
import { EndUserCertificate, EndUserError, EndUserOwnerInfo, EndUserConstants } from "../euscp/euscp";
|
|
1
|
+
import { EndUserCertificate, EndUserError, EndUserOwnerInfo, EndUserConstants, KSPSettings } from "../euscp/euscp";
|
|
2
2
|
import GlSign from "./GlSign";
|
|
3
3
|
import { downloadData, byteArrayToBase64, base64ToByteArray, signAlgoToHashAlgo, getSupportedSignAlgos } from "./Utils";
|
|
4
4
|
|
|
5
|
-
const LIBRARY_VERSION = "1.3.
|
|
5
|
+
const LIBRARY_VERSION = "1.3.54";
|
|
6
6
|
|
|
7
7
|
/**
|
|
8
8
|
* Параметры библиотеки электронной подписи
|
|
@@ -279,6 +279,26 @@ export const DigitalSignatureKeyType = {
|
|
|
279
279
|
KSP: DigitalSignatureKeyTypeKSP,
|
|
280
280
|
};
|
|
281
281
|
|
|
282
|
+
export const EU_KSP_GRYADA = -1;
|
|
283
|
+
export const EU_KSP_IIT = 4;
|
|
284
|
+
export const EU_KSP_PB = 6;
|
|
285
|
+
export const EU_KSP_DIIA = 7;
|
|
286
|
+
|
|
287
|
+
export const EndUserKSP = {
|
|
288
|
+
IIT: EU_KSP_IIT,
|
|
289
|
+
PB: EU_KSP_PB,
|
|
290
|
+
DIIA: EU_KSP_DIIA,
|
|
291
|
+
GRYADA: EU_KSP_GRYADA
|
|
292
|
+
}
|
|
293
|
+
|
|
294
|
+
export const EndUserKSPClientIdType = {
|
|
295
|
+
Default: 0,
|
|
296
|
+
Name: 1,
|
|
297
|
+
Phone: 2,
|
|
298
|
+
Email: 3,
|
|
299
|
+
NamePassword: -1
|
|
300
|
+
}
|
|
301
|
+
|
|
282
302
|
export class PrivateKeyInfo {
|
|
283
303
|
/**
|
|
284
304
|
* @param {number} keyType - Тип ключа
|
|
@@ -409,3 +429,70 @@ export class KspPrivateKeyInfo extends PrivateKeyInfo {
|
|
|
409
429
|
this.ksp = ksp;
|
|
410
430
|
}
|
|
411
431
|
}
|
|
432
|
+
|
|
433
|
+
export function getDefaultKSPs() {
|
|
434
|
+
const depositsign = new KSPSettings();
|
|
435
|
+
depositsign.id = "depositsign";
|
|
436
|
+
depositsign.name = "DepositSign";
|
|
437
|
+
depositsign.ksp = EndUserConstants.EU_KSP_IIT;
|
|
438
|
+
depositsign.address = "https://depositsign.com/api/v1/it-enterprise/sign-server";
|
|
439
|
+
depositsign.directAccess = true;
|
|
440
|
+
depositsign.needQRCode = false;
|
|
441
|
+
|
|
442
|
+
const diia = new KSPSettings();
|
|
443
|
+
diia.id = "diia-sign";
|
|
444
|
+
diia.name = "Дія.Підпис";
|
|
445
|
+
diia.ksp = EndUserConstants.EU_KSP_DIIA;
|
|
446
|
+
diia.directAccess = true;
|
|
447
|
+
diia.mobileAppName = "Дія";
|
|
448
|
+
diia.address = "https://diia-sign.it.ua/KSPSign";
|
|
449
|
+
diia.systemId = "diia-sign-it-ent";
|
|
450
|
+
diia.needQRCode = true;
|
|
451
|
+
|
|
452
|
+
const smartId = new KSPSettings();
|
|
453
|
+
smartId.id = "pb-smartid";
|
|
454
|
+
smartId.name = "Приватбанк - хмарний підпис \"SmartID\"";
|
|
455
|
+
smartId.ksp = EndUserConstants.EU_KSP_PB;
|
|
456
|
+
smartId.directAccess = true;
|
|
457
|
+
smartId.mobileAppName = "Приват24";
|
|
458
|
+
smartId.address = "https://acsk.privatbank.ua/cloud/api/back/";
|
|
459
|
+
smartId.clientIdPrefix = "IEIS_";
|
|
460
|
+
smartId.confirmationURL = "https://www.privat24.ua/rd/kep";
|
|
461
|
+
smartId.needQRCode = true;
|
|
462
|
+
|
|
463
|
+
const vchasno = new KSPSettings();
|
|
464
|
+
vchasno.id = "vchasno";
|
|
465
|
+
vchasno.name = "Вчасно - хмарний підпис";
|
|
466
|
+
vchasno.ksp = EndUserConstants.EU_KSP_IIT;
|
|
467
|
+
vchasno.address = "https://cs.vchasno.ua/ss/";
|
|
468
|
+
vchasno.directAccess = true;
|
|
469
|
+
vchasno.needQRCode = false;
|
|
470
|
+
|
|
471
|
+
const cloudKey = new KSPSettings();
|
|
472
|
+
cloudKey.id = "cloudkey";
|
|
473
|
+
cloudKey.name = "ТОВ «ЦСК «Україна» - хмарний підпис CloudKey";
|
|
474
|
+
cloudKey.ksp = EndUserConstants.EU_KSP_PB;
|
|
475
|
+
cloudKey.directAccess = true;
|
|
476
|
+
cloudKey.mobileAppName = "CloudKey";
|
|
477
|
+
cloudKey.address = "https://sid.uakey.com.ua/smartid/iit/";
|
|
478
|
+
cloudKey.clientIdPrefix = "DIIA_2";
|
|
479
|
+
cloudKey.confirmationURL = "https://sid.uakey.com.ua/kep?hash=rd/kep";
|
|
480
|
+
cloudKey.needQRCode = true;
|
|
481
|
+
|
|
482
|
+
const esign = new KSPSettings();
|
|
483
|
+
esign.id = "esign";
|
|
484
|
+
esign.name = "ESign - хмарний підпис";
|
|
485
|
+
esign.ksp = EndUserConstants.EU_KSP_IIT;
|
|
486
|
+
esign.address = "https://cabinet.e-life.com.ua/api/EDG/Sign";
|
|
487
|
+
esign.directAccess = true;
|
|
488
|
+
esign.needQRCode = false;
|
|
489
|
+
|
|
490
|
+
return [
|
|
491
|
+
depositsign,
|
|
492
|
+
diia,
|
|
493
|
+
smartId,
|
|
494
|
+
vchasno,
|
|
495
|
+
cloudKey,
|
|
496
|
+
esign
|
|
497
|
+
];
|
|
498
|
+
}
|