xmldsigjs
Version:
XMLDSIGjs provides an implementation of XMLDSIG in Typescript/Javascript based on WebCrypto
1,475 lines (1,444 loc) • 110 kB
JavaScript
'use strict';
var XmlCore = require('xml-core');
var pkijs = require('pkijs');
var tslib = require('tslib');
var Asn1Js = require('asn1js');
var pvtsutils = require('pvtsutils');
function _interopNamespaceDefault(e) {
var n = Object.create(null);
if (e) {
Object.keys(e).forEach(function (k) {
if (k !== 'default') {
var d = Object.getOwnPropertyDescriptor(e, k);
Object.defineProperty(n, k, d.get ? d : {
enumerable: true,
get: function () { return e[k]; }
});
}
});
}
n.default = e;
return Object.freeze(n);
}
var XmlCore__namespace = /*#__PURE__*/_interopNamespaceDefault(XmlCore);
var Asn1Js__namespace = /*#__PURE__*/_interopNamespaceDefault(Asn1Js);
let engineCrypto = null;
class Application {
static setEngine(name, crypto) {
engineCrypto = Object.assign(crypto, { name });
pkijs.setEngine(name, new pkijs.CryptoEngine({ name, crypto }));
}
static get crypto() {
if (!engineCrypto) {
throw new XmlCore.XmlError(XmlCore.XE.CRYPTOGRAPHIC_NO_MODULE);
}
return engineCrypto;
}
static isNodePlugin() {
return (typeof self === "undefined" && typeof window === "undefined");
}
}
function init() {
if (!Application.isNodePlugin()) {
Application.setEngine("W3 WebCrypto module", self.crypto);
}
}
init();
class XmlAlgorithm {
getAlgorithmName() {
return this.namespaceURI;
}
}
class HashAlgorithm extends XmlAlgorithm {
async Digest(xml) {
let buf;
if (typeof xml === "string") {
buf = XmlCore.Convert.FromString(xml, "utf8");
}
else if (ArrayBuffer.isView(xml)) {
buf = new Uint8Array(xml.buffer);
}
else if (xml instanceof ArrayBuffer) {
buf = new Uint8Array(xml);
}
else {
const txt = new XMLSerializer().serializeToString(xml);
buf = XmlCore.Convert.FromString(txt, "utf8");
}
const hash = await Application.crypto.subtle.digest(this.algorithm, buf);
return new Uint8Array(hash);
}
}
class SignatureAlgorithm extends XmlAlgorithm {
async Sign(signedInfo, signingKey, algorithm) {
const info = XmlCore.Convert.FromString(signedInfo, "utf8");
return Application.crypto.subtle.sign(algorithm, signingKey, info);
}
async Verify(signedInfo, key, signatureValue, algorithm) {
const info = XmlCore.Convert.FromString(signedInfo, "utf8");
return Application.crypto.subtle.verify((algorithm || this.algorithm), key, signatureValue, info);
}
}
const SHA1 = "SHA-1";
const SHA256 = "SHA-256";
const SHA384 = "SHA-384";
const SHA512 = "SHA-512";
const SHA1_NAMESPACE = "http://www.w3.org/2000/09/xmldsig#sha1";
const SHA256_NAMESPACE = "http://www.w3.org/2001/04/xmlenc#sha256";
const SHA384_NAMESPACE = "http://www.w3.org/2001/04/xmldsig-more#sha384";
const SHA512_NAMESPACE = "http://www.w3.org/2001/04/xmlenc#sha512";
class Sha1 extends HashAlgorithm {
constructor() {
super(...arguments);
this.algorithm = { name: SHA1 };
this.namespaceURI = SHA1_NAMESPACE;
}
}
class Sha256 extends HashAlgorithm {
constructor() {
super(...arguments);
this.algorithm = { name: SHA256 };
this.namespaceURI = SHA256_NAMESPACE;
}
}
class Sha384 extends HashAlgorithm {
constructor() {
super(...arguments);
this.algorithm = { name: SHA384 };
this.namespaceURI = SHA384_NAMESPACE;
}
}
class Sha512 extends HashAlgorithm {
constructor() {
super(...arguments);
this.algorithm = { name: SHA512 };
this.namespaceURI = SHA512_NAMESPACE;
}
}
const ECDSA = "ECDSA";
const ECDSA_SHA1_NAMESPACE = "http://www.w3.org/2001/04/xmldsig-more#ecdsa-sha1";
const ECDSA_SHA256_NAMESPACE = "http://www.w3.org/2001/04/xmldsig-more#ecdsa-sha256";
const ECDSA_SHA384_NAMESPACE = "http://www.w3.org/2001/04/xmldsig-more#ecdsa-sha384";
const ECDSA_SHA512_NAMESPACE = "http://www.w3.org/2001/04/xmldsig-more#ecdsa-sha512";
class EcdsaSha1 extends SignatureAlgorithm {
constructor() {
super(...arguments);
this.algorithm = {
name: ECDSA,
hash: {
name: SHA1,
},
};
this.namespaceURI = ECDSA_SHA1_NAMESPACE;
}
}
class EcdsaSha256 extends SignatureAlgorithm {
constructor() {
super(...arguments);
this.algorithm = {
name: ECDSA,
hash: {
name: SHA256,
},
};
this.namespaceURI = ECDSA_SHA256_NAMESPACE;
}
}
class EcdsaSha384 extends SignatureAlgorithm {
constructor() {
super(...arguments);
this.algorithm = {
name: ECDSA,
hash: {
name: SHA384,
},
};
this.namespaceURI = ECDSA_SHA384_NAMESPACE;
}
}
class EcdsaSha512 extends SignatureAlgorithm {
constructor() {
super(...arguments);
this.algorithm = {
name: ECDSA,
hash: {
name: SHA512,
},
};
this.namespaceURI = ECDSA_SHA512_NAMESPACE;
}
}
const HMAC = "HMAC";
const HMAC_SHA1_NAMESPACE = "http://www.w3.org/2000/09/xmldsig#hmac-sha1";
const HMAC_SHA256_NAMESPACE = "http://www.w3.org/2001/04/xmldsig-more#hmac-sha256";
const HMAC_SHA384_NAMESPACE = "http://www.w3.org/2001/04/xmldsig-more#hmac-sha384";
const HMAC_SHA512_NAMESPACE = "http://www.w3.org/2001/04/xmldsig-more#hmac-sha512";
class HmacSha1 extends SignatureAlgorithm {
constructor() {
super(...arguments);
this.algorithm = {
name: HMAC,
hash: {
name: SHA1,
},
};
this.namespaceURI = HMAC_SHA1_NAMESPACE;
}
}
class HmacSha256 extends SignatureAlgorithm {
constructor() {
super(...arguments);
this.algorithm = {
name: HMAC,
hash: {
name: SHA256,
},
};
this.namespaceURI = HMAC_SHA256_NAMESPACE;
}
}
class HmacSha384 extends SignatureAlgorithm {
constructor() {
super(...arguments);
this.algorithm = {
name: HMAC,
hash: {
name: SHA384,
},
};
this.namespaceURI = HMAC_SHA384_NAMESPACE;
}
}
class HmacSha512 extends SignatureAlgorithm {
constructor() {
super(...arguments);
this.algorithm = {
name: HMAC,
hash: {
name: SHA512,
},
};
this.namespaceURI = HMAC_SHA512_NAMESPACE;
}
}
const RSA_PKCS1 = "RSASSA-PKCS1-v1_5";
const RSA_PKCS1_SHA1_NAMESPACE = "http://www.w3.org/2000/09/xmldsig#rsa-sha1";
const RSA_PKCS1_SHA256_NAMESPACE = "http://www.w3.org/2001/04/xmldsig-more#rsa-sha256";
const RSA_PKCS1_SHA384_NAMESPACE = "http://www.w3.org/2001/04/xmldsig-more#rsa-sha384";
const RSA_PKCS1_SHA512_NAMESPACE = "http://www.w3.org/2001/04/xmldsig-more#rsa-sha512";
class RsaPkcs1Sha1 extends SignatureAlgorithm {
constructor() {
super(...arguments);
this.algorithm = {
name: RSA_PKCS1,
hash: {
name: SHA1,
},
};
this.namespaceURI = RSA_PKCS1_SHA1_NAMESPACE;
}
}
class RsaPkcs1Sha256 extends SignatureAlgorithm {
constructor() {
super(...arguments);
this.algorithm = {
name: RSA_PKCS1,
hash: {
name: SHA256,
},
};
this.namespaceURI = RSA_PKCS1_SHA256_NAMESPACE;
}
}
class RsaPkcs1Sha384 extends SignatureAlgorithm {
constructor() {
super(...arguments);
this.algorithm = {
name: RSA_PKCS1,
hash: {
name: SHA384,
},
};
this.namespaceURI = RSA_PKCS1_SHA384_NAMESPACE;
}
}
class RsaPkcs1Sha512 extends SignatureAlgorithm {
constructor() {
super(...arguments);
this.algorithm = {
name: RSA_PKCS1,
hash: {
name: SHA512,
},
};
this.namespaceURI = RSA_PKCS1_SHA512_NAMESPACE;
}
}
const RSA_PSS = "RSA-PSS";
const RSA_PSS_WITH_PARAMS_NAMESPACE = "http://www.w3.org/2007/05/xmldsig-more#rsa-pss";
class RsaPssBase extends SignatureAlgorithm {
constructor(saltLength) {
super();
this.algorithm = {
name: RSA_PSS,
hash: {
name: SHA1,
},
};
this.namespaceURI = RSA_PSS_WITH_PARAMS_NAMESPACE;
if (saltLength) {
this.algorithm.saltLength = saltLength;
}
}
}
class RsaPssSha1 extends RsaPssBase {
constructor(saltLength) {
super(saltLength);
this.algorithm.hash.name = SHA1;
}
}
class RsaPssSha256 extends RsaPssBase {
constructor(saltLength) {
super(saltLength);
this.algorithm.hash.name = SHA256;
}
}
class RsaPssSha384 extends RsaPssBase {
constructor(saltLength) {
super(saltLength);
this.algorithm.hash.name = SHA384;
}
}
class RsaPssSha512 extends RsaPssBase {
constructor(saltLength) {
super(saltLength);
this.algorithm.hash.name = SHA512;
}
}
const RSA_PSS_SHA1_NAMESPACE = "http://www.w3.org/2007/05/xmldsig-more#sha1-rsa-MGF1";
const RSA_PSS_SHA256_NAMESPACE = "http://www.w3.org/2007/05/xmldsig-more#sha256-rsa-MGF1";
const RSA_PSS_SHA384_NAMESPACE = "http://www.w3.org/2007/05/xmldsig-more#sha384-rsa-MGF1";
const RSA_PSS_SHA512_NAMESPACE = "http://www.w3.org/2007/05/xmldsig-more#sha512-rsa-MGF1";
class RsaPssWithoutParamsBase extends SignatureAlgorithm {
constructor() {
super();
this.algorithm = {
name: RSA_PSS,
hash: {
name: SHA1,
},
};
this.namespaceURI = RSA_PSS_SHA1_NAMESPACE;
}
}
class RsaPssWithoutParamsSha1 extends RsaPssWithoutParamsBase {
constructor() {
super();
this.algorithm.hash.name = SHA1;
this.algorithm.saltLength = 20;
}
}
class RsaPssWithoutParamsSha256 extends RsaPssWithoutParamsBase {
constructor() {
super();
this.algorithm.hash.name = SHA256;
this.algorithm.saltLength = 32;
}
}
class RsaPssWithoutParamsSha384 extends RsaPssWithoutParamsBase {
constructor() {
super();
this.algorithm.hash.name = SHA384;
this.algorithm.saltLength = 48;
}
}
class RsaPssWithoutParamsSha512 extends RsaPssWithoutParamsBase {
constructor() {
super();
this.algorithm.hash.name = SHA512;
this.algorithm.saltLength = 64;
}
}
exports.XmlCanonicalizerState = void 0;
(function (XmlCanonicalizerState) {
XmlCanonicalizerState[XmlCanonicalizerState["BeforeDocElement"] = 0] = "BeforeDocElement";
XmlCanonicalizerState[XmlCanonicalizerState["InsideDocElement"] = 1] = "InsideDocElement";
XmlCanonicalizerState[XmlCanonicalizerState["AfterDocElement"] = 2] = "AfterDocElement";
})(exports.XmlCanonicalizerState || (exports.XmlCanonicalizerState = {}));
class XmlCanonicalizer {
constructor(withComments, excC14N, propagatedNamespaces = new XmlCore__namespace.NamespaceManager()) {
this.propagatedNamespaces = new XmlCore__namespace.NamespaceManager();
this.result = [];
this.visibleNamespaces = new XmlCore__namespace.NamespaceManager();
this.inclusiveNamespacesPrefixList = [];
this.state = exports.XmlCanonicalizerState.BeforeDocElement;
this.withComments = withComments;
this.exclusive = excC14N;
this.propagatedNamespaces = propagatedNamespaces;
}
get InclusiveNamespacesPrefixList() {
return this.inclusiveNamespacesPrefixList.join(" ");
}
set InclusiveNamespacesPrefixList(value) {
this.inclusiveNamespacesPrefixList = value.split(" ");
}
Canonicalize(node) {
if (!node) {
throw new XmlCore__namespace.XmlError(XmlCore__namespace.XE.CRYPTOGRAPHIC, "Parameter 1 is not Node");
}
this.WriteNode(node);
const res = this.result.join("");
return res;
}
WriteNode(node) {
switch (node.nodeType) {
case XmlCore__namespace.XmlNodeType.Document:
case XmlCore__namespace.XmlNodeType.DocumentFragment:
this.WriteDocumentNode(node);
break;
case XmlCore__namespace.XmlNodeType.Element:
this.WriteElementNode(node);
break;
case XmlCore__namespace.XmlNodeType.CDATA:
case XmlCore__namespace.XmlNodeType.SignificantWhitespace:
case XmlCore__namespace.XmlNodeType.Text:
if (!XmlCore__namespace.isDocument(node.parentNode)) {
this.WriteTextNode(node);
}
break;
case XmlCore__namespace.XmlNodeType.Whitespace:
if (this.state === exports.XmlCanonicalizerState.InsideDocElement) {
this.WriteTextNode(node);
}
break;
case XmlCore__namespace.XmlNodeType.Comment:
this.WriteCommentNode(node);
break;
case XmlCore__namespace.XmlNodeType.ProcessingInstruction:
this.WriteProcessingInstructionNode(node);
break;
case XmlCore__namespace.XmlNodeType.EntityReference:
for (let i = 0; i < node.childNodes.length; i++) {
this.WriteNode(node.childNodes[i]);
}
break;
case XmlCore__namespace.XmlNodeType.Attribute:
throw new XmlCore__namespace.XmlError(XmlCore__namespace.XE.CRYPTOGRAPHIC, "Attribute node is impossible here");
case XmlCore__namespace.XmlNodeType.EndElement:
throw new XmlCore__namespace.XmlError(XmlCore__namespace.XE.CRYPTOGRAPHIC, "Attribute node is impossible here");
case XmlCore__namespace.XmlNodeType.EndEntity:
throw new XmlCore__namespace.XmlError(XmlCore__namespace.XE.CRYPTOGRAPHIC, "Attribute node is impossible here");
case XmlCore__namespace.XmlNodeType.DocumentType:
case XmlCore__namespace.XmlNodeType.Entity:
case XmlCore__namespace.XmlNodeType.Notation:
case XmlCore__namespace.XmlNodeType.XmlDeclaration:
break;
}
}
WriteDocumentNode(node) {
this.state = exports.XmlCanonicalizerState.BeforeDocElement;
for (let child = node.firstChild; child != null; child = child.nextSibling) {
this.WriteNode(child);
}
}
WriteCommentNode(node) {
if (this.withComments) {
if (this.state === exports.XmlCanonicalizerState.AfterDocElement) {
this.result.push(String.fromCharCode(10) + "<!--");
}
else {
this.result.push("<!--");
}
this.result.push(this.NormalizeString(node.nodeValue, XmlCore__namespace.XmlNodeType.Comment));
if (this.state === exports.XmlCanonicalizerState.BeforeDocElement) {
this.result.push("-->" + String.fromCharCode(10));
}
else {
this.result.push("-->");
}
}
}
WriteTextNode(node) {
this.result.push(this.NormalizeString(node.nodeValue, node.nodeType));
}
WriteProcessingInstructionNode(node) {
const nodeName = node.nodeName || node.tagName;
if (nodeName === "xml") {
return;
}
if (this.state === exports.XmlCanonicalizerState.AfterDocElement) {
this.result.push("\u000A<?");
}
else {
this.result.push("<?");
}
this.result.push(nodeName);
if (node.nodeValue) {
this.result.push(" ");
this.result.push(this.NormalizeString(node.nodeValue, XmlCore__namespace.XmlNodeType.ProcessingInstruction));
}
if (this.state === exports.XmlCanonicalizerState.BeforeDocElement) {
this.result.push("?>\u000A");
}
else {
this.result.push("?>");
}
}
WriteElementNode(node) {
const state = this.state;
if (this.state === exports.XmlCanonicalizerState.BeforeDocElement) {
this.state = exports.XmlCanonicalizerState.InsideDocElement;
}
this.result.push("<");
this.result.push(node.nodeName);
let visibleNamespacesCount = this.WriteNamespacesAxis(node);
this.WriteAttributesAxis(node);
this.result.push(">");
for (let n = node.firstChild; n != null; n = n.nextSibling) {
this.WriteNode(n);
}
this.result.push("</");
this.result.push(node.nodeName);
this.result.push(">");
if (state === exports.XmlCanonicalizerState.BeforeDocElement) {
this.state = exports.XmlCanonicalizerState.AfterDocElement;
}
while (visibleNamespacesCount--) {
this.visibleNamespaces.Pop();
}
}
WriteNamespacesAxis(node) {
const list = [];
let visibleNamespacesCount = 0;
for (let i = 0; i < node.attributes.length; i++) {
const attribute = node.attributes[i];
if (!IsNamespaceNode(attribute)) {
if (attribute.prefix && !this.IsNamespaceRendered(attribute.prefix, attribute.namespaceURI)) {
const ns = { prefix: attribute.prefix, namespace: attribute.namespaceURI };
list.push(ns);
this.visibleNamespaces.Add(ns);
visibleNamespacesCount++;
}
continue;
}
if (attribute.localName === "xmlns" && !attribute.prefix && !attribute.nodeValue) {
const ns = { prefix: attribute.prefix, namespace: attribute.nodeValue };
list.push(ns);
this.visibleNamespaces.Add(ns);
visibleNamespacesCount++;
}
let prefix = null;
let matches;
if (matches = /xmlns:([\w\.-]+)/.exec(attribute.nodeName)) {
prefix = matches[1];
}
let printable = true;
if (this.exclusive && !this.IsNamespaceInclusive(node, prefix)) {
const used = IsNamespaceUsed(node, prefix);
if (used > 1) {
printable = false;
}
else if (used === 0) {
continue;
}
}
if (this.IsNamespaceRendered(prefix, attribute.nodeValue)) {
continue;
}
if (printable) {
const ns = { prefix, namespace: attribute.nodeValue };
list.push(ns);
this.visibleNamespaces.Add(ns);
visibleNamespacesCount++;
}
}
if (!this.IsNamespaceRendered(node.prefix, node.namespaceURI) && node.namespaceURI !== "http://www.w3.org/2000/xmlns/") {
const ns = { prefix: node.prefix, namespace: node.namespaceURI };
list.push(ns);
this.visibleNamespaces.Add(ns);
visibleNamespacesCount++;
}
list.sort(XmlDsigC14NTransformNamespacesComparer);
let prevPrefix = null;
list.forEach((n) => {
if (n.prefix === prevPrefix) {
return;
}
prevPrefix = n.prefix;
this.result.push(" xmlns");
if (n.prefix) {
this.result.push(":" + n.prefix);
}
this.result.push("=\"");
this.result.push(n.namespace);
this.result.push("\"");
});
return visibleNamespacesCount;
}
WriteAttributesAxis(node) {
const list = [];
for (let i = 0; i < node.attributes.length; i++) {
const attribute = node.attributes[i];
if (!IsNamespaceNode(attribute)) {
list.push(attribute);
}
}
list.sort(XmlDsigC14NTransformAttributesComparer);
list.forEach((attribute) => {
if (attribute != null) {
this.result.push(" ");
this.result.push(attribute.nodeName);
this.result.push("=\"");
this.result.push(this.NormalizeString(attribute.nodeValue, XmlCore__namespace.XmlNodeType.Attribute));
this.result.push("\"");
}
});
}
NormalizeString(input, type) {
const sb = [];
if (input) {
for (let i = 0; i < input.length; i++) {
const ch = input[i];
if (ch === "<" && (type === XmlCore__namespace.XmlNodeType.Attribute || this.IsTextNode(type))) {
sb.push("<");
}
else if (ch === ">" && this.IsTextNode(type)) {
sb.push(">");
}
else if (ch === "&" && (type === XmlCore__namespace.XmlNodeType.Attribute || this.IsTextNode(type))) {
sb.push("&");
}
else if (ch === "\"" && type === XmlCore__namespace.XmlNodeType.Attribute) {
sb.push(""");
}
else if (ch === "\u0009" && type === XmlCore__namespace.XmlNodeType.Attribute) {
sb.push("	");
}
else if (ch === "\u000A" && type === XmlCore__namespace.XmlNodeType.Attribute) {
sb.push("
");
}
else if (ch === "\u000D") {
sb.push("
");
}
else {
sb.push(ch);
}
}
}
return sb.join("");
}
IsTextNode(type) {
switch (type) {
case XmlCore__namespace.XmlNodeType.Text:
case XmlCore__namespace.XmlNodeType.CDATA:
case XmlCore__namespace.XmlNodeType.SignificantWhitespace:
case XmlCore__namespace.XmlNodeType.Whitespace:
return true;
}
return false;
}
IsNamespaceInclusive(node, prefix) {
const prefix2 = prefix || null;
if (node.prefix === prefix2) {
return false;
}
return this.inclusiveNamespacesPrefixList.indexOf(prefix2 || "") !== -1;
}
IsNamespaceRendered(prefix, uri) {
prefix = prefix || "";
uri = uri || "";
if (!prefix && !uri) {
return true;
}
if (prefix === "xml" && uri === "http://www.w3.org/XML/1998/namespace") {
return true;
}
const ns = this.visibleNamespaces.GetPrefix(prefix);
if (ns) {
return ns.namespace === uri;
}
return false;
}
}
function XmlDsigC14NTransformNamespacesComparer(x, y) {
if (x == y) {
return 0;
}
else if (!x) {
return -1;
}
else if (!y) {
return 1;
}
else if (!x.prefix) {
return -1;
}
else if (!y.prefix) {
return 1;
}
else if (x.prefix < y.prefix) {
return -1;
}
else if (x.prefix > y.prefix) {
return 1;
}
else {
return 0;
}
}
function XmlDsigC14NTransformAttributesComparer(x, y) {
if (!x.namespaceURI && y.namespaceURI) {
return -1;
}
if (!y.namespaceURI && x.namespaceURI) {
return 1;
}
const left = x.namespaceURI + x.localName;
const right = y.namespaceURI + y.localName;
if (left === right) {
return 0;
}
else if (left < right) {
return -1;
}
else {
return 1;
}
}
function IsNamespaceUsed(node, prefix, result = 0) {
const prefix2 = prefix || null;
if (node.prefix === prefix2) {
return ++result;
}
if (node.attributes) {
for (let i = 0; i < node.attributes.length; i++) {
const attr = node.attributes[i];
if (!IsNamespaceNode(attr) && prefix && node.attributes[i].prefix === prefix) {
return ++result;
}
}
}
for (let n = node.firstChild; !!n; n = n.nextSibling) {
if (n.nodeType === XmlCore__namespace.XmlNodeType.Element) {
const el = n;
const res = IsNamespaceUsed(el, prefix, result);
if (n.nodeType === XmlCore__namespace.XmlNodeType.Element && res) {
return ++result + res;
}
}
}
return result;
}
function IsNamespaceNode(node) {
const reg = /xmlns:/;
if (node !== null && node.nodeType === XmlCore__namespace.XmlNodeType.Attribute && (node.nodeName === "xmlns" || reg.test(node.nodeName))) {
return true;
}
return false;
}
const XmlSignature = {
DefaultCanonMethod: "http://www.w3.org/TR/2001/REC-xml-c14n-20010315",
DefaultDigestMethod: "http://www.w3.org/2001/04/xmlenc#sha256",
DefaultPrefix: "ds",
ElementNames: {
CanonicalizationMethod: "CanonicalizationMethod",
DigestMethod: "DigestMethod",
DigestValue: "DigestValue",
DSAKeyValue: "DSAKeyValue",
DomainParameters: "DomainParameters",
EncryptedKey: "EncryptedKey",
HMACOutputLength: "HMACOutputLength",
RSAPSSParams: "RSAPSSParams",
MaskGenerationFunction: "MaskGenerationFunction",
SaltLength: "SaltLength",
KeyInfo: "KeyInfo",
KeyName: "KeyName",
KeyValue: "KeyValue",
Modulus: "Modulus",
Exponent: "Exponent",
Manifest: "Manifest",
Object: "Object",
Reference: "Reference",
RetrievalMethod: "RetrievalMethod",
RSAKeyValue: "RSAKeyValue",
ECDSAKeyValue: "ECDSAKeyValue",
NamedCurve: "NamedCurve",
PublicKey: "PublicKey",
Signature: "Signature",
SignatureMethod: "SignatureMethod",
SignatureValue: "SignatureValue",
SignedInfo: "SignedInfo",
Transform: "Transform",
Transforms: "Transforms",
X509Data: "X509Data",
PGPData: "PGPData",
SPKIData: "SPKIData",
SPKIexp: "SPKIexp",
MgmtData: "MgmtData",
X509IssuerSerial: "X509IssuerSerial",
X509IssuerName: "X509IssuerName",
X509SerialNumber: "X509SerialNumber",
X509SKI: "X509SKI",
X509SubjectName: "X509SubjectName",
X509Certificate: "X509Certificate",
X509CRL: "X509CRL",
XPath: "XPath",
X: "X",
Y: "Y",
},
AttributeNames: {
Algorithm: "Algorithm",
Encoding: "Encoding",
Id: "Id",
MimeType: "MimeType",
Type: "Type",
URI: "URI",
},
AlgorithmNamespaces: {
XmlDsigBase64Transform: "http://www.w3.org/2000/09/xmldsig#base64",
XmlDsigC14NTransform: "http://www.w3.org/TR/2001/REC-xml-c14n-20010315",
XmlDsigC14NWithCommentsTransform: "http://www.w3.org/TR/2001/REC-xml-c14n-20010315#WithComments",
XmlDsigEnvelopedSignatureTransform: "http://www.w3.org/2000/09/xmldsig#enveloped-signature",
XmlDsigXPathTransform: "http://www.w3.org/TR/1999/REC-xpath-19991116",
XmlDsigXsltTransform: "http://www.w3.org/TR/1999/REC-xslt-19991116",
XmlDsigExcC14NTransform: "http://www.w3.org/2001/10/xml-exc-c14n#",
XmlDsigExcC14NWithCommentsTransform: "http://www.w3.org/2001/10/xml-exc-c14n#WithComments",
XmlDecryptionTransform: "http://www.w3.org/2002/07/decrypt#XML",
XmlLicenseTransform: "urn:mpeg:mpeg21:2003:01-REL-R-NS:licenseTransform",
},
Uri: {
Manifest: "http://www.w3.org/2000/09/xmldsig#Manifest",
},
NamespaceURI: "http://www.w3.org/2000/09/xmldsig#",
NamespaceURIMore: "http://www.w3.org/2007/05/xmldsig-more#",
NamespaceURIPss: "http://www.example.org/xmldsig-pss/#",
};
exports.XmlSignatureObject = class XmlSignatureObject extends XmlCore.XmlObject {
};
exports.XmlSignatureObject = tslib.__decorate([
XmlCore.XmlElement({
localName: "xmldsig",
namespaceURI: XmlSignature.NamespaceURI,
prefix: XmlSignature.DefaultPrefix,
})
], exports.XmlSignatureObject);
exports.XmlSignatureCollection = class XmlSignatureCollection extends XmlCore.XmlCollection {
};
exports.XmlSignatureCollection = tslib.__decorate([
XmlCore.XmlElement({
localName: "xmldsig_collection",
namespaceURI: XmlSignature.NamespaceURI,
prefix: XmlSignature.DefaultPrefix,
})
], exports.XmlSignatureCollection);
class KeyInfoClause extends exports.XmlSignatureObject {
}
exports.CanonicalizationMethod = class CanonicalizationMethod extends exports.XmlSignatureObject {
};
tslib.__decorate([
XmlCore.XmlAttribute({
localName: XmlSignature.AttributeNames.Algorithm,
required: true,
defaultValue: XmlSignature.DefaultCanonMethod,
})
], exports.CanonicalizationMethod.prototype, "Algorithm", void 0);
exports.CanonicalizationMethod = tslib.__decorate([
XmlCore.XmlElement({
localName: XmlSignature.ElementNames.CanonicalizationMethod,
})
], exports.CanonicalizationMethod);
exports.DataObject = class DataObject extends exports.XmlSignatureObject {
};
tslib.__decorate([
XmlCore.XmlAttribute({
localName: XmlSignature.AttributeNames.Id,
defaultValue: "",
})
], exports.DataObject.prototype, "Id", void 0);
tslib.__decorate([
XmlCore.XmlAttribute({
localName: XmlSignature.AttributeNames.MimeType,
defaultValue: "",
})
], exports.DataObject.prototype, "MimeType", void 0);
tslib.__decorate([
XmlCore.XmlAttribute({
localName: XmlSignature.AttributeNames.Encoding,
defaultValue: "",
})
], exports.DataObject.prototype, "Encoding", void 0);
exports.DataObject = tslib.__decorate([
XmlCore.XmlElement({
localName: XmlSignature.ElementNames.Object,
})
], exports.DataObject);
exports.DataObjects = class DataObjects extends exports.XmlSignatureCollection {
};
exports.DataObjects = tslib.__decorate([
XmlCore.XmlElement({
localName: "xmldsig_objects",
parser: exports.DataObject,
})
], exports.DataObjects);
exports.DigestMethod = class DigestMethod extends exports.XmlSignatureObject {
constructor(hashNamespace) {
super();
if (hashNamespace) {
this.Algorithm = hashNamespace;
}
}
};
tslib.__decorate([
XmlCore.XmlAttribute({
localName: XmlSignature.AttributeNames.Algorithm,
required: true,
defaultValue: XmlSignature.DefaultDigestMethod,
})
], exports.DigestMethod.prototype, "Algorithm", void 0);
exports.DigestMethod = tslib.__decorate([
XmlCore.XmlElement({
localName: XmlSignature.ElementNames.DigestMethod,
})
], exports.DigestMethod);
exports.KeyInfo = class KeyInfo extends exports.XmlSignatureCollection {
OnLoadXml(element) {
for (let i = 0; i < element.childNodes.length; i++) {
const node = element.childNodes.item(i);
if (node.nodeType !== XmlCore.XmlNodeType.Element) {
continue;
}
let KeyInfoClass = null;
switch (node.localName) {
case XmlSignature.ElementNames.KeyValue:
KeyInfoClass = exports.KeyValue;
break;
case XmlSignature.ElementNames.X509Data:
KeyInfoClass = exports.KeyInfoX509Data;
break;
case XmlSignature.ElementNames.SPKIData:
KeyInfoClass = exports.SPKIData;
break;
case XmlSignature.ElementNames.KeyName:
case XmlSignature.ElementNames.RetrievalMethod:
case XmlSignature.ElementNames.PGPData:
case XmlSignature.ElementNames.MgmtData:
}
if (KeyInfoClass) {
const item = new KeyInfoClass();
item.LoadXml(node);
this.Add(item);
}
}
}
};
tslib.__decorate([
XmlCore.XmlAttribute({
localName: XmlSignature.AttributeNames.Id,
defaultValue: "",
})
], exports.KeyInfo.prototype, "Id", void 0);
exports.KeyInfo = tslib.__decorate([
XmlCore.XmlElement({
localName: XmlSignature.ElementNames.KeyInfo,
})
], exports.KeyInfo);
exports.Transform = class Transform extends exports.XmlSignatureObject {
constructor() {
super(...arguments);
this.innerXml = null;
}
GetOutput() {
throw new XmlCore.XmlError(XmlCore.XE.METHOD_NOT_IMPLEMENTED);
}
LoadInnerXml(node) {
if (!node) {
throw new XmlCore.XmlError(XmlCore.XE.PARAM_REQUIRED, "node");
}
this.innerXml = node;
}
GetInnerXml() {
return this.innerXml;
}
};
tslib.__decorate([
XmlCore.XmlAttribute({
localName: XmlSignature.AttributeNames.Algorithm,
defaultValue: "",
})
], exports.Transform.prototype, "Algorithm", void 0);
tslib.__decorate([
XmlCore.XmlChildElement({
localName: XmlSignature.ElementNames.XPath,
defaultValue: "",
})
], exports.Transform.prototype, "XPath", void 0);
exports.Transform = tslib.__decorate([
XmlCore.XmlElement({
localName: XmlSignature.ElementNames.Transform,
})
], exports.Transform);
class XmlDsigBase64Transform extends exports.Transform {
constructor() {
super(...arguments);
this.Algorithm = XmlSignature.AlgorithmNamespaces.XmlDsigBase64Transform;
}
GetOutput() {
if (!this.innerXml) {
throw new XmlCore.XmlError(XmlCore.XE.PARAM_REQUIRED, "innerXml");
}
return XmlCore.Convert.FromString(this.innerXml.textContent || "", "base64");
}
}
class XmlDsigC14NTransform extends exports.Transform {
constructor() {
super(...arguments);
this.Algorithm = "http://www.w3.org/TR/2001/REC-xml-c14n-20010315";
this.xmlCanonicalizer = new XmlCanonicalizer(false, false);
}
GetOutput() {
if (!this.innerXml) {
throw new XmlCore.XmlError(XmlCore.XE.PARAM_REQUIRED, "innerXml");
}
return this.xmlCanonicalizer.Canonicalize(this.innerXml);
}
}
class XmlDsigC14NWithCommentsTransform extends XmlDsigC14NTransform {
constructor() {
super(...arguments);
this.Algorithm = "http://www.w3.org/TR/2001/REC-xml-c14n-20010315#WithComments";
this.xmlCanonicalizer = new XmlCanonicalizer(true, false);
}
}
class XmlDsigEnvelopedSignatureTransform extends exports.Transform {
constructor() {
super(...arguments);
this.Algorithm = "http://www.w3.org/2000/09/xmldsig#enveloped-signature";
}
GetOutput() {
var _a;
if (!this.innerXml) {
throw new XmlCore.XmlError(XmlCore.XE.PARAM_REQUIRED, "innerXml");
}
let child = this.innerXml.firstChild;
const signatures = [];
while (child) {
if (XmlCore.isElement(child)
&& child.localName === XmlSignature.ElementNames.Signature
&& child.namespaceURI === XmlSignature.NamespaceURI) {
signatures.push(child);
}
child = child.nextSibling;
}
for (const signature of signatures) {
(_a = signature.parentNode) === null || _a === void 0 ? void 0 : _a.removeChild(signature);
}
return this.innerXml;
}
}
class XmlDsigExcC14NTransform extends exports.Transform {
constructor() {
super(...arguments);
this.Algorithm = "http://www.w3.org/2001/10/xml-exc-c14n#";
this.xmlCanonicalizer = new XmlCanonicalizer(false, true);
}
get InclusiveNamespacesPrefixList() {
return this.xmlCanonicalizer.InclusiveNamespacesPrefixList;
}
set InclusiveNamespacesPrefixList(value) {
this.xmlCanonicalizer.InclusiveNamespacesPrefixList = value;
}
LoadXml(param) {
super.LoadXml(param);
if (this.Element && this.Element.childNodes) {
for (let i = 0; i < this.Element.childNodes.length; i++) {
const element = this.Element.childNodes[i];
if (element && element.nodeType === 1) {
switch (element.localName) {
case 'InclusiveNamespaces':
this.setInclusiveNamespacesElement(element);
break;
}
}
}
}
}
GetOutput() {
if (!this.innerXml) {
throw new XmlCore.XmlError(XmlCore.XE.PARAM_REQUIRED, "innerXml");
}
return this.xmlCanonicalizer.Canonicalize(this.innerXml);
}
setInclusiveNamespacesElement(element) {
const prefixList = element.getAttribute('PrefixList');
if (prefixList && prefixList.length > 0) {
this.xmlCanonicalizer.InclusiveNamespacesPrefixList = prefixList;
}
}
}
class XmlDsigExcC14NWithCommentsTransform extends XmlDsigExcC14NTransform {
constructor() {
super(...arguments);
this.Algorithm = "http://www.w3.org/2001/10/xml-exc-c14n#WithComments";
this.xmlCanonicalizer = new XmlCanonicalizer(true, true);
}
}
function lookupParentNode(node) {
return node.parentNode
? lookupParentNode(node.parentNode)
: node;
}
class XmlDsigXPathTransform extends exports.Transform {
constructor() {
super(...arguments);
this.Algorithm = XmlSignature.AlgorithmNamespaces.XmlDsigXPathTransform;
}
GetOutput() {
if (!this.innerXml) {
throw new XmlCore__namespace.XmlError(XmlCore__namespace.XE.PARAM_REQUIRED, "innerXml");
}
this.Filter(lookupParentNode(this.innerXml), this.XPath);
}
Filter(node, xpath) {
const childNodes = node.childNodes;
const nodes = [];
for (let i = 0; childNodes && i < childNodes.length; i++) {
const child = childNodes.item(i);
nodes.push(child);
}
nodes.forEach((child) => {
if (this.Evaluate(child, xpath)) {
if (child.parentNode) {
child.parentNode.removeChild(child);
}
}
else {
this.Filter(child, xpath);
}
});
}
GetEvaluator(node) {
if (typeof (self) !== "undefined") {
return (node.ownerDocument == null ? node : node.ownerDocument);
}
else {
return require("xpath");
}
}
Evaluate(node, xpath) {
try {
const evaluator = this.GetEvaluator(node);
const xpathEl = this.GetXml().firstChild;
const xPath = `boolean(${xpath})`;
const xpathResult = evaluator.evaluate(xPath, node, {
lookupNamespaceURI: (prefix) => {
return xpathEl.lookupNamespaceURI(prefix);
},
}, (typeof (self) === "undefined" ? require("xpath") : self).XPathResult.ANY_TYPE, null);
return !xpathResult.booleanValue;
}
catch (e) {
return false;
}
}
}
tslib.__decorate([
XmlCore__namespace.XmlChildElement({
localName: XmlSignature.ElementNames.XPath,
namespaceURI: XmlSignature.NamespaceURI,
prefix: XmlSignature.DefaultPrefix,
required: true,
})
], XmlDsigXPathTransform.prototype, "XPath", void 0);
exports.Transforms = class Transforms extends exports.XmlSignatureCollection {
OnLoadXml(element) {
super.OnLoadXml(element);
this.items = this.GetIterator().map((item) => {
switch (item.Algorithm) {
case XmlSignature.AlgorithmNamespaces.XmlDsigEnvelopedSignatureTransform:
return ChangeTransform(item, XmlDsigEnvelopedSignatureTransform);
case XmlSignature.AlgorithmNamespaces.XmlDsigC14NTransform:
return ChangeTransform(item, XmlDsigC14NTransform);
case XmlSignature.AlgorithmNamespaces.XmlDsigC14NWithCommentsTransform:
return ChangeTransform(item, XmlDsigC14NWithCommentsTransform);
case XmlSignature.AlgorithmNamespaces.XmlDsigExcC14NTransform:
return ChangeTransform(item, XmlDsigExcC14NTransform);
case XmlSignature.AlgorithmNamespaces.XmlDsigExcC14NWithCommentsTransform:
return ChangeTransform(item, XmlDsigExcC14NWithCommentsTransform);
case XmlSignature.AlgorithmNamespaces.XmlDsigBase64Transform:
return ChangeTransform(item, XmlDsigBase64Transform);
case XmlSignature.AlgorithmNamespaces.XmlDsigXPathTransform:
return ChangeTransform(item, XmlDsigXPathTransform);
default:
throw new XmlCore.XmlError(XmlCore.XE.CRYPTOGRAPHIC_UNKNOWN_TRANSFORM, item.Algorithm);
}
});
}
};
exports.Transforms = tslib.__decorate([
XmlCore.XmlElement({
localName: XmlSignature.ElementNames.Transforms,
parser: exports.Transform,
})
], exports.Transforms);
function ChangeTransform(t1, t2) {
const t = new t2();
t.LoadXml(t1.Element);
return t;
}
exports.Reference = class Reference extends exports.XmlSignatureObject {
constructor(uri) {
super();
this.DigestMethod = new exports.DigestMethod();
if (uri) {
this.Uri = uri;
}
}
};
tslib.__decorate([
XmlCore.XmlAttribute({
defaultValue: "",
})
], exports.Reference.prototype, "Id", void 0);
tslib.__decorate([
XmlCore.XmlAttribute({
localName: XmlSignature.AttributeNames.URI,
})
], exports.Reference.prototype, "Uri", void 0);
tslib.__decorate([
XmlCore.XmlAttribute({
localName: XmlSignature.AttributeNames.Type,
defaultValue: "",
})
], exports.Reference.prototype, "Type", void 0);
tslib.__decorate([
XmlCore.XmlChildElement({
parser: exports.Transforms,
})
], exports.Reference.prototype, "Transforms", void 0);
tslib.__decorate([
XmlCore.XmlChildElement({
required: true,
parser: exports.DigestMethod,
})
], exports.Reference.prototype, "DigestMethod", void 0);
tslib.__decorate([
XmlCore.XmlChildElement({
required: true,
localName: XmlSignature.ElementNames.DigestValue,
namespaceURI: XmlSignature.NamespaceURI,
prefix: XmlSignature.DefaultPrefix,
converter: XmlCore.XmlBase64Converter,
})
], exports.Reference.prototype, "DigestValue", void 0);
exports.Reference = tslib.__decorate([
XmlCore.XmlElement({
localName: XmlSignature.ElementNames.Reference,
})
], exports.Reference);
exports.References = class References extends exports.XmlSignatureCollection {
};
exports.References = tslib.__decorate([
XmlCore.XmlElement({
localName: "References",
parser: exports.Reference,
})
], exports.References);
exports.SignatureMethodOther = class SignatureMethodOther extends exports.XmlSignatureCollection {
OnLoadXml(element) {
for (let i = 0; i < element.childNodes.length; i++) {
const node = element.childNodes.item(i);
if (node.nodeType !== XmlCore__namespace.XmlNodeType.Element ||
node.nodeName === XmlSignature.ElementNames.HMACOutputLength) {
continue;
}
let ParserClass;
switch (node.localName) {
case XmlSignature.ElementNames.RSAPSSParams:
ParserClass = exports.PssAlgorithmParams;
break;
}
if (ParserClass) {
const xml = new ParserClass();
xml.LoadXml(node);
this.Add(xml);
}
}
}
};
exports.SignatureMethodOther = tslib.__decorate([
XmlCore.XmlElement({
localName: "Other",
})
], exports.SignatureMethodOther);
exports.SignatureMethod = class SignatureMethod extends exports.XmlSignatureObject {
};
tslib.__decorate([
XmlCore.XmlAttribute({
localName: XmlSignature.AttributeNames.Algorithm,
required: true,
defaultValue: "",
})
], exports.SignatureMethod.prototype, "Algorithm", void 0);
tslib.__decorate([
XmlCore.XmlChildElement({
localName: XmlSignature.ElementNames.HMACOutputLength,
namespaceURI: XmlSignature.NamespaceURI,
prefix: XmlSignature.DefaultPrefix,
converter: XmlCore.XmlNumberConverter,
})
], exports.SignatureMethod.prototype, "HMACOutputLength", void 0);
tslib.__decorate([
XmlCore.XmlChildElement({
parser: exports.SignatureMethodOther,
noRoot: true,
minOccurs: 0,
})
], exports.SignatureMethod.prototype, "Any", void 0);
exports.SignatureMethod = tslib.__decorate([
XmlCore.XmlElement({
localName: XmlSignature.ElementNames.SignatureMethod,
})
], exports.SignatureMethod);
exports.SignedInfo = class SignedInfo extends exports.XmlSignatureObject {
};
tslib.__decorate([
XmlCore.XmlAttribute({
localName: XmlSignature.AttributeNames.Id,
defaultValue: "",
})
], exports.SignedInfo.prototype, "Id", void 0);
tslib.__decorate([
XmlCore.XmlChildElement({
parser: exports.CanonicalizationMethod,
required: true,
})
], exports.SignedInfo.prototype, "CanonicalizationMethod", void 0);
tslib.__decorate([
XmlCore.XmlChildElement({
parser: exports.SignatureMethod,
required: true,
})
], exports.SignedInfo.prototype, "SignatureMethod", void 0);
tslib.__decorate([
XmlCore.XmlChildElement({
parser: exports.References,
minOccurs: 1,
noRoot: true,
})
], exports.SignedInfo.prototype, "References", void 0);
exports.SignedInfo = tslib.__decorate([
XmlCore.XmlElement({
localName: XmlSignature.ElementNames.SignedInfo,
})
], exports.SignedInfo);
exports.Signature = class Signature extends exports.XmlSignatureObject {
};
tslib.__decorate([
XmlCore.XmlAttribute({
localName: XmlSignature.AttributeNames.Id,
defaultValue: "",
})
], exports.Signature.prototype, "Id", void 0);
tslib.__decorate([
XmlCore.XmlChildElement({
parser: exports.SignedInfo,
required: true,
})
], exports.Signature.prototype, "SignedInfo", void 0);
tslib.__decorate([
XmlCore.XmlChildElement({
localName: XmlSignature.ElementNames.SignatureValue,
namespaceURI: XmlSignature.NamespaceURI,
prefix: XmlSignature.DefaultPrefix,
required: true,
converter: XmlCore.XmlBase64Converter,
defaultValue: null,
})
], exports.Signature.prototype, "SignatureValue", void 0);
tslib.__decorate([
XmlCore.XmlChildElement({
parser: exports.KeyInfo,
})
], exports.Signature.prototype, "KeyInfo", void 0);
tslib.__decorate([
XmlCore.XmlChildElement({
parser: exports.DataObjects,
noRoot: true,
})
], exports.Signature.prototype, "ObjectList", void 0);
exports.Signature = tslib.__decorate([
XmlCore.XmlElement({
localName: XmlSignature.ElementNames.Signature,
})
], exports.Signature);
const NAMESPACE_URI$1 = "http://www.w3.org/2001/04/xmldsig-more#";
const PREFIX$1 = "ecdsa";
exports.EcdsaPublicKey = class EcdsaPublicKey extends XmlCore.XmlObject {
};
tslib.__decorate([
XmlCore.XmlChildElement({
localName: XmlSignature.ElementNames.X,
namespaceURI: NAMESPACE_URI$1,
prefix: PREFIX$1,
required: true,
converter: XmlCore.XmlBase64Converter,
})
], exports.EcdsaPublicKey.prototype, "X", void 0);
tslib.__decorate([
XmlCore.XmlChildElement({
localName: XmlSignature.ElementNames.Y,
namespaceURI: NAMESPACE_URI$1,
prefix: PREFIX$1,
required: true,
converter: XmlCore.XmlBase64Converter,
})
], exports.EcdsaPublicKey.prototype, "Y", void 0);
exports.EcdsaPublicKey = tslib.__decorate([
XmlCore.XmlElement({
localName: XmlSignature.ElementNames.PublicKey,
namespaceURI: NAMESPACE_URI$1,
prefix: PREFIX$1,
})
], exports.EcdsaPublicKey);
exports.NamedCurve = class NamedCurve extends XmlCore.XmlObject {
};
tslib.__decorate([
XmlCore.XmlAttribute({
localName: XmlSignature.AttributeNames.URI,
required: true,
})
], exports.NamedCurve.prototype, "Uri", void 0);
exports.NamedCurve = tslib.__decorate([
XmlCore.XmlElement({
localName: XmlSignature.ElementNames.NamedCurve,
namespaceURI: NAMESPACE_URI$1,
prefix: PREFIX$1,
})
], exports.NamedCurve);
exports.DomainParameters = class DomainParameters extends XmlCore.XmlObject {
};
tslib.__decorate([
XmlCore.XmlChildElement({
parser: exports.NamedCurve,
})
], exports.DomainParameters.prototype, "NamedCurve", void 0);
exports.DomainParameters = tslib.__decorate([
XmlCore.XmlElement({
localName: XmlSignature.ElementNames.DomainParameters,
namespaceURI: NAMESPACE_URI$1,
prefix: PREFIX$1,
})
], exports.DomainParameters);
exports.EcdsaKeyValue = class EcdsaKeyValue extends KeyInfoClause {
constructor() {
super(...arguments);
this.name = XmlSignature.ElementNames.ECDSAKeyValue;
this.key = null;
this.jwk = null;
this.keyUsage = null;
}
get NamedCurve() {
return GetNamedCurveOid(this.DomainParameters.NamedCurve.Uri);
}
async importKey(key) {
if (key.algorithm.name.