mirror of
https://github.com/openstf/stf
synced 2025-10-03 17:59:28 +02:00
44 lines
1.1 KiB
JavaScript
44 lines
1.1 KiB
JavaScript
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
|