Fix CBC mode padding and use adler32 for checksums (#315)
* Fix CBC mode padding and use adler32 for checksums * Change line order This change comes to improve the readability of the code. * Use zero-padding for CBC mode
This commit is contained in:
		
							parent
							
								
									dfd478922b
								
							
						
					
					
						commit
						8e7446f410
					
				
					 1 changed files with 9 additions and 26 deletions
				
			
		| 
						 | 
					@ -8,6 +8,7 @@ import struct
 | 
				
			||||||
import threading
 | 
					import threading
 | 
				
			||||||
import time
 | 
					import time
 | 
				
			||||||
from datetime import datetime
 | 
					from datetime import datetime
 | 
				
			||||||
 | 
					from zlib import adler32
 | 
				
			||||||
 | 
					
 | 
				
			||||||
from cryptography.hazmat.backends import default_backend
 | 
					from cryptography.hazmat.backends import default_backend
 | 
				
			||||||
from cryptography.hazmat.primitives.ciphers import Cipher, algorithms, modes
 | 
					from cryptography.hazmat.primitives.ciphers import Cipher, algorithms, modes
 | 
				
			||||||
| 
						 | 
					@ -109,11 +110,8 @@ def discover(timeout=None, local_ip_address=None):
 | 
				
			||||||
    packet[0x1c] = port & 0xff
 | 
					    packet[0x1c] = port & 0xff
 | 
				
			||||||
    packet[0x1d] = port >> 8
 | 
					    packet[0x1d] = port >> 8
 | 
				
			||||||
    packet[0x26] = 6
 | 
					    packet[0x26] = 6
 | 
				
			||||||
    checksum = 0xbeaf
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
    for i in range(len(packet)):
 | 
					    checksum = adler32(packet, 0xbeaf) & 0xffff
 | 
				
			||||||
        checksum += packet[i]
 | 
					 | 
				
			||||||
    checksum = checksum & 0xffff
 | 
					 | 
				
			||||||
    packet[0x20] = checksum & 0xff
 | 
					    packet[0x20] = checksum & 0xff
 | 
				
			||||||
    packet[0x21] = checksum >> 8
 | 
					    packet[0x21] = checksum >> 8
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -251,26 +249,17 @@ class device:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        # pad the payload for AES encryption
 | 
					        # pad the payload for AES encryption
 | 
				
			||||||
        if payload:
 | 
					        if payload:
 | 
				
			||||||
            numpad = (len(payload) // 16 + 1) * 16
 | 
					            payload += bytearray(((len(payload)-1)//16+1)*16 - len(payload))
 | 
				
			||||||
            payload = payload.ljust(numpad, b"\x00")
 | 
					        
 | 
				
			||||||
 | 
					        checksum = adler32(payload, 0xbeaf) & 0xffff
 | 
				
			||||||
        checksum = 0xbeaf
 | 
					 | 
				
			||||||
        for i in range(len(payload)):
 | 
					 | 
				
			||||||
            checksum += payload[i]
 | 
					 | 
				
			||||||
            checksum = checksum & 0xffff
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        payload = self.encrypt(payload)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        packet[0x34] = checksum & 0xff
 | 
					        packet[0x34] = checksum & 0xff
 | 
				
			||||||
        packet[0x35] = checksum >> 8
 | 
					        packet[0x35] = checksum >> 8
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        payload = self.encrypt(payload)
 | 
				
			||||||
        for i in range(len(payload)):
 | 
					        for i in range(len(payload)):
 | 
				
			||||||
            packet.append(payload[i])
 | 
					            packet.append(payload[i])
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        checksum = 0xbeaf
 | 
					        checksum = adler32(packet, 0xbeaf) & 0xffff
 | 
				
			||||||
        for i in range(len(packet)):
 | 
					 | 
				
			||||||
            checksum += packet[i]
 | 
					 | 
				
			||||||
            checksum = checksum & 0xffff
 | 
					 | 
				
			||||||
        packet[0x20] = checksum & 0xff
 | 
					        packet[0x20] = checksum & 0xff
 | 
				
			||||||
        packet[0x21] = checksum >> 8
 | 
					        packet[0x21] = checksum >> 8
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -403,9 +392,7 @@ class bg1(device):
 | 
				
			||||||
        for i in range(len(js)):
 | 
					        for i in range(len(js)):
 | 
				
			||||||
            packet.append(js[i])
 | 
					            packet.append(js[i])
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        checksum = 0xc0ad
 | 
					        checksum = adler32(packet[0x08:], 0xc0ad) & 0xffff
 | 
				
			||||||
        for c in packet[0x08:]:
 | 
					 | 
				
			||||||
            checksum = (checksum + c) & 0xffff
 | 
					 | 
				
			||||||
        packet[0x06] = checksum & 0xff
 | 
					        packet[0x06] = checksum & 0xff
 | 
				
			||||||
        packet[0x07] = checksum >> 8
 | 
					        packet[0x07] = checksum >> 8
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -969,11 +956,7 @@ def setup(ssid, password, security_mode):
 | 
				
			||||||
    payload[0x85] = pass_length  # Character length of password
 | 
					    payload[0x85] = pass_length  # Character length of password
 | 
				
			||||||
    payload[0x86] = security_mode  # Type of encryption (00 - none, 01 = WEP, 02 = WPA1, 03 = WPA2, 04 = WPA1/2)
 | 
					    payload[0x86] = security_mode  # Type of encryption (00 - none, 01 = WEP, 02 = WPA1, 03 = WPA2, 04 = WPA1/2)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    checksum = 0xbeaf
 | 
					    checksum = adler32(payload, 0xbeaf) & 0xffff
 | 
				
			||||||
    for i in range(len(payload)):
 | 
					 | 
				
			||||||
        checksum += payload[i]
 | 
					 | 
				
			||||||
        checksum = checksum & 0xffff
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    payload[0x20] = checksum & 0xff  # Checksum 1 position
 | 
					    payload[0x20] = checksum & 0xff  # Checksum 1 position
 | 
				
			||||||
    payload[0x21] = checksum >> 8  # Checksum 2 position
 | 
					    payload[0x21] = checksum >> 8  # Checksum 2 position
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue