xmldsigjs
Version:
XML Digital Signature implementation in TypeScript/JavaScript using Web Crypto API
243 lines (242 loc) • 10.5 kB
JavaScript
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.KeyInfoX509Data = exports.X509IncludeOption = exports.X509IssuerSerial = void 0;
const tslib_1 = require("tslib");
const xml_core_1 = require("xml-core");
const x509_js_1 = require("../../pki/x509.js");
const xml_names_js_1 = require("../xml_names.js");
const xml_object_js_1 = require("../xml_object.js");
const key_info_clause_js_1 = require("./key_info_clause.js");
let X509IssuerSerial = class X509IssuerSerial extends xml_object_js_1.XmlSignatureObject {
};
exports.X509IssuerSerial = X509IssuerSerial;
tslib_1.__decorate([
(0, xml_core_1.XmlChildElement)({
localName: xml_names_js_1.XmlSignature.ElementNames.X509IssuerName,
namespaceURI: xml_names_js_1.XmlSignature.NamespaceURI,
prefix: xml_names_js_1.XmlSignature.DefaultPrefix,
required: true,
}),
tslib_1.__metadata("design:type", String)
], X509IssuerSerial.prototype, "X509IssuerName", void 0);
tslib_1.__decorate([
(0, xml_core_1.XmlChildElement)({
localName: xml_names_js_1.XmlSignature.ElementNames.X509SerialNumber,
namespaceURI: xml_names_js_1.XmlSignature.NamespaceURI,
prefix: xml_names_js_1.XmlSignature.DefaultPrefix,
required: true,
}),
tslib_1.__metadata("design:type", String)
], X509IssuerSerial.prototype, "X509SerialNumber", void 0);
exports.X509IssuerSerial = X509IssuerSerial = tslib_1.__decorate([
(0, xml_core_1.XmlElement)({ localName: xml_names_js_1.XmlSignature.ElementNames.X509IssuerSerial })
], X509IssuerSerial);
var X509IncludeOption;
(function (X509IncludeOption) {
X509IncludeOption[X509IncludeOption["None"] = 0] = "None";
X509IncludeOption[X509IncludeOption["EndCertOnly"] = 1] = "EndCertOnly";
X509IncludeOption[X509IncludeOption["ExcludeRoot"] = 2] = "ExcludeRoot";
X509IncludeOption[X509IncludeOption["WholeChain"] = 3] = "WholeChain";
})(X509IncludeOption || (exports.X509IncludeOption = X509IncludeOption = {}));
let KeyInfoX509Data = class KeyInfoX509Data extends key_info_clause_js_1.KeyInfoClause {
constructor(cert, includeOptions = X509IncludeOption.None) {
super();
this.x509crl = null;
this.SubjectKeyIdList = [];
if (cert) {
if (cert instanceof Uint8Array) {
this.AddCertificate(new x509_js_1.X509Certificate(cert));
}
else if (cert instanceof x509_js_1.X509Certificate) {
switch (includeOptions) {
case X509IncludeOption.None:
case X509IncludeOption.EndCertOnly:
this.AddCertificate(cert);
break;
case X509IncludeOption.ExcludeRoot:
this.AddCertificatesChainFrom(cert, false);
break;
case X509IncludeOption.WholeChain:
this.AddCertificatesChainFrom(cert, true);
break;
}
}
}
}
async importKey(_key) {
throw new xml_core_1.XmlError(xml_core_1.XE.METHOD_NOT_SUPPORTED);
}
async exportKey(alg) {
if (!this.Certificates.length) {
throw new xml_core_1.XmlError(xml_core_1.XE.NULL_REFERENCE);
}
this.Key = await this.Certificates[0].exportKey(alg);
return this.Key;
}
get Certificates() {
return this.X509CertificateList;
}
get CRL() {
return this.x509crl;
}
set CRL(value) {
this.x509crl = value;
}
get IssuerSerials() {
return this.IssuerSerialList;
}
get SubjectKeyIds() {
return this.SubjectKeyIdList;
}
get SubjectNames() {
return this.SubjectNameList;
}
AddCertificate(certificate) {
if (!certificate) {
throw new xml_core_1.XmlError(xml_core_1.XE.PARAM_REQUIRED, 'certificate');
}
if (!this.X509CertificateList) {
this.X509CertificateList = [];
}
this.X509CertificateList.push(certificate);
}
AddIssuerSerial(issuerName, serialNumber) {
if (issuerName == null) {
throw new xml_core_1.XmlError(xml_core_1.XE.PARAM_REQUIRED, 'issuerName');
}
if (this.IssuerSerialList == null) {
this.IssuerSerialList = [];
}
const xis = { issuerName, serialNumber };
this.IssuerSerialList.push(xis);
}
AddSubjectKeyId(subjectKeyId) {
if (this.SubjectKeyIdList) {
this.SubjectKeyIdList = [];
}
if (typeof subjectKeyId === 'string') {
if (subjectKeyId != null) {
const id = xml_core_1.Convert.FromBase64(subjectKeyId);
this.SubjectKeyIdList.push(id);
}
}
else {
this.SubjectKeyIdList.push(subjectKeyId);
}
}
AddSubjectName(subjectName) {
if (this.SubjectNameList == null) {
this.SubjectNameList = [];
}
this.SubjectNameList.push(subjectName);
}
GetXml() {
const doc = this.CreateDocument();
const xel = this.CreateElement(doc);
const prefix = this.GetPrefix();
if (this.IssuerSerialList != null && this.IssuerSerialList.length > 0) {
this.IssuerSerialList.forEach((iser) => {
const isl = doc.createElementNS(xml_names_js_1.XmlSignature.NamespaceURI, prefix + xml_names_js_1.XmlSignature.ElementNames.X509IssuerSerial);
const xin = doc.createElementNS(xml_names_js_1.XmlSignature.NamespaceURI, prefix + xml_names_js_1.XmlSignature.ElementNames.X509IssuerName);
xin.textContent = iser.issuerName;
isl.appendChild(xin);
const xsn = doc.createElementNS(xml_names_js_1.XmlSignature.NamespaceURI, prefix + xml_names_js_1.XmlSignature.ElementNames.X509SerialNumber);
xsn.textContent = iser.serialNumber;
isl.appendChild(xsn);
xel.appendChild(isl);
});
}
if (this.SubjectKeyIdList != null && this.SubjectKeyIdList.length > 0) {
this.SubjectKeyIdList.forEach((skid) => {
const ski = doc.createElementNS(xml_names_js_1.XmlSignature.NamespaceURI, prefix + xml_names_js_1.XmlSignature.ElementNames.X509SKI);
ski.textContent = xml_core_1.Convert.ToBase64(skid);
xel.appendChild(ski);
});
}
if (this.SubjectNameList != null && this.SubjectNameList.length > 0) {
this.SubjectNameList.forEach((subject) => {
const sn = doc.createElementNS(xml_names_js_1.XmlSignature.NamespaceURI, prefix + xml_names_js_1.XmlSignature.ElementNames.X509SubjectName);
sn.textContent = subject;
xel.appendChild(sn);
});
}
if (this.X509CertificateList != null && this.X509CertificateList.length > 0) {
this.X509CertificateList.forEach((x509) => {
const cert = doc.createElementNS(xml_names_js_1.XmlSignature.NamespaceURI, prefix + xml_names_js_1.XmlSignature.ElementNames.X509Certificate);
cert.textContent = xml_core_1.Convert.ToBase64(x509.GetRaw());
xel.appendChild(cert);
});
}
if (this.x509crl != null) {
const crl = doc.createElementNS(xml_names_js_1.XmlSignature.NamespaceURI, prefix + xml_names_js_1.XmlSignature.ElementNames.X509CRL);
crl.textContent = xml_core_1.Convert.ToBase64(this.x509crl);
xel.appendChild(crl);
}
return xel;
}
LoadXml(element) {
super.LoadXml(element);
if (this.IssuerSerialList) {
this.IssuerSerialList = [];
}
if (this.SubjectKeyIdList) {
this.SubjectKeyIdList = [];
}
if (this.SubjectNameList) {
this.SubjectNameList = [];
}
if (this.X509CertificateList) {
this.X509CertificateList = [];
}
this.x509crl = null;
let xnl = this.GetChildren(xml_names_js_1.XmlSignature.ElementNames.X509IssuerSerial);
if (xnl) {
xnl.forEach((xel) => {
const issuer = xml_object_js_1.XmlSignatureObject.GetChild(xel, xml_names_js_1.XmlSignature.ElementNames.X509IssuerName, xml_names_js_1.XmlSignature.NamespaceURI, true);
const serial = xml_object_js_1.XmlSignatureObject.GetChild(xel, xml_names_js_1.XmlSignature.ElementNames.X509SerialNumber, xml_names_js_1.XmlSignature.NamespaceURI, true);
if (issuer && issuer.textContent && serial && serial.textContent) {
this.AddIssuerSerial(issuer.textContent, serial.textContent);
}
});
}
xnl = this.GetChildren(xml_names_js_1.XmlSignature.ElementNames.X509SKI);
if (xnl) {
xnl.forEach((xel) => {
if (xel.textContent) {
const skid = xml_core_1.Convert.FromBase64(xel.textContent);
this.AddSubjectKeyId(skid);
}
});
}
xnl = this.GetChildren(xml_names_js_1.XmlSignature.ElementNames.X509SubjectName);
if (xnl != null) {
xnl.forEach((xel) => {
if (xel.textContent) {
this.AddSubjectName(xel.textContent);
}
});
}
xnl = this.GetChildren(xml_names_js_1.XmlSignature.ElementNames.X509Certificate);
if (xnl) {
xnl.forEach((xel) => {
if (xel.textContent) {
const cert = xml_core_1.Convert.FromBase64(xel.textContent);
this.AddCertificate(new x509_js_1.X509Certificate(cert));
}
});
}
const x509el = this.GetChild(xml_names_js_1.XmlSignature.ElementNames.X509CRL, false);
if (x509el && x509el.textContent) {
this.x509crl = xml_core_1.Convert.FromBase64(x509el.textContent);
}
}
AddCertificatesChainFrom(_cert, _root) {
}
};
exports.KeyInfoX509Data = KeyInfoX509Data;
exports.KeyInfoX509Data = KeyInfoX509Data = tslib_1.__decorate([
(0, xml_core_1.XmlElement)({
localName: xml_names_js_1.XmlSignature.ElementNames.X509Data,
}),
tslib_1.__metadata("design:paramtypes", [Object, Object])
], KeyInfoX509Data);