OpenWebNet password: Difference between revisions

Line 563:
119537670
4269684735</pre>
 
=={{header|Phix}}==
<lang Phix>function unsigned(atom n)
atom m4 = allocate(8)
poke4(m4,n)
n = peek4u(m4)
free(m4)
return n
end function
 
function ownCalcPass(atom pwd, string nonce)
bool start = true
atom num1 = 0,
num2 = 0
for i=1 to length(nonce) do
integer c = nonce[i]
if c!='0' and start then
num2 = pwd
start = false
end if
switch c do
case '1': num1 = shift_bits(num2,7)
num2 = shift_bits(num2,-25)
case '2': num1 = shift_bits(num2,4)
num2 = shift_bits(num2,-28)
case '3': num1 = shift_bits(num2,3)
num2 = shift_bits(num2,-29)
case '4': num1 = shift_bits(num2,-1)
num2 = shift_bits(num2,31)
case '5': num1 = shift_bits(num2,-5)
num2 = shift_bits(num2,27)
case '6': num1 = shift_bits(num2,-12)
num2 = shift_bits(num2,20)
case '7': num1 = or_bits(and_bits(num2,0x0000FF00),
or_bits(shift_bits(and_bits(num2,0x000000FF),-24),
shift_bits(and_bits(num2,0x00FF0000),16)))
num2 = shift_bits(and_bits(num2,0xFF000000),8)
case '8': num1 = or_bits(shift_bits(and_bits(num2,0x0000FFFF),-16),
shift_bits(num2,24))
num2 = shift_bits(and_bits(num2,0x00FF0000),8)
case '9': num1 = not_bits(num2)
default: num1 = num2
end switch
if c!='0' and c!='9' then
num1 = or_bits(num1,num2)
end if
num2 = num1
end for
return unsigned(num1)
end function
procedure testPasswordCalc(atom pwd, string nonce, atom expected)
atom res := ownCalcPass(pwd, nonce)
string pf = iff(res=expected?"PASS":"FAIL")
printf(1,"%s %d %s %-10d %-10d\n", {pf, pwd, nonce, res, expected})
end procedure
testPasswordCalc(12345, "603356072", 25280520)
testPasswordCalc(12345, "410501656", 119537670)
testPasswordCalc(12345, "630292165", 4269684735)
testPasswordCalc(12345, "523781130", 537331200)</lang>
{{out}}
<pre>
PASS 12345 603356072 25280520 25280520
PASS 12345 410501656 119537670 119537670
PASS 12345 630292165 4269684735 4269684735
PASS 12345 523781130 537331200 537331200
</pre>
 
=={{Header|Python}}==
7,794

edits