1 line
28 KiB
JSON
1 line
28 KiB
JSON
{"ast":null,"code":"'use strict';\n\nconst inherits = require('inherits');\n\nconst bignum = require('bn.js');\n\nconst DecoderBuffer = require('../base/buffer').DecoderBuffer;\n\nconst Node = require('../base/node'); // Import DER constants\n\n\nconst der = require('../constants/der');\n\nfunction DERDecoder(entity) {\n this.enc = 'der';\n this.name = entity.name;\n this.entity = entity; // Construct base tree\n\n this.tree = new DERNode();\n\n this.tree._init(entity.body);\n}\n\nmodule.exports = DERDecoder;\n\nDERDecoder.prototype.decode = function decode(data, options) {\n if (!DecoderBuffer.isDecoderBuffer(data)) {\n data = new DecoderBuffer(data, options);\n }\n\n return this.tree._decode(data, options);\n}; // Tree methods\n\n\nfunction DERNode(parent) {\n Node.call(this, 'der', parent);\n}\n\ninherits(DERNode, Node);\n\nDERNode.prototype._peekTag = function peekTag(buffer, tag, any) {\n if (buffer.isEmpty()) return false;\n const state = buffer.save();\n const decodedTag = derDecodeTag(buffer, 'Failed to peek tag: \"' + tag + '\"');\n if (buffer.isError(decodedTag)) return decodedTag;\n buffer.restore(state);\n return decodedTag.tag === tag || decodedTag.tagStr === tag || decodedTag.tagStr + 'of' === tag || any;\n};\n\nDERNode.prototype._decodeTag = function decodeTag(buffer, tag, any) {\n const decodedTag = derDecodeTag(buffer, 'Failed to decode tag of \"' + tag + '\"');\n if (buffer.isError(decodedTag)) return decodedTag;\n let len = derDecodeLen(buffer, decodedTag.primitive, 'Failed to get length of \"' + tag + '\"'); // Failure\n\n if (buffer.isError(len)) return len;\n\n if (!any && decodedTag.tag !== tag && decodedTag.tagStr !== tag && decodedTag.tagStr + 'of' !== tag) {\n return buffer.error('Failed to match tag: \"' + tag + '\"');\n }\n\n if (decodedTag.primitive || len !== null) return buffer.skip(len, 'Failed to match body of: \"' + tag + '\"'); // Indefinite length... find END tag\n\n const state = buffer.save();\n\n const res = this._skipUntilEnd(buffer, 'Failed to skip indefinite length body: \"' + this.tag + '\"');\n\n if (buffer.isError(res)) return res;\n len = buffer.offset - state.offset;\n buffer.restore(state);\n return buffer.skip(len, 'Failed to match body of: \"' + tag + '\"');\n};\n\nDERNode.prototype._skipUntilEnd = function skipUntilEnd(buffer, fail) {\n for (;;) {\n const tag = derDecodeTag(buffer, fail);\n if (buffer.isError(tag)) return tag;\n const len = derDecodeLen(buffer, tag.primitive, fail);\n if (buffer.isError(len)) return len;\n let res;\n if (tag.primitive || len !== null) res = buffer.skip(len);else res = this._skipUntilEnd(buffer, fail); // Failure\n\n if (buffer.isError(res)) return res;\n if (tag.tagStr === 'end') break;\n }\n};\n\nDERNode.prototype._decodeList = function decodeList(buffer, tag, decoder, options) {\n const result = [];\n\n while (!buffer.isEmpty()) {\n const possibleEnd = this._peekTag(buffer, 'end');\n\n if (buffer.isError(possibleEnd)) return possibleEnd;\n const res = decoder.decode(buffer, 'der', options);\n if (buffer.isError(res) && possibleEnd) break;\n result.push(res);\n }\n\n return result;\n};\n\nDERNode.prototype._decodeStr = function decodeStr(buffer, tag) {\n if (tag === 'bitstr') {\n const unused = buffer.readUInt8();\n if (buffer.isError(unused)) return unused;\n return {\n unused: unused,\n data: buffer.raw()\n };\n } else if (tag === 'bmpstr') {\n const raw = buffer.raw();\n if (raw.length % 2 === 1) return buffer.error('Decoding of string type: bmpstr length mismatch');\n let str = '';\n\n for (let i = 0; i < raw.length / 2; i++) {\n str += String.fromCharCode(raw.readUInt16BE(i * 2));\n }\n\n return str;\n } else if (tag === 'numstr') {\n const numstr = buffer.raw().toString('ascii');\n\n if (!this._isNumstr(numstr)) {\n return buffer.error('Decoding of string type: ' + 'numstr unsupported characters');\n }\n\n return numstr;\n } else if (tag === 'octstr') {\n return buffer.raw();\n } else if (tag === 'objDesc') {\n return buffer.raw();\n } else if (tag === 'printstr') {\n const printstr = buffer.raw().toString('ascii');\n\n if (!this._isPrintstr(printstr)) {\n return buffer.error('Decoding of string type: ' + 'printstr unsupported characters');\n }\n\n return printstr;\n } else if (/str$/.test(tag)) {\n return buffer.raw().toString();\n } else {\n return buffer.error('Decoding of string type: ' + tag + ' unsupported');\n }\n};\n\nDERNode.prototype._decodeObjid = function decodeObjid(buffer, values, relative) {\n let result;\n const identifiers = [];\n let ident = 0;\n let subident = 0;\n\n while (!buffer.isEmpty()) {\n subident = buffer.readUInt8();\n ident <<= 7;\n ident |= subident & 0x7f;\n\n if ((subident & 0x80) === 0) {\n identifiers.push(ident);\n ident = 0;\n }\n }\n\n if (subident & 0x80) identifiers.push(ident);\n const first = identifiers[0] / 40 | 0;\n const second = identifiers[0] % 40;\n if (relative) result = identifiers;else result = [first, second].concat(identifiers.slice(1));\n\n if (values) {\n let tmp = values[result.join(' ')];\n if (tmp === undefined) tmp = values[result.join('.')];\n if (tmp !== undefined) result = tmp;\n }\n\n return result;\n};\n\nDERNode.prototype._decodeTime = function decodeTime(buffer, tag) {\n const str = buffer.raw().toString();\n let year;\n let mon;\n let day;\n let hour;\n let min;\n let sec;\n\n if (tag === 'gentime') {\n year = str.slice(0, 4) | 0;\n mon = str.slice(4, 6) | 0;\n day = str.slice(6, 8) | 0;\n hour = str.slice(8, 10) | 0;\n min = str.slice(10, 12) | 0;\n sec = str.slice(12, 14) | 0;\n } else if (tag === 'utctime') {\n year = str.slice(0, 2) | 0;\n mon = str.slice(2, 4) | 0;\n day = str.slice(4, 6) | 0;\n hour = str.slice(6, 8) | 0;\n min = str.slice(8, 10) | 0;\n sec = str.slice(10, 12) | 0;\n if (year < 70) year = 2000 + year;else year = 1900 + year;\n } else {\n return buffer.error('Decoding ' + tag + ' time is not supported yet');\n }\n\n return Date.UTC(year, mon - 1, day, hour, min, sec, 0);\n};\n\nDERNode.prototype._decodeNull = function decodeNull() {\n return null;\n};\n\nDERNode.prototype._decodeBool = function decodeBool(buffer) {\n const res = buffer.readUInt8();\n if (buffer.isError(res)) return res;else return res !== 0;\n};\n\nDERNode.prototype._decodeInt = function decodeInt(buffer, values) {\n // Bigint, return as it is (assume big endian)\n const raw = buffer.raw();\n let res = new bignum(raw);\n if (values) res = values[res.toString(10)] || res;\n return res;\n};\n\nDERNode.prototype._use = function use(entity, obj) {\n if (typeof entity === 'function') entity = entity(obj);\n return entity._getDecoder('der').tree;\n}; // Utility methods\n\n\nfunction derDecodeTag(buf, fail) {\n let tag = buf.readUInt8(fail);\n if (buf.isError(tag)) return tag;\n const cls = der.tagClass[tag >> 6];\n const primitive = (tag & 0x20) === 0; // Multi-octet tag - load\n\n if ((tag & 0x1f) === 0x1f) {\n let oct = tag;\n tag = 0;\n\n while ((oct & 0x80) === 0x80) {\n oct = buf.readUInt8(fail);\n if (buf.isError(oct)) return oct;\n tag <<= 7;\n tag |= oct & 0x7f;\n }\n } else {\n tag &= 0x1f;\n }\n\n const tagStr = der.tag[tag];\n return {\n cls: cls,\n primitive: primitive,\n tag: tag,\n tagStr: tagStr\n };\n}\n\nfunction derDecodeLen(buf, primitive, fail) {\n let len = buf.readUInt8(fail);\n if (buf.isError(len)) return len; // Indefinite form\n\n if (!primitive && len === 0x80) return null; // Definite form\n\n if ((len & 0x80) === 0) {\n // Short form\n return len;\n } // Long form\n\n\n const num = len & 0x7f;\n if (num > 4) return buf.error('length octect is too long');\n len = 0;\n\n for (let i = 0; i < num; i++) {\n len <<= 8;\n const j = buf.readUInt8(fail);\n if (buf.isError(j)) return j;\n len |= j;\n }\n\n return len;\n}","map":{"version":3,"sources":["/Users/tylerkoenig/Code/personal/react-scss2/node_modules/asn1.js/lib/asn1/decoders/der.js"],"names":["inherits","require","bignum","DecoderBuffer","Node","der","DERDecoder","entity","enc","name","tree","DERNode","_init","body","module","exports","prototype","decode","data","options","isDecoderBuffer","_decode","parent","call","_peekTag","peekTag","buffer","tag","any","isEmpty","state","save","decodedTag","derDecodeTag","isError","restore","tagStr","_decodeTag","decodeTag","len","derDecodeLen","primitive","error","skip","res","_skipUntilEnd","offset","skipUntilEnd","fail","_decodeList","decodeList","decoder","result","possibleEnd","push","_decodeStr","decodeStr","unused","readUInt8","raw","length","str","i","String","fromCharCode","readUInt16BE","numstr","toString","_isNumstr","printstr","_isPrintstr","test","_decodeObjid","decodeObjid","values","relative","identifiers","ident","subident","first","second","concat","slice","tmp","join","undefined","_decodeTime","decodeTime","year","mon","day","hour","min","sec","Date","UTC","_decodeNull","decodeNull","_decodeBool","decodeBool","_decodeInt","decodeInt","_use","use","obj","_getDecoder","buf","cls","tagClass","oct","num","j"],"mappings":"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","sourcesContent":["'use strict';\n\nconst inherits = require('inherits');\n\nconst bignum = require('bn.js');\nconst DecoderBuffer = require('../base/buffer').DecoderBuffer;\nconst Node = require('../base/node');\n\n// Import DER constants\nconst der = require('../constants/der');\n\nfunction DERDecoder(entity) {\n this.enc = 'der';\n this.name = entity.name;\n this.entity = entity;\n\n // Construct base tree\n this.tree = new DERNode();\n this.tree._init(entity.body);\n}\nmodule.exports = DERDecoder;\n\nDERDecoder.prototype.decode = function decode(data, options) {\n if (!DecoderBuffer.isDecoderBuffer(data)) {\n data = new DecoderBuffer(data, options);\n }\n\n return this.tree._decode(data, options);\n};\n\n// Tree methods\n\nfunction DERNode(parent) {\n Node.call(this, 'der', parent);\n}\ninherits(DERNode, Node);\n\nDERNode.prototype._peekTag = function peekTag(buffer, tag, any) {\n if (buffer.isEmpty())\n return false;\n\n const state = buffer.save();\n const decodedTag = derDecodeTag(buffer, 'Failed to peek tag: \"' + tag + '\"');\n if (buffer.isError(decodedTag))\n return decodedTag;\n\n buffer.restore(state);\n\n return decodedTag.tag === tag || decodedTag.tagStr === tag ||\n (decodedTag.tagStr + 'of') === tag || any;\n};\n\nDERNode.prototype._decodeTag = function decodeTag(buffer, tag, any) {\n const decodedTag = derDecodeTag(buffer,\n 'Failed to decode tag of \"' + tag + '\"');\n if (buffer.isError(decodedTag))\n return decodedTag;\n\n let len = derDecodeLen(buffer,\n decodedTag.primitive,\n 'Failed to get length of \"' + tag + '\"');\n\n // Failure\n if (buffer.isError(len))\n return len;\n\n if (!any &&\n decodedTag.tag !== tag &&\n decodedTag.tagStr !== tag &&\n decodedTag.tagStr + 'of' !== tag) {\n return buffer.error('Failed to match tag: \"' + tag + '\"');\n }\n\n if (decodedTag.primitive || len !== null)\n return buffer.skip(len, 'Failed to match body of: \"' + tag + '\"');\n\n // Indefinite length... find END tag\n const state = buffer.save();\n const res = this._skipUntilEnd(\n buffer,\n 'Failed to skip indefinite length body: \"' + this.tag + '\"');\n if (buffer.isError(res))\n return res;\n\n len = buffer.offset - state.offset;\n buffer.restore(state);\n return buffer.skip(len, 'Failed to match body of: \"' + tag + '\"');\n};\n\nDERNode.prototype._skipUntilEnd = function skipUntilEnd(buffer, fail) {\n for (;;) {\n const tag = derDecodeTag(buffer, fail);\n if (buffer.isError(tag))\n return tag;\n const len = derDecodeLen(buffer, tag.primitive, fail);\n if (buffer.isError(len))\n return len;\n\n let res;\n if (tag.primitive || len !== null)\n res = buffer.skip(len);\n else\n res = this._skipUntilEnd(buffer, fail);\n\n // Failure\n if (buffer.isError(res))\n return res;\n\n if (tag.tagStr === 'end')\n break;\n }\n};\n\nDERNode.prototype._decodeList = function decodeList(buffer, tag, decoder,\n options) {\n const result = [];\n while (!buffer.isEmpty()) {\n const possibleEnd = this._peekTag(buffer, 'end');\n if (buffer.isError(possibleEnd))\n return possibleEnd;\n\n const res = decoder.decode(buffer, 'der', options);\n if (buffer.isError(res) && possibleEnd)\n break;\n result.push(res);\n }\n return result;\n};\n\nDERNode.prototype._decodeStr = function decodeStr(buffer, tag) {\n if (tag === 'bitstr') {\n const unused = buffer.readUInt8();\n if (buffer.isError(unused))\n return unused;\n return { unused: unused, data: buffer.raw() };\n } else if (tag === 'bmpstr') {\n const raw = buffer.raw();\n if (raw.length % 2 === 1)\n return buffer.error('Decoding of string type: bmpstr length mismatch');\n\n let str = '';\n for (let i = 0; i < raw.length / 2; i++) {\n str += String.fromCharCode(raw.readUInt16BE(i * 2));\n }\n return str;\n } else if (tag === 'numstr') {\n const numstr = buffer.raw().toString('ascii');\n if (!this._isNumstr(numstr)) {\n return buffer.error('Decoding of string type: ' +\n 'numstr unsupported characters');\n }\n return numstr;\n } else if (tag === 'octstr') {\n return buffer.raw();\n } else if (tag === 'objDesc') {\n return buffer.raw();\n } else if (tag === 'printstr') {\n const printstr = buffer.raw().toString('ascii');\n if (!this._isPrintstr(printstr)) {\n return buffer.error('Decoding of string type: ' +\n 'printstr unsupported characters');\n }\n return printstr;\n } else if (/str$/.test(tag)) {\n return buffer.raw().toString();\n } else {\n return buffer.error('Decoding of string type: ' + tag + ' unsupported');\n }\n};\n\nDERNode.prototype._decodeObjid = function decodeObjid(buffer, values, relative) {\n let result;\n const identifiers = [];\n let ident = 0;\n let subident = 0;\n while (!buffer.isEmpty()) {\n subident = buffer.readUInt8();\n ident <<= 7;\n ident |= subident & 0x7f;\n if ((subident & 0x80) === 0) {\n identifiers.push(ident);\n ident = 0;\n }\n }\n if (subident & 0x80)\n identifiers.push(ident);\n\n const first = (identifiers[0] / 40) | 0;\n const second = identifiers[0] % 40;\n\n if (relative)\n result = identifiers;\n else\n result = [first, second].concat(identifiers.slice(1));\n\n if (values) {\n let tmp = values[result.join(' ')];\n if (tmp === undefined)\n tmp = values[result.join('.')];\n if (tmp !== undefined)\n result = tmp;\n }\n\n return result;\n};\n\nDERNode.prototype._decodeTime = function decodeTime(buffer, tag) {\n const str = buffer.raw().toString();\n\n let year;\n let mon;\n let day;\n let hour;\n let min;\n let sec;\n if (tag === 'gentime') {\n year = str.slice(0, 4) | 0;\n mon = str.slice(4, 6) | 0;\n day = str.slice(6, 8) | 0;\n hour = str.slice(8, 10) | 0;\n min = str.slice(10, 12) | 0;\n sec = str.slice(12, 14) | 0;\n } else if (tag === 'utctime') {\n year = str.slice(0, 2) | 0;\n mon = str.slice(2, 4) | 0;\n day = str.slice(4, 6) | 0;\n hour = str.slice(6, 8) | 0;\n min = str.slice(8, 10) | 0;\n sec = str.slice(10, 12) | 0;\n if (year < 70)\n year = 2000 + year;\n else\n year = 1900 + year;\n } else {\n return buffer.error('Decoding ' + tag + ' time is not supported yet');\n }\n\n return Date.UTC(year, mon - 1, day, hour, min, sec, 0);\n};\n\nDERNode.prototype._decodeNull = function decodeNull() {\n return null;\n};\n\nDERNode.prototype._decodeBool = function decodeBool(buffer) {\n const res = buffer.readUInt8();\n if (buffer.isError(res))\n return res;\n else\n return res !== 0;\n};\n\nDERNode.prototype._decodeInt = function decodeInt(buffer, values) {\n // Bigint, return as it is (assume big endian)\n const raw = buffer.raw();\n let res = new bignum(raw);\n\n if (values)\n res = values[res.toString(10)] || res;\n\n return res;\n};\n\nDERNode.prototype._use = function use(entity, obj) {\n if (typeof entity === 'function')\n entity = entity(obj);\n return entity._getDecoder('der').tree;\n};\n\n// Utility methods\n\nfunction derDecodeTag(buf, fail) {\n let tag = buf.readUInt8(fail);\n if (buf.isError(tag))\n return tag;\n\n const cls = der.tagClass[tag >> 6];\n const primitive = (tag & 0x20) === 0;\n\n // Multi-octet tag - load\n if ((tag & 0x1f) === 0x1f) {\n let oct = tag;\n tag = 0;\n while ((oct & 0x80) === 0x80) {\n oct = buf.readUInt8(fail);\n if (buf.isError(oct))\n return oct;\n\n tag <<= 7;\n tag |= oct & 0x7f;\n }\n } else {\n tag &= 0x1f;\n }\n const tagStr = der.tag[tag];\n\n return {\n cls: cls,\n primitive: primitive,\n tag: tag,\n tagStr: tagStr\n };\n}\n\nfunction derDecodeLen(buf, primitive, fail) {\n let len = buf.readUInt8(fail);\n if (buf.isError(len))\n return len;\n\n // Indefinite form\n if (!primitive && len === 0x80)\n return null;\n\n // Definite form\n if ((len & 0x80) === 0) {\n // Short form\n return len;\n }\n\n // Long form\n const num = len & 0x7f;\n if (num > 4)\n return buf.error('length octect is too long');\n\n len = 0;\n for (let i = 0; i < num; i++) {\n len <<= 8;\n const j = buf.readUInt8(fail);\n if (buf.isError(j))\n return j;\n len |= j;\n }\n\n return len;\n}\n"]},"metadata":{},"sourceType":"script"} |