@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/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@it-enterprise/digital-signature",
3
- "version": "1.2.1",
3
+ "version": "1.2.3",
4
4
  "description": "digital signature",
5
5
  "private": false,
6
6
  "main": "src/index.js",
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
- export const DigitalSignatureLibraryTypeJS = 0;
88
+ const DigitalSignatureLibraryTypeJS = 0;
84
89
  /** Подпись аппартными ключами */
85
- export const DigitalSignatureLibraryTypeSW = 1;
90
+ const DigitalSignatureLibraryTypeSW = 1;
86
91
  /**
87
92
  * Типы библиотеки
88
93
  */
89
- export const DigitalSignatureLibraryType = {
94
+ enum DigitalSignatureLibraryType = {
90
95
  /** Подпись файловыми ключами и через облачные сервисы */
91
96
  JS: DigitalSignatureLibraryTypeJS,
92
97
  /** Подпись аппартными ключами */
93
98
  SW: DigitalSignatureLibraryTypeSW
94
99
  };
95
100
 
96
- await ds.setLibraryType(type);
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
@@ -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
- const depositsign = new KSPSettings();
35
- depositsign.name = "DepositSign";
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
- return await this.readPrivateKeyKSP(userId, this._KSPs.depositsign, getCerts);
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
- return await this.readPrivateKeyKSP(null, this.KSPs.diia, getCerts);
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._KSPs.asArray();
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 (typeof signType != "object") {
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 = 0;
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 {boolean} hash - подписывать хеш
795
+ * @param {string | NamedData | Array<string> | Array<NamedData>} fileUrl - ссылка на загрузку файла для подписания
796
+ * @param {EndUserSignContainerInfo?} signType - Тип подписи
849
797
  */
850
- async signFileEx(fileUrl, hash) {
851
- const isNamedData = typeof fileUrl === "object";
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 isNamedData = typeof hash === "object";
869
- const signature = await this.signHash(isNamedData ? hash.val : hash);
870
- const signatureInfo = await this.verifyHash(isNamedData ? hash.val : hash, isNamedData ? signature.val : signature);
871
- return {
872
- Success: true,
873
- Sign: isNamedData ? signature.val : signature,
874
- SignatureInfo: {
875
- Success: true,
876
- DateTimeStr: signatureInfo.timeInfo.time,
877
- Signer: signatureInfo.ownerInfo.subjCN,
878
- OwnerInfo: signatureInfo.ownerInfo
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.needQrcode) {
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 + this.PRIVATE_KEY_INFO);
1019
- sessionStorage.removeItem(this._userId + this.PRIVATE_KEY_INFO);
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 + this.PRIVATE_KEY_INFO] = data;
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(this._KSPs.diia.address).origin + "/diia");
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.53";
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
+ }