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

Note: Factory default password is '12345'. Changing it is highly recommended !

conversation goes as follows

← *#*1##
→ *99*0##
← *#603356072##
at which point a password should be sent back, calculated from the "password open" that is set in the gateway, and the nonce that was just sent

→ *#25280520##
← *#*1##
 
program OpenWebNet_password;
 
{$APPTYPE CONSOLE}
 
uses
  System.SysUtils;
 
function ownCalcPass(password, nonce: string): Cardinal;
begin
  var start := True;
  var num1 := 0;
  var num2 := num1;
  var i := password.ToInteger();
  var pwd := i;
 
  for var c in nonce do
  begin
    if c <> '0' then
    begin
      if start then
        num2 := pwd;
      start := False;
    end;
 
    case c of
      '1':
        begin
          num1 := (num2 and $FFFFFF80) shr 7;
          num2 := num2 shl 25;
        end;
      '2':
        begin
          num1 := (num2 and $FFFFFFF0) shr 4;
          num2 := num2 shl 28;
        end;
      '3':
        begin
          num1 := (num2 and $FFFFFFF8) shr 3;
          num2 := num2 shl 29;
        end;
      '4':
        begin
          num1 := num2 shl 1;
          num2 := num2 shr 31;
        end;
      '5':
        begin
          num1 := num2 shl 5;
          num2 := num2 shr 27;
        end;
      '6':
        begin
          num1 := num2 shl 12;
          num2 := num2 shr 20;
        end;
      '7':
        begin
          var num3 := num2 and $0000FF00;
          var num4 := ((num2 and $000000FF) shl 24) or ((num2 and $00FF0000) shr 16);
          num1 := num3 or num4;
          num2 := (num2 and $FF000000) shr 8;
        end;
      '8':
        begin
          ;
          num1 := (num2 and $0000FFFF) shl 16 or (num2 shr 24);
          num2 := (num2 and $00FF0000) shr 8;
        end;
      '9':
        begin
          num1 := not num2;
        end;
    else
      num1 := num2;
    end;
 
    num1 := num1 and $FFFFFFFF;
    num2 := num2 and $FFFFFFFF;
    if (c <> '0') and (c <> '9') then
      num1 := num1 or num2;
    num2 := num1;
  end;
  Result := num1;
end;
 
function TestPasswordCalc(Password, nonce: string; expected: Cardinal): Integer;
begin
  var res := ownCalcPass(Password, nonce);
  var m := format('%s  %s  %-10u  %-10u', [Password, nonce, res, expected]);
  if res = expected then
    writeln('PASS ' + m)
  else
    writeln('FAIL ' + m);
end;
 
begin
  testPasswordCalc('12345', '603356072', 25280520);
  testPasswordCalc('12345', '410501656', 119537670);
  testPasswordCalc('12345', '630292165', 4269684735);
  readln;
end.