var crypto = require('crypto'); | |
var $ = require('./common'); | |
/* | |
* Generate the LM Hash | |
*/ | |
function lmhashbuf(inputstr) | |
{ | |
/* ASCII --> uppercase */ | |
var x = inputstr.substring(0, 14).toUpperCase(); | |
var xl = Buffer.byteLength(x, 'ascii'); | |
/* null pad to 14 bytes */ | |
var y = new Buffer(14); | |
y.write(x, 0, xl, 'ascii'); | |
y.fill(0, xl); | |
/* insert odd parity bits in key */ | |
var halves = [ | |
$.oddpar($.expandkey(y.slice(0, 7))), | |
$.oddpar($.expandkey(y.slice(7, 14))) | |
]; | |
/* DES encrypt magic number "KGS!@#$%" to two | |
* 8-byte ciphertexts, (ECB, no padding) | |
*/ | |
var buf = new Buffer(16); | |
var pos = 0; | |
var cts = halves.forEach(function(z) { | |
var des = crypto.createCipheriv('DES-ECB', z, ''); | |
var str = des.update('KGS!@#$%', 'binary', 'binary'); | |
buf.write(str, pos, pos + 8, 'binary'); | |
pos += 8; | |
}); | |
/* concat the two ciphertexts to form 16byte value, | |
* the LM hash */ | |
return buf; | |
} | |
function nthashbuf(str) | |
{ | |
/* take MD4 hash of UCS-2 encoded password */ | |
var ucs2 = new Buffer(str, 'ucs2'); | |
var md4 = crypto.createHash('md4'); | |
md4.update(ucs2); | |
return new Buffer(md4.digest('binary'), 'binary'); | |
} | |
function lmhash(is) | |
{ | |
return $.bintohex(lmhashbuf(is)); | |
} | |
function nthash(is) | |
{ | |
return $.bintohex(nthashbuf(is)); | |
} | |
module.exports.nthashbuf = nthashbuf; | |
module.exports.lmhashbuf = lmhashbuf; | |
module.exports.nthash = nthash; | |
module.exports.lmhash = lmhash; |