LoRa-Workshop/micropython/uLoRaWAN/JoinRequestPayload.py

51 lines
1.3 KiB
Python

#
# frm_payload: appeui(8) deveui(8) devnonce(2)
#
from .MalformedPacketException import MalformedPacketException
from .AES_CMAC import AES_CMAC
class JoinRequestPayload:
def read(self, payload):
if len(payload) != 18:
raise MalformedPacketException("Invalid join request")
self.deveui = payload[8:16]
self.appeui = payload[:8]
self.devnonce = payload[16:18]
def create(self, args):
self.deveui = list(reversed(args['deveui']))
self.appeui = list(reversed(args['appeui']))
self.devnonce = args['devnonce']
def length(self):
return 18
def to_raw(self):
payload = []
payload += self.appeui
payload += self.deveui
payload += self.devnonce
return payload
def get_appeui(self):
return self.appeui
def get_deveui(self):
return self.deveui
def get_devnonce(self):
return self.devnonce
def compute_mic(self, key, direction, mhdr):
mic = [mhdr.to_raw()]
mic += self.to_raw()
cmac = AES_CMAC()
computed_mic = cmac.encode(bytes(key), bytes(mic))[:4]
return list(map(int, computed_mic))
def decrypt_payload(self, key, direction, mic):
return self.to_raw()