xmldsigjs
Version:
XML Digital Signature implementation in TypeScript/JavaScript using Web Crypto API
93 lines (92 loc) • 4.2 kB
JavaScript
import { XE, XmlError } from 'xml-core';
import { SignatureMethod } from './xml/signature_method.js';
import { XmlSignature } from './xml/index.js';
import { XmlDsigBase64Transform, XmlDsigC14NTransform, XmlDsigC14NWithCommentsTransform, XmlDsigEnvelopedSignatureTransform, XmlDsigExcC14NTransform, XmlDsigExcC14NWithCommentsTransform, } from './xml/transforms/index.js';
import { AlgorithmFactory } from './algorithm.factory.js';
import { algorithmRegistry } from './algorithm.registry.js';
import { keyValueRegistry } from './xml/key_infos/key_info_clause.registry.js';
import { transformRegistry } from './xml/transform.registry.js';
export class CryptoConfig {
static CreateFromName(name) {
if (!name) {
throw new XmlError(XE.PARAM_REQUIRED, 'name');
}
const TransformConstructor = transformRegistry.get(name);
if (TransformConstructor) {
return new TransformConstructor();
}
let transform;
switch (name) {
case XmlSignature.AlgorithmNamespaces.XmlDsigBase64Transform:
transform = new XmlDsigBase64Transform();
break;
case XmlSignature.AlgorithmNamespaces.XmlDsigC14NTransform:
transform = new XmlDsigC14NTransform();
break;
case XmlSignature.AlgorithmNamespaces.XmlDsigC14NWithCommentsTransform:
transform = new XmlDsigC14NWithCommentsTransform();
break;
case XmlSignature.AlgorithmNamespaces.XmlDsigEnvelopedSignatureTransform:
transform = new XmlDsigEnvelopedSignatureTransform();
break;
case XmlSignature.AlgorithmNamespaces.XmlDsigXPathTransform:
throw new XmlError(XE.ALGORITHM_NOT_SUPPORTED, name);
case XmlSignature.AlgorithmNamespaces.XmlDsigXsltTransform:
throw new XmlError(XE.ALGORITHM_NOT_SUPPORTED, name);
case XmlSignature.AlgorithmNamespaces.XmlDsigExcC14NTransform:
transform = new XmlDsigExcC14NTransform();
break;
case XmlSignature.AlgorithmNamespaces.XmlDsigExcC14NWithCommentsTransform:
transform = new XmlDsigExcC14NWithCommentsTransform();
break;
case XmlSignature.AlgorithmNamespaces.XmlDecryptionTransform:
throw new XmlError(XE.ALGORITHM_NOT_SUPPORTED, name);
default:
throw new XmlError(XE.ALGORITHM_NOT_SUPPORTED, name);
}
return transform;
}
static CreateSignatureAlgorithm(method) {
return AlgorithmFactory.createSignatureAlgorithmFromMethod(method);
}
static CreateHashAlgorithm(namespace) {
return AlgorithmFactory.createHashAlgorithmFromNamespace(namespace);
}
static GetHashAlgorithm(algorithm) {
const alg = typeof algorithm === 'string' ? { name: algorithm } : algorithm;
return AlgorithmFactory.createHashAlgorithmFromAlgorithm(alg);
}
static GetSignatureAlgorithm(algorithm) {
const alg = typeof algorithm === 'string' ? { name: algorithm } : algorithm;
if ('hash' in alg && typeof alg.hash === 'string') {
alg.hash = { name: alg.hash };
}
return AlgorithmFactory.createSignatureAlgorithmFromAlgorithm(alg);
}
static CreateSignatureMethod(algorithm) {
const signatureMethod = new SignatureMethod();
signatureMethod.Algorithm = algorithm.namespaceURI;
if (algorithm.toMethod) {
algorithm.toMethod(signatureMethod);
}
return signatureMethod;
}
static RegisterSignatureAlgorithm(namespace, algorithm) {
algorithmRegistry.set(namespace, {
type: 'signature',
algorithm,
});
}
static RegisterHashAlgorithm(namespace, algorithm) {
algorithmRegistry.set(namespace, {
type: 'hash',
algorithm,
});
}
static RegisterKeyInfoClause(localName, keyValue) {
keyValueRegistry.set(localName, keyValue);
}
static RegisterTransform(namespace, transform) {
transformRegistry.set(namespace, transform);
}
}