OpenWebNet password: Difference between revisions

improve the python version by quite a margin, add a swift (4.2) version
(improve the python version by quite a margin, add a swift (4.2) version)
Line 1:
{{draft task}}
Calculate the password requested by ethernet gateways from the Legrand / Bticino MyHome OpenWebNet home automation system when the user's ip address is not in the gateway's whitelist
 
Line 363 ⟶ 362:
 
=={{Header|Python}}==
<lang python>#!/usr/bin/env python
def ownCalcPass (password, nonce, test=False) :
# -*- coding: utf-8 -*-
start = True
 
num1 = 0
def ownCalcPass (password, nonce) :
m_1num2 = 0xFFFFFFFFL0
m_8password = 0xFFFFFFF8Lint(password)
m_16if = 0xFFFFFFF0Ltest:
print("password: %08x" % (password))
m_128 = 0xFFFFFF80L
m_16777216 = 0XFF000000L
flag = True
num1 = 0L
num2 = 0L
password = long(password)
 
for c in nonce :
num1if c != num1 & m_1"0":
num2 = num2 & m_1if start:
if c == '1':
length = not flag
if not length :
num2 = password
num1start = num2 & m_128False
if num1 = num1 >> 7test:
print("c: %s num1: %08x num2: %08x" % (c, num1, num2))
if c == '1':
num1 = (num2 & 0xFFFFFF80) >> 7
num2 = num2 << 25
num1 = num1 + num2
flag = False
elif c == '2':
lengthnum1 = not(num2 flag& 0xFFFFFFF0) >> 4
if not length :
num2 = password
num1 = num2 & m_16
num1 = num1 >> 4
num2 = num2 << 28
num1 = num1 + num2
flag = False
elif c == '3':
lengthnum1 = not(num2 flag& 0xFFFFFFF8) >> 3
if not length :
num2 = password
num1 = num2 & m_8
num1 = num1 >> 3
num2 = num2 << 29
num1 = num1 + num2
flag = False
elif c == '4':
length = not flag
 
if not length:
num2 = password
num1 = num2 << 1
num2 = num2 >> 31
num1 = num1 + num2
flag = False
elif c == '5':
length = not flag
if not length:
num2 = password
num1 = num2 << 5
num2 = num2 >> 27
num1 = num1 + num2
flag = False
elif c == '6':
length = not flag
if not length:
num2 = password
num1 = num2 << 12
num2 = num2 >> 20
num1 = num1 + num2
flag = False
elif c == '7':
num1 = num2 & 0x0000FF00 | (( num2 & 0x000000FF ) << 24 ) | (( num2 & 0x00FF0000 ) >> 16 )
length = not flag
ifnum2 not= length:( num2 & 0xFF000000 ) >> 8
num2 = password
num1 = num2 & 0xFF00L
num1 = num1 + (( num2 & 0xFFL ) << 24 )
num1 = num1 + (( num2 & 0xFF0000L ) >> 16 )
num2 = ( num2 & m_16777216 ) >> 8
num1 = num1 + num2
flag = False
elif c == '8':
lengthnum1 = not(num2 flag& 0x0000FFFF) << 16 | ( num2 >> 24 )
ifnum2 not= length:(num2 & 0x00FF0000) >> 8
num2 = password
num1 = num2 & 0xFFFFL
num1 = num1 << 16
num1 = num1 + ( num2 >> 24 )
num2 = num2 & 0xFF0000L
num2 = num2 >> 8
num1 = num1 + num2
flag = False
elif c == '9':
length = not flag
if not length:
num2 = password
num1 = ~num2
flag = False
else :
num1 = num2
 
num1 &= 0xFFFFFFFF
num2 &= 0xFFFFFFFF
if (c not in "09"):
num1 |= num2
if test:
print(" num1: %08x num2: %08x" % (num1, num2))
num2 = num1
return num1 & m_1
 
def ownTestCalcPass test_passwd_calc(passwd, nonce, expected) :
res = ownCalcPass(passwd, nonce, False)
m = passwd+' '+nonce+' '+str(res)+' '+str(expected)
if res == longint(expected) :
print ('PASS '+m)
else :
print ('FAIL '+m)
 
if __name__ == '__main__':
test_passwd_calc('12345','603356072','25280520')
import sys
test_passwd_calc('12345','410501656','119537670')
test_passwd_calc('12345','630292165','4269684735')
 
</lang>
ownTestCalcPass('12345','603356072','25280520')
 
ownTestCalcPass('12345','410501656','119537670')
=={{Header|Swift}}==
<lang swift>
func openAuthenticationResponse(_password: String, operations: String) -> String? {
var num1 = UInt32(0)
var num2 = UInt32(0)
var start = true
let password = UInt32(_password)!
for c in operations {
if (c != "0") {
if start {
num2 = password
}
start = false
}
switch c {
case "1":
num1 = (num2 & 0xffffff80) >> 7
num2 = num2 << 25
case "2":
num1 = (num2 & 0xfffffff0) >> 4
num2 = num2 << 28
case "3":
num1 = (num2 & 0xfffffff8) >> 3
num2 = num2 << 29
case "4":
num1 = num2 << 1
num2 = num2 >> 31
case "5":
num1 = num1 << 5
num2 = num2 >> 27
case "6":
num1 = num2 << 12
num2 = num2 >> 20
case "7":
num1 = (num2 & 0x0000ff00) | ((num2 & 0x000000ff) << 24) | ((num2 & 0x00ff0000) >> 16)
num2 = (num2 & 0xff000000) >> 8
case "8":
num1 = ((num2 & 0x0000ffff) << 16) | (num2 >> 24)
num2 = (num2 & 0x00ff0000) >> 8
case "9":
num1 = ~num2
case "0":
num1 = num2
default:
print("unexpected char \(c)")
return nil
}
if (c != "9") && (c != "0") {
num1 |= num2
}
num2 = num1
}
return String(num1)
}
</lang>
 
Anonymous user