@it-enterprise/digital-signature 1.1.3 → 1.1.7

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.1.3",
3
+ "version": "1.1.7",
4
4
  "description": "digital signature",
5
5
  "private": false,
6
6
  "main": "src/index.js",
package/readme.md CHANGED
@@ -102,6 +102,7 @@ import auth from '@it-enterprise/jwtauthentication';
102
102
  const ds = new DigitalSignature(
103
103
  new Models.GraphQlSettingProvider(
104
104
  "uk", // Язык ошибок
105
+ userId, // id пользователя (для сохранения ключей и предпочитаемого типа ключа)
105
106
  "https://m.it.ua/GraphQlServer/", // Адрес сервера GraphQl
106
107
  "https://m.it.ua/ws/", // Адрес веб-сервисов
107
108
  auth) // Библиотека @it-enterprise/jwtauthentication
@@ -115,6 +116,7 @@ await ds.initialise();
115
116
  const ds = new DigitalSignature(
116
117
  new Models.DefaultSettingProvider(
117
118
  "uk", // Язык ошибок
119
+ userId, // id пользователя (для сохранения ключей и предпочитаемого типа ключа)
118
120
  location.pathname + "api/ds/", // Путь к API ЕЦП
119
121
  glSign) // Значение глобального параметра GlSign в виде строки или обьекта Models.GlSign
120
122
  );
@@ -211,11 +213,21 @@ const keyInfo = await ds.readPrivateKeySIM(
211
213
  Считывание ключа
212
214
 
213
215
  ```javascript
214
- const depositSign = ds.KSPs[0];
215
- const keyInfo = await ds.readPrivateKeyKSP(
216
+ const keyInfo = await ds.readPrivateKeyDepositsign(
216
217
  // Идентификатор пользователя (номер телефона или email)
217
218
  phone,
218
- depositSign,
219
+ // Получать информацию о сертификатах пользователя.
220
+ // true - поля ownerInfo и certificates будут заполены, но пользователь получит дополнительный запрос на подписание
221
+ // false - поля ownerInfo и certificates будут пустыми, но пользователь не получит дополнительный запрос на подписание
222
+ false);
223
+ ```
224
+
225
+ # Дiя
226
+
227
+ Считывание ключа
228
+
229
+ ```javascript
230
+ const keyInfo = await ds.readPrivateKeyDiia(
219
231
  // Получать информацию о сертификатах пользователя.
220
232
  // true - поля ownerInfo и certificates будут заполены, но пользователь получит дополнительный запрос на подписание
221
233
  // false - поля ownerInfo и certificates будут пустыми, но пользователь не получит дополнительный запрос на подписание
@@ -228,8 +240,6 @@ const keyInfo = await ds.readPrivateKeyKSP(
228
240
 
229
241
  ```javascript
230
242
  await ds.storePrivateKeyInfo(
231
- // Идентификатор пользователя
232
- userId,
233
243
  // Информация о ключе
234
244
  privateKeyInfo,
235
245
  // Будет ли ключ сохранён после закрытия вкладки
@@ -240,8 +250,6 @@ await ds.storePrivateKeyInfo(
240
250
 
241
251
  ```javascript
242
252
  const keyInfo = await ds.getStoredPrivateKeyInfo(
243
- // Идентификатор пользователя
244
- userId,
245
253
  // Тип ключа (необязательно)
246
254
  keyType
247
255
  ```
@@ -250,8 +258,6 @@ const keyInfo = await ds.getStoredPrivateKeyInfo(
250
258
 
251
259
  ```javascript
252
260
  await ds.removeStoredPrivateKeyInfo(
253
- // Идентификатор пользователя
254
- userId,
255
261
  // Идентификатор ключа (необязательно)
256
262
  keyId
257
263
  ```
@@ -49,6 +49,14 @@ export default class DigitalSignature {
49
49
  this._readedKey = null;
50
50
  }
51
51
 
52
+ get PRIVATE_KEY_TYPE() {
53
+ return "_PrivateKeyType";
54
+ }
55
+
56
+ get PRIVATE_KEY_INFO() {
57
+ return "_PrivateKeyInfo";
58
+ }
59
+
52
60
  /**
53
61
  * Считанный приватный ключ
54
62
  * @type {PrivateKeyInfo}
@@ -70,7 +78,6 @@ export default class DigitalSignature {
70
78
  * @param {number} type
71
79
  */
72
80
  async setLibraryType(type) {
73
-
74
81
  if (this._euSign) {
75
82
  await this._euSign.ResetPrivateKey();
76
83
  }
@@ -84,6 +91,10 @@ export default class DigitalSignature {
84
91
  break;
85
92
  }
86
93
 
94
+ if (type != null && type != undefined) {
95
+ this._preferredKeyType = type;
96
+ }
97
+
87
98
  await this.initialise();
88
99
  this.keyType = type;
89
100
  }
@@ -93,6 +104,7 @@ export default class DigitalSignature {
93
104
  * @returns {Promise<number>} Текущий тип библиотеки
94
105
  */
95
106
  async initialise() {
107
+
96
108
  if (!this._glSign) {
97
109
  this._glSign = await Promise.resolve(this._settingsProvider.getGlSign());
98
110
  }
@@ -111,7 +123,7 @@ export default class DigitalSignature {
111
123
 
112
124
  if (!this._euSign) {
113
125
  this._euSign = this._glSign.PreferHarware ? this._euSignKeyMedia : this._euSignFile;
114
- this.keyType = this._glSign.PreferHarware ? DigitalSignatureKeyType.Token : DigitalSignatureKeyType.File;
126
+ this.keyType = this._glSign.PreferHarware ? DigitalSignatureKeyType.Token : this._preferredKeyType;
115
127
  }
116
128
 
117
129
  const euSign = this._euSign;
@@ -174,38 +186,43 @@ export default class DigitalSignature {
174
186
  return this.getLibraryType();
175
187
  }
176
188
 
177
- const certificates = await this._settings.certificatesProvider.loadCertificates();
178
-
179
- const euSettings = {
180
- language: this._settings.language,
181
- encoding: "UTF-16LE",
182
- httpProxyServiceURL: this._settings.httpProxyServiceURL,
183
- directAccess: true,
184
- CAs: certificates.CAs,
185
- CACertificates: certificates.CACertificates,
186
- mssServiceURL: this._settings.mssServiceURL,
187
- KSPs: this._KSPs,
188
- allowedKeyMediaTypes: [
189
- "е.ключ BIFIT iToken",
190
- "криптомод. ІІТ Гряда-61",
191
- "криптомод. ІІТ Гряда-301",
192
- "е.ключ ІІТ Алмаз-1К",
193
- "е.ключ ІІТ Кристал-1",
194
- "ID-карта громадянина (БЕН)",
195
- "е.ключ ІІТ Алмаз-1К (PKCS#11)",
196
- "е.ключ ІІТ Кристал-1 (PKCS#11)",
197
- "е.ключ чи смарт-карта Avest (PKCS#11)",
198
- "е.ключ Ефіт Key (PKCS#11)",
199
- "е.ключ чи смарт-карта Автор (PKCS#11)",
200
- "е.ключ чи смарт-карта Автор 338 (PKCS#11)",
201
- "смарт-карта Техноконс. TEllipse3 (PKCS#11)",
202
- "смарт-карта Техноконс. TEllipse",
203
- "смарт-карта Техноконс. TEllipse2/3",
204
- "е.ключ SafeNet iKey (PKCS#11, RSA)"
205
- ]
206
- };
189
+ if (!this._euSettings) {
190
+ const certificates = await this._settings.certificatesProvider.loadCertificates();
191
+
192
+ this._euSettings = {
193
+ language: this._settings.language,
194
+ encoding: "UTF-16LE",
195
+ httpProxyServiceURL: this._settings.httpProxyServiceURL,
196
+ directAccess: true,
197
+ CAs: certificates.CAs,
198
+ CACertificates: certificates.CACertificates,
199
+ mssServiceURL: this._settings.mssServiceURL,
200
+ KSPs: this._KSPs,
201
+ allowedKeyMediaTypes: [
202
+ "е.ключ BIFIT iToken",
203
+ "криптомод. ІІТ Гряда-61",
204
+ "криптомод. ІІТ Гряда-301",
205
+ "е.ключ ІІТ Алмаз-1К",
206
+ "е.ключ ІІТ Кристал-1",
207
+ "ID-карта громадянина (БЕН)",
208
+ "е.ключ ІІТ Алмаз-1К (PKCS#11)",
209
+ "е.ключ ІІТ Кристал-1 (PKCS#11)",
210
+ "е.ключ чи смарт-карта Avest (PKCS#11)",
211
+ "е.ключ Ефіт Key (PKCS#11)",
212
+ "е.ключ чи смарт-карта Автор (PKCS#11)",
213
+ "е.ключ чи смарт-карта Автор 338 (PKCS#11)",
214
+ "смарт-карта Техноконс. TEllipse3 (PKCS#11)",
215
+ "смарт-карта Техноконс. TEllipse",
216
+ "смарт-карта Техноконс. TEllipse2/3",
217
+ "е.ключ SafeNet iKey (PKCS#11, RSA)"
218
+ ]
219
+ };
220
+ }
207
221
 
208
- await euSign.Initialize(euSettings);
222
+ await euSign.Initialize(this._euSettings);
223
+ if (euSign === this._euSignKeyMedia && !await this._euSignFile.IsInitialized()) {
224
+ this._euSignFile.Initialize(this._euSettings);
225
+ }
209
226
  if (this._glSign.ApplyProxySettings) {
210
227
  const { UseProxy, ProxyAddress, ProxyPort, ProxyUser, ProxyPassword } = this._glSign;
211
228
  const proxy = new EndUserProxySettings();
@@ -217,10 +234,15 @@ export default class DigitalSignature {
217
234
  proxy.password = ProxyPassword;
218
235
  proxy.savePassword = true;
219
236
  await euSign.SetProxySettings(proxy);
237
+ if (euSign === this._euSignKeyMedia && !await this._euSignFile.IsInitialized()) {
238
+ this._euSignFile.SetProxySettings(proxy);
239
+ }
220
240
  }
221
241
 
222
242
  await euSign.SetRuntimeParameter(EndUserConstants.EU_SIGN_TYPE_PARAMETER, EndUserConstants.EndUserSignType.CAdES_X_Long);
223
-
243
+ if (euSign === this._euSignKeyMedia && !await this._euSignFile.IsInitialized()) {
244
+ this._euSignFile.SetRuntimeParameter(EndUserConstants.EU_SIGN_TYPE_PARAMETER, EndUserConstants.EndUserSignType.CAdES_X_Long);
245
+ }
224
246
  return this.getLibraryType();
225
247
  }
226
248
 
@@ -317,19 +339,49 @@ export default class DigitalSignature {
317
339
  return file.name.endsWith(".jks");
318
340
  }
319
341
 
342
+ /**
343
+ * Считать ключ с DepositSign
344
+ * @param {string} userId - Идентификатор пользователя
345
+ * @param {boolean?} getCerts - Получать информацию о ключе пользователя. Это приведёт к дополнительному запросу на подписание
346
+ */
347
+ async readPrivateKeyDepositsign(userId, getCerts = false) {
348
+ return await this.readPrivateKeyKSP(userId, this.KSPs[0], getCerts);
349
+ }
350
+
351
+ /**
352
+ * Считать ключ с Дiя
353
+ * @param {boolean?} getCerts - Получать информацию о ключе пользователя. Это приведёт к дополнительному запросу на подписание
354
+ */
355
+ async readPrivateKeyDiia(getCerts = false) {
356
+ const diia = "DIIA";
357
+ if (sessionStorage[diia] != "+") {
358
+ try {
359
+ sessionStorage[diia] = await downloadData(new URL(this.KSPs[1].address).origin + "/diia");
360
+ } catch {
361
+ throw {
362
+ message: this._resourses.DiiaError + `<a target="_blank" href="${window.origin}">${window.origin}</a></li><ul>`
363
+ };
364
+ }
365
+ }
366
+
367
+ return await this.readPrivateKeyKSP(null, this.KSPs[1], getCerts);
368
+ }
369
+
320
370
  /**
321
371
  * Считать ключ с облачного провайдера
322
372
  * @param {string} userId - Идентификатор пользователя
323
373
  * @param {string|KSPSettings} ksp - Идентификатор облачного провайдера
324
374
  * @param {boolean?} getCerts - Получать информацию о ключе пользователя. Это приведёт к дополнительному запросу на подписание
375
+ * @param {number?} keyType - Тип ключа
325
376
  */
326
377
  async readPrivateKeyKSP(userId, ksp, getCerts = false) {
327
- if (this._euSign != this._euSignFile) {
328
- await this.setLibraryType(DigitalSignatureKeyType.KSP);
329
- }
330
378
  if (ksp != EndUserConstants.EndUserKSP.DIIA && typeof ksp !== "string") {
331
379
  ksp = ksp.name;
332
380
  }
381
+ const keyType = ksp == "DepositSign" ? DigitalSignatureKeyType.Depositsign : ksp == "diia" ? DigitalSignatureKeyType.Diia : DigitalSignatureKeyType.KSP;
382
+ if (this._euSign != this._euSignFile) {
383
+ await this.setLibraryType(keyType);
384
+ }
333
385
  const ownerInfo = await this._euSign.ReadPrivateKeyKSP(userId, ksp, getCerts);
334
386
  if (getCerts && !ownerInfo) {
335
387
  throw {
@@ -337,7 +389,7 @@ export default class DigitalSignature {
337
389
  };
338
390
  }
339
391
  this._readedKey = new KspPrivateKeyInfo(
340
- DigitalSignatureKeyType.KSP,
392
+ keyType,
341
393
  ownerInfo,
342
394
  getCerts ? await this._euSign.GetOwnCertificates() : [],
343
395
  userId,
@@ -352,15 +404,14 @@ export default class DigitalSignature {
352
404
  * @param {EndUserConfirmKSPOperationEvent} data - Данные для идентификации (Qr-код, ссылка и тд.)
353
405
  */
354
406
  /**
355
- * Добавить коллбэк идентификации для приложения "ДiЯ"
407
+ * Добавить коллбэк идентификации для облачных провайдеров
356
408
  * @param {authenticationCallback} event - Коллбэк. Вызывается при запросе на подписание.
357
409
  */
358
410
  async addConfirmKSPOperationEventListener(event) {
359
- if (this._euSign != this._euSignFile) {
360
- await this.setLibraryType(DigitalSignatureKeyType.KSP);
361
- }
362
-
363
- await this._euSign.AddEventListener(EndUserConstants.EndUserEventType.ConfirmKSPOperation, event);
411
+ await this._euSignFile.AddEventListener(EndUserConstants.EndUserEventType.ConfirmKSPOperation, function(data) {
412
+ data.qrCode = "data:image/bmp;base64," + data.qrCode;
413
+ event(data);
414
+ });
364
415
  }
365
416
 
366
417
  /**
@@ -384,8 +435,7 @@ export default class DigitalSignature {
384
435
  */
385
436
  async resetPrivateKey() {
386
437
  await Promise.all([
387
- this._euSignFile.ResetPrivateKey(),
388
- this._euSignKeyMedia.ResetPrivateKey()
438
+ this._euSign.ResetPrivateKey()
389
439
  ]);
390
440
  this._readedKey = null;
391
441
  }
@@ -419,7 +469,7 @@ export default class DigitalSignature {
419
469
 
420
470
  /**
421
471
  * Подписать данные
422
- * @param {Uint8Array | string | Array<Uint8Array | string>} data - Данные для подписи. Можно передавать данные в массиве для наложения нескольких подписей за раз
472
+ * @param {Uint8Array | string | NamedeData | Array<Uint8Array | string | NamedeData>} data - Данные для подписи. Можно передавать данные в массиве для наложения нескольких подписей за раз
423
473
  * @param {boolean?} internal - Внутренняя или внешняя подпись
424
474
  * @param {boolean?} asByteArray - Возвращать подпись в виде массива байтов. По умолчанию подпись возвращается в виде строки в base64
425
475
  */
@@ -435,7 +485,7 @@ export default class DigitalSignature {
435
485
 
436
486
  /**
437
487
  * Подписать файл
438
- * @param {string | Array<string>} fileUrl - Ссылка на загрузку файла. Можно передавать несколько ссылок в массиве для наложения нескольких подписей за раз
488
+ * @param {string | NamedeData | Array<string | NamedeData>} fileUrl - Ссылка на загрузку файла. Можно передавать несколько ссылок в массиве для наложения нескольких подписей за раз
439
489
  * @param {boolean?} internal - Внутренняя или внешняя подпись
440
490
  * @param {boolean?} asByteArray - Возвращать подпись в виде массива байт. По умолчанию подпись возвращается в виде строки в base64
441
491
  */
@@ -446,18 +496,23 @@ export default class DigitalSignature {
446
496
  if (typeof asByteArray !== "boolean") {
447
497
  asByteArray = false;
448
498
  }
499
+ const isNamedData = Array.isArray(fileUrl) && fileUrl.every(url => typeof url === "object") || typeof fileUrl === "object";
449
500
  let data;
450
501
  if (Array.isArray(fileUrl)) {
451
- data = await Promise.all(fileUrl.map(url => downloadData(url, "binary")));
502
+ data = await Promise.all(fileUrl.map(function(url) {
503
+ const downloadedData = downloadData(isNamedData ? url.val : url, "binary");
504
+ return isNamedData ? {name: url.name, val: downloadedData} : downloadedData;
505
+ }));
452
506
  } else {
453
- data = await downloadData(fileUrl, "binary");
507
+ const downloadedData = await downloadData(isNamedData ? fileUrl.val : fileUrl, "binary");
508
+ data = isNamedData ? {name: fileUrl.name, val: downloadedData} : downloadedData;
454
509
  }
455
510
  return await this.signData(data, internal, asByteArray);
456
511
  }
457
512
 
458
513
  /**
459
514
  * Подписать хеш
460
- * @param {Uint8Array | string | Array<Uint8Array | string>} hash - Хеш файла. Можно передавать несколько хешей в массиве для наложения нескольких подписей за раз
515
+ * @param {Uint8Array | string | NamedData | Array<Uint8Array | string> | NamedData} hash - Хеш файла. Можно передавать несколько хешей в массиве для наложения нескольких подписей за раз
461
516
  * @param {boolean?} asByteArray - Возвращать подпись в виде массива байт. По умолчанию подпись возвращается в виде строки в base64
462
517
  */
463
518
  async signHash(hash, asByteArray) {
@@ -469,18 +524,23 @@ export default class DigitalSignature {
469
524
 
470
525
  /**
471
526
  * Подписать хеш из файла
472
- * @param {string | Array<string>} hashUrl - Ссылка на скачивание хеша. Можно передавать несколько ссылок в массиве для наложения нескольких подписей за раз
527
+ * @param {string | NamedData | Array<string | NamedData>} hashUrl - Ссылка на скачивание хеша. Можно передавать несколько ссылок в массиве для наложения нескольких подписей за раз
473
528
  * @param {boolean?} asByteArray - Возвращать подпись в виде массива байт. По умолчанию подпись возвращается в виде строки в base64
474
529
  */
475
530
  async signFileHash(hashUrl, asByteArray) {
476
531
  if (typeof asByteArray !== "boolean") {
477
532
  asByteArray = false;
478
533
  }
534
+ const isNamedData = Array.isArray(hashUrl) && hashUrl.every(url => typeof url === "object") || typeof hashUrl === "object";
479
535
  let hash;
480
536
  if (Array.isArray(hashUrl)) {
481
- hash = await Promise.all(hashUrl.map(url => downloadData(url, "binary")));
537
+ hash = await Promise.all(hashUrl.map(function(url) {
538
+ const downloadedData = downloadData(isNamedData ? url.val : url, "binary");
539
+ return isNamedData ? {name: url.name, val: downloadedData} : downloadedData;
540
+ }));
482
541
  } else {
483
- hash = await downloadData(hashUrl, "binary");
542
+ const downloadedData = await downloadData(hashUrl, "binary");
543
+ hash = isNamedData ? {name: hashUrl.name, val: downloadedData} : downloadedData;
484
544
  }
485
545
  return await this.signHash(hash, asByteArray);
486
546
  }
@@ -563,22 +623,27 @@ export default class DigitalSignature {
563
623
 
564
624
  /**
565
625
  * Выполнить подписание данных с проверкой подписи
566
- * @param {Uint8Array | string} data - данные для подписи
626
+ * @param {Uint8Array | string | NamedData} data - данные для подписи
567
627
  * @param {boolean?} internal - Накладывать внутреннюю или внешнюю подпись. По умолчанию накладывается внешняя.
568
628
  */
569
629
  async signDataEx(data, internal) {
570
630
  if (typeof internal !== "boolean") {
571
631
  internal = false;
572
632
  }
573
-
633
+ const isNamedData = typeof data === "object" && !(data instanceof Uint8Array);
574
634
  if (!internal) {
575
- data = await this._euSign.HashData(this._readedKey.getHashAlgo(), data, false);
635
+ const hashedData = await this._euSign.HashData(this._readedKey.getHashAlgo(), isNamedData ? data.val : data, false);
636
+ if(isNamedData) {
637
+ data.val = hashedData;
638
+ } else {
639
+ data = hashedData;
640
+ }
576
641
  }
577
642
  const signature = internal ? await this.signData(data, internal) : await this.signHash(data);
578
- const signatureInfo = internal ? await this.verifyDataInternal(signature, 0) : await this.verifyHash(data, signature);
643
+ const signatureInfo = internal ? await this.verifyDataInternal(isNamedData ? signature.val : signature, 0) : await this.verifyHash(isNamedData ? data.val : data, isNamedData ? signature.val : signature);
579
644
  return {
580
645
  Success: true,
581
- Sign: signature,
646
+ Sign: isNamedData ? signature.val : signature,
582
647
  SignatureInfo: {
583
648
  Success: true,
584
649
  DateTimeStr: signatureInfo.timeInfo.time,
@@ -590,19 +655,23 @@ export default class DigitalSignature {
590
655
 
591
656
  /**
592
657
  * Выполнить подписание с проверкой подписи
593
- * @param {string} fileUrl - ссылка на загрузку файла для подписания
658
+ * @param {string | NamedData} fileUrl - ссылка на загрузку файла для подписания
594
659
  * @param {boolean} hash - подписывать хеш
595
660
  */
596
661
  async signFileEx(fileUrl, hash) {
597
- let data = await downloadData(fileUrl, "binary");
662
+ const isNamedData = typeof fileUrl === "object";
663
+ let data = await downloadData(isNamedData ? fileUrl.val : fileUrl, "binary");
598
664
  if(!hash) {
599
665
  data = await this._euSign.HashData(this._readedKey.getHashAlgo(), data, false);
666
+ if(isNamedData) {
667
+ data = {name: fileUrl.name, val: data};
668
+ }
600
669
  }
601
670
  const signature = await this.signHash(data);
602
- const signatureInfo = await this.verifyHash(data, signature);
671
+ const signatureInfo = await this.verifyHash(isNamedData ? data.val : data, isNamedData ? signature.val : signature);
603
672
  return {
604
673
  Success: true,
605
- Sign: signature,
674
+ Sign: isNamedData ? signature.val : signature,
606
675
  SignatureInfo: {
607
676
  Success: true,
608
677
  DateTimeStr: signatureInfo.timeInfo.time,
@@ -614,14 +683,15 @@ export default class DigitalSignature {
614
683
 
615
684
  /**
616
685
  * Выполнить подписание хеша с проверкой подписи
617
- * @param {string} hash - хеш для подписания
686
+ * @param {string | NamedData} hash - хеш для подписания
618
687
  */
619
688
  async signHashEx(hash) {
620
- const signature = await this.signHash(hash);
621
- const signatureInfo = await this.verifyHash(hash, signature);
689
+ const isNamedData = typeof hash === "object";
690
+ const signature = await this.signHash(isNamedData ? hash.val : hash);
691
+ const signatureInfo = await this.verifyHash(isNamedData ? hash.val : hash, isNamedData ? signature.val : signature);
622
692
  return {
623
693
  Success: true,
624
- Sign: signature,
694
+ Sign: isNamedData ? signature.val : signature,
625
695
  SignatureInfo: {
626
696
  Success: true,
627
697
  DateTimeStr: signatureInfo.timeInfo.time,
@@ -685,47 +755,46 @@ export default class DigitalSignature {
685
755
 
686
756
  /**
687
757
  * Сохранить ключ
688
- * @param {string} userId - id пользователя
689
758
  * @param {PrivateKeyInfo} privateKeyInfo - Ключ
690
759
  * @param {boolean} toLocalStorage - Будет ли ключ сохранён после закрытия вкладки
691
760
  */
692
- async storePrivateKeyInfo(userId, privateKeyInfo, toLocalStorage) {
693
- if(privateKeyInfo.ksp && privateKeyInfo.ksp == EndUserConstants.EndUserKSP.DIIA) {
761
+ async storePrivateKeyInfo(privateKeyInfo, toLocalStorage) {
762
+ if(privateKeyInfo.ksp && (privateKeyInfo.ksp == EndUserConstants.EndUserKSP.DIIA || privateKeyInfo.ksp == this.KSPs[1].name)) {
694
763
  return;
695
764
  }
696
765
 
697
766
  const storage = toLocalStorage ? localStorage : sessionStorage;
698
- const keys = await this.getStoredPrivateKeyInfo(userId);
767
+ const keys = await this.getStoredPrivateKeyInfo();
699
768
 
700
769
  if(keys.length == 0 || keys.filter(key => key.id == privateKeyInfo.id).length < 1) {
701
- const keys = await this.getPrivateKeyInfoFromStorage(userId, toLocalStorage);
770
+ const keys = await this.getPrivateKeyInfoFromStorage(toLocalStorage);
702
771
  keys.push(privateKeyInfo);
703
772
  const data = await this._euSignFile.ProtectDataByPassword(JSON.stringify(keys), "", true);
704
- storage[`${userId}_PrivateKeyInfo`] = data;
773
+ storage[this._userId + this.PRIVATE_KEY_INFO] = data;
705
774
  }
706
775
  }
707
776
 
708
777
  /**
709
778
  * Получить сохранённые ключи
710
- * @param {string} userId - Id пользователя
711
779
  * @param {number?} keyType - Вид ключа
712
780
  * @returns {Array<PrivateKeyInfo>} Сохранённые ключи
713
781
  */
714
- async getStoredPrivateKeyInfo(userId, keyType) {
715
- const local = await this.getPrivateKeyInfoFromStorage(userId, true, keyType);
716
- const session = await this.getPrivateKeyInfoFromStorage(userId, false, keyType);
782
+ async getStoredPrivateKeyInfo(keyType) {
783
+ const local = await this.getPrivateKeyInfoFromStorage(true, keyType);
784
+ const session = await this.getPrivateKeyInfoFromStorage(false, keyType);
717
785
  return local.concat(session);
718
786
  }
719
787
 
720
- async getPrivateKeyInfoFromStorage(userId, fromLocalStorage, keyType) {
788
+ async getPrivateKeyInfoFromStorage(fromLocalStorage, keyType) {
721
789
  const storage = fromLocalStorage ? localStorage : sessionStorage;
790
+ const storedKeys = storage[this._userId + this.PRIVATE_KEY_INFO];
722
791
 
723
792
  let ls;
724
793
  const result = [];
725
- if(!storage[`${userId}_PrivateKeyInfo`]) {
794
+ if(!storedKeys) {
726
795
  return result;
727
796
  }
728
- const data = await this._euSignFile.UnprotectDataByPassword(storage[`${userId}_PrivateKeyInfo`], "", true);
797
+ const data = await this._euSignFile.UnprotectDataByPassword(storedKeys, "", true);
729
798
  try{
730
799
  ls = JSON.parse(data);
731
800
  if(keyType >= 0) {
@@ -763,17 +832,16 @@ export default class DigitalSignature {
763
832
 
764
833
  /**
765
834
  * Удалить сохранённые ключи
766
- * @param {string} userId - id пользователя
767
835
  * @param {string} keyId - Идентификатор ключа
768
836
  */
769
- async removeStoredPrivateKeyInfo(userId, keyId) {
837
+ async removeStoredPrivateKeyInfo(keyId) {
770
838
  if (keyId === undefined) {
771
- localStorage.removeItem(`${userId}_PrivateKeyInfo`);
772
- sessionStorage.removeItem(`${userId}_PrivateKeyInfo`);
839
+ localStorage.removeItem(this._userId + this.PRIVATE_KEY_INFO);
840
+ sessionStorage.removeItem(this._userId + this.PRIVATE_KEY_INFO);
773
841
  }
774
842
  else{
775
- const localStoredKeys = await this.getPrivateKeyInfoFromStorage(userId, true);
776
- const sessionStoredKeys = await this.getPrivateKeyInfoFromStorage(userId, false);
843
+ const localStoredKeys = await this.getPrivateKeyInfoFromStorage(true);
844
+ const sessionStoredKeys = await this.getPrivateKeyInfoFromStorage(false);
777
845
  const storage = localStoredKeys.filter(item => item.id == keyId).length > 0 ? localStorage : sessionStorage;
778
846
  const keys = storage == localStorage ? localStoredKeys : sessionStoredKeys;
779
847
  const keyIndex = keys.findIndex((element) => element.id == keyId);
@@ -781,12 +849,39 @@ export default class DigitalSignature {
781
849
  if(keyIndex > -1) {
782
850
  keys.splice(keyIndex, 1);
783
851
  const data = await this._euSignFile.ProtectDataByPassword(JSON.stringify(keys), "", true);
784
- storage[`${userId}_PrivateKeyInfo`] = data;
852
+ storage[this._userId + this.PRIVATE_KEY_INFO] = data;
785
853
  }
786
854
  }
787
855
  }
788
856
 
857
+ /**
858
+ * Получить предпочитаемый тип ключа
859
+ */
860
+ get _preferredKeyType () {
861
+ const keyType = parseInt(localStorage[this._userId + this.PRIVATE_KEY_TYPE]);
862
+ if (typeof keyType === "number" && keyType > -1) {
863
+ return keyType;
864
+ } else {
865
+ localStorage[this._userId + this.PRIVATE_KEY_TYPE] = DigitalSignatureKeyType.File;
866
+ return DigitalSignatureKeyType.File;
867
+ }
868
+ }
869
+
870
+ /**
871
+ * Задать предпочитаемый тип ключа
872
+ * @param {DigitalSignatureKeyType | number} keyType - Тип ключа
873
+ */
874
+ set _preferredKeyType (keyType) {
875
+ if (typeof keyType === "number" && keyType > -1) {
876
+ localStorage[this._userId + this.PRIVATE_KEY_TYPE] = keyType;
877
+ }
878
+ }
879
+
789
880
  get _resourses() {
790
881
  return Resourses[this._settings.language];
791
882
  }
883
+
884
+ get _userId () {
885
+ return typeof this._settings.userId === "function" ? this._settings.userId() : this._settings.userId;
886
+ }
792
887
  }