scvp-ts
Version:
Server-side Certificate Validation Protocol (SCVP) in TypeScript
781 lines • 31.2 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports._decodeBigInt = exports._encodeBigInt = exports._encodeSetOf = exports._decodeSetOf = exports._encodeSequenceOf = exports._decodeSequenceOf = exports._decode_extensible_choice = exports._decode_inextensible_choice = exports._encode_choice = exports._parse_sequence = exports._parse_sequence_without_trailing_rctl = exports._parse_sequence_with_trailing_rctl = exports._get_possible_initial_components = exports._parse_component_type_list = exports._parse_set = exports.ComponentSpec = exports._decodeAny = exports._decodeObjectDescriptor = exports._decodeUTCTime = exports._decodeGeneralizedTime = exports._decodeVisibleString = exports._decodeVideotexString = exports._decodeUTF8String = exports._decodeUniversalString = exports._decodeT61String = exports._decodeTeletexString = exports._decodePrintableString = exports._decodeNumericString = exports._decodeISO646String = exports._decodeIA5String = exports._decodeGraphicString = exports._decodeGeneralString = exports._decodeBMPString = exports._decodeTimeOfDay = exports._decodeTime = exports._decodeSet = exports._decodeSequence = exports._decodeRelativeOID = exports._decodeRelativeIRI = exports._decodeReal = exports._decodeOctetString = exports._decodeObjectIdentifier = exports._decodeNull = exports._decodeIRI = exports._decodeInteger = exports._decodeInstanceOf = exports._decodeExternal = exports._decodeEnumerated = exports._decodeEmbeddedPDV = exports._decodeDuration = exports._decodeDateTime = exports._decodeDate = exports._decodeUnrestrictedCharacterString = exports._decodeBoolean = exports._decodeBitString = exports._encodeAny = exports._encodeObjectDescriptor = exports._encodeUTCTime = exports._encodeGeneralizedTime = exports._encodeVisibleString = exports._encodeVideotexString = exports._encodeUTF8String = exports._encodeUniversalString = exports._encodeT61String = exports._encodeTeletexString = exports._encodePrintableString = exports._encodeNumericString = exports._encodeISO646String = exports._encodeIA5String = exports._encodeGraphicString = exports._encodeGeneralString = exports._encodeBMPString = exports._encodeTimeOfDay = exports._encodeTime = exports._encodeSet = exports._encodeSequence = exports._encodeRelativeOID = exports._encodeRelativeIRI = exports._encodeReal = exports._encodeOctetString = exports._encodeObjectIdentifier = exports._encodeNull = exports._encodeIRI = exports._encodeInteger = exports._encodeInstanceOf = exports._encodeExternal = exports._encodeEnumerated = exports._encodeEmbeddedPDV = exports._encodeDuration = exports._encodeDateTime = exports._encodeDate = exports._encodeUnrestrictedCharacterString = exports._encodeBoolean = exports._encodeBitString = exports.DER = exports.CER = exports.BER = exports._tagNumber = exports._construction = exports._tagClass = exports._decode_implicit = exports._encode_implicit = exports._decode_explicit = exports._encode_explicit = exports.present = exports.isDefault = exports.deepEq = exports.tagClassName = exports.hasTagNumberIn = exports.hasTagClass = exports.hasAnyTag = exports.hasTag = exports.joint_iso_ccitt = exports.joint_iso_itu_t = exports.iso = exports.ccitt = exports.itu_r = exports.itu_t = void 0;
const asn1_ts_1 = require("asn1-ts");
exports.itu_t = 0;
exports.itu_r = 0;
exports.ccitt = 0;
exports.iso = 1;
exports.joint_iso_itu_t = 2;
exports.joint_iso_ccitt = 2;
function hasTag(tagClass, tagNumber) {
return function (index, elements) {
const el = elements[index];
return el.tagClass === tagClass && el.tagNumber === tagNumber;
};
}
exports.hasTag = hasTag;
function hasAnyTag(index, elements) {
return true;
}
exports.hasAnyTag = hasAnyTag;
function hasTagClass(tagClass) {
return function (index, elements) {
return elements[index].tagClass === tagClass;
};
}
exports.hasTagClass = hasTagClass;
function hasTagNumberIn(tagNumbers) {
return function (index, elements) {
return tagNumbers.some((tn) => tn === elements[index].tagNumber);
};
}
exports.hasTagNumberIn = hasTagNumberIn;
function tagClassName(tagClass) {
switch (tagClass) {
case asn1_ts_1.ASN1TagClass.universal:
return "UNIVERSAL";
case asn1_ts_1.ASN1TagClass.context:
return "CONTEXT";
case asn1_ts_1.ASN1TagClass.application:
return "APPLICATION";
case asn1_ts_1.ASN1TagClass.private:
return "PRIVATE";
default: {
throw new Error(`Unrecognized ASN.1 Tag Class ${tagClass}.`);
}
}
}
exports.tagClassName = tagClassName;
function deepEq(value1, value2) {
if (value1 === value2) {
return true;
}
return JSON.stringify(value1) === JSON.stringify(value2);
}
exports.deepEq = deepEq;
function isDefault(defaultValue) {
return function (actualValue) {
return deepEq(defaultValue, actualValue);
};
}
exports.isDefault = isDefault;
function present(value) {
return value !== undefined;
}
exports.present = present;
function _encode_explicit(class_, tag, encoderGetter, outer) {
return function (value, elGetter) {
const ret = outer(value, outer);
ret.sequence = [encoderGetter()(value, elGetter)];
ret.construction = asn1_ts_1.ASN1Construction.constructed;
if (class_) {
ret.tagClass = class_;
}
if (typeof tag !== "undefined") {
ret.tagNumber = tag;
}
return ret;
};
}
exports._encode_explicit = _encode_explicit;
function _decode_explicit(decoderGetter) {
return (el) => decoderGetter()(el.inner);
}
exports._decode_explicit = _decode_explicit;
function _encode_implicit(class_, tag, encoderGetter, outer) {
return function (value, elGetter) {
const ret = encoderGetter()(value, elGetter);
if (class_) {
ret.tagClass = class_;
}
if (typeof tag !== "undefined") {
ret.tagNumber = tag;
}
return ret;
};
}
exports._encode_implicit = _encode_implicit;
function _decode_implicit(decoderGetter) {
return (el) => decoderGetter()(el);
}
exports._decode_implicit = _decode_implicit;
function _tagClass(class_, encoderGetter) {
const el = encoderGetter()();
el.tagClass = class_;
return el;
}
exports._tagClass = _tagClass;
function _construction(con, encoderGetter) {
const el = encoderGetter()();
el.construction = con;
return el;
}
exports._construction = _construction;
function _tagNumber(tag, encoderGetter) {
const el = encoderGetter()();
el.tagNumber = tag;
return el;
}
exports._tagNumber = _tagNumber;
exports.BER = (value, elGetter) => new asn1_ts_1.BERElement();
exports.CER = (value, elGetter) => new asn1_ts_1.CERElement();
exports.DER = (value, elGetter) => new asn1_ts_1.DERElement();
exports._encodeBitString = (value, elGetter) => {
const el = elGetter(value, elGetter);
el.bitString = value;
el.tagClass = asn1_ts_1.ASN1TagClass.universal;
el.tagNumber = asn1_ts_1.ASN1UniversalType.bitString;
return el;
};
exports._encodeBoolean = (value, elGetter) => {
const el = elGetter(value, elGetter);
el.boolean = value;
el.tagClass = asn1_ts_1.ASN1TagClass.universal;
el.tagNumber = asn1_ts_1.ASN1UniversalType.boolean;
return el;
};
exports._encodeUnrestrictedCharacterString = (value, elGetter) => {
const el = elGetter(value, elGetter);
el.characterString = value;
el.tagClass = asn1_ts_1.ASN1TagClass.universal;
el.tagNumber = asn1_ts_1.ASN1UniversalType.characterString;
return el;
};
exports._encodeDate = (value, elGetter) => {
const el = elGetter(value, elGetter);
el.date = value;
el.tagClass = asn1_ts_1.ASN1TagClass.universal;
el.tagNumber = asn1_ts_1.ASN1UniversalType.date;
return el;
};
exports._encodeDateTime = (value, elGetter) => {
const el = elGetter(value, elGetter);
el.dateTime = value;
el.tagClass = asn1_ts_1.ASN1TagClass.universal;
el.tagNumber = asn1_ts_1.ASN1UniversalType.dateTime;
return el;
};
exports._encodeDuration = (value, elGetter) => {
const el = elGetter(value, elGetter);
el.duration = value;
el.tagClass = asn1_ts_1.ASN1TagClass.universal;
el.tagNumber = asn1_ts_1.ASN1UniversalType.duration;
return el;
};
exports._encodeEmbeddedPDV = (value, elGetter) => {
const el = elGetter(value, elGetter);
el.embeddedPDV = value;
el.tagClass = asn1_ts_1.ASN1TagClass.universal;
el.tagNumber = asn1_ts_1.ASN1UniversalType.embeddedPDV;
return el;
};
exports._encodeEnumerated = (value, elGetter) => {
const el = elGetter(value, elGetter);
el.enumerated = value;
el.tagClass = asn1_ts_1.ASN1TagClass.universal;
el.tagNumber = asn1_ts_1.ASN1UniversalType.enumerated;
return el;
};
exports._encodeExternal = (value, elGetter) => {
const el = elGetter(value, elGetter);
el.external = value;
el.tagClass = asn1_ts_1.ASN1TagClass.universal;
el.tagNumber = asn1_ts_1.ASN1UniversalType.external;
return el;
};
exports._encodeInstanceOf = (value, elGetter) => {
const el = elGetter(value, elGetter);
el.external = value;
el.tagClass = asn1_ts_1.ASN1TagClass.universal;
el.tagNumber = asn1_ts_1.ASN1UniversalType.external;
return el;
};
exports._encodeInteger = (value, elGetter) => {
const el = elGetter(value, elGetter);
el.integer = value;
el.tagClass = asn1_ts_1.ASN1TagClass.universal;
el.tagNumber = asn1_ts_1.ASN1UniversalType.integer;
return el;
};
exports._encodeIRI = (value, elGetter) => {
const el = elGetter(value, elGetter);
el.oidIRI = value;
el.tagClass = asn1_ts_1.ASN1TagClass.universal;
el.tagNumber = asn1_ts_1.ASN1UniversalType.oidIRI;
return el;
};
exports._encodeNull = (value, elGetter) => {
const el = elGetter(value, elGetter);
el.value = new Uint8Array(0);
el.tagClass = asn1_ts_1.ASN1TagClass.universal;
el.tagNumber = asn1_ts_1.ASN1UniversalType.nill;
return el;
};
exports._encodeObjectIdentifier = (value, elGetter) => {
const el = elGetter(value, elGetter);
el.objectIdentifier = value;
el.tagClass = asn1_ts_1.ASN1TagClass.universal;
el.tagNumber = asn1_ts_1.ASN1UniversalType.objectIdentifier;
return el;
};
exports._encodeOctetString = (value, elGetter) => {
const el = elGetter(value, elGetter);
el.octetString = value;
el.tagClass = asn1_ts_1.ASN1TagClass.universal;
el.tagNumber = asn1_ts_1.ASN1UniversalType.octetString;
return el;
};
exports._encodeReal = (value, elGetter) => {
const el = elGetter(value, elGetter);
el.real = value;
el.tagClass = asn1_ts_1.ASN1TagClass.universal;
el.tagNumber = asn1_ts_1.ASN1UniversalType.realNumber;
return el;
};
exports._encodeRelativeIRI = (value, elGetter) => {
const el = elGetter(value, elGetter);
el.relativeOIDIRI = value;
el.tagClass = asn1_ts_1.ASN1TagClass.universal;
el.tagNumber = asn1_ts_1.ASN1UniversalType.roidIRI;
return el;
};
exports._encodeRelativeOID = (value, elGetter) => {
const el = elGetter(value, elGetter);
el.relativeObjectIdentifier = value;
el.tagClass = asn1_ts_1.ASN1TagClass.universal;
el.tagNumber = asn1_ts_1.ASN1UniversalType.relativeOID;
return el;
};
exports._encodeSequence = (value, elGetter) => {
const el = elGetter(value, elGetter);
el.sequence = value;
el.tagClass = asn1_ts_1.ASN1TagClass.universal;
el.tagNumber = asn1_ts_1.ASN1UniversalType.sequence;
return el;
};
exports._encodeSet = (value, elGetter) => {
const el = elGetter(value, elGetter);
el.set = value;
el.tagClass = asn1_ts_1.ASN1TagClass.universal;
el.tagNumber = asn1_ts_1.ASN1UniversalType.set;
return el;
};
exports._encodeTime = (value, elGetter) => {
const el = elGetter(value, elGetter);
el.time = value;
el.tagClass = asn1_ts_1.ASN1TagClass.universal;
el.tagNumber = asn1_ts_1.ASN1UniversalType.time;
return el;
};
exports._encodeTimeOfDay = (value, elGetter) => {
const el = elGetter(value, elGetter);
el.timeOfDay = value;
el.tagClass = asn1_ts_1.ASN1TagClass.universal;
el.tagNumber = asn1_ts_1.ASN1UniversalType.timeOfDay;
return el;
};
exports._encodeBMPString = (value, elGetter) => {
const el = elGetter(value, elGetter);
el.bmpString = value;
el.tagClass = asn1_ts_1.ASN1TagClass.universal;
el.tagNumber = asn1_ts_1.ASN1UniversalType.bmpString;
return el;
};
exports._encodeGeneralString = (value, elGetter) => {
const el = elGetter(value, elGetter);
el.generalString = value;
el.tagClass = asn1_ts_1.ASN1TagClass.universal;
el.tagNumber = asn1_ts_1.ASN1UniversalType.generalString;
return el;
};
exports._encodeGraphicString = (value, elGetter) => {
const el = elGetter(value, elGetter);
el.graphicString = value;
el.tagClass = asn1_ts_1.ASN1TagClass.universal;
el.tagNumber = asn1_ts_1.ASN1UniversalType.graphicString;
return el;
};
exports._encodeIA5String = (value, elGetter) => {
const el = elGetter(value, elGetter);
el.ia5String = value;
el.tagClass = asn1_ts_1.ASN1TagClass.universal;
el.tagNumber = asn1_ts_1.ASN1UniversalType.ia5String;
return el;
};
exports._encodeISO646String = (value, elGetter) => {
const el = elGetter(value, elGetter);
el.ia5String = value;
el.tagClass = asn1_ts_1.ASN1TagClass.universal;
el.tagNumber = asn1_ts_1.ASN1UniversalType.ia5String;
return el;
};
exports._encodeNumericString = (value, elGetter) => {
const el = elGetter(value, elGetter);
el.numericString = value;
el.tagClass = asn1_ts_1.ASN1TagClass.universal;
el.tagNumber = asn1_ts_1.ASN1UniversalType.numericString;
return el;
};
exports._encodePrintableString = (value, elGetter) => {
const el = elGetter(value, elGetter);
el.printableString = value;
el.tagClass = asn1_ts_1.ASN1TagClass.universal;
el.tagNumber = asn1_ts_1.ASN1UniversalType.printableString;
return el;
};
exports._encodeTeletexString = (value, elGetter) => {
const el = elGetter(value, elGetter);
el.teletexString = value;
el.tagClass = asn1_ts_1.ASN1TagClass.universal;
el.tagNumber = asn1_ts_1.ASN1UniversalType.teletexString;
return el;
};
exports._encodeT61String = (value, elGetter) => {
const el = elGetter(value, elGetter);
el.teletexString = value;
el.tagClass = asn1_ts_1.ASN1TagClass.universal;
el.tagNumber = asn1_ts_1.ASN1UniversalType.teletexString;
return el;
};
exports._encodeUniversalString = (value, elGetter) => {
const el = elGetter(value, elGetter);
el.universalString = value;
el.tagClass = asn1_ts_1.ASN1TagClass.universal;
el.tagNumber = asn1_ts_1.ASN1UniversalType.universalString;
return el;
};
exports._encodeUTF8String = (value, elGetter) => {
const el = elGetter(value, elGetter);
el.utf8String = value;
el.tagClass = asn1_ts_1.ASN1TagClass.universal;
el.tagNumber = asn1_ts_1.ASN1UniversalType.utf8String;
return el;
};
exports._encodeVideotexString = (value, elGetter) => {
const el = elGetter(value, elGetter);
el.videotexString = value;
el.tagClass = asn1_ts_1.ASN1TagClass.universal;
el.tagNumber = asn1_ts_1.ASN1UniversalType.videotexString;
return el;
};
exports._encodeVisibleString = (value, elGetter) => {
const el = elGetter(value, elGetter);
el.visibleString = value;
el.tagClass = asn1_ts_1.ASN1TagClass.universal;
el.tagNumber = asn1_ts_1.ASN1UniversalType.visibleString;
return el;
};
exports._encodeGeneralizedTime = (value, elGetter) => {
const el = elGetter(value, elGetter);
el.generalizedTime = value;
el.tagClass = asn1_ts_1.ASN1TagClass.universal;
el.tagNumber = asn1_ts_1.ASN1UniversalType.generalizedTime;
return el;
};
exports._encodeUTCTime = (value, elGetter) => {
const el = elGetter(value, elGetter);
el.utcTime = value;
el.tagClass = asn1_ts_1.ASN1TagClass.universal;
el.tagNumber = asn1_ts_1.ASN1UniversalType.utcTime;
return el;
};
exports._encodeObjectDescriptor = (value, elGetter) => {
const el = elGetter(value, elGetter);
el.objectDescriptor = value;
el.tagClass = asn1_ts_1.ASN1TagClass.universal;
el.tagNumber = asn1_ts_1.ASN1UniversalType.objectDescriptor;
return el;
};
exports._encodeAny = (value, elGetter) => {
return value;
};
exports._decodeBitString = (el) => {
return el.bitString;
};
exports._decodeBoolean = (el) => {
return el.boolean;
};
exports._decodeUnrestrictedCharacterString = (el) => {
return el.characterString;
};
exports._decodeDate = (el) => {
return el.date;
};
exports._decodeDateTime = (el) => {
return el.dateTime;
};
exports._decodeDuration = (el) => {
return el.duration;
};
exports._decodeEmbeddedPDV = (el) => {
return el.embeddedPDV;
};
exports._decodeEnumerated = (el) => {
return el.enumerated;
};
exports._decodeExternal = (el) => {
return el.external;
};
exports._decodeInstanceOf = (el) => {
return el.external;
};
exports._decodeInteger = (el) => {
return el.integer;
};
exports._decodeIRI = (el) => {
return el.oidIRI;
};
exports._decodeNull = (el) => {
return null;
};
exports._decodeObjectIdentifier = (el) => {
return el.objectIdentifier;
};
exports._decodeOctetString = (el) => {
return el.octetString;
};
exports._decodeReal = (el) => {
return el.real;
};
exports._decodeRelativeIRI = (el) => {
return el.relativeOIDIRI;
};
exports._decodeRelativeOID = (el) => {
return el.relativeObjectIdentifier;
};
exports._decodeSequence = (el) => {
return el.sequence;
};
exports._decodeSet = (el) => {
return el.set;
};
exports._decodeTime = (el) => {
return el.time;
};
exports._decodeTimeOfDay = (el) => {
return el.timeOfDay;
};
exports._decodeBMPString = (el) => {
return el.bmpString;
};
exports._decodeGeneralString = (el) => {
return el.generalString;
};
exports._decodeGraphicString = (el) => {
return el.graphicString;
};
exports._decodeIA5String = (el) => {
return el.ia5String;
};
exports._decodeISO646String = (el) => {
return el.ia5String;
};
exports._decodeNumericString = (el) => {
return el.numericString;
};
exports._decodePrintableString = (el) => {
return el.printableString;
};
exports._decodeTeletexString = (el) => {
return el.teletexString;
};
exports._decodeT61String = (el) => {
return el.teletexString;
};
exports._decodeUniversalString = (el) => {
return el.universalString;
};
exports._decodeUTF8String = (el) => {
return el.utf8String;
};
exports._decodeVideotexString = (el) => {
return el.videotexString;
};
exports._decodeVisibleString = (el) => {
return el.visibleString;
};
exports._decodeGeneralizedTime = (el) => {
return el.generalizedTime;
};
exports._decodeUTCTime = (el) => {
return el.utcTime;
};
exports._decodeObjectDescriptor = (el) => {
return el.objectDescriptor;
};
exports._decodeAny = (el) => {
return el;
};
class ComponentSpec {
constructor(name, optional, selector, groupIndex, versionNumber) {
this.name = name;
this.optional = optional;
this.selector = selector;
this.groupIndex = groupIndex;
this.versionNumber = versionNumber;
}
}
exports.ComponentSpec = ComponentSpec;
function _parse_set(set, decodingCallbacks, rootComponentTypeList1, extensionAdditionsList, rootComponentTypeList2, unrecognizedExtensionHandler = () => { }, maximumElements) {
const rootComponents = rootComponentTypeList1.concat(rootComponentTypeList2);
const components = rootComponents.concat(rootComponentTypeList2);
const elements = set.set;
{
const calculatedMaximumElements = maximumElements === undefined
? components.length + 100
: maximumElements;
if (elements.length > calculatedMaximumElements) {
throw new Error(`SET '${set.name}' contained ${elements.length} elements, which exceeds the ` +
`limit of ${calculatedMaximumElements} permitted elements. This may be a result ` +
"of a Denial-of-Service (DoS) attack.");
}
}
{
const encounteredTags = new Set([]);
elements.forEach((e) => {
const tag = `${e.tagClass} ${e.tagNumber}`;
if (encounteredTags.has(tag)) {
throw new Error(`Duplicate tag '${tagClassName(e.tagClass)} ${e.tagNumber}' in SET '${set.name}'.`);
}
encounteredTags.add(tag);
});
}
const encounteredComponents = new Set([]);
const encounteredExtensionGroups = new Set([]);
elements.forEach((e, i) => {
const spec = components.find((cs) => cs.selector(i, elements));
if (!spec) {
unrecognizedExtensionHandler(e);
return;
}
if (encounteredComponents.has(spec.name)) {
throw new Error(`SET '${set.name}' contained more than one '${spec.name}' component.`);
}
encounteredComponents.add(spec.name);
if (spec.groupIndex !== undefined) {
encounteredExtensionGroups.add(spec.groupIndex);
}
e.name = spec.name;
if (spec.name in decodingCallbacks) {
decodingCallbacks[spec.name](e, spec.name);
}
else {
unrecognizedExtensionHandler(e);
}
});
const missingRequiredComponents = [];
rootComponents
.filter((c) => !c.optional)
.forEach((c) => {
if (!encounteredComponents.has(c.name)) {
missingRequiredComponents.push(c.name);
}
});
Array.from(encounteredExtensionGroups).forEach((exg) => {
extensionAdditionsList
.filter((c) => c.groupIndex === exg && !c.optional)
.forEach((c) => {
if (!encounteredComponents.has(c.name)) {
missingRequiredComponents.push(c.name);
}
});
});
if (missingRequiredComponents.length > 0) {
throw new Error(`SET '${set.name}' missing these required components: ${missingRequiredComponents.join(", ")}.`);
}
}
exports._parse_set = _parse_set;
function _parse_component_type_list(componentTypeList, decodingCallbacks, elements, isExtensionAdditionsList) {
let e = 0;
let s = 0;
let currentGroup = undefined;
while (s < componentTypeList.length) {
const element = elements[e];
const spec = componentTypeList[s];
if (!element) {
if (spec.optional) {
s++;
continue;
}
else if (isExtensionAdditionsList) {
if (spec.groupIndex !== undefined &&
spec.groupIndex <= (currentGroup || Infinity)) {
throw new asn1_ts_1.ASN1ConstructionError(`Missing required extension '${spec.name}' in SEQUENCE.`);
}
else {
s++;
continue;
}
}
else {
throw new asn1_ts_1.ASN1ConstructionError(`Missing required component '${spec.name}' in SEQUENCE.`);
}
}
if (spec.selector(e, elements)) {
element.name = spec.name;
if (spec.name in decodingCallbacks) {
decodingCallbacks[spec.name](element, spec.name);
}
if (spec.groupIndex !== undefined) {
currentGroup = spec.groupIndex;
}
e++;
}
else if (!spec.optional) {
throw new Error(`Component '${spec.name}' missing from SEQUENCE.`);
}
s++;
}
return e;
}
exports._parse_component_type_list = _parse_component_type_list;
function _get_possible_initial_components(componentTypeList) {
let i = 0;
while (i < componentTypeList.length) {
if (!componentTypeList[i++].optional) {
break;
}
}
return componentTypeList.slice(0, i);
}
exports._get_possible_initial_components = _get_possible_initial_components;
function _parse_sequence_with_trailing_rctl(seq, decodingCallbacks, rootComponentTypeList1, extensionAdditionsList, rootComponentTypeList2, unrecognizedExtensionHandler = () => { }) {
const elements = seq.sequence;
const startOfExtensions = _parse_component_type_list(rootComponentTypeList1, decodingCallbacks, elements, false);
const possibleInitialRCTL2Components = _get_possible_initial_components(rootComponentTypeList2);
const rctl2EntirelyOptional = rootComponentTypeList2.every((ct) => ct.optional);
const extensionsOnwards = elements.slice(startOfExtensions);
let numberOfExtensionElements = extensionsOnwards.findIndex((e, i) => possibleInitialRCTL2Components.some((pirctl2c) => pirctl2c.selector(i, extensionsOnwards)));
if (startOfExtensions === -1) {
if (rctl2EntirelyOptional) {
numberOfExtensionElements = elements.length - startOfExtensions;
}
else {
throw new Error(`Trailing root component type list for SEQUENCE '${seq.name}' not found.`);
}
}
const startOfRCTL2 = startOfExtensions + numberOfExtensionElements;
const numberOfExtensionsRead = _parse_component_type_list(extensionAdditionsList, decodingCallbacks, elements.slice(startOfExtensions, startOfRCTL2), true);
const endOfRecognizedExtensions = startOfExtensions + numberOfExtensionsRead;
elements
.slice(endOfRecognizedExtensions, startOfRCTL2)
.forEach((x) => unrecognizedExtensionHandler(x));
const numberOfRCTL2ElementsRead = _parse_component_type_list(rootComponentTypeList2, decodingCallbacks, elements.slice(startOfRCTL2), false);
if (startOfRCTL2 + numberOfRCTL2ElementsRead !== elements.length) {
throw new Error(`SEQUENCE '${seq.name}' had excess elements at the end.`);
}
}
exports._parse_sequence_with_trailing_rctl = _parse_sequence_with_trailing_rctl;
function _parse_sequence_without_trailing_rctl(seq, decodingCallbacks, rootComponentTypeList1, extensionAdditionsList, unrecognizedExtensionHandler = () => { }) {
const elements = seq.sequence;
const startOfExtensions = _parse_component_type_list(rootComponentTypeList1, decodingCallbacks, elements, false);
const numberOfExtensionsRead = _parse_component_type_list(extensionAdditionsList, decodingCallbacks, elements.slice(startOfExtensions), true);
const endOfRecognizedExtensions = startOfExtensions + numberOfExtensionsRead;
elements
.slice(endOfRecognizedExtensions)
.forEach((x) => unrecognizedExtensionHandler(x));
}
exports._parse_sequence_without_trailing_rctl = _parse_sequence_without_trailing_rctl;
function _parse_sequence(seq, decodingCallbacks, rootComponentTypeList1, extensionAdditionsList, rootComponentTypeList2, unrecognizedExtensionHandler = () => { }) {
if (rootComponentTypeList2.length > 0) {
_parse_sequence_with_trailing_rctl(seq, decodingCallbacks, rootComponentTypeList1, extensionAdditionsList, rootComponentTypeList2, unrecognizedExtensionHandler);
}
else {
_parse_sequence_without_trailing_rctl(seq, decodingCallbacks, rootComponentTypeList1, extensionAdditionsList, unrecognizedExtensionHandler);
}
}
exports._parse_sequence = _parse_sequence;
function _encode_choice(choices, elGetter) {
return function (value) {
if (value instanceof asn1_ts_1.ASN1Element) {
return value;
}
const key = Object.keys(value)[0];
if (!key) {
throw new Error("Empty choice value object.");
}
const encoder = choices[key];
if (!encoder) {
throw new Error(`Unrecognized alternative '${key}'.`);
}
return encoder(value[key], elGetter);
};
}
exports._encode_choice = _encode_choice;
function _decode_inextensible_choice(choices, anythingElseHandler) {
return function (el) {
const result = choices[`${tagClassName(el.tagClass)} ${el.tagNumber}`];
if (!result) {
if (anythingElseHandler) {
const ret = {};
ret[anythingElseHandler[0]] = anythingElseHandler[1](el);
return ret;
}
else {
throw new Error(`Unrecognized CHOICE tag '${tagClassName(el.tagClass)} ${el.tagNumber}'.`);
}
}
const [name, decoder] = result;
const ret = {};
ret[name] = decoder(el);
return ret;
};
}
exports._decode_inextensible_choice = _decode_inextensible_choice;
function _decode_extensible_choice(choices) {
return function (el) {
const result = choices[`${tagClassName(el.tagClass)} ${el.tagNumber}`];
if (!result) {
return el;
}
const [name, decoder] = result;
const ret = {};
ret[name] = decoder(el);
return ret;
};
}
exports._decode_extensible_choice = _decode_extensible_choice;
function _decodeSequenceOf(decoderGetter) {
return function (el) {
return el.sequence.map(decoderGetter());
};
}
exports._decodeSequenceOf = _decodeSequenceOf;
function _encodeSequenceOf(encoderGetter, outerElGetter) {
return function (value) {
const el = outerElGetter(value, outerElGetter);
el.sequence = value.map((v) => encoderGetter()(v, encoderGetter()));
el.tagClass = asn1_ts_1.ASN1TagClass.universal;
el.tagNumber = asn1_ts_1.ASN1UniversalType.sequence;
return el;
};
}
exports._encodeSequenceOf = _encodeSequenceOf;
function _decodeSetOf(decoderGetter) {
return function (el) {
return el.set.map(decoderGetter());
};
}
exports._decodeSetOf = _decodeSetOf;
function _encodeSetOf(encoderGetter, outerElGetter) {
return function (value) {
const el = outerElGetter(value, outerElGetter);
el.set = value.map((v) => encoderGetter()(v, encoderGetter()));
el.tagClass = asn1_ts_1.ASN1TagClass.universal;
el.tagNumber = asn1_ts_1.ASN1UniversalType.set;
return el;
};
}
exports._encodeSetOf = _encodeSetOf;
exports._encodeBigInt = (value, elGetter) => {
const el = elGetter(value, elGetter);
el.octetString = value;
el.tagClass = asn1_ts_1.ASN1TagClass.universal;
el.tagNumber = asn1_ts_1.ASN1UniversalType.integer;
return el;
};
exports._decodeBigInt = (el) => {
return el.octetString;
};
//# sourceMappingURL=__utils.js.map