1 line
26 KiB
JSON
1 line
26 KiB
JSON
{"ast":null,"code":"'use strict';\n\nconst inherits = require('inherits');\n\nconst Buffer = require('safer-buffer').Buffer;\n\nconst Node = require('../base/node'); // Import DER constants\n\n\nconst der = require('../constants/der');\n\nfunction DEREncoder(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 = DEREncoder;\n\nDEREncoder.prototype.encode = function encode(data, reporter) {\n return this.tree._encode(data, reporter).join();\n}; // Tree methods\n\n\nfunction DERNode(parent) {\n Node.call(this, 'der', parent);\n}\n\ninherits(DERNode, Node);\n\nDERNode.prototype._encodeComposite = function encodeComposite(tag, primitive, cls, content) {\n const encodedTag = encodeTag(tag, primitive, cls, this.reporter); // Short form\n\n if (content.length < 0x80) {\n const header = Buffer.alloc(2);\n header[0] = encodedTag;\n header[1] = content.length;\n return this._createEncoderBuffer([header, content]);\n } // Long form\n // Count octets required to store length\n\n\n let lenOctets = 1;\n\n for (let i = content.length; i >= 0x100; i >>= 8) lenOctets++;\n\n const header = Buffer.alloc(1 + 1 + lenOctets);\n header[0] = encodedTag;\n header[1] = 0x80 | lenOctets;\n\n for (let i = 1 + lenOctets, j = content.length; j > 0; i--, j >>= 8) header[i] = j & 0xff;\n\n return this._createEncoderBuffer([header, content]);\n};\n\nDERNode.prototype._encodeStr = function encodeStr(str, tag) {\n if (tag === 'bitstr') {\n return this._createEncoderBuffer([str.unused | 0, str.data]);\n } else if (tag === 'bmpstr') {\n const buf = Buffer.alloc(str.length * 2);\n\n for (let i = 0; i < str.length; i++) {\n buf.writeUInt16BE(str.charCodeAt(i), i * 2);\n }\n\n return this._createEncoderBuffer(buf);\n } else if (tag === 'numstr') {\n if (!this._isNumstr(str)) {\n return this.reporter.error('Encoding of string type: numstr supports ' + 'only digits and space');\n }\n\n return this._createEncoderBuffer(str);\n } else if (tag === 'printstr') {\n if (!this._isPrintstr(str)) {\n return this.reporter.error('Encoding of string type: printstr supports ' + 'only latin upper and lower case letters, ' + 'digits, space, apostrophe, left and rigth ' + 'parenthesis, plus sign, comma, hyphen, ' + 'dot, slash, colon, equal sign, ' + 'question mark');\n }\n\n return this._createEncoderBuffer(str);\n } else if (/str$/.test(tag)) {\n return this._createEncoderBuffer(str);\n } else if (tag === 'objDesc') {\n return this._createEncoderBuffer(str);\n } else {\n return this.reporter.error('Encoding of string type: ' + tag + ' unsupported');\n }\n};\n\nDERNode.prototype._encodeObjid = function encodeObjid(id, values, relative) {\n if (typeof id === 'string') {\n if (!values) return this.reporter.error('string objid given, but no values map found');\n if (!values.hasOwnProperty(id)) return this.reporter.error('objid not found in values map');\n id = values[id].split(/[\\s.]+/g);\n\n for (let i = 0; i < id.length; i++) id[i] |= 0;\n } else if (Array.isArray(id)) {\n id = id.slice();\n\n for (let i = 0; i < id.length; i++) id[i] |= 0;\n }\n\n if (!Array.isArray(id)) {\n return this.reporter.error('objid() should be either array or string, ' + 'got: ' + JSON.stringify(id));\n }\n\n if (!relative) {\n if (id[1] >= 40) return this.reporter.error('Second objid identifier OOB');\n id.splice(0, 2, id[0] * 40 + id[1]);\n } // Count number of octets\n\n\n let size = 0;\n\n for (let i = 0; i < id.length; i++) {\n let ident = id[i];\n\n for (size++; ident >= 0x80; ident >>= 7) size++;\n }\n\n const objid = Buffer.alloc(size);\n let offset = objid.length - 1;\n\n for (let i = id.length - 1; i >= 0; i--) {\n let ident = id[i];\n objid[offset--] = ident & 0x7f;\n\n while ((ident >>= 7) > 0) objid[offset--] = 0x80 | ident & 0x7f;\n }\n\n return this._createEncoderBuffer(objid);\n};\n\nfunction two(num) {\n if (num < 10) return '0' + num;else return num;\n}\n\nDERNode.prototype._encodeTime = function encodeTime(time, tag) {\n let str;\n const date = new Date(time);\n\n if (tag === 'gentime') {\n str = [two(date.getUTCFullYear()), two(date.getUTCMonth() + 1), two(date.getUTCDate()), two(date.getUTCHours()), two(date.getUTCMinutes()), two(date.getUTCSeconds()), 'Z'].join('');\n } else if (tag === 'utctime') {\n str = [two(date.getUTCFullYear() % 100), two(date.getUTCMonth() + 1), two(date.getUTCDate()), two(date.getUTCHours()), two(date.getUTCMinutes()), two(date.getUTCSeconds()), 'Z'].join('');\n } else {\n this.reporter.error('Encoding ' + tag + ' time is not supported yet');\n }\n\n return this._encodeStr(str, 'octstr');\n};\n\nDERNode.prototype._encodeNull = function encodeNull() {\n return this._createEncoderBuffer('');\n};\n\nDERNode.prototype._encodeInt = function encodeInt(num, values) {\n if (typeof num === 'string') {\n if (!values) return this.reporter.error('String int or enum given, but no values map');\n\n if (!values.hasOwnProperty(num)) {\n return this.reporter.error('Values map doesn\\'t contain: ' + JSON.stringify(num));\n }\n\n num = values[num];\n } // Bignum, assume big endian\n\n\n if (typeof num !== 'number' && !Buffer.isBuffer(num)) {\n const numArray = num.toArray();\n\n if (!num.sign && numArray[0] & 0x80) {\n numArray.unshift(0);\n }\n\n num = Buffer.from(numArray);\n }\n\n if (Buffer.isBuffer(num)) {\n let size = num.length;\n if (num.length === 0) size++;\n const out = Buffer.alloc(size);\n num.copy(out);\n if (num.length === 0) out[0] = 0;\n return this._createEncoderBuffer(out);\n }\n\n if (num < 0x80) return this._createEncoderBuffer(num);\n if (num < 0x100) return this._createEncoderBuffer([0, num]);\n let size = 1;\n\n for (let i = num; i >= 0x100; i >>= 8) size++;\n\n const out = new Array(size);\n\n for (let i = out.length - 1; i >= 0; i--) {\n out[i] = num & 0xff;\n num >>= 8;\n }\n\n if (out[0] & 0x80) {\n out.unshift(0);\n }\n\n return this._createEncoderBuffer(Buffer.from(out));\n};\n\nDERNode.prototype._encodeBool = function encodeBool(value) {\n return this._createEncoderBuffer(value ? 0xff : 0);\n};\n\nDERNode.prototype._use = function use(entity, obj) {\n if (typeof entity === 'function') entity = entity(obj);\n return entity._getEncoder('der').tree;\n};\n\nDERNode.prototype._skipDefault = function skipDefault(dataBuffer, reporter, parent) {\n const state = this._baseState;\n let i;\n if (state['default'] === null) return false;\n const data = dataBuffer.join();\n if (state.defaultBuffer === undefined) state.defaultBuffer = this._encodeValue(state['default'], reporter, parent).join();\n if (data.length !== state.defaultBuffer.length) return false;\n\n for (i = 0; i < data.length; i++) if (data[i] !== state.defaultBuffer[i]) return false;\n\n return true;\n}; // Utility methods\n\n\nfunction encodeTag(tag, primitive, cls, reporter) {\n let res;\n if (tag === 'seqof') tag = 'seq';else if (tag === 'setof') tag = 'set';\n if (der.tagByName.hasOwnProperty(tag)) res = der.tagByName[tag];else if (typeof tag === 'number' && (tag | 0) === tag) res = tag;else return reporter.error('Unknown tag: ' + tag);\n if (res >= 0x1f) return reporter.error('Multi-octet tag encoding unsupported');\n if (!primitive) res |= 0x20;\n res |= der.tagClassByName[cls || 'universal'] << 6;\n return res;\n}","map":{"version":3,"sources":["/Users/tylerkoenig/Code/personal/react-scss2/node_modules/asn1.js/lib/asn1/encoders/der.js"],"names":["inherits","require","Buffer","Node","der","DEREncoder","entity","enc","name","tree","DERNode","_init","body","module","exports","prototype","encode","data","reporter","_encode","join","parent","call","_encodeComposite","encodeComposite","tag","primitive","cls","content","encodedTag","encodeTag","length","header","alloc","_createEncoderBuffer","lenOctets","i","j","_encodeStr","encodeStr","str","unused","buf","writeUInt16BE","charCodeAt","_isNumstr","error","_isPrintstr","test","_encodeObjid","encodeObjid","id","values","relative","hasOwnProperty","split","Array","isArray","slice","JSON","stringify","splice","size","ident","objid","offset","two","num","_encodeTime","encodeTime","time","date","Date","getUTCFullYear","getUTCMonth","getUTCDate","getUTCHours","getUTCMinutes","getUTCSeconds","_encodeNull","encodeNull","_encodeInt","encodeInt","isBuffer","numArray","toArray","sign","unshift","from","out","copy","_encodeBool","encodeBool","value","_use","use","obj","_getEncoder","_skipDefault","skipDefault","dataBuffer","state","_baseState","defaultBuffer","undefined","_encodeValue","res","tagByName","tagClassByName"],"mappings":"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","sourcesContent":["'use strict';\n\nconst inherits = require('inherits');\nconst Buffer = require('safer-buffer').Buffer;\nconst Node = require('../base/node');\n\n// Import DER constants\nconst der = require('../constants/der');\n\nfunction DEREncoder(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 = DEREncoder;\n\nDEREncoder.prototype.encode = function encode(data, reporter) {\n return this.tree._encode(data, reporter).join();\n};\n\n// Tree methods\n\nfunction DERNode(parent) {\n Node.call(this, 'der', parent);\n}\ninherits(DERNode, Node);\n\nDERNode.prototype._encodeComposite = function encodeComposite(tag,\n primitive,\n cls,\n content) {\n const encodedTag = encodeTag(tag, primitive, cls, this.reporter);\n\n // Short form\n if (content.length < 0x80) {\n const header = Buffer.alloc(2);\n header[0] = encodedTag;\n header[1] = content.length;\n return this._createEncoderBuffer([ header, content ]);\n }\n\n // Long form\n // Count octets required to store length\n let lenOctets = 1;\n for (let i = content.length; i >= 0x100; i >>= 8)\n lenOctets++;\n\n const header = Buffer.alloc(1 + 1 + lenOctets);\n header[0] = encodedTag;\n header[1] = 0x80 | lenOctets;\n\n for (let i = 1 + lenOctets, j = content.length; j > 0; i--, j >>= 8)\n header[i] = j & 0xff;\n\n return this._createEncoderBuffer([ header, content ]);\n};\n\nDERNode.prototype._encodeStr = function encodeStr(str, tag) {\n if (tag === 'bitstr') {\n return this._createEncoderBuffer([ str.unused | 0, str.data ]);\n } else if (tag === 'bmpstr') {\n const buf = Buffer.alloc(str.length * 2);\n for (let i = 0; i < str.length; i++) {\n buf.writeUInt16BE(str.charCodeAt(i), i * 2);\n }\n return this._createEncoderBuffer(buf);\n } else if (tag === 'numstr') {\n if (!this._isNumstr(str)) {\n return this.reporter.error('Encoding of string type: numstr supports ' +\n 'only digits and space');\n }\n return this._createEncoderBuffer(str);\n } else if (tag === 'printstr') {\n if (!this._isPrintstr(str)) {\n return this.reporter.error('Encoding of string type: printstr supports ' +\n 'only latin upper and lower case letters, ' +\n 'digits, space, apostrophe, left and rigth ' +\n 'parenthesis, plus sign, comma, hyphen, ' +\n 'dot, slash, colon, equal sign, ' +\n 'question mark');\n }\n return this._createEncoderBuffer(str);\n } else if (/str$/.test(tag)) {\n return this._createEncoderBuffer(str);\n } else if (tag === 'objDesc') {\n return this._createEncoderBuffer(str);\n } else {\n return this.reporter.error('Encoding of string type: ' + tag +\n ' unsupported');\n }\n};\n\nDERNode.prototype._encodeObjid = function encodeObjid(id, values, relative) {\n if (typeof id === 'string') {\n if (!values)\n return this.reporter.error('string objid given, but no values map found');\n if (!values.hasOwnProperty(id))\n return this.reporter.error('objid not found in values map');\n id = values[id].split(/[\\s.]+/g);\n for (let i = 0; i < id.length; i++)\n id[i] |= 0;\n } else if (Array.isArray(id)) {\n id = id.slice();\n for (let i = 0; i < id.length; i++)\n id[i] |= 0;\n }\n\n if (!Array.isArray(id)) {\n return this.reporter.error('objid() should be either array or string, ' +\n 'got: ' + JSON.stringify(id));\n }\n\n if (!relative) {\n if (id[1] >= 40)\n return this.reporter.error('Second objid identifier OOB');\n id.splice(0, 2, id[0] * 40 + id[1]);\n }\n\n // Count number of octets\n let size = 0;\n for (let i = 0; i < id.length; i++) {\n let ident = id[i];\n for (size++; ident >= 0x80; ident >>= 7)\n size++;\n }\n\n const objid = Buffer.alloc(size);\n let offset = objid.length - 1;\n for (let i = id.length - 1; i >= 0; i--) {\n let ident = id[i];\n objid[offset--] = ident & 0x7f;\n while ((ident >>= 7) > 0)\n objid[offset--] = 0x80 | (ident & 0x7f);\n }\n\n return this._createEncoderBuffer(objid);\n};\n\nfunction two(num) {\n if (num < 10)\n return '0' + num;\n else\n return num;\n}\n\nDERNode.prototype._encodeTime = function encodeTime(time, tag) {\n let str;\n const date = new Date(time);\n\n if (tag === 'gentime') {\n str = [\n two(date.getUTCFullYear()),\n two(date.getUTCMonth() + 1),\n two(date.getUTCDate()),\n two(date.getUTCHours()),\n two(date.getUTCMinutes()),\n two(date.getUTCSeconds()),\n 'Z'\n ].join('');\n } else if (tag === 'utctime') {\n str = [\n two(date.getUTCFullYear() % 100),\n two(date.getUTCMonth() + 1),\n two(date.getUTCDate()),\n two(date.getUTCHours()),\n two(date.getUTCMinutes()),\n two(date.getUTCSeconds()),\n 'Z'\n ].join('');\n } else {\n this.reporter.error('Encoding ' + tag + ' time is not supported yet');\n }\n\n return this._encodeStr(str, 'octstr');\n};\n\nDERNode.prototype._encodeNull = function encodeNull() {\n return this._createEncoderBuffer('');\n};\n\nDERNode.prototype._encodeInt = function encodeInt(num, values) {\n if (typeof num === 'string') {\n if (!values)\n return this.reporter.error('String int or enum given, but no values map');\n if (!values.hasOwnProperty(num)) {\n return this.reporter.error('Values map doesn\\'t contain: ' +\n JSON.stringify(num));\n }\n num = values[num];\n }\n\n // Bignum, assume big endian\n if (typeof num !== 'number' && !Buffer.isBuffer(num)) {\n const numArray = num.toArray();\n if (!num.sign && numArray[0] & 0x80) {\n numArray.unshift(0);\n }\n num = Buffer.from(numArray);\n }\n\n if (Buffer.isBuffer(num)) {\n let size = num.length;\n if (num.length === 0)\n size++;\n\n const out = Buffer.alloc(size);\n num.copy(out);\n if (num.length === 0)\n out[0] = 0;\n return this._createEncoderBuffer(out);\n }\n\n if (num < 0x80)\n return this._createEncoderBuffer(num);\n\n if (num < 0x100)\n return this._createEncoderBuffer([0, num]);\n\n let size = 1;\n for (let i = num; i >= 0x100; i >>= 8)\n size++;\n\n const out = new Array(size);\n for (let i = out.length - 1; i >= 0; i--) {\n out[i] = num & 0xff;\n num >>= 8;\n }\n if(out[0] & 0x80) {\n out.unshift(0);\n }\n\n return this._createEncoderBuffer(Buffer.from(out));\n};\n\nDERNode.prototype._encodeBool = function encodeBool(value) {\n return this._createEncoderBuffer(value ? 0xff : 0);\n};\n\nDERNode.prototype._use = function use(entity, obj) {\n if (typeof entity === 'function')\n entity = entity(obj);\n return entity._getEncoder('der').tree;\n};\n\nDERNode.prototype._skipDefault = function skipDefault(dataBuffer, reporter, parent) {\n const state = this._baseState;\n let i;\n if (state['default'] === null)\n return false;\n\n const data = dataBuffer.join();\n if (state.defaultBuffer === undefined)\n state.defaultBuffer = this._encodeValue(state['default'], reporter, parent).join();\n\n if (data.length !== state.defaultBuffer.length)\n return false;\n\n for (i=0; i < data.length; i++)\n if (data[i] !== state.defaultBuffer[i])\n return false;\n\n return true;\n};\n\n// Utility methods\n\nfunction encodeTag(tag, primitive, cls, reporter) {\n let res;\n\n if (tag === 'seqof')\n tag = 'seq';\n else if (tag === 'setof')\n tag = 'set';\n\n if (der.tagByName.hasOwnProperty(tag))\n res = der.tagByName[tag];\n else if (typeof tag === 'number' && (tag | 0) === tag)\n res = tag;\n else\n return reporter.error('Unknown tag: ' + tag);\n\n if (res >= 0x1f)\n return reporter.error('Multi-octet tag encoding unsupported');\n\n if (!primitive)\n res |= 0x20;\n\n res |= (der.tagClassByName[cls || 'universal'] << 6);\n\n return res;\n}\n"]},"metadata":{},"sourceType":"script"} |