var crypto = require('crypto') // See http://graphics.stanford.edu/~seander/bithacks.html#ReverseByteWith32Bits function reverseByteBits(b) { return (((b * 0x0802 & 0x22110) | (b * 0x8020 & 0x88440)) * 0x10101 >> 16 & 0xFF) } function reverseBufferByteBits(b) { var result = new Buffer(b.length) for (var i = 0; i < result.length; ++i) { result[i] = reverseByteBits(b[i]) } return result } function normalizePassword(password) { var key = new Buffer(8).fill(0) // Make sure the key is always 8 bytes long. VNC passwords cannot be // longer than 8 bytes. Shorter passwords are padded with zeroes. reverseBufferByteBits(password).copy(key, 0, 0, 8) return key } function encrypt(challenge, password) { var key = normalizePassword(password) var iv = new Buffer(0).fill(0) // Note: do not call .final(), .update() is the one that gives us the // desired result. return crypto.createCipheriv('des-ecb', key, iv).update(challenge) } module.exports.encrypt = encrypt function verify(response, challenge, password) { return encrypt(challenge, password).equals(response) } module.exports.verify = verify