How to resolve the algorithm OpenWebNet password step by step in the Java programming language

Published on 12 May 2024 09:40 PM

How to resolve the algorithm OpenWebNet password step by step in the Java programming language

Table of Contents

Problem Statement

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 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

Let's start with the solution:

Step by Step solution about How to resolve the algorithm OpenWebNet password step by step in the Java programming language

The provided Java code defines a method ownPasswordCalculation to calculate a value based on a given password and a nonce (a random value). The calculation involves a series of bitwise operations and shifts based on the characters in the nonce. Let's break down the code step by step:

  1. Constants: The code defines several constants:

    • m1: Constant with hexadecimal value 0xFFFF_FFFFL, representing a 32-bit mask with all bits set to 1, used to mask the result to 32 bits.
    • m8: Constant with hexadecimal value 0xFFFF_FFF8L, representing a 32-bit mask with all bits set to 1 except the last 3 bits.
    • m16: Constant with hexadecimal value 0xFFFF_FFF0L, representing a 32-bit mask with all bits set to 1 except the last 4 bits.
    • m128: Constant with hexadecimal value 0xFFFF_FF80L, representing a 32-bit mask with all bits set to 1 except the last 7 bits.
    • m16777216: Constant with hexadecimal value 0xFF00_0000L, representing a 32-bit mask with only the 16 most significant bits set to 1.
  2. Variables: The code initializes several variables:

    • flag: A boolean flag, initially set to true, used to determine when to use the password value.
    • number1 and number2: Long variables used to perform the calculations and store intermediate results.
  3. Nonce Loop: The code enters a loop that iterates through each character in the provided nonce string:

    • For each character, it performs a series of actions based on the character:
      • If the character is '1', it checks the flag variable. If flag is true, it sets number2 to the password value. Then, it sets flag to false and performs some bitwise operations and shifts on number1 and number2.
      • Similar actions are taken for characters '2', '3', '4', '5', '6', '7', '8', and '9', each performing specific bitwise operations and shifts based on the character.
      • For any other characters, it simply sets number1 to number2.
    • After processing the current character, it updates number2 to the value of number1.
  4. Final Calculation: After processing all characters in the nonce, the code returns the value of number1 masked by m1 to ensure it is a 32-bit value.

  5. Main Method: The main method includes some test cases to demonstrate the ownPasswordCalculation method by comparing the calculated result with expected values.

In summary, this code performs a series of complex bitwise operations and shifts on a password and a nonce to calculate a specific value. The exact calculation depends on the characters in the nonce string and follows a specific set of rules. The final result is a 32-bit value that is influenced by the input password and the order of characters in the nonce.

Source code in the java programming language

	public static void main(String[] aArgs) {
		ownPasswordCalculationTest("12345", "603356072", 25280520);
	    ownPasswordCalculationTest("12345", "410501656", 119537670);
	}
	
	private static void ownPasswordCalculationTest(String password, String nonce, long expected) {
	    final long result = ownPasswordCalculation(Long.valueOf(password), nonce);
	    String message = password + "  " + nonce + "  " + result + "  " + expected;
	    System.out.println( ( result == expected ) ? "PASS  " + message : "FAIL  " + message );
	}
	
	private static long ownPasswordCalculation(long password, String nonce) {
	    final long m1        = 0xFFFF_FFFFL;
	    final long m8        = 0xFFFF_FFF8L;
	    final long m16       = 0xFFFF_FFF0L;
	    final long m128      = 0xFFFF_FF80L;
	    final long m16777216 = 0xFF00_0000L;

	    boolean flag = true;
	    long number1 = 0;
	    long number2 = 0;

	    for ( char ch : nonce.toCharArray() ) {
	        number2 = number2 & m1;

	        switch (ch) {
		        case '1' -> {
		            if ( flag ) { number2 = password; }
	                flag = false;
	                number1 = number2 & m128;
	                number1 = number1 >>> 7;
	                number2 = number2 << 25;
	                number1 = number1 + number2;
		        }
	
		        case '2' -> {
		            if ( flag ) { number2 = password; }
	                flag = false;
	                number1 = number2 & m16;
	                number1 = number1 >>> 4;
	                number2 = number2 << 28;
	                number1 = number1 + number2;
	            }
	
		        case '3' -> {
		            if ( flag ) { number2 = password; }
	                flag = false;
	                number1 = number2 & m8;
	                number1 = number1 >>> 3;
	                number2 = number2 << 29;
	                number1 = number1 + number2;
	            }
	
		        case '4' -> {
		        	if ( flag ) { number2 = password; }
	                flag = false;
	                number1 = number2 << 1;
	                number2 = number2 >>> 31;
	                number1 = number1 + number2;
	            }
	
		        case '5' -> {
		            if ( flag ) { number2 = password; }
	                flag = false;
	                number1 = number2 << 5;
	                number2 = number2 >>> 27;
	                number1 = number1 + number2;
	            }
	
		        case '6' -> {
		            if ( flag ) { number2 = password; }
	                flag = false;
	                number1 = number2 << 12;
	                number2 = number2 >>> 20;
	                number1 = number1 + number2;
	            }
	
		        case '7' -> {
		            if ( flag ) { number2 = password; }
	                flag = false;
	                number1 = number2 & 0xFF00L;
	                number1 = number1 + ( ( number2 & 0xFFL ) << 24 );
	                number1 = number1 + ( ( number2 & 0xFF0000L ) >>> 16 );
	                number2 = ( number2 & m16777216 ) >>> 8;
	                number1 = number1 + number2;
	            }
	
		        case '8' -> {
		            if ( flag ) { number2 = password;}
	                flag = false;
	                number1 = number2 & 0xFFFFL;
	                number1 = number1 << 16;
	                number1 = number1 + ( number2 >>> 24 );
	                number2 = number2 & 0xFF0000L;
	                number2 = number2 >>> 8;
	                number1 = number1 + number2;
	            }
	
		        case '9' -> {
		            if ( flag ) { number2 = password; }
	                flag = false;
	                number1 = ~number2;
	            }
		        
		        default -> number1 = number2;
	        }
	        number2 = number1;
	    }
	    
	    return number1 & m1;
	}

}


  

You may also check:How to resolve the algorithm Nested function step by step in the Pascal programming language
You may also check:How to resolve the algorithm Euler's identity step by step in the Julia programming language
You may also check:How to resolve the algorithm Guess the number/With feedback step by step in the Elixir programming language
You may also check:How to resolve the algorithm Multi-dimensional array step by step in the X86-64 Assembly programming language
You may also check:How to resolve the algorithm Vector step by step in the Visual Basic .NET programming language