Skip to content

Instantly share code, notes, and snippets.

@martinobettucci
Forked from btchip/hidProxy.py
Created November 7, 2021 23:41
Show Gist options
  • Save martinobettucci/08665fa76bae96723187a24519e11983 to your computer and use it in GitHub Desktop.
Save martinobettucci/08665fa76bae96723187a24519e11983 to your computer and use it in GitHub Desktop.
Minimalistic Python implementation of Ledger Live HID proxy
from ledgerblue.comm import getDongle, CommException
import asyncio
import websockets
import json
import binascii
dongle = None
async def hidProxy(websocket, path):
global dongle
while True:
data = await websocket.recv()
print("Processing " + data)
response = {}
if data == "open":
response['type'] = "opened"
await websocket.send(json.dumps(response))
continue
if dongle == None:
dongle = getDongle(True)
apduResponse = None
sw = None
try:
apduResponse = dongle.exchange(binascii.unhexlify(data))
except CommException as e:
sw = e.sw
else:
try:
dongle.close()
except:
pass
dongle = None
try:
dongle = getDongle(True)
apduResponse = dongle.exchange(binascii.unhexlify(data))
except:
pass
if sw != None:
response['type'] = "response"
response['data'] = "%0.4X" % sw
else:
if apduResponse != None:
response['type'] = "response"
response['data'] = binascii.hexlify(apduResponse).decode('utf-8') + "9000"
else:
response['type'] = "error"
response['data'] = "Failed to exchange APDU"
await websocket.send(json.dumps(response))
print("Running websocket server")
server = websockets.serve(hidProxy, "localhost", 8435)
asyncio.get_event_loop().run_until_complete(server)
asyncio.get_event_loop().run_forever()
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment