#!/bin/sh
_=[[
: ${LUA:=$(command -v lua-5.2)}
: ${LUA:=$(command -v lua5.2)}
: ${LUA:=$(command -v lua-52)}
: ${LUA:=$(command -v lua52)}
: ${LUA:=$(command -v luajit)}
: ${LUA:=$(command -v lua)}
exec ${LUA} "$0" "$@"
]]
local des = require"openssl.des"
local cipher = require"openssl.cipher"
local bit32 = require"bit32"
local function lm_encrypt(key)
return cipher.new"DES-ECB":encrypt(key, nil, false):final"KGS!@#$%"
end -- lm_encrypt
local lshift = bit32.lshift
local band = bit32.band
local rshift = bit32.rshift
local bor = bit32.bor
local function lm_string_to_key(s)
local s0, s1, s2, s3, s4, s5, s6 = string.byte(s, 1, 7)
local k0, k1, k2, k3, k4, k5, k6, k7
s0 = s0 or 0
s1 = s1 or 0
s2 = s2 or 0
s3 = s3 or 0
s4 = s4 or 0
s5 = s5 or 0
s6 = s6 or 0
k0 = s0
k1 = bor(band(lshift(s0, 7), 255), rshift(s1, 1))
k2 = bor(band(lshift(s1, 6), 255), rshift(s2, 2))
k3 = bor(band(lshift(s2, 5), 255), rshift(s3, 3))
k4 = bor(band(lshift(s3, 4), 255), rshift(s4, 4))
k5 = bor(band(lshift(s4, 3), 255), rshift(s5, 5))
k6 = bor(band(lshift(s5, 2), 255), rshift(s6, 6))
k7 = band(lshift(s6, 1), 255)
return des.set_odd_parity(string.char(k0, k1, k2, k3, k4, k5, k6, k7))
end -- lm_string_to_key
local function lm_hash(pass)
pass = string.upper(pass)
if #pass < 14 then
pass = pass .. string.rep(string.char(0), 14 - #pass)
end
local key1 = lm_string_to_key(string.sub(pass, 1, 7))
local key2 = lm_string_to_key(string.sub(pass, 8, 14))
return lm_encrypt(key1) .. lm_encrypt(key2)
end -- lm_hash
local function tohex(s)
return (string.gsub(s, ".", function (c)
return string.format("%.2x", string.byte(c))
end))
end -- tohex
local pass = ... or "passphrase"
print(pass, tohex(lm_hash(pass)))