Добавил новые методы для получения сертификатов (#28)

* Добавил новые методы для получения сертификатов

* Методы загрузки объединённого списка сертификатов из личного хранилища и из закрытого ключа

* Поиск сертификата в объединённом списке сертификатов из личного хранилища и из закрытого ключа

* Получение сертификата в формате Cades из личного хранилища пользователя и хранилища закрытого ключа

* в примере получает список сертификатов из всех доступных источников

* build с последними изменениями

* linter fixes
This commit is contained in:
Artem Vasilev 2022-06-23 13:13:33 +03:00 committed by GitHub
parent 652cc4d23e
commit 51ed50491a
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
74 changed files with 7296 additions and 113 deletions

View File

@ -96,6 +96,9 @@ import { getUserCertificates, Certificate } from 'crypto-pro-js';
<a name="api-cryptopro"></a> <a name="api-cryptopro"></a>
### Методы объекта cryptoPro ### Методы объекта cryptoPro
- [getUserCertificates](src/api/getUserCertificates.ts) - возвращает список [сертификатов](#api-certificate), доступных пользователю в системе - [getUserCertificates](src/api/getUserCertificates.ts) - возвращает список [сертификатов](#api-certificate), доступных пользователю в системе
- [getAllUserCertificates](src/api/getAllUserCertificates.ts) - возвращает список [сертификатов](#api-certificate), доступных пользователю в системе, в том числе просроченные и без закрытого ключа
- [getContainerCertificates](src/api/getContainerCertificates.ts) - возвращает список [сертификатов](#api-certificate), из закрытых ключей и/или сертификаты не установленные всистеме*
- [getAllContainerCertificates](src/api/getAllContainerCertificates.ts) - возвращает список [сертификатов](#api-certificate), из закрытых ключей и/или сертификаты не установленные всистеме*, в том числе просроченные и без закрытого ключа
- [getCertificate](src/api/getCertificate.ts) - возвращает [сертификат](#api-certificate) по отпечатку - [getCertificate](src/api/getCertificate.ts) - возвращает [сертификат](#api-certificate) по отпечатку
- [createAttachedSignature](src/api/createAttachedSignature.ts) - создает совмещенную (присоединенную) подпись сообщения - [createAttachedSignature](src/api/createAttachedSignature.ts) - создает совмещенную (присоединенную) подпись сообщения
- [createDetachedSignature](src/api/createDetachedSignature.ts) - создает отсоединенную (открепленную) подпись сообщения - [createDetachedSignature](src/api/createDetachedSignature.ts) - создает отсоединенную (открепленную) подпись сообщения
@ -106,6 +109,8 @@ import { getUserCertificates, Certificate } from 'crypto-pro-js';
- [getSystemInfo](src/api/getSystemInfo.ts) - возвращает информацию о CSP и плагине - [getSystemInfo](src/api/getSystemInfo.ts) - возвращает информацию о CSP и плагине
- [isValidSystemSetup](src/api/isValidSystemSetup.ts) - возвращает флаг корректности настроек ЭП на машине - [isValidSystemSetup](src/api/isValidSystemSetup.ts) - возвращает флаг корректности настроек ЭП на машине
> *Методы `getContainerCertificates` и `getAllContainerCertificates` позволяют получить сертификаты из закрытых ключей, записанных на обыкновенную флэшку
<a name="api-certificate"></a> <a name="api-certificate"></a>
### Методы объекта сертификата ### Методы объекта сертификата
[Сертификат](src/api/certificate/certificate.ts) предоставляет следущее API: [Сертификат](src/api/certificate/certificate.ts) предоставляет следущее API:

8
dist/api/getAllCertificates.d.ts vendored Normal file
View File

@ -0,0 +1,8 @@
import { Certificate } from './certificate';
/**
* Возвращает список сертификатов, доступных пользователю из пользовательского хранилища и закрытых ключей, не установленных в системе, без фильтрации по дате и наличию приватного ключа
*
* @param resetCache = false - позволяет сбросить кэш ранее полученных сертификатов
* @returns список сертификатов
*/
export declare const getAllCertificates: (resetCache?: boolean) => Promise<Certificate[]>;

View File

@ -0,0 +1,9 @@
import { Certificate } from './certificate';
/**
* Начиная с версии плагина 2.0.13292 есть возможность получить сертификаты из закрытых ключей
* Возвращает все сертификаты без фильтрации по дате и наличию приватного ключа
*
* @param resetCache = false - позволяет сбросить кэш ранее полученных сертификатов
* @returns список сертификатов
*/
export declare const getAllContainerCertificates: (resetCache?: boolean) => Promise<Certificate[]>;

View File

@ -3,6 +3,7 @@ import { Certificate } from './certificate';
* Возвращает сертификат по отпечатку * Возвращает сертификат по отпечатку
* *
* @param thumbprint - отпечаток сертификата * @param thumbprint - отпечаток сертификата
* @param validOnly - проверять сертификаты по дате и наличию приватного ключа
* @returns сертификат * @returns сертификат
*/ */
export declare const getCertificate: (thumbprint: string) => Promise<Certificate>; export declare const getCertificate: (thumbprint: string, validOnly?: boolean) => Promise<Certificate>;

8
dist/api/getCertificates.d.ts vendored Normal file
View File

@ -0,0 +1,8 @@
import { Certificate } from './certificate';
/**
* Возвращает список сертификатов, доступных пользователю из пользовательского хранилища и закрытых ключей, не установленных в системе
*
* @param resetCache = false - позволяет сбросить кэш ранее полученных сертификатов
* @returns список сертификатов
*/
export declare const getCertificates: (resetCache?: boolean) => Promise<Certificate[]>;

View File

@ -0,0 +1,9 @@
import { Certificate } from './certificate';
/**
* Начиная с версии плагина 2.0.13292 есть возможность получить сертификаты из закрытых ключей
* Возвращает список сертификатов, доступных пользователю в системе
*
* @param resetCache = false - позволяет сбросить кэш ранее полученных сертификатов
* @returns список сертификатов
*/
export declare const getContainerCertificates: (resetCache?: boolean) => Promise<Certificate[]>;

4
dist/api/index.d.ts vendored
View File

@ -1,6 +1,10 @@
export * from './getCertificate'; export * from './getCertificate';
export * from './getUserCertificates'; export * from './getUserCertificates';
export * from './getAllUserCertificates'; export * from './getAllUserCertificates';
export * from './getContainerCertificates';
export * from './getAllContainerCertificates';
export * from './getCertificates';
export * from './getAllCertificates';
export * from './getSystemInfo'; export * from './getSystemInfo';
export * from './isValidSystemSetup'; export * from './isValidSystemSetup';
export * from './createXMLSignature'; export * from './createXMLSignature';

621
dist/crypto-pro-js.js vendored
View File

@ -3457,6 +3457,202 @@ exports.createXMLSignature = _afterPluginsLoaded_1._afterPluginsLoaded(function
}); }); }); });
/***/ }),
/***/ "./api/getAllCertificates.ts":
/*!***********************************!*\
!*** ./api/getAllCertificates.ts ***!
\***********************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {
"use strict";
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
return new (P || (P = Promise))(function (resolve, reject) {
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
step((generator = generator.apply(thisArg, _arguments || [])).next());
});
};
var __generator = (this && this.__generator) || function (thisArg, body) {
var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;
return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
function verb(n) { return function (v) { return step([n, v]); }; }
function step(op) {
if (f) throw new TypeError("Generator is already executing.");
while (_) try {
if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
if (y = 0, t) op = [op[0] & 2, t.value];
switch (op[0]) {
case 0: case 1: t = op; break;
case 4: _.label++; return { value: op[1], done: false };
case 5: _.label++; y = op[1]; op = [0]; continue;
case 7: op = _.ops.pop(); _.trys.pop(); continue;
default:
if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
if (t[2]) _.ops.pop();
_.trys.pop(); continue;
}
op = body.call(thisArg, _);
} catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
}
};
Object.defineProperty(exports, "__esModule", { value: true });
var _afterPluginsLoaded_1 = __webpack_require__(/*! ../helpers/_afterPluginsLoaded */ "./helpers/_afterPluginsLoaded.ts");
var getAllUserCertificates_1 = __webpack_require__(/*! ./getAllUserCertificates */ "./api/getAllUserCertificates.ts");
var getAllContainerCertificates_1 = __webpack_require__(/*! ./getAllContainerCertificates */ "./api/getAllContainerCertificates.ts");
var certificatesCache;
/**
* Возвращает список сертификатов, доступных пользователю из пользовательского хранилища и закрытых ключей, не установленных в системе, без фильтрации по дате и наличию приватного ключа
*
* @param resetCache = false - позволяет сбросить кэш ранее полученных сертификатов
* @returns список сертификатов
*/
exports.getAllCertificates = _afterPluginsLoaded_1._afterPluginsLoaded(function (resetCache) {
if (resetCache === void 0) { resetCache = false; }
return __awaiter(void 0, void 0, void 0, function () {
var availableCertificates, error_1, containerAllCertificates_1, containerAllCertificatesCount_1, foundAvailableCertificate, error_2;
return __generator(this, function (_a) {
switch (_a.label) {
case 0:
if (!resetCache && certificatesCache) {
return [2 /*return*/, certificatesCache];
}
_a.label = 1;
case 1:
_a.trys.push([1, 3, , 4]);
return [4 /*yield*/, getAllUserCertificates_1.getAllUserCertificates(resetCache)];
case 2:
availableCertificates = _a.sent();
return [3 /*break*/, 4];
case 3:
error_1 = _a.sent();
console.error(error_1);
availableCertificates = [];
return [3 /*break*/, 4];
case 4:
_a.trys.push([4, 6, , 7]);
return [4 /*yield*/, getAllContainerCertificates_1.getAllContainerCertificates(resetCache)];
case 5:
containerAllCertificates_1 = _a.sent();
if (!availableCertificates) {
availableCertificates = containerAllCertificates_1;
}
else {
containerAllCertificatesCount_1 = containerAllCertificates_1.length - 1;
foundAvailableCertificate = void 0;
while (containerAllCertificatesCount_1) {
foundAvailableCertificate = availableCertificates.find(function (cert) { return cert.thumbprint === containerAllCertificates_1[containerAllCertificatesCount_1].thumbprint; });
if (!foundAvailableCertificate) {
availableCertificates.push(containerAllCertificates_1[containerAllCertificatesCount_1]);
}
containerAllCertificatesCount_1--;
}
}
return [3 /*break*/, 7];
case 6:
error_2 = _a.sent();
console.error(error_2);
return [3 /*break*/, 7];
case 7:
if (!availableCertificates) {
throw new Error('Нет доступных сертификатов');
}
certificatesCache = availableCertificates;
return [2 /*return*/, certificatesCache];
}
});
});
});
/***/ }),
/***/ "./api/getAllContainerCertificates.ts":
/*!********************************************!*\
!*** ./api/getAllContainerCertificates.ts ***!
\********************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
var certificate_1 = __webpack_require__(/*! ./certificate */ "./api/certificate/index.ts");
var _afterPluginsLoaded_1 = __webpack_require__(/*! ../helpers/_afterPluginsLoaded */ "./helpers/_afterPluginsLoaded.ts");
var _extractCommonName_1 = __webpack_require__(/*! ../helpers/_extractCommonName */ "./helpers/_extractCommonName.ts");
var _extractMeaningfulErrorMessage_1 = __webpack_require__(/*! ../helpers/_extractMeaningfulErrorMessage */ "./helpers/_extractMeaningfulErrorMessage.ts");
var _generateCadesFn_1 = __webpack_require__(/*! ../helpers/_generateCadesFn */ "./helpers/_generateCadesFn.ts");
var certificatesCache;
/**
* Начиная с версии плагина 2.0.13292 есть возможность получить сертификаты из закрытых ключей
* Возвращает все сертификаты без фильтрации по дате и наличию приватного ключа
*
* @param resetCache = false - позволяет сбросить кэш ранее полученных сертификатов
* @returns список сертификатов
*/
exports.getAllContainerCertificates = _afterPluginsLoaded_1._afterPluginsLoaded(function (resetCache) {
if (resetCache === void 0) { resetCache = false; }
var cadesplugin = window.cadesplugin;
if (!resetCache && certificatesCache) {
return certificatesCache;
}
return eval(_generateCadesFn_1._generateCadesFn(function getAllContainerCertificates() {
var cadesStore;
try {
cadesStore = _generateCadesFn_1.__cadesAsyncToken__ + _generateCadesFn_1.__createCadesPluginObject__('CAdESCOM.Store');
}
catch (error) {
console.error(error);
throw new Error(_extractMeaningfulErrorMessage_1._extractMeaningfulErrorMessage(error) || 'Ошибка при попытке доступа к хранилищу');
}
try {
void (_generateCadesFn_1.__cadesAsyncToken__ +
cadesStore.Open(cadesplugin.CADESCOM_CONTAINER_STORE, cadesplugin.CAPICOM_MY_STORE, cadesplugin.CAPICOM_STORE_OPEN_MAXIMUM_ALLOWED));
}
catch (error) {
console.error(error);
throw new Error(_extractMeaningfulErrorMessage_1._extractMeaningfulErrorMessage(error) || 'Ошибка при открытии хранилища');
}
var cadesCertificates;
var cadesCertificatesCount;
try {
cadesCertificates = _generateCadesFn_1.__cadesAsyncToken__ + cadesStore.Certificates;
cadesCertificatesCount = _generateCadesFn_1.__cadesAsyncToken__ + cadesCertificates.Count;
}
catch (error) {
console.error(error);
throw new Error(_extractMeaningfulErrorMessage_1._extractMeaningfulErrorMessage(error) || 'Ошибка получения списка сертификатов');
}
if (!cadesCertificatesCount) {
throw new Error('Нет доступных сертификатов');
}
var certificateList = [];
try {
while (cadesCertificatesCount) {
var cadesCertificate = _generateCadesFn_1.__cadesAsyncToken__ + cadesCertificates.Item(cadesCertificatesCount);
certificateList.push(new certificate_1.Certificate(cadesCertificate, _extractCommonName_1._extractCommonName(_generateCadesFn_1.__cadesAsyncToken__ + cadesCertificate.SubjectName), _generateCadesFn_1.__cadesAsyncToken__ + cadesCertificate.IssuerName, _generateCadesFn_1.__cadesAsyncToken__ + cadesCertificate.SubjectName, _generateCadesFn_1.__cadesAsyncToken__ + cadesCertificate.Thumbprint, _generateCadesFn_1.__cadesAsyncToken__ + cadesCertificate.ValidFromDate, _generateCadesFn_1.__cadesAsyncToken__ + cadesCertificate.ValidToDate));
cadesCertificatesCount--;
}
}
catch (error) {
console.error(error);
throw new Error(_extractMeaningfulErrorMessage_1._extractMeaningfulErrorMessage(error) || 'Ошибка обработки сертификатов');
}
cadesStore.Close();
certificatesCache = certificateList;
return certificatesCache;
}));
});
/***/ }), /***/ }),
/***/ "./api/getAllUserCertificates.ts": /***/ "./api/getAllUserCertificates.ts":
@ -3585,14 +3781,18 @@ var __generator = (this && this.__generator) || function (thisArg, body) {
}; };
Object.defineProperty(exports, "__esModule", { value: true }); Object.defineProperty(exports, "__esModule", { value: true });
var _afterPluginsLoaded_1 = __webpack_require__(/*! ../helpers/_afterPluginsLoaded */ "./helpers/_afterPluginsLoaded.ts"); var _afterPluginsLoaded_1 = __webpack_require__(/*! ../helpers/_afterPluginsLoaded */ "./helpers/_afterPluginsLoaded.ts");
var getUserCertificates_1 = __webpack_require__(/*! ./getUserCertificates */ "./api/getUserCertificates.ts"); var getCertificates_1 = __webpack_require__(/*! ./getCertificates */ "./api/getCertificates.ts");
var getAllCertificates_1 = __webpack_require__(/*! ./getAllCertificates */ "./api/getAllCertificates.ts");
/** /**
* Возвращает сертификат по отпечатку * Возвращает сертификат по отпечатку
* *
* @param thumbprint - отпечаток сертификата * @param thumbprint - отпечаток сертификата
* @param validOnly - проверять сертификаты по дате и наличию приватного ключа
* @returns сертификат * @returns сертификат
*/ */
exports.getCertificate = _afterPluginsLoaded_1._afterPluginsLoaded(function (thumbprint) { return __awaiter(void 0, void 0, void 0, function () { exports.getCertificate = _afterPluginsLoaded_1._afterPluginsLoaded(function (thumbprint, validOnly) {
if (validOnly === void 0) { validOnly = true; }
return __awaiter(void 0, void 0, void 0, function () {
var availableCertificates, foundCertificate; var availableCertificates, foundCertificate;
return __generator(this, function (_a) { return __generator(this, function (_a) {
switch (_a.label) { switch (_a.label) {
@ -3600,9 +3800,16 @@ exports.getCertificate = _afterPluginsLoaded_1._afterPluginsLoaded(function (thu
if (!thumbprint) { if (!thumbprint) {
throw new Error('Отпечаток не указан'); throw new Error('Отпечаток не указан');
} }
return [4 /*yield*/, getUserCertificates_1.getUserCertificates()]; if (!validOnly) return [3 /*break*/, 2];
return [4 /*yield*/, getCertificates_1.getCertificates()];
case 1: case 1:
availableCertificates = _a.sent(); availableCertificates = _a.sent();
return [3 /*break*/, 4];
case 2: return [4 /*yield*/, getAllCertificates_1.getAllCertificates()];
case 3:
availableCertificates = _a.sent();
_a.label = 4;
case 4:
foundCertificate = availableCertificates.find(function (cert) { return cert.thumbprint === thumbprint; }); foundCertificate = availableCertificates.find(function (cert) { return cert.thumbprint === thumbprint; });
if (!foundCertificate) { if (!foundCertificate) {
throw new Error("\u0421\u0435\u0440\u0442\u0438\u0444\u0438\u043A\u0430\u0442 \u0441 \u043E\u0442\u043F\u0435\u0447\u0430\u0442\u043A\u043E\u043C: \"" + thumbprint + "\" \u043D\u0435 \u043D\u0430\u0439\u0434\u0435\u043D"); throw new Error("\u0421\u0435\u0440\u0442\u0438\u0444\u0438\u043A\u0430\u0442 \u0441 \u043E\u0442\u043F\u0435\u0447\u0430\u0442\u043A\u043E\u043C: \"" + thumbprint + "\" \u043D\u0435 \u043D\u0430\u0439\u0434\u0435\u043D");
@ -3610,7 +3817,216 @@ exports.getCertificate = _afterPluginsLoaded_1._afterPluginsLoaded(function (thu
return [2 /*return*/, foundCertificate]; return [2 /*return*/, foundCertificate];
} }
}); });
}); }); });
});
/***/ }),
/***/ "./api/getCertificates.ts":
/*!********************************!*\
!*** ./api/getCertificates.ts ***!
\********************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {
"use strict";
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
return new (P || (P = Promise))(function (resolve, reject) {
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
step((generator = generator.apply(thisArg, _arguments || [])).next());
});
};
var __generator = (this && this.__generator) || function (thisArg, body) {
var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;
return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
function verb(n) { return function (v) { return step([n, v]); }; }
function step(op) {
if (f) throw new TypeError("Generator is already executing.");
while (_) try {
if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
if (y = 0, t) op = [op[0] & 2, t.value];
switch (op[0]) {
case 0: case 1: t = op; break;
case 4: _.label++; return { value: op[1], done: false };
case 5: _.label++; y = op[1]; op = [0]; continue;
case 7: op = _.ops.pop(); _.trys.pop(); continue;
default:
if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
if (t[2]) _.ops.pop();
_.trys.pop(); continue;
}
op = body.call(thisArg, _);
} catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
}
};
Object.defineProperty(exports, "__esModule", { value: true });
var _afterPluginsLoaded_1 = __webpack_require__(/*! ../helpers/_afterPluginsLoaded */ "./helpers/_afterPluginsLoaded.ts");
var getUserCertificates_1 = __webpack_require__(/*! ./getUserCertificates */ "./api/getUserCertificates.ts");
var getContainerCertificates_1 = __webpack_require__(/*! ./getContainerCertificates */ "./api/getContainerCertificates.ts");
var certificatesCache;
/**
* Возвращает список сертификатов, доступных пользователю из пользовательского хранилища и закрытых ключей, не установленных в системе
*
* @param resetCache = false - позволяет сбросить кэш ранее полученных сертификатов
* @returns список сертификатов
*/
exports.getCertificates = _afterPluginsLoaded_1._afterPluginsLoaded(function (resetCache) {
if (resetCache === void 0) { resetCache = false; }
return __awaiter(void 0, void 0, void 0, function () {
var availableCertificates, error_1, containerCertificates_1, containerCertificatesCount_1, foundAvailableCertificate, error_2;
return __generator(this, function (_a) {
switch (_a.label) {
case 0:
if (!resetCache && certificatesCache) {
return [2 /*return*/, certificatesCache];
}
_a.label = 1;
case 1:
_a.trys.push([1, 3, , 4]);
return [4 /*yield*/, getUserCertificates_1.getUserCertificates(resetCache)];
case 2:
availableCertificates = _a.sent();
return [3 /*break*/, 4];
case 3:
error_1 = _a.sent();
console.error(error_1);
availableCertificates = [];
return [3 /*break*/, 4];
case 4:
_a.trys.push([4, 6, , 7]);
return [4 /*yield*/, getContainerCertificates_1.getContainerCertificates(resetCache)];
case 5:
containerCertificates_1 = _a.sent();
if (!availableCertificates) {
availableCertificates = containerCertificates_1;
}
else {
containerCertificatesCount_1 = containerCertificates_1.length - 1;
foundAvailableCertificate = void 0;
while (containerCertificatesCount_1) {
foundAvailableCertificate = availableCertificates.find(function (cert) { return cert.thumbprint === containerCertificates_1[containerCertificatesCount_1].thumbprint; });
if (!foundAvailableCertificate) {
availableCertificates.push(containerCertificates_1[containerCertificatesCount_1]);
}
containerCertificatesCount_1--;
}
}
return [3 /*break*/, 7];
case 6:
error_2 = _a.sent();
console.error(error_2);
return [3 /*break*/, 7];
case 7:
if (!availableCertificates) {
throw new Error('Нет доступных сертификатов');
}
certificatesCache = availableCertificates;
return [2 /*return*/, certificatesCache];
}
});
});
});
/***/ }),
/***/ "./api/getContainerCertificates.ts":
/*!*****************************************!*\
!*** ./api/getContainerCertificates.ts ***!
\*****************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
var certificate_1 = __webpack_require__(/*! ./certificate */ "./api/certificate/index.ts");
var constants_1 = __webpack_require__(/*! ../constants */ "./constants/index.ts");
var _afterPluginsLoaded_1 = __webpack_require__(/*! ../helpers/_afterPluginsLoaded */ "./helpers/_afterPluginsLoaded.ts");
var _extractCommonName_1 = __webpack_require__(/*! ../helpers/_extractCommonName */ "./helpers/_extractCommonName.ts");
var _extractMeaningfulErrorMessage_1 = __webpack_require__(/*! ../helpers/_extractMeaningfulErrorMessage */ "./helpers/_extractMeaningfulErrorMessage.ts");
var _generateCadesFn_1 = __webpack_require__(/*! ../helpers/_generateCadesFn */ "./helpers/_generateCadesFn.ts");
var certificatesCache;
/**
* Начиная с версии плагина 2.0.13292 есть возможность получить сертификаты из закрытых ключей
* Возвращает список сертификатов, доступных пользователю в системе
*
* @param resetCache = false - позволяет сбросить кэш ранее полученных сертификатов
* @returns список сертификатов
*/
exports.getContainerCertificates = _afterPluginsLoaded_1._afterPluginsLoaded(function (resetCache) {
if (resetCache === void 0) { resetCache = false; }
var cadesplugin = window.cadesplugin;
if (!resetCache && certificatesCache) {
return certificatesCache;
}
return eval(_generateCadesFn_1._generateCadesFn(function getContainerCertificates() {
var cadesStore;
try {
cadesStore = _generateCadesFn_1.__cadesAsyncToken__ + _generateCadesFn_1.__createCadesPluginObject__('CAdESCOM.Store');
}
catch (error) {
console.error(error);
throw new Error(_extractMeaningfulErrorMessage_1._extractMeaningfulErrorMessage(error) || 'Ошибка при попытке доступа к хранилищу');
}
try {
void (_generateCadesFn_1.__cadesAsyncToken__ +
cadesStore.Open(cadesplugin.CADESCOM_CONTAINER_STORE, cadesplugin.CAPICOM_MY_STORE, cadesplugin.CAPICOM_STORE_OPEN_MAXIMUM_ALLOWED));
}
catch (error) {
console.error(error);
throw new Error(_extractMeaningfulErrorMessage_1._extractMeaningfulErrorMessage(error) || 'Ошибка при открытии хранилища');
}
var cadesCertificates;
var cadesCertificatesCount;
try {
cadesCertificates = _generateCadesFn_1.__cadesAsyncToken__ + cadesStore.Certificates;
if (cadesCertificates) {
cadesCertificates =
_generateCadesFn_1.__cadesAsyncToken__ + cadesCertificates.Find(cadesplugin.CAPICOM_CERTIFICATE_FIND_TIME_VALID);
/**
* Не рассматриваются сертификаты, в которых отсутствует закрытый ключ
* или не действительны на данный момент
*/
cadesCertificates =
_generateCadesFn_1.__cadesAsyncToken__ +
cadesCertificates.Find(cadesplugin.CAPICOM_CERTIFICATE_FIND_EXTENDED_PROPERTY, constants_1.CAPICOM_PROPID_KEY_PROV_INFO);
cadesCertificatesCount = _generateCadesFn_1.__cadesAsyncToken__ + cadesCertificates.Count;
}
}
catch (error) {
console.error(error);
throw new Error(_extractMeaningfulErrorMessage_1._extractMeaningfulErrorMessage(error) || 'Ошибка получения списка сертификатов');
}
if (!cadesCertificatesCount) {
throw new Error('Нет доступных сертификатов');
}
var certificateList = [];
try {
while (cadesCertificatesCount) {
var cadesCertificate = _generateCadesFn_1.__cadesAsyncToken__ + cadesCertificates.Item(cadesCertificatesCount);
certificateList.push(new certificate_1.Certificate(cadesCertificate, _extractCommonName_1._extractCommonName(_generateCadesFn_1.__cadesAsyncToken__ + cadesCertificate.SubjectName), _generateCadesFn_1.__cadesAsyncToken__ + cadesCertificate.IssuerName, _generateCadesFn_1.__cadesAsyncToken__ + cadesCertificate.SubjectName, _generateCadesFn_1.__cadesAsyncToken__ + cadesCertificate.Thumbprint, _generateCadesFn_1.__cadesAsyncToken__ + cadesCertificate.ValidFromDate, _generateCadesFn_1.__cadesAsyncToken__ + cadesCertificate.ValidToDate));
cadesCertificatesCount--;
}
}
catch (error) {
console.error(error);
throw new Error(_extractMeaningfulErrorMessage_1._extractMeaningfulErrorMessage(error) || 'Ошибка обработки сертификатов');
}
cadesStore.Close();
certificatesCache = certificateList;
return certificatesCache;
}));
});
/***/ }), /***/ }),
@ -3847,6 +4263,10 @@ Object.defineProperty(exports, "__esModule", { value: true });
__export(__webpack_require__(/*! ./getCertificate */ "./api/getCertificate.ts")); __export(__webpack_require__(/*! ./getCertificate */ "./api/getCertificate.ts"));
__export(__webpack_require__(/*! ./getUserCertificates */ "./api/getUserCertificates.ts")); __export(__webpack_require__(/*! ./getUserCertificates */ "./api/getUserCertificates.ts"));
__export(__webpack_require__(/*! ./getAllUserCertificates */ "./api/getAllUserCertificates.ts")); __export(__webpack_require__(/*! ./getAllUserCertificates */ "./api/getAllUserCertificates.ts"));
__export(__webpack_require__(/*! ./getContainerCertificates */ "./api/getContainerCertificates.ts"));
__export(__webpack_require__(/*! ./getAllContainerCertificates */ "./api/getAllContainerCertificates.ts"));
__export(__webpack_require__(/*! ./getCertificates */ "./api/getCertificates.ts"));
__export(__webpack_require__(/*! ./getAllCertificates */ "./api/getAllCertificates.ts"));
__export(__webpack_require__(/*! ./getSystemInfo */ "./api/getSystemInfo.ts")); __export(__webpack_require__(/*! ./getSystemInfo */ "./api/getSystemInfo.ts"));
__export(__webpack_require__(/*! ./isValidSystemSetup */ "./api/isValidSystemSetup.ts")); __export(__webpack_require__(/*! ./isValidSystemSetup */ "./api/isValidSystemSetup.ts"));
__export(__webpack_require__(/*! ./createXMLSignature */ "./api/createXMLSignature.ts")); __export(__webpack_require__(/*! ./createXMLSignature */ "./api/createXMLSignature.ts"));
@ -4472,17 +4892,173 @@ exports._generateCadesFn = function (callback) {
"use strict"; "use strict";
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
return new (P || (P = Promise))(function (resolve, reject) {
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
step((generator = generator.apply(thisArg, _arguments || [])).next());
});
};
var __generator = (this && this.__generator) || function (thisArg, body) {
var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;
return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
function verb(n) { return function (v) { return step([n, v]); }; }
function step(op) {
if (f) throw new TypeError("Generator is already executing.");
while (_) try {
if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
if (y = 0, t) op = [op[0] & 2, t.value];
switch (op[0]) {
case 0: case 1: t = op; break;
case 4: _.label++; return { value: op[1], done: false };
case 5: _.label++; y = op[1]; op = [0]; continue;
case 7: op = _.ops.pop(); _.trys.pop(); continue;
default:
if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
if (t[2]) _.ops.pop();
_.trys.pop(); continue;
}
op = body.call(thisArg, _);
} catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
}
};
Object.defineProperty(exports, "__esModule", { value: true }); Object.defineProperty(exports, "__esModule", { value: true });
var _afterPluginsLoaded_1 = __webpack_require__(/*! ./_afterPluginsLoaded */ "./helpers/_afterPluginsLoaded.ts"); var _afterPluginsLoaded_1 = __webpack_require__(/*! ./_afterPluginsLoaded */ "./helpers/_afterPluginsLoaded.ts");
var _extractMeaningfulErrorMessage_1 = __webpack_require__(/*! ./_extractMeaningfulErrorMessage */ "./helpers/_extractMeaningfulErrorMessage.ts"); var _getCadesUserCert_1 = __webpack_require__(/*! ./_getCadesUserCert */ "./helpers/_getCadesUserCert.ts");
var _generateCadesFn_1 = __webpack_require__(/*! ./_generateCadesFn */ "./helpers/_generateCadesFn.ts"); var _getCadesContainerCert_1 = __webpack_require__(/*! ./_getCadesContainerCert */ "./helpers/_getCadesContainerCert.ts");
/** /**
* Возвращает сертификат в формате Cades по отпечатку * Возвращает сертификат в формате Cades по отпечатку
* *
* @param thumbprint - отпечаток сертификата * @param thumbprint - отпечаток сертификата
* @returns сертификат в формате Cades * @returns сертификат в формате Cades
*/ */
exports._getCadesCert = _afterPluginsLoaded_1._afterPluginsLoaded(function (thumbprint) { exports._getCadesCert = _afterPluginsLoaded_1._afterPluginsLoaded(function (thumbprint) { return __awaiter(void 0, void 0, void 0, function () {
var cadesCertificate, error_1;
return __generator(this, function (_a) {
switch (_a.label) {
case 0:
_a.trys.push([0, 2, , 4]);
return [4 /*yield*/, _getCadesUserCert_1._getCadesUserCert(thumbprint)];
case 1:
cadesCertificate = _a.sent();
return [3 /*break*/, 4];
case 2:
error_1 = _a.sent();
console.log(error_1);
return [4 /*yield*/, _getCadesContainerCert_1._getCadesContainerCert(thumbprint)];
case 3:
cadesCertificate = _a.sent();
return [3 /*break*/, 4];
case 4: return [2 /*return*/, cadesCertificate];
}
});
}); });
/***/ }),
/***/ "./helpers/_getCadesContainerCert.ts":
/*!*******************************************!*\
!*** ./helpers/_getCadesContainerCert.ts ***!
\*******************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
var _afterPluginsLoaded_1 = __webpack_require__(/*! ./_afterPluginsLoaded */ "./helpers/_afterPluginsLoaded.ts");
var _extractMeaningfulErrorMessage_1 = __webpack_require__(/*! ./_extractMeaningfulErrorMessage */ "./helpers/_extractMeaningfulErrorMessage.ts");
var _generateCadesFn_1 = __webpack_require__(/*! ./_generateCadesFn */ "./helpers/_generateCadesFn.ts");
/**
* Возвращает сертификат в формате Cades по отпечатку из хранилища закрытого ключа
*
* @param thumbprint - отпечаток сертификата
* @returns сертификат в формате Cades
*/
exports._getCadesContainerCert = _afterPluginsLoaded_1._afterPluginsLoaded(function (thumbprint) {
var cadesplugin = window.cadesplugin;
return eval(_generateCadesFn_1._generateCadesFn(function _getCadesCert() {
var cadesStore;
try {
cadesStore = _generateCadesFn_1.__cadesAsyncToken__ + _generateCadesFn_1.__createCadesPluginObject__('CAdESCOM.Store');
}
catch (error) {
console.error(error);
throw new Error(_extractMeaningfulErrorMessage_1._extractMeaningfulErrorMessage(error) || 'Ошибка при попытке доступа к хранилищу');
}
if (!cadesStore) {
throw new Error('Не удалось получить доступ к хранилищу сертификатов');
}
try {
void (_generateCadesFn_1.__cadesAsyncToken__ +
cadesStore.Open(cadesplugin.CADESCOM_CONTAINER_STORE, cadesplugin.CAPICOM_MY_STORE, cadesplugin.CAPICOM_STORE_OPEN_MAXIMUM_ALLOWED));
}
catch (error) {
console.error(error);
throw new Error(_extractMeaningfulErrorMessage_1._extractMeaningfulErrorMessage(error) || 'Ошибка при открытии хранилища закрытого ключа');
}
var cadesCertificateList;
var certificatesCount;
try {
cadesCertificateList = _generateCadesFn_1.__cadesAsyncToken__ + cadesStore.Certificates;
certificatesCount = _generateCadesFn_1.__cadesAsyncToken__ + cadesCertificateList.Count;
}
catch (error) {
console.error(error);
throw new Error(_extractMeaningfulErrorMessage_1._extractMeaningfulErrorMessage(error) || 'Ошибка получения списка сертификатов из хранилища закрытого ключа');
}
if (!certificatesCount) {
throw new Error('Нет доступных сертификатов в хранилище закрытого ключа');
}
var cadesCertificate;
try {
cadesCertificateList =
_generateCadesFn_1.__cadesAsyncToken__ + cadesCertificateList.Find(cadesplugin.CAPICOM_CERTIFICATE_FIND_SHA1_HASH, thumbprint);
var count = _generateCadesFn_1.__cadesAsyncToken__ + cadesCertificateList.Count;
if (!count) {
throw new Error("\u0421\u0435\u0440\u0442\u0438\u0444\u0438\u043A\u0430\u0442 \u0441 \u043E\u0442\u043F\u0435\u0447\u0430\u0442\u043A\u043E\u043C: \"" + thumbprint + "\" \u043D\u0435 \u043D\u0430\u0439\u0434\u0435\u043D \u0432 \u0445\u0440\u0430\u043D\u0438\u043B\u0438\u0449\u0435 \u0437\u0430\u043A\u0440\u044B\u0442\u043E\u0433\u043E \u043A\u043B\u044E\u0447\u0430");
}
cadesCertificate = _generateCadesFn_1.__cadesAsyncToken__ + cadesCertificateList.Item(1);
}
catch (error) {
console.error(error);
throw new Error(_extractMeaningfulErrorMessage_1._extractMeaningfulErrorMessage(error) || 'Ошибка при получении сертификата из хранилища закрытого ключа');
}
cadesStore.Close();
return cadesCertificate;
}));
});
/***/ }),
/***/ "./helpers/_getCadesUserCert.ts":
/*!**************************************!*\
!*** ./helpers/_getCadesUserCert.ts ***!
\**************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
var _afterPluginsLoaded_1 = __webpack_require__(/*! ./_afterPluginsLoaded */ "./helpers/_afterPluginsLoaded.ts");
var _extractMeaningfulErrorMessage_1 = __webpack_require__(/*! ./_extractMeaningfulErrorMessage */ "./helpers/_extractMeaningfulErrorMessage.ts");
var _generateCadesFn_1 = __webpack_require__(/*! ./_generateCadesFn */ "./helpers/_generateCadesFn.ts");
/**
* Возвращает сертификат в формате Cades по отпечатку из хранилища пользователя
*
* @param thumbprint - отпечаток сертификата
* @returns сертификат в формате Cades
*/
exports._getCadesUserCert = _afterPluginsLoaded_1._afterPluginsLoaded(function (thumbprint) {
var cadesplugin = window.cadesplugin; var cadesplugin = window.cadesplugin;
return eval(_generateCadesFn_1._generateCadesFn(function _getCadesCert() { return eval(_generateCadesFn_1._generateCadesFn(function _getCadesCert() {
var cadesStore; var cadesStore;
@ -4502,7 +5078,7 @@ exports._getCadesCert = _afterPluginsLoaded_1._afterPluginsLoaded(function (thum
} }
catch (error) { catch (error) {
console.error(error); console.error(error);
throw new Error(_extractMeaningfulErrorMessage_1._extractMeaningfulErrorMessage(error) || 'Ошибка при открытии хранилища'); throw new Error(_extractMeaningfulErrorMessage_1._extractMeaningfulErrorMessage(error) || 'Ошибка при открытии хранилища пользователя');
} }
var cadesCertificateList; var cadesCertificateList;
var certificatesCount; var certificatesCount;
@ -4512,10 +5088,10 @@ exports._getCadesCert = _afterPluginsLoaded_1._afterPluginsLoaded(function (thum
} }
catch (error) { catch (error) {
console.error(error); console.error(error);
throw new Error(_extractMeaningfulErrorMessage_1._extractMeaningfulErrorMessage(error) || 'Ошибка получения списка сертификатов'); throw new Error(_extractMeaningfulErrorMessage_1._extractMeaningfulErrorMessage(error) || 'Ошибка получения списка сертификатов из хранилища пользователя');
} }
if (!certificatesCount) { if (!certificatesCount) {
throw new Error('Нет доступных сертификатов'); throw new Error('Нет доступных сертификатов в хранилище пользователя');
} }
var cadesCertificate; var cadesCertificate;
try { try {
@ -4523,13 +5099,13 @@ exports._getCadesCert = _afterPluginsLoaded_1._afterPluginsLoaded(function (thum
_generateCadesFn_1.__cadesAsyncToken__ + cadesCertificateList.Find(cadesplugin.CAPICOM_CERTIFICATE_FIND_SHA1_HASH, thumbprint); _generateCadesFn_1.__cadesAsyncToken__ + cadesCertificateList.Find(cadesplugin.CAPICOM_CERTIFICATE_FIND_SHA1_HASH, thumbprint);
var count = _generateCadesFn_1.__cadesAsyncToken__ + cadesCertificateList.Count; var count = _generateCadesFn_1.__cadesAsyncToken__ + cadesCertificateList.Count;
if (!count) { if (!count) {
throw new Error("\u0421\u0435\u0440\u0442\u0438\u0444\u0438\u043A\u0430\u0442 \u0441 \u043E\u0442\u043F\u0435\u0447\u0430\u0442\u043A\u043E\u043C: \"" + thumbprint + "\" \u043D\u0435 \u043D\u0430\u0439\u0434\u0435\u043D"); throw new Error("\u0421\u0435\u0440\u0442\u0438\u0444\u0438\u043A\u0430\u0442 \u0441 \u043E\u0442\u043F\u0435\u0447\u0430\u0442\u043A\u043E\u043C: \"" + thumbprint + "\" \u043D\u0435 \u043D\u0430\u0439\u0434\u0435\u043D \u0432 \u0445\u0440\u0430\u043D\u0438\u043B\u0438\u0449\u0435 \u043F\u043E\u043B\u044C\u0437\u043E\u0432\u0430\u0442\u0435\u043B\u044F");
} }
cadesCertificate = _generateCadesFn_1.__cadesAsyncToken__ + cadesCertificateList.Item(1); cadesCertificate = _generateCadesFn_1.__cadesAsyncToken__ + cadesCertificateList.Item(1);
} }
catch (error) { catch (error) {
console.error(error); console.error(error);
throw new Error(_extractMeaningfulErrorMessage_1._extractMeaningfulErrorMessage(error) || 'Ошибка при получении сертификата'); throw new Error(_extractMeaningfulErrorMessage_1._extractMeaningfulErrorMessage(error) || 'Ошибка при получении сертификата из хранилища пользователя');
} }
cadesStore.Close(); cadesStore.Close();
return cadesCertificate; return cadesCertificate;
@ -4681,6 +5257,7 @@ exports._parseCertInfo = function (tagsTranslations, rawInfo) {
var isYandex = 0; var isYandex = 0;
var canPromise = !!window.Promise; var canPromise = !!window.Promise;
var cadesplugin_loaded_event_recieved = false; var cadesplugin_loaded_event_recieved = false;
var isFireFoxExtensionLoaded = false;
var cadesplugin; var cadesplugin;
if(canPromise) if(canPromise)
@ -4904,6 +5481,14 @@ exports._parseCertInfo = function (tagsTranslations, rawInfo) {
cadesplugin.XCN_CRYPT_STRING_BASE64HEADER = 0; cadesplugin.XCN_CRYPT_STRING_BASE64HEADER = 0;
cadesplugin.AT_KEYEXCHANGE = 1; cadesplugin.AT_KEYEXCHANGE = 1;
cadesplugin.AT_SIGNATURE = 2; cadesplugin.AT_SIGNATURE = 2;
cadesplugin.CARRIER_FLAG_REMOVABLE = 1;
cadesplugin.CARRIER_FLAG_UNIQUE = 2;
cadesplugin.CARRIER_FLAG_PROTECTED = 4;
cadesplugin.CARRIER_FLAG_FUNCTIONAL_CARRIER = 8;
cadesplugin.CARRIER_FLAG_SECURE_MESSAGING = 16;
cadesplugin.CARRIER_FLAG_ABLE_VISUALISE_SIGNATURE = 64;
cadesplugin.CARRIER_FLAG_VIRTUAL = 128;
} }
function async_spawn(generatorFunc) { function async_spawn(generatorFunc) {
@ -5150,10 +5735,17 @@ exports._parseCertInfo = function (tagsTranslations, rawInfo) {
} }
} }
function firefox_or_safari_nmcades_onload() { function firefox_or_safari_nmcades_onload() {
if (window.cadesplugin_extension_loaded_callback)
window.cadesplugin_extension_loaded_callback();
isFireFoxExtensionLoaded = true;
cpcsp_chrome_nmcades.check_chrome_plugin(plugin_loaded, plugin_loaded_error); cpcsp_chrome_nmcades.check_chrome_plugin(plugin_loaded, plugin_loaded_error);
} }
function nmcades_api_onload () { function nmcades_api_onload() {
if (!isIE() && !isFireFox && !isSafari) {
if (window.cadesplugin_extension_loaded_callback)
window.cadesplugin_extension_loaded_callback();
}
window.postMessage("cadesplugin_echo_request", "*"); window.postMessage("cadesplugin_echo_request", "*");
window.addEventListener("message", function (event){ window.addEventListener("message", function (event){
if (typeof(event.data) !== "string" || !event.data.match("cadesplugin_loaded")) if (typeof(event.data) !== "string" || !event.data.match("cadesplugin_loaded"))
@ -5268,6 +5860,7 @@ exports._parseCertInfo = function (tagsTranslations, rawInfo) {
return; return;
if(isFireFox) if(isFireFox)
{ {
if (!isFireFoxExtensionLoaded)
show_firefox_missing_extension_dialog(); show_firefox_missing_extension_dialog();
} }
plugin_resolved = 1; plugin_resolved = 1;
@ -5360,7 +5953,7 @@ exports._parseCertInfo = function (tagsTranslations, rawInfo) {
}; };
//Export //Export
cadesplugin.JSModuleVersion = "2.3.1"; cadesplugin.JSModuleVersion = "2.3.2";
cadesplugin.async_spawn = async_spawn; cadesplugin.async_spawn = async_spawn;
cadesplugin.set = set_pluginObject; cadesplugin.set = set_pluginObject;
cadesplugin.set_log_level = set_log_level; cadesplugin.set_log_level = set_log_level;

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@ -0,0 +1,7 @@
/**
* Возвращает сертификат в формате Cades по отпечатку из хранилища закрытого ключа
*
* @param thumbprint - отпечаток сертификата
* @returns сертификат в формате Cades
*/
export declare const _getCadesContainerCert: (thumbprint: string) => Promise<any>;

7
dist/helpers/_getCadesUserCert.d.ts vendored Normal file
View File

@ -0,0 +1,7 @@
/**
* Возвращает сертификат в формате Cades по отпечатку из хранилища пользователя
*
* @param thumbprint - отпечаток сертификата
* @returns сертификат в формате Cades
*/
export declare const _getCadesUserCert: (thumbprint: string) => Promise<any>;

0
examples/script-tag/package-lock.json generated Normal file → Executable file
View File

View File

@ -16,7 +16,7 @@
$certificateDetails.style.display = thumbprint ? 'block' : 'none'; $certificateDetails.style.display = thumbprint ? 'block' : 'none';
}); });
window.cryptoPro.getUserCertificates().then(function (certificateList) { window.cryptoPro.getCertificates().then(function (certificateList) {
certificateList.forEach(function (certificate) { certificateList.forEach(function (certificate) {
var $certOption = document.createElement('option'); var $certOption = document.createElement('option');

8
lib/api/addAttachedSignature.d.ts vendored Normal file
View File

@ -0,0 +1,8 @@
/**
* Добавляет присоединенную подпись к подписанному сообщению по отпечатку сертификата
*
* @param thumbprint - отпечаток сертификата
* @param signedMessage - подписанное сообщение
* @returns подпись в формате PKCS#7
*/
export declare const addAttachedSignature: (thumbprint: string, signedMessage: string | ArrayBuffer) => Promise<string>;

9
lib/api/addDetachedSignature.d.ts vendored Normal file
View File

@ -0,0 +1,9 @@
/**
* Добавляет отсоединенную подпись хеша к подписанному сообщению по отпечатку сертификата
*
* @param thumbprint - отпечаток сертификата
* @param signedMessage - подписанное сообщение
* @param messageHash - хеш подписываемого сообщения, сгенерированный по ГОСТ Р 34.11-2012 256 бит
* @returns подпись в формате PKCS#7
*/
export declare const addDetachedSignature: (thumbprint: string, signedMessage: string | ArrayBuffer, messageHash: string) => Promise<string>;

22
lib/api/certificate/certificate.d.ts vendored Normal file
View File

@ -0,0 +1,22 @@
import { TagTranslation } from '../../helpers/_parseCertInfo';
import { ExtendedKeysTranslations } from './getDecodedExtendedKeyUsage';
export declare type CadesCertificate = any;
export declare class Certificate {
_cadesCertificate: CadesCertificate;
name: string;
issuerName: string;
subjectName: string;
thumbprint: string;
validFrom: string;
validTo: string;
constructor(_cadesCertificate: CadesCertificate, name: string, issuerName: string, subjectName: string, thumbprint: string, validFrom: string, validTo: string);
getOwnerInfo(): Promise<TagTranslation[]>;
getIssuerInfo(): Promise<TagTranslation[]>;
getExtendedKeyUsage(): Promise<string[]>;
getDecodedExtendedKeyUsage(): Promise<ExtendedKeysTranslations>;
getAlgorithm(): Promise<string>;
getCadesProp(propName: any): Promise<any>;
isValid(): Promise<boolean>;
exportBase64(): Promise<string>;
hasExtendedKeyUsage(oids: any): Promise<boolean>;
}

6
lib/api/certificate/exportBase64.d.ts vendored Normal file
View File

@ -0,0 +1,6 @@
/**
* Экспортирует сертификат в формате base64
*
* @returns сертификат в формате base64
*/
export declare const exportBase64: () => Promise<string>;

11
lib/api/certificate/getAlgorithm.d.ts vendored Normal file
View File

@ -0,0 +1,11 @@
interface AlgorithmInfo {
algorithm: string;
oid: string;
}
/**
* Возвращает информацию об алгоритме сертификата
*
* @returns информацию об алгоритме и его OID'е
*/
export declare const getAlgorithm: () => Promise<AlgorithmInfo>;
export {};

7
lib/api/certificate/getCadesProp.d.ts vendored Normal file
View File

@ -0,0 +1,7 @@
/**
* Возвращает указанное внутренее свойство у сертификата в формате Cades
*
* @param propName = наименование свойства
* @returns значение запрошенного свойства
*/
export declare const getCadesProp: (propName: string) => Promise<any>;

View File

@ -0,0 +1,9 @@
export interface ExtendedKeysTranslations {
[key: string]: string | null;
}
/**
* Возвращает расшифрованные ОИД'ы сертификата
*
* @returns словарь расшифрованных ОИД'ов
*/
export declare const getDecodedExtendedKeyUsage: () => Promise<ExtendedKeysTranslations>;

View File

@ -0,0 +1,6 @@
/**
* Возвращает ОИД'ы сертификата
*
* @returns список ОИД'ов
*/
export declare const getExtendedKeyUsage: () => Promise<string[]>;

10
lib/api/certificate/getInfo.d.ts vendored Normal file
View File

@ -0,0 +1,10 @@
import { TagsTranslations } from '../../constants/tags-translations';
import { TagTranslation } from '../../helpers/_parseCertInfo';
/**
* Возвращает расшифрованную информацию о сертификате из указанного свойства по тэгам
*
* @param tags = словарь
* @param entitiesPath = путь к разбираемой сущности
* @returns расшифрованная информация по отдельным тэгам
*/
export declare const getInfo: (tags: TagsTranslations[], entitiesPath: string) => Promise<TagTranslation[]>;

View File

@ -0,0 +1,7 @@
/**
* Проверяет наличие ОИД'а (ОИД'ов) у сертификата
*
* @param oids - ОИД'ы для проверки
* @returns флаг наличия ОИД'ов у сертификата
*/
export declare const hasExtendedKeyUsage: (oids: string | string[]) => Promise<boolean>;

1
lib/api/certificate/index.d.ts vendored Normal file
View File

@ -0,0 +1 @@
export * from './certificate';

6
lib/api/certificate/isValid.d.ts vendored Normal file
View File

@ -0,0 +1,6 @@
/**
* Проверяет действительность сертификата
*
* @returns флаг валидности
*/
export declare const isValid: () => Promise<boolean>;

8
lib/api/createAttachedSignature.d.ts vendored Normal file
View File

@ -0,0 +1,8 @@
/**
* Создает присоединенную подпись сообщения по отпечатку сертификата
*
* @param thumbprint - отпечаток сертификата
* @param message - подписываемое сообщение
* @returns подпись в формате PKCS#7
*/
export declare const createAttachedSignature: (thumbprint: string, unencryptedMessage: string | ArrayBuffer) => Promise<string>;

8
lib/api/createDetachedSignature.d.ts vendored Normal file
View File

@ -0,0 +1,8 @@
/**
* Создает отсоединенную подпись хеша по отпечатку сертификата
*
* @param thumbprint - отпечаток сертификата
* @param messageHash - хеш подписываемого сообщения, сгенерированный по ГОСТ Р 34.11-2012 256 бит
* @returns подпись в формате PKCS#7
*/
export declare const createDetachedSignature: (thumbprint: string, messageHash: string) => Promise<string>;

9
lib/api/createHash.d.ts vendored Normal file
View File

@ -0,0 +1,9 @@
/**
* Создает хеш сообщения по ГОСТ Р 34.11-2012 256 бит
* https://ru.wikipedia.org/wiki/%D0%A1%D1%82%D1%80%D0%B8%D0%B1%D0%BE%D0%B3_(%D1%85%D0%B5%D1%88-%D1%84%D1%83%D0%BD%D0%BA%D1%86%D0%B8%D1%8F)
*
* @param unencryptedMessage - сообщение для хеширования
*
* @returns хеш
*/
export declare const createHash: (unencryptedMessage: string | ArrayBuffer) => Promise<string>;

8
lib/api/createXMLSignature.d.ts vendored Normal file
View File

@ -0,0 +1,8 @@
/**
* Создает XML подпись для документа в формате XML
*
* @param thumbprint - отпечаток сертификата
* @param unencryptedMessage - подписываемое сообщение в формате XML
* @returns подпись
*/
export declare const createXMLSignature: (thumbprint: string, unencryptedMessage: string) => Promise<string>;

8
lib/api/getAllCertificates.d.ts vendored Normal file
View File

@ -0,0 +1,8 @@
import { Certificate } from './certificate';
/**
* Возвращает список сертификатов, доступных пользователю из пользовательского хранилища и закрытых ключей, не установленных в системе, без фильтрации по дате и наличию приватного ключа
*
* @param resetCache = false - позволяет сбросить кэш ранее полученных сертификатов
* @returns список сертификатов
*/
export declare const getAllCertificates: (resetCache?: boolean) => Promise<Certificate[]>;

View File

@ -0,0 +1,9 @@
import { Certificate } from './certificate';
/**
* Начиная с версии плагина 2.0.13292 есть возможность получить сертификаты из закрытых ключей
* Возвращает все сертификаты без фильтрации по дате и наличию приватного ключа
*
* @param resetCache = false - позволяет сбросить кэш ранее полученных сертификатов
* @returns список сертификатов
*/
export declare const getAllContainerCertificates: (resetCache?: boolean) => Promise<Certificate[]>;

8
lib/api/getAllUserCertificates.d.ts vendored Normal file
View File

@ -0,0 +1,8 @@
import { Certificate } from './certificate';
/**
* Возвращает все сертификаты без фильтрации по дате и наличию приватного ключа
*
* @param resetCache = false - позволяет сбросить кэш ранее полученных сертификатов
* @returns список сертификатов
*/
export declare const getAllUserCertificates: (resetCache?: boolean) => Promise<Certificate[]>;

9
lib/api/getCertificate.d.ts vendored Normal file
View File

@ -0,0 +1,9 @@
import { Certificate } from './certificate';
/**
* Возвращает сертификат по отпечатку
*
* @param thumbprint - отпечаток сертификата
* @param validOnly - проверять сертификаты по дате и наличию приватного ключа
* @returns сертификат
*/
export declare const getCertificate: (thumbprint: string, validOnly?: boolean) => Promise<Certificate>;

8
lib/api/getCertificates.d.ts vendored Normal file
View File

@ -0,0 +1,8 @@
import { Certificate } from './certificate';
/**
* Возвращает список сертификатов, доступных пользователю из пользовательского хранилища и закрытых ключей, не установленных в системе
*
* @param resetCache = false - позволяет сбросить кэш ранее полученных сертификатов
* @returns список сертификатов
*/
export declare const getCertificates: (resetCache?: boolean) => Promise<Certificate[]>;

9
lib/api/getContainerCertificates.d.ts vendored Normal file
View File

@ -0,0 +1,9 @@
import { Certificate } from './certificate';
/**
* Начиная с версии плагина 2.0.13292 есть возможность получить сертификаты из закрытых ключей
* Возвращает список сертификатов, доступных пользователю в системе
*
* @param resetCache = false - позволяет сбросить кэш ранее полученных сертификатов
* @returns список сертификатов
*/
export declare const getContainerCertificates: (resetCache?: boolean) => Promise<Certificate[]>;

6
lib/api/getCspVersion.d.ts vendored Normal file
View File

@ -0,0 +1,6 @@
/**
* Предоставляет информацию о системе
*
* @returns информацию о CSP
*/
export declare const getCspVersion: () => Promise<string>;

6
lib/api/getPluginVersion.d.ts vendored Normal file
View File

@ -0,0 +1,6 @@
/**
* Предоставляет информацию о системе
*
* @returns информацию о плагине
*/
export declare const getPluginVersion: () => Promise<string>;

10
lib/api/getSystemInfo.d.ts vendored Normal file
View File

@ -0,0 +1,10 @@
export interface SystemInfo {
cadesVersion: string;
cspVersion: string;
}
/**
* Предоставляет информацию о системе
*
* @returns информацию о CSP и плагине
*/
export declare const getSystemInfo: () => Promise<SystemInfo>;

8
lib/api/getUserCertificates.d.ts vendored Normal file
View File

@ -0,0 +1,8 @@
import { Certificate } from './certificate';
/**
* Возвращает список сертификатов, доступных пользователю в системе
*
* @param resetCache = false - позволяет сбросить кэш ранее полученных сертификатов
* @returns список сертификатов
*/
export declare const getUserCertificates: (resetCache?: boolean) => Promise<Certificate[]>;

18
lib/api/index.d.ts vendored Normal file
View File

@ -0,0 +1,18 @@
export * from './getCertificate';
export * from './getUserCertificates';
export * from './getAllUserCertificates';
export * from './getContainerCertificates';
export * from './getAllContainerCertificates';
export * from './getCertificates';
export * from './getAllCertificates';
export * from './getSystemInfo';
export * from './isValidSystemSetup';
export * from './createXMLSignature';
export * from './createDetachedSignature';
export * from './addDetachedSignature';
export * from './createAttachedSignature';
export * from './addAttachedSignature';
export * from './createHash';
export * from './certificate';
export * from './getCspVersion';
export * from './getPluginVersion';

6
lib/api/isValidSystemSetup.d.ts vendored Normal file
View File

@ -0,0 +1,6 @@
/**
* Проверяет корректность настроек ЭП на машине
*
* @returns флаг корректности настроек
*/
export declare const isValidSystemSetup: () => Promise<boolean>;

149
lib/constants/cades-constants.d.ts vendored Normal file
View File

@ -0,0 +1,149 @@
export declare const CADESCOM_ATTRIBUTE_OTHER = -1;
export declare const CADESCOM_AUTHENTICATED_ATTRIBUTE_DOCUMENT_DESCRIPTION = 2;
export declare const CADESCOM_AUTHENTICATED_ATTRIBUTE_DOCUMENT_NAME = 1;
export declare const CADESCOM_AUTHENTICATED_ATTRIBUTE_SIGNING_TIME = 0;
export declare const CADESCOM_AllowNoOutstandingRequest = 1;
export declare const CADESCOM_AllowNone = 0;
export declare const CADESCOM_AllowUntrustedCertificate = 2;
export declare const CADESCOM_AllowUntrustedRoot = 4;
export declare const CADESCOM_BASE64_TO_BINARY = 1;
export declare const CADESCOM_CADES_BES = 1;
export declare const CADESCOM_CADES_DEFAULT = 0;
export declare const CADESCOM_CADES_T = 5;
export declare const CADESCOM_CADES_X_LONG_TYPE_1 = 93;
export declare const CADESCOM_CONTAINER_STORE = 100;
export declare const CADESCOM_CURRENT_USER_STORE = 2;
export declare const CADESCOM_DISPLAY_DATA_ATTRIBUTE = 2;
export declare const CADESCOM_DISPLAY_DATA_CONTENT = 1;
export declare const CADESCOM_DISPLAY_DATA_NONE = 0;
export declare const CADESCOM_ENCODE_ANY = -1;
export declare const CADESCOM_ENCODE_BASE64 = 0;
export declare const CADESCOM_ENCODE_BINARY = 1;
export declare const CADESCOM_ENCRYPTION_ALGORITHM_3DES = 3;
export declare const CADESCOM_ENCRYPTION_ALGORITHM_AES = 4;
export declare const CADESCOM_ENCRYPTION_ALGORITHM_DES = 2;
export declare const CADESCOM_ENCRYPTION_ALGORITHM_GOST_28147_89 = 25;
export declare const CADESCOM_ENCRYPTION_ALGORITHM_RC2 = 0;
export declare const CADESCOM_ENCRYPTION_ALGORITHM_RC4 = 1;
export declare const CADESCOM_HASH_ALGORITHM_CP_GOST_3411 = 100;
export declare const CADESCOM_HASH_ALGORITHM_CP_GOST_3411_2012_256 = 101;
export declare const CADESCOM_HASH_ALGORITHM_CP_GOST_3411_2012_256_HMAC = 111;
export declare const CADESCOM_HASH_ALGORITHM_CP_GOST_3411_2012_512 = 102;
export declare const CADESCOM_HASH_ALGORITHM_CP_GOST_3411_2012_512_HMAC = 112;
export declare const CADESCOM_HASH_ALGORITHM_CP_GOST_3411_HMAC = 110;
export declare const CADESCOM_HASH_ALGORITHM_MD2 = 1;
export declare const CADESCOM_HASH_ALGORITHM_MD4 = 2;
export declare const CADESCOM_HASH_ALGORITHM_MD5 = 3;
export declare const CADESCOM_HASH_ALGORITHM_SHA1 = 0;
export declare const CADESCOM_HASH_ALGORITHM_SHA_256 = 4;
export declare const CADESCOM_HASH_ALGORITHM_SHA_384 = 5;
export declare const CADESCOM_HASH_ALGORITHM_SHA_512 = 6;
export declare const CADESCOM_LOCAL_MACHINE_STORE = 1;
export declare const CADESCOM_PKCS7_TYPE = 65535;
export declare const CADESCOM_STRING_TO_UCS2LE = 0;
export declare const CADESCOM_SkipInstallToStore = 268435456;
export declare const CADESCOM_XML_SIGNATURE_TYPE_ENVELOPED = 0;
export declare const CADESCOM_XML_SIGNATURE_TYPE_ENVELOPING = 1;
export declare const CADESCOM_XML_SIGNATURE_TYPE_TEMPLATE = 2;
export declare const CAPICOM_ACTIVE_DIRECTORY_USER_STORE = 3;
export declare const CAPICOM_AUTHENTICATED_ATTRIBUTE_DOCUMENT_DESCRIPTION = 2;
export declare const CAPICOM_AUTHENTICATED_ATTRIBUTE_DOCUMENT_NAME = 1;
export declare const CAPICOM_AUTHENTICATED_ATTRIBUTE_SIGNING_TIME = 0;
export declare const CAPICOM_CERTIFICATE_FIND_APPLICATION_POLICY = 7;
export declare const CAPICOM_CERTIFICATE_FIND_CERTIFICATE_POLICY = 8;
export declare const CAPICOM_CERTIFICATE_FIND_EXTENDED_PROPERTY = 6;
export declare const CAPICOM_CERTIFICATE_FIND_EXTENSION = 5;
export declare const CAPICOM_CERTIFICATE_FIND_ISSUER_NAME = 2;
export declare const CAPICOM_CERTIFICATE_FIND_KEY_USAGE = 12;
export declare const CAPICOM_CERTIFICATE_FIND_ROOT_NAME = 3;
export declare const CAPICOM_CERTIFICATE_FIND_SHA1_HASH = 0;
export declare const CAPICOM_CERTIFICATE_FIND_SUBJECT_NAME = 1;
export declare const CAPICOM_CERTIFICATE_FIND_TEMPLATE_NAME = 4;
export declare const CAPICOM_CERTIFICATE_FIND_TIME_EXPIRED = 11;
export declare const CAPICOM_CERTIFICATE_FIND_TIME_NOT_YET_VALID = 10;
export declare const CAPICOM_CERTIFICATE_FIND_TIME_VALID = 9;
export declare const CAPICOM_CERTIFICATE_INCLUDE_CHAIN_EXCEPT_ROOT = 0;
export declare const CAPICOM_CERTIFICATE_INCLUDE_END_ENTITY_ONLY = 2;
export declare const CAPICOM_CERTIFICATE_INCLUDE_WHOLE_CHAIN = 1;
export declare const CAPICOM_CERT_INFO_ISSUER_SIMPLE_NAME = 1;
export declare const CAPICOM_CERT_INFO_SUBJECT_SIMPLE_NAME = 0;
export declare const CAPICOM_CURRENT_USER_STORE = 2;
export declare const CAPICOM_DIGITAL_SIGNATURE_KEY_USAGE = 128;
export declare const CAPICOM_EKU_CLIENT_AUTH = 2;
export declare const CAPICOM_EKU_OTHER = 0;
export declare const CAPICOM_EKU_SMARTCARD_LOGON = 5;
export declare const CAPICOM_LOCAL_MACHINE_STORE = 1;
export declare const CAPICOM_MEMORY_STORE = 0;
export declare const CAPICOM_MY_STORE = "My";
export declare const CAPICOM_OID_KEY_USAGE_EXTENSION = 10;
export declare const CAPICOM_OID_OTHER = 0;
export declare const CAPICOM_PROPID_ACCESS_STATE = 14;
export declare const CAPICOM_PROPID_ARCHIVED = 19;
export declare const CAPICOM_PROPID_ARCHIVED_KEY_HASH = 65;
export declare const CAPICOM_PROPID_AUTO_ENROLL = 21;
export declare const CAPICOM_PROPID_CROSS_CERT_DIST_POINTS = 23;
export declare const CAPICOM_PROPID_CTL_USAGE = 9;
export declare const CAPICOM_PROPID_DATE_STAMP = 27;
export declare const CAPICOM_PROPID_DESCRIPTION = 13;
export declare const CAPICOM_PROPID_EFS = 17;
export declare const CAPICOM_PROPID_ENHKEY_USAGE = 9;
export declare const CAPICOM_PROPID_ENROLLMENT = 26;
export declare const CAPICOM_PROPID_EXTENDED_ERROR_INFO = 30;
export declare const CAPICOM_PROPID_FIRST_RESERVED = 66;
export declare const CAPICOM_PROPID_FIRST_USER = 32768;
export declare const CAPICOM_PROPID_FORTEZZA_DATA = 18;
export declare const CAPICOM_PROPID_FRIENDLY_NAME = 11;
export declare const CAPICOM_PROPID_HASH_PROP = 3;
export declare const CAPICOM_PROPID_IE30_RESERVED = 7;
export declare const CAPICOM_PROPID_ISSUER_PUBLIC_KEY_MD5_HASH = 24;
export declare const CAPICOM_PROPID_ISSUER_SERIAL_NUMBER_MD5_HASH = 28;
export declare const CAPICOM_PROPID_KEY_CONTEXT = 5;
export declare const CAPICOM_PROPID_KEY_IDENTIFIER = 20;
export declare const CAPICOM_PROPID_KEY_PROV_HANDLE = 1;
export declare const CAPICOM_PROPID_KEY_PROV_INFO = 2;
export declare const CAPICOM_PROPID_KEY_SPEC = 6;
export declare const CAPICOM_PROPID_LAST_RESERVED = 32767;
export declare const CAPICOM_PROPID_LAST_USER = 65535;
export declare const CAPICOM_PROPID_MD5_HASH = 4;
export declare const CAPICOM_PROPID_NEXT_UPDATE_LOCATION = 10;
export declare const CAPICOM_PROPID_PUBKEY_ALG_PARA = 22;
export declare const CAPICOM_PROPID_PUBKEY_HASH_RESERVED = 8;
export declare const CAPICOM_PROPID_PVK_FILE = 12;
export declare const CAPICOM_PROPID_RENEWAL = 64;
export declare const CAPICOM_PROPID_SHA1_HASH = 3;
export declare const CAPICOM_PROPID_SIGNATURE_HASH = 15;
export declare const CAPICOM_PROPID_SMART_CARD_DATA = 16;
export declare const CAPICOM_PROPID_SUBJECT_NAME_MD5_HASH = 29;
export declare const CAPICOM_PROPID_SUBJECT_PUBLIC_KEY_MD5_HASH = 25;
export declare const CAPICOM_PROPID_UNKNOWN = 0;
export declare const CAPICOM_SMART_CARD_USER_STORE = 4;
export declare const CAPICOM_STORE_OPEN_EXISTING_ONLY = 128;
export declare const CAPICOM_STORE_OPEN_INCLUDE_ARCHIVED = 256;
export declare const CAPICOM_STORE_OPEN_MAXIMUM_ALLOWED = 2;
export declare const CAPICOM_STORE_OPEN_READ_ONLY = 0;
export declare const CAPICOM_STORE_OPEN_READ_WRITE = 1;
export declare const CHECK_NONE = 0;
export declare const CHECK_OFFLINE_REVOCATION_STATUS = 16;
export declare const CHECK_ONLINE_REVOCATION_STATUS = 8;
export declare const CHECK_SIGNATURE_VALIDITY = 4;
export declare const CHECK_TIME_VALIDITY = 2;
export declare const CHECK_TRUSTED_ROOT = 1;
export declare const LOG_LEVEL_DEBUG = 4;
export declare const LOG_LEVEL_ERROR = 1;
export declare const LOG_LEVEL_INFO = 2;
export declare const TRUST_CTL_IS_NOT_SIGNATURE_VALID = 262144;
export declare const TRUST_CTL_IS_NOT_TIME_VALID = 131072;
export declare const TRUST_CTL_IS_NOT_VALID_FOR_USAGE = 524288;
export declare const TRUST_IS_CYCLIC = 128;
export declare const TRUST_IS_NOT_SIGNATURE_VALID = 8;
export declare const TRUST_IS_NOT_TIME_NESTED = 2;
export declare const TRUST_IS_NOT_TIME_VALID = 1;
export declare const TRUST_IS_NOT_VALID_FOR_USAGE = 16;
export declare const TRUST_IS_PARTIAL_CHAIN = 65536;
export declare const TRUST_IS_REVOKED = 4;
export declare const TRUST_IS_UNTRUSTED_ROOT = 32;
export declare const TRUST_REVOCATION_STATUS_UNKNOWN = 64;
export declare const XmlDsigGost3410Url = "urn:ietf:params:xml:ns:cpxmlsec:algorithms:gostr34102001-gostr3411";
export declare const XmlDsigGost3410UrlObsolete = "http://www.w3.org/2001/04/xmldsig-more#gostr34102001-gostr3411";
export declare const XmlDsigGost3411Url = "urn:ietf:params:xml:ns:cpxmlsec:algorithms:gostr3411";
export declare const XmlDsigGost3411UrlObsolete = "http://www.w3.org/2001/04/xmldsig-more#gostr3411";

4
lib/constants/index.d.ts vendored Normal file
View File

@ -0,0 +1,4 @@
export * from './cades-constants';
export * from './issuer-tags-translations';
export * from './oids-dictionary';
export * from './subject-tags-translations';

View File

@ -0,0 +1,2 @@
import { TagsTranslations } from './tags-translations';
export declare const ISSUER_TAGS_TRANSLATIONS: TagsTranslations[];

44
lib/constants/oids-dictionary.d.ts vendored Normal file
View File

@ -0,0 +1,44 @@
export declare const OIDS_DICTIONARY: {
'1.2.643.2.2.34.6': string;
'1.2.643.2.39.1.1': string;
'1.2.643.3.131.1.1': string;
'1.2.643.3.141.1.1': string;
'1.2.643.3.141.1.2': string;
'1.2.643.3.2.100.65.13.11': string;
'1.2.643.3.8.100.1': string;
'1.2.643.3.8.100.1.1': string;
'1.2.643.3.8.100.1.10': string;
'1.2.643.3.8.100.1.11': string;
'1.2.643.3.8.100.1.12': string;
'1.2.643.3.8.100.1.13': string;
'1.2.643.3.8.100.1.14': string;
'1.2.643.3.8.100.1.2': string;
'1.2.643.3.8.100.1.3': string;
'1.2.643.3.8.100.1.4': string;
'1.2.643.3.8.100.1.5': string;
'1.2.643.3.8.100.1.6': string;
'1.2.643.3.8.100.1.7': string;
'1.2.643.3.8.100.1.8': string;
'1.2.643.3.8.100.1.9': string;
'1.2.643.5.1.24.2.1.3': string;
'1.2.643.5.1.24.2.1.3.1': string;
'1.2.643.5.1.24.2.2.2': string;
'1.2.643.5.1.24.2.2.3': string;
'1.2.643.6.2.1.7.1': string;
'1.2.643.6.2.1.7.2': string;
'1.2.643.6.3': string;
'1.2.643.6.3.1.1': string;
'1.2.643.6.3.1.2.1': string;
'1.2.643.6.3.1.2.2': string;
'1.2.643.6.3.1.2.3': string;
'1.2.643.6.3.1.3.1': string;
'1.2.643.6.3.1.4.1': string;
'1.2.643.6.3.1.4.2': string;
'1.2.643.6.3.1.4.3': string;
'1.2.840.113549.1.9.2': string;
'1.3.6.1.4.1.24138.1.1.8.1': string;
'1.3.6.1.4.1.29919.21': string;
'1.3.6.1.5.5.7.3.2': string;
'1.3.6.1.5.5.7.3.4': string;
'1.3.643.3.8.100.15': string;
};

View File

@ -0,0 +1,2 @@
import { TagsTranslations } from './tags-translations';
export declare const SUBJECT_TAGS_TRANSLATIONS: TagsTranslations[];

4
lib/constants/tags-translations.d.ts vendored Normal file
View File

@ -0,0 +1,4 @@
export interface TagsTranslations {
possibleNames: string[];
translation: string;
}

5
lib/crypto-pro-js.d.ts vendored Normal file
View File

@ -0,0 +1,5 @@
// Type definitions for crypto-pro-js 2.3.1
// Project: crypto-pro-js
// Definitions by: Artem Vasilev https://github.com/kernusr
export * from './api';

5421
lib/crypto-pro-js.js Normal file

File diff suppressed because it is too large Load Diff

1
lib/crypto-pro-js.js.map Normal file

File diff suppressed because one or more lines are too long

3
lib/helpers/_afterPluginsLoaded.d.ts vendored Normal file
View File

@ -0,0 +1,3 @@
declare type Unpromisify<T> = T extends Promise<infer R> ? R : T;
export declare const _afterPluginsLoaded: <T extends (...args: any[]) => any>(fn: T) => (...args: Parameters<T>) => Promise<Unpromisify<ReturnType<T>>>;
export {};

1
lib/helpers/_extractCommonName.d.ts vendored Normal file
View File

@ -0,0 +1 @@
export declare const _extractCommonName: (subjectName: string) => string;

View File

@ -0,0 +1 @@
export declare const _extractMeaningfulErrorMessage: (error: Error) => string;

3
lib/helpers/_generateCadesFn.d.ts vendored Normal file
View File

@ -0,0 +1,3 @@
export declare const __cadesAsyncToken__: {};
export declare const __createCadesPluginObject__: (...args: any[]) => any;
export declare const _generateCadesFn: (callback: Function) => string;

7
lib/helpers/_getCadesCert.d.ts vendored Normal file
View File

@ -0,0 +1,7 @@
/**
* Возвращает сертификат в формате Cades по отпечатку
*
* @param thumbprint - отпечаток сертификата
* @returns сертификат в формате Cades
*/
export declare const _getCadesCert: (thumbprint: string) => Promise<any>;

View File

@ -0,0 +1,7 @@
/**
* Возвращает сертификат в формате Cades по отпечатку из хранилища закрытого ключа
*
* @param thumbprint - отпечаток сертификата
* @returns сертификат в формате Cades
*/
export declare const _getCadesContainerCert: (thumbprint: string) => Promise<any>;

7
lib/helpers/_getCadesUserCert.d.ts vendored Normal file
View File

@ -0,0 +1,7 @@
/**
* Возвращает сертификат в формате Cades по отпечатку из хранилища пользователя
*
* @param thumbprint - отпечаток сертификата
* @returns сертификат в формате Cades
*/
export declare const _getCadesUserCert: (thumbprint: string) => Promise<any>;

7
lib/helpers/_getDateObj.d.ts vendored Normal file
View File

@ -0,0 +1,7 @@
/**
* Возвращает объект даты, совместимый с Cades plugin'ом, зависящий от браузера.
*
* В IE необходимо использовать специфичный формат "VT_DATE"
* https://developer.mozilla.org/en-US/docs/Web/JavaScript/Microsoft_Extensions/Date.getVarDate
*/
export declare const _getDateObj: (dateObj: any) => Date;

View File

@ -0,0 +1 @@
export declare const _isSupportedCSPVersion: (version: string) => boolean;

View File

@ -0,0 +1 @@
export declare const _isSupportedCadesVersion: (version: string) => boolean;

14
lib/helpers/_parseCertInfo.d.ts vendored Normal file
View File

@ -0,0 +1,14 @@
import { TagsTranslations } from '../constants/tags-translations';
export interface TagTranslation {
description: string;
title: string;
isTranslated: boolean;
}
/**
* Парсит информацию из строки с информацией о сертификате
*
* @param tagsTranslations - словарь с расшифровками тэгов
* @param rawInfo - данные для парсинга
* @returns расшифрованная информация по отдельным тэгам
*/
export declare const _parseCertInfo: (tagsTranslations: TagsTranslations[], rawInfo: string) => TagTranslation[];

62
src/api/getAllCertificates.ts Executable file
View File

@ -0,0 +1,62 @@
import { Certificate } from './certificate';
import { _afterPluginsLoaded } from '../helpers/_afterPluginsLoaded';
import { getAllUserCertificates } from './getAllUserCertificates';
import { getAllContainerCertificates } from './getAllContainerCertificates';
let certificatesCache: Certificate[];
/**
* Возвращает список сертификатов, доступных пользователю из пользовательского хранилища и закрытых ключей, не установленных в системе, без фильтрации по дате и наличию приватного ключа
*
* @param resetCache = false - позволяет сбросить кэш ранее полученных сертификатов
* @returns список сертификатов
*/
export const getAllCertificates = _afterPluginsLoaded(
async (resetCache: boolean = false): Promise<Certificate[]> => {
if (!resetCache && certificatesCache) {
return certificatesCache;
}
let availableCertificates: Certificate[];
try {
availableCertificates = await getAllUserCertificates(resetCache);
} catch (error) {
console.error(error);
availableCertificates = [];
}
try {
const containerAllCertificates: Certificate[] = await getAllContainerCertificates(resetCache);
if (!availableCertificates) {
availableCertificates = containerAllCertificates;
} else {
let containerAllCertificatesCount = containerAllCertificates.length - 1;
let foundAvailableCertificate;
while (containerAllCertificatesCount) {
foundAvailableCertificate = availableCertificates.find(
(cert) => cert.thumbprint === containerAllCertificates[containerAllCertificatesCount].thumbprint,
);
if (!foundAvailableCertificate) {
availableCertificates.push(containerAllCertificates[containerAllCertificatesCount]);
}
containerAllCertificatesCount--;
}
}
} catch (error) {
console.error(error);
}
if (!availableCertificates) {
throw new Error('Нет доступных сертификатов');
}
certificatesCache = availableCertificates;
return certificatesCache;
},
);

View File

@ -0,0 +1,60 @@
import 'cadesplugin';
import { rawCertificates, parsedCertificates } from '../__mocks__/certificates';
import { getAllContainerCertificates } from './getAllContainerCertificates';
const [rawCertificateMock] = rawCertificates;
const [parsedCertificateMock] = parsedCertificates;
const executionSteps = [
Symbol('step 0'),
Symbol('step 1'),
Symbol('step 2'),
Symbol('step 3'),
Symbol('step 4'),
Symbol('step 5'),
Symbol('step 6'),
Symbol('step 7'),
Symbol('step 8'),
];
const executionFlow = {
[executionSteps[0]]: {
Certificates: executionSteps[1],
Close: jest.fn(),
Open: jest.fn(),
},
[executionSteps[1]]: {
Count: executionSteps[2],
Item: jest.fn(() => executionSteps[3]),
},
[executionSteps[2]]: 1,
[executionSteps[3]]: {
IssuerName: executionSteps[6],
SubjectName: executionSteps[5],
Thumbprint: executionSteps[4],
ValidFromDate: executionSteps[7],
ValidToDate: executionSteps[8],
},
[executionSteps[6]]: rawCertificateMock.IssuerName,
[executionSteps[5]]: rawCertificateMock.SubjectName,
[executionSteps[4]]: rawCertificateMock.Thumbprint,
[executionSteps[7]]: rawCertificateMock.ValidFromDate,
[executionSteps[8]]: rawCertificateMock.ValidToDate,
};
window.cadesplugin.__defineExecutionFlow(executionFlow);
window.cadesplugin.CreateObjectAsync.mockImplementation(() => executionSteps[0]);
describe('getUserCertificates', () => {
test('returns certificates list', async () => {
const certificates = await getAllContainerCertificates();
expect(certificates.length).toBeGreaterThan(0);
});
test('returns certificates with correct fields', async () => {
const [certificate] = await getAllContainerCertificates();
expect(certificate).toMatchObject(parsedCertificateMock);
});
});

View File

@ -0,0 +1,100 @@
import { CadesCertificate, Certificate } from './certificate';
import { _afterPluginsLoaded } from '../helpers/_afterPluginsLoaded';
import { _extractCommonName } from '../helpers/_extractCommonName';
import { _extractMeaningfulErrorMessage } from '../helpers/_extractMeaningfulErrorMessage';
import { __cadesAsyncToken__, __createCadesPluginObject__, _generateCadesFn } from '../helpers/_generateCadesFn';
let certificatesCache: Certificate[];
/**
* Начиная с версии плагина 2.0.13292 есть возможность получить сертификаты из закрытых ключей
* Возвращает все сертификаты без фильтрации по дате и наличию приватного ключа
*
* @param resetCache = false - позволяет сбросить кэш ранее полученных сертификатов
* @returns список сертификатов
*/
export const getAllContainerCertificates = _afterPluginsLoaded((resetCache: boolean = false): Certificate[] => {
const { cadesplugin } = window;
if (!resetCache && certificatesCache) {
return certificatesCache;
}
return eval(
_generateCadesFn(function getAllContainerCertificates(): Certificate[] {
let cadesStore;
try {
cadesStore = __cadesAsyncToken__ + __createCadesPluginObject__('CAdESCOM.Store');
} catch (error) {
console.error(error);
throw new Error(_extractMeaningfulErrorMessage(error) || 'Ошибка при попытке доступа к хранилищу');
}
try {
void (
__cadesAsyncToken__ +
cadesStore.Open(
cadesplugin.CADESCOM_CONTAINER_STORE,
cadesplugin.CAPICOM_MY_STORE,
cadesplugin.CAPICOM_STORE_OPEN_MAXIMUM_ALLOWED,
)
);
} catch (error) {
console.error(error);
throw new Error(_extractMeaningfulErrorMessage(error) || 'Ошибка при открытии хранилища');
}
let cadesCertificates;
let cadesCertificatesCount;
try {
cadesCertificates = __cadesAsyncToken__ + cadesStore.Certificates;
cadesCertificatesCount = __cadesAsyncToken__ + cadesCertificates.Count;
} catch (error) {
console.error(error);
throw new Error(_extractMeaningfulErrorMessage(error) || 'Ошибка получения списка сертификатов');
}
if (!cadesCertificatesCount) {
throw new Error('Нет доступных сертификатов');
}
const certificateList: Certificate[] = [];
try {
while (cadesCertificatesCount) {
const cadesCertificate: CadesCertificate =
__cadesAsyncToken__ + cadesCertificates.Item(cadesCertificatesCount);
certificateList.push(
new Certificate(
cadesCertificate,
_extractCommonName(__cadesAsyncToken__ + cadesCertificate.SubjectName),
__cadesAsyncToken__ + cadesCertificate.IssuerName,
__cadesAsyncToken__ + cadesCertificate.SubjectName,
__cadesAsyncToken__ + cadesCertificate.Thumbprint,
__cadesAsyncToken__ + cadesCertificate.ValidFromDate,
__cadesAsyncToken__ + cadesCertificate.ValidToDate,
),
);
cadesCertificatesCount--;
}
} catch (error) {
console.error(error);
throw new Error(_extractMeaningfulErrorMessage(error) || 'Ошибка обработки сертификатов');
}
cadesStore.Close();
certificatesCache = certificateList;
return certificatesCache;
}),
);
});

View File

@ -1,20 +1,29 @@
import { Certificate } from './certificate'; import { Certificate } from './certificate';
import { _afterPluginsLoaded } from '../helpers/_afterPluginsLoaded'; import { _afterPluginsLoaded } from '../helpers/_afterPluginsLoaded';
import { getUserCertificates } from './getUserCertificates'; import { getCertificates } from './getCertificates';
import { getAllCertificates } from './getAllCertificates';
/** /**
* Возвращает сертификат по отпечатку * Возвращает сертификат по отпечатку
* *
* @param thumbprint - отпечаток сертификата * @param thumbprint - отпечаток сертификата
* @param validOnly - проверять сертификаты по дате и наличию приватного ключа
* @returns сертификат * @returns сертификат
*/ */
export const getCertificate = _afterPluginsLoaded( export const getCertificate = _afterPluginsLoaded(
async (thumbprint: string): Promise<Certificate> => { async (thumbprint: string, validOnly: boolean = true): Promise<Certificate> => {
if (!thumbprint) { if (!thumbprint) {
throw new Error('Отпечаток не указан'); throw new Error('Отпечаток не указан');
} }
const availableCertificates: Certificate[] = await getUserCertificates(); let availableCertificates: Certificate[];
if (validOnly) {
availableCertificates = await getCertificates();
} else {
availableCertificates = await getAllCertificates();
}
const foundCertificate: Certificate = availableCertificates.find((cert) => cert.thumbprint === thumbprint); const foundCertificate: Certificate = availableCertificates.find((cert) => cert.thumbprint === thumbprint);
if (!foundCertificate) { if (!foundCertificate) {

64
src/api/getCertificates.ts Executable file
View File

@ -0,0 +1,64 @@
import { Certificate } from './certificate';
import { _afterPluginsLoaded } from '../helpers/_afterPluginsLoaded';
import { getUserCertificates } from './getUserCertificates';
import { getContainerCertificates } from './getContainerCertificates';
import { getAllUserCertificates } from './getAllUserCertificates';
import { getAllContainerCertificates } from './getAllContainerCertificates';
let certificatesCache: Certificate[];
/**
* Возвращает список сертификатов, доступных пользователю из пользовательского хранилища и закрытых ключей, не установленных в системе
*
* @param resetCache = false - позволяет сбросить кэш ранее полученных сертификатов
* @returns список сертификатов
*/
export const getCertificates = _afterPluginsLoaded(
async (resetCache: boolean = false): Promise<Certificate[]> => {
if (!resetCache && certificatesCache) {
return certificatesCache;
}
let availableCertificates: Certificate[];
try {
availableCertificates = await getUserCertificates(resetCache);
} catch (error) {
console.error(error);
availableCertificates = [];
}
try {
const containerCertificates: Certificate[] = await getContainerCertificates(resetCache);
if (!availableCertificates) {
availableCertificates = containerCertificates;
} else {
let containerCertificatesCount = containerCertificates.length - 1;
let foundAvailableCertificate;
while (containerCertificatesCount) {
foundAvailableCertificate = availableCertificates.find(
(cert) => cert.thumbprint === containerCertificates[containerCertificatesCount].thumbprint,
);
if (!foundAvailableCertificate) {
availableCertificates.push(containerCertificates[containerCertificatesCount]);
}
containerCertificatesCount--;
}
}
} catch (error) {
console.error(error);
}
if (!availableCertificates) {
throw new Error('Нет доступных сертификатов');
}
certificatesCache = availableCertificates;
return certificatesCache;
},
);

View File

@ -0,0 +1,68 @@
import 'cadesplugin';
import { rawCertificates, parsedCertificates } from '../__mocks__/certificates';
import { getContainerCertificates } from './getContainerCertificates';
const [rawCertificateMock] = rawCertificates;
const [parsedCertificateMock] = parsedCertificates;
const executionSteps = [
Symbol('step 0'),
Symbol('step 1'),
Symbol('step 2'),
Symbol('step 3'),
Symbol('step 4'),
Symbol('step 5'),
Symbol('step 6'),
Symbol('step 7'),
Symbol('step 8'),
Symbol('step 9'),
Symbol('step 10'),
];
const executionFlow = {
[executionSteps[0]]: {
Certificates: executionSteps[1],
Close: jest.fn(),
Open: jest.fn(),
},
[executionSteps[1]]: {
Find: jest.fn(() => executionSteps[2]),
},
[executionSteps[2]]: {
Find: jest.fn(() => executionSteps[3]),
},
[executionSteps[3]]: {
Count: executionSteps[4],
Item: jest.fn(() => executionSteps[5]),
},
[executionSteps[4]]: 1,
[executionSteps[5]]: {
IssuerName: executionSteps[8],
SubjectName: executionSteps[7],
Thumbprint: executionSteps[6],
ValidFromDate: executionSteps[9],
ValidToDate: executionSteps[10],
},
[executionSteps[8]]: rawCertificateMock.IssuerName,
[executionSteps[7]]: rawCertificateMock.SubjectName,
[executionSteps[6]]: rawCertificateMock.Thumbprint,
[executionSteps[9]]: rawCertificateMock.ValidFromDate,
[executionSteps[10]]: rawCertificateMock.ValidToDate,
};
window.cadesplugin.__defineExecutionFlow(executionFlow);
window.cadesplugin.CreateObjectAsync.mockImplementation(() => executionSteps[0]);
describe('getContainerCertificates', () => {
test('returns certificates list', async () => {
const certificates = await getContainerCertificates();
expect(certificates.length).toBeGreaterThan(0);
});
test('returns certificates with correct fields', async () => {
const [certificate] = await getContainerCertificates();
expect(certificate).toMatchObject(parsedCertificateMock);
});
});

View File

@ -0,0 +1,118 @@
import { CadesCertificate, Certificate } from './certificate';
import { CAPICOM_PROPID_KEY_PROV_INFO } from '../constants';
import { _afterPluginsLoaded } from '../helpers/_afterPluginsLoaded';
import { _extractCommonName } from '../helpers/_extractCommonName';
import { _extractMeaningfulErrorMessage } from '../helpers/_extractMeaningfulErrorMessage';
import { __cadesAsyncToken__, __createCadesPluginObject__, _generateCadesFn } from '../helpers/_generateCadesFn';
let certificatesCache: Certificate[];
/**
* Начиная с версии плагина 2.0.13292 есть возможность получить сертификаты из закрытых ключей
* Возвращает список сертификатов, доступных пользователю в системе
*
* @param resetCache = false - позволяет сбросить кэш ранее полученных сертификатов
* @returns список сертификатов
*/
export const getContainerCertificates = _afterPluginsLoaded((resetCache: boolean = false): Certificate[] => {
const { cadesplugin } = window;
if (!resetCache && certificatesCache) {
return certificatesCache;
}
return eval(
_generateCadesFn(function getContainerCertificates(): Certificate[] {
let cadesStore;
try {
cadesStore = __cadesAsyncToken__ + __createCadesPluginObject__('CAdESCOM.Store');
} catch (error) {
console.error(error);
throw new Error(_extractMeaningfulErrorMessage(error) || 'Ошибка при попытке доступа к хранилищу');
}
try {
void (
__cadesAsyncToken__ +
cadesStore.Open(
cadesplugin.CADESCOM_CONTAINER_STORE,
cadesplugin.CAPICOM_MY_STORE,
cadesplugin.CAPICOM_STORE_OPEN_MAXIMUM_ALLOWED,
)
);
} catch (error) {
console.error(error);
throw new Error(_extractMeaningfulErrorMessage(error) || 'Ошибка при открытии хранилища');
}
let cadesCertificates;
let cadesCertificatesCount;
try {
cadesCertificates = __cadesAsyncToken__ + cadesStore.Certificates;
if (cadesCertificates) {
cadesCertificates =
__cadesAsyncToken__ + cadesCertificates.Find(cadesplugin.CAPICOM_CERTIFICATE_FIND_TIME_VALID);
/**
* Не рассматриваются сертификаты, в которых отсутствует закрытый ключ
* или не действительны на данный момент
*/
cadesCertificates =
__cadesAsyncToken__ +
cadesCertificates.Find(
cadesplugin.CAPICOM_CERTIFICATE_FIND_EXTENDED_PROPERTY,
CAPICOM_PROPID_KEY_PROV_INFO,
);
cadesCertificatesCount = __cadesAsyncToken__ + cadesCertificates.Count;
}
} catch (error) {
console.error(error);
throw new Error(_extractMeaningfulErrorMessage(error) || 'Ошибка получения списка сертификатов');
}
if (!cadesCertificatesCount) {
throw new Error('Нет доступных сертификатов');
}
const certificateList: Certificate[] = [];
try {
while (cadesCertificatesCount) {
const cadesCertificate: CadesCertificate =
__cadesAsyncToken__ + cadesCertificates.Item(cadesCertificatesCount);
certificateList.push(
new Certificate(
cadesCertificate,
_extractCommonName(__cadesAsyncToken__ + cadesCertificate.SubjectName),
__cadesAsyncToken__ + cadesCertificate.IssuerName,
__cadesAsyncToken__ + cadesCertificate.SubjectName,
__cadesAsyncToken__ + cadesCertificate.Thumbprint,
__cadesAsyncToken__ + cadesCertificate.ValidFromDate,
__cadesAsyncToken__ + cadesCertificate.ValidToDate,
),
);
cadesCertificatesCount--;
}
} catch (error) {
console.error(error);
throw new Error(_extractMeaningfulErrorMessage(error) || 'Ошибка обработки сертификатов');
}
cadesStore.Close();
certificatesCache = certificateList;
return certificatesCache;
}),
);
});

View File

@ -1,6 +1,10 @@
export * from './getCertificate'; export * from './getCertificate';
export * from './getUserCertificates'; export * from './getUserCertificates';
export * from './getAllUserCertificates'; export * from './getAllUserCertificates';
export * from './getContainerCertificates';
export * from './getAllContainerCertificates';
export * from './getCertificates';
export * from './getAllCertificates';
export * from './getSystemInfo'; export * from './getSystemInfo';
export * from './isValidSystemSetup'; export * from './isValidSystemSetup';
export * from './createXMLSignature'; export * from './createXMLSignature';

View File

@ -1,7 +1,7 @@
import { CadesCertificate } from '../api/certificate'; import { CadesCertificate } from '../api/certificate';
import { _afterPluginsLoaded } from './_afterPluginsLoaded'; import { _afterPluginsLoaded } from './_afterPluginsLoaded';
import { _extractMeaningfulErrorMessage } from './_extractMeaningfulErrorMessage'; import { _getCadesUserCert } from './_getCadesUserCert';
import { __cadesAsyncToken__, __createCadesPluginObject__, _generateCadesFn } from './_generateCadesFn'; import { _getCadesContainerCert } from './_getCadesContainerCert';
/** /**
* Возвращает сертификат в формате Cades по отпечатку * Возвращает сертификат в формате Cades по отпечатку
@ -10,79 +10,17 @@ import { __cadesAsyncToken__, __createCadesPluginObject__, _generateCadesFn } fr
* @returns сертификат в формате Cades * @returns сертификат в формате Cades
*/ */
export const _getCadesCert = _afterPluginsLoaded( export const _getCadesCert = _afterPluginsLoaded(
(thumbprint: string): CadesCertificate => { async (thumbprint: string): Promise<CadesCertificate> => {
const { cadesplugin } = window;
return eval(
_generateCadesFn(function _getCadesCert() {
let cadesStore;
try {
cadesStore = __cadesAsyncToken__ + __createCadesPluginObject__('CAdESCOM.Store');
} catch (error) {
console.error(error);
throw new Error(_extractMeaningfulErrorMessage(error) || 'Ошибка при попытке доступа к хранилищу');
}
if (!cadesStore) {
throw new Error('Не удалось получить доступ к хранилищу сертификатов');
}
try {
void (
__cadesAsyncToken__ +
cadesStore.Open(
cadesplugin.CAPICOM_CURRENT_USER_STORE,
cadesplugin.CAPICOM_MY_STORE,
cadesplugin.CAPICOM_STORE_OPEN_MAXIMUM_ALLOWED,
)
);
} catch (error) {
console.error(error);
throw new Error(_extractMeaningfulErrorMessage(error) || 'Ошибка при открытии хранилища');
}
let cadesCertificateList;
let certificatesCount;
try {
cadesCertificateList = __cadesAsyncToken__ + cadesStore.Certificates;
certificatesCount = __cadesAsyncToken__ + cadesCertificateList.Count;
} catch (error) {
console.error(error);
throw new Error(_extractMeaningfulErrorMessage(error) || 'Ошибка получения списка сертификатов');
}
if (!certificatesCount) {
throw new Error('Нет доступных сертификатов');
}
let cadesCertificate: CadesCertificate; let cadesCertificate: CadesCertificate;
try { try {
cadesCertificateList = cadesCertificate = await _getCadesUserCert(thumbprint);
__cadesAsyncToken__ + cadesCertificateList.Find(cadesplugin.CAPICOM_CERTIFICATE_FIND_SHA1_HASH, thumbprint);
const count = __cadesAsyncToken__ + cadesCertificateList.Count;
if (!count) {
throw new Error(`Сертификат с отпечатком: "${thumbprint}" не найден`);
}
cadesCertificate = __cadesAsyncToken__ + cadesCertificateList.Item(1);
} catch (error) { } catch (error) {
console.error(error); console.log(error);
throw new Error(_extractMeaningfulErrorMessage(error) || 'Ошибка при получении сертификата'); cadesCertificate = await _getCadesContainerCert(thumbprint);
} }
cadesStore.Close();
return cadesCertificate; return cadesCertificate;
}),
);
}, },
); );

View File

@ -0,0 +1,93 @@
import { CadesCertificate } from '../api/certificate';
import { _afterPluginsLoaded } from './_afterPluginsLoaded';
import { _extractMeaningfulErrorMessage } from './_extractMeaningfulErrorMessage';
import { __cadesAsyncToken__, __createCadesPluginObject__, _generateCadesFn } from './_generateCadesFn';
/**
* Возвращает сертификат в формате Cades по отпечатку из хранилища закрытого ключа
*
* @param thumbprint - отпечаток сертификата
* @returns сертификат в формате Cades
*/
export const _getCadesContainerCert = _afterPluginsLoaded(
(thumbprint: string): CadesCertificate => {
const { cadesplugin } = window;
return eval(
_generateCadesFn(function _getCadesCert() {
let cadesStore;
try {
cadesStore = __cadesAsyncToken__ + __createCadesPluginObject__('CAdESCOM.Store');
} catch (error) {
console.error(error);
throw new Error(_extractMeaningfulErrorMessage(error) || 'Ошибка при попытке доступа к хранилищу');
}
if (!cadesStore) {
throw new Error('Не удалось получить доступ к хранилищу сертификатов');
}
try {
void (
__cadesAsyncToken__ +
cadesStore.Open(
cadesplugin.CADESCOM_CONTAINER_STORE,
cadesplugin.CAPICOM_MY_STORE,
cadesplugin.CAPICOM_STORE_OPEN_MAXIMUM_ALLOWED,
)
);
} catch (error) {
console.error(error);
throw new Error(_extractMeaningfulErrorMessage(error) || 'Ошибка при открытии хранилища закрытого ключа');
}
let cadesCertificateList;
let certificatesCount;
try {
cadesCertificateList = __cadesAsyncToken__ + cadesStore.Certificates;
certificatesCount = __cadesAsyncToken__ + cadesCertificateList.Count;
} catch (error) {
console.error(error);
throw new Error(
_extractMeaningfulErrorMessage(error) ||
'Ошибка получения списка сертификатов из хранилища закрытого ключа',
);
}
if (!certificatesCount) {
throw new Error('Нет доступных сертификатов в хранилище закрытого ключа');
}
let cadesCertificate: CadesCertificate;
try {
cadesCertificateList =
__cadesAsyncToken__ + cadesCertificateList.Find(cadesplugin.CAPICOM_CERTIFICATE_FIND_SHA1_HASH, thumbprint);
const count = __cadesAsyncToken__ + cadesCertificateList.Count;
if (!count) {
throw new Error(`Сертификат с отпечатком: "${thumbprint}" не найден в хранилище закрытого ключа`);
}
cadesCertificate = __cadesAsyncToken__ + cadesCertificateList.Item(1);
} catch (error) {
console.error(error);
throw new Error(
_extractMeaningfulErrorMessage(error) || 'Ошибка при получении сертификата из хранилища закрытого ключа',
);
}
cadesStore.Close();
return cadesCertificate;
}),
);
},
);

View File

@ -0,0 +1,92 @@
import { CadesCertificate } from '../api/certificate';
import { _afterPluginsLoaded } from './_afterPluginsLoaded';
import { _extractMeaningfulErrorMessage } from './_extractMeaningfulErrorMessage';
import { __cadesAsyncToken__, __createCadesPluginObject__, _generateCadesFn } from './_generateCadesFn';
/**
* Возвращает сертификат в формате Cades по отпечатку из хранилища пользователя
*
* @param thumbprint - отпечаток сертификата
* @returns сертификат в формате Cades
*/
export const _getCadesUserCert = _afterPluginsLoaded(
(thumbprint: string): CadesCertificate => {
const { cadesplugin } = window;
return eval(
_generateCadesFn(function _getCadesCert() {
let cadesStore;
try {
cadesStore = __cadesAsyncToken__ + __createCadesPluginObject__('CAdESCOM.Store');
} catch (error) {
console.error(error);
throw new Error(_extractMeaningfulErrorMessage(error) || 'Ошибка при попытке доступа к хранилищу');
}
if (!cadesStore) {
throw new Error('Не удалось получить доступ к хранилищу сертификатов');
}
try {
void (
__cadesAsyncToken__ +
cadesStore.Open(
cadesplugin.CAPICOM_CURRENT_USER_STORE,
cadesplugin.CAPICOM_MY_STORE,
cadesplugin.CAPICOM_STORE_OPEN_MAXIMUM_ALLOWED,
)
);
} catch (error) {
console.error(error);
throw new Error(_extractMeaningfulErrorMessage(error) || 'Ошибка при открытии хранилища пользователя');
}
let cadesCertificateList;
let certificatesCount;
try {
cadesCertificateList = __cadesAsyncToken__ + cadesStore.Certificates;
certificatesCount = __cadesAsyncToken__ + cadesCertificateList.Count;
} catch (error) {
console.error(error);
throw new Error(
_extractMeaningfulErrorMessage(error) || 'Ошибка получения списка сертификатов из хранилища пользователя',
);
}
if (!certificatesCount) {
throw new Error('Нет доступных сертификатов в хранилище пользователя');
}
let cadesCertificate: CadesCertificate;
try {
cadesCertificateList =
__cadesAsyncToken__ + cadesCertificateList.Find(cadesplugin.CAPICOM_CERTIFICATE_FIND_SHA1_HASH, thumbprint);
const count = __cadesAsyncToken__ + cadesCertificateList.Count;
if (!count) {
throw new Error(`Сертификат с отпечатком: "${thumbprint}" не найден в хранилище пользователя`);
}
cadesCertificate = __cadesAsyncToken__ + cadesCertificateList.Item(1);
} catch (error) {
console.error(error);
throw new Error(
_extractMeaningfulErrorMessage(error) || 'Ошибка при получении сертификата из хранилища пользователя',
);
}
cadesStore.Close();
return cadesCertificate;
}),
);
},
);