node-expose-sspi-strict
Version:
Expose the Microsoft Windows SSPI interface in order to do NTLM and Kerberos authentication.
91 lines (90 loc) • 3.02 kB
JavaScript
;
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
exports.__esModule = true;
exports.getMessageType = exports.toHex = exports.hexDump = void 0;
var debug_1 = __importDefault(require("debug"));
var base64_arraybuffer_1 = require("base64-arraybuffer");
var debug = debug_1["default"]('node-expose-sspi:misc');
function isPrintable(keycode) {
var valid = (keycode > 47 && keycode < 58) || // number keys
keycode === 32 || // spacebar & return key(s) (if you want to allow carriage returns)
(keycode > 64 && keycode < 91) || // letter keys
(keycode > 95 && keycode < 112) || // numpad keys
(keycode > 185 && keycode < 193) || // ;=,-./` (in order)
(keycode > 218 && keycode < 223); // [\]' (in order)
return valid;
}
/**
* Gives a string representation of binary data.
*
* @param {ArrayBuffer} buffer
* @returns {string} the string representation.
*/
function hexDump(buffer) {
var dataView = new DataView(buffer, 0);
debug('buffer length', buffer.byteLength);
var result = '';
var line = '';
for (var i = 0; i < buffer.byteLength; i++) {
if (i % 16 === 0) {
line = '';
var address = '0x' + i.toString(10).padStart(8, '0') + ':';
result += address;
}
var n = dataView.getUint8(i);
result += n.toString(16).padStart(2, '0') + ' ';
var c = '.';
if (isPrintable(n)) {
c = String.fromCharCode(n);
}
line += c;
if (i % 16 === 7) {
result += ' ';
}
if (i === buffer.byteLength - 1) {
var spaces = ' ';
for (var j = 0; j < 15 - (i % 16); j++) {
result += spaces;
}
}
if (i % 16 === 15 || i === buffer.byteLength - 1) {
result += ': ' + line + '\n';
continue;
}
}
return result;
}
exports.hexDump = hexDump;
function toHex(buffer) {
var dataView = new DataView(buffer, 0);
debug('buffer length', buffer.byteLength);
var result = '';
for (var i = 0; i < buffer.byteLength; i++) {
var n = dataView.getUint8(i);
result += n.toString(16).padStart(2, '0');
}
return result;
}
exports.toHex = toHex;
function getMessageType(token) {
var buffer = base64_arraybuffer_1.decode(token);
var str = toHex(buffer);
// manage NTLM
if (str.includes('4e544c4d53535000' + '01')) {
return 'NTLM_NEGOTIATE_01';
}
if (str.includes('4e544c4d53535000' + '02')) {
return 'NTLM_CHALLENGE_02';
}
if (str.includes('4e544c4d53535000' + '03')) {
return 'NTLM_AUTHENTICATE_03';
}
// manage Kerberos:
if (token.startsWith('YII')) {
return 'Kerberos_1';
}
return 'Kerberos_N';
}
exports.getMessageType = getMessageType;