# SPDX-License-Identifier: GPL-3.0+ # Copyright (C) 2020 nlscc """ Build FUS XML requests. """ import xml.etree.ElementTree as ET def getlogiccheck(inp: str, nonce: str) -> str: """ Calculate the request checksum for a given input and nonce. """ if len(inp) < 16: raise Exception("getlogiccheck() input too short") out = "" for c in nonce: out += inp[ord(c) & 0xf] return out def build_reqhdr(fusmsg: ET.Element): """ Build the FUSHdr of an XML message. """ fushdr = ET.SubElement(fusmsg, "FUSHdr") ET.SubElement(fushdr, "ProtoVer").text = "1.0" def build_reqbody(fusmsg: ET.Element, params: dict): """ Build the FUSBody of an XML message. """ fusbody = ET.SubElement(fusmsg, "FUSBody") fput = ET.SubElement(fusbody, "Put") for tag, value in params.items(): setag = ET.SubElement(fput, tag) sedata = ET.SubElement(setag, "Data") sedata.text = str(value) def binaryinform(fwv: str, model: str, region: str, nonce: str) -> str: """ Build a BinaryInform request. """ fusmsg = ET.Element("FUSMsg") build_reqhdr(fusmsg) build_reqbody(fusmsg, { "ACCESS_MODE": 2, "BINARY_NATURE": 1, "CLIENT_PRODUCT": "Smart Switch", "DEVICE_FW_VERSION": fwv, "DEVICE_LOCAL_CODE": region, "DEVICE_MODEL_NAME": model, "LOGIC_CHECK": getlogiccheck(fwv, nonce) }) return ET.tostring(fusmsg) def binaryinit(filename: str, nonce: str) -> str: """ Build a BinaryInit request. """ fusmsg = ET.Element("FUSMsg") build_reqhdr(fusmsg) checkinp = filename.split(".")[0][-16:] build_reqbody(fusmsg, { "BINARY_FILE_NAME": filename, "LOGIC_CHECK": getlogiccheck(checkinp, nonce) }) return ET.tostring(fusmsg)