mirror of
https://github.com/crypto-pro-web/crypto-pro-js.git
synced 2024-11-23 16:44:59 +03:00
2.2.0
This commit is contained in:
parent
9958c9884a
commit
c0566b7654
@ -116,6 +116,7 @@ import { getUserCertificates, Certificate } from 'crypto-pro';
|
||||
- [getCertificate](src/api/getCertificate.ts) - возвращает [сертификат](#api-certificate) по отпечатку
|
||||
- [createAttachedSignature](src/api/createAttachedSignature.ts) - создает совмещенную (присоединенную) подпись сообщения
|
||||
- [createDetachedSignature](src/api/createDetachedSignature.ts) - создает отсоединенную (открепленную) подпись сообщения
|
||||
- [createXMLSignature](src/api/createXMLSignature.ts) - создает XML подпись для документа в формате XML
|
||||
- [createHash](src/api/createHash.ts) - создает хеш сообщения по ГОСТ Р 34.11-2012 256 бит
|
||||
- [createSignature](src/api/createSignature.ts) - создает подпись сообщения
|
||||
> Является устаревшим и будет убран из будущих версий.
|
||||
|
8
dist/api/createXMLSignature.d.ts
vendored
Normal file
8
dist/api/createXMLSignature.d.ts
vendored
Normal file
@ -0,0 +1,8 @@
|
||||
/**
|
||||
* Создает XML подпись для документа в формате XML
|
||||
*
|
||||
* @param thumbprint - отпечаток сертификата
|
||||
* @param unencryptedMessage - подписываемое сообщение в формате XML
|
||||
* @returns подпись
|
||||
*/
|
||||
export declare const createXMLSignature: (thumbprint: string, unencryptedMessage: string) => Promise<string>;
|
1
dist/api/index.d.ts
vendored
1
dist/api/index.d.ts
vendored
@ -3,6 +3,7 @@ export * from './getUserCertificates';
|
||||
export * from './getSystemInfo';
|
||||
export * from './isValidSystemSetup';
|
||||
export * from './createSignature';
|
||||
export * from './createXMLSignature';
|
||||
export * from './createDetachedSignature';
|
||||
export * from './createAttachedSignature';
|
||||
export * from './createHash';
|
||||
|
2
dist/crypto-pro.d.ts
vendored
2
dist/crypto-pro.d.ts
vendored
@ -1,4 +1,4 @@
|
||||
// Type definitions for crypto-pro 2.1.0
|
||||
// Type definitions for crypto-pro 2.2.0
|
||||
// Project: crypto-pro
|
||||
// Definitions by: Vitalii Goma https://github.com/vgoma
|
||||
|
||||
|
110
dist/crypto-pro.js
vendored
110
dist/crypto-pro.js
vendored
@ -3215,6 +3215,115 @@ exports.createSignature = _afterPluginsLoaded_1._afterPluginsLoaded(function (th
|
||||
});
|
||||
|
||||
|
||||
/***/ }),
|
||||
|
||||
/***/ "./api/createXMLSignature.ts":
|
||||
/*!***********************************!*\
|
||||
!*** ./api/createXMLSignature.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 _extractMeaningfulErrorMessage_1 = __webpack_require__(/*! ../helpers/_extractMeaningfulErrorMessage */ "./helpers/_extractMeaningfulErrorMessage.ts");
|
||||
var _generateCadesFn_1 = __webpack_require__(/*! ../helpers/_generateCadesFn */ "./helpers/_generateCadesFn.ts");
|
||||
var _getCadesCert_1 = __webpack_require__(/*! ../helpers/_getCadesCert */ "./helpers/_getCadesCert.ts");
|
||||
/**
|
||||
* Создает XML подпись для документа в формате XML
|
||||
*
|
||||
* @param thumbprint - отпечаток сертификата
|
||||
* @param unencryptedMessage - подписываемое сообщение в формате XML
|
||||
* @returns подпись
|
||||
*/
|
||||
exports.createXMLSignature = _afterPluginsLoaded_1._afterPluginsLoaded(function (thumbprint, unencryptedMessage) { return __awaiter(void 0, void 0, void 0, function () {
|
||||
var cadesplugin, cadesCertificate;
|
||||
return __generator(this, function (_a) {
|
||||
switch (_a.label) {
|
||||
case 0:
|
||||
cadesplugin = window.cadesplugin;
|
||||
return [4 /*yield*/, _getCadesCert_1._getCadesCert(thumbprint)];
|
||||
case 1:
|
||||
cadesCertificate = _a.sent();
|
||||
return [2 /*return*/, eval(_generateCadesFn_1._generateCadesFn(function createXMLSignature() {
|
||||
var cadesSigner;
|
||||
var cadesSignedXML;
|
||||
try {
|
||||
cadesSigner = _generateCadesFn_1.__cadesAsyncToken__ + _generateCadesFn_1.__createCadesPluginObject__('CAdESCOM.CPSigner');
|
||||
cadesSignedXML = _generateCadesFn_1.__cadesAsyncToken__ + _generateCadesFn_1.__createCadesPluginObject__('CAdESCOM.SignedXML');
|
||||
}
|
||||
catch (error) {
|
||||
console.error(error);
|
||||
throw new Error(_extractMeaningfulErrorMessage_1._extractMeaningfulErrorMessage(error) || 'Ошибка при инициализации подписи');
|
||||
}
|
||||
try {
|
||||
var signatureMethod = 'urn:ietf:params:xml:ns:cpxmlsec:algorithms:gostr34102012-gostr34112012-256';
|
||||
var digestMethod = 'urn:ietf:params:xml:ns:cpxmlsec:algorithms:gostr34112012-256';
|
||||
void (_generateCadesFn_1.__cadesAsyncToken__ + cadesSigner.propset_Certificate(cadesCertificate));
|
||||
void (_generateCadesFn_1.__cadesAsyncToken__ + cadesSigner.propset_CheckCertificate(true));
|
||||
void (_generateCadesFn_1.__cadesAsyncToken__ + cadesSignedXML.propset_Content(unencryptedMessage));
|
||||
void (_generateCadesFn_1.__cadesAsyncToken__ +
|
||||
cadesSignedXML.propset_SignatureType(cadesplugin.CADESCOM_XML_SIGNATURE_TYPE_ENVELOPED));
|
||||
void (_generateCadesFn_1.__cadesAsyncToken__ + cadesSignedXML.propset_SignatureMethod(signatureMethod));
|
||||
void (_generateCadesFn_1.__cadesAsyncToken__ + cadesSignedXML.propset_DigestMethod(digestMethod));
|
||||
}
|
||||
catch (error) {
|
||||
console.error(error);
|
||||
throw new Error(_extractMeaningfulErrorMessage_1._extractMeaningfulErrorMessage(error) || 'Ошибка при указании данных для подписи');
|
||||
}
|
||||
var signature;
|
||||
try {
|
||||
signature = _generateCadesFn_1.__cadesAsyncToken__ + cadesSignedXML.Sign(cadesSigner);
|
||||
}
|
||||
catch (error) {
|
||||
console.error(error);
|
||||
throw new Error(_extractMeaningfulErrorMessage_1._extractMeaningfulErrorMessage(error) || 'Ошибка при подписании данных');
|
||||
}
|
||||
return signature;
|
||||
}))];
|
||||
}
|
||||
});
|
||||
}); });
|
||||
|
||||
|
||||
/***/ }),
|
||||
|
||||
/***/ "./api/getCertificate.ts":
|
||||
@ -3449,6 +3558,7 @@ __export(__webpack_require__(/*! ./getUserCertificates */ "./api/getUserCertific
|
||||
__export(__webpack_require__(/*! ./getSystemInfo */ "./api/getSystemInfo.ts"));
|
||||
__export(__webpack_require__(/*! ./isValidSystemSetup */ "./api/isValidSystemSetup.ts"));
|
||||
__export(__webpack_require__(/*! ./createSignature */ "./api/createSignature.ts"));
|
||||
__export(__webpack_require__(/*! ./createXMLSignature */ "./api/createXMLSignature.ts"));
|
||||
__export(__webpack_require__(/*! ./createDetachedSignature */ "./api/createDetachedSignature.ts"));
|
||||
__export(__webpack_require__(/*! ./createAttachedSignature */ "./api/createAttachedSignature.ts"));
|
||||
__export(__webpack_require__(/*! ./createHash */ "./api/createHash.ts"));
|
||||
|
2
dist/crypto-pro.js.map
vendored
2
dist/crypto-pro.js.map
vendored
File diff suppressed because one or more lines are too long
4
dist/crypto-pro.min.js
vendored
4
dist/crypto-pro.min.js
vendored
File diff suppressed because one or more lines are too long
2
dist/crypto-pro.min.js.map
vendored
2
dist/crypto-pro.min.js.map
vendored
File diff suppressed because one or more lines are too long
6
examples/angular/package-lock.json
generated
6
examples/angular/package-lock.json
generated
@ -3308,9 +3308,9 @@
|
||||
}
|
||||
},
|
||||
"crypto-pro": {
|
||||
"version": "2.1.0",
|
||||
"resolved": "https://registry.npmjs.org/crypto-pro/-/crypto-pro-2.1.0.tgz",
|
||||
"integrity": "sha512-zLPX/m51fiMS6aWXZ8e8e/Lcw/8VkeIlMo0nvsdvMik6koec+UbNP+syRp07eWJEmRDb8IZLjzLGjrb0oGT64g=="
|
||||
"version": "2.2.0",
|
||||
"resolved": "https://registry.npmjs.org/crypto-pro/-/crypto-pro-2.2.0.tgz",
|
||||
"integrity": "sha512-OUOmAMtzWXO3wuY6WBPv7QdkamI4WABjkRD/8OFoDyx2S9bsbZzukktFlPIgz0nvVUS7UTXACQeO0q56bh+whA=="
|
||||
},
|
||||
"css": {
|
||||
"version": "2.2.4",
|
||||
|
@ -21,7 +21,7 @@
|
||||
"@angular/platform-browser": "~9.0.7",
|
||||
"@angular/platform-browser-dynamic": "~9.0.7",
|
||||
"@angular/router": "~9.0.7",
|
||||
"crypto-pro": "2.1.0",
|
||||
"crypto-pro": "2.2.0",
|
||||
"rxjs": "~6.5.4",
|
||||
"tslib": "^1.10.0",
|
||||
"zone.js": "~0.10.2"
|
||||
|
6
examples/react/package-lock.json
generated
6
examples/react/package-lock.json
generated
@ -3712,9 +3712,9 @@
|
||||
}
|
||||
},
|
||||
"crypto-pro": {
|
||||
"version": "2.1.0",
|
||||
"resolved": "https://registry.npmjs.org/crypto-pro/-/crypto-pro-2.1.0.tgz",
|
||||
"integrity": "sha512-zLPX/m51fiMS6aWXZ8e8e/Lcw/8VkeIlMo0nvsdvMik6koec+UbNP+syRp07eWJEmRDb8IZLjzLGjrb0oGT64g=="
|
||||
"version": "2.2.0",
|
||||
"resolved": "https://registry.npmjs.org/crypto-pro/-/crypto-pro-2.2.0.tgz",
|
||||
"integrity": "sha512-OUOmAMtzWXO3wuY6WBPv7QdkamI4WABjkRD/8OFoDyx2S9bsbZzukktFlPIgz0nvVUS7UTXACQeO0q56bh+whA=="
|
||||
},
|
||||
"css": {
|
||||
"version": "2.2.4",
|
||||
|
@ -7,7 +7,7 @@
|
||||
"@testing-library/jest-dom": "4.2.4",
|
||||
"@testing-library/react": "9.5.0",
|
||||
"@testing-library/user-event": "7.2.1",
|
||||
"crypto-pro": "2.1.0",
|
||||
"crypto-pro": "2.2.0",
|
||||
"react": "^16.13.1",
|
||||
"react-app-polyfill": "1.0.6",
|
||||
"react-dom": "^16.13.1",
|
||||
|
6
examples/script-tag/package-lock.json
generated
6
examples/script-tag/package-lock.json
generated
@ -42,9 +42,9 @@
|
||||
"dev": true
|
||||
},
|
||||
"crypto-pro": {
|
||||
"version": "2.1.0",
|
||||
"resolved": "https://registry.npmjs.org/crypto-pro/-/crypto-pro-2.1.0.tgz",
|
||||
"integrity": "sha512-zLPX/m51fiMS6aWXZ8e8e/Lcw/8VkeIlMo0nvsdvMik6koec+UbNP+syRp07eWJEmRDb8IZLjzLGjrb0oGT64g=="
|
||||
"version": "2.2.0",
|
||||
"resolved": "https://registry.npmjs.org/crypto-pro/-/crypto-pro-2.2.0.tgz",
|
||||
"integrity": "sha512-OUOmAMtzWXO3wuY6WBPv7QdkamI4WABjkRD/8OFoDyx2S9bsbZzukktFlPIgz0nvVUS7UTXACQeO0q56bh+whA=="
|
||||
},
|
||||
"fs.realpath": {
|
||||
"version": "1.0.0",
|
||||
|
@ -13,6 +13,6 @@
|
||||
"symlink-dir": "3.1.2"
|
||||
},
|
||||
"dependencies": {
|
||||
"crypto-pro": "2.1.0"
|
||||
"crypto-pro": "2.2.0"
|
||||
}
|
||||
}
|
||||
|
@ -37,20 +37,27 @@
|
||||
|
||||
function createSignature(message, hash) {
|
||||
var thumbprint = $certificate.value,
|
||||
detachedSignature = document.querySelector('input[name="signatureType"]:checked').value,
|
||||
signatureType = document.querySelector('input[name="signatureType"]:checked').value,
|
||||
signaturePromise;
|
||||
|
||||
detachedSignature = Boolean(Number(detachedSignature));
|
||||
|
||||
$hash.value = hash;
|
||||
|
||||
$signature.placeholder = 'Создается...';
|
||||
$signature.value = '';
|
||||
|
||||
if (detachedSignature) {
|
||||
signaturePromise = window.cryptoPro.createDetachedSignature(thumbprint, hash);
|
||||
} else {
|
||||
signaturePromise = window.cryptoPro.createAttachedSignature(thumbprint, message);
|
||||
switch (signatureType) {
|
||||
case 'attached':
|
||||
signaturePromise = window.cryptoPro.createAttachedSignature(thumbprint, message);
|
||||
|
||||
break;
|
||||
case 'xml':
|
||||
signaturePromise = window.cryptoPro.createXMLSignature(thumbprint, message);
|
||||
|
||||
break;
|
||||
case 'detached':
|
||||
signaturePromise = window.cryptoPro.createDetachedSignature(thumbprint, hash);
|
||||
|
||||
break;
|
||||
}
|
||||
|
||||
signaturePromise.then(function (signature) {
|
||||
|
@ -36,9 +36,11 @@
|
||||
|
||||
<label>Тип подписи: *</label>
|
||||
<br>
|
||||
<label><input type="radio" name="signatureType" value="0">Совмещенная</label>
|
||||
<label><input type="radio" name="signatureType" value="attached">Совмещенная</label>
|
||||
<br>
|
||||
<label><input type="radio" name="signatureType" value="1" checked>Отделенная</label>
|
||||
<label><input type="radio" name="signatureType" value="xml">XML</label>
|
||||
<br>
|
||||
<label><input type="radio" name="signatureType" value="detached" checked>Отделенная</label>
|
||||
<br><br>
|
||||
|
||||
<hr>
|
||||
|
8
lib/api/createXMLSignature.d.ts
vendored
Normal file
8
lib/api/createXMLSignature.d.ts
vendored
Normal file
@ -0,0 +1,8 @@
|
||||
/**
|
||||
* Создает XML подпись для документа в формате XML
|
||||
*
|
||||
* @param thumbprint - отпечаток сертификата
|
||||
* @param unencryptedMessage - подписываемое сообщение в формате XML
|
||||
* @returns подпись
|
||||
*/
|
||||
export declare const createXMLSignature: (thumbprint: string, unencryptedMessage: string) => Promise<string>;
|
1
lib/api/index.d.ts
vendored
1
lib/api/index.d.ts
vendored
@ -3,6 +3,7 @@ export * from './getUserCertificates';
|
||||
export * from './getSystemInfo';
|
||||
export * from './isValidSystemSetup';
|
||||
export * from './createSignature';
|
||||
export * from './createXMLSignature';
|
||||
export * from './createDetachedSignature';
|
||||
export * from './createAttachedSignature';
|
||||
export * from './createHash';
|
||||
|
2
lib/crypto-pro.d.ts
vendored
2
lib/crypto-pro.d.ts
vendored
@ -1,4 +1,4 @@
|
||||
// Type definitions for crypto-pro 2.1.0
|
||||
// Type definitions for crypto-pro 2.2.0
|
||||
// Project: crypto-pro
|
||||
// Definitions by: Vitalii Goma https://github.com/vgoma
|
||||
|
||||
|
@ -2961,6 +2961,80 @@ exports.createSignature = _afterPluginsLoaded_1._afterPluginsLoaded((thumbprint,
|
||||
}));
|
||||
|
||||
|
||||
/***/ }),
|
||||
|
||||
/***/ "./api/createXMLSignature.ts":
|
||||
/*!***********************************!*\
|
||||
!*** ./api/createXMLSignature.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());
|
||||
});
|
||||
};
|
||||
Object.defineProperty(exports, "__esModule", { value: true });
|
||||
const _afterPluginsLoaded_1 = __webpack_require__(/*! ../helpers/_afterPluginsLoaded */ "./helpers/_afterPluginsLoaded.ts");
|
||||
const _extractMeaningfulErrorMessage_1 = __webpack_require__(/*! ../helpers/_extractMeaningfulErrorMessage */ "./helpers/_extractMeaningfulErrorMessage.ts");
|
||||
const _generateCadesFn_1 = __webpack_require__(/*! ../helpers/_generateCadesFn */ "./helpers/_generateCadesFn.ts");
|
||||
const _getCadesCert_1 = __webpack_require__(/*! ../helpers/_getCadesCert */ "./helpers/_getCadesCert.ts");
|
||||
/**
|
||||
* Создает XML подпись для документа в формате XML
|
||||
*
|
||||
* @param thumbprint - отпечаток сертификата
|
||||
* @param unencryptedMessage - подписываемое сообщение в формате XML
|
||||
* @returns подпись
|
||||
*/
|
||||
exports.createXMLSignature = _afterPluginsLoaded_1._afterPluginsLoaded((thumbprint, unencryptedMessage) => __awaiter(void 0, void 0, void 0, function* () {
|
||||
const { cadesplugin } = window;
|
||||
const cadesCertificate = yield _getCadesCert_1._getCadesCert(thumbprint);
|
||||
return eval(_generateCadesFn_1._generateCadesFn(function createXMLSignature() {
|
||||
let cadesSigner;
|
||||
let cadesSignedXML;
|
||||
try {
|
||||
cadesSigner = _generateCadesFn_1.__cadesAsyncToken__ + _generateCadesFn_1.__createCadesPluginObject__('CAdESCOM.CPSigner');
|
||||
cadesSignedXML = _generateCadesFn_1.__cadesAsyncToken__ + _generateCadesFn_1.__createCadesPluginObject__('CAdESCOM.SignedXML');
|
||||
}
|
||||
catch (error) {
|
||||
console.error(error);
|
||||
throw new Error(_extractMeaningfulErrorMessage_1._extractMeaningfulErrorMessage(error) || 'Ошибка при инициализации подписи');
|
||||
}
|
||||
try {
|
||||
const signatureMethod = 'urn:ietf:params:xml:ns:cpxmlsec:algorithms:gostr34102012-gostr34112012-256';
|
||||
const digestMethod = 'urn:ietf:params:xml:ns:cpxmlsec:algorithms:gostr34112012-256';
|
||||
void (_generateCadesFn_1.__cadesAsyncToken__ + cadesSigner.propset_Certificate(cadesCertificate));
|
||||
void (_generateCadesFn_1.__cadesAsyncToken__ + cadesSigner.propset_CheckCertificate(true));
|
||||
void (_generateCadesFn_1.__cadesAsyncToken__ + cadesSignedXML.propset_Content(unencryptedMessage));
|
||||
void (_generateCadesFn_1.__cadesAsyncToken__ +
|
||||
cadesSignedXML.propset_SignatureType(cadesplugin.CADESCOM_XML_SIGNATURE_TYPE_ENVELOPED));
|
||||
void (_generateCadesFn_1.__cadesAsyncToken__ + cadesSignedXML.propset_SignatureMethod(signatureMethod));
|
||||
void (_generateCadesFn_1.__cadesAsyncToken__ + cadesSignedXML.propset_DigestMethod(digestMethod));
|
||||
}
|
||||
catch (error) {
|
||||
console.error(error);
|
||||
throw new Error(_extractMeaningfulErrorMessage_1._extractMeaningfulErrorMessage(error) || 'Ошибка при указании данных для подписи');
|
||||
}
|
||||
let signature;
|
||||
try {
|
||||
signature = _generateCadesFn_1.__cadesAsyncToken__ + cadesSignedXML.Sign(cadesSigner);
|
||||
}
|
||||
catch (error) {
|
||||
console.error(error);
|
||||
throw new Error(_extractMeaningfulErrorMessage_1._extractMeaningfulErrorMessage(error) || 'Ошибка при подписании данных');
|
||||
}
|
||||
return signature;
|
||||
}));
|
||||
}));
|
||||
|
||||
|
||||
/***/ }),
|
||||
|
||||
/***/ "./api/getCertificate.ts":
|
||||
@ -3159,6 +3233,7 @@ __export(__webpack_require__(/*! ./getUserCertificates */ "./api/getUserCertific
|
||||
__export(__webpack_require__(/*! ./getSystemInfo */ "./api/getSystemInfo.ts"));
|
||||
__export(__webpack_require__(/*! ./isValidSystemSetup */ "./api/isValidSystemSetup.ts"));
|
||||
__export(__webpack_require__(/*! ./createSignature */ "./api/createSignature.ts"));
|
||||
__export(__webpack_require__(/*! ./createXMLSignature */ "./api/createXMLSignature.ts"));
|
||||
__export(__webpack_require__(/*! ./createDetachedSignature */ "./api/createDetachedSignature.ts"));
|
||||
__export(__webpack_require__(/*! ./createAttachedSignature */ "./api/createAttachedSignature.ts"));
|
||||
__export(__webpack_require__(/*! ./createHash */ "./api/createHash.ts"));
|
||||
|
File diff suppressed because one or more lines are too long
2
package-lock.json
generated
2
package-lock.json
generated
@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "crypto-pro",
|
||||
"version": "2.1.0",
|
||||
"version": "2.2.0",
|
||||
"lockfileVersion": 1,
|
||||
"requires": true,
|
||||
"dependencies": {
|
||||
|
@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "crypto-pro",
|
||||
"version": "2.1.0",
|
||||
"version": "2.2.0",
|
||||
"description": "API для взаимодействия с КриптоПро",
|
||||
"main": "./lib/crypto-pro.js",
|
||||
"types": "./lib/crypto-pro.d.ts",
|
||||
|
71
src/api/createXMLSignature.test.ts
Normal file
71
src/api/createXMLSignature.test.ts
Normal file
@ -0,0 +1,71 @@
|
||||
import 'cadesplugin';
|
||||
import { rawCertificates, parsedCertificates } from '../__mocks__/certificates';
|
||||
import { createXMLSignature } from './createXMLSignature';
|
||||
import { _getCadesCert } from '../helpers/_getCadesCert';
|
||||
|
||||
const [rawCertificateMock] = rawCertificates;
|
||||
const [parsedCertificateMock] = parsedCertificates;
|
||||
|
||||
jest.mock('../helpers/_getCadesCert', () => ({ _getCadesCert: jest.fn(() => rawCertificateMock) }));
|
||||
|
||||
beforeEach(() => {
|
||||
(_getCadesCert as jest.Mock).mockClear();
|
||||
});
|
||||
|
||||
const executionSteps = [Symbol('step 0'), Symbol('step 1'), Symbol('step 2')];
|
||||
|
||||
const executionFlow = {
|
||||
[executionSteps[0]]: {
|
||||
propset_Certificate: jest.fn(),
|
||||
propset_CheckCertificate: jest.fn(),
|
||||
},
|
||||
[executionSteps[1]]: {
|
||||
propset_Content: jest.fn(),
|
||||
propset_SignatureType: jest.fn(),
|
||||
propset_SignatureMethod: jest.fn(),
|
||||
propset_DigestMethod: jest.fn(),
|
||||
Sign: jest.fn(() => executionSteps[2]),
|
||||
},
|
||||
[executionSteps[2]]: 'signature',
|
||||
};
|
||||
|
||||
window.cadesplugin.__defineExecutionFlow(executionFlow);
|
||||
window.cadesplugin.CreateObjectAsync.mockImplementation((object) => {
|
||||
switch (object) {
|
||||
case 'CAdESCOM.CPSigner':
|
||||
return executionSteps[0];
|
||||
case 'CAdESCOM.SignedXML':
|
||||
return executionSteps[1];
|
||||
}
|
||||
});
|
||||
|
||||
describe('createXMLSignature', () => {
|
||||
test('uses specified certificate', async () => {
|
||||
await createXMLSignature(parsedCertificateMock.thumbprint, 'message');
|
||||
|
||||
expect(_getCadesCert).toHaveBeenCalledWith(parsedCertificateMock.thumbprint);
|
||||
});
|
||||
|
||||
test('returns signature', async () => {
|
||||
const signature = await createXMLSignature(
|
||||
parsedCertificateMock.thumbprint,
|
||||
`
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<!--
|
||||
Original XML doc file for sign example.
|
||||
-->
|
||||
<Envelope xmlns="urn:envelope">
|
||||
<Data>
|
||||
Hello, World!
|
||||
</Data>
|
||||
<Node xml:id="nodeID">
|
||||
Hello, Node!
|
||||
</Node>
|
||||
|
||||
</Envelope>
|
||||
`,
|
||||
);
|
||||
|
||||
expect(signature).toEqual('signature');
|
||||
});
|
||||
});
|
65
src/api/createXMLSignature.ts
Normal file
65
src/api/createXMLSignature.ts
Normal file
@ -0,0 +1,65 @@
|
||||
import { _afterPluginsLoaded } from '../helpers/_afterPluginsLoaded';
|
||||
import { _extractMeaningfulErrorMessage } from '../helpers/_extractMeaningfulErrorMessage';
|
||||
import { __cadesAsyncToken__, __createCadesPluginObject__, _generateCadesFn } from '../helpers/_generateCadesFn';
|
||||
import { _getCadesCert } from '../helpers/_getCadesCert';
|
||||
|
||||
/**
|
||||
* Создает XML подпись для документа в формате XML
|
||||
*
|
||||
* @param thumbprint - отпечаток сертификата
|
||||
* @param unencryptedMessage - подписываемое сообщение в формате XML
|
||||
* @returns подпись
|
||||
*/
|
||||
export const createXMLSignature = _afterPluginsLoaded(
|
||||
async (thumbprint: string, unencryptedMessage: string): Promise<string> => {
|
||||
const { cadesplugin } = window;
|
||||
const cadesCertificate = await _getCadesCert(thumbprint);
|
||||
|
||||
return eval(
|
||||
_generateCadesFn(function createXMLSignature(): string {
|
||||
let cadesSigner;
|
||||
let cadesSignedXML;
|
||||
|
||||
try {
|
||||
cadesSigner = __cadesAsyncToken__ + __createCadesPluginObject__('CAdESCOM.CPSigner');
|
||||
cadesSignedXML = __cadesAsyncToken__ + __createCadesPluginObject__('CAdESCOM.SignedXML');
|
||||
} catch (error) {
|
||||
console.error(error);
|
||||
|
||||
throw new Error(_extractMeaningfulErrorMessage(error) || 'Ошибка при инициализации подписи');
|
||||
}
|
||||
|
||||
try {
|
||||
const signatureMethod = 'urn:ietf:params:xml:ns:cpxmlsec:algorithms:gostr34102012-gostr34112012-256';
|
||||
const digestMethod = 'urn:ietf:params:xml:ns:cpxmlsec:algorithms:gostr34112012-256';
|
||||
|
||||
void (__cadesAsyncToken__ + cadesSigner.propset_Certificate(cadesCertificate));
|
||||
void (__cadesAsyncToken__ + cadesSigner.propset_CheckCertificate(true));
|
||||
void (__cadesAsyncToken__ + cadesSignedXML.propset_Content(unencryptedMessage));
|
||||
void (
|
||||
__cadesAsyncToken__ +
|
||||
cadesSignedXML.propset_SignatureType(cadesplugin.CADESCOM_XML_SIGNATURE_TYPE_ENVELOPED)
|
||||
);
|
||||
void (__cadesAsyncToken__ + cadesSignedXML.propset_SignatureMethod(signatureMethod));
|
||||
void (__cadesAsyncToken__ + cadesSignedXML.propset_DigestMethod(digestMethod));
|
||||
} catch (error) {
|
||||
console.error(error);
|
||||
|
||||
throw new Error(_extractMeaningfulErrorMessage(error) || 'Ошибка при указании данных для подписи');
|
||||
}
|
||||
|
||||
let signature: string;
|
||||
|
||||
try {
|
||||
signature = __cadesAsyncToken__ + cadesSignedXML.Sign(cadesSigner);
|
||||
} catch (error) {
|
||||
console.error(error);
|
||||
|
||||
throw new Error(_extractMeaningfulErrorMessage(error) || 'Ошибка при подписании данных');
|
||||
}
|
||||
|
||||
return signature;
|
||||
}),
|
||||
);
|
||||
},
|
||||
);
|
@ -3,6 +3,7 @@ export * from './getUserCertificates';
|
||||
export * from './getSystemInfo';
|
||||
export * from './isValidSystemSetup';
|
||||
export * from './createSignature';
|
||||
export * from './createXMLSignature';
|
||||
export * from './createDetachedSignature';
|
||||
export * from './createAttachedSignature';
|
||||
export * from './createHash';
|
||||
|
Loading…
Reference in New Issue
Block a user