From 8bb3778869f3acfa059793d28ee3edd70dfa0f15 Mon Sep 17 00:00:00 2001 From: Conor Patrick Date: Tue, 4 Sep 2018 19:27:27 -0400 Subject: [PATCH] make firmware update bundle --- efm32/.cproject | 2 +- tools/http2udb.py | 70 +++++++++++++++++++++++++++-------------------- 2 files changed, 41 insertions(+), 31 deletions(-) diff --git a/efm32/.cproject b/efm32/.cproject index 418ca56..de52b56 100644 --- a/efm32/.cproject +++ b/efm32/.cproject @@ -227,7 +227,7 @@ - + diff --git a/tools/http2udb.py b/tools/http2udb.py index d6d6341..b71f51e 100644 --- a/tools/http2udb.py +++ b/tools/http2udb.py @@ -81,6 +81,38 @@ def read(): msg = to_websafe(pkt) return msg +def get_firmware_object(): + sk = SigningKey.from_pem(open("signing_key.pem").read()) + h = open(HEX_FILE,'r').read() + h = base64.b64encode(h.encode()) + h = to_websafe(h.decode()) + + num_pages = 64 + START = 0x4000 + END = 2048 * (num_pages - 3) - 4 + + ih = IntelHex(HEX_FILE) + segs = ih.segments() + arr = ih.tobinarray(start = START, size = END-START) + + im_size = END-START + + print('im_size: ', im_size) + print('firmware_size: ', len(arr)) + + byts = (arr).tobytes() if hasattr(arr,'tobytes') else (arr).tostring() + sig = sha256(byts) + print('hash', binascii.hexlify(sig)) + sig = sk.sign_digest(sig) + + print('sig', binascii.hexlify(sig)) + + sig = base64.b64encode(sig) + sig = to_websafe(sig.decode()) + + #msg = {'data': read()} + msg = {'firmware': h, 'signature':sig} + return msg class UDPBridge(BaseHTTPRequestHandler): def end_headers (self): self.send_header('Access-Control-Allow-Origin', '*') @@ -115,36 +147,7 @@ class UDPBridge(BaseHTTPRequestHandler): self.send_response(200) self.send_header('Content-type','text/json') - sk = SigningKey.from_pem(open("signing_key.pem").read()) - h = open(HEX_FILE,'r').read() - h = base64.b64encode(h.encode()) - h = to_websafe(h.decode()) - - num_pages = 64 - START = 0x4000 - END = 2048 * (num_pages - 3) - 4 - - ih = IntelHex(HEX_FILE) - segs = ih.segments() - arr = ih.tobinarray(start = START, size = END-START) - - im_size = END-START - - print('im_size: ', im_size) - print('firmware_size: ', len(arr)) - - byts = (arr).tobytes() if hasattr(arr,'tobytes') else (arr).tostring() - sig = sha256(byts) - print('hash', binascii.hexlify(sig)) - sig = sk.sign_digest(sig) - - print('sig', binascii.hexlify(sig)) - - sig = base64.b64encode(sig) - sig = to_websafe(sig.decode()) - - #msg = {'data': read()} - msg = {'firmware': h, 'signature':sig} + msg = get_firmware_object() self.end_headers() @@ -158,7 +161,14 @@ try: keyfile="../web/localhost.key", certfile='../web/localhost.crt', server_side=True) + print('Saving signed firmware to firmware.json') + msg = get_firmware_object() + wfile = open('firmware.json','wb+') + wfile.write(json.dumps(msg).encode()) + wfile.close() + server.serve_forever() + except KeyboardInterrupt: server.socket.close()