1 line
55 KiB
JSON
1 line
55 KiB
JSON
{"ast":null,"code":"'use strict';\n\nconst Reporter = require('../base/reporter').Reporter;\n\nconst EncoderBuffer = require('../base/buffer').EncoderBuffer;\n\nconst DecoderBuffer = require('../base/buffer').DecoderBuffer;\n\nconst assert = require('minimalistic-assert'); // Supported tags\n\n\nconst tags = ['seq', 'seqof', 'set', 'setof', 'objid', 'bool', 'gentime', 'utctime', 'null_', 'enum', 'int', 'objDesc', 'bitstr', 'bmpstr', 'charstr', 'genstr', 'graphstr', 'ia5str', 'iso646str', 'numstr', 'octstr', 'printstr', 't61str', 'unistr', 'utf8str', 'videostr']; // Public methods list\n\nconst methods = ['key', 'obj', 'use', 'optional', 'explicit', 'implicit', 'def', 'choice', 'any', 'contains'].concat(tags); // Overrided methods list\n\nconst overrided = ['_peekTag', '_decodeTag', '_use', '_decodeStr', '_decodeObjid', '_decodeTime', '_decodeNull', '_decodeInt', '_decodeBool', '_decodeList', '_encodeComposite', '_encodeStr', '_encodeObjid', '_encodeTime', '_encodeNull', '_encodeInt', '_encodeBool'];\n\nfunction Node(enc, parent, name) {\n const state = {};\n this._baseState = state;\n state.name = name;\n state.enc = enc;\n state.parent = parent || null;\n state.children = null; // State\n\n state.tag = null;\n state.args = null;\n state.reverseArgs = null;\n state.choice = null;\n state.optional = false;\n state.any = false;\n state.obj = false;\n state.use = null;\n state.useDecoder = null;\n state.key = null;\n state['default'] = null;\n state.explicit = null;\n state.implicit = null;\n state.contains = null; // Should create new instance on each method\n\n if (!state.parent) {\n state.children = [];\n\n this._wrap();\n }\n}\n\nmodule.exports = Node;\nconst stateProps = ['enc', 'parent', 'children', 'tag', 'args', 'reverseArgs', 'choice', 'optional', 'any', 'obj', 'use', 'alteredUse', 'key', 'default', 'explicit', 'implicit', 'contains'];\n\nNode.prototype.clone = function clone() {\n const state = this._baseState;\n const cstate = {};\n stateProps.forEach(function (prop) {\n cstate[prop] = state[prop];\n });\n const res = new this.constructor(cstate.parent);\n res._baseState = cstate;\n return res;\n};\n\nNode.prototype._wrap = function wrap() {\n const state = this._baseState;\n methods.forEach(function (method) {\n this[method] = function _wrappedMethod() {\n const clone = new this.constructor(this);\n state.children.push(clone);\n return clone[method].apply(clone, arguments);\n };\n }, this);\n};\n\nNode.prototype._init = function init(body) {\n const state = this._baseState;\n assert(state.parent === null);\n body.call(this); // Filter children\n\n state.children = state.children.filter(function (child) {\n return child._baseState.parent === this;\n }, this);\n assert.equal(state.children.length, 1, 'Root node can have only one child');\n};\n\nNode.prototype._useArgs = function useArgs(args) {\n const state = this._baseState; // Filter children and args\n\n const children = args.filter(function (arg) {\n return arg instanceof this.constructor;\n }, this);\n args = args.filter(function (arg) {\n return !(arg instanceof this.constructor);\n }, this);\n\n if (children.length !== 0) {\n assert(state.children === null);\n state.children = children; // Replace parent to maintain backward link\n\n children.forEach(function (child) {\n child._baseState.parent = this;\n }, this);\n }\n\n if (args.length !== 0) {\n assert(state.args === null);\n state.args = args;\n state.reverseArgs = args.map(function (arg) {\n if (typeof arg !== 'object' || arg.constructor !== Object) return arg;\n const res = {};\n Object.keys(arg).forEach(function (key) {\n if (key == (key | 0)) key |= 0;\n const value = arg[key];\n res[value] = key;\n });\n return res;\n });\n }\n}; //\n// Overrided methods\n//\n\n\noverrided.forEach(function (method) {\n Node.prototype[method] = function _overrided() {\n const state = this._baseState;\n throw new Error(method + ' not implemented for encoding: ' + state.enc);\n };\n}); //\n// Public methods\n//\n\ntags.forEach(function (tag) {\n Node.prototype[tag] = function _tagMethod() {\n const state = this._baseState;\n const args = Array.prototype.slice.call(arguments);\n assert(state.tag === null);\n state.tag = tag;\n\n this._useArgs(args);\n\n return this;\n };\n});\n\nNode.prototype.use = function use(item) {\n assert(item);\n const state = this._baseState;\n assert(state.use === null);\n state.use = item;\n return this;\n};\n\nNode.prototype.optional = function optional() {\n const state = this._baseState;\n state.optional = true;\n return this;\n};\n\nNode.prototype.def = function def(val) {\n const state = this._baseState;\n assert(state['default'] === null);\n state['default'] = val;\n state.optional = true;\n return this;\n};\n\nNode.prototype.explicit = function explicit(num) {\n const state = this._baseState;\n assert(state.explicit === null && state.implicit === null);\n state.explicit = num;\n return this;\n};\n\nNode.prototype.implicit = function implicit(num) {\n const state = this._baseState;\n assert(state.explicit === null && state.implicit === null);\n state.implicit = num;\n return this;\n};\n\nNode.prototype.obj = function obj() {\n const state = this._baseState;\n const args = Array.prototype.slice.call(arguments);\n state.obj = true;\n if (args.length !== 0) this._useArgs(args);\n return this;\n};\n\nNode.prototype.key = function key(newKey) {\n const state = this._baseState;\n assert(state.key === null);\n state.key = newKey;\n return this;\n};\n\nNode.prototype.any = function any() {\n const state = this._baseState;\n state.any = true;\n return this;\n};\n\nNode.prototype.choice = function choice(obj) {\n const state = this._baseState;\n assert(state.choice === null);\n state.choice = obj;\n\n this._useArgs(Object.keys(obj).map(function (key) {\n return obj[key];\n }));\n\n return this;\n};\n\nNode.prototype.contains = function contains(item) {\n const state = this._baseState;\n assert(state.use === null);\n state.contains = item;\n return this;\n}; //\n// Decoding\n//\n\n\nNode.prototype._decode = function decode(input, options) {\n const state = this._baseState; // Decode root node\n\n if (state.parent === null) return input.wrapResult(state.children[0]._decode(input, options));\n let result = state['default'];\n let present = true;\n let prevKey = null;\n if (state.key !== null) prevKey = input.enterKey(state.key); // Check if tag is there\n\n if (state.optional) {\n let tag = null;\n if (state.explicit !== null) tag = state.explicit;else if (state.implicit !== null) tag = state.implicit;else if (state.tag !== null) tag = state.tag;\n\n if (tag === null && !state.any) {\n // Trial and Error\n const save = input.save();\n\n try {\n if (state.choice === null) this._decodeGeneric(state.tag, input, options);else this._decodeChoice(input, options);\n present = true;\n } catch (e) {\n present = false;\n }\n\n input.restore(save);\n } else {\n present = this._peekTag(input, tag, state.any);\n if (input.isError(present)) return present;\n }\n } // Push object on stack\n\n\n let prevObj;\n if (state.obj && present) prevObj = input.enterObject();\n\n if (present) {\n // Unwrap explicit values\n if (state.explicit !== null) {\n const explicit = this._decodeTag(input, state.explicit);\n\n if (input.isError(explicit)) return explicit;\n input = explicit;\n }\n\n const start = input.offset; // Unwrap implicit and normal values\n\n if (state.use === null && state.choice === null) {\n let save;\n if (state.any) save = input.save();\n\n const body = this._decodeTag(input, state.implicit !== null ? state.implicit : state.tag, state.any);\n\n if (input.isError(body)) return body;\n if (state.any) result = input.raw(save);else input = body;\n }\n\n if (options && options.track && state.tag !== null) options.track(input.path(), start, input.length, 'tagged');\n if (options && options.track && state.tag !== null) options.track(input.path(), input.offset, input.length, 'content'); // Select proper method for tag\n\n if (state.any) {// no-op\n } else if (state.choice === null) {\n result = this._decodeGeneric(state.tag, input, options);\n } else {\n result = this._decodeChoice(input, options);\n }\n\n if (input.isError(result)) return result; // Decode children\n\n if (!state.any && state.choice === null && state.children !== null) {\n state.children.forEach(function decodeChildren(child) {\n // NOTE: We are ignoring errors here, to let parser continue with other\n // parts of encoded data\n child._decode(input, options);\n });\n } // Decode contained/encoded by schema, only in bit or octet strings\n\n\n if (state.contains && (state.tag === 'octstr' || state.tag === 'bitstr')) {\n const data = new DecoderBuffer(result);\n result = this._getUse(state.contains, input._reporterState.obj)._decode(data, options);\n }\n } // Pop object\n\n\n if (state.obj && present) result = input.leaveObject(prevObj); // Set key\n\n if (state.key !== null && (result !== null || present === true)) input.leaveKey(prevKey, state.key, result);else if (prevKey !== null) input.exitKey(prevKey);\n return result;\n};\n\nNode.prototype._decodeGeneric = function decodeGeneric(tag, input, options) {\n const state = this._baseState;\n if (tag === 'seq' || tag === 'set') return null;\n if (tag === 'seqof' || tag === 'setof') return this._decodeList(input, tag, state.args[0], options);else if (/str$/.test(tag)) return this._decodeStr(input, tag, options);else if (tag === 'objid' && state.args) return this._decodeObjid(input, state.args[0], state.args[1], options);else if (tag === 'objid') return this._decodeObjid(input, null, null, options);else if (tag === 'gentime' || tag === 'utctime') return this._decodeTime(input, tag, options);else if (tag === 'null_') return this._decodeNull(input, options);else if (tag === 'bool') return this._decodeBool(input, options);else if (tag === 'objDesc') return this._decodeStr(input, tag, options);else if (tag === 'int' || tag === 'enum') return this._decodeInt(input, state.args && state.args[0], options);\n\n if (state.use !== null) {\n return this._getUse(state.use, input._reporterState.obj)._decode(input, options);\n } else {\n return input.error('unknown tag: ' + tag);\n }\n};\n\nNode.prototype._getUse = function _getUse(entity, obj) {\n const state = this._baseState; // Create altered use decoder if implicit is set\n\n state.useDecoder = this._use(entity, obj);\n assert(state.useDecoder._baseState.parent === null);\n state.useDecoder = state.useDecoder._baseState.children[0];\n\n if (state.implicit !== state.useDecoder._baseState.implicit) {\n state.useDecoder = state.useDecoder.clone();\n state.useDecoder._baseState.implicit = state.implicit;\n }\n\n return state.useDecoder;\n};\n\nNode.prototype._decodeChoice = function decodeChoice(input, options) {\n const state = this._baseState;\n let result = null;\n let match = false;\n Object.keys(state.choice).some(function (key) {\n const save = input.save();\n const node = state.choice[key];\n\n try {\n const value = node._decode(input, options);\n\n if (input.isError(value)) return false;\n result = {\n type: key,\n value: value\n };\n match = true;\n } catch (e) {\n input.restore(save);\n return false;\n }\n\n return true;\n }, this);\n if (!match) return input.error('Choice not matched');\n return result;\n}; //\n// Encoding\n//\n\n\nNode.prototype._createEncoderBuffer = function createEncoderBuffer(data) {\n return new EncoderBuffer(data, this.reporter);\n};\n\nNode.prototype._encode = function encode(data, reporter, parent) {\n const state = this._baseState;\n if (state['default'] !== null && state['default'] === data) return;\n\n const result = this._encodeValue(data, reporter, parent);\n\n if (result === undefined) return;\n if (this._skipDefault(result, reporter, parent)) return;\n return result;\n};\n\nNode.prototype._encodeValue = function encode(data, reporter, parent) {\n const state = this._baseState; // Decode root node\n\n if (state.parent === null) return state.children[0]._encode(data, reporter || new Reporter());\n let result = null; // Set reporter to share it with a child class\n\n this.reporter = reporter; // Check if data is there\n\n if (state.optional && data === undefined) {\n if (state['default'] !== null) data = state['default'];else return;\n } // Encode children first\n\n\n let content = null;\n let primitive = false;\n\n if (state.any) {\n // Anything that was given is translated to buffer\n result = this._createEncoderBuffer(data);\n } else if (state.choice) {\n result = this._encodeChoice(data, reporter);\n } else if (state.contains) {\n content = this._getUse(state.contains, parent)._encode(data, reporter);\n primitive = true;\n } else if (state.children) {\n content = state.children.map(function (child) {\n if (child._baseState.tag === 'null_') return child._encode(null, reporter, data);\n if (child._baseState.key === null) return reporter.error('Child should have a key');\n const prevKey = reporter.enterKey(child._baseState.key);\n if (typeof data !== 'object') return reporter.error('Child expected, but input is not object');\n\n const res = child._encode(data[child._baseState.key], reporter, data);\n\n reporter.leaveKey(prevKey);\n return res;\n }, this).filter(function (child) {\n return child;\n });\n content = this._createEncoderBuffer(content);\n } else {\n if (state.tag === 'seqof' || state.tag === 'setof') {\n // TODO(indutny): this should be thrown on DSL level\n if (!(state.args && state.args.length === 1)) return reporter.error('Too many args for : ' + state.tag);\n if (!Array.isArray(data)) return reporter.error('seqof/setof, but data is not Array');\n const child = this.clone();\n child._baseState.implicit = null;\n content = this._createEncoderBuffer(data.map(function (item) {\n const state = this._baseState;\n return this._getUse(state.args[0], data)._encode(item, reporter);\n }, child));\n } else if (state.use !== null) {\n result = this._getUse(state.use, parent)._encode(data, reporter);\n } else {\n content = this._encodePrimitive(state.tag, data);\n primitive = true;\n }\n } // Encode data itself\n\n\n if (!state.any && state.choice === null) {\n const tag = state.implicit !== null ? state.implicit : state.tag;\n const cls = state.implicit === null ? 'universal' : 'context';\n\n if (tag === null) {\n if (state.use === null) reporter.error('Tag could be omitted only for .use()');\n } else {\n if (state.use === null) result = this._encodeComposite(tag, primitive, cls, content);\n }\n } // Wrap in explicit\n\n\n if (state.explicit !== null) result = this._encodeComposite(state.explicit, false, 'context', result);\n return result;\n};\n\nNode.prototype._encodeChoice = function encodeChoice(data, reporter) {\n const state = this._baseState;\n const node = state.choice[data.type];\n\n if (!node) {\n assert(false, data.type + ' not found in ' + JSON.stringify(Object.keys(state.choice)));\n }\n\n return node._encode(data.value, reporter);\n};\n\nNode.prototype._encodePrimitive = function encodePrimitive(tag, data) {\n const state = this._baseState;\n if (/str$/.test(tag)) return this._encodeStr(data, tag);else if (tag === 'objid' && state.args) return this._encodeObjid(data, state.reverseArgs[0], state.args[1]);else if (tag === 'objid') return this._encodeObjid(data, null, null);else if (tag === 'gentime' || tag === 'utctime') return this._encodeTime(data, tag);else if (tag === 'null_') return this._encodeNull();else if (tag === 'int' || tag === 'enum') return this._encodeInt(data, state.args && state.reverseArgs[0]);else if (tag === 'bool') return this._encodeBool(data);else if (tag === 'objDesc') return this._encodeStr(data, tag);else throw new Error('Unsupported tag: ' + tag);\n};\n\nNode.prototype._isNumstr = function isNumstr(str) {\n return /^[0-9 ]*$/.test(str);\n};\n\nNode.prototype._isPrintstr = function isPrintstr(str) {\n return /^[A-Za-z0-9 '()+,-./:=?]*$/.test(str);\n};","map":{"version":3,"sources":["/Users/tylerkoenig/Code/personal/react-scss2/node_modules/asn1.js/lib/asn1/base/node.js"],"names":["Reporter","require","EncoderBuffer","DecoderBuffer","assert","tags","methods","concat","overrided","Node","enc","parent","name","state","_baseState","children","tag","args","reverseArgs","choice","optional","any","obj","use","useDecoder","key","explicit","implicit","contains","_wrap","module","exports","stateProps","prototype","clone","cstate","forEach","prop","res","constructor","wrap","method","_wrappedMethod","push","apply","arguments","_init","init","body","call","filter","child","equal","length","_useArgs","useArgs","arg","map","Object","keys","value","_overrided","Error","_tagMethod","Array","slice","item","def","val","num","newKey","_decode","decode","input","options","wrapResult","result","present","prevKey","enterKey","save","_decodeGeneric","_decodeChoice","e","restore","_peekTag","isError","prevObj","enterObject","_decodeTag","start","offset","raw","track","path","decodeChildren","data","_getUse","_reporterState","leaveObject","leaveKey","exitKey","decodeGeneric","_decodeList","test","_decodeStr","_decodeObjid","_decodeTime","_decodeNull","_decodeBool","_decodeInt","error","entity","_use","decodeChoice","match","some","node","type","_createEncoderBuffer","createEncoderBuffer","reporter","_encode","encode","_encodeValue","undefined","_skipDefault","content","primitive","_encodeChoice","isArray","_encodePrimitive","cls","_encodeComposite","encodeChoice","JSON","stringify","encodePrimitive","_encodeStr","_encodeObjid","_encodeTime","_encodeNull","_encodeInt","_encodeBool","_isNumstr","isNumstr","str","_isPrintstr","isPrintstr"],"mappings":"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","sourcesContent":["'use strict';\n\nconst Reporter = require('../base/reporter').Reporter;\nconst EncoderBuffer = require('../base/buffer').EncoderBuffer;\nconst DecoderBuffer = require('../base/buffer').DecoderBuffer;\nconst assert = require('minimalistic-assert');\n\n// Supported tags\nconst tags = [\n 'seq', 'seqof', 'set', 'setof', 'objid', 'bool',\n 'gentime', 'utctime', 'null_', 'enum', 'int', 'objDesc',\n 'bitstr', 'bmpstr', 'charstr', 'genstr', 'graphstr', 'ia5str', 'iso646str',\n 'numstr', 'octstr', 'printstr', 't61str', 'unistr', 'utf8str', 'videostr'\n];\n\n// Public methods list\nconst methods = [\n 'key', 'obj', 'use', 'optional', 'explicit', 'implicit', 'def', 'choice',\n 'any', 'contains'\n].concat(tags);\n\n// Overrided methods list\nconst overrided = [\n '_peekTag', '_decodeTag', '_use',\n '_decodeStr', '_decodeObjid', '_decodeTime',\n '_decodeNull', '_decodeInt', '_decodeBool', '_decodeList',\n\n '_encodeComposite', '_encodeStr', '_encodeObjid', '_encodeTime',\n '_encodeNull', '_encodeInt', '_encodeBool'\n];\n\nfunction Node(enc, parent, name) {\n const state = {};\n this._baseState = state;\n\n state.name = name;\n state.enc = enc;\n\n state.parent = parent || null;\n state.children = null;\n\n // State\n state.tag = null;\n state.args = null;\n state.reverseArgs = null;\n state.choice = null;\n state.optional = false;\n state.any = false;\n state.obj = false;\n state.use = null;\n state.useDecoder = null;\n state.key = null;\n state['default'] = null;\n state.explicit = null;\n state.implicit = null;\n state.contains = null;\n\n // Should create new instance on each method\n if (!state.parent) {\n state.children = [];\n this._wrap();\n }\n}\nmodule.exports = Node;\n\nconst stateProps = [\n 'enc', 'parent', 'children', 'tag', 'args', 'reverseArgs', 'choice',\n 'optional', 'any', 'obj', 'use', 'alteredUse', 'key', 'default', 'explicit',\n 'implicit', 'contains'\n];\n\nNode.prototype.clone = function clone() {\n const state = this._baseState;\n const cstate = {};\n stateProps.forEach(function(prop) {\n cstate[prop] = state[prop];\n });\n const res = new this.constructor(cstate.parent);\n res._baseState = cstate;\n return res;\n};\n\nNode.prototype._wrap = function wrap() {\n const state = this._baseState;\n methods.forEach(function(method) {\n this[method] = function _wrappedMethod() {\n const clone = new this.constructor(this);\n state.children.push(clone);\n return clone[method].apply(clone, arguments);\n };\n }, this);\n};\n\nNode.prototype._init = function init(body) {\n const state = this._baseState;\n\n assert(state.parent === null);\n body.call(this);\n\n // Filter children\n state.children = state.children.filter(function(child) {\n return child._baseState.parent === this;\n }, this);\n assert.equal(state.children.length, 1, 'Root node can have only one child');\n};\n\nNode.prototype._useArgs = function useArgs(args) {\n const state = this._baseState;\n\n // Filter children and args\n const children = args.filter(function(arg) {\n return arg instanceof this.constructor;\n }, this);\n args = args.filter(function(arg) {\n return !(arg instanceof this.constructor);\n }, this);\n\n if (children.length !== 0) {\n assert(state.children === null);\n state.children = children;\n\n // Replace parent to maintain backward link\n children.forEach(function(child) {\n child._baseState.parent = this;\n }, this);\n }\n if (args.length !== 0) {\n assert(state.args === null);\n state.args = args;\n state.reverseArgs = args.map(function(arg) {\n if (typeof arg !== 'object' || arg.constructor !== Object)\n return arg;\n\n const res = {};\n Object.keys(arg).forEach(function(key) {\n if (key == (key | 0))\n key |= 0;\n const value = arg[key];\n res[value] = key;\n });\n return res;\n });\n }\n};\n\n//\n// Overrided methods\n//\n\noverrided.forEach(function(method) {\n Node.prototype[method] = function _overrided() {\n const state = this._baseState;\n throw new Error(method + ' not implemented for encoding: ' + state.enc);\n };\n});\n\n//\n// Public methods\n//\n\ntags.forEach(function(tag) {\n Node.prototype[tag] = function _tagMethod() {\n const state = this._baseState;\n const args = Array.prototype.slice.call(arguments);\n\n assert(state.tag === null);\n state.tag = tag;\n\n this._useArgs(args);\n\n return this;\n };\n});\n\nNode.prototype.use = function use(item) {\n assert(item);\n const state = this._baseState;\n\n assert(state.use === null);\n state.use = item;\n\n return this;\n};\n\nNode.prototype.optional = function optional() {\n const state = this._baseState;\n\n state.optional = true;\n\n return this;\n};\n\nNode.prototype.def = function def(val) {\n const state = this._baseState;\n\n assert(state['default'] === null);\n state['default'] = val;\n state.optional = true;\n\n return this;\n};\n\nNode.prototype.explicit = function explicit(num) {\n const state = this._baseState;\n\n assert(state.explicit === null && state.implicit === null);\n state.explicit = num;\n\n return this;\n};\n\nNode.prototype.implicit = function implicit(num) {\n const state = this._baseState;\n\n assert(state.explicit === null && state.implicit === null);\n state.implicit = num;\n\n return this;\n};\n\nNode.prototype.obj = function obj() {\n const state = this._baseState;\n const args = Array.prototype.slice.call(arguments);\n\n state.obj = true;\n\n if (args.length !== 0)\n this._useArgs(args);\n\n return this;\n};\n\nNode.prototype.key = function key(newKey) {\n const state = this._baseState;\n\n assert(state.key === null);\n state.key = newKey;\n\n return this;\n};\n\nNode.prototype.any = function any() {\n const state = this._baseState;\n\n state.any = true;\n\n return this;\n};\n\nNode.prototype.choice = function choice(obj) {\n const state = this._baseState;\n\n assert(state.choice === null);\n state.choice = obj;\n this._useArgs(Object.keys(obj).map(function(key) {\n return obj[key];\n }));\n\n return this;\n};\n\nNode.prototype.contains = function contains(item) {\n const state = this._baseState;\n\n assert(state.use === null);\n state.contains = item;\n\n return this;\n};\n\n//\n// Decoding\n//\n\nNode.prototype._decode = function decode(input, options) {\n const state = this._baseState;\n\n // Decode root node\n if (state.parent === null)\n return input.wrapResult(state.children[0]._decode(input, options));\n\n let result = state['default'];\n let present = true;\n\n let prevKey = null;\n if (state.key !== null)\n prevKey = input.enterKey(state.key);\n\n // Check if tag is there\n if (state.optional) {\n let tag = null;\n if (state.explicit !== null)\n tag = state.explicit;\n else if (state.implicit !== null)\n tag = state.implicit;\n else if (state.tag !== null)\n tag = state.tag;\n\n if (tag === null && !state.any) {\n // Trial and Error\n const save = input.save();\n try {\n if (state.choice === null)\n this._decodeGeneric(state.tag, input, options);\n else\n this._decodeChoice(input, options);\n present = true;\n } catch (e) {\n present = false;\n }\n input.restore(save);\n } else {\n present = this._peekTag(input, tag, state.any);\n\n if (input.isError(present))\n return present;\n }\n }\n\n // Push object on stack\n let prevObj;\n if (state.obj && present)\n prevObj = input.enterObject();\n\n if (present) {\n // Unwrap explicit values\n if (state.explicit !== null) {\n const explicit = this._decodeTag(input, state.explicit);\n if (input.isError(explicit))\n return explicit;\n input = explicit;\n }\n\n const start = input.offset;\n\n // Unwrap implicit and normal values\n if (state.use === null && state.choice === null) {\n let save;\n if (state.any)\n save = input.save();\n const body = this._decodeTag(\n input,\n state.implicit !== null ? state.implicit : state.tag,\n state.any\n );\n if (input.isError(body))\n return body;\n\n if (state.any)\n result = input.raw(save);\n else\n input = body;\n }\n\n if (options && options.track && state.tag !== null)\n options.track(input.path(), start, input.length, 'tagged');\n\n if (options && options.track && state.tag !== null)\n options.track(input.path(), input.offset, input.length, 'content');\n\n // Select proper method for tag\n if (state.any) {\n // no-op\n } else if (state.choice === null) {\n result = this._decodeGeneric(state.tag, input, options);\n } else {\n result = this._decodeChoice(input, options);\n }\n\n if (input.isError(result))\n return result;\n\n // Decode children\n if (!state.any && state.choice === null && state.children !== null) {\n state.children.forEach(function decodeChildren(child) {\n // NOTE: We are ignoring errors here, to let parser continue with other\n // parts of encoded data\n child._decode(input, options);\n });\n }\n\n // Decode contained/encoded by schema, only in bit or octet strings\n if (state.contains && (state.tag === 'octstr' || state.tag === 'bitstr')) {\n const data = new DecoderBuffer(result);\n result = this._getUse(state.contains, input._reporterState.obj)\n ._decode(data, options);\n }\n }\n\n // Pop object\n if (state.obj && present)\n result = input.leaveObject(prevObj);\n\n // Set key\n if (state.key !== null && (result !== null || present === true))\n input.leaveKey(prevKey, state.key, result);\n else if (prevKey !== null)\n input.exitKey(prevKey);\n\n return result;\n};\n\nNode.prototype._decodeGeneric = function decodeGeneric(tag, input, options) {\n const state = this._baseState;\n\n if (tag === 'seq' || tag === 'set')\n return null;\n if (tag === 'seqof' || tag === 'setof')\n return this._decodeList(input, tag, state.args[0], options);\n else if (/str$/.test(tag))\n return this._decodeStr(input, tag, options);\n else if (tag === 'objid' && state.args)\n return this._decodeObjid(input, state.args[0], state.args[1], options);\n else if (tag === 'objid')\n return this._decodeObjid(input, null, null, options);\n else if (tag === 'gentime' || tag === 'utctime')\n return this._decodeTime(input, tag, options);\n else if (tag === 'null_')\n return this._decodeNull(input, options);\n else if (tag === 'bool')\n return this._decodeBool(input, options);\n else if (tag === 'objDesc')\n return this._decodeStr(input, tag, options);\n else if (tag === 'int' || tag === 'enum')\n return this._decodeInt(input, state.args && state.args[0], options);\n\n if (state.use !== null) {\n return this._getUse(state.use, input._reporterState.obj)\n ._decode(input, options);\n } else {\n return input.error('unknown tag: ' + tag);\n }\n};\n\nNode.prototype._getUse = function _getUse(entity, obj) {\n\n const state = this._baseState;\n // Create altered use decoder if implicit is set\n state.useDecoder = this._use(entity, obj);\n assert(state.useDecoder._baseState.parent === null);\n state.useDecoder = state.useDecoder._baseState.children[0];\n if (state.implicit !== state.useDecoder._baseState.implicit) {\n state.useDecoder = state.useDecoder.clone();\n state.useDecoder._baseState.implicit = state.implicit;\n }\n return state.useDecoder;\n};\n\nNode.prototype._decodeChoice = function decodeChoice(input, options) {\n const state = this._baseState;\n let result = null;\n let match = false;\n\n Object.keys(state.choice).some(function(key) {\n const save = input.save();\n const node = state.choice[key];\n try {\n const value = node._decode(input, options);\n if (input.isError(value))\n return false;\n\n result = { type: key, value: value };\n match = true;\n } catch (e) {\n input.restore(save);\n return false;\n }\n return true;\n }, this);\n\n if (!match)\n return input.error('Choice not matched');\n\n return result;\n};\n\n//\n// Encoding\n//\n\nNode.prototype._createEncoderBuffer = function createEncoderBuffer(data) {\n return new EncoderBuffer(data, this.reporter);\n};\n\nNode.prototype._encode = function encode(data, reporter, parent) {\n const state = this._baseState;\n if (state['default'] !== null && state['default'] === data)\n return;\n\n const result = this._encodeValue(data, reporter, parent);\n if (result === undefined)\n return;\n\n if (this._skipDefault(result, reporter, parent))\n return;\n\n return result;\n};\n\nNode.prototype._encodeValue = function encode(data, reporter, parent) {\n const state = this._baseState;\n\n // Decode root node\n if (state.parent === null)\n return state.children[0]._encode(data, reporter || new Reporter());\n\n let result = null;\n\n // Set reporter to share it with a child class\n this.reporter = reporter;\n\n // Check if data is there\n if (state.optional && data === undefined) {\n if (state['default'] !== null)\n data = state['default'];\n else\n return;\n }\n\n // Encode children first\n let content = null;\n let primitive = false;\n if (state.any) {\n // Anything that was given is translated to buffer\n result = this._createEncoderBuffer(data);\n } else if (state.choice) {\n result = this._encodeChoice(data, reporter);\n } else if (state.contains) {\n content = this._getUse(state.contains, parent)._encode(data, reporter);\n primitive = true;\n } else if (state.children) {\n content = state.children.map(function(child) {\n if (child._baseState.tag === 'null_')\n return child._encode(null, reporter, data);\n\n if (child._baseState.key === null)\n return reporter.error('Child should have a key');\n const prevKey = reporter.enterKey(child._baseState.key);\n\n if (typeof data !== 'object')\n return reporter.error('Child expected, but input is not object');\n\n const res = child._encode(data[child._baseState.key], reporter, data);\n reporter.leaveKey(prevKey);\n\n return res;\n }, this).filter(function(child) {\n return child;\n });\n content = this._createEncoderBuffer(content);\n } else {\n if (state.tag === 'seqof' || state.tag === 'setof') {\n // TODO(indutny): this should be thrown on DSL level\n if (!(state.args && state.args.length === 1))\n return reporter.error('Too many args for : ' + state.tag);\n\n if (!Array.isArray(data))\n return reporter.error('seqof/setof, but data is not Array');\n\n const child = this.clone();\n child._baseState.implicit = null;\n content = this._createEncoderBuffer(data.map(function(item) {\n const state = this._baseState;\n\n return this._getUse(state.args[0], data)._encode(item, reporter);\n }, child));\n } else if (state.use !== null) {\n result = this._getUse(state.use, parent)._encode(data, reporter);\n } else {\n content = this._encodePrimitive(state.tag, data);\n primitive = true;\n }\n }\n\n // Encode data itself\n if (!state.any && state.choice === null) {\n const tag = state.implicit !== null ? state.implicit : state.tag;\n const cls = state.implicit === null ? 'universal' : 'context';\n\n if (tag === null) {\n if (state.use === null)\n reporter.error('Tag could be omitted only for .use()');\n } else {\n if (state.use === null)\n result = this._encodeComposite(tag, primitive, cls, content);\n }\n }\n\n // Wrap in explicit\n if (state.explicit !== null)\n result = this._encodeComposite(state.explicit, false, 'context', result);\n\n return result;\n};\n\nNode.prototype._encodeChoice = function encodeChoice(data, reporter) {\n const state = this._baseState;\n\n const node = state.choice[data.type];\n if (!node) {\n assert(\n false,\n data.type + ' not found in ' +\n JSON.stringify(Object.keys(state.choice)));\n }\n return node._encode(data.value, reporter);\n};\n\nNode.prototype._encodePrimitive = function encodePrimitive(tag, data) {\n const state = this._baseState;\n\n if (/str$/.test(tag))\n return this._encodeStr(data, tag);\n else if (tag === 'objid' && state.args)\n return this._encodeObjid(data, state.reverseArgs[0], state.args[1]);\n else if (tag === 'objid')\n return this._encodeObjid(data, null, null);\n else if (tag === 'gentime' || tag === 'utctime')\n return this._encodeTime(data, tag);\n else if (tag === 'null_')\n return this._encodeNull();\n else if (tag === 'int' || tag === 'enum')\n return this._encodeInt(data, state.args && state.reverseArgs[0]);\n else if (tag === 'bool')\n return this._encodeBool(data);\n else if (tag === 'objDesc')\n return this._encodeStr(data, tag);\n else\n throw new Error('Unsupported tag: ' + tag);\n};\n\nNode.prototype._isNumstr = function isNumstr(str) {\n return /^[0-9 ]*$/.test(str);\n};\n\nNode.prototype._isPrintstr = function isPrintstr(str) {\n return /^[A-Za-z0-9 '()+,-./:=?]*$/.test(str);\n};\n"]},"metadata":{},"sourceType":"script"} |