49 lines
1.7 KiB
Plaintext
49 lines
1.7 KiB
Plaintext
function calcpass(passwd, nonce::String)
|
|
startflag = true
|
|
n1 = 0
|
|
n2 = 0
|
|
password = parse(Int, passwd)
|
|
dact = Dict(
|
|
'1' => () -> begin n1 = (n2 & 0xffffff80) >> 7; n2 <<= 25 end,
|
|
'2' => () -> begin n1 = (n2 & 0xfffffff0) >> 4; n2 <<= 28 end,
|
|
'3' => () -> begin n1 = (n2 & 0xfffffff8) >> 3; n2 <<= 29 end,
|
|
'4' => () -> begin n1 = n2 << 1; n2 >>= 31 end,
|
|
'5' => () -> begin n1 = n2 << 5; n2 >>= 27 end,
|
|
'6' => () -> begin n1 = n2 << 12; n2 >>= 20 end,
|
|
'7' => () -> begin n1 = (n2 & 0x0000ff00) | ((n2 & 0x000000ff) << 24) |
|
|
((n2 & 0x00ff0000) >> 16); n2 = (n2 & 0xff000000) >> 8 end,
|
|
'8' => () -> begin n1 = ((n2 & 0x0000ffff) << 16) | (n2 >> 24);
|
|
n2 = (n2 & 0x00ff0000) >> 8 end,
|
|
'9' => () -> begin n1 = ~n2 end)
|
|
|
|
for c in nonce
|
|
if !haskey(dact, c)
|
|
n1 = n2
|
|
else
|
|
if startflag
|
|
n2 = password
|
|
end
|
|
startflag = false
|
|
dact[c]()
|
|
n1 &= 0xffffffff
|
|
n2 &= 0xffffffff
|
|
if c != '9'
|
|
n1 |= n2
|
|
end
|
|
end
|
|
n2 = n1
|
|
end
|
|
n1
|
|
end
|
|
|
|
function testcalcpass()
|
|
tdata = [["12345", "603356072", "25280520"], ["12345", "410501656", "119537670"],
|
|
["12345", "630292165", "4269684735"], ["12345", "523781130", "537331200"]]
|
|
for td in tdata
|
|
pf = calcpass(td[1], td[2]) == parse(Int, td[3]) ? "Passes test." : "Fails test."
|
|
println("Calculating pass for [$(td[1]), $(td[2])] = $(td[3]): $pf")
|
|
end
|
|
end
|
|
|
|
testcalcpass()
|