Code:
local http = require('socket.http')
local ltn12 = require('ltn12')
-- CONFIGURAZIONE
local ip = "192.168.0.245"
local user = "admin"
local pass = "TuaPassword" -- <--- Inserisci la tua password
local url = "/ISAPI/System/deviceInfo"
-- FUNZIONE MD5 PURE LUA (Nessuna libreria richiesta)
local function md5_calc(message)
local function str2hex(s) return (s:gsub('.', function(c) return string.format('%02x', string.byte(c)) end)) end
local function word2str(w)
local s = ""
for i = 1, 4 do s = s .. string.char(bit.band(bit.rshift(w, (i - 1) * 8), 0xff)) end
return s
end
-- Logic Machine ha la libreria bit integrata, usiamo quella
return string.md5(message)
end
-- Se string.md5 fallisce di nuovo, usiamo questa scorciatoia che LM usa internamente
function calculate_md5(str)
-- Proviamo il metodo più diretto possibile per LM 2025
local ok, res = pcall(function() return crypto.hash(str, 'md5') end)
if ok then return res end
ok, res = pcall(function() return string.md5(str) end)
if ok then return res end
ok, res = pcall(function() return encodetools.md5(str) end)
if ok then return res end
error("Impossibile trovare una funzione MD5 valida")
end
function get_hikvision_info_digest()
local response_body = {}
-- 1. Prima chiamata per ottenere la sfida
local res, code, headers = http.request("http://" .. ip .. url)
if code == 401 and headers['www-authenticate'] then
local auth_header = headers['www-authenticate']
local realm = auth_header:match('realm="([^"]+)"')
local nonce = auth_header:match('nonce="([^"]+)"')
local qop = auth_header:match('qop="([^"]+)"')
local method = "GET"
local uri = url
local nc = "00000001"
local cnonce = string.format("%08x", os.time())
-- Calcolo Digest
local HA1 = calculate_md5(user .. ":" .. realm .. ":" .. pass)
local HA2 = calculate_md5(method .. ":" .. uri)
local response = calculate_md5(HA1 .. ":" .. nonce .. ":" .. nc .. ":" .. cnonce .. ":" .. qop .. ":" .. HA2)
local digest_header = string.format(
'Digest username="%s", realm="%s", nonce="%s", uri="%s", response="%s", qop=%s, nc=%s, cnonce="%s"',
user, realm, nonce, uri, response, qop, nc, cnonce
)
-- 2. Seconda chiamata
res, code, headers = http.request({
url = "http://" .. ip .. url,
method = "GET",
headers = { ["Authorization"] = digest_header },
sink = ltn12.sink.table(response_body)
})
local response_str = table.concat(response_body)
log("Codice: " .. tostring(code))
if code == 200 then
log("SUCCESSO! Dati dispositivo:")
log(response_str)
else
log("Errore: " .. response_str)
end
else
log("Dispositivo non risponde o non richiede Auth. Codice: " .. tostring(code))
end
end
get_hikvision_info_digest()
.