@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/euscp/EndUserConstants.d.ts +50 -0
- package/euscp/euscp.d.ts +90 -1
- package/euscp/euscp.js +2 -2
- package/package.json +1 -1
- package/readme.md +15 -9
- package/src/DigitalSignature.js +182 -87
- package/src/Models.js +19 -5
- package/src/Resourses.json +6 -3
package/package.json
CHANGED
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
|
|
215
|
-
const keyInfo = await ds.readPrivateKeyKSP(
|
|
216
|
+
const keyInfo = await ds.readPrivateKeyDepositsign(
|
|
216
217
|
// Идентификатор пользователя (номер телефона или email)
|
|
217
218
|
phone,
|
|
218
|
-
|
|
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
|
```
|
package/src/DigitalSignature.js
CHANGED
|
@@ -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 :
|
|
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
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
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(
|
|
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
|
-
|
|
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
|
-
* Добавить коллбэк идентификации для
|
|
407
|
+
* Добавить коллбэк идентификации для облачных провайдеров
|
|
356
408
|
* @param {authenticationCallback} event - Коллбэк. Вызывается при запросе на подписание.
|
|
357
409
|
*/
|
|
358
410
|
async addConfirmKSPOperationEventListener(event) {
|
|
359
|
-
|
|
360
|
-
|
|
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.
|
|
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(
|
|
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
|
-
|
|
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(
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
|
621
|
-
const
|
|
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(
|
|
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(
|
|
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(
|
|
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[
|
|
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(
|
|
715
|
-
const local = await this.getPrivateKeyInfoFromStorage(
|
|
716
|
-
const session = await this.getPrivateKeyInfoFromStorage(
|
|
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(
|
|
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(!
|
|
794
|
+
if(!storedKeys) {
|
|
726
795
|
return result;
|
|
727
796
|
}
|
|
728
|
-
const data = await this._euSignFile.UnprotectDataByPassword(
|
|
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(
|
|
837
|
+
async removeStoredPrivateKeyInfo(keyId) {
|
|
770
838
|
if (keyId === undefined) {
|
|
771
|
-
localStorage.removeItem(
|
|
772
|
-
sessionStorage.removeItem(
|
|
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(
|
|
776
|
-
const sessionStoredKeys = await this.getPrivateKeyInfoFromStorage(
|
|
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[
|
|
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
|
}
|