ya-express-ntlm
Version:
158 lines • 6.28 kB
JavaScript
;
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