UNPKG

ya-express-ntlm

Version:
158 lines 6.28 kB
"use strict"; var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) { if (k2 === undefined) k2 = k; var desc = Object.getOwnPropertyDescriptor(m, k); if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) { desc = { enumerable: true, get: function() { return m[k]; } }; } Object.defineProperty(o, k2, desc); }) : (function(o, m, k, k2) { if (k2 === undefined) k2 = k; o[k2] = m[k]; })); var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) { Object.defineProperty(o, "default", { enumerable: true, value: v }); }) : function(o, v) { o["default"] = v; }); var __importStar = (this && this.__importStar) || function (mod) { if (mod && mod.__esModule) return mod; var result = {}; if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k); __setModuleDefault(result, mod); return result; }; var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); exports.parseOctStr2 = exports.parseSEQ = exports.parseENUM2 = exports.parseINT2 = exports.parseINT = exports.parseTLV2 = exports.parseTLV = exports.parseLen = exports.makeOctStr = exports.makeSEQ = exports.makeINT = exports.makeTLV = void 0; const assert_1 = __importDefault(require("assert")); const buffer_1 = require("buffer"); const utils = __importStar(require("./utils")); const makeTLV = (derType, payload) => { if (typeof payload === 'string') { payload = buffer_1.Buffer.from(payload); } let tlv; let offset; if (payload.length < 128) { tlv = buffer_1.Buffer.alloc(1 + 1 + payload.length); tlv.writeUInt8(derType, 0); tlv.writeUInt8(payload.length, 1); offset = 2; } else if (payload.length < 256) { tlv = buffer_1.Buffer.alloc(1 + 2 + payload.length); tlv.writeUInt8(derType, 0); tlv.writeUInt8(utils.toBinary('10000001'), 1); // Number of length bytes = 1 tlv.writeUInt8(payload.length, 2); offset = 3; } else { tlv = buffer_1.Buffer.alloc(1 + 3 + payload.length); tlv.writeUInt8(derType, 0); tlv.writeUInt8(utils.toBinary('10000010'), 1); // Number of length bytes = 2 tlv.writeUInt16BE(payload.length, 2); offset = 4; } for (let i = 0; i < payload.length; i++) { tlv.writeUInt8(payload.readUInt8(i), offset++); } return tlv; }; exports.makeTLV = makeTLV; const makeINT = (num, tag) => { if (!tag) { tag = 0x02; } let payload; if (num <= 0) { payload = buffer_1.Buffer.from('\0'); } else { payload = buffer_1.Buffer.alloc(0); while (num > 0) { const buf = buffer_1.Buffer.alloc(1); buf.writeUInt8(num & 255, 0); // @ts-ignore payload = buf + payload; num >>>= 8; } } return (0, exports.makeTLV)(tag, payload); }; exports.makeINT = makeINT; const makeSEQ = (payload) => (0, exports.makeTLV)(0x30, payload); exports.makeSEQ = makeSEQ; const makeOctStr = (payload) => (0, exports.makeTLV)(0x04, payload); exports.makeOctStr = makeOctStr; const parseLen = (berObj) => { let length = berObj.readUInt8(1); if (length < 128) { return [length, 2]; } const nLength = length & utils.toBinary('01111111'); length = 0; for (let i = 2; i < 2 + nLength; i++) { length = length * 256 + berObj.readUInt8(i); } return [length, 2 + nLength]; }; exports.parseLen = parseLen; const parseTLV = (derType, derObj) => { if (derObj.readUInt8(0) !== derType) { throw new Error(`BER element ${derObj.toString('hex')} does not start type 0x${derType.toString(16)}`); } const lengths = (0, exports.parseLen)(derObj); const length = lengths[0]; const pStart = lengths[1]; if (derObj.length !== length + pStart) { throw new Error(`BER payload ${derObj.toString('hex')} is not ${length} bytes long (type 0x${derType.toString(16)}).`); } return derObj.subarray(pStart); }; exports.parseTLV = parseTLV; const parseTLV2 = (derType, derObj) => { if (derObj.readUInt8(0) !== derType) { throw new Error(`BER element ${derObj.toString('hex')} does not start type 0x${derType.toString(16)}`); } const lengths = (0, exports.parseLen)(derObj); const length = lengths[0]; const pStart = lengths[1]; if (derObj.length < length + pStart) { throw new Error(`BER payload ${derObj.toString('hex')} is shorter than expected (${length} bytes, type 0x${derType.toString(16)}).`); } return [derObj.subarray(pStart, pStart + length), derObj.subarray(pStart + length)]; }; exports.parseTLV2 = parseTLV2; const parseINT = (payload, tag = 0x02) => { const res = (0, exports.parseTLV)(tag, payload); let value = 0; assert_1.default.equal(res.readUInt8(0) & utils.toBinary('10000000'), 0x00); for (let i = 0; i < res.length; i++) { value = value * 256 + res.readUInt8(i); } return value; }; exports.parseINT = parseINT; const parseINT2 = (payload, tag = 0x02) => { const [res0, res1] = (0, exports.parseTLV2)(tag, payload); let value = 0; assert_1.default.equal(res0.readUInt8(0) & utils.toBinary('10000000'), 0x00); for (let i = 0; i < res0.length; i++) { value = value * 256 + res0.readUInt8(i); } return [value, res1]; }; exports.parseINT2 = parseINT2; // export const parseENUM = (payload: Buffer): number => parseINT(payload, 0x0A); const parseENUM2 = (payload) => (0, exports.parseINT2)(payload, 0x0A); exports.parseENUM2 = parseENUM2; const parseSEQ = (payload) => (0, exports.parseTLV)(0x30, payload); exports.parseSEQ = parseSEQ; // export const parseSEQ2 = (payload: Buffer): [Buffer, Buffer] => parseTLV2(0x30, payload); // export const parseOctStr = (payload: Buffer): Buffer => parseTLV(0x04, payload); const parseOctStr2 = (payload) => (0, exports.parseTLV2)(0x04, payload); exports.parseOctStr2 = parseOctStr2; //# sourceMappingURL=ASN1.js.map